@useinsider/guido 3.22.0-beta.e1b5da2 → 3.22.0-beta.e9b6f94

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 (45) 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/composables/useEditorOpenMetrics.js +167 -0
  5. package/dist/composables/useStripo.js +93 -82
  6. package/dist/config/compiler/utils/recommendationCompilerUtils.js +22 -22
  7. package/dist/config/migrator/recommendation/compositionMapper.js +49 -56
  8. package/dist/config/migrator/recommendation/extractors.js +40 -100
  9. package/dist/config/migrator/recommendation/htmlBuilder.js +207 -285
  10. package/dist/config/migrator/recommendation/settingsMapper.js +36 -37
  11. package/dist/config/migrator/recommendation/themeMapper.js +41 -53
  12. package/dist/config/migrator/recommendationMigrator.js +61 -68
  13. package/dist/config/migrator/unsubscribeMigrator.js +60 -87
  14. package/dist/extensions/Blocks/Recommendation/block.js +24 -33
  15. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +19 -20
  16. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +163 -148
  17. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +22 -23
  18. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +18 -19
  19. package/dist/extensions/Blocks/Recommendation/templates/utils.js +91 -82
  20. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMap.js +2 -3
  21. package/dist/guido.css +1 -1
  22. package/dist/library.js +12 -10
  23. package/dist/package.json.js +6 -4
  24. package/dist/public/prefetchRuntime.js +4 -0
  25. package/dist/src/composables/useEditorOpenMetrics.d.ts +27 -0
  26. package/dist/src/composables/useStripo.d.ts +2 -1
  27. package/dist/src/config/migrator/recommendation/compositionMapper.d.ts +1 -3
  28. package/dist/src/config/migrator/recommendation/extractors.d.ts +6 -35
  29. package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +1 -3
  30. package/dist/src/config/migrator/recommendation/themeMapper.d.ts +1 -3
  31. package/dist/src/config/migrator/recommendation/types.d.ts +1 -11
  32. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +0 -1
  33. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +8 -2
  34. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +13 -1
  35. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.d.ts +19 -2
  36. package/dist/src/library.d.ts +1 -0
  37. package/dist/src/public/prefetchRuntime.d.ts +1 -0
  38. package/dist/src/utils/runtimePrefetch.d.ts +4 -0
  39. package/dist/src/utils/stripoRuntime.d.ts +3 -0
  40. package/dist/static/stripo-runtime-manifest.json.js +9 -0
  41. package/dist/utils/runtimePrefetch.js +26 -0
  42. package/dist/utils/stripoRuntime.js +13 -0
  43. package/package.json +6 -1
  44. package/dist/extensions/Blocks/Recommendation/utils/inlinePriceOrder.js +0 -12
  45. package/dist/src/extensions/Blocks/Recommendation/utils/inlinePriceOrder.d.ts +0 -9
@@ -1,10 +1,10 @@
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) {
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) {
5
5
  return t === "0" || t === 0 ? "before" : "after";
6
6
  }
