@useinsider/guido 3.7.2-beta.a114aa7 → 3.7.2-beta.a787136

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 (50) hide show
  1. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +8 -8
  2. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +15 -12
  3. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +5 -5
  4. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue2.js +16 -15
  5. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +4 -4
  6. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +38 -35
  7. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +1 -1
  8. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +54 -51
  9. package/dist/composables/useHtmlValidator.js +133 -180
  10. package/dist/composables/usePreviewInteractionGuard.js +17 -0
  11. package/dist/composables/useSave.js +14 -14
  12. package/dist/composables/validators/useUnsubscribeBlockValidator.js +26 -17
  13. package/dist/config/compiler/utils/recommendationCompilerUtils.js +27 -28
  14. package/dist/config/migrator/recommendation/extractors.js +22 -44
  15. package/dist/config/migrator/recommendation/htmlBuilder.js +169 -175
  16. package/dist/config/migrator/recommendationMigrator.js +31 -30
  17. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +15 -21
  18. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +41 -55
  19. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +42 -43
  20. package/dist/extensions/Blocks/Recommendation/controls/main/layoutOrientation.js +33 -44
  21. package/dist/extensions/Blocks/Recommendation/controls/main/productCount.js +2 -3
  22. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +49 -59
  23. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +82 -89
  24. package/dist/extensions/Blocks/Recommendation/controls/syncInfoMessage.js +6 -7
  25. package/dist/extensions/Blocks/Recommendation/extension.js +5 -6
  26. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +2 -3
  27. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +2 -3
  28. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +12 -13
  29. package/dist/extensions/Blocks/Recommendation/templates/index.js +4 -5
  30. package/dist/extensions/Blocks/Unsubscribe/block.js +40 -37
  31. package/dist/extensions/Blocks/Unsubscribe/control.js +19 -16
  32. package/dist/guido.css +1 -1
  33. package/dist/src/composables/useHtmlValidator.d.ts +0 -27
  34. package/dist/src/composables/usePreviewInteractionGuard.d.ts +3 -0
  35. package/dist/src/composables/validators/useUnsubscribeBlockValidator.d.ts +1 -0
  36. package/dist/src/config/migrator/recommendation/extractors.d.ts +0 -15
  37. package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +0 -8
  38. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  39. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +0 -21
  40. package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +0 -7
  41. package/dist/src/extensions/Blocks/Recommendation/controls/main/layoutOrientation.d.ts +0 -5
  42. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +0 -6
  43. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +0 -9
  44. package/dist/src/stores/unsubscribe.d.ts +11 -1
  45. package/dist/stores/unsubscribe.js +8 -7
  46. package/package.json +1 -1
  47. package/dist/config/compiler/utils/recommendationIgnoreUtils.js +0 -15
  48. package/dist/src/composables/useHtmlValidator.test.d.ts +0 -1
  49. package/dist/src/config/compiler/utils/recommendationIgnoreUtils.d.ts +0 -17
  50. package/dist/src/config/compiler/utils/recommendationIgnoreUtils.test.d.ts +0 -1
@@ -1,219 +1,172 @@
1
- import { useConfig as W } from "./useConfig.js";
2
- import { getIgnoredRecommendationBlockIds as G } from "../config/compiler/utils/recommendationIgnoreUtils.js";
3
- import { TemplateTypes as H } from "../enums/defaults.js";
4
- import { DISPLAY_CONDITIONS_REGEX as P, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as X, CampaignCouldNotBeSavedKey as $, CanNotMakeAnyChangesForRunningKey as Y, DATA_ATTRIBUTE_REGEX as U, DYNAMIC_CONTENT_TAG_REGEX as j, ALLOWED_DYNAMIC_SYSTEM_TOKENS as q, VALID_DYNAMIC_VARIABLE_REGEX as K } from "../enums/html-validator.js";
1
+ import { useConfig as V } from "./useConfig.js";
2
+ import { TemplateTypes as G } from "../enums/defaults.js";
3
+ import { DISPLAY_CONDITIONS_REGEX as H, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as M, CampaignCouldNotBeSavedKey as X, CanNotMakeAnyChangesForRunningKey as P, DATA_ATTRIBUTE_REGEX as Y, DYNAMIC_CONTENT_TAG_REGEX as $, ALLOWED_DYNAMIC_SYSTEM_TOKENS as q, VALID_DYNAMIC_VARIABLE_REGEX as K } from "../enums/html-validator.js";
5
4
  import { ToasterTypeOptions as c } from "../enums/toaster.js";
