@useinsider/guido 3.2.0-beta.4aabac5 → 3.2.0-beta.565bfaf

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 (34) hide show
  1. package/README.md +1 -0
  2. package/dist/components/organisms/header/EditorActions.vue.js +2 -2
  3. package/dist/components/organisms/header/EditorActions.vue2.js +51 -36
  4. package/dist/components/organisms/header/RightSlot.vue.js +10 -10
  5. package/dist/components/organisms/header/RightSlot.vue2.js +16 -13
  6. package/dist/components/organisms/save-as-template/SaveAsTemplateDrawer.vue2.js +18 -17
  7. package/dist/composables/useHtmlCompiler.js +18 -16
  8. package/dist/composables/useRecommendation.js +2 -2
  9. package/dist/composables/useSave.js +23 -17
  10. package/dist/composables/useStripo.js +44 -41
  11. package/dist/composables/validators/useLiquidValidator.js +42 -0
  12. package/dist/config/compiler/liquidCompilerRules.js +15 -0
  13. package/dist/enums/displayConditions.js +82 -78
  14. package/dist/enums/extensions/recommendationBlock.js +95 -41
  15. package/dist/enums/unsubscribe.js +17 -16
  16. package/dist/extensions/Blocks/Checkbox/control.js +23 -23
  17. package/dist/extensions/Blocks/CouponBlock/template.js +24 -13
  18. package/dist/extensions/Blocks/RadioButton/control.js +15 -15
  19. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +3 -3
  20. package/dist/extensions/DynamicContent/dynamic-content.js +17 -12
  21. package/dist/guido.css +1 -1
  22. package/dist/services/stripoApi.js +9 -9
  23. package/dist/services/templateLibraryApi.js +48 -46
  24. package/dist/src/@types/save-as-template.d.ts +1 -0
  25. package/dist/src/composables/validators/useLiquidValidator.d.ts +3 -0
  26. package/dist/src/config/compiler/liquidCompilerRules.d.ts +2 -0
  27. package/dist/src/enums/displayConditions.d.ts +5 -1
  28. package/dist/src/enums/extensions/recommendationBlock.d.ts +5 -1
  29. package/dist/src/enums/unsubscribe.d.ts +8 -3
  30. package/dist/src/extensions/Blocks/CouponBlock/template.d.ts +2 -0
  31. package/dist/src/services/templateLibraryApi.d.ts +1 -1
  32. package/dist/src/utils/genericUtil.d.ts +1 -1
  33. package/dist/utils/genericUtil.js +42 -20
  34. package/package.json +1 -1
package/README.md CHANGED
@@ -143,6 +143,7 @@ const config: GuidoConfigInput = {
143
143
  displayConditions?: boolean, // Default: true
144
144
  unsubscribe?: boolean, // Default: true
145
145
  modulesDisabled?: boolean, // Default: false - Disable modules panel
146
+ liquidSyntax?: boolean, // Default: false - Enable Liquid template syntax
146
147
  },
147
148
 
148
149
  // Optional: Callbacks
@@ -4,7 +4,7 @@ import d from "../../../_virtual/_plugin-vue2_normalizer.js";
4
4
  var u = function() {
5
5
  var s, i, n, a;
6
6
  var o = this, e = o._self._c, t = o._self._setupProxy;
7
- return e("div", { staticClass: "d-f editor-actions" }, [t.isVersionHistoryButtonVisible ? e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryButtonDisabled, "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen, "tooltip-options": t.getTooltipOptions("guido__history-button"), "tooltip-text": t.versionHistoryTooltipText }, on: { click: t.handleVersionHistory } }) : o._e(), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isExportButtonDisabled, "label-text-status": !1, "loading-status": t.isExporting, "tooltip-options": t.getTooltipOptions("guido__export-button"), "tooltip-text": t.trans("newsletter.export") }, on: { click: t.handleExport } }), (i = (s = t.config) == null ? void 0 : s.features) != null && i.saveAsTemplate ? e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isSaveAsButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__save-as-button"), "tooltip-text": t.trans("newsletter.save-templates") }, on: { click: t.handleSaveAs } }) : o._e(), (a = (n = t.config) == null ? void 0 : n.features) != null && a.testMessage ? e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isTestButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__test-button", { staticPosition: "bottom right" }), "tooltip-text": t.trans("newsletter.test-email") }, on: { click: t.testEmailClick } }) : o._e(), t.editorStore.isPreviewModeOpen ? o._e() : e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "label-text": "Save", "disabled-status": !t.isSaving && t.editorStore.isSaveButtonDisabled, "loading-status": t.isSaving }, on: { click: function(r) {
7
+ return e("div", { staticClass: "d-f editor-actions" }, [t.isVersionHistoryButtonVisible ? e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryButtonDisabled, "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen, "tooltip-options": t.getTooltipOptions("guido__history-button"), "tooltip-text": t.versionHistoryTooltipText }, on: { click: t.handleVersionHistory } }) : o._e(), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isExportButtonDisabled, "label-text-status": !1, "loading-status": t.isExporting, "tooltip-options": t.getTooltipOptions("guido__export-button"), "tooltip-text": t.trans("newsletter.export") }, on: { click: t.handleExport } }), (i = (s = t.config) == null ? void 0 : s.features) != null && i.saveAsTemplate ? e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isSaveAsButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__save-as-button"), "tooltip-text": t.trans("newsletter.save-templates") }, on: { click: t.handleSaveAs } }) : o._e(), (a = (n = t.config) == null ? void 0 : n.features) != null && a.testMessage ? e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isTestButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__test-button", { staticPosition: "bottom right" }), "tooltip-text": t.trans("newsletter.test-email") }, on: { click: t.handleTestEmail } }) : o._e(), t.editorStore.isPreviewModeOpen ? o._e() : e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "label-text": "Save", "disabled-status": !t.isSaving && t.editorStore.isSaveButtonDisabled, "loading-status": t.isSaving }, on: { click: function(r) {
8
8
  return t.handleSave(!1);
