@useinsider/guido 3.14.0-beta.faf349e → 3.14.1-beta.9ad6513

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.
@@ -1,69 +1,64 @@
1
- import { useConfig as V } from "./useConfig.js";
2
- import { getIgnoredRecommendationBlockIds as M } from "../config/compiler/utils/recommendationIgnoreUtils.js";
3
- import { TemplateTypes as W } from "../enums/defaults.js";
4
- import { DISPLAY_CONDITIONS_REGEX as G, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as H, CampaignCouldNotBeSavedKey as P, CanNotMakeAnyChangesForRunningKey as X, DATA_ATTRIBUTE_REGEX as $, DYNAMIC_CONTENT_TAG_REGEX as Y, ALLOWED_DYNAMIC_SYSTEM_TOKENS as U, VALID_DYNAMIC_VARIABLE_REGEX as j } from "../enums/html-validator.js";
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";
5
5
  import { ToasterTypeOptions as c } from "../enums/toaster.js";
6
- import { itemsBlockDynamicVariables as q } from "../extensions/Blocks/Items/enums/productEnums.js";
7
- import { RECOMMENDATION_VARIABLE_BUILTIN_ATTRIBUTES as K } from "../extensions/Blocks/Recommendation/constants/selectors.js";
8
- import { useRecommendationExtensionStore as z } from "../extensions/Blocks/Recommendation/store/recommendation.js";
9
- import { resolveProductAttrValue as Z } from "../extensions/Blocks/Recommendation/templates/utils.js";
10
- import { RecommendationRequiredFieldsKey as J } from "../extensions/Blocks/Recommendation/validation/requiredFields.js";
11
- import { useRecommendationStore as Q } from "../stores/recommendation.js";
12
- import { base64EncodeWithSpecialChars as ee } from "../utils/base64.js";
13
- import { computed as te } from "vue";
14
- import { useHttp as ne } from "./useHttp.js";
15
- import { useToaster as se } from "./useToaster.js";
16
- import { useTranslations as re } from "./useTranslations.js";
17
- const oe = /recommendation-id="(\d+)"/g;
18
- function ie(n) {
19
- return [...n.matchAll(oe)].map((m) => m[1]);
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 re } from "./useToaster.js";
15
+ import { useTranslations as oe } from "./useTranslations.js";
16
+ const ie = /recommendation-id="(\d+)"/g;
17
+ function ae(t) {
18
+ return [...t.matchAll(ie)].map((m) => m[1]);
20
19
  }