6
- import { itemsBlockDynamicVariables as z } from "../extensions/Blocks/Items/enums/productEnums.js";
7
- import { RECOMMENDATION_VARIABLE_BUILTIN_ATTRIBUTES as Z } from "../extensions/Blocks/Recommendation/constants/selectors.js";
8
- import { useRecommendationExtensionStore as J } from "../extensions/Blocks/Recommendation/store/recommendation.js";
9
- import { resolveProductAttrValue as Q } from "../extensions/Blocks/Recommendation/templates/utils.js";
10
- import { RecommendationRequiredFieldsKey as ee } from "../extensions/Blocks/Recommendation/validation/requiredFields.js";
11
- import { useRecommendationStore as te } from "../stores/recommendation.js";
12
- import { base64EncodeWithSpecialChars as ne } from "../utils/base64.js";
13
- import { useHttp as se } from "./useHttp.js";
14
- import { useToaster as oe } from "./useToaster.js";
15
- import { useTranslations as ie } from "./useTranslations.js";
16
- const re = /recommendation-id="(\d+)"/g;
17
- function ae(t) {
18
- return [...t.matchAll(re)].map((m) => m[1]);
5
+ import { itemsBlockDynamicVariables as j } from "../extensions/Blocks/Items/enums/productEnums.js";
6
+ import { useRecommendationExtensionStore as U } from "../extensions/Blocks/Recommendation/store/recommendation.js";
7
+ import { RecommendationRequiredFieldsKey as z } from "../extensions/Blocks/Recommendation/validation/requiredFields.js";
8
+ import { useRecommendationStore as Z } from "../stores/recommendation.js";
9
+ import { base64EncodeWithSpecialChars as J } from "../utils/base64.js";
10
+ import { useHttp as Q } from "./useHttp.js";
11
+ import { useToaster as ee } from "./useToaster.js";
12
+ import { useTranslations as te } from "./useTranslations.js";
13
+ const se = /recommendation-id="(\d+)"/g;
14
+ function ne(i) {
15
+ return [...i.matchAll(se)].map((d) => d[1]);
19
16
  }
20
- function ce(t, m) {
21
- return m.some((f) => t.startsWith(`${f}_`));
17
+ function ie(i, d) {
18
+ return d.some((g) => i.startsWith(`${g}_`));
22
19
  }
23
- const le = /^(\d+)_\d+_(.+)$/;
24
- function me(t) {
25
- const m = t.match(le);
26
- return m ? { recoId: m[1], attribute: m[2] } : null;
27
- }
28
- function ue(t) {
29
- const m = new Set(Z);
30
- return Object.values(t).forEach((f) => {
31
- m.add(Q(f.attributeName, t).toLowerCase());
32
- }), m;
33
- }
34
- function de(t, m, f, i, d) {
35
- const u = t.match(/{{([a-zA-Z0-9_.\s]*)}}/gm);
36
- if (!u)
37
- return [];
38
- const p = new Set(m.map((y) => y.toLowerCase())), h = [];
39
- return u.forEach((y) => {
40
- const g = y.slice(2, -2).trim().toLowerCase();
41
- if (g !== "" && p.has(g))
42
- return;
43
- const E = me(g);
44
- if (E && i.has(E.recoId)) {
45
- if (!d || d.has(E.attribute))
46
- return;
47
- h.push(g);
48
- return;
49
- }
50
- ce(g, f) || g.includes(".") || h.push(g);
51
- }), h;
52
- }
53
- function fe(t) {
54
- return (t.replace(U, "$1").match(j) ?? []).filter((i) => {
55
- const d = i.slice(2, -2), u = d.indexOf("|"), p = (u === -1 ? d : d.slice(0, u)).trim();
56
- return q.includes(p) ? !1 : K.test(p) ? u !== -1 && d.slice(u + 1).trim() === "" : !0;
20
+ function oe(i) {
21
+ return (i.replace(Y, "$1").match($) ?? []).filter((r) => {
22
+ const u = r.slice(2, -2), f = u.indexOf("|"), p = (f === -1 ? u : u.slice(0, f)).trim();
23
+ return q.includes(p) ? !1 : K.test(p) ? f !== -1 && u.slice(f + 1).trim() === "" : !0;
57
24
  });
58
25
  }
59
- const xe = () => {
60
- var I, b;
61
- const { showToaster: t } = oe(), { post: m } = se(), { config: f } = W(), i = ie(), d = te(), u = J(), p = ((b = (I = f.value) == null ? void 0 : I.partner) == null ? void 0 : b.messageType) === H.transactional, h = async (e) => {
62
- if (e.size === 0)
63
- return /* @__PURE__ */ new Set();
64
- try {
65
- await u.fetchRecommendationFilters();
66
- } catch {
67
- return null;
68
- }
69
- return ue(u.filterList);
70
- }, y = async (e) => {
71
- const n = await m(
26
+ const Ce = () => {
27
+ var h, v;
28
+ const { showToaster: i } = ee(), { post: d } = Q(), { config: g } = V(), r = te(), u = Z(), f = U(), p = ((v = (h = g.value) == null ? void 0 : h.partner) == null ? void 0 : v.messageType) === G.transactional, A = async (e) => {
29
+ const t = await d(
72
30
  "/newsletter/template-library/check-template-html-body",
73
- { html: ne(e) }
74
- ), { status: o, message: a } = n.data;
75
- return o || t({
31
+ { html: J(e) }
32
+ ), { status: n, message: l } = t.data;
33
+ return n || i({
76
34
  type: c.Alert,
77
- message: o === void 0 ? a : i("newsletter.invalid-url-link-for-toaster")
78
- }), i($), a === i(Y) && t({
35
+ message: n === void 0 ? l : r("newsletter.invalid-url-link-for-toaster")
36
+ }), r(X), l === r(P) && i({
79
37
  type: c.Alert,
80
- message: i("newsletter.already-in-progress")
81
- }), o;
82
- }, g = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), E = (e) => ["if", "endif"].includes(e.toLowerCase()), T = (e, s) => {
83
- const n = e.match(/({%(.*?)%})/g);
84
- let o = !0;
85
- return n !== null && !p && n.forEach((a) => {
86
- const r = a.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
87
- if (r && r.length > 0) {
88
- const [l] = r;
89
- g(l) && !s.includes(l) && (t({
38
+ message: r("newsletter.already-in-progress")
39
+ }), n;
40
+ }, S = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), b = (e) => ["if", "endif"].includes(e.toLowerCase()), I = (e, s) => {
41
+ const t = e.match(/({%(.*?)%})/g);
42
+ let n = !0;
43
+ return t !== null && !p && t.forEach((l) => {
44
+ const o = l.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
45
+ if (o && o.length > 0) {
46
+ const [a] = o;
47
+ S(a) && !s.includes(a) && (i({
90
48
  type: c.Warning,
91
- message: i("custom-fields.invalid-custom-fields")
92
- }), o = !1);
49
+ message: r("custom-fields.invalid-custom-fields")
50
+ }), n = !1);
93
51
  }
94
- }), o;
95
- }, w = async (e, s, n) => {
96
- const o = n ? await y(e) : !0;
97
- return T(e, s) && o;
98
- }, R = (e) => e.length > 0 ? !0 : (t({
52
+ }), n;
53
+ }, T = async (e, s, t) => {
54
+ const n = t ? await A(e) : !0;
55
+ return I(e, s) && n;
56
+ }, w = (e) => e.length > 0 ? !0 : (i({
99
57
  type: c.Warning,
100
- message: i("newsletter.html-content-is-empty")
101
- }), !1), _ = (e) => {
102
- const s = (e.match(/{/gm) || []).length, n = (e.match(/}/gm) || []).length;
103
- return s > n && t({
58
+ message: r("newsletter.html-content-is-empty")
59
+ }), !1), x = (e) => {
60
+ const s = (e.match(/{/gm) || []).length, t = (e.match(/}/gm) || []).length;
61
+ return s > t && i({
104
62
  type: c.Warning,
105
- message: i("custom-fields.missing-closing-braces")
106
- }), s < n && t({
63
+ message: r("custom-fields.missing-closing-braces")
64
+ }), s < t && i({
107
65
  type: c.Warning,
108
- message: i("custom-fields.missing-opening-braces")
109
- }), s === n;
110
- }, N = (e) => {
111
- const s = fe(e).length === 0;
112
- return s || t({
66
+ message: r("custom-fields.missing-opening-braces")
67
+ }), s === t;
68
+ }, _ = (e) => {
69
+ const s = oe(e).length === 0;
70
+ return s || i({
113
71
  type: c.Warning,
114
- message: i("custom-fields.invalid-custom-fields")
72
+ message: r("custom-fields.invalid-custom-fields")
115
73
  }), s;
116
- }, x = (e, s, n, o) => {
117
- if (p)
118
- return !0;
119
- const a = de(
120
- e,
121
- s,
122
- ae(e),
123
- n,
124
- o
125
- );
126
- if (a.length > 0) {
127
- const r = `
128
- <ul>
129
- ${a.map((l) => `<li>${l}</li>`).join("")}
130
- </ul>
131
- `;
132
- return t({
133
- type: c.Alert,
134
- message: i("custom-fields.invalid-custom-fields") + r
135
- }), !1;
74
+ }, k = (e, s) => {
75
+ const t = e.match(/{{([a-zA-Z0-9_\s]*)}}/gm);
76
+ if (t && !p) {
77
+ const n = new Set(s.map((a) => a.toLowerCase())), l = ne(e), o = [];
78
+ if (t.forEach((a) => {
79
+ const m = a.slice(2, -2).trim().toLowerCase();
80
+ (!n.has(m) || m === "") && !ie(m, l) && o.push(m);
81
+ }), o.length > 0) {
82
+ const a = `
83
+ <ul>
84
+ ${o.map((m) => `<li>${m}</li>`).join("")}
85
+ </ul>
86
+ `;
87
+ return i({
88
+ type: c.Alert,
89
+ message: r("custom-fields.invalid-custom-fields") + a
90
+ }), !1;
91
+ }
136
92
  }
137
93
  return !0;
138
- }, O = (e) => {
139
- const s = e.match(/{%(.*?)%}/g), n = [];
140
- let o = !0;
141
- if (s && s.forEach((a) => {
142
- const r = a.match(P), l = a.match(X), v = (r == null ? void 0 : r.join("")) || "";
143
- (!r || a !== v) && !l && (t({
94
+ }, R = (e) => {
95
+ const s = e.match(/{%(.*?)%}/g), t = [];
96
+ let n = !0;
97
+ if (s && s.forEach((l) => {
98
+ const o = l.match(H), a = l.match(M), m = (o == null ? void 0 : o.join("")) || "";
99
+ (!o || l !== m) && !a && (i({
144
100
  type: c.Alert,
145
- message: i("newsletter.display-conditions-invalid-syntax")
146
- }), o = !1), r && r.forEach((C) => {
147
- C.trim() === "=" && (t({
101
+ message: r("newsletter.display-conditions-invalid-syntax")
102
+ }), n = !1), o && o.forEach((y) => {
103
+ y.trim() === "=" && (i({
148
104
  type: c.Alert,
149
- message: i("custom-conditions.wrong-equality-operators")
150
- }), o = !1);
151
- const A = C.match(/^[a-zA-Z]*$/g);
152
- A && A.forEach((S) => {
153
- E(S) && n.push(S);
105
+ message: r("custom-conditions.wrong-equality-operators")
106
+ }), n = !1);
107
+ const C = y.match(/^[a-zA-Z]*$/g);
108
+ C && C.forEach((E) => {
109
+ b(E) && t.push(E);
154
110
  });
155
111
  });
156
- }), n.length) {
157
- const a = n.filter((l) => l === "if"), r = n.filter((l) => l === "endif");
158
- a.length !== r.length && (t({
112
+ }), t.length) {
113
+ const l = t.filter((a) => a === "if"), o = t.filter((a) => a === "endif");
114
+ l.length !== o.length && (i({
159
115
  type: c.Alert,
160
- message: i("custom-conditions.missing-if-endif-tag")
161
- }), o = !1);
116
+ message: r("custom-conditions.missing-if-endif-tag")
117
+ }), n = !1);
162
118
  }
163
- return o;
164
- }, k = (e) => {
165
- const s = (e.match(/{% /gm) || []).length, n = (e.match(/ %}/gm) || []).length, o = s === n;
166
- return o || t({
119
+ return n;
120
+ }, N = (e) => {
121
+ const s = (e.match(/{% /gm) || []).length, t = (e.match(/ %}/gm) || []).length, n = s === t;
122
+ return n || i({
167
123
  type: c.Warning,
168
- message: i("custom-conditions.no-space-after-braces")
169
- }), o;
170
- }, B = (e) => (e.match(/({%(.*?)%})/g) || []).filter((n) => n.includes("if")).map((n) => (n.match(/{{.*}}/gm) || []).length).reduce((n, o) => n + o, 0) > 0 ? (t({
124
+ message: r("custom-conditions.no-space-after-braces")
125
+ }), n;
126
+ }, D = (e) => (e.match(/({%(.*?)%})/g) || []).filter((t) => t.includes("if")).map((t) => (t.match(/{{.*}}/gm) || []).length).reduce((t, n) => t + n, 0) > 0 ? (i({
171
127
  type: c.Warning,
172
- message: i("custom-conditions.no-braces-inside-if-tag")
173
- }), !1) : !0, D = () => u.hasInvalidBlock() ? (t({
128
+ message: r("custom-conditions.no-braces-inside-if-tag")
129
+ }), !1) : !0, F = () => f.hasInvalidBlock() ? (i({
174
130
  type: c.Alert,
175
- message: i(ee)
176
- }), !1) : !0, F = () => d.recommendationConfigs && Object.values(d.recommendationConfigs).find((s) => s.filters.find((n) => n.value === "")) !== void 0 ? (t({
131
+ message: r(z)
132
+ }), !1) : !0, O = () => u.recommendationConfigs && Object.values(u.recommendationConfigs).find((s) => s.filters.find((t) => t.value === "")) !== void 0 ? (i({
177
133
  type: c.Alert,
178
- message: i("newsletter.fill-all-necessary-fields")
179
- }), !1) : !0, L = (e) => {
134
+ message: r("newsletter.fill-all-necessary-fields")
135
+ }), !1) : !0, B = (e) => {
180
136
  const s = /src="[^"]*\.(svg|pst)"/gm;
181
- return e.match(s) === null ? !0 : (t({
137
+ return e.match(s) === null ? !0 : (i({
182
138
  type: c.Alert,
183
- message: i("newsletter.invalid-image-type")
139
+ message: r("newsletter.invalid-image-type")
184
140
  }), !1);
185
- }, V = (e) => {
186
- const o = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
187
- return Array.from(o).find((r) => {
188
- var l;
189
- return !((l = r.id) != null && l.trim());
190
- }) ? (t({
141
+ }, L = (e) => {
142
+ const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
143
+ return Array.from(n).find((o) => {
144
+ var a;
145
+ return !((a = o.id) != null && a.trim());
146
+ }) ? (i({
191
147
  type: c.Alert,
192
- message: i("unsubscribe-templates.select-checkbox-groups")
148
+ message: r("unsubscribe-templates.select-checkbox-groups")
193
149
  }), !1) : !0;
194
- }, M = (e) => {
195
- const o = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
196
- return Array.from(o).find((r) => {
197
- var l;
198
- return !((l = r.id) != null && l.trim());
199
- }) ? (t({
150
+ }, W = (e) => {
151
+ const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
152
+ return Array.from(n).find((o) => {
153
+ var a;
154
+ return !((a = o.id) != null && a.trim());
155
+ }) ? (i({
200
156
  type: c.Alert,
201
- message: i("unsubscribe-templates.select-radio-button-groups")
157
+ message: r("unsubscribe-templates.select-radio-button-groups")
202
158
  }), !1) : !0;
203
159
  };
204
- return { validateHtml: async (e, s, n = !1) => {
205
- var v, C;
206
- const o = [
207
- ...s.map((A) => A.value),
208
- ...z,
209
- ...((C = (v = f.value) == null ? void 0 : v.template) == null ? void 0 : C.customFieldAttributes) ?? []
210
- ], a = G(e), r = await h(a);
211
- return await w(e, o, n) && R(e) && _(e) && N(e) && x(e, o, a, r) && O(e) && k(e) && B(e) && D() && F() && L(e) && V(e) && M(e);
160
+ return { validateHtml: async (e, s, t = !1) => {
161
+ var o, a;
162
+ const n = [
163
+ ...s.map((m) => m.value),
164
+ ...j,
165
+ ...((a = (o = g.value) == null ? void 0 : o.template) == null ? void 0 : a.customFieldAttributes) ?? []
166
+ ];
167
+ return await T(e, n, t) && w(e) && x(e) && _(e) && k(e, n) && R(e) && N(e) && D(e) && F() && O() && B(e) && L(e) && W(e);
212
168
  } };
213
169
  };
214
170
  export {
215
- ue as buildPartnerAttributeNameSet,
216
- de as findInvalidCustomFields,
217
- me as parseRecommendationVariable,
218
- xe as useHtmlValidator
171
+ Ce as useHtmlValidator
219
172
  };
@@ -0,0 +1,17 @@
1
+ const o = ["click", "auxclick", "submit"], c = (t) => {
2
+ t.preventDefault(), t.stopPropagation();
3
+ }, a = () => ({ blockPreviewInteractions: (r) => {
4
+ try {
5
+ const e = r.contentDocument;
6
+ if (!e)
7
+ return;
8
+ o.forEach((n) => {
9
+ e.addEventListener(n, c, !0);
10
+ });
11
+ } catch (e) {
12
+ console.warn("[usePreviewInteractionGuard] Could not guard preview iframe:", e);
13
+ }
14
+ } });
15
+ export {
16
+ a as usePreviewInteractionGuard
17
+ };
@@ -1,32 +1,32 @@
1
- import { useActionsApi as x } from "./useActionsApi.js";
1
+ import { useActionsApi as H } from "./useActionsApi.js";
2
2
  import { useConfig as y } from "./useConfig.js";
3
- import { useSaveStart as w, useSaveComplete as H } from "./useGuidoActions.js";
3
+ import { useSaveStart as w, useSaveComplete as k } from "./useGuidoActions.js";
4
4
  import { useSyncModuleExtractor as q } from "./useSyncModuleExtractor.js";
5
5
  import { useStripoApi as C } from "../services/stripoApi.js";
6
6
  import { useTemplatePreparation as E } from "../utils/templatePreparation.js";
7
- import { useHtmlValidator as k } from "./useHtmlValidator.js";
7
+ import { useHtmlValidator as B } from "./useHtmlValidator.js";
8
8
  import { useCouponBlockValidator as L } from "./validators/useCouponBlockValidator.js";
9
9
  import { useLiquidValidator as P } from "./validators/useLiquidValidator.js";
10
- import { useUnsubscribeBlockValidator as B } from "./validators/useUnsubscribeBlockValidator.js";
11
- const J = () => {
12
- const o = w(), s = H(), { validateHtml: r } = k(), { validateLiquidSyntax: n } = P(), { validateCouponBlockTags: l } = L(), { validateUnsubscribeBlockUniqueness: d } = B(), { callbacks: i, isFeatureEnabled: u } = y(), { extractSyncModuleData: c } = q(), { setSyncModuleUnsubscriptionPages: m } = C(), { editorSave: p } = x();
13
- return { save: async (f = !1, v = !1) => {
10
+ import { useUnsubscribeBlockValidator as U } from "./validators/useUnsubscribeBlockValidator.js";
11
+ const K = () => {
12
+ const o = w(), s = k(), { validateHtml: r } = B(), { validateLiquidSyntax: l } = P(), { validateCouponBlockTags: n } = L(), { validateUnsubscribeBlockUniqueness: d, validateUnsubscribeBlockHasTemplate: c } = U(), { callbacks: i, isFeatureEnabled: u } = y(), { extractSyncModuleData: m } = q(), { setSyncModuleUnsubscriptionPages: p } = C(), { editorSave: v } = H();
13
+ return { save: async (f = !1, S = !1) => {
14
14
  var a;
15
15
  o();
16
- const { prepareTemplateDetails: S } = E(), t = await S();
17
- if (!l(t.compiledHtml) || !d(t.compiledHtml))
16
+ const { prepareTemplateDetails: V } = E(), t = await V();
17
+ if (!n(t.compiledHtml) || !d(t.compiledHtml) || !c(t.compiledHtml))
18
18
  return;
19
19
  if (u("liquidSyntax")) {
20
- if (!await n(t.compiledHtml))
20
+ if (!await l(t.compiledHtml))
21
21
  return;
22
22
  } else if (!await r(t.compiledHtml, t.dynamicContentList, !0))
23
23
  return;
24
- if ((a = i.value) != null && a.externalValidation && !await i.value.externalValidation(t) || !await p())
24
+ if ((a = i.value) != null && a.externalValidation && !await i.value.externalValidation(t) || !await v())
25
25
  return;
26
- const { unsubscribePayload: V, stripoModules: b } = c(t.rawHtml);
27
- return await m(V), t.modules = b, f || s({ ...t, silent: v }), t;
26
+ const { unsubscribePayload: b, stripoModules: x } = m(t.rawHtml);
27
+ return await p(b), t.modules = x, f || s({ ...t, silent: S }), t;
28
28
  } };
29
29
  };
30
30
  export {
31
- J as useSave
31
+ K as useSave
32
32
  };
@@ -1,32 +1,41 @@
1
1
  import { ToasterTypeOptions as i } from "../../enums/toaster.js";
2
- import { PAGE_TYPES as n } from "../../enums/unsubscribe.js";
3
- import { UNSUBSCRIBE_BLOCK_SELECTOR as u, DATA_ATTRIBUTES as l } from "../../extensions/Blocks/Unsubscribe/utils/constants.js";
4
- import { useToaster as T } from "../useToaster.js";
2
+ import { PAGE_TYPES as u } from "../../enums/unsubscribe.js";
3
+ import { UNSUBSCRIBE_BLOCK_SELECTOR as l, DATA_ATTRIBUTES as a } from "../../extensions/Blocks/Unsubscribe/utils/constants.js";
4
+ import { useToaster as m } from "../useToaster.js";
5
5
  import { useTranslations as E } from "../useTranslations.js";
6
- const m = [
6
+ const T = [
7
7
  {
8
- pageType: n.GLOBAL_UNSUBSCRIBE,
8
+ pageType: u.GLOBAL_UNSUBSCRIBE,
9
9
  messageKey: "unsubscription-preference.duplicate-global-unsub"
10
10
  },
11
11
  {
12
- pageType: n.SUBSCRIPTION_PREFERENCE_CENTER,
12
+ pageType: u.SUBSCRIPTION_PREFERENCE_CENTER,
13
13
  messageKey: "unsubscription-preference.duplicate-pref-center"
14
14
  }
15
- ], g = "unsubscription-preference.duplicate-both", y = () => {
16
- const { showToaster: o } = T(), a = E();
17
- return { validateUnsubscribeBlockUniqueness: (c) => {
18
- const p = new DOMParser().parseFromString(c, "text/html"), t = /* @__PURE__ */ new Map();
19
- p.querySelectorAll(u).forEach((e) => {
20
- const r = Number(e.getAttribute(l.PAGE_TYPE));
21
- t.set(r, (t.get(r) ?? 0) + 1);
15
+ ], g = "unsubscription-preference.duplicate-both", b = "unsubscription-preference.select-page-to-continue", P = () => {
16
+ const { showToaster: c } = m(), p = E();
17
+ return { validateUnsubscribeBlockUniqueness: (n) => {
18
+ const o = new DOMParser().parseFromString(n, "text/html"), s = /* @__PURE__ */ new Map();
19
+ o.querySelectorAll(l).forEach((e) => {
20
+ const r = Number(e.getAttribute(a.PAGE_TYPE));
21
+ s.set(r, (s.get(r) ?? 0) + 1);
22
22
  });
23
- const s = m.filter((e) => (t.get(e.pageType) ?? 0) > 1).map((e) => e.messageKey);
24
- return s.length ? (o({
23
+ const t = T.filter((e) => (s.get(e.pageType) ?? 0) > 1).map((e) => e.messageKey);
24
+ return t.length ? (c({
25
25
  type: i.Alert,
26
- message: a(s.length > 1 ? g : s[0])
26
+ message: p(t.length > 1 ? g : t[0])
27
+ }), !1) : !0;
28
+ }, validateUnsubscribeBlockHasTemplate: (n) => {
29
+ const o = new DOMParser().parseFromString(n, "text/html");
30
+ return Array.from(o.querySelectorAll(l)).some((t) => {
31
+ const e = t.getAttribute(a.PAGE_TYPE), r = t.getAttribute(a.PAGE_LIST);
32
+ return !e || !r;
33
+ }) ? (c({
34
+ type: i.Warning,
35
+ message: p(b)
27
36
  }), !1) : !0;
28
37
  } };
29
38
  };
30
39
  export {
31
- y as useUnsubscribeBlockValidator
40
+ P as useUnsubscribeBlockValidator
32
41
  };
@@ -2,7 +2,6 @@ import { useConfig as g } from "../../../composables/useConfig.js";
2
2
  import { useRecommendation as _ } from "../../../composables/useRecommendation.js";
3
3
  import { CSS_CLASS_RECO_BUTTON as q } from "../../../extensions/Blocks/Recommendation/constants/selectors.js";
4
4
  import { useRecommendationExtensionStore as C } from "../../../extensions/Blocks/Recommendation/store/recommendation.js";
5
- import { isIgnoredRecommendationBlock as w } from "./recommendationIgnoreUtils.js";
6
5
  function y(r, n, e, o, i = "") {
7
6
  const c = `{{${i}${r}_${n}_${e}}}`, t = `{{${i}${r}_${n}_currency}}`;
8
7
  return o === "before" ? `${t} ${c}` : `${c} ${t}`;
@@ -13,7 +12,7 @@ function A(r) {
13
12
  [n] = n.children;
14
13
  return n;
15
14
  }
16
- function b(r, n, e, o, i, c) {
15
+ function f(r, n, e, o, i, c) {
17
16
  switch (n) {
18
17
  case "productImage": {
19
18
  const t = r.querySelector("img");
@@ -88,45 +87,45 @@ function b(r, n, e, o, i, c) {
88
87
  }
89
88
  }
90
89
  }
91
- function E(r, n, e, o) {
90
+ function w(r, n, e, o) {
92
91
  r.querySelectorAll(".recommendation-product-row").forEach((c, t) => {
93
92
  c.querySelectorAll("[data-attribute-type]").forEach((a) => {
94
93
  const u = a.getAttribute("data-attribute-type") || "", p = a.querySelectorAll(".attribute-cell");
95
94
  p.length > 0 ? p.forEach((l) => {
96
- b(l, u, n, t, e, o);
97
- }) : b(a, u, n, t, e, o);
95
+ f(l, u, n, t, e, o);
96
+ }) : f(a, u, n, t, e, o);
98
97
  });
99
98
  });
100
99
  }
101
- function R(r, n, e, o) {
100
+ function E(r, n, e, o) {
102
101
  const i = r.querySelectorAll(".recommendation-product-row");
103
102
  if (!i.length)
104
103
  return;
105
104
  const [c] = i, t = c.querySelector("[data-attribute-type]"), s = t ? t.querySelectorAll(".attribute-cell").length : 1;
106
105
  i.forEach((a, u) => {
107
106
  a.querySelectorAll("[data-attribute-type]").forEach((l) => {
108
- const m = l.getAttribute("data-attribute-type") || "";
107
+ const d = l.getAttribute("data-attribute-type") || "";
109
108
  l.querySelectorAll(".attribute-cell").forEach((h, $) => {
110
109
  const S = u * s + $;
111
- b(h, m, n, S, e, o);
110
+ f(h, d, n, S, e, o);
112
111
  });
113
112
  });
114
113
  });
115
114
  }
116
- function P(r, n, e, o) {
115
+ function R(r, n, e, o) {
117
116
  r.querySelectorAll(".ins-recommendation-product-container").forEach((c) => {
118
- R(c, n, e, o);
117
+ E(c, n, e, o);
119
118
  });
120
119
  }
121
- function T(r, n, e) {
120
+ function P(r, n, e) {
122
121
  const o = r.getAttribute("data-layout") || "grid", i = r.getAttribute("currency-alignment") || "after";
123
- o === "list" ? E(r, n, i, e) : P(r, n, i, e);
122
+ o === "list" ? w(r, n, i, e) : R(r, n, i, e);
124
123
  }
125
- function f(r, n, e) {
124
+ function b(r, n, e) {
126
125
  const o = new RegExp(`${n}\\s*:\\s*(\\d+)\\s*px`, "i"), i = r.match(o);
127
126
  return i ? parseInt(i[1]) : e;
128
127
  }
129
- function v(r, n) {
128
+ function T(r, n) {
130
129
  let e = r.parentElement;
131
130
  for (; e && e !== n; ) {
132
131
  if (e.tagName === "TD") {
@@ -138,29 +137,29 @@ function v(r, n) {
138
137
  }
139
138
  return null;
140
139
  }
141
- function O(r) {
142
- const n = r.getAttribute("style") || "", e = f(n, "width", 600), o = f(n, "padding", 0) * 2, i = Math.max(0, e - o);
140
+ function v(r) {
141
+ const n = r.getAttribute("style") || "", e = b(n, "width", 600), o = b(n, "padding", 0) * 2, i = Math.max(0, e - o);
143
142
  i !== 0 && r.querySelectorAll("img.adapt-img").forEach((c) => {
144
143
  if (c.hasAttribute("width"))
145
144
  return;
146
- const t = v(c, r);
145
+ const t = T(c, r);
147
146
  if (!t)
148
147
  return;
149
- const s = t.getAttribute("width"), a = parseFloat(s), u = f(t.getAttribute("style") || "", "padding", 0) * 2, p = Math.floor(i * a / 100), l = Math.max(1, p - u);
148
+ const s = t.getAttribute("width"), a = parseFloat(s), u = b(t.getAttribute("style") || "", "padding", 0) * 2, p = Math.floor(i * a / 100), l = Math.max(1, p - u);
150
149
  c.setAttribute("width", String(l));
151
- const m = c.getAttribute("style") || "";
152
- if (!/\bwidth\s*:\s*\d/i.test(m)) {
153
- const d = m && !m.trim().endsWith(";") ? "; " : "";
154
- c.setAttribute("style", `${m}${d}width: ${l}px`);
150
+ const d = c.getAttribute("style") || "";
151
+ if (!/\bwidth\s*:\s*\d/i.test(d)) {
152
+ const m = d && !d.trim().endsWith(";") ? "; " : "";
153
+ c.setAttribute("style", `${d}${m}width: ${l}px`);
155
154
  }
156
155
  });
157
156
  }
158
- function W(r, n) {
157
+ function O(r, n) {
159
158
  const e = r.match(/<!DOCTYPE[^>]*>/i);
160
159
  return (e ? `${e[0]}
161
160
  ` : "") + n.documentElement.outerHTML;
162
161
  }
163
- function F(r) {
162
+ function N(r) {
164
163
  const n = r.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), e = new DOMParser().parseFromString(n, "text/html"), o = e.querySelectorAll(".recommendation-block-v2");
165
164
  if (!o.length)
166
165
  return r;
@@ -168,12 +167,12 @@ function F(r) {
168
167
  c.recommendationCampaignUrls = {};
169
168
  const { isFeatureEnabled: t } = g(), s = t("liquidSyntax") ? "reco_" : "";
170
169
  return o.forEach((u) => {
171
- var l, m;
170
+ var l, d;
172
171
  const p = u.getAttribute("recommendation-id");
173
- p && ((l = u.parentNode) == null || l.insertBefore(e.createComment("REC_START"), u), (m = u.parentNode) == null || m.insertBefore(e.createComment("REC_END"), u.nextSibling), u.querySelectorAll('[data-visibility="0"]').forEach((d) => d.remove()), i(p), w(u) || T(u, p, s), O(u));
174
- }), W(n, e).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
172
+ p && ((l = u.parentNode) == null || l.insertBefore(e.createComment("REC_START"), u), (d = u.parentNode) == null || d.insertBefore(e.createComment("REC_END"), u.nextSibling), u.querySelectorAll('[data-visibility="0"]').forEach((m) => m.remove()), i(p), P(u, p, s), v(u));
173
+ }), O(n, e).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
175
174
  }
176
175
  export {
177
176
  y as formatPriceVariable,
178
- F as prepareRecommendationBlocks
177
+ N as prepareRecommendationBlocks
179
178
  };