9
9
  } } }), e(t.MigrationConfirmModal, { ref: "migrationModalRef", on: { confirm: function(r) {
10
10
  return t.executeSave(!1);
@@ -15,7 +15,7 @@ var u = function() {
15
15
  p,
16
16
  !1,
17
17
  null,
18
- "acff76a8"
18
+ "4e2a4adb"
19
19
  );
20
20
  const v = c.exports;
21
21
  export {
@@ -1,51 +1,66 @@
1
- import { defineComponent as E, ref as n, computed as g } from "vue";
2
- import { useConfig as w } from "../../../composables/useConfig.js";
3
- import { useExport as C } from "../../../composables/useExport.js";
4
- import { useTestEmailClick as M } from "../../../composables/useGuidoActions.js";
5
- import { useSave as O } from "../../../composables/useSave.js";
6
- import { useTranslations as A } from "../../../composables/useTranslations.js";
7
- import { useVersionHistoryApi as k } from "../../../composables/useVersionHistoryApi.js";
8
- import { useEditorStore as B } from "../../../stores/editor.js";
9
- import { useTemplateStore as R } from "../../../stores/template.js";
10
- import { getTooltipOptions as b } from "../../../utils/tooltipUtils.js";
11
- import { InButtonV2 as D } from "@useinsider/design-system-vue";
12
- import { storeToRefs as I } from "pinia";
13
- import P from "./MigrationConfirmModal.vue.js";
14
- const Z = /* @__PURE__ */ E({
1
+ import { defineComponent as O, ref as n, computed as h } from "vue";
2
+ import { useActionsApi as q } from "../../../composables/useActionsApi.js";
3
+ import { useConfig as b } from "../../../composables/useConfig.js";
4
+ import { useExport as k } from "../../../composables/useExport.js";
5
+ import { useTestEmailClick as B } from "../../../composables/useGuidoActions.js";
6
+ import { useHtmlCompiler as D } from "../../../composables/useHtmlCompiler.js";
7
+ import { useSave as F } from "../../../composables/useSave.js";
8
+ import { useTranslations as L } from "../../../composables/useTranslations.js";
9
+ import { useVersionHistoryApi as R } from "../../../composables/useVersionHistoryApi.js";
10
+ import { useLiquidValidator as z } from "../../../composables/validators/useLiquidValidator.js";
11
+ import { useEditorStore as I } from "../../../stores/editor.js";
12
+ import { useTemplateStore as P } from "../../../stores/template.js";
13
+ import { getTooltipOptions as j } from "../../../utils/tooltipUtils.js";
14
+ import { InButtonV2 as G } from "@useinsider/design-system-vue";
15
+ import { storeToRefs as J } from "pinia";
16
+ import K from "./MigrationConfirmModal.vue.js";
17
+ const ut = /* @__PURE__ */ O({
15
18
  __name: "EditorActions",
16
- setup(j, { expose: H }) {
17
- const { config: a } = w(), { exportHtml: m } = C(), { save: p } = O(), { openVersionHistory: l, closeVersionHistory: u } = k(), e = B(), c = R(), { hasMigrations: f } = I(c), r = A(), s = n(!1), i = n(!1), v = n(), S = M(), V = () => {
19
+ setup(N, { expose: x }) {
20
+ const { config: a, isFeatureEnabled: l } = b(), { exportHtml: m } = k(), { save: u } = F(), { openVersionHistory: c, closeVersionHistory: p } = R(), { getCompiledEmail: f } = q(), { compileHtml: d } = D(), { validateLiquidSyntax: v } = z(), e = I(), y = P(), { hasMigrations: S } = J(y), s = L(), i = n(!1), r = n(!1), g = n(), H = B(), T = () => {
18
21
  if (e.isVersionHistoryOpen) {
19
- u();
22
+ p();
20
23
  return;
21
24
  }
22
- l();
23
- }, T = async () => {
24
- s.value = !0, await m(), s.value = !1;
25
+ c();
26
+ }, w = async () => {
27
+ i.value = !0, await m(), i.value = !1;
25
28
  }, _ = () => {
26
29
  e.isSaveAsTemplateDrawerOpen = !0;
27
- }, h = g(() => e.isVersionHistoryOpen ? r("newsletter.close-version-history") : r("newsletter.version-history")), x = g(
30
+ }, C = h(() => e.isVersionHistoryOpen ? s("newsletter.close-version-history") : s("newsletter.version-history")), A = h(
28
31
  () => {
29
- var o, t;
30
- return ((t = (o = a.value) == null ? void 0 : o.features) == null ? void 0 : t.versionHistory) && !e.isPreviewModeOpen;
32
+ var t, o;
33
+ return ((o = (t = a.value) == null ? void 0 : t.features) == null ? void 0 : o.versionHistory) && !e.isPreviewModeOpen;
31
34
  }
32
- ), d = async (o) => {
33
- i.value = !0, e.loadingStatus = !0;
34
- const t = await p(o);
35
- return i.value = !1, (o || !t) && (e.loadingStatus = !1), t;
36
- }, y = (o) => {
37
- var t;
38
- if (!o && f.value) {
39
- (t = v.value) == null || t.open();
35
+ ), V = async (t) => {
36
+ r.value = !0, e.loadingStatus = !0;
37
+ const o = await u(t);
38
+ return r.value = !1, (t || !o) && (e.loadingStatus = !1), o;
39
+ }, E = (t) => {
40
+ var o;
41
+ if (!t && S.value) {
42
+ (o = g.value) == null || o.open();
40
43
  return;
41
44
  }
42
- return d(o);
45
+ return V(t);
46
+ }, M = async () => {
47
+ if (l("liquidSyntax")) {
48
+ e.loadingStatus = !0;
49
+ try {
50
+ const { html: t } = await f({ minimize: !0, resetDataSavedFlag: !1 }), { compiledHtml: o } = d(t);
51
+ if (!await v(o))
52
+ return;
53
+ } finally {
54
+ e.loadingStatus = !1;
55
+ }
56
+ }
57
+ H();
43
58
  };
44
- return H({
45
- handleSave: y
46
- }), { __sfc: !0, config: a, exportHtml: m, save: p, openVersionHistory: l, closeVersionHistory: u, editorStore: e, templateStore: c, hasMigrations: f, trans: r, isExporting: s, isSaving: i, migrationModalRef: v, testEmailClick: S, handleVersionHistory: V, handleExport: T, handleSaveAs: _, versionHistoryTooltipText: h, isVersionHistoryButtonVisible: x, executeSave: d, handleSave: y, getTooltipOptions: b, InButtonV2: D, MigrationConfirmModal: P };
59
+ return x({
60
+ handleSave: E
61
+ }), { __sfc: !0, config: a, isFeatureEnabled: l, exportHtml: m, save: u, openVersionHistory: c, closeVersionHistory: p, getCompiledEmail: f, compileHtml: d, validateLiquidSyntax: v, editorStore: e, templateStore: y, hasMigrations: S, trans: s, isExporting: i, isSaving: r, migrationModalRef: g, testEmailClick: H, handleVersionHistory: T, handleExport: w, handleSaveAs: _, versionHistoryTooltipText: C, isVersionHistoryButtonVisible: A, executeSave: V, handleSave: E, handleTestEmail: M, getTooltipOptions: j, InButtonV2: G, MigrationConfirmModal: K };
47
62
  }
48
63
  });
49
64
  export {
50
- Z as default
65
+ ut as default
51
66
  };
@@ -1,17 +1,17 @@
1
- import o from "./RightSlot.vue2.js";
2
- import s from "../../../_virtual/_plugin-vue2_normalizer.js";
3
- var n = function() {
4
- var r = this, t = r._self._c, e = r._self._setupProxy;
5
- return t("div", { staticClass: "d-f" }, [e.editorStore.isVersionHistoryOpen ? t(e.RestoreButton) : t(e.EditorActions, { ref: "editorActionsRef" })], 1);
6
- }, i = [], _ = /* @__PURE__ */ s(
7
- o,
8
- n,
1
+ import i from "./RightSlot.vue2.js";
2
+ import r from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var o = function() {
4
+ var s = this, e = s._self._c, t = s._self._setupProxy;
5
+ return e("div", { staticClass: "d-f a-i-c" }, [t.isLiquidEnabled && !t.editorStore.isVersionHistoryOpen ? e(t.InChips, { staticClass: "mr-3", attrs: { id: "guido__liquid-tag-chip", styles: "stroke", type: "default", value: "liquid-tags", "close-button": !1, "disabled-status": t.editorStore.loadingStatus, interactive: !1, text: t.trans("email-editor.liquid-tags-enabled") } }) : s._e(), t.editorStore.isVersionHistoryOpen ? e(t.RestoreButton) : e(t.EditorActions, { ref: "editorActionsRef" })], 1);
6
+ }, a = [], n = /* @__PURE__ */ r(
9
7
  i,
8
+ o,
9
+ a,
10
10
  !1,
11
11
  null,
12
12
  null
13
13
  );
14
- const l = _.exports;
14
+ const u = n.exports;
15
15
  export {
16
- l as default
16
+ u as default
17
17
  };
@@ -1,19 +1,22 @@
1
- import { defineComponent as i, ref as s } from "vue";
2
- import { useEditorStore as m } from "../../../stores/editor.js";
3
- import f from "./EditorActions.vue.js";
4
- import a from "./version-history/RestoreButton.vue.js";
5
- const l = /* @__PURE__ */ i({
1
+ import { defineComponent as a, ref as f, computed as p } from "vue";
2
+ import { useConfig as u } from "../../../composables/useConfig.js";
3
+ import { useTranslations as d } from "../../../composables/useTranslations.js";
4
+ import { useEditorStore as c } from "../../../stores/editor.js";
5
+ import { InChips as l } from "@useinsider/design-system-vue";
6
+ import _ from "./EditorActions.vue.js";
7
+ import S from "./version-history/RestoreButton.vue.js";
8
+ const x = /* @__PURE__ */ a({
6
9
  __name: "RightSlot",
7
- setup(p, { expose: e }) {
8
- const r = m(), o = s(null);
9
- return e({
10
- handleSave: (n) => {
11
- var t;
12
- return (t = o.value) == null ? void 0 : t.handleSave(n);
10
+ setup(h, { expose: r }) {
11
+ const { isFeatureEnabled: o } = u(), n = d(), i = c(), t = f(null), s = p(() => o("liquidSyntax"));
12
+ return r({
13
+ handleSave: (m) => {
14
+ var e;
15
+ return (e = t.value) == null ? void 0 : e.handleSave(m);
13
16
  }
14
- }), { __sfc: !0, editorStore: r, editorActionsRef: o, EditorActions: f, RestoreButton: a };
17
+ }), { __sfc: !0, isFeatureEnabled: o, trans: n, editorStore: i, editorActionsRef: t, isLiquidEnabled: s, InChips: l, EditorActions: _, RestoreButton: S };
15
18
  }
16
19
  });
17
20
  export {
18
- l as default
21
+ x as default
19
22
  };
@@ -10,29 +10,29 @@ import { useDebounceFn as V } from "../../../node_modules/@vueuse/shared/index.j
10
10
  const H = /* @__PURE__ */ A({
11
11
  __name: "SaveAsTemplateDrawer",
12
12
  setup(E) {
13
- const s = O(), o = D(), t = k(), { createTemplate: m } = B(), a = c(!1), n = c(!1), r = c(""), f = b(() => ({
13
+ const o = O(), n = D(), t = k(), { createTemplate: m } = B(), a = c(!1), r = c(!1), l = c(""), f = b(() => ({
14
14
  primaryButton: {
15
15
  styling: "solid",
16
16
  type: "primary",
17
- labelText: s(a.value ? "newsletter.saving" : "products.save"),
17
+ labelText: o(a.value ? "newsletter.saving" : "products.save"),
18
18
  loadingStatus: a.value,
19
19
  disabledStatus: t.skeletonStatus
20
20
  },
21
21
  cancelOrBackButton: {
22
22
  styling: "ghost",
23
23
  type: "secondary",
24
- labelText: s("products.cancel"),
24
+ labelText: o("products.cancel"),
25
25
  disabledStatus: a.value
26
26
  }
27
- })), p = () => {
28
- r.value = "", o.isSaveAsTemplateDrawerOpen = !1;
29
- }, l = async () => {
30
- const e = h(t, "templateName"), { success: i, errorMessage: _ } = await x(e).validate();
31
- return r.value = _, i;
27
+ })), u = () => {
28
+ l.value = "", n.isSaveAsTemplateDrawerOpen = !1;
29
+ }, i = async () => {
30
+ const e = h(t, "templateName"), { success: s, errorMessage: _ } = await x(e).validate();
31
+ return l.value = _, s;
32
32
  }, v = V(async (e) => {
33
- t.templateName = e, await l();
33
+ t.templateName = e, await i();
34
34
  }, 500), g = async (e) => {
35
- n.value = !0, await t.addCategory(e), n.value = !1;
35
+ r.value = !0, await t.addCategory(e), r.value = !1;
36
36
  }, y = (e) => {
37
37
  t.selectedCategories = e;
38
38
  }, S = (e) => {
@@ -40,22 +40,23 @@ const H = /* @__PURE__ */ A({
40
40
  }, T = () => {
41
41
  t.selectedCategories = [];
42
42
  }, w = async () => {
43
- if (a.value = !0, !await l()) {
43
+ if (a.value = !0, !await i()) {
44
44
  a.value = !1;
45
45
  return;
46
46
  }
47
- await m(), a.value = !1, p();
48
- }, u = () => {
47
+ const s = await m();
48
+ a.value = !1, s && u();
49
+ }, p = () => {
49
50
  C(() => {
50
51
  const e = document.querySelector("input#guido__template-name-input");
51
52
  e == null || e.focus();
52
53
  });
53
54
  }, d = async () => {
54
- t.$reset(), await t.fetchCategories(), t.skeletonStatus = !1, u();
55
+ t.$reset(), await t.fetchCategories(), t.skeletonStatus = !1, p();
55
56
  };
56
- return o.$subscribe((e, { isSaveAsTemplateDrawerOpen: i }) => {
57
- i && d();
58
- }), { __sfc: !0, trans: s, editorStore: o, saveAsTemplateStore: t, createTemplate: m, isSaving: a, isAddingOption: n, templateNameError: r, footerButtonGroupOptions: f, closeModal: p, validateTemplateName: l, handleTemplateName: v, handleAddOption: g, handleCategoryChange: y, handleSelectAllOptions: S, handleResetAllOptions: T, saveTemplate: w, focusToInput: u, initializeDrawer: d, WpDrawer: N, InBasicTextInput: M, InMultiSelect: I };
57
+ return n.$subscribe((e, { isSaveAsTemplateDrawerOpen: s }) => {
58
+ s && d();
59
+ }), { __sfc: !0, trans: o, editorStore: n, saveAsTemplateStore: t, createTemplate: m, isSaving: a, isAddingOption: r, templateNameError: l, footerButtonGroupOptions: f, closeModal: u, validateTemplateName: i, handleTemplateName: v, handleAddOption: g, handleCategoryChange: y, handleSelectAllOptions: S, handleResetAllOptions: T, saveTemplate: w, focusToInput: p, initializeDrawer: d, WpDrawer: N, InBasicTextInput: M, InMultiSelect: I };
59
60
  }
60
61
  });
61
62
  export {
@@ -1,28 +1,30 @@
1
- import { defaultHtmlCompilerRules as n } from "../config/compiler/htmlCompilerRules.js";
2
- import { itemsCompilerRules as a } from "../config/compiler/itemsCompilerRules.js";
3
- import { outlookCompilerRules as f } from "../config/compiler/outlookCompilerRules.js";
4
- import { recommendationCompilerRules as R } from "../config/compiler/recommendationCompilerRules.js";
5
- import { socialCompilerRules as C } from "../config/compiler/socialCompilerRules.js";
1
+ import { defaultHtmlCompilerRules as c } from "../config/compiler/htmlCompilerRules.js";
2
+ import { itemsCompilerRules as f } from "../config/compiler/itemsCompilerRules.js";
3
+ import { liquidCompilerRules as R } from "../config/compiler/liquidCompilerRules.js";
4
+ import { outlookCompilerRules as C } from "../config/compiler/outlookCompilerRules.js";
5
+ import { recommendationCompilerRules as d } from "../config/compiler/recommendationCompilerRules.js";
6
+ import { socialCompilerRules as b } from "../config/compiler/socialCompilerRules.js";
6
7
  import { unsubscribeCompilerRules as g } from "../config/compiler/unsubscribeCompilerRules.js";
7
8
  import { createHtmlCompiler as H } from "../utils/htmlCompiler.js";
8
- import { useConfig as b } from "./useConfig.js";
9
- const q = () => {
9
+ import { useConfig as v } from "./useConfig.js";
10
+ const w = () => {
10
11
  var l, m, r;
11
- const { compiler: e, partner: t } = b(), i = ((l = e.value) == null ? void 0 : l.customRules) || [], s = [
12
- ...!!((m = e.value) != null && m.ignoreDefaultRules) ? [] : n,
13
- ...R,
12
+ const { compiler: e, isFeatureEnabled: t, partner: i } = v(), s = ((l = e.value) == null ? void 0 : l.customRules) || [], u = [
13
+ ...!!((m = e.value) != null && m.ignoreDefaultRules) ? [] : c,
14
+ ...d,
14
15
  ...g,
15
- ...a,
16
16
  ...f,
17
17
  ...C,
18
- ...i.map((o, c) => ({
18
+ ...b,
19
+ ...t("liquidSyntax") ? R : [],
20
+ ...s.map((o, a) => ({
19
21
  ...o,
20
- priority: o.priority + 1e3 + c
22
+ priority: o.priority + 1e3 + a
21
23
  // Ensure additional rules run after default rules
22
24
  }))
23
- ], p = H(s), u = (r = t.value) == null ? void 0 : r.fallbackFont;
24
- return { compileHtml: (o) => p.compile(o, void 0, u) };
25
+ ], p = H(u), n = (r = i.value) == null ? void 0 : r.fallbackFont;
26
+ return { compileHtml: (o) => p.compile(o, void 0, n) };
25
27
  };
26
28
  export {
27
- q as useHtmlCompiler
29
+ w as useHtmlCompiler
28
30
  };
@@ -1,4 +1,4 @@
1
- import { RecommendationFeedSourceMaps as g, URLS as p } from "../enums/extensions/recommendationBlock.js";
1
+ import { getRecommendationFeedSourceMaps as g, URLS as p } from "../enums/extensions/recommendationBlock.js";
2
2
  import { MinDeviceViewport as R, DefaultPadding as b } from "../enums/recommendation.js";
3
3
  import { useRecommendationExtensionStore as u } from "../extensions/Blocks/Recommendation/store/recommendation.js";
4
4
  import { generateCompleteFilterQuery as x } from "../extensions/Blocks/Recommendation/utils/filterUtil.js";
@@ -47,7 +47,7 @@ const N = () => ({
47
47
  const n = u(), o = I(), a = Number(i), r = n.blockStates[a];
48
48
  if (!r)
49
49
  return "";
50
- const { recommendationConfigs: e } = r, l = ((m = g.find((s) => s.key === e.strategy)) == null ? void 0 : m.path) || "", t = new URLSearchParams();
50
+ const { recommendationConfigs: e } = r, l = ((m = g().find((s) => s.key === e.strategy)) == null ? void 0 : m.path) || "", t = new URLSearchParams();
51
51
  t.set("locale", e.language), t.set("currency", e.currencySettings.value), t.set("partnerName", o.partnerName), t.set("size", e.size), t.set("details", "true"), t.set("campaignId", o.variationId), e.strategy === "manualMerchandising" ? t.set("productId", e.productIds.join(",")) : e.strategy === "similarViewed" && t.set("productId", "{itemId}"), e.strategy === "userBased" && t.set("userId", "{user_id}");
52
52
  const f = e.filters.filter((s) => s.isValid), c = x(f);
53
53
  c && t.set("filter", c), e.shuffleProducts && t.set("shuffle", "true");
@@ -1,23 +1,29 @@
1
- import { useActionsApi as d } from "./useActionsApi.js";
2
- import { useConfig as f } from "./useConfig.js";
3
- import { useSaveStart as v, useSaveComplete as S } from "./useGuidoActions.js";
4
- import { useSyncModuleExtractor as x } from "./useSyncModuleExtractor.js";
5
- import { useStripoApi as V } from "../services/stripoApi.js";
6
- import { useTemplatePreparation as y } from "../utils/templatePreparation.js";
7
- import { useHtmlValidator as w } from "./useHtmlValidator.js";
8
- const k = () => {
9
- const o = v(), s = S(), { validateHtml: i } = w(), { callbacks: a } = f(), { extractSyncModuleData: r } = x(), { setSyncModuleUnsubscriptionPages: n } = V(), { editorSave: l } = d();
10
- return { save: async (c = !1) => {
11
- var e;
1
+ import { useActionsApi as S } from "./useActionsApi.js";
2
+ import { useConfig as V } from "./useConfig.js";
3
+ import { useSaveStart as x, useSaveComplete as y } from "./useGuidoActions.js";
4
+ import { useSyncModuleExtractor as w } from "./useSyncModuleExtractor.js";
5
+ import { useStripoApi as b } from "../services/stripoApi.js";
6
+ import { useTemplatePreparation as q } from "../utils/templatePreparation.js";
7
+ import { useHtmlValidator as H } from "./useHtmlValidator.js";
8
+ import { useLiquidValidator as L } from "./validators/useLiquidValidator.js";
9
+ const F = () => {
10
+ const o = x(), s = y(), { validateHtml: r } = H(), { validateLiquidSyntax: n } = L(), { callbacks: a, isFeatureEnabled: l } = V(), { extractSyncModuleData: d } = w(), { setSyncModuleUnsubscriptionPages: u } = b(), { editorSave: c } = S();
11
+ return { save: async (m = !1) => {
12
+ var i;
12
13
  o();
13
- const { prepareTemplateDetails: m } = y(), t = await m();
14
- if (!await i(t.compiledHtml, t.dynamicContentList, !0) || (e = a.value) != null && e.externalValidation && !await a.value.externalValidation(t))
14
+ const { prepareTemplateDetails: p } = q(), t = await p();
15
+ if (l("liquidSyntax")) {
16
+ if (!await n(t.compiledHtml))
17
+ return;
18
+ } else if (!await r(t.compiledHtml, t.dynamicContentList, !0))
15
19
  return;
16
- l();
17
- const { unsubscribePayload: u, stripoModules: p } = r(t.rawHtml);
18
- return await n(u), t.modules = p, c || s(t), t;
20
+ if ((i = a.value) != null && i.externalValidation && !await a.value.externalValidation(t))
21
+ return;
22
+ c();
23
+ const { unsubscribePayload: f, stripoModules: v } = d(t.rawHtml);
24
+ return await u(f), t.modules = v, m || s(t), t;
19
25
  } };
20
26
  };
21
27
  export {
22
- k as useSave
28
+ F as useSave
23
29
  };
@@ -1,42 +1,42 @@
1
- import { useActionsApi as A } from "./useActionsApi.js";
2
- import { useBlocksConfig as F } from "./useBlocksConfig.js";
3
- import { useConfig as D } from "./useConfig.js";
4
- import { useCustomInterfaceAppearance as I } from "./useCustomInterfaceAppearance.js";
5
- import { useStripoEventHandler as P } from "./useStripoEventHandler.js";
6
- import { useToaster as U } from "./useToaster.js";
7
- import { localePatch as R } from "../config/i18n/index.js";
8
- import { displayConditions as H } from "../enums/displayConditions.js";
9
- import { useStripoApi as O } from "../services/stripoApi.js";
10
- import q from "../static/styles/customEditorStyle.css.js";
11
- import { useEditorStore as S } from "../stores/editor.js";
12
- import { dynamicContentToMergeTags as x } from "../utils/genericUtil.js";
13
- import L from "../package.json.js";
14
- const oe = (C, c) => {
15
- const { features: l, template: E } = D(), { handleError: u } = U(), { getToken: h, getCustomFonts: w, getSyncModulesStatus: b } = O(), { handleEvent: k } = P(), { getStripoBlocksConfig: T } = F(), V = async (i, n = [], r = !1) => {
16
- var f, g, y;
17
- const e = S(), { html: m, css: a } = i, { baseBlocks: o, extensions: d } = await T(), p = ((f = l.value) == null ? void 0 : f.displayConditions) ?? !0, B = ((g = l.value) == null ? void 0 : g.modulesDisabled) ?? !1, v = ((y = E.value) == null ? void 0 : y.forceRecreate) ?? !1;
1
+ import { useActionsApi as F } from "./useActionsApi.js";
2
+ import { useBlocksConfig as D } from "./useBlocksConfig.js";
3
+ import { useConfig as I } from "./useConfig.js";
4
+ import { useCustomInterfaceAppearance as P } from "./useCustomInterfaceAppearance.js";
5
+ import { useStripoEventHandler as U } from "./useStripoEventHandler.js";
6
+ import { useToaster as R } from "./useToaster.js";
7
+ import { localePatch as q } from "../config/i18n/index.js";
8
+ import { getDisplayConditions as x } from "../enums/displayConditions.js";
9
+ import { useStripoApi as H } from "../services/stripoApi.js";
10
+ import O from "../static/styles/customEditorStyle.css.js";
11
+ import { useEditorStore as C } from "../stores/editor.js";
12
+ import { dynamicContentToMergeTags as L } from "../utils/genericUtil.js";
13
+ import $ from "../package.json.js";
14
+ const ie = (E, c) => {
15
+ const { features: l, template: h, isFeatureEnabled: u } = I(), { handleError: m } = R(), { getToken: b, getCustomFonts: w, getSyncModulesStatus: k } = H(), { handleEvent: T } = U(), { getStripoBlocksConfig: V } = D(), _ = async (i, n = [], r = !1) => {
16
+ var f, y, S;
17
+ const e = C(), { html: p, css: a } = i, { baseBlocks: o, extensions: d } = await V(), g = ((f = l.value) == null ? void 0 : f.displayConditions) ?? !0, v = ((y = l.value) == null ? void 0 : y.modulesDisabled) ?? !1, M = ((S = h.value) == null ? void 0 : S.forceRecreate) ?? !1;
18
18
  window.UIEditor.initEditor(
19
19
  document.querySelector("#guido-editor"),
20
20
  {
21
- metadata: C,
22
- html: m,
21
+ metadata: E,
22
+ html: p,
23
23
  css: a,
24
- forceRecreate: v,
24
+ forceRecreate: M,
25
25
  locale: "en",
26
26
  undoButtonSelector: "#guido__undo-button",
27
27
  redoButtonSelector: "#guido__redo-button",
28
28
  mobileViewButtonSelector: ".guido__view-option-selection-mobile",
29
29
  desktopViewButtonSelector: ".guido__view-option-selection-desktop",
30
30
  codeEditorButtonSelector: "#guido__code-button",
31
- customAppearanceMergetags: !0,
31
+ customAppearanceMergetags: !u("liquidSyntax"),
32
32
  customAppearanceMergetagsBorderColor: "#f1f3fe",
33
33
  customAppearanceMergetagsBackgroundColor: "#f1f3fe",
34
- customViewStyles: q,
35
- conditionsEnabled: p,
36
- customConditionsEnabled: p,
37
- conditionCategories: H,
34
+ customViewStyles: O,
35
+ conditionsEnabled: g,
36
+ customConditionsEnabled: g,
37
+ conditionCategories: x(),
38
38
  enableXSSSecurity: !0,
39
- modulesDisabled: B,
39
+ modulesDisabled: v,
40
40
  syncModulesEnabled: r,
41
41
  messageSettingsEnabled: !0,
42
42
  displayGmailAnnotations: !0,
@@ -52,25 +52,28 @@ const oe = (C, c) => {
52
52
  },
53
53
  mergeTags: [
54
54
  {
55
- entries: x(c.preselectedDynamicContentList)
55
+ entries: L(
56
+ c.preselectedDynamicContentList,
57
+ u("liquidSyntax")
58
+ )
56
59
  }
57
60
  ],
58
61
  async onTokenRefreshRequest(t) {
59
62
  try {
60
- const s = await h();
63
+ const s = await b();
61
64
  t(s);
62
65
  } catch (s) {
63
- u(s, "Failed to refresh token");
66
+ m(s, "Failed to refresh token");
64
67
  }
65
68
  },
66
69
  onTemplateLoaded() {
67
70
  try {
68
- const { importCss: t } = I(), { activateCustomViewStyles: s, updateTimerInClonedTemplate: M } = A();
69
- t(), s(), M(), c.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
71
+ const { importCss: t } = P(), { activateCustomViewStyles: s, updateTimerInClonedTemplate: A } = F();
72
+ t(), s(), A(), c.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
70
73
  e.hasChanges = !1;
71
74
  }, 1e3);
72
75
  } catch (t) {
73
- u(t, "Failed to load custom interface appearance");
76
+ m(t, "Failed to load custom interface appearance");
74
77
  }
75
78
  },
76
79
  onCodeEditorVisibilityChanged(t) {
@@ -85,23 +88,23 @@ const oe = (C, c) => {
85
88
  onDataChanged() {
86
89
  e.hasChanges = !0;
87
90
  },
88
- onEvent: k,
91
+ onEvent: T,
89
92
  ignoreClickOutsideSelectors: [
90
93
  "#guido-dynamic-content-modal",
91
94
  ".in-on-board-wrapper",
92
95
  ".in-drawer__container"
93
96
  ],
94
97
  extensions: d,
95
- localePatch: R
98
+ localePatch: q
96
99
  }
97
100
  );
98
- }, _ = (i) => new Promise((n, r) => {
101
+ }, B = (i) => new Promise((n, r) => {
99
102
  var d;
100
103
  if (document.getElementById("UiEditorScript")) {
101
104
  i(), n();
102
105
  return;
103
106
  }
104
- const e = L.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
107
+ const e = $.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
105
108
  o.id = "UiEditorScript", o.type = "module", o.src = a, o.onload = () => {
106
109
  i(), n();
107
110
  }, o.onerror = () => {
@@ -109,15 +112,15 @@ const oe = (C, c) => {
109
112
  }, document.body.appendChild(o);
110
113
  });
111
114
  return { initPlugin: async (i) => {
112
- await _(async () => {
113
- const n = S(), [r, e] = await Promise.all([
115
+ await B(async () => {
116
+ const n = C(), [r, e] = await Promise.all([
114
117
  w(),
115
- b()
118
+ k()
116
119
  ]);
117
- n.syncModulesEnabled = e, await V(i, r, e);
120
+ n.syncModulesEnabled = e, await _(i, r, e);
118
121
  });
119
122
  } };
120
123
  };
121
124
  export {
122
- oe as useStripo
125
+ ie as useStripo
123
126
  };
@@ -0,0 +1,42 @@
1
+ import { ToasterTypeOptions as a } from "../../enums/toaster.js";
2
+ import { base64EncodeWithSpecialChars as u } from "../../utils/base64.js";
3
+ import { useHttp as d } from "../useHttp.js";
4
+ import { useToaster as c } from "../useToaster.js";
5
+ import { useTranslations as p } from "../useTranslations.js";
6
+ const v = () => {
7
+ const { post: i } = d(), { showToaster: e } = c(), s = p();
8
+ return { validateLiquidSyntax: async (o) => {
9
+ try {
10
+ const t = await i("/newsletter/contents/validate-syntax", [{
11
+ identifier: "default",
12
+ syntax: "liquid",
13
+ contents: {
14
+ subject: null,
15
+ preheader: null,
16
+ html: u(o),
17
+ ampHtml: null
18
+ }
19
+ }]);
20
+ if (!Array.isArray(t.data)) {
21
+ const l = t.data;
22
+ return e({
23
+ type: a.Warning,
24
+ message: l.message ?? s("journey-builder.liquid-validation-failed")
25
+ }), !1;
26
+ }
27
+ const [r] = t.data, n = Object.values((r == null ? void 0 : r.errors) ?? {});
28
+ return n.length ? (e({
29
+ type: a.Warning,
30
+ message: n[0].replace(/^line \d+:\s*/, "")
31
+ }), !1) : !0;
32
+ } catch {
33
+ return e({
34
+ type: a.Alert,
35
+ message: s("journey-builder.liquid-validation-failed")
36
+ }), !1;
37
+ }
38
+ } };
39
+ };
40
+ export {
41
+ v as useLiquidValidator
42
+ };
@@ -0,0 +1,15 @@
1
+ import { COUPON_PLACEHOLDER_LIQUID as e, COUPON_PLACEHOLDER_DEFAULT as i } from "../../extensions/Blocks/CouponBlock/template.js";
2
+ const o = [
3
+ {
4
+ id: "liquid-coupon-code",
5
+ description: "Replace legacy coupon placeholder with liquid syntax",
6
+ type: "replace",
7
+ search: i,
8
+ replacement: e,
9
+ replaceAll: !0,
10
+ priority: 50
11
+ }
12
+ ];
13
+ export {
14
+ o as liquidCompilerRules
15
+ };