7
- function A(t) {
7
+ function _(t) {
8
8
  if (typeof t == "number" && Number.isFinite(t))
9
9
  return t;
10
10
  if (typeof t == "string") {
@@ -14,52 +14,51 @@ function A(t) {
14
14
  }
15
15
  return i.decimalCount;
16
16
  }
17
- function L(t) {
17
+ function I(t) {
18
18
  return t === "." || t === "," || t === " " || t === "" ? t : ",";
19
19
  }
20
- function N(t) {
20
+ function A(t) {
21
21
  return t === "." || t === "," || t === " " ? t : ".";
22
22
  }
23
- function R(t) {
23
+ function L(t) {
24
24
  if (!t || typeof t != "object")
25
25
  return { ...i };
26
- const o = t, n = o.value ?? o.name ?? i.code, e = o.symbol ?? n;
26
+ const o = t, n = o.value ?? o.name ?? i.code, r = o.symbol ?? n;
27
27
  return {
28
28
  code: n,
29
- symbol: e,
30
- alignment: I(o.alignment),
31
- decimalCount: A(o.decimalCount),
32
- decimalSeparator: N(o.decimalSeparator),
33
- thousandSeparator: L(o.thousandSeparator)
29
+ symbol: r,
30
+ alignment: c(o.alignment),
31
+ decimalCount: _(o.decimalCount),
32
+ decimalSeparator: A(o.decimalSeparator),
33
+ thousandSeparator: I(o.thousandSeparator)
34
34
  };
35
35
  }
36
- function b(t) {
36
+ function N(t) {
37
37
  return t === "horizontal" || t === "list" ? "list" : "grid";
38
38
  }
39
- function D(t) {
40
- return _(t) || "mostPopular";
39
+ function R(t) {
40
+ return l(t) || "mostPopular";
41
41
  }
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;
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;
45
44
  return {
46
45
  recommendationId: n,
47
- strategy: D(t.strategy),
48
- productIds: (t.productIds ?? []).map((r) => String(r)),
49
- size: String(m),
46
+ strategy: R(t.strategy),
47
+ productIds: (t.productIds ?? []).map((e) => String(e)),
48
+ size: String(u),
50
49
  shuffleProducts: !!t.shuffleProducts,
51
50
  language: t.language ?? "en_US",
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,
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,
63
62
  omnibusPrice: { textBefore: "", textAfter: "" },
64
63
  omnibusDiscount: { textBefore: "", textAfter: "" },
65
64
  // Preserve the legacy price-placement toggles. Absent legacy keys map to
@@ -67,10 +66,10 @@ function U(t, o, n) {
67
66
  // gated). New Guido blocks default differently (see DEFAULT_NODE_CONFIG).
68
67
  priceMovedToNextLine: !!t.isPriceMovedToNextLine,
69
68
  priceHideIfSameAsDiscounted: !!t.isPriceDeletedForZeroSale,
70
- configVersion: p
69
+ configVersion: s
71
70
  };
72
71
  }
73
72
  export {
74
- R as mapCurrency,
75
- U as mapSettings
73
+ L as mapCurrency,
74
+ O as mapSettings
76
75
  };
@@ -1,44 +1,34 @@
1
1
  function r(n, t, o) {
2
2
  o != null && o !== "" && n.push(`${t}: ${o}`);
3
3
  }
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) {
4
+ function $(n) {
14
5
  if (!n)
15
6
  return null;
16
7
  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;
17
8
  return t === 0 && o === 0 && i === 0 && l === 0 ? null : `${t}px ${o}px ${i}px ${l}px`;
18
9
  }
19
- function z(n) {
10
+ function j(n) {
20
11
  if (!n)
21
12
  return null;
22
13
  const { top: t, right: o, bottom: i, left: l } = n;
23
14
  return t === void 0 ? null : t === o && t === i && t === l ? t : null;
24
15
  }
25
- function $(n, t, o, i) {
26
- const l = z(o);
16
+ function S(n, t, o, i) {
17
+ const l = j(o);
27
18
  if (l !== null) {
28
19
  r(n, `border-${t}`, i(l));
29
20
  return;
30
21
  }
31
22
  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));
32
23
  }
33
- function D(n) {
24
+ function C(n) {
34
25
  if (!n)
35
26
  return null;
36
- const t = x(n.radius ?? n.borderRadius);
37
- if (t !== void 0)
38
- return `${t}px`;
27
+ if (typeof n.radius == "number")
28
+ return `${n.radius}px`;
39
29
  if (typeof n.lt == "number" || typeof n.rt == "number" || typeof n.rb == "number" || typeof n.lb == "number") {
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`;
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`;
42
32
  }
43
33
  return null;
44
34
  }
@@ -46,60 +36,58 @@ function I(n) {
46
36
  var t, o;
47
37
  return ((t = n.textLineSpacing) == null ? void 0 : t.lineSpacing) ?? ((o = n.textLineSpacing) == null ? void 0 : o["font-lineSpacing"]);
48
38
  }
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), {
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), {
53
43
  tdStyle: t.join("; "),
54
44
  pStyle: o.join("; "),
55
45
  align: i || void 0,
56
- wrapBold: f === "bold",
46
+ wrapBold: x === "bold",
57
47
  wrapItalic: c === "italic",
58
48
  textTrimming: (n == null ? void 0 : n.textTrimming) === !0
59
49
  };
60
50
  }
61
- function E(n) {
62
- var s, a, d, g, b, p, y, k, w, B, T, j;
51
+ function N(n) {
52
+ var u, a, g, d, b, p, s, k, w, P, B, z;
63
53
  const t = [], o = [], i = [];
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);
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);
67
57
  const c = n == null ? void 0 : n.buttonBorder;
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")), {
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")), {
71
61
  tdStyle: t.join("; "),
72
- align: ((T = n == null ? void 0 : n.buttonAlign) == null ? void 0 : T.align) || void 0,
62
+ align: ((B = n == null ? void 0 : n.buttonAlign) == null ? void 0 : B.align) || void 0,
73
63
  spanStyle: o.join("; "),
74
64
  aStyle: i.join("; "),
75
- text: (j = n == null ? void 0 : n.buttonText) == null ? void 0 : j.text
65
+ text: (z = n == null ? void 0 : n.buttonText) == null ? void 0 : z.text
76
66
  };
77
67
  }
78
- function L(n) {
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) {
79
78
  var t, o;
80
79
  return {
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)
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)
83
82
  };
84
83
  }
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) {
84
+ function F(n, t) {
96
85
  const o = (n ?? "").trim().replace(/;$/, "").trim(), i = (t ?? "").trim().replace(/;$/, "").trim();
97
86
  return o ? i ? `${o}; ${i}` : o : i;
98
87
  }
99
88
  export {
100
- v as appendStyle,
101
- R as mapBlockPadding,
102
- E as mapButtonTheme,
103
- L as mapImageTheme,
104
- N as mapTextTheme
89
+ F as appendStyle,
90
+ N as mapButtonTheme,
91
+ A as mapImageTheme,
92
+ L as mapTextTheme
105
93
  };
@@ -1,59 +1,52 @@
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)
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)
16
15
  return console.warn(
17
16
  "[RecommendationMigrator] Skipping block — missing/invalid `ins-recommendation-v3-campaign-id`"
18
17
  ), !1;
