@useinsider/guido 3.22.0 → 3.23.0-beta.1a04a96

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 (71) hide show
  1. package/README.md +35 -4
  2. package/dist/components/Guido.vue.js +1 -1
  3. package/dist/components/Guido.vue2.js +118 -108
  4. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +11 -11
  5. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +9 -9
  6. package/dist/composables/useEditorOpenMetrics.js +167 -0
  7. package/dist/composables/useStripo.js +93 -82
  8. package/dist/config/compiler/utils/recommendationCompilerUtils.js +22 -22
  9. package/dist/config/migrator/recommendation/compositionMapper.js +56 -49
  10. package/dist/config/migrator/recommendation/extractors.js +100 -40
  11. package/dist/config/migrator/recommendation/htmlBuilder.js +285 -207
  12. package/dist/config/migrator/recommendation/settingsMapper.js +37 -36
  13. package/dist/config/migrator/recommendation/themeMapper.js +53 -41
  14. package/dist/config/migrator/recommendationMigrator.js +68 -61
  15. package/dist/config/migrator/unsubscribeMigrator.js +60 -87
  16. package/dist/extensions/Blocks/Items/controls/button/link.js +14 -17
  17. package/dist/extensions/Blocks/Items/controls/cardComposition.js +14 -17
  18. package/dist/extensions/Blocks/Items/controls/image/link.js +14 -17
  19. package/dist/extensions/Blocks/Items/controls/name/trimming.js +9 -10
  20. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +24 -25
  21. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +12 -13
  22. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +29 -30
  23. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +15 -16
  24. package/dist/extensions/Blocks/Items/controls/price/priceOrientation.js +25 -26
  25. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +27 -28
  26. package/dist/extensions/Blocks/Items/controls/settingsControl.js +75 -80
  27. package/dist/extensions/Blocks/Recommendation/block.js +33 -24
  28. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +3 -3
  29. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +27 -26
  30. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.js +13 -13
  31. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +165 -175
  32. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +5 -5
  33. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.js +8 -8
  34. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.js +15 -15
  35. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.js +12 -12
  36. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.js +10 -10
  37. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +1 -1
  38. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +23 -22
  39. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +19 -18
  40. package/dist/extensions/Blocks/Recommendation/templates/utils.js +82 -91
  41. package/dist/extensions/Blocks/Recommendation/utils/inlinePriceOrder.js +12 -0
  42. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMap.js +3 -2
  43. package/dist/extensions/Blocks/common-control.js +62 -55
  44. package/dist/guido.css +1 -1
  45. package/dist/library.js +12 -10
  46. package/dist/package.json.js +6 -4
  47. package/dist/public/prefetchRuntime.js +4 -0
  48. package/dist/src/composables/useEditorOpenMetrics.d.ts +27 -0
  49. package/dist/src/composables/useStripo.d.ts +2 -1
  50. package/dist/src/config/migrator/recommendation/compositionMapper.d.ts +3 -1
  51. package/dist/src/config/migrator/recommendation/extractors.d.ts +35 -6
  52. package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +3 -1
  53. package/dist/src/config/migrator/recommendation/themeMapper.d.ts +3 -1
  54. package/dist/src/config/migrator/recommendation/types.d.ts +11 -1
  55. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +0 -1
  56. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +1 -0
  57. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +5 -10
  58. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +1 -13
  59. package/dist/src/extensions/Blocks/Recommendation/utils/inlinePriceOrder.d.ts +9 -0
  60. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.d.ts +2 -19
  61. package/dist/src/extensions/Blocks/common-control.d.ts +2 -0
  62. package/dist/src/library.d.ts +1 -0
  63. package/dist/src/public/prefetchRuntime.d.ts +1 -0
  64. package/dist/src/stores/unsubscribe.d.ts +10 -0
  65. package/dist/src/utils/runtimePrefetch.d.ts +4 -0
  66. package/dist/src/utils/stripoRuntime.d.ts +3 -0
  67. package/dist/static/stripo-runtime-manifest.json.js +9 -0
  68. package/dist/stores/unsubscribe.js +33 -29
  69. package/dist/utils/runtimePrefetch.js +26 -0
  70. package/dist/utils/stripoRuntime.js +13 -0
  71. package/package.json +7 -2
