@capillarytech/creatives-library 8.0.255-alpha.4 → 8.0.255

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 (278) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +2 -2
  4. package/initialReducer.js +2 -0
  5. package/package.json +1 -1
  6. package/services/api.js +10 -5
  7. package/services/tests/api.test.js +34 -0
  8. package/translations/en.json +3 -4
  9. package/utils/common.js +5 -6
  10. package/utils/commonUtils.js +28 -5
  11. package/utils/tests/commonUtil.test.js +224 -0
  12. package/utils/tests/transformerUtils.test.js +0 -297
  13. package/utils/transformTemplateConfig.js +0 -10
  14. package/utils/transformerUtils.js +0 -40
  15. package/v2Components/CapDeviceContent/index.js +61 -56
  16. package/v2Components/CapImageUpload/constants.js +0 -2
  17. package/v2Components/CapImageUpload/index.js +16 -65
  18. package/v2Components/CapImageUpload/index.scss +1 -4
  19. package/v2Components/CapImageUpload/messages.js +1 -5
  20. package/v2Components/CapTagList/index.js +6 -1
  21. package/v2Components/CapTagListWithInput/index.js +5 -1
  22. package/v2Components/CapTagListWithInput/messages.js +1 -1
  23. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  24. package/v2Components/ErrorInfoNote/constants.js +1 -0
  25. package/v2Components/ErrorInfoNote/index.js +457 -72
  26. package/v2Components/ErrorInfoNote/messages.js +36 -6
  27. package/v2Components/ErrorInfoNote/style.scss +282 -6
  28. package/v2Components/FormBuilder/tests/index.test.js +13 -4
  29. package/v2Components/HtmlEditor/HTMLEditor.js +547 -94
  30. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +874 -0
  31. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1441 -133
  32. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +27 -16
  33. package/v2Components/HtmlEditor/_htmlEditor.scss +108 -45
  34. package/v2Components/HtmlEditor/_index.lazy.scss +0 -1
  35. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +23 -102
  36. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -140
  37. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
  38. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  39. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +9 -0
  40. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +4 -4
  41. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +22 -0
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  47. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
  48. package/v2Components/HtmlEditor/components/PreviewPane/index.js +22 -43
  49. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  50. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +1 -0
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
  52. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +50 -34
  53. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +6 -0
  54. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +70 -41
  55. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +255 -0
  56. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +364 -0
  57. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  58. package/v2Components/HtmlEditor/constants.js +42 -20
  59. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  60. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +103 -0
  61. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  62. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  63. package/v2Components/HtmlEditor/hooks/useValidation.js +189 -53
  64. package/v2Components/HtmlEditor/index.js +1 -1
  65. package/v2Components/HtmlEditor/messages.js +92 -94
  66. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +94 -45
  67. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +134 -0
  68. package/v2Components/HtmlEditor/utils/contentSanitizer.js +40 -41
  69. package/v2Components/HtmlEditor/utils/htmlValidator.js +71 -72
  70. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +134 -102
  71. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  72. package/v2Components/HtmlEditor/utils/validationAdapter.js +66 -41
  73. package/v2Components/HtmlEditor/utils/validationConstants.js +40 -0
  74. package/v2Components/MobilePushPreviewV2/index.js +32 -7
  75. package/v2Components/TemplatePreview/_templatePreview.scss +55 -24
  76. package/v2Components/TemplatePreview/index.js +47 -32
  77. package/v2Components/TemplatePreview/messages.js +4 -0
  78. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +1 -0
  79. package/v2Containers/App/constants.js +0 -5
  80. package/v2Containers/BeeEditor/index.js +172 -90
  81. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +14 -0
  82. package/v2Containers/BeePopupEditor/constants.js +10 -0
  83. package/v2Containers/BeePopupEditor/index.js +194 -0
  84. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  85. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +3 -4
  86. package/v2Containers/CreativesContainer/SlideBoxContent.js +129 -107
  87. package/v2Containers/CreativesContainer/SlideBoxFooter.js +163 -13
  88. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  89. package/v2Containers/CreativesContainer/constants.js +1 -3
  90. package/v2Containers/CreativesContainer/index.js +239 -214
  91. package/v2Containers/CreativesContainer/messages.js +8 -4
  92. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
  93. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +11 -2
  94. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -354
  95. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +106 -0
  96. package/v2Containers/Email/actions.js +7 -0
  97. package/v2Containers/Email/constants.js +5 -1
  98. package/v2Containers/Email/index.js +234 -29
  99. package/v2Containers/Email/messages.js +32 -0
  100. package/v2Containers/Email/reducer.js +12 -1
  101. package/v2Containers/Email/sagas.js +61 -7
  102. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  103. package/v2Containers/Email/tests/reducer.test.js +46 -0
  104. package/v2Containers/Email/tests/sagas.test.js +320 -29
  105. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1285 -0
  106. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +211 -21
  107. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  108. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +1880 -0
  109. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +520 -0
  110. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  111. package/v2Containers/EmailWrapper/constants.js +2 -0
  112. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +629 -77
  113. package/v2Containers/EmailWrapper/index.js +103 -23
  114. package/v2Containers/EmailWrapper/messages.js +65 -1
  115. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +643 -0
  116. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +594 -77
  117. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  118. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  119. package/v2Containers/InApp/actions.js +7 -0
  120. package/v2Containers/InApp/constants.js +20 -4
  121. package/v2Containers/InApp/index.js +802 -359
  122. package/v2Containers/InApp/index.scss +4 -3
  123. package/v2Containers/InApp/messages.js +7 -3
  124. package/v2Containers/InApp/reducer.js +21 -3
  125. package/v2Containers/InApp/sagas.js +29 -9
  126. package/v2Containers/InApp/selectors.js +25 -5
  127. package/v2Containers/InApp/tests/index.test.js +154 -50
  128. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  129. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  130. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  131. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +151 -0
  132. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  133. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +23 -0
  134. package/v2Containers/InAppWrapper/constants.js +16 -0
  135. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  136. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  137. package/v2Containers/InAppWrapper/index.js +148 -0
  138. package/v2Containers/InAppWrapper/messages.js +49 -0
  139. package/v2Containers/InappAdvance/index.js +1099 -0
  140. package/v2Containers/InappAdvance/index.scss +10 -0
  141. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  142. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +15 -36
  143. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  144. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +77 -100
  145. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +63 -72
  146. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +190 -250
  147. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +12 -16
  148. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +40 -48
  149. package/v2Containers/TagList/index.js +62 -19
  150. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  151. package/v2Containers/Templates/_templates.scss +56 -202
  152. package/v2Containers/Templates/actions.js +1 -2
  153. package/v2Containers/Templates/constants.js +0 -1
  154. package/v2Containers/Templates/index.js +123 -278
  155. package/v2Containers/Templates/messages.js +4 -24
  156. package/v2Containers/Templates/reducer.js +0 -2
  157. package/v2Containers/Templates/tests/index.test.js +0 -10
  158. package/v2Containers/TemplatesV2/index.js +7 -15
  159. package/v2Containers/TemplatesV2/messages.js +0 -4
  160. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +768 -1272
  161. package/utils/imageUrlUpload.js +0 -141
  162. package/v2Components/CapImageUrlUpload/constants.js +0 -26
  163. package/v2Components/CapImageUrlUpload/index.js +0 -365
  164. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  165. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  166. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +0 -152
  167. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +0 -214
  168. package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
  169. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
  170. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  171. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
  172. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
  173. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
  174. package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
  175. package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
  176. package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
  177. package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
  178. package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
  179. package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
  180. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
  181. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
  182. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
  183. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
  184. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
  185. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
  186. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
  187. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
  188. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
  189. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
  190. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  191. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  192. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  193. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  194. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  195. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  196. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -78
  197. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
  198. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
  199. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
  200. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
  201. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
  202. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
  203. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
  204. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
  205. package/v2Containers/WebPush/Create/index.js +0 -1148
  206. package/v2Containers/WebPush/Create/index.scss +0 -134
  207. package/v2Containers/WebPush/Create/messages.js +0 -203
  208. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
  209. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
  210. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
  211. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
  212. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  213. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
  214. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  215. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  216. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
  217. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
  218. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  219. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  220. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  221. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  222. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
  223. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
  224. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  225. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  226. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
  227. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
  228. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -47
  229. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -141
  230. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  231. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
  232. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
  233. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
  234. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
  235. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
  236. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -81
  237. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
  238. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
  239. package/v2Containers/WebPush/Create/preview/constants.js +0 -637
  240. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
  241. package/v2Containers/WebPush/Create/preview/preview.scss +0 -351
  242. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
  243. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  244. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  245. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  246. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
  247. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  248. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  249. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  250. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
  251. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
  252. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  253. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
  254. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
  255. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  256. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
  257. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  258. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
  259. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
  260. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
  261. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  262. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
  263. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
  264. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
  265. package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
  266. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
  267. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  268. package/v2Containers/WebPush/Create/utils/validation.js +0 -75
  269. package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
  270. package/v2Containers/WebPush/actions.js +0 -60
  271. package/v2Containers/WebPush/constants.js +0 -132
  272. package/v2Containers/WebPush/index.js +0 -2
  273. package/v2Containers/WebPush/reducer.js +0 -104
  274. package/v2Containers/WebPush/sagas.js +0 -119
  275. package/v2Containers/WebPush/selectors.js +0 -65
  276. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  277. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  278. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -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: content,
