@capillarytech/creatives-library 8.0.242-alpha.1 → 8.0.242-alpha.11

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 (255) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/config/app.js +1 -1
  4. package/constants/unified.js +2 -2
  5. package/initialReducer.js +0 -2
  6. package/package.json +1 -1
  7. package/services/api.js +5 -10
  8. package/services/tests/api.test.js +0 -18
  9. package/translations/en.json +4 -3
  10. package/utils/common.js +6 -5
  11. package/utils/commonUtils.js +1 -14
  12. package/utils/imageUrlUpload.js +141 -0
  13. package/utils/tests/commonUtil.test.js +0 -224
  14. package/utils/transformTemplateConfig.js +10 -0
  15. package/v2Components/CapDeviceContent/index.js +56 -61
  16. package/v2Components/CapImageUpload/constants.js +2 -0
  17. package/v2Components/CapImageUpload/index.js +65 -16
  18. package/v2Components/CapImageUpload/index.scss +4 -1
  19. package/v2Components/CapImageUpload/messages.js +5 -1
  20. package/v2Components/CapImageUrlUpload/constants.js +26 -0
  21. package/v2Components/CapImageUrlUpload/index.js +365 -0
  22. package/v2Components/CapImageUrlUpload/index.scss +35 -0
  23. package/v2Components/CapImageUrlUpload/messages.js +47 -0
  24. package/v2Components/CapTagList/index.js +1 -6
  25. package/v2Components/CapTagListWithInput/index.js +1 -5
  26. package/v2Components/CapTagListWithInput/messages.js +1 -1
  27. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  28. package/v2Components/ErrorInfoNote/index.js +72 -412
  29. package/v2Components/ErrorInfoNote/messages.js +0 -22
  30. package/v2Components/ErrorInfoNote/style.scss +2 -279
  31. package/v2Components/HtmlEditor/HTMLEditor.js +89 -210
  32. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1132
  33. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +12 -17
  34. package/v2Components/HtmlEditor/_htmlEditor.scss +23 -8
  35. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  36. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -13
  37. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +139 -148
  38. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  39. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  40. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  41. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -1
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  47. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  48. package/v2Components/HtmlEditor/components/PreviewPane/index.js +11 -10
  49. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  50. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +62 -87
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  52. package/v2Components/HtmlEditor/constants.js +20 -29
  53. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  54. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  55. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  56. package/v2Components/HtmlEditor/index.js +1 -1
  57. package/v2Components/HtmlEditor/messages.js +85 -95
  58. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +101 -99
  59. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  60. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -34
  61. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  62. package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
  63. package/v2Components/TemplatePreview/index.js +32 -47
  64. package/v2Components/TemplatePreview/messages.js +0 -4
  65. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  66. package/v2Containers/App/constants.js +5 -0
  67. package/v2Containers/BeeEditor/index.js +80 -82
  68. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
  69. package/v2Containers/CreativesContainer/SlideBoxContent.js +118 -148
  70. package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
  71. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  72. package/v2Containers/CreativesContainer/constants.js +2 -1
  73. package/v2Containers/CreativesContainer/index.js +41 -173
  74. package/v2Containers/CreativesContainer/messages.js +4 -4
  75. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
  76. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
  77. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -36
  78. package/v2Containers/Email/actions.js +0 -7
  79. package/v2Containers/Email/constants.js +1 -5
  80. package/v2Containers/Email/index.js +0 -13
  81. package/v2Containers/Email/messages.js +0 -32
  82. package/v2Containers/Email/reducer.js +1 -12
  83. package/v2Containers/Email/sagas.js +6 -41
  84. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  85. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
  86. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  87. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  88. package/v2Containers/EmailWrapper/constants.js +0 -2
  89. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +67 -436
  90. package/v2Containers/EmailWrapper/index.js +23 -99
  91. package/v2Containers/EmailWrapper/messages.js +1 -61
  92. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +1 -26
  93. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -111
  94. package/v2Containers/InApp/actions.js +0 -7
  95. package/v2Containers/InApp/constants.js +4 -20
  96. package/v2Containers/InApp/index.js +357 -800
  97. package/v2Containers/InApp/index.scss +3 -4
  98. package/v2Containers/InApp/messages.js +3 -7
  99. package/v2Containers/InApp/reducer.js +3 -21
  100. package/v2Containers/InApp/sagas.js +9 -29
  101. package/v2Containers/InApp/selectors.js +5 -25
  102. package/v2Containers/InApp/tests/index.test.js +50 -154
  103. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  104. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  105. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +12 -12
  106. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  107. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
  108. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
  109. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +184 -150
  110. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
  111. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +32 -28
  112. package/v2Containers/TagList/index.js +1 -67
  113. package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
  114. package/v2Containers/Templates/_templates.scss +202 -56
  115. package/v2Containers/Templates/actions.js +2 -1
  116. package/v2Containers/Templates/constants.js +1 -0
  117. package/v2Containers/Templates/index.js +278 -128
  118. package/v2Containers/Templates/messages.js +24 -4
  119. package/v2Containers/Templates/reducer.js +2 -0
  120. package/v2Containers/Templates/tests/index.test.js +10 -0
  121. package/v2Containers/TemplatesV2/index.js +8 -1
  122. package/v2Containers/TemplatesV2/messages.js +4 -0
  123. package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
  124. package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
  125. package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
  126. package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
  127. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
  128. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
  129. package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
  130. package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
  131. package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
  132. package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
  133. package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
  134. package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
  135. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
  136. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
  137. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
  138. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
  139. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
  140. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
  141. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
  142. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
  143. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
  144. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
  145. package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
  146. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
  147. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
  148. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
  149. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
  150. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
  151. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
  152. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
  153. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
  154. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
  155. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
  156. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
  157. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
  158. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
  159. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
  160. package/v2Containers/WebPush/Create/index.js +1056 -0
  161. package/v2Containers/WebPush/Create/index.scss +134 -0
  162. package/v2Containers/WebPush/Create/messages.js +203 -0
  163. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
  164. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
  165. package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
  166. package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
  167. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
  168. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +150 -0
  169. package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
  170. package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
  171. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
  172. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
  173. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  174. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  175. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
  176. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
  177. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
  178. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
  179. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
  180. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
  181. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
  182. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
  183. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
  184. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
  185. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
  186. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
  187. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
  188. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
  189. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
  190. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
  191. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
  192. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
  193. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
  194. package/v2Containers/WebPush/Create/preview/constants.js +637 -0
  195. package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
  196. package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
  197. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
  198. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
  199. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
  200. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
  201. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
  202. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
  203. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
  204. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
  205. package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
  206. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
  207. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
  208. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
  209. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
  210. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
  211. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
  212. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
  213. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +943 -0
  214. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
  215. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
  216. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
  217. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
  218. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +94 -0
  219. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +390 -0
  220. package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
  221. package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
  222. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
  223. package/v2Containers/WebPush/Create/utils/validation.js +75 -0
  224. package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
  225. package/v2Containers/WebPush/actions.js +60 -0
  226. package/v2Containers/WebPush/constants.js +128 -0
  227. package/v2Containers/WebPush/index.js +2 -0
  228. package/v2Containers/WebPush/reducer.js +104 -0
  229. package/v2Containers/WebPush/sagas.js +119 -0
  230. package/v2Containers/WebPush/selectors.js +65 -0
  231. package/v2Containers/WebPush/tests/reducer.test.js +863 -0
  232. package/v2Containers/WebPush/tests/sagas.test.js +566 -0
  233. package/v2Containers/WebPush/tests/selectors.test.js +843 -0
  234. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +528 -431
  235. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  236. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -362
  237. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  238. package/v2Containers/BeePopupEditor/constants.js +0 -10
  239. package/v2Containers/BeePopupEditor/index.js +0 -193
  240. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  241. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1045
  242. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  243. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  244. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  245. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
  246. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  247. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
  248. package/v2Containers/InAppWrapper/constants.js +0 -16
  249. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  250. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  251. package/v2Containers/InAppWrapper/index.js +0 -148
  252. package/v2Containers/InAppWrapper/messages.js +0 -49
  253. package/v2Containers/InappAdvance/index.js +0 -1099
  254. package/v2Containers/InappAdvance/index.scss +0 -10
  255. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