21
- function ae(n, m) {
22
- return m.some((f) => n.startsWith(`${f}_`));
20
+ function ce(t, m) {
21
+ return m.some((f) => t.startsWith(`${f}_`));
23
22
  }
24
- const ce = /^(\d+)_\d+_(.+)$/;
25
- function le(n) {
26
- const m = n.match(ce);
23
+ const le = /^(\d+)_\d+_(.+)$/;
24
+ function me(t) {
25
+ const m = t.match(le);
27
26
  return m ? { recoId: m[1], attribute: m[2] } : null;
28
27
  }
29
- function me(n) {
30
- const m = new Set(K);
31
- return Object.values(n).forEach((f) => {
32
- m.add(Z(f.attributeName, n).toLowerCase());
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());
33
32
  }), m;
34
33
  }
35
- function ue(n, m, f, o, d) {
36
- const u = n.match(/{{([a-zA-Z0-9_.\s]*)}}/gm);
34
+ function de(t, m, f, o, d) {
35
+ const u = t.match(/{{([a-zA-Z0-9_.\s]*)}}/gm);
37
36
  if (!u)
38
37
  return [];
39
- const g = new Set(m.map((h) => h.toLowerCase())), E = [];
38
+ const p = new Set(m.map((h) => h.toLowerCase())), E = [];
40
39
  return u.forEach((h) => {
41
- const p = h.slice(2, -2).trim().toLowerCase();
42
- if (p !== "" && g.has(p))
40
+ const g = h.slice(2, -2).trim().toLowerCase();
41
+ if (g !== "" && p.has(g))
43
42
  return;
44
- const y = le(p);
43
+ const y = me(g);
45
44
  if (y && o.has(y.recoId)) {
46
45
  if (!d || d.has(y.attribute))
47
46
  return;
48
- E.push(p);
47
+ E.push(g);
49
48
  return;
50
49
  }
51
- ae(p, f) || p.includes(".") || E.push(p);
50
+ ce(g, f) || g.includes(".") || E.push(g);
52
51
  }), E;
53
52
  }
54
- function de(n) {
55
- return (n.replace($, "$1").match(Y) ?? []).filter((o) => {
56
- const d = o.slice(2, -2), u = d.indexOf("|"), g = (u === -1 ? d : d.slice(0, u)).trim();
57
- return U.includes(g) ? !1 : j.test(g) ? u !== -1 && d.slice(u + 1).trim() === "" : !0;
53
+ function fe(t) {
54
+ return (t.replace(U, "$1").match(j) ?? []).filter((o) => {
55
+ const d = o.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;
58
57
  });
59
58
  }
60
59
  const xe = () => {
61
- const { showToaster: n } = se(), { post: m } = ne(), { config: f } = V(), o = re(), d = Q(), u = z(), g = te(
62
- () => {
63
- var e, t;
64
- return ((t = (e = f.value) == null ? void 0 : e.partner) == null ? void 0 : t.messageType) === W.transactional;
65
- }
66
- ), E = async (e) => {
60
+ var b, S;
61
+ const { showToaster: t } = re(), { post: m } = se(), { config: f } = W(), o = oe(), d = te(), u = J(), p = ((S = (b = f.value) == null ? void 0 : b.partner) == null ? void 0 : S.messageType) === H.transactional, E = async (e) => {
67
62
  if (e.size === 0)
68
63
  return /* @__PURE__ */ new Set();
69
64
  try {
@@ -71,61 +66,61 @@ const xe = () => {
71
66
  } catch {
72
67
  return null;
73
68
  }
74
- return me(u.filterList);
69
+ return ue(u.filterList);
75
70
  }, h = async (e) => {
76
- const s = await m(
71
+ const n = await m(
77
72
  "/newsletter/template-library/check-template-html-body",
78
- { html: ee(e) }
79
- ), { status: r, message: a } = s.data;
80
- return r || n({
73
+ { html: ne(e) }
74
+ ), { status: r, message: a } = n.data;
75
+ return r || t({
81
76
  type: c.Error,
82
77
  message: r === void 0 ? a : o("newsletter.invalid-url-link-for-toaster")
83
- }), o(P), a === o(X) && n({
78
+ }), o($), a === o(Y) && t({
84
79
  type: c.Error,
85
80
  message: o("newsletter.already-in-progress")
86
81
  }), r;
87
- }, p = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), y = (e) => ["if", "endif"].includes(e.toLowerCase()), S = (e, t) => {
88
- const s = e.match(/({%(.*?)%})/g);
82
+ }, g = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), y = (e) => ["if", "endif"].includes(e.toLowerCase()), T = (e, s) => {
83
+ const n = e.match(/({%(.*?)%})/g);
89
84
  let r = !0;
90
- return s !== null && !g.value && s.forEach((a) => {
85
+ return n !== null && !p && n.forEach((a) => {
91
86
  const i = a.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
92
87
  if (i && i.length > 0) {
93
88
  const [l] = i;
94
- p(l) && !t.includes(l) && (n({
89
+ g(l) && !s.includes(l) && (t({
95
90
  type: c.Warning,
96
91
  message: o("custom-fields.invalid-custom-fields")
97
92
  }), r = !1);
98
93
  }
99
94
  }), r;
100
- }, A = async (e, t, s) => {
101
- const r = s ? await h(e) : !0;
102
- return S(e, t) && r;
103
- }, T = (e) => e.length > 0 ? !0 : (n({
95
+ }, w = async (e, s, n) => {
96
+ const r = n ? await h(e) : !0;
97
+ return T(e, s) && r;
98
+ }, R = (e) => e.length > 0 ? !0 : (t({
104
99
  type: c.Warning,
105
100
  message: o("newsletter.html-content-is-empty")
106
- }), !1), w = (e) => {
107
- const t = (e.match(/{/gm) || []).length, s = (e.match(/}/gm) || []).length;
108
- return t > s && n({
101
+ }), !1), _ = (e) => {
102
+ const s = (e.match(/{/gm) || []).length, n = (e.match(/}/gm) || []).length;
103
+ return s > n && t({
109
104
  type: c.Warning,
110
105
  message: o("custom-fields.missing-closing-braces")
111
- }), t < s && n({
106
+ }), s < n && t({
112
107
  type: c.Warning,
113
108
  message: o("custom-fields.missing-opening-braces")
114
- }), t === s;
115
- }, R = (e) => {
116
- const t = de(e).length === 0;
117
- return t || n({
109
+ }), s === n;
110
+ }, N = (e) => {
111
+ const s = fe(e).length === 0;
112
+ return s || t({
118
113
  type: c.Warning,
119
114
  message: o("custom-fields.invalid-custom-fields")
120
- }), t;
121
- }, _ = (e, t, s, r) => {
122
- if (g.value)
115
+ }), s;
116
+ }, x = (e, s, n, r) => {
117
+ if (p)
123
118
  return !0;
124
- const a = ue(
119
+ const a = de(
125
120
  e,
126
- t,
127
- ie(e),
128
121
  s,
122
+ ae(e),
123
+ n,
129
124
  r
130
125
  );
131
126
  if (a.length > 0) {
@@ -134,91 +129,91 @@ const xe = () => {
134
129
  ${a.map((l) => `<li>${l}</li>`).join("")}
135
130
  </ul>
136
131
  `;
137
- return n({
132
+ return t({
138
133
  type: c.Error,
139
134
  message: o("custom-fields.invalid-custom-fields") + i
140
135
  }), !1;
141
136
  }
142
137
  return !0;
143
- }, N = (e) => {
144
- const t = e.match(/{%(.*?)%}/g), s = [];
138
+ }, O = (e) => {
139
+ const s = e.match(/{%(.*?)%}/g), n = [];
145
140
  let r = !0;
146
- if (t && t.forEach((a) => {
147
- const i = a.match(G), l = a.match(H), C = (i == null ? void 0 : i.join("")) || "";
148
- (!i || a !== C) && !l && (n({
141
+ if (s && s.forEach((a) => {
142
+ const i = a.match(P), l = a.match(X), v = (i == null ? void 0 : i.join("")) || "";
143
+ (!i || a !== v) && !l && (t({
149
144
  type: c.Error,
150
145
  message: o("newsletter.display-conditions-invalid-syntax")
151
- }), r = !1), i && i.forEach((v) => {
152
- v.trim() === "=" && (n({
146
+ }), r = !1), i && i.forEach((C) => {
147
+ C.trim() === "=" && (t({
153
148
  type: c.Error,
154
149
  message: o("custom-conditions.wrong-equality-operators")
155
150
  }), r = !1);
156
- const I = v.match(/^[a-zA-Z]*$/g);
157
- I && I.forEach((b) => {
158
- y(b) && s.push(b);
151
+ const I = C.match(/^[a-zA-Z]*$/g);
152
+ I && I.forEach((A) => {
153
+ y(A) && n.push(A);
159
154
  });
160
155
  });
161
- }), s.length) {
162
- const a = s.filter((l) => l === "if"), i = s.filter((l) => l === "endif");
163
- a.length !== i.length && (n({
156
+ }), n.length) {
157
+ const a = n.filter((l) => l === "if"), i = n.filter((l) => l === "endif");
158
+ a.length !== i.length && (t({
164
159
  type: c.Error,
165
160
  message: o("custom-conditions.missing-if-endif-tag")
166
161
  }), r = !1);
167
162
  }
168
163
  return r;
169
- }, x = (e) => {
170
- const t = (e.match(/{% /gm) || []).length, s = (e.match(/ %}/gm) || []).length, r = t === s;
171
- return r || n({
164
+ }, k = (e) => {
165
+ const s = (e.match(/{% /gm) || []).length, n = (e.match(/ %}/gm) || []).length, r = s === n;
166
+ return r || t({
172
167
  type: c.Warning,
173
168
  message: o("custom-conditions.no-space-after-braces")
174
169
  }), r;
175
- }, O = (e) => (e.match(/({%(.*?)%})/g) || []).filter((s) => s.includes("if")).map((s) => (s.match(/{{.*}}/gm) || []).length).reduce((s, r) => s + r, 0) > 0 ? (n({
170
+ }, B = (e) => (e.match(/({%(.*?)%})/g) || []).filter((n) => n.includes("if")).map((n) => (n.match(/{{.*}}/gm) || []).length).reduce((n, r) => n + r, 0) > 0 ? (t({
176
171
  type: c.Warning,
177
172
  message: o("custom-conditions.no-braces-inside-if-tag")
178
- }), !1) : !0, k = () => u.hasInvalidBlock() ? (n({
173
+ }), !1) : !0, D = () => u.hasInvalidBlock() ? (t({
179
174
  type: c.Error,
180
- message: o(J)
181
- }), !1) : !0, B = () => d.recommendationConfigs && Object.values(d.recommendationConfigs).find((t) => t.filters.find((s) => s.value === "")) !== void 0 ? (n({
175
+ message: o(ee)
176
+ }), !1) : !0, F = () => d.recommendationConfigs && Object.values(d.recommendationConfigs).find((s) => s.filters.find((n) => n.value === "")) !== void 0 ? (t({
182
177
  type: c.Error,
183
178
  message: o("newsletter.fill-all-necessary-fields")
184
- }), !1) : !0, D = (e) => {
185
- const t = /src="[^"]*\.(svg|pst)"/gm;
186
- return e.match(t) === null ? !0 : (n({
179
+ }), !1) : !0, L = (e) => {
180
+ const s = /src="[^"]*\.(svg|pst)"/gm;
181
+ return e.match(s) === null ? !0 : (t({
187
182
  type: c.Error,
188
183
  message: o("newsletter.invalid-image-type")
189
184
  }), !1);
190
- }, F = (e) => {
185
+ }, V = (e) => {
191
186
  const r = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
192
187
  return Array.from(r).find((i) => {
193
188
  var l;
194
189
  return !((l = i.id) != null && l.trim());
195
- }) ? (n({
190
+ }) ? (t({
196
191
  type: c.Error,
197
192
  message: o("unsubscribe-templates.select-checkbox-groups")
198
193
  }), !1) : !0;
199
- }, L = (e) => {
194
+ }, M = (e) => {
200
195
  const r = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
201
196
  return Array.from(r).find((i) => {
202
197
  var l;
203
198
  return !((l = i.id) != null && l.trim());
204
- }) ? (n({
199
+ }) ? (t({
205
200
  type: c.Error,
206
201
  message: o("unsubscribe-templates.select-radio-button-groups")
207
202
  }), !1) : !0;
208
203
  };
209
- return { validateHtml: async (e, t, s = !1) => {
210
- var C, v;
204
+ return { validateHtml: async (e, s, n = !1) => {
205
+ var v, C;
211
206
  const r = [
212
- ...t.map((I) => I.value),
213
- ...q,
214
- ...((v = (C = f.value) == null ? void 0 : C.template) == null ? void 0 : v.customFieldAttributes) ?? []
215
- ], a = M(e), i = await E(a);
216
- return await A(e, r, s) && T(e) && w(e) && R(e) && _(e, r, a, i) && N(e) && x(e) && O(e) && k() && B() && D(e) && F(e) && L(e);
207
+ ...s.map((I) => I.value),
208
+ ...z,
209
+ ...((C = (v = f.value) == null ? void 0 : v.template) == null ? void 0 : C.customFieldAttributes) ?? []
210
+ ], a = G(e), i = await E(a);
211
+ return await w(e, r, n) && R(e) && _(e) && N(e) && x(e, r, a, i) && O(e) && k(e) && B(e) && D() && F() && L(e) && V(e) && M(e);
217
212
  } };
218
213
  };
219
214
  export {
220
- me as buildPartnerAttributeNameSet,
221
- ue as findInvalidCustomFields,
222
- le as parseRecommendationVariable,
215
+ ue as buildPartnerAttributeNameSet,
216
+ de as findInvalidCustomFields,
217
+ me as parseRecommendationVariable,
223
218
  xe as useHtmlValidator
224
219
  };
@@ -1,14 +1,35 @@
1
- import { pairProductVariables as r } from "../../utils/pairProductVariables.js";
2
- const t = [
1
+ import { pairProductVariables as o } from "../../utils/pairProductVariables.js";
2
+ import { wrapHiddenPriceTdsForOutlook as r, MSO_ITEMS_HIDE_START as e, MSO_ITEMS_HIDE_END as t } from "./utils/itemsCompilerUtils.js";
3
+ const a = [
3
4
  {
4
5
  id: "pair-product-variables",
5
6
  description: "Replace product default values with template variables",
6
7
  type: "custom",
7
- processor: r,
8
+ processor: o,
8
9
  priority: 60
9
10
  // After recommendation rules (priority 50-53)
11
+ },
12
+ {
13
+ id: "wrap-hidden-price-mso-conditional",
14
+ // SD-147597: Outlook ignores display:none on <td>, so the horizontal layout's
15
+ // hidden price fallback renders too — duplicate price. Mark the hidden td(s)
16
+ // with safe placeholder comments and collapse them inline for web-engine Outlook.
17
+ description: "Mark hidden Items price tds for Outlook conditional hiding",
18
+ type: "custom",
19
+ processor: r,
20
+ priority: 65
21
+ // After pair-product-variables (60), before outlook rules (70+)
22
+ },
23
+ {
24
+ id: "swap-items-mso-markers",
25
+ // Injecting the delicate `<!-- -->` ghost token LAST (after reco minify P99
26
+ // and reco swap P100) keeps it out of every whitespace/comment-mangling pass.
27
+ description: "Swap Items MSO markers into [if !mso] conditional comments",
28
+ type: "custom",
29
+ processor: (i) => i.replaceAll(`<!--${e}-->`, "<!--[if !mso]><!-- -->").replaceAll(`<!--${t}-->`, "<!--<![endif]-->"),
30
+ priority: 101
10
31
  }
11
32
  ];
12
33
  export {
13
- t as itemsCompilerRules
34
+ a as itemsCompilerRules
14
35
  };
@@ -0,0 +1,28 @@
1
+ const p = "MSO_ITEMS_HIDE_START", E = "MSO_ITEMS_HIDE_END", u = "mso-hide:all; max-height:0; overflow:hidden; font-size:0; line-height:0;", _ = ".ins-product-cart td.horizontal-price, .ins-product-cart td.vertical-price";
2
+ function T(t) {
3
+ if (!t.includes("vertical-price") || !t.includes("ins-product-cart"))
4
+ return t;
5
+ const i = t.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), r = new DOMParser().parseFromString(i, "text/html");
6
+ let n = !1;
7
+ if (r.querySelectorAll(_).forEach((e) => {
8
+ var s, a;
9
+ const o = e.getAttribute("style") || "";
10
+ if (!/display\s*:\s*none/i.test(o))
11
+ return;
12
+ const c = e.previousSibling;
13
+ if (((c == null ? void 0 : c.nodeType) !== Node.COMMENT_NODE || c.data !== p) && ((s = e.parentNode) == null || s.insertBefore(r.createComment(p), e), (a = e.parentNode) == null || a.insertBefore(r.createComment(E), e.nextSibling)), !/mso-hide/i.test(o)) {
14
+ const d = o.trim().endsWith(";") ? " " : "; ";
15
+ e.setAttribute("style", `${o}${d}${u}`);
16
+ }
17
+ n = !0;
18
+ }), !n)
19
+ return t;
20
+ const l = i.match(/<!DOCTYPE[^>]*>/i);
21
+ return ((l ? `${l[0]}
22
+ ` : "") + r.documentElement.outerHTML).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
23
+ }
24
+ export {
25
+ E as MSO_ITEMS_HIDE_END,
26
+ p as MSO_ITEMS_HIDE_START,
27
+ T as wrapHiddenPriceTdsForOutlook
28
+ };
@@ -1,14 +1,15 @@
1
1
  import { migrateCheckbox as t } from "./checkboxMigrator.js";
2
2
  import { migrateCouponBlock as i } from "./couponBlockMigrator.js";
3
3
  import { migrateItemsBlock as e } from "./itemsBlockMigrator.js";
4
- import { migrateRadioButton as a } from "./radioButtonMigrator.js";
5
- import { migrateRecommendation as c } from "./recommendationMigrator.js";
6
- import { migrateSocialIcons as g } from "./socialIconMigrator.js";
7
- import { migrateUnsubscribe as n } from "./unsubscribeMigrator.js";
8
- const k = async (o, r = {}) => {
9
- let m = o;
10
- return m = t(m), m = a(m), m = await n(m), m = i(m), m = c(m, r), m = e(m), m = g(m), m;
4
+ import { migrateProductNameLink as a } from "./productNameLinkMigrator.js";
5
+ import { migrateRadioButton as c } from "./radioButtonMigrator.js";
6
+ import { migrateRecommendation as g } from "./recommendationMigrator.js";
7
+ import { migrateSocialIcons as n } from "./socialIconMigrator.js";
8
+ import { migrateUnsubscribe as p } from "./unsubscribeMigrator.js";
9
+ const x = async (r, o = {}) => {
10
+ let m = r;
11
+ return m = t(m), m = c(m), m = await p(m), m = i(m), m = g(m, o), m = e(m), m = a(m), m = n(m), m;
11
12
  };
12
13
  export {
13
- k as migrate
14
+ x as migrate
14
15
  };