@capillarytech/creatives-library 8.0.263 → 8.0.265

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