@@ -34,7 +34,7 @@ export const LIQUID_PATTERNS = {
34
34
  OPERATORS: /\b(and|or|not|contains|in|==|!=|<|>|<=|>=)\b/g,
35
35
 
36
36
  // String literals in Liquid
37
- STRING_LITERALS: /(["'])((?:\\.|(?!\1)[^\\])*?)\1/g,
37
+ STRING_LITERALS: /(["'])((?:\\.|(?!\1)[^\\])*?)\1/g
38
38
  };
39
39
 
40
40
  /**
@@ -68,7 +68,7 @@ export const liquidVSCodeTheme = HighlightStyle.define([
68
68
  { tag: tags.atom, color: '#4ec9b0' }, // Liquid filters
69
69
  { tag: tags.punctuation, color: '#d4d4d4' },
70
70
  { tag: tags.bracket, color: '#ffd700' },
71
- { tag: tags.brace, color: '#ffd700' },
71
+ { tag: tags.brace, color: '#ffd700' }
72
72
  ]);
73
73
 
74
74
  /**
@@ -151,7 +151,7 @@ export class LiquidValidator {
151
151
  column: 1,
152
152
  rule: 'liquid-stray-closing-output',
153
153
  severity: 'error',
154
- source: 'liquid-validator',
154
+ source: 'liquid-validator'
155
155
  });
156
156
  }
157
157
  }
@@ -160,7 +160,7 @@ export class LiquidValidator {
160
160
  // After scan, any remaining entries on stack are unclosed opening braces
161
161
  if (stack.length > 0) {
162
162
  // Report each unclosed opening brace
163
- stack.forEach((position) => {
163
+ stack.forEach(position => {
164
164
  this.errors.push({
165
165
  type: 'error',
166
166
  message: 'unclosed Liquid output tag - missing }}',
@@ -168,7 +168,7 @@ export class LiquidValidator {
168
168
  column: 1,
169
169
  rule: 'liquid-unclosed-output',
170
170
  severity: 'error',
171
- source: 'liquid-validator',
171
+ source: 'liquid-validator'
172
172
  });
173
173
  });
174
174
  }
@@ -203,7 +203,7 @@ export class LiquidValidator {
203
203
  column: 1,
204
204
  rule: 'liquid-unclosed-logic',
205
205
  severity: 'error',
206
- source: 'liquid-validator',
206
+ source: 'liquid-validator'
207
207
  });
208
208
  }
209
209
  }
@@ -216,7 +216,7 @@ export class LiquidValidator {
216
216
  const nestedOutputPattern = /\{\{[^}]*\{\{[^}]*\}\}/g;
217
217
  const nestedOutput = html.match(nestedOutputPattern);
218
218
  if (nestedOutput) {
219
- nestedOutput.forEach((match) => {
219
+ nestedOutput.forEach(match => {
220
220
  this.errors.push({
221
221
  type: 'error',
222
222
  message: `Nested braces in Liquid output tag: ${match}`,
@@ -224,7 +224,7 @@ export class LiquidValidator {
224
224
  column: 1,
225
225
  rule: 'liquid-nested-braces',
226
226
  severity: 'error',
227
- source: 'liquid-validator',
227
+ source: 'liquid-validator'
228
228
  });
229
229
  });
230
230
  }
@@ -233,7 +233,7 @@ export class LiquidValidator {
233
233
  const nestedLogicPattern = /\{%[^%]*\{%[^%]*%\}/g;
234
234
  const nestedLogic = html.match(nestedLogicPattern);
235
235
  if (nestedLogic) {
236
- nestedLogic.forEach((match) => {
236
+ nestedLogic.forEach(match => {
237
237
  this.errors.push({
238
238
  type: 'error',
239
239
  message: `Nested braces in Liquid logic tag: ${match}`,
@@ -241,7 +241,7 @@ export class LiquidValidator {
241
241
  column: 1,
242
242
  rule: 'liquid-nested-braces',
243
243
  severity: 'error',
244
- source: 'liquid-validator',
244
+ source: 'liquid-validator'
245
245
  });
246
246
  });
247
247
  }
@@ -262,10 +262,10 @@ export class LiquidValidator {
262
262
 
263
263
  logicTags.push({
264
264
  full: match[0],
265
- content,
266
- keyword,
265
+ content: content,
266
+ keyword: keyword,
267
267
  position: match.index,
268
- line: this.getLineNumber(html, match.index),
268
+ line: this.getLineNumber(html, match.index)
269
269
  });
270
270
  }
271
271
 
@@ -279,25 +279,25 @@ export class LiquidValidator {
279
279
  validateBalancedTags(logicTags) {
280
280
  const stack = [];
281
281
  const pairs = {
282
- if: 'endif',
283
- unless: 'endunless',
284
- for: 'endfor',
285
- case: 'endcase',
286
- capture: 'endcapture',
287
- comment: 'endcomment',
288
- tablerow: 'endtablerow',
289
- raw: 'endraw',
282
+ 'if': 'endif',
283
+ 'unless': 'endunless',
284
+ 'for': 'endfor',
285
+ 'case': 'endcase',
286
+ 'capture': 'endcapture',
287
+ 'comment': 'endcomment',
288
+ 'tablerow': 'endtablerow',
289
+ 'raw': 'endraw'
290
290
  };
291
291
 
292
- logicTags.forEach((tag) => {
293
- const {keyword} = tag;
292
+ logicTags.forEach(tag => {
293
+ const keyword = tag.keyword;
294
294
 
295
295
  if (pairs[keyword]) {
296
296
  // Opening tag
297
297
  stack.push({ keyword, tag });
298
298
  } else if (Object.values(pairs).includes(keyword)) {
299
299
  // Closing tag
300
- const expectedOpening = Object.keys(pairs).find((key) => pairs[key] === keyword);
300
+ const expectedOpening = Object.keys(pairs).find(key => pairs[key] === keyword);
301
301
  const lastOpening = stack.pop();
302
302
 
303
303
  if (!lastOpening) {
@@ -308,7 +308,7 @@ export class LiquidValidator {
308
308
  column: 1,
309
309
  rule: 'liquid-unexpected-closing',
310
310
  severity: 'error',
311
- source: 'liquid-validator',
311
+ source: 'liquid-validator'
312
312
  });
313
313
  } else if (lastOpening.keyword !== expectedOpening) {
314
314
  this.errors.push({
@@ -318,14 +318,14 @@ export class LiquidValidator {
318
318
  column: 1,
319
319
  rule: 'liquid-mismatched-tags',
320
320
  severity: 'error',
321
- source: 'liquid-validator',
321
+ source: 'liquid-validator'
322
322
  });
323
323
  }
324
324
  }
325
325
  });
326
326
 
327
327
  // Check for unclosed opening tags
328
- stack.forEach((unclosed) => {
328
+ stack.forEach(unclosed => {
329
329
  this.errors.push({
330
330
  type: 'error',
331
331
  message: `Unclosed Liquid tag: {% ${unclosed.keyword} %}`,
@@ -333,7 +333,7 @@ export class LiquidValidator {
333
333
  column: 1,
334
334
  rule: 'liquid-unclosed-tag',
335
335
  severity: 'error',
336
- source: 'liquid-validator',
336
+ source: 'liquid-validator'
337
337
  });
338
338
  });
339
339
  }
@@ -345,7 +345,7 @@ export class LiquidValidator {
345
345
  // Check for malformed filters
346
346
  const malformedFilters = html.match(/\|\s*\||\|\s*$/gm);
347
347
  if (malformedFilters) {
348
- malformedFilters.forEach((match) => {
348
+ malformedFilters.forEach(match => {
349
349
  this.warnings.push({
350
350
  type: 'warning',
351
351
  message: `Malformed Liquid filter: ${match.trim()}`,
@@ -353,7 +353,7 @@ export class LiquidValidator {
353
353
  column: 1,
354
354
  rule: 'liquid-malformed-filter',
355
355
  severity: 'warning',
356
- source: 'liquid-validator',
356
+ source: 'liquid-validator'
357
357
  });
358
358
  });
359
359
  }
@@ -373,7 +373,7 @@ export class LiquidValidator {
373
373
  column: 1,
374
374
  rule: 'liquid-filter-usage',
375
375
  severity: 'info',
376
- source: 'liquid-validator',
376
+ source: 'liquid-validator'
377
377
  });
378
378
  }
379
379
  }
@@ -386,7 +386,7 @@ export class LiquidValidator {
386
386
  // Check for undefined variable patterns (basic check)
387
387
  const suspiciousVariables = html.match(/\{\{\s*[^}]*undefined[^}]*\s*\}\}/g);
388
388
  if (suspiciousVariables) {
389
- suspiciousVariables.forEach((match) => {
389
+ suspiciousVariables.forEach(match => {
390
390
  this.warnings.push({
391
391
  type: 'warning',
392
392
  message: `Potentially undefined variable: ${match}`,
@@ -394,7 +394,7 @@ export class LiquidValidator {
394
394
  column: 1,
395
395
  rule: 'liquid-undefined-variable',
396
396
  severity: 'warning',
397
- source: 'liquid-validator',
397
+ source: 'liquid-validator'
398
398
  });
399
399
  });
400
400
  }
@@ -417,7 +417,7 @@ export class LiquidValidator {
417
417
  isValid: this.errors.length === 0,
418
418
  errors: this.errors,
419
419
  warnings: this.warnings,
420
- info: this.info,
420
+ info: this.info
421
421
  };
422
422
  }
423
423
  }
@@ -425,58 +425,60 @@ export class LiquidValidator {
425
425
  /**
426
426
  * Enhanced CodeMirror extensions with Liquid support
427
427
  */
428
- export const createLiquidExtensions = () => [
429
- // HTML language support (base)
430
- html(),
431
-
432
- // Enhanced syntax highlighting with Liquid support
433
- syntaxHighlighting(liquidVSCodeTheme),
434
-
435
- // Editor theme
436
- EditorView.theme({
437
- "&": {
438
- height: "500px",
439
- backgroundColor: "#1e1e1e",
440
- fontSize: "14px",
441
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
442
- },
443
- ".cm-content": {
444
- padding: "12px",
445
- backgroundColor: "#1e1e1e",
446
- fontSize: "14px",
447
- lineHeight: "20px",
448
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
449
- color: "#d4d4d4",
450
- },
451
- ".cm-focused": {
452
- outline: "none",
453
- },
454
- ".cm-lineNumbers": {
455
- fontSize: "14px",
456
- lineHeight: "20px",
457
- color: "#858585",
458
- backgroundColor: "#1e1e1e",
459
- paddingRight: "8px",
460
- paddingLeft: "8px",
461
- borderRight: "1px solid #3e3e3e",
462
- minWidth: "45px",
463
- textAlign: "right",
464
- },
465
- ".cm-gutters": {
466
- backgroundColor: "#1e1e1e",
467
- borderRight: "1px solid #3e3e3e",
468
- },
469
- ".cm-activeLine": {
470
- backgroundColor: "#2a2d2e",
471
- },
472
- ".cm-selection": {
473
- backgroundColor: "#264f78",
474
- },
475
- ".cm-cursor": {
476
- borderLeft: "2px solid #ffffff",
477
- },
478
- }),
479
- ];
428
+ export const createLiquidExtensions = () => {
429
+ return [
430
+ // HTML language support (base)
431
+ html(),
432
+
433
+ // Enhanced syntax highlighting with Liquid support
434
+ syntaxHighlighting(liquidVSCodeTheme),
435
+
436
+ // Editor theme
437
+ EditorView.theme({
438
+ "&": {
439
+ height: "500px",
440
+ backgroundColor: "#1e1e1e",
441
+ fontSize: "14px",
442
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace"
443
+ },
444
+ ".cm-content": {
445
+ padding: "12px",
446
+ backgroundColor: "#1e1e1e",
447
+ fontSize: "14px",
448
+ lineHeight: "20px",
449
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
450
+ color: "#d4d4d4"
451
+ },
452
+ ".cm-focused": {
453
+ outline: "none"
454
+ },
455
+ ".cm-lineNumbers": {
456
+ fontSize: "14px",
457
+ lineHeight: "20px",
458
+ color: "#858585",
459
+ backgroundColor: "#1e1e1e",
460
+ paddingRight: "8px",
461
+ paddingLeft: "8px",
462
+ borderRight: "1px solid #3e3e3e",
463
+ minWidth: "45px",
464
+ textAlign: "right"
465
+ },
466
+ ".cm-gutters": {
467
+ backgroundColor: "#1e1e1e",
468
+ borderRight: "1px solid #3e3e3e"
469
+ },
470
+ ".cm-activeLine": {
471
+ backgroundColor: "#2a2d2e"
472
+ },
473
+ ".cm-selection": {
474
+ backgroundColor: "#264f78"
475
+ },
476
+ ".cm-cursor": {
477
+ borderLeft: "2px solid #ffffff"
478
+ }
479
+ })
480
+ ];
481
+ };
480
482
 
481
483
  /**
482
484
  * Validates HTML content with Liquid template support
@@ -494,22 +496,22 @@ export const validateLiquidHTML = (html, variant = 'email') => {
494
496
  */
495
497
  export const LIQUID_SNIPPETS = {
496
498
  // Output tags
497
- customer_name: '{{ customer.first_name }} {{ customer.last_name }}',
498
- customer_email: '{{ customer.email }}',
499
- current_date: '{{ "now" | date: "%B %d, %Y" }}',
500
- organization_name: '{{ organization.name }}',
499
+ 'customer_name': '{{ customer.first_name }} {{ customer.last_name }}',
500
+ 'customer_email': '{{ customer.email }}',
501
+ 'current_date': '{{ "now" | date: "%B %d, %Y" }}',
502
+ 'organization_name': '{{ organization.name }}',
501
503
 
502
504
  // Logic tags
503
- if_statement: '{% if condition %}\n <!-- content -->\n{% endif %}',
504
- for_loop: '{% for item in collection %}\n {{ item.name }}\n{% endfor %}',
505
- unless_statement: '{% unless condition %}\n <!-- content -->\n{% endunless %}',
506
- case_statement: '{% case variable %}\n {% when "value1" %}\n <!-- content -->\n {% when "value2" %}\n <!-- content -->\n {% else %}\n <!-- default content -->\n{% endcase %}',
505
+ 'if_statement': '{% if condition %}\n <!-- content -->\n{% endif %}',
506
+ 'for_loop': '{% for item in collection %}\n {{ item.name }}\n{% endfor %}',
507
+ 'unless_statement': '{% unless condition %}\n <!-- content -->\n{% endunless %}',
508
+ 'case_statement': '{% case variable %}\n {% when "value1" %}\n <!-- content -->\n {% when "value2" %}\n <!-- content -->\n {% else %}\n <!-- default content -->\n{% endcase %}',
507
509
 
508
510
  // Common filters
509
- date_filter: '{{ date_variable | date: "%B %d, %Y" }}',
510
- capitalize_filter: '{{ text | capitalize }}',
511
- truncate_filter: '{{ text | truncate: 50 }}',
512
- default_filter: '{{ variable | default: "Default Value" }}',
511
+ 'date_filter': '{{ date_variable | date: "%B %d, %Y" }}',
512
+ 'capitalize_filter': '{{ text | capitalize }}',
513
+ 'truncate_filter': '{{ text | truncate: 50 }}',
514
+ 'default_filter': '{{ variable | default: "Default Value" }}'
513
515
  };
514
516
 
515
517
  export default {
@@ -518,5 +520,5 @@ export default {
518
520
  LiquidValidator,
519
521
  createLiquidExtensions,
520
522
  validateLiquidHTML,
521
- LIQUID_SNIPPETS,
523
+ LIQUID_SNIPPETS
522
524
  };
@@ -76,7 +76,7 @@ export const comprehensiveVSCodeTheme = HighlightStyle.define([
76
76
  { tag: tags.link, color: '#4fc1ff', textDecoration: 'underline' },
77
77
  { tag: tags.heading, color: '#9cdcfe', fontWeight: 'bold' },
78
78
  { tag: tags.emphasis, fontStyle: 'italic' },
79
- { tag: tags.strong, fontWeight: 'bold' },
79
+ { tag: tags.strong, fontWeight: 'bold' }
80
80
  ]);
81
81
 
82
82
  /**
@@ -88,7 +88,7 @@ export const cleanEditorTheme = EditorView.theme({
88
88
  height: "500px",
89
89
  backgroundColor: "#1e1e1e",
90
90
  fontSize: "14px",
91
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
91
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace"
92
92
  },
93
93
  ".cm-content": {
94
94
  padding: "12px",
@@ -96,17 +96,17 @@ export const cleanEditorTheme = EditorView.theme({
96
96
  fontSize: "14px",
97
97
  lineHeight: "20px",
98
98
  fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
99
- color: "#d4d4d4", // Base text color for all content
99
+ color: "#d4d4d4" // Base text color for all content
100
100
  },
101
101
  ".cm-focused": {
102
- outline: "none",
102
+ outline: "none"
103
103
  },
104
104
  ".cm-editor": {
105
105
  borderRadius: "0",
106
- border: "none",
106
+ border: "none"
107
107
  },
108
108
  ".cm-scroller": {
109
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
109
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace"
110
110
  },
111
111
  ".cm-lineNumbers": {
112
112
  fontSize: "14px",
@@ -117,45 +117,47 @@ export const cleanEditorTheme = EditorView.theme({
117
117
  paddingLeft: "8px",
118
118
  borderRight: "1px solid #3e3e3e",
119
119
  minWidth: "45px",
120
- textAlign: "right",
120
+ textAlign: "right"
121
121
  },
122
122
  ".cm-gutters": {
123
123
  backgroundColor: "#1e1e1e",
124
- borderRight: "1px solid #3e3e3e",
124
+ borderRight: "1px solid #3e3e3e"
125
125
  },
126
126
  ".cm-activeLine": {
127
- backgroundColor: "#2a2d2e",
127
+ backgroundColor: "#2a2d2e"
128
128
  },
129
129
  ".cm-selection": {
130
- backgroundColor: "#264f78",
130
+ backgroundColor: "#264f78"
131
131
  },
132
132
  ".cm-cursor": {
133
- borderLeft: "2px solid #ffffff",
133
+ borderLeft: "2px solid #ffffff"
134
134
  },
135
135
  // Additional fallback for text nodes
136
136
  ".cm-line": {
137
- color: "#d4d4d4",
138
- },
137
+ color: "#d4d4d4"
138
+ }
139
139
  });
140
140
 
141
141
  /**
142
142
  * ROBUST Extension Creator - Single, clean implementation
143
143
  * Uses only verified tags to avoid undefined errors
144
144
  */
145
- export const createRobustExtensions = () => [
146
- // 1. HTML language support with proper parsing
147
- html(),
145
+ export const createRobustExtensions = () => {
146
+ return [
147
+ // 1. HTML language support with proper parsing
148
+ html(),
148
149
 
149
- // 2. SAFE syntax highlighting (using only confirmed tags)
150
- syntaxHighlighting(comprehensiveVSCodeTheme),
150
+ // 2. SAFE syntax highlighting (using only confirmed tags)
151
+ syntaxHighlighting(comprehensiveVSCodeTheme),
151
152
 
152
- // 3. Clean theme (structure only, no color conflicts)
153
- cleanEditorTheme,
154
- ];
153
+ // 3. Clean theme (structure only, no color conflicts)
154
+ cleanEditorTheme
155
+ ];
156
+ };
155
157
 
156
158
  // Export the main function
157
159
  export default {
158
160
  comprehensiveVSCodeTheme,
159
161
  cleanEditorTheme,
160
- createRobustExtensions,
161
- };
162
+ createRobustExtensions
163
+ };
@@ -16,7 +16,7 @@ const VALIDATION_SOURCES = {
16
16
  EMAIL_SPECIFIC: 'email-specific',
17
17
  INAPP_SPECIFIC: 'inapp-specific',
18
18
  EMAIL_COMPATIBILITY: 'email-compatibility',
19
- MOBILE_OPTIMIZATION: 'mobile-optimization',
19
+ MOBILE_OPTIMIZATION: 'mobile-optimization'
20
20
  };
21
21
 
22
22
  /**
@@ -33,34 +33,39 @@ export const transformValidationToErrorInfo = (validation, variant = 'email') =>
33
33
  const allIssues = validation.getAllIssues();
34
34
 
35
35
  // Separate liquid and standard errors
36
- const liquidErrors = allIssues.filter((issue) => issue.source === VALIDATION_SOURCES.LIQUID
37
- || issue.rule?.includes('liquid')
38
- || issue.message?.toLowerCase().includes('liquid'));
39
-
40
- const standardErrors = allIssues.filter((issue) => issue.source !== VALIDATION_SOURCES.LIQUID
41
- && !issue.rule?.includes('liquid')
42
- && !issue.message?.toLowerCase().includes('liquid'));
36
+ const liquidErrors = allIssues.filter(issue =>
37
+ issue.source === VALIDATION_SOURCES.LIQUID ||
38
+ issue.rule?.includes('liquid') ||
39
+ issue.message?.toLowerCase().includes('liquid')
40
+ );
41
+
42
+ const standardErrors = allIssues.filter(issue =>
43
+ issue.source !== VALIDATION_SOURCES.LIQUID &&
44
+ !issue.rule?.includes('liquid') &&
45
+ !issue.message?.toLowerCase().includes('liquid')
46
+ );
43
47
 
44
48
  // Format errors for ErrorInfoNote
45
- const formatErrors = (errors) => errors.map((error) => {
46
- let {message} = error;
47
-
48
- // Add line/column info if available
49
- if (error.line) {
50
- message += ` Line ${error.line}`;
51
- if (error.column) {
52
- message += `, Char ${error.column}`;
49
+ const formatErrors = (errors) =>
50
+ errors.map(error => {
51
+ let message = error.message;
52
+
53
+ // Add line/column info if available
54
+ if (error.line) {
55
+ message += ` Line ${error.line}`;
56
+ if (error.column) {
57
+ message += `, Char ${error.column}`;
58
+ }
59
+ message += '.';
53
60
  }
54
- message += '.';
55
- }
56
61
 
57
- // Add rule info if available
58
- if (error.rule) {
59
- message += ` • ${error.rule}`;
60
- }
62
+ // Add rule info if available
63
+ if (error.rule) {
64
+ message += ` • ${error.rule}`;
65
+ }
61
66
 
62
- return message;
63
- });
67
+ return message;
68
+ });
64
69
 
65
70
  // Handle InApp variant with platform-specific errors (if needed in future)
66
71
  if (variant === 'inapp') {
@@ -69,8 +74,8 @@ export const transformValidationToErrorInfo = (validation, variant = 'email') =>
69
74
  return {
70
75
  errorMessages: {
71
76
  LIQUID_ERROR_MSG: formatErrors(liquidErrors),
72
- STANDARD_ERROR_MSG: formatErrors(standardErrors),
73
- },
77
+ STANDARD_ERROR_MSG: formatErrors(standardErrors)
78
+ }
74
79
  };
75
80
  }
76
81
 
@@ -78,8 +83,8 @@ export const transformValidationToErrorInfo = (validation, variant = 'email') =>
78
83
  return {
79
84
  errorMessages: {
80
85
  LIQUID_ERROR_MSG: formatErrors(liquidErrors),
81
- STANDARD_ERROR_MSG: formatErrors(standardErrors),
82
- },
86
+ STANDARD_ERROR_MSG: formatErrors(standardErrors)
87
+ }
83
88
  };
84
89
  };
85
90
 
@@ -108,16 +113,18 @@ export const getValidationSummary = (validation) => {
108
113
  }
109
114
 
110
115
  const allIssues = validation.getAllIssues();
111
- const errors = allIssues.filter((issue) => issue.severity === 'error');
112
- const warnings = allIssues.filter((issue) => issue.severity === 'warning');
113
- const liquidErrors = allIssues.filter((issue) => issue.source === VALIDATION_SOURCES.LIQUID
114
- || issue.rule?.includes('liquid')
115
- || issue.message?.toLowerCase().includes('liquid'));
116
+ const errors = allIssues.filter(issue => issue.severity === 'error');
117
+ const warnings = allIssues.filter(issue => issue.severity === 'warning');
118
+ const liquidErrors = allIssues.filter(issue =>
119
+ issue.source === VALIDATION_SOURCES.LIQUID ||
120
+ issue.rule?.includes('liquid') ||
121
+ issue.message?.toLowerCase().includes('liquid')
122
+ );
116
123
 
117
124
  return {
118
125
  totalErrors: errors.length,
119
126
  totalWarnings: warnings.length,
120
127
  hasLiquidErrors: liquidErrors.length > 0,
121
- totalIssues: allIssues.length,
128
+ totalIssues: allIssues.length
122
129
  };
123
130
  };