@@ -1,10 +1,10 @@
1
- import { PRE_RRS_CONFIG_VERSION as s, DEFAULT_CURRENCY as i } from "../../../extensions/Blocks/Recommendation/constants/defaultConfig.js";
2
- import { DEFAULT_CARDS_IN_ROW as m, DEFAULT_MOBILE_ROW_SPACING as p, DEFAULT_MOBILE_COLUMN_SPACING as d, DEFAULT_ROW_SPACING as S, DEFAULT_COLUMN_SPACING as f, DEFAULT_MOBILE_CARDS_IN_ROW as a } from "../../../extensions/Blocks/Recommendation/constants/layout.js";
3
- import { mapLegacyStrategy as l } from "../../../extensions/Blocks/Recommendation/utils/legacyStrategyMap.js";
4
- function c(t) {
1
+ import { PRE_RRS_CONFIG_VERSION as p, DEFAULT_CURRENCY as i } from "../../../extensions/Blocks/Recommendation/constants/defaultConfig.js";
2
+ import { DEFAULT_CARDS_IN_ROW as d, DEFAULT_MOBILE_ROW_SPACING as S, DEFAULT_MOBILE_COLUMN_SPACING as c, DEFAULT_ROW_SPACING as f, DEFAULT_COLUMN_SPACING as l, DEFAULT_MOBILE_CARDS_IN_ROW as s } from "../../../extensions/Blocks/Recommendation/constants/layout.js";
3
+ import { mapLegacyStrategy as _ } from "../../../extensions/Blocks/Recommendation/utils/legacyStrategyMap.js";
4
+ function I(t) {
5
5
  return t === "0" || t === 0 ? "before" : "after";
6
6
  }
7
- function _(t) {
7
+ function A(t) {
8
8
  if (typeof t == "number" && Number.isFinite(t))
9
9
  return t;
10
10
  if (typeof t == "string") {
@@ -14,51 +14,52 @@ function _(t) {
14
14
  }
15
15
  return i.decimalCount;
16
16
  }
17
- function I(t) {
17
+ function L(t) {
18
18
  return t === "." || t === "," || t === " " || t === "" ? t : ",";
19
19
  }
20
- function A(t) {
20
+ function N(t) {
21
21
  return t === "." || t === "," || t === " " ? t : ".";
22
22
  }
23
- function L(t) {
23
+ function R(t) {
24
24
  if (!t || typeof t != "object")
25
25
  return { ...i };
26
- const o = t, n = o.value ?? o.name ?? i.code, r = o.symbol ?? n;
26
+ const o = t, n = o.value ?? o.name ?? i.code, e = o.symbol ?? n;
27
27
  return {
28
28
  code: n,
29
- symbol: r,
30
- alignment: c(o.alignment),
31
- decimalCount: _(o.decimalCount),
32
- decimalSeparator: A(o.decimalSeparator),
33
- thousandSeparator: I(o.thousandSeparator)
29
+ symbol: e,
30
+ alignment: I(o.alignment),
31
+ decimalCount: A(o.decimalCount),
32
+ decimalSeparator: N(o.decimalSeparator),
33
+ thousandSeparator: L(o.thousandSeparator)
34
34
  };
35
35
  }
36
- function N(t) {
36
+ function b(t) {
37
37
  return t === "horizontal" || t === "list" ? "list" : "grid";
38
38
  }
39
- function R(t) {
40
- return l(t) || "mostPopular";
39
+ function D(t) {
40
+ return _(t) || "mostPopular";
41
41
  }
42
- function O(t, o, n) {
43
- const r = o.rowCount ?? t.cardsInRow ?? m, u = o.totalCount ?? (typeof t.size == "string" ? parseInt(t.size) : t.size) ?? 6;
42
+ function U(t, o, n) {
43
+ var a, u;
44
+ const e = o.rowCount ?? t.cardsInRow ?? d, m = o.totalCount ?? (typeof t.size == "string" ? parseInt(t.size) : t.size) ?? 6;
44
45
  return {
45
46
  recommendationId: n,
46
- strategy: R(t.strategy),
47
- productIds: (t.productIds ?? []).map((e) => String(e)),
48
- size: String(u),
47
+ strategy: D(t.strategy),
48
+ productIds: (t.productIds ?? []).map((r) => String(r)),
49
+ size: String(m),
49
50
  shuffleProducts: !!t.shuffleProducts,
50
51
  language: t.language ?? "en_US",
51
- currency: L(t.currencySettings),
52
- filters: (t.filters ?? []).map((e) => ({ ...e })),
53
- layout: N(t.orientation ?? o.orientation),
54
- cardsInRow: r,
55
- mobileCardsInRow: a,
56
- mobileLayoutEnabled: !1,
57
- previousMobileCardsInRow: a,
58
- columnSpacing: f,
59
- rowSpacing: S,
60
- mobileColumnSpacing: d,
61
- mobileRowSpacing: p,
52
+ currency: R(t.currencySettings),
53
+ filters: (t.filters ?? []).map((r) => ({ ...r })),
54
+ layout: b(t.orientation ?? o.orientation),
55
+ cardsInRow: e,
56
+ mobileCardsInRow: s,
57
+ mobileLayoutEnabled: ((u = (a = o.theme) == null ? void 0 : a.blockAdapt) == null ? void 0 : u.adapt) === !0,
58
+ previousMobileCardsInRow: s,
59
+ columnSpacing: l,
60
+ rowSpacing: f,
61
+ mobileColumnSpacing: c,
62
+ mobileRowSpacing: S,
62
63
  omnibusPrice: { textBefore: "", textAfter: "" },
63
64
  omnibusDiscount: { textBefore: "", textAfter: "" },
64
65
  // Preserve the legacy price-placement toggles. Absent legacy keys map to
@@ -66,10 +67,10 @@ function O(t, o, n) {
66
67
  // gated). New Guido blocks default differently (see DEFAULT_NODE_CONFIG).
67
68
  priceMovedToNextLine: !!t.isPriceMovedToNextLine,
68
69
  priceHideIfSameAsDiscounted: !!t.isPriceDeletedForZeroSale,
69
- configVersion: s
70
+ configVersion: p
70
71
  };
71
72
  }
72
73
  export {
73
- L as mapCurrency,
74
- O as mapSettings
74
+ R as mapCurrency,
75
+ U as mapSettings
75
76
  };
@@ -1,34 +1,44 @@
1
1
  function r(n, t, o) {
2
2
  o != null && o !== "" && n.push(`${t}: ${o}`);
3
3
  }
4
- function $(n) {
4
+ function x(n) {
5
+ if (typeof n == "number" && Number.isFinite(n) && n >= 0)
6
+ return Math.trunc(n);
7
+ if (typeof n == "string" && /^\d+$/.test(n.trim())) {
8
+ const t = Number(n.trim());
9
+ if (Number.isFinite(t) && t >= 0)
10
+ return t;
11
+ }
12
+ }
13
+ function P(n) {
5
14
  if (!n)
6
15
  return null;
7
16
  const t = n.top ?? n.all ?? 0, o = n.right ?? n.all ?? 0, i = n.bottom ?? n.all ?? 0, l = n.left ?? n.all ?? 0;
8
17
  return t === 0 && o === 0 && i === 0 && l === 0 ? null : `${t}px ${o}px ${i}px ${l}px`;
9
18
  }
10
- function j(n) {
19
+ function z(n) {
11
20
  if (!n)
12
21
  return null;
13
22
  const { top: t, right: o, bottom: i, left: l } = n;
14
23
  return t === void 0 ? null : t === o && t === i && t === l ? t : null;
15
24
  }
16
- function S(n, t, o, i) {
17
- const l = j(o);
25
+ function $(n, t, o, i) {
26
+ const l = z(o);
18
27
  if (l !== null) {
19
28
  r(n, `border-${t}`, i(l));
20
29
  return;
21
30
  }
22
31
  o && (r(n, `border-top-${t}`, o.top !== void 0 ? i(o.top) : null), r(n, `border-right-${t}`, o.right !== void 0 ? i(o.right) : null), r(n, `border-bottom-${t}`, o.bottom !== void 0 ? i(o.bottom) : null), r(n, `border-left-${t}`, o.left !== void 0 ? i(o.left) : null));
23
32
  }
24
- function C(n) {
33
+ function D(n) {
25
34
  if (!n)
26
35
  return null;
27
- if (typeof n.radius == "number")
28
- return `${n.radius}px`;
36
+ const t = x(n.radius ?? n.borderRadius);
37
+ if (t !== void 0)
38
+ return `${t}px`;
29
39
  if (typeof n.lt == "number" || typeof n.rt == "number" || typeof n.rb == "number" || typeof n.lb == "number") {
30
- const t = n.lt ?? 0, o = n.rt ?? 0, i = n.rb ?? 0, l = n.lb ?? 0;
31
- return `${t}px ${o}px ${i}px ${l}px`;
40
+ const o = n.lt ?? 0, i = n.rt ?? 0, l = n.rb ?? 0, f = n.lb ?? 0;
41
+ return `${o}px ${i}px ${l}px ${f}px`;
32
42
  }
33
43
  return null;
34
44
  }
@@ -36,58 +46,60 @@ function I(n) {
36
46
  var t, o;
37
47
  return ((t = n.textLineSpacing) == null ? void 0 : t.lineSpacing) ?? ((o = n.textLineSpacing) == null ? void 0 : o["font-lineSpacing"]);
38
48
  }
39
- function L(n) {
40
- var f, u, a, g, d, b, p, s;
41
- const t = [], o = [], i = (f = n == null ? void 0 : n.textAlign) == null ? void 0 : f.align, l = $((u = n == null ? void 0 : n.textPadding) == null ? void 0 : u.desktop), x = (a = n == null ? void 0 : n.textStyle) == null ? void 0 : a["font-weight"], c = (g = n == null ? void 0 : n.textStyle) == null ? void 0 : g["font-style"];
42
- return r(t, "background-color", (d = n == null ? void 0 : n.textBackgroundColor) == null ? void 0 : d.color), r(t, "padding", l), r(o, "font-family", (b = n == null ? void 0 : n.textStyle) == null ? void 0 : b["font-family"]), r(o, "font-size", (p = n == null ? void 0 : n.textStyle) == null ? void 0 : p["font-size"]), r(o, "font-weight", x), r(o, "font-style", c), r(o, "color", (s = n == null ? void 0 : n.textColor) == null ? void 0 : s.color), r(o, "line-height", I(n ?? {})), r(o, "text-align", i), {
49
+ function N(n) {
50
+ var u, s, a, d, g, b, p, y;
51
+ const t = [], o = [], i = (u = n == null ? void 0 : n.textAlign) == null ? void 0 : u.align, l = P((s = n == null ? void 0 : n.textPadding) == null ? void 0 : s.desktop), f = (a = n == null ? void 0 : n.textStyle) == null ? void 0 : a["font-weight"], c = (d = n == null ? void 0 : n.textStyle) == null ? void 0 : d["font-style"];
52
+ return r(t, "background-color", (g = n == null ? void 0 : n.textBackgroundColor) == null ? void 0 : g.color), r(t, "padding", l), r(o, "font-family", (b = n == null ? void 0 : n.textStyle) == null ? void 0 : b["font-family"]), r(o, "font-size", (p = n == null ? void 0 : n.textStyle) == null ? void 0 : p["font-size"]), r(o, "font-weight", f), r(o, "font-style", c), r(o, "color", (y = n == null ? void 0 : n.textColor) == null ? void 0 : y.color), r(o, "line-height", I(n ?? {})), r(o, "text-align", i), {
43
53
  tdStyle: t.join("; "),
44
54
  pStyle: o.join("; "),
45
55
  align: i || void 0,
46
- wrapBold: x === "bold",
56
+ wrapBold: f === "bold",
47
57
  wrapItalic: c === "italic",
48
58
  textTrimming: (n == null ? void 0 : n.textTrimming) === !0
49
59
  };
50
60
  }
51
- function N(n) {
52
- var u, a, g, d, b, p, s, k, w, P, B, z;
61
+ function E(n) {
62
+ var s, a, d, g, b, p, y, k, w, B, T, j;
53
63
  const t = [], o = [], i = [];
54
- r(t, "padding", $((u = n == null ? void 0 : n.buttonExternalPadding) == null ? void 0 : u.desktop)), r(i, "padding", $((a = n == null ? void 0 : n.buttonInternalPadding) == null ? void 0 : a.desktop)), r(i, "font-family", (g = n == null ? void 0 : n.buttonStyle) == null ? void 0 : g["font-family"]), r(i, "font-size", (d = n == null ? void 0 : n.buttonStyle) == null ? void 0 : d["font-size"]), r(i, "font-weight", (b = n == null ? void 0 : n.buttonStyle) == null ? void 0 : b["font-weight"]), r(i, "font-style", (p = n == null ? void 0 : n.buttonStyle) == null ? void 0 : p["font-style"]);
55
- const l = (s = n == null ? void 0 : n.buttonColor) == null ? void 0 : s.color, x = (k = n == null ? void 0 : n.textButtonColor) == null ? void 0 : k.color;
56
- r(o, "background", l), r(i, "background", l), r(i, "color", x);
64
+ r(t, "padding", P((s = n == null ? void 0 : n.buttonExternalPadding) == null ? void 0 : s.desktop)), r(i, "padding", P((a = n == null ? void 0 : n.buttonInternalPadding) == null ? void 0 : a.desktop)), r(i, "font-family", (d = n == null ? void 0 : n.buttonStyle) == null ? void 0 : d["font-family"]), r(i, "font-size", (g = n == null ? void 0 : n.buttonStyle) == null ? void 0 : g["font-size"]), r(i, "font-weight", (b = n == null ? void 0 : n.buttonStyle) == null ? void 0 : b["font-weight"]), r(i, "font-style", (p = n == null ? void 0 : n.buttonStyle) == null ? void 0 : p["font-style"]);
65
+ const l = (y = n == null ? void 0 : n.buttonColor) == null ? void 0 : y.color, f = (k = n == null ? void 0 : n.textButtonColor) == null ? void 0 : k.color;
66
+ r(o, "background", l), r(i, "background", l), r(i, "color", f);
57
67
  const c = n == null ? void 0 : n.buttonBorder;
58
- S(o, "width", c == null ? void 0 : c.width, (y) => `${y}px`), S(o, "style", c == null ? void 0 : c.style, (y) => y), S(o, "color", c == null ? void 0 : c.color, (y) => y);
59
- const f = C(n == null ? void 0 : n.buttonBorderRadius);
60
- return f && (r(o, "border-radius", f), r(i, "border-radius", f)), ((w = n == null ? void 0 : n.buttonStretch) == null ? void 0 : w.stretched) === !1 ? (r(o, "display", "inline-block"), r(i, "display", "inline-block")) : ((P = n == null ? void 0 : n.buttonStretch) == null ? void 0 : P.stretched) === !0 && (r(o, "display", "block"), r(i, "display", "block")), {
68
+ $(o, "width", c == null ? void 0 : c.width, (S) => `${S}px`), $(o, "style", c == null ? void 0 : c.style, (S) => S), $(o, "color", c == null ? void 0 : c.color, (S) => S);
69
+ const u = D((n == null ? void 0 : n.buttonBorderRadius) ?? (n == null ? void 0 : n.borderRadius));
70
+ return u && (r(o, "border-radius", u), r(i, "border-radius", u)), ((w = n == null ? void 0 : n.buttonStretch) == null ? void 0 : w.stretched) === !1 ? (r(o, "display", "inline-block"), r(i, "display", "inline-block")) : ((B = n == null ? void 0 : n.buttonStretch) == null ? void 0 : B.stretched) === !0 && (r(o, "display", "block"), r(i, "display", "block")), {
61
71
  tdStyle: t.join("; "),
62
- align: ((B = n == null ? void 0 : n.buttonAlign) == null ? void 0 : B.align) || void 0,
72
+ align: ((T = n == null ? void 0 : n.buttonAlign) == null ? void 0 : T.align) || void 0,
63
73
  spanStyle: o.join("; "),
64
74
  aStyle: i.join("; "),
65
- text: (z = n == null ? void 0 : n.buttonText) == null ? void 0 : z.text
75
+ text: (j = n == null ? void 0 : n.buttonText) == null ? void 0 : j.text
66
76
  };
67
77
  }
68
- function T(n) {
69
- if (typeof n == "number" && Number.isFinite(n) && n >= 0)
70
- return Math.trunc(n);
71
- if (typeof n == "string" && /^\d+$/.test(n.trim())) {
72
- const t = Number(n.trim());
73
- if (Number.isFinite(t) && t >= 0)
74
- return t;
75
- }
76
- }
77
- function A(n) {
78
+ function L(n) {
78
79
  var t, o;
79
80
  return {
80
- width: T((t = n == null ? void 0 : n.imageSize) == null ? void 0 : t.width),
81
- height: T((o = n == null ? void 0 : n.imageSize) == null ? void 0 : o.height)
81
+ width: x((t = n == null ? void 0 : n.imageSize) == null ? void 0 : t.width),
82
+ height: x((o = n == null ? void 0 : n.imageSize) == null ? void 0 : o.height)
82
83
  };
83
84
  }
84
- function F(n, t) {
85
+ const A = /* @__PURE__ */ new Set([5, 10, 15, 20, 25, 30, 35, 40]), C = [["t", "top"], ["r", "right"], ["b", "bottom"], ["l", "left"]];
86
+ function R(n) {
87
+ if (!n)
88
+ return;
89
+ const t = [], o = [];
90
+ return C.forEach(([i, l]) => {
91
+ const f = x(n[l] ?? n.all) ?? 0;
92
+ A.has(f) ? t.push(`es-p${f}${i}`) : f > 0 && o.push(`padding-${l}: ${f}px`);
93
+ }), { classes: t.join(" "), style: o.join("; ") };
94
+ }
95
+ function v(n, t) {
85
96
  const o = (n ?? "").trim().replace(/;$/, "").trim(), i = (t ?? "").trim().replace(/;$/, "").trim();
86
97
  return o ? i ? `${o}; ${i}` : o : i;
87
98
  }
88
99
  export {
89
- F as appendStyle,
90
- N as mapButtonTheme,
91
- A as mapImageTheme,
92
- L as mapTextTheme
100
+ v as appendStyle,
101
+ R as mapBlockPadding,
102
+ E as mapButtonTheme,
103
+ L as mapImageTheme,
104
+ N as mapTextTheme
93
105
  };
@@ -1,52 +1,59 @@
1
- import { BlockId as f } from "../../enums/block.js";
2
- import { DEFAULT_NODE_CONFIG as y } from "../../extensions/Blocks/Recommendation/constants/defaultConfig.js";
3
- import { ATTR_RECOMMENDATION_TITLE as b } from "../../extensions/Blocks/Recommendation/constants/selectors.js";
4
- import { useTemplateStore as T } from "../../stores/template.js";
5
- import { mapComposition as v } from "./recommendation/compositionMapper.js";
6
- import { extractCurrencyFromBlock as C, extractTitleText as M, hasVisibleTitle as R, extractCardBgColor as S, isPartnerManagedBlock as h } from "./recommendation/extractors.js";
7
- import { buildBlockHtml as w } from "./recommendation/htmlBuilder.js";
8
- import { parseRecommendationId as x, parseLegacyConfig as E } from "./recommendation/parseLegacyConfig.js";
9
- import { mapSettings as A } from "./recommendation/settingsMapper.js";
10
- const H = 'td[esd-dev-product-config][class*="ins-recommendation-v3-block-"]:not(.recommendation-block-v2), td.product-block[esd-handler-name*="EmailRecommendationV3"][esd-dev-product-config]:not(.recommendation-block-v2)';
11
- function B(n, t, c) {
12
- var l;
13
- const r = x(t);
14
- if (r === null)
1
+ import { BlockId as b } from "../../enums/block.js";
2
+ import { DEFAULT_NODE_CONFIG as C } from "../../extensions/Blocks/Recommendation/constants/defaultConfig.js";
3
+ import { ATTR_RECOMMENDATION_TITLE as f } from "../../extensions/Blocks/Recommendation/constants/selectors.js";
4
+ import { useTemplateStore as M } from "../../stores/template.js";
5
+ import { mapComposition as x } from "./recommendation/compositionMapper.js";
6
+ import { isPriceOnNextLine as R, extractCurrencyFromBlock as h, isOldPriceFirst as S, withRenderedTextTheme as w, extractTitleText as E, hasEmptyTitle as L, hasVisibleTitle as B, extractCardBgColor as P, isPartnerManagedBlock as A, extractRenderedBlockPadding as H } from "./recommendation/extractors.js";
7
+ import { buildBlockHtml as N } from "./recommendation/htmlBuilder.js";
8
+ import { parseRecommendationId as O, parseLegacyConfig as F } from "./recommendation/parseLegacyConfig.js";
9
+ import { mapSettings as I } from "./recommendation/settingsMapper.js";
10
+ import { mapBlockPadding as _ } from "./recommendation/themeMapper.js";
11
+ const k = 'td[esd-dev-product-config][class*="ins-recommendation-v3-block-"]:not(.recommendation-block-v2), td.product-block[esd-handler-name*="EmailRecommendationV3"][esd-dev-product-config]:not(.recommendation-block-v2)';
12
+ function $(c, e, m) {
13
+ var l, g, p;
14
+ const t = O(e);
15
+ if (t === null)
15
16
  return console.warn(
16
17
  "[RecommendationMigrator] Skipping block — missing/invalid `ins-recommendation-v3-campaign-id`"
17
18
  ), !1;
18
- const o = E(t);
19
- if (!o)
19
+ const r = F(e);
20
+ if (!r)
20
21
  return console.warn(
21
- `[RecommendationMigrator] Aborting block id=${r} — \`esd-dev-product-config\` missing or unable to be parsed`
22
+ `[RecommendationMigrator] Aborting block id=${t} — \`esd-dev-product-config\` missing or unable to be parsed`
22
23
  ), !1;
23
- const a = c[String(r)] ?? {
24
- currencySettings: C(t)
25
- }, i = A(a, o, r), e = v((l = o.composition) == null ? void 0 : l.variables), d = M(t);
26
- e.titleVariable || (e.visibility[b] = R(t));
27
- const p = S(t), g = {
28
- ...i,
24
+ const o = m[String(t)] ?? {}, n = {
25
+ ...o,
26
+ currencySettings: o.currencySettings ?? h(e),
27
+ isPriceMovedToNextLine: o.isPriceMovedToNextLine ?? R(e)
28
+ }, a = I(n, r, t), i = x(
29
+ w((l = r.composition) == null ? void 0 : l.variables, e),
30
+ { oldPriceFirst: S(e) }
31
+ ), u = E(e);
32
+ L(e) ? i.visibility[f] = !1 : i.titleVariable || (i.visibility[f] = B(e));
33
+ const y = P(e), T = {
34
+ ...a,
29
35
  strategyId: "",
30
- composition: e.composition,
31
- visibility: e.visibility,
32
- previousTitleHtml: y.previousTitleHtml,
33
- textTrimming: e.anyTextTrimming
34
- }, m = h(t), u = `
36
+ composition: i.composition,
37
+ visibility: i.visibility,
38
+ previousTitleHtml: C.previousTitleHtml,
39
+ textTrimming: i.anyTextTrimming
40
+ }, s = A(e), v = `
35
41
  <table>
36
42
  <tbody>
37
43
  <tr>
38
44
  <td class="esd-structure" align="left">
39
45
  <table width="100%" cellpadding="0" cellspacing="0">
40
46
  <tbody>
41
- <tr>${w({
42
- nodeConfig: g,
43
- composition: e,
44
- cardBg: p,
45
- titleText: d,
46
- legacyId: t.getAttribute("id") ?? void 0,
47
- legacyBgColor: t.getAttribute("bgcolor") ?? void 0,
48
- preserveInnerHtml: m ? t.innerHTML : void 0,
49
- skipCompile: m
47
+ <tr>${N({
48
+ nodeConfig: T,
49
+ composition: i,
50
+ cardBg: y,
51
+ titleText: u,
52
+ legacyId: e.getAttribute("id") ?? void 0,
53
+ legacyBgColor: e.getAttribute("bgcolor") ?? void 0,
54
+ preserveInnerHtml: s ? e.innerHTML : void 0,
55
+ skipCompile: s,
56
+ blockPadding: _(((p = (g = r.theme) == null ? void 0 : g.blockPadding) == null ? void 0 : p.desktop) ?? H(e))
50
57
  })}</tr>
51
58
  </tbody>
52
59
  </table>
@@ -54,40 +61,40 @@ function B(n, t, c) {
54
61
  </tr>
55
62
  </tbody>
56
63
  </table>
57
- `, s = n.parseFromString(u, "text/html").querySelector("td.esd-structure");
58
- return !s || !t.parentNode ? (console.warn(
59
- `[RecommendationMigrator] Aborting block id=${r} — failed to construct new HTML element`
60
- ), !1) : (t.parentNode.replaceChild(s, t), !0);
64
+ `, d = c.parseFromString(v, "text/html").querySelector("td.esd-structure");
65
+ return !d || !e.parentNode ? (console.warn(
66
+ `[RecommendationMigrator] Aborting block id=${t} — failed to construct new HTML element`
67
+ ), !1) : (e.parentNode.replaceChild(d, e), !0);
61
68
  }
62
- function G(n, t = {}) {
63
- const c = new DOMParser();
64
- let r;
69
+ function X(c, e = {}) {
70
+ const m = new DOMParser();
71
+ let t;
65
72
  try {
66
- r = c.parseFromString(n, "text/html");
67
- } catch (i) {
68
- return console.error("[RecommendationMigrator] Failed to parse template:", i), n;
73
+ t = m.parseFromString(c, "text/html");
74
+ } catch (n) {
75
+ return console.error("[RecommendationMigrator] Failed to parse template:", n), c;
69
76
  }
70
- const o = Array.from(r.querySelectorAll(H));
77
+ const r = Array.from(t.querySelectorAll(k));
71
78
  try {
72
- T().$patch((e) => {
73
- e.migrations = {
74
- ...e.migrations,
75
- [f.Recommendation]: o.length
79
+ M().$patch((a) => {
80
+ a.migrations = {
81
+ ...a.migrations,
82
+ [b.Recommendation]: r.length
76
83
  };
77
84
  });
78
85
  } catch {
79
86
  }
80
- if (o.length === 0)
81
- return n;
82
- let a = 0;
83
- return o.forEach((i) => {
87
+ if (r.length === 0)
88
+ return c;
89
+ let o = 0;
90
+ return r.forEach((n) => {
84
91
  try {
85
- B(c, i, t) && (a += 1);
86
- } catch (e) {
87
- console.error("[RecommendationMigrator] Unexpected error migrating block:", e);
92
+ $(m, n, e) && (o += 1);
93
+ } catch (a) {
94
+ console.error("[RecommendationMigrator] Unexpected error migrating block:", a);
88
95
  }
89
- }), a > 0 && console.info(`[RecommendationMigrator] Migrated ${a} legacy Recommendation block(s)`), r.documentElement.outerHTML;
96
+ }), o > 0 && console.info(`[RecommendationMigrator] Migrated ${o} legacy Recommendation block(s)`), t.documentElement.outerHTML;
90
97
  }
91
98
  export {
92
- G as migrateRecommendation
99
+ X as migrateRecommendation
93
100
  };
@@ -1,65 +1,66 @@
1
- var x = Object.defineProperty;
2
- var B = (c, e, r) => e in c ? x(c, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : c[e] = r;
3
- var A = (c, e, r) => B(c, typeof e != "symbol" ? e + "" : e, r);
4
- import { MERGE_TAGS as f, PAGE_TYPES as p } from "../../enums/unsubscribe.js";
5
- import { UNSUBSCRIBE_BLOCK_SELECTOR as h, DATA_ATTRIBUTES as k } from "../../extensions/Blocks/Unsubscribe/utils/constants.js";
6
- import { useUnsubscribeStore as C } from "../../stores/unsubscribe.js";
7
- class $ {
1
+ var C = Object.defineProperty;
2
+ var $ = (l, e, r) => e in l ? C(l, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : l[e] = r;
3
+ var E = (l, e, r) => $(l, typeof e != "symbol" ? e + "" : e, r);
4
+ import { MERGE_TAGS as c, PAGE_TYPES as T } from "../../enums/unsubscribe.js";
5
+ import { UNSUBSCRIBE_BLOCK_SELECTOR as A, DATA_ATTRIBUTES as f } from "../../extensions/Blocks/Unsubscribe/utils/constants.js";
6
+ import { useUnsubscribeStore as L } from "../../stores/unsubscribe.js";
7
+ const k = "unsubscribe", _ = "You can ", B = " from our emails, if you need to.", m = "{-{-UNSUBSCRIBE-LINK-}-}";
8
+ class H {
8
9
  constructor() {
9
- A(this, "parser");
10
+ E(this, "parser");
10
11
  this.parser = new DOMParser();
11
12
  }
12
13
  async migrate(e) {
13
14
  try {
14
15
  const r = this.parser.parseFromString(e, "text/html"), t = r.querySelectorAll("td.unsubscribe-block");
15
16
  if (t.length) {
16
- const s = C();
17
- await s.fetchTemplates(), this.migrateLegacyBlocks(t, s);
17
+ const n = L();
18
+ await n.fetchTemplates(), this.migrateLegacyBlocks(t, n);
18
19
  }
19
- const n = this.repairUnsubscribeLinks(r);
20
- return !t.length && !n ? e : r.documentElement.outerHTML;
20
+ const i = this.repairUnsubscribeLinks(r);
21
+ return !t.length && !i ? e : r.documentElement.outerHTML;
21
22
  } catch (r) {
22
23
  return console.error("UnsubscribeMigrator failed:", r), e;
23
24
  }
24
25
  }
25
26
  migrateLegacyBlocks(e, r) {
26
27
  e.forEach((t) => {
27
- const n = t.getAttribute("id"), s = this.extractPaddingClass(t), l = t.getAttribute("bgcolor") || "", a = this.extractUnsubscribeContent(t), o = this.getCollectionTypeFromMergeTag(a.linkHref), b = r.getSelectedUnsubscribePagesByCollection(o);
28
+ const i = t.getAttribute("id"), n = this.extractPaddingClass(t), s = t.getAttribute("bgcolor") || "", o = this.extractUnsubscribeContent(t), a = this.getCollectionTypeFromMergeTag(o.linkHref), g = r.getSelectedUnsubscribePagesByCollection(a);
28
29
  console.debug("[UnsubscribeMigrator]", {
29
- mergeTag: a.linkHref,
30
- collectionType: o,
31
- pageIds: b,
32
- paddingClass: s,
33
- bgColor: l
30
+ mergeTag: o.linkHref,
31
+ collectionType: a,
32
+ pageIds: g,
33
+ paddingClass: n,
34
+ bgColor: s
34
35
  });
35
36
  const u = this.buildUnsubscribeBlock(
36
- a,
37
37
  o,
38
- b,
39
- s,
40
- l
41
- ), i = this.parser.parseFromString(
38
+ a,
39
+ g,
40
+ n,
41
+ s
42
+ ), p = this.parser.parseFromString(
42
43
  `<table id="tempDoc"><tbody><tr>${u}</tr></tbody></table>`,
43
44
  "text/html"
44
- ).querySelector(h);
45
- i && t.parentNode && (i.setAttribute("id", n || ""), t.parentNode.replaceChild(i, t));
45
+ ).querySelector(A);
46
+ p && t.parentNode && (p.setAttribute("id", i || ""), t.parentNode.replaceChild(p, t));
46
47
  });
47
48
  }
48
49
  // Re-derives the typed merge tag from data-unsubscribe-page-type for any v2
49
50
  // block whose anchor href is missing or the legacy default. Returns true when
50
51
  // at least one href was rewritten. Typed tags and custom URLs are left intact.
51
52
  repairUnsubscribeLinks(e) {
52
- const r = e.querySelectorAll(`${h}[${k.PAGE_TYPE}]`);
53
+ const r = e.querySelectorAll(`${A}[${f.PAGE_TYPE}]`);
53
54
  let t = !1;
54
- return r.forEach((n) => {
55
- const s = n.querySelector('a[data-unsubscribe-link="true"], a.unsubscribe-link');
56
- if (!s)
55
+ return r.forEach((i) => {
56
+ const n = i.querySelector('a[data-unsubscribe-link="true"], a.unsubscribe-link');
57
+ if (!n)
57
58
  return;
58
- const l = s.getAttribute("href") || "";
59
- if (l && l !== f.default)
59
+ const s = n.getAttribute("href") || "";
60
+ if (s && s !== c.default)
60
61
  return;
61
- const a = Number(n.getAttribute(k.PAGE_TYPE)), o = f[a];
62
- o && (s.setAttribute("href", o), t = !0);
62
+ const o = Number(i.getAttribute(f.PAGE_TYPE)), a = c[o];
63
+ a && (n.setAttribute("href", a), t = !0);
63
64
  }), t;
64
65
  }
65
66
  extractPaddingClass(e) {
@@ -67,70 +68,42 @@ class $ {
67
68
  return t ? t[0] : "";
68
69
  }
69
70
  extractUnsubscribeContent(e) {
70
- var d;
71
- const r = e.querySelector("a.unsubscribe-link") || e.querySelector('a[href*="unsubscribe"]'), t = (r == null ? void 0 : r.closest("p")) || e.querySelector("p");
72
- if (!t)
73
- return {
74
- textBefore: "You can ",
75
- linkText: "unsubscribe",
76
- linkHref: "{{ins-unsubscribe-link}}",
77
- linkStyle: "",
78
- textAfter: " from our emails, if you need to.",
79
- isBold: !1,
80
- isItalic: !1,
81
- align: "center",
82
- paragraphStyle: ""
83
- };
84
- const n = e.getAttribute("align") || t.getAttribute("align") || "center", s = t.getAttribute("style") || "";
85
- if (!r)
86
- return {
87
- textBefore: "You can ",
88
- linkText: "unsubscribe",
89
- linkHref: "{{ins-unsubscribe-link}}",
90
- linkStyle: "",
91
- textAfter: " from our emails, if you need to.",
92
- isBold: !1,
93
- isItalic: !1,
94
- align: n,
95
- paragraphStyle: s
96
- };
97
- const l = ((d = r.textContent) == null ? void 0 : d.trim()) || "unsubscribe", a = r.getAttribute("href") || "{{ins-unsubscribe-link}}", o = r.getAttribute("style") || "", b = t.textContent || "", u = b.indexOf(l), g = u >= 0 ? b.substring(0, u).trim() : "You can ", i = u >= 0 ? b.substring(u + l.length).trim() : " from our emails, if you need to.", m = !!t.querySelector("b, strong"), y = !!t.querySelector("i, em");
98
- return {
99
- textBefore: g,
100
- linkText: l,
101
- linkHref: this.normalizeUnsubscribeHref(a),
102
- linkStyle: o,
103
- textAfter: i,
104
- isBold: m,
105
- isItalic: y,
106
- align: n,
107
- paragraphStyle: s
71
+ var a;
72
+ const r = e.cloneNode(!0), t = r.querySelector("a.unsubscribe-link") || r.querySelector('a[href*="unsubscribe"]'), i = (t == null ? void 0 : t.closest("p")) ?? null, n = i || r.querySelector("p"), s = {
73
+ paragraphsHtml: "",
74
+ linkText: k,
75
+ linkHref: c.default,
76
+ linkStyle: "",
77
+ align: "center",
78
+ paragraphStyle: ""
108
79
  };
80
+ if (!n || (s.align = e.getAttribute("align") || n.getAttribute("align") || "center", s.paragraphStyle = n.getAttribute("style") || "", !t))
81
+ return s;
82
+ const o = !!((a = t.textContent) != null && a.trim() || t.querySelector("img"));
83
+ if (s.linkText = o ? t.innerHTML.trim() : k, s.linkHref = this.normalizeUnsubscribeHref(t.getAttribute("href") || c.default), s.linkStyle = t.getAttribute("style") || "", i) {
84
+ const g = this.getCollectionTypeFromMergeTag(s.linkHref), u = c[g];
85
+ r.querySelectorAll(`a[href="${c.default}"]`).forEach((b) => b.setAttribute("href", u)), t.replaceWith(r.ownerDocument.createTextNode(m)), s.paragraphsHtml = Array.from(r.querySelectorAll("p"), (b) => b.outerHTML).join("");
86
+ }
87
+ return s;
109
88
  }
110
- buildUnsubscribeBlock(e, r, t, n, s) {
111
- const l = e.linkStyle ? ` style="${e.linkStyle}"` : "", u = `<a ${`href="${Object.values(f).includes(e.linkHref) ? f[r] : e.linkHref}" class="unsubscribe-link" target="_blank" data-unsubscribe-link="true"`}${l}>${e.linkText}</a>`, g = [];
112
- e.textBefore && g.push(e.textBefore), g.push(u), e.textAfter && g.push(e.textAfter);
113
- let i = g.join(" ");
114
- e.isBold && e.isItalic ? i = `<strong path="1,0"><em path="1,0,0">${i}</em></strong>` : e.isBold ? i = `<strong path="1,0">${i}</strong>` : e.isItalic && (i = `<em path="1,0">${i}</em>`);
115
- const m = e.align ? ` align="${e.align}"` : "", y = s ? ` bgcolor="${s}"` : "", d = e.paragraphStyle ? ` style="${e.paragraphStyle}"` : "", T = t.length > 0 ? ` ${k.PAGE_LIST}="${t.join(",")}"` : "", E = ` ${k.PAGE_TYPE}="${r}"`, S = "esd-block-text unsubscribe-block-v2 esd-block-unsubscribe esd-unsubscribe-block esd-extension-block";
89
+ buildUnsubscribeBlock(e, r, t, i, n) {
90
+ const s = e.linkStyle ? ` style="${e.linkStyle}"` : "", u = `<a ${`href="${Object.values(c).includes(e.linkHref) ? c[r] : e.linkHref}" class="unsubscribe-link" target="_blank" data-unsubscribe-link="true"`}${s}>${e.linkText}</a>`, b = e.paragraphStyle ? ` style="${e.paragraphStyle}"` : "", p = e.paragraphsHtml ? e.paragraphsHtml.replace(m, () => u) : `<p path="1"${b}>${_}${u}${B}</p>`, y = e.align ? ` align="${e.align}"` : "", S = n ? ` bgcolor="${n}"` : "", h = t.length > 0 ? ` ${f.PAGE_LIST}="${t.join(",")}"` : "", U = ` ${f.PAGE_TYPE}="${r}"`, d = "esd-block-text unsubscribe-block-v2 esd-block-unsubscribe esd-unsubscribe-block esd-extension-block";
116
91
  return `
117
92
  <td
118
93
  data-migration="true"
119
94
  esd-extension-block-id="unsubscribe-block"
120
- class="${n ? `${S} ${n}` : S}"
121
- ${m}${y}${E}${T}
95
+ class="${i ? `${d} ${i}` : d}"
96
+ ${y}${S}${U}${h}
122
97
  >
123
- <p path="1"${d}>
124
- ${i}
125
- </p>
98
+ ${p}
126
99
  </td>
127
100
  `;
128
101
  }
129
102
  getCollectionTypeFromMergeTag(e) {
130
- return e === f[p.SUBSCRIPTION_PREFERENCE_CENTER] ? p.SUBSCRIPTION_PREFERENCE_CENTER : e === f[p.GLOBAL_UNSUBSCRIBE] ? p.GLOBAL_UNSUBSCRIBE : p.GLOBAL_UNSUBSCRIBE;
103
+ return e === c[T.SUBSCRIPTION_PREFERENCE_CENTER] ? T.SUBSCRIPTION_PREFERENCE_CENTER : e === c[T.GLOBAL_UNSUBSCRIBE] ? T.GLOBAL_UNSUBSCRIBE : T.GLOBAL_UNSUBSCRIBE;
131
104
  }
132
105
  normalizeUnsubscribeHref(e) {
133
- if (Object.values(f).includes(e))
106
+ if (Object.values(c).includes(e))
134
107
  return e;
135
108
  const t = e.match(/{{ins-(?:global-)?(?:preferences-)?unsubscribe-link}}/);
136
109
  return t ? t[0] : e.includes("unsubscribe") || e.includes("unsub") ? (console.warn(
@@ -138,9 +111,9 @@ class $ {
138
111
  ), "{{ins-unsubscribe-link}}") : e;
139
112
  }
140
113
  }
141
- async function M(c) {
142
- return new $().migrate(c);
114
+ async function I(l) {
115
+ return new H().migrate(l);
143
116
  }
144
117
  export {
145
- M as migrateUnsubscribe
118
+ I as migrateUnsubscribe
146
119
  };