19
- const r = F(e);
20
- if (!r)
18
+ const o = E(t);
19
+ if (!o)
21
20
  return console.warn(
22
- `[RecommendationMigrator] Aborting block id=${t} — \`esd-dev-product-config\` missing or unable to be parsed`
21
+ `[RecommendationMigrator] Aborting block id=${r} — \`esd-dev-product-config\` missing or unable to be parsed`
23
22
  ), !1;
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,
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,
35
29
  strategyId: "",
36
- composition: i.composition,
37
- visibility: i.visibility,
38
- previousTitleHtml: C.previousTitleHtml,
39
- textTrimming: i.anyTextTrimming
40
- }, s = A(e), v = `
30
+ composition: e.composition,
31
+ visibility: e.visibility,
32
+ previousTitleHtml: y.previousTitleHtml,
33
+ textTrimming: e.anyTextTrimming
34
+ }, m = h(t), u = `
41
35
  <table>
42
36
  <tbody>
43
37
  <tr>
44
38
  <td class="esd-structure" align="left">
45
39
  <table width="100%" cellpadding="0" cellspacing="0">
46
40
  <tbody>
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))
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
57
50
  })}</tr>
58
51
  </tbody>
59
52
  </table>
@@ -61,40 +54,40 @@ function $(c, e, m) {
61
54
  </tr>
62
55
  </tbody>
63
56
  </table>
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);
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);
68
61
  }
69
- function X(c, e = {}) {
70
- const m = new DOMParser();
71
- let t;
62
+ function G(n, t = {}) {
63
+ const c = new DOMParser();
64
+ let r;
72
65
  try {
73
- t = m.parseFromString(c, "text/html");
74
- } catch (n) {
75
- return console.error("[RecommendationMigrator] Failed to parse template:", n), c;
66
+ r = c.parseFromString(n, "text/html");
67
+ } catch (i) {
68
+ return console.error("[RecommendationMigrator] Failed to parse template:", i), n;
76
69
  }
77
- const r = Array.from(t.querySelectorAll(k));
70
+ const o = Array.from(r.querySelectorAll(H));
78
71
  try {
79
- M().$patch((a) => {
80
- a.migrations = {
81
- ...a.migrations,
82
- [b.Recommendation]: r.length
72
+ T().$patch((e) => {
73
+ e.migrations = {
74
+ ...e.migrations,
75
+ [f.Recommendation]: o.length
83
76
  };
84
77
  });
85
78
  } catch {
86
79
  }
87
- if (r.length === 0)
88
- return c;
89
- let o = 0;
90
- return r.forEach((n) => {
80
+ if (o.length === 0)
81
+ return n;
82
+ let a = 0;
83
+ return o.forEach((i) => {
91
84
  try {
92
- $(m, n, e) && (o += 1);
93
- } catch (a) {
94
- console.error("[RecommendationMigrator] Unexpected error migrating block:", a);
85
+ B(c, i, t) && (a += 1);
86
+ } catch (e) {
87
+ console.error("[RecommendationMigrator] Unexpected error migrating block:", e);
95
88
  }
96
- }), o > 0 && console.info(`[RecommendationMigrator] Migrated ${o} legacy Recommendation block(s)`), t.documentElement.outerHTML;
89
+ }), a > 0 && console.info(`[RecommendationMigrator] Migrated ${a} legacy Recommendation block(s)`), r.documentElement.outerHTML;
97
90
  }
98
91
  export {
99
- X as migrateRecommendation
92
+ G as migrateRecommendation
100
93
  };
@@ -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
  };