266
- keyword: keyword,
265
+ content,
266
+ 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.keyword;
292
+ logicTags.forEach((tag) => {
293
+ const {keyword} = tag;
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,31 @@ 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
+ if (stack.length > 0) {
329
+ stack.forEach(({ keyword, tag }) => {
330
+ const expectedClosing = pairs[keyword];
331
+ const error = {
332
+ type: 'error',
333
+ message: `Unclosed Liquid tag: {% ${keyword} %} - missing {% ${expectedClosing} %}`,
334
+ line: tag.line,
335
+ column: 1,
336
+ rule: 'liquid-unclosed-tag',
337
+ severity: 'error',
338
+ source: 'liquid-validator',
339
+ };
340
+ this.errors.push(error);
341
+ });
342
+ }
343
+
344
+ // Check for unclosed opening tags
345
+ stack.forEach((unclosed) => {
329
346
  this.errors.push({
330
347
  type: 'error',
331
348
  message: `Unclosed Liquid tag: {% ${unclosed.keyword} %}`,
@@ -333,7 +350,7 @@ export class LiquidValidator {
333
350
  column: 1,
334
351
  rule: 'liquid-unclosed-tag',
335
352
  severity: 'error',
336
- source: 'liquid-validator'
353
+ source: 'liquid-validator',
337
354
  });
338
355
  });
339
356
  }
@@ -345,7 +362,7 @@ export class LiquidValidator {
345
362
  // Check for malformed filters
346
363
  const malformedFilters = html.match(/\|\s*\||\|\s*$/gm);
347
364
  if (malformedFilters) {
348
- malformedFilters.forEach(match => {
365
+ malformedFilters.forEach((match) => {
349
366
  this.warnings.push({
350
367
  type: 'warning',
351
368
  message: `Malformed Liquid filter: ${match.trim()}`,
@@ -353,19 +370,36 @@ export class LiquidValidator {
353
370
  column: 1,
354
371
  rule: 'liquid-malformed-filter',
355
372
  severity: 'warning',
356
- source: 'liquid-validator'
373
+ source: 'liquid-validator',
357
374
  });
358
375
  });
359
376
  }
360
377
 
361
378
  // Check for common filter usage
362
- const commonFilters = ['date', 'capitalize', 'upcase', 'downcase', 'strip', 'truncate', 'default'];
379
+ // Standard Liquid filters that are commonly used and shouldn't trigger info messages
380
+ // This list includes standard Liquid filters to avoid false positives
381
+ const commonFilters = [
382
+ // String filters
383
+ 'capitalize', 'upcase', 'downcase', 'strip', 'lstrip', 'rstrip', 'strip_html', 'strip_newlines',
384
+ 'truncate', 'truncatewords', 'prepend', 'append', 'remove', 'remove_first', 'replace', 'replace_first',
385
+ 'split', 'join', 'concat', 'escape', 'escape_once', 'newline_to_br',
386
+ // Array filters
387
+ 'first', 'last', 'size', 'slice', 'sort', 'sort_natural', 'map', 'where', 'uniq', 'compact', 'reverse',
388
+ // Number filters
389
+ 'abs', 'ceil', 'floor', 'round', 'times', 'divided_by', 'modulo', 'minus', 'plus', 'at_least', 'at_most',
390
+ // Date filters
391
+ 'date',
392
+ // Other common filters
393
+ 'default', 'url_encode', 'url_decode',
394
+ ];
363
395
  const filterPattern = /\|\s*([a-zA-Z_][a-zA-Z0-9_]*)/g;
364
396
  let filterMatch;
365
397
 
366
398
  while ((filterMatch = filterPattern.exec(html)) !== null) {
367
399
  const filterName = filterMatch[1];
368
400
  if (!commonFilters.includes(filterName)) {
401
+ // Only show info for truly custom/unknown filters
402
+ // Standard Liquid filters are now included in commonFilters list
369
403
  this.info.push({
370
404
  type: 'info',
371
405
  message: `Using filter: ${filterName}`,
@@ -373,7 +407,7 @@ export class LiquidValidator {
373
407
  column: 1,
374
408
  rule: 'liquid-filter-usage',
375
409
  severity: 'info',
376
- source: 'liquid-validator'
410
+ source: 'liquid-validator',
377
411
  });
378
412
  }
379
413
  }
@@ -386,7 +420,7 @@ export class LiquidValidator {
386
420
  // Check for undefined variable patterns (basic check)
387
421
  const suspiciousVariables = html.match(/\{\{\s*[^}]*undefined[^}]*\s*\}\}/g);
388
422
  if (suspiciousVariables) {
389
- suspiciousVariables.forEach(match => {
423
+ suspiciousVariables.forEach((match) => {
390
424
  this.warnings.push({
391
425
  type: 'warning',
392
426
  message: `Potentially undefined variable: ${match}`,
@@ -394,7 +428,7 @@ export class LiquidValidator {
394
428
  column: 1,
395
429
  rule: 'liquid-undefined-variable',
396
430
  severity: 'warning',
397
- source: 'liquid-validator'
431
+ source: 'liquid-validator',
398
432
  });
399
433
  });
400
434
  }
@@ -417,7 +451,7 @@ export class LiquidValidator {
417
451
  isValid: this.errors.length === 0,
418
452
  errors: this.errors,
419
453
  warnings: this.warnings,
420
- info: this.info
454
+ info: this.info,
421
455
  };
422
456
  }
423
457
  }
@@ -425,60 +459,58 @@ export class LiquidValidator {
425
459
  /**
426
460
  * Enhanced CodeMirror extensions with Liquid support
427
461
  */
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
- };
462
+ export const createLiquidExtensions = () => [
463
+ // HTML language support (base)
464
+ html(),
465
+
466
+ // Enhanced syntax highlighting with Liquid support
467
+ syntaxHighlighting(liquidVSCodeTheme),
468
+
469
+ // Editor theme
470
+ EditorView.theme({
471
+ "&": {
472
+ height: "500px",
473
+ backgroundColor: "#1e1e1e",
474
+ fontSize: "14px",
475
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
476
+ },
477
+ ".cm-content": {
478
+ padding: "12px",
479
+ backgroundColor: "#1e1e1e",
480
+ fontSize: "14px",
481
+ lineHeight: "20px",
482
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
483
+ color: "#d4d4d4",
484
+ },
485
+ ".cm-focused": {
486
+ outline: "none",
487
+ },
488
+ ".cm-lineNumbers": {
489
+ fontSize: "14px",
490
+ lineHeight: "20px",
491
+ color: "#858585",
492
+ backgroundColor: "#1e1e1e",
493
+ paddingRight: "8px",
494
+ paddingLeft: "8px",
495
+ borderRight: "1px solid #3e3e3e",
496
+ minWidth: "45px",
497
+ textAlign: "right",
498
+ },
499
+ ".cm-gutters": {
500
+ backgroundColor: "#1e1e1e",
501
+ borderRight: "1px solid #3e3e3e",
502
+ },
503
+ ".cm-activeLine": {
504
+ backgroundColor: "#2a2d2e",
505
+ },
506
+ ".cm-selection": {
507
+ backgroundColor: "#264f78",
508
+ },
509
+ ".cm-cursor": {
510
+ borderLeft: "2px solid #ffffff",
511
+ },
512
+ }),
513
+ ];
482
514
 
483
515
  /**
484
516
  * Validates HTML content with Liquid template support
@@ -496,22 +528,22 @@ export const validateLiquidHTML = (html, variant = 'email') => {
496
528
  */
497
529
  export const LIQUID_SNIPPETS = {
498
530
  // Output tags
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 }}',
531
+ customer_name: '{{ customer.first_name }} {{ customer.last_name }}',
532
+ customer_email: '{{ customer.email }}',
533
+ current_date: '{{ "now" | date: "%B %d, %Y" }}',
534
+ organization_name: '{{ organization.name }}',
503
535
 
504
536
  // Logic tags
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 %}',
537
+ if_statement: '{% if condition %}\n <!-- content -->\n{% endif %}',
538
+ for_loop: '{% for item in collection %}\n {{ item.name }}\n{% endfor %}',
539
+ unless_statement: '{% unless condition %}\n <!-- content -->\n{% endunless %}',
540
+ case_statement: '{% case variable %}\n {% when "value1" %}\n <!-- content -->\n {% when "value2" %}\n <!-- content -->\n {% else %}\n <!-- default content -->\n{% endcase %}',
509
541
 
510
542
  // Common filters
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" }}'
543
+ date_filter: '{{ date_variable | date: "%B %d, %Y" }}',
544
+ capitalize_filter: '{{ text | capitalize }}',
545
+ truncate_filter: '{{ text | truncate: 50 }}',
546
+ default_filter: '{{ variable | default: "Default Value" }}',
515
547
  };
516
548
 
517
549
  export default {
@@ -520,5 +552,5 @@ export default {
520
552
  LiquidValidator,
521
553
  createLiquidExtensions,
522
554
  validateLiquidHTML,
523
- LIQUID_SNIPPETS
555
+ LIQUID_SNIPPETS,
524
556
  };
@@ -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,47 +117,45 @@ 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
- return [
147
- // 1. HTML language support with proper parsing
148
- html(),
145
+ export const createRobustExtensions = () => [
146
+ // 1. HTML language support with proper parsing
147
+ html(),
149
148
 
150
- // 2. SAFE syntax highlighting (using only confirmed tags)
151
- syntaxHighlighting(comprehensiveVSCodeTheme),
149
+ // 2. SAFE syntax highlighting (using only confirmed tags)
150
+ syntaxHighlighting(comprehensiveVSCodeTheme),
152
151
 
153
- // 3. Clean theme (structure only, no color conflicts)
154
- cleanEditorTheme
155
- ];
156
- };
152
+ // 3. Clean theme (structure only, no color conflicts)
153
+ cleanEditorTheme,
154
+ ];
157
155
 
158
156
  // Export the main function
159
157
  export default {
160
158
  comprehensiveVSCodeTheme,
161
159
  cleanEditorTheme,
162
- createRobustExtensions
163
- };
160
+ createRobustExtensions,
161
+ };