@capillarytech/creatives-library 8.0.271-alpha.0 → 8.0.271

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 (151) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +1 -2
  4. package/initialReducer.js +0 -2
  5. package/package.json +1 -1
  6. package/services/api.js +0 -10
  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 -5
  12. package/utils/commonUtils.js +5 -28
  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/CapTagList/index.js +1 -6
  17. package/v2Components/CapTagListWithInput/index.js +1 -5
  18. package/v2Components/CapTagListWithInput/messages.js +1 -1
  19. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  20. package/v2Components/CommonTestAndPreview/index.js +15 -4
  21. package/v2Components/ErrorInfoNote/index.js +72 -402
  22. package/v2Components/ErrorInfoNote/messages.js +6 -32
  23. package/v2Components/ErrorInfoNote/style.scss +6 -278
  24. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  25. package/v2Components/HtmlEditor/HTMLEditor.js +99 -418
  26. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1882
  27. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  28. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  29. package/v2Components/HtmlEditor/_index.lazy.scss +1 -0
  30. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +102 -23
  31. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -148
  32. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  33. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  34. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -9
  35. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +6 -31
  36. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  37. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  38. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  39. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  40. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  41. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  42. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +10 -7
  43. package/v2Components/HtmlEditor/components/PreviewPane/index.js +43 -22
  44. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  45. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  46. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +0 -18
  47. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -36
  48. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -46
  49. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +46 -52
  50. package/v2Components/HtmlEditor/constants.js +20 -45
  51. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  52. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +16 -351
  53. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  54. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  55. package/v2Components/HtmlEditor/hooks/useValidation.js +56 -213
  56. package/v2Components/HtmlEditor/index.js +1 -1
  57. package/v2Components/HtmlEditor/messages.js +94 -102
  58. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -214
  59. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
  60. package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
  61. package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
  62. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +124 -158
  63. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  64. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  65. package/v2Components/MobilePushPreviewV2/index.js +7 -33
  66. package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
  67. package/v2Components/TemplatePreview/index.js +32 -47
  68. package/v2Components/TemplatePreview/messages.js +0 -4
  69. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  70. package/v2Containers/BeeEditor/index.js +90 -172
  71. package/v2Containers/CreativesContainer/SlideBoxContent.js +51 -127
  72. package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
  73. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -2
  74. package/v2Containers/CreativesContainer/constants.js +0 -1
  75. package/v2Containers/CreativesContainer/index.js +47 -243
  76. package/v2Containers/CreativesContainer/messages.js +0 -8
  77. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  78. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -38
  79. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -103
  80. package/v2Containers/Email/actions.js +0 -7
  81. package/v2Containers/Email/constants.js +1 -5
  82. package/v2Containers/Email/index.js +29 -234
  83. package/v2Containers/Email/messages.js +0 -32
  84. package/v2Containers/Email/reducer.js +1 -12
  85. package/v2Containers/Email/sagas.js +7 -61
  86. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  87. package/v2Containers/Email/tests/reducer.test.js +0 -46
  88. package/v2Containers/Email/tests/sagas.test.js +29 -320
  89. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +21 -212
  90. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  91. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  92. package/v2Containers/EmailWrapper/constants.js +0 -2
  93. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +79 -629
  94. package/v2Containers/EmailWrapper/index.js +23 -103
  95. package/v2Containers/EmailWrapper/messages.js +1 -65
  96. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  97. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +82 -596
  98. package/v2Containers/InApp/actions.js +0 -7
  99. package/v2Containers/InApp/constants.js +4 -20
  100. package/v2Containers/InApp/index.js +360 -802
  101. package/v2Containers/InApp/index.scss +3 -4
  102. package/v2Containers/InApp/messages.js +3 -7
  103. package/v2Containers/InApp/reducer.js +3 -21
  104. package/v2Containers/InApp/sagas.js +9 -29
  105. package/v2Containers/InApp/selectors.js +5 -25
  106. package/v2Containers/InApp/tests/index.test.js +50 -154
  107. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  108. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  109. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
  110. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
  111. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
  112. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
  113. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
  114. package/v2Containers/SmsTrai/Edit/index.js +12 -1
  115. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +648 -40
  116. package/v2Containers/TagList/index.js +19 -62
  117. package/v2Containers/Templates/_templates.scss +1 -60
  118. package/v2Containers/Templates/index.js +4 -89
  119. package/v2Containers/Templates/messages.js +0 -4
  120. package/v2Containers/TemplatesV2/TemplatesV2.style.js +2 -4
  121. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -34
  122. package/v2Components/ErrorInfoNote/constants.js +0 -1
  123. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -870
  124. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
  125. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -277
  126. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -295
  127. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  128. package/v2Components/HtmlEditor/utils/validationConstants.js +0 -38
  129. package/v2Components/MobilePushPreviewV2/constants.js +0 -6
  130. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
  131. package/v2Containers/BeePopupEditor/constants.js +0 -10
  132. package/v2Containers/BeePopupEditor/index.js +0 -194
  133. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  134. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1246
  135. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -2472
  136. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  137. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -955
  138. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  139. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  140. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  141. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
  142. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  143. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
  144. package/v2Containers/InAppWrapper/constants.js +0 -16
  145. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  146. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  147. package/v2Containers/InAppWrapper/index.js +0 -148
  148. package/v2Containers/InAppWrapper/messages.js +0 -49
  149. package/v2Containers/InappAdvance/index.js +0 -1099
  150. package/v2Containers/InappAdvance/index.scss +0 -10
  151. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
@@ -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
+ };