@useinsider/guido 3.12.0-beta.60e4757 → 3.12.0-beta.6de71f8

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 (81) hide show
  1. package/dist/@types/config/schemas.js +9 -4
  2. package/dist/components/Guido.vue.js +6 -6
  3. package/dist/components/Guido.vue2.js +50 -49
  4. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +1 -1
  5. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +8 -8
  6. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +5 -5
  7. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue2.js +10 -10
  8. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.js +38 -0
  9. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue2.js +271 -0
  10. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.js +18 -0
  11. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue2.js +42 -0
  12. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.js +20 -0
  13. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue2.js +18 -0
  14. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.js +20 -0
  15. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue2.js +60 -0
  16. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.js +19 -0
  17. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue2.js +19 -0
  18. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.js +22 -0
  19. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue2.js +29 -0
  20. package/dist/composables/useHttp.js +61 -52
  21. package/dist/composables/usePreviewInteractionGuard.js +36 -11
  22. package/dist/composables/useRecommendation.js +56 -40
  23. package/dist/composables/useRecommendationPreview.js +61 -60
  24. package/dist/composables/useStrategyFilters.js +16 -0
  25. package/dist/config/migrator/recommendationMigrator.js +7 -4
  26. package/dist/enums/date.js +4 -3
  27. package/dist/enums/extensions/filteringV2.js +1024 -0
  28. package/dist/enums/extensions/recommendationBlock.js +45 -24
  29. package/dist/enums/extensions/strategyDetail.js +149 -0
  30. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +12 -11
  31. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +141 -123
  32. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +285 -0
  33. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +16 -2
  34. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +137 -0
  35. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +478 -113
  36. package/dist/extensions/Blocks/Recommendation/utils/strategyHumanizer.js +97 -0
  37. package/dist/extensions/Blocks/Recommendation/utils/strategyNavigation.js +8 -0
  38. package/dist/extensions/Blocks/Recommendation/utils/strategySummary.js +95 -0
  39. package/dist/extensions/Blocks/Recommendation/utils/strategyUrl.js +43 -0
  40. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +24 -10
  41. package/dist/extensions/Blocks/Unsubscribe/utils/constants.js +3 -2
  42. package/dist/extensions/Blocks/common-control.js +37 -35
  43. package/dist/guido.css +1 -1
  44. package/dist/services/recommendationApi.js +127 -33
  45. package/dist/services/stripoApi.js +18 -18
  46. package/dist/src/@types/config/schemas.d.ts +10 -0
  47. package/dist/src/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.d.ts +2 -0
  48. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.d.ts +43 -0
  49. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.d.ts +29 -0
  50. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.d.ts +40 -0
  51. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.d.ts +38 -0
  52. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.d.ts +51 -0
  53. package/dist/src/composables/useConfig.d.ts +2 -0
  54. package/dist/src/composables/usePreviewInteractionGuard.d.ts +1 -1
  55. package/dist/src/composables/useRecommendation.d.ts +2 -0
  56. package/dist/src/composables/useStrategyFilters.d.ts +24 -0
  57. package/dist/src/enums/extensions/filteringV2.d.ts +72 -0
  58. package/dist/src/enums/extensions/recommendationBlock.d.ts +33 -0
  59. package/dist/src/enums/extensions/strategyDetail.d.ts +90 -0
  60. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +10 -4
  61. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +109 -0
  62. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +924 -1
  63. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +7 -0
  64. package/dist/src/extensions/Blocks/Recommendation/utils/strategyHumanizer.d.ts +50 -0
  65. package/dist/src/extensions/Blocks/Recommendation/utils/strategyNavigation.d.ts +10 -0
  66. package/dist/src/extensions/Blocks/Recommendation/utils/strategySummary.d.ts +34 -0
  67. package/dist/src/extensions/Blocks/Recommendation/utils/strategyUrl.d.ts +51 -0
  68. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +8 -1
  69. package/dist/src/extensions/Blocks/Unsubscribe/utils/constants.d.ts +1 -0
  70. package/dist/src/extensions/Blocks/common-control.d.ts +5 -2
  71. package/dist/src/mock/api/recommendation-strategies.d.ts +2 -0
  72. package/dist/src/services/recommendationApi.d.ts +9 -1
  73. package/dist/src/stores/config.d.ts +18 -0
  74. package/dist/src/utils/genericUtil.d.ts +9 -0
  75. package/dist/src/utils/urlSchemes.d.ts +6 -0
  76. package/dist/static/styles/components/base-input.css.js +6 -7
  77. package/dist/utils/dateUtil.js +23 -10
  78. package/dist/utils/genericUtil.js +10 -1
  79. package/dist/utils/templatePreparation.js +70 -57
  80. package/dist/utils/urlSchemes.js +4 -0
  81. package/package.json +1 -1
@@ -1,84 +1,93 @@
1
- import { getCsrfToken as H } from "../utils/genericUtil.js";
2
- import { ref as p, computed as T } from "vue";
3
- const k = (b = {}) => {
4
- const h = p(!1), a = p(null), u = p(null), g = T(() => h.value), y = T(() => a.value !== null), v = {
1
+ import { getCsrfToken as S } from "../utils/genericUtil.js";
2
+ import { ref as T, computed as v } from "vue";
3
+ const H = (c) => {
4
+ const a = c.trim();
5
+ if (!a.startsWith("{") && !a.startsWith("["))
6
+ return c;
7
+ try {
8
+ return JSON.parse(a);
9
+ } catch {
10
+ return c;
11
+ }
12
+ }, k = (c = {}) => {
13
+ const a = T(!1), n = T(null), f = T(null), b = v(() => a.value), g = v(() => n.value !== null), y = {
5
14
  baseURL: "",
6
15
  timeout: 1e4,
7
16
  retry: 0,
8
17
  retryDelay: 1e3,
9
18
  headers: {
10
19
  "Content-Type": "application/json",
11
- "X-CSRF-TOKEN": H()
20
+ "X-CSRF-TOKEN": S()
12
21
  },
13
- ...b
14
- }, w = (e, s) => {
15
- if (e.startsWith("http://") || e.startsWith("https://"))
16
- return e;
17
- const t = s || v.baseURL || "";
18
- return t.endsWith("/") && e.startsWith("/") ? `${t}${e.slice(1)}` : t.endsWith("/") || e.startsWith("/") ? `${t}${e}` : `${t}/${e}`;
19
- }, P = (e) => new Promise((s, t) => {
22
+ ...c
23
+ }, w = (t, s) => {
24
+ if (t.startsWith("http://") || t.startsWith("https://"))
25
+ return t;
26
+ const e = s || y.baseURL || "";
27
+ return e.endsWith("/") && t.startsWith("/") ? `${e}${t.slice(1)}` : e.endsWith("/") || t.startsWith("/") ? `${e}${t}` : `${e}/${t}`;
28
+ }, P = (t) => new Promise((s, e) => {
20
29
  setTimeout(() => {
21
- t(new Error("Request timeout"));
22
- }, e);
23
- }), x = (e) => new Promise((s) => {
24
- setTimeout(s, e);
25
- }), i = async (e, s, t, D = {}) => {
26
- a.value = null, h.value = !0, u.value = new AbortController();
27
- const n = { ...v, ...D }, L = w(s, n.baseURL), c = {
28
- method: e,
29
- headers: { ...n.headers },
30
- signal: u.value.signal,
31
- ...n
30
+ e(new Error("Request timeout"));
31
+ }, t);
32
+ }), C = (t) => new Promise((s) => {
33
+ setTimeout(s, t);
34
+ }), l = async (t, s, e, q = {}) => {
35
+ n.value = null, a.value = !0, f.value = new AbortController();
36
+ const i = { ...y, ...q }, D = w(s, i.baseURL), d = {
37
+ method: t,
38
+ headers: { ...i.headers },
39
+ signal: f.value.signal,
40
+ ...i
32
41
  };
33
- t && ["POST", "PUT", "PATCH"].includes(e) && (t instanceof FormData ? (delete c.headers["Content-Type"], c.body = t) : c.body = JSON.stringify(t));
34
- const E = async (m = 0) => {
42
+ e && ["POST", "PUT", "PATCH"].includes(t) && (e instanceof FormData ? (delete d.headers["Content-Type"], d.body = e) : d.body = JSON.stringify(e));
43
+ const E = async (p = 0) => {
35
44
  try {
36
- const o = [fetch(L, c)];
37
- n.timeout && o.push(P(n.timeout));
45
+ const o = [fetch(D, d)];
46
+ i.timeout && o.push(P(i.timeout));
38
47
  const r = await Promise.race(o);
39
48
  if (!r.ok) {
40
- const O = `HTTP Error: ${r.status} ${r.statusText}`, d = new Error(O);
41
- throw d.status = r.status, d.statusText = r.statusText, d.response = r, d;
49
+ const L = `HTTP Error: ${r.status} ${r.statusText}`, m = new Error(L);
50
+ throw m.status = r.status, m.statusText = r.statusText, m.response = r, m;
42
51
  }
43
- let f;
44
- const l = r.headers.get("content-type");
45
- return l != null && l.includes("application/json") ? f = await r.json() : l != null && l.includes("text/") ? f = await r.text() : f = await r.blob(), {
46
- data: f,
52
+ let h;
53
+ const u = r.headers.get("content-type");
54
+ return u != null && u.includes("application/json") ? h = await r.json() : u != null && u.includes("text/") ? h = H(await r.text()) : h = await r.blob(), {
55
+ data: h,
47
56
  status: r.status,
48
57
  statusText: r.statusText,
49
58
  headers: r.headers
50
59
  };
51
60
  } catch (o) {
52
61
  const r = o instanceof Error && o.name === "AbortError";
53
- if (m < (n.retry || 0) && !r)
54
- return await x(n.retryDelay || 1e3), E(m + 1);
55
- throw o instanceof Error ? o.name === "AbortError" ? a.value = { message: "Request was cancelled" } : a.value = { message: o.message } : a.value = o, o;
62
+ if (p < (i.retry || 0) && !r)
63
+ return await C(i.retryDelay || 1e3), E(p + 1);
64
+ throw o instanceof Error ? o.name === "AbortError" ? n.value = { message: "Request was cancelled" } : n.value = { message: o.message } : n.value = o, o;
56
65
  }
57
66
  };
58
67
  try {
59
68
  return await E();
60
69
  } finally {
61
- h.value = !1, u.value = null;
70
+ a.value = !1, f.value = null;
62
71
  }
63
- }, C = (e, s) => i("GET", e, void 0, s), $ = (e, s, t) => i("POST", e, s, t), R = (e, s, t) => i("PUT", e, s, t), U = (e, s, t) => i("PATCH", e, s, t), A = (e, s) => i("DELETE", e, void 0, s), W = (e) => {
64
- u.value && u.value.abort(e);
65
- }, q = () => {
66
- a.value = null;
72
+ }, x = (t, s) => l("GET", t, void 0, s), W = (t, s, e) => l("POST", t, s, e), $ = (t, s, e) => l("PUT", t, s, e), R = (t, s, e) => l("PATCH", t, s, e), U = (t, s) => l("DELETE", t, void 0, s), A = (t) => {
73
+ f.value && f.value.abort(t);
74
+ }, O = () => {
75
+ n.value = null;
67
76
  };
68
77
  return {
69
78
  // State
70
- loading: g,
71
- error: T(() => a.value),
72
- hasError: y,
79
+ loading: b,
80
+ error: v(() => n.value),
81
+ hasError: g,
73
82
  // Methods
74
- request: i,
75
- get: C,
76
- post: $,
77
- put: R,
78
- patch: U,
79
- delete: A,
80
- cancel: W,
81
- clearError: q
83
+ request: l,
84
+ get: x,
85
+ post: W,
86
+ put: $,
87
+ patch: R,
88
+ delete: U,
89
+ cancel: A,
90
+ clearError: O
82
91
  };
83
92
  };
84
93
  export {
@@ -1,17 +1,42 @@
1
- const o = ["click", "auxclick", "submit"], c = (t) => {
2
- t.preventDefault(), t.stopPropagation();
3
- }, a = () => ({ blockPreviewInteractions: (r) => {
1
+ import { URLS as o, MERGE_TAGS as a } from "../enums/unsubscribe.js";
2
+ import { UNSUBSCRIBE_LINK_SELECTOR as i } from "../extensions/Blocks/Unsubscribe/utils/constants.js";
3
+ import { BASE_SAFE_URL_SCHEMES as u } from "../utils/urlSchemes.js";
4
+ const E = ["click", "auxclick"], d = [
5
+ ...Object.values(a),
6
+ o.UNSUBSCRIBE_URL,
7
+ o.PREFERENCES_URL
8
+ ], l = (e) => {
9
+ if (e.matches(i))
10
+ return !0;
11
+ const r = e.getAttribute("href") ?? "";
12
+ return d.some((t) => r.includes(t));
13
+ }, S = [...u, "tel:", "sms:"], f = (e) => {
14
+ const r = (e.getAttribute("href") ?? "").trim();
15
+ return r === "" || r.startsWith("#") || r.startsWith("{{") ? !1 : S.includes(e.protocol);
16
+ }, m = (e) => {
17
+ var t, n;
18
+ const r = (n = (t = e.target) == null ? void 0 : t.closest) == null ? void 0 : n.call(t, "a");
19
+ if (r) {
20
+ if (l(r) || !f(r)) {
21
+ e.preventDefault(), e.stopPropagation();
22
+ return;
23
+ }
24
+ r.setAttribute("target", "_blank"), r.setAttribute("rel", "noopener noreferrer");
25
+ }
26
+ }, R = (e) => {
27
+ e.preventDefault(), e.stopPropagation();
28
+ }, s = /* @__PURE__ */ new WeakSet(), c = "guidoPreviewGuarded", g = () => ({ guardPreviewInteractions: (r) => {
4
29
  try {
5
- const e = r.contentDocument;
6
- if (!e)
30
+ const t = r.contentDocument;
31
+ if (!t || s.has(t))
7
32
  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);
33
+ delete t.documentElement.dataset[c], E.forEach((n) => {
34
+ t.addEventListener(n, m, !0);
35
+ }), t.addEventListener("submit", R, !0), s.add(t), t.documentElement.dataset[c] = "true";
36
+ } catch (t) {
37
+ console.warn("[usePreviewInteractionGuard] Could not guard preview iframe:", t);
13
38
  }
14
39
  } });
15
40
  export {
16
- a as usePreviewInteractionGuard
41
+ g as usePreviewInteractionGuard
17
42
  };
@@ -1,22 +1,23 @@
1
- import { getRecommendationFeedSourceMaps as I, URLS as R } from "../enums/extensions/recommendationBlock.js";
2
- import { MinDeviceViewport as C, DefaultPadding as b } from "../enums/recommendation.js";
3
- import { useRecommendationExtensionStore as l } from "../extensions/Blocks/Recommendation/store/recommendation.js";
1
+ import { getRecommendationFeedSourceMaps as I, URLS as C } from "../enums/extensions/recommendationBlock.js";
2
+ import { MinDeviceViewport as R, DefaultPadding as b } from "../enums/recommendation.js";
3
+ import { useRecommendationExtensionStore as g } from "../extensions/Blocks/Recommendation/store/recommendation.js";
4
4
  import { generateCompleteFilterQuery as h } from "../extensions/Blocks/Recommendation/utils/filterUtil.js";
5
- import { getPartnerRecommendationParams as y } from "../extensions/Blocks/Recommendation/utils/partnerCustomizations.js";
6
- import { useConfigStore as x } from "../stores/config.js";
7
- const k = () => ({
5
+ import { getPartnerRecommendationParams as S } from "../extensions/Blocks/Recommendation/utils/partnerCustomizations.js";
6
+ import { resolveStrategyUrl as T, buildStrategyUrlValues as x } from "../extensions/Blocks/Recommendation/utils/strategyUrl.js";
7
+ import { useConfigStore as P } from "../stores/config.js";
8
+ const L = () => ({
8
9
  calculateCardWidth: ({
9
- mobileLeftPadding: a,
10
- mobileRightPadding: s,
11
- cardsInRow: c,
12
- unresponsive: o
10
+ mobileLeftPadding: i,
11
+ mobileRightPadding: c,
12
+ cardsInRow: o,
13
+ unresponsive: s
13
14
  }) => {
14
- const r = o ? c : 1, e = a + s + (r - 1) * b;
15
- return (C - e) / r;
15
+ const n = s ? o : 1, e = i + c + (n - 1) * b;
16
+ return (R - e) / n;
16
17
  },
17
- getRecommendationCampaignData: (a) => {
18
- const s = l(), c = Number(a), o = s.blockStates[c];
19
- if (!o)
18
+ getRecommendationCampaignData: (i) => {
19
+ const c = g(), o = Number(i), s = c.blockStates[o];
20
+ if (!s)
20
21
  return {
21
22
  textTrimming: !1,
22
23
  orientation: "vertical",
@@ -29,49 +30,64 @@ const k = () => ({
29
30
  discountBeforeTextValue: "",
30
31
  discountAfterTextValue: ""
31
32
  };
32
- const { recommendationConfigs: r } = o, e = r.orientation === "grid" ? "vertical" : "horizontal";
33
+ const { recommendationConfigs: n } = s, e = n.orientation === "grid" ? "vertical" : "horizontal";
33
34
  return {
34
- textTrimming: r.textTrimming,
35
+ textTrimming: n.textTrimming,
35
36
  orientation: e,
36
37
  mobileLeftPadding: 0,
37
38
  mobileRightPadding: 0,
38
- cardsInRow: r.cardsInRow,
39
- unresponsive: r.unresponsive,
39
+ cardsInRow: n.cardsInRow,
40
+ unresponsive: n.unresponsive,
40
41
  priceBeforeTextValue: "",
41
42
  priceAfterTextValue: "",
42
43
  discountBeforeTextValue: "",
43
44
  discountAfterTextValue: ""
44
45
  };
45
46
  },
46
- buildCampaignUrl: (a, s) => {
47
+ buildCampaignUrl: (i, c) => {
47
48
  var m;
48
- const c = l(), o = x(), r = Number(a);
49
+ const o = g(), s = P(), n = Number(i);
49
50
  let e;
50
- if (s)
51
- e = s;
51
+ if (c)
52
+ e = c;
52
53
  else {
53
- const i = c.blockStates[r];
54
- if (!i)
54
+ const r = o.blockStates[n];
55
+ if (!r)
55
56
  return "";
56
- const { recommendationConfigs: n } = i;
57
+ const { recommendationConfigs: a } = r;
57
58
  e = {
58
- strategy: n.strategy,
59
- language: n.language,
60
- currencyCode: n.currencySettings.value,
61
- size: n.size,
62
- productIds: n.productIds,
63
- filters: n.filters,
64
- shuffleProducts: n.shuffleProducts
59
+ strategy: a.strategy,
60
+ strategyId: a.strategyId,
61
+ language: a.language,
62
+ currencyCode: a.currencySettings.value,
63
+ size: a.size,
64
+ productIds: a.productIds,
65
+ filters: a.filters,
66
+ shuffleProducts: a.shuffleProducts
65
67
  };
66
68
  }
67
- const f = ((m = I().find((i) => i.key === e.strategy)) == null ? void 0 : m.path) || "", t = new URLSearchParams();
68
- t.set("locale", e.language), t.set("currency", e.currencyCode), t.set("partnerName", o.partnerName), t.set("size", e.size), t.set("details", "true"), t.set("campaignId", o.variationId), e.strategy === "manualMerchandising" ? t.set("productId", e.productIds.join(",")) : e.strategy === "similarViewed" && t.set("productId", "{itemId}"), e.strategy === "userBased" && t.set("userId", "{user_id}");
69
- const g = e.filters.filter((i) => i.isValid), d = h(g);
70
- d && t.set("filter", d), e.shuffleProducts && t.set("shuffle", "true"), Object.entries(y(o.partnerName, e.strategy)).forEach(([i, n]) => t.set(i, n));
71
- const p = decodeURIComponent(t.toString()), u = `${R.RECOMMENDATION_API_URL}/v2/${f}?${p}`;
72
- return c.recommendationCampaignUrls[a] = u, u;
69
+ const d = e.strategyId ? o.strategyUrlTemplates[e.strategyId] : "";
70
+ if (d) {
71
+ const r = T(
72
+ d,
73
+ x({
74
+ language: e.language,
75
+ currencyCode: e.currencyCode,
76
+ size: e.size,
77
+ strategyId: e.strategyId
78
+ }),
79
+ "compile"
80
+ );
81
+ return o.recommendationCampaignUrls[i] = r, r;
82
+ }
83
+ const f = ((m = I().find((r) => r.key === e.strategy)) == null ? void 0 : m.path) || "", t = new URLSearchParams();
84
+ t.set("locale", e.language), t.set("currency", e.currencyCode), t.set("partnerName", s.partnerName), t.set("size", e.size), t.set("details", "true"), t.set("campaignId", s.variationId), e.strategy === "manualMerchandising" ? t.set("productId", e.productIds.join(",")) : e.strategy === "similarViewed" && t.set("productId", "{itemId}"), e.strategy === "userBased" && t.set("userId", "{user_id}");
85
+ const p = e.filters.filter((r) => r.isValid), l = h(p);
86
+ l && t.set("filter", l), e.shuffleProducts && t.set("shuffle", "true"), Object.entries(S(s.partnerName, e.strategy)).forEach(([r, a]) => t.set(r, a));
87
+ const y = decodeURIComponent(t.toString()), u = `${C.RECOMMENDATION_API_URL}/v2/${f}?${y}`;
88
+ return o.recommendationCampaignUrls[i] = u, u;
73
89
  }
74
90
  });
75
91
  export {
76
- k as useRecommendation
92
+ L as useRecommendation
77
93
  };
@@ -1,111 +1,112 @@
1
- import { BLOCK_ROOT_SELECTOR as S, CURRENCY_ATTR as p, CONTAINER_SELECTOR as O } from "../extensions/Blocks/Recommendation/constants/selectors.js";
2
- import { useRecommendationExtensionStore as h } from "../extensions/Blocks/Recommendation/store/recommendation.js";
3
- import { formatPrice as E } from "../extensions/Blocks/Recommendation/utils/priceFormatter.js";
4
- const f = `${S}[recommendation-id]`, C = ".product-old-price", R = /\{\{(?:reco_)?(\d+_\d+_[a-zA-Z0-9_.]+)\}\}/g, T = new RegExp(
1
+ import { BLOCK_ROOT_SELECTOR as f, CURRENCY_ATTR as A, CONTAINER_SELECTOR as O } from "../extensions/Blocks/Recommendation/constants/selectors.js";
2
+ import { useRecommendationExtensionStore as C } from "../extensions/Blocks/Recommendation/store/recommendation.js";
3
+ import { formatPrice as _ } from "../extensions/Blocks/Recommendation/utils/priceFormatter.js";
4
+ import { BASE_SAFE_URL_SCHEMES as R } from "../utils/urlSchemes.js";
5
+ const S = `${f}[recommendation-id]`, h = ".product-old-price", T = /\{\{(?:reco_)?(\d+_\d+_[a-zA-Z0-9_.]+)\}\}/g, b = new RegExp(
5
6
  "\\{%\\s*if\\s+([\\s\\S]+?)\\s*%\\}([\\s\\S]*?)(?:\\{%\\s*else\\s*%\\}([\\s\\S]*?))?\\{%\\s*endif\\s*%\\}",
6
7
  "g"
7
8
  );
8
- function b(e) {
9
+ function L(e) {
9
10
  return e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
10
11
  }
11
- function _(e) {
12
- var s;
13
- const n = (s = e.replace(/[\u0000-\u0020]+/g, "").toLowerCase().match(/^([a-z][a-z0-9+.-]*):/)) == null ? void 0 : s[1];
14
- return n && n !== "http" && n !== "https" && n !== "mailto" ? "" : e;
12
+ function g(e) {
13
+ var c;
14
+ const i = (c = e.replace(/[\u0000-\u0020]+/g, "").toLowerCase().match(/^([a-z][a-z0-9+.-]*):/)) == null ? void 0 : c[1];
15
+ return i && !R.includes(`${i}:`) ? "" : e;
15
16
  }
16
17
  function N(e) {
17
- const t = e.getAttribute(p.CURRENCY) || "USD", n = e.getAttribute(p.DECIMAL_SEPARATOR) || ".", s = e.getAttribute(p.THOUSAND_SEPARATOR) || ",";
18
+ const t = e.getAttribute(A.CURRENCY) || "USD", i = e.getAttribute(A.DECIMAL_SEPARATOR) || ".", c = e.getAttribute(A.THOUSAND_SEPARATOR) || ",";
18
19
  return {
19
20
  code: t,
20
- symbol: e.getAttribute(p.SYMBOL) || t,
21
- alignment: e.getAttribute(p.ALIGNMENT) === "0" ? "before" : "after",
22
- decimalCount: parseInt(e.getAttribute(p.DECIMAL_COUNT) || "2") || 2,
23
- decimalSeparator: n,
24
- thousandSeparator: s
21
+ symbol: e.getAttribute(A.SYMBOL) || t,
22
+ alignment: e.getAttribute(A.ALIGNMENT) === "0" ? "before" : "after",
23
+ decimalCount: parseInt(e.getAttribute(A.DECIMAL_COUNT) || "2") || 2,
24
+ decimalSeparator: i,
25
+ thousandSeparator: c
25
26
  };
26
27
  }
27
- function g(e, t) {
28
+ function E(e, t) {
28
29
  return (e == null ? void 0 : e[t]) ?? Object.values(e ?? {})[0] ?? 0;
29
30
  }
30
- function L(e, t) {
31
- const n = g(e.original_price, t), s = g(e.price, t), o = n > 0 ? Math.round((n - s) / n * 100) : 0;
32
- return o > 0 ? `${o}%` : "0%";
31
+ function $(e, t) {
32
+ const i = E(e.original_price, t), c = E(e.price, t), n = i > 0 ? Math.round((i - c) / i * 100) : 0;
33
+ return n > 0 ? `${n}%` : "0%";
33
34
  }
34
- function P(e, t, n, s, o, a) {
35
- s.forEach((i, c) => {
36
- const r = (m) => `${n}_${c}_${m}`, u = E({ price: g(i.price, o.code), currency: o }), l = E({ price: g(i.original_price, o.code), currency: o }), d = L(i, o.code);
37
- e.set(r("name"), i.name ?? ""), e.set(r("image_url"), _(i.image_url ?? "")), e.set(r("url"), _(i.url ?? "")), e.set(r("item_id"), i.item_id ?? ""), e.set(r("currency"), ""), e.set(r("price"), u), e.set(r("original_price"), l), e.set(r("discount"), d), e.set(r("omnibus_price"), l), e.set(r("omnibus_discount"), d), a && u === l && t.add(`${n}_${c}`), Object.entries(i.product_attributes ?? {}).forEach(([m, A]) => {
38
- e.set(r(`product_attribute.${m}`), String(A)), e.set(r(m), String(A));
35
+ function P(e, t, i, c, n, a) {
36
+ c.forEach((o, s) => {
37
+ const r = (m) => `${i}_${s}_${m}`, u = _({ price: E(o.price, n.code), currency: n }), l = _({ price: E(o.original_price, n.code), currency: n }), d = $(o, n.code);
38
+ e.set(r("name"), o.name ?? ""), e.set(r("image_url"), g(o.image_url ?? "")), e.set(r("url"), g(o.url ?? "")), e.set(r("item_id"), o.item_id ?? ""), e.set(r("currency"), ""), e.set(r("price"), u), e.set(r("original_price"), l), e.set(r("discount"), d), e.set(r("omnibus_price"), l), e.set(r("omnibus_discount"), d), a && u === l && t.add(`${i}_${s}`), Object.entries(o.product_attributes ?? {}).forEach(([m, p]) => {
39
+ e.set(r(`product_attribute.${m}`), String(p)), e.set(r(m), String(p));
39
40
  });
40
41
  });
41
42
  }
42
- function $(e, t) {
43
- const n = e.match(/^(.+?)\s*(!=|==)\s*"([^"]*)"$/);
44
- if (!n)
43
+ function z(e, t) {
44
+ const i = e.match(/^(.+?)\s*(!=|==)\s*"([^"]*)"$/);
45
+ if (!i)
45
46
  return !0;
46
- const [, s, o, a] = n, i = t.get(s.trim()) ?? "";
47
- return o === "!=" ? i !== a : i === a;
47
+ const [, c, n, a] = i, o = t.get(c.trim()) ?? "";
48
+ return n === "!=" ? o !== a : o === a;
48
49
  }
49
- function z(e, t) {
50
+ function w(e, t) {
50
51
  return e.replace(
51
- T,
52
- (n, s, o, a) => s.split(/\s+and\s+/).every((c) => $(c.trim(), t)) ? o : a ?? ""
52
+ b,
53
+ (i, c, n, a) => c.split(/\s+and\s+/).every((s) => z(s.trim(), t)) ? n : a ?? ""
53
54
  );
54
55
  }
55
- function w(e) {
56
+ function D(e) {
56
57
  let t = e;
57
58
  for (; t.children.length === 1; )
58
59
  [t] = t.children;
59
60
  return t;
60
61
  }
61
- function D(e, t) {
62
- var i;
62
+ function I(e, t) {
63
+ var o;
63
64
  if (!t.size)
64
65
  return e;
65
- const n = e.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), s = new DOMParser().parseFromString(n, "text/html");
66
- s.querySelectorAll(f).forEach((c) => {
67
- const r = Number(c.getAttribute("recommendation-id"));
66
+ const i = e.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), c = new DOMParser().parseFromString(i, "text/html");
67
+ c.querySelectorAll(S).forEach((s) => {
68
+ const r = Number(s.getAttribute("recommendation-id"));
68
69
  if (!Number.isFinite(r))
69
70
  return;
70
- const u = c.querySelectorAll(O);
71
- (u.length ? Array.from(u) : [c]).forEach((d) => {
72
- d.querySelectorAll(C).forEach((m, A) => {
73
- t.has(`${r}_${A}`) && (w(m).textContent = "");
71
+ const u = s.querySelectorAll(O);
72
+ (u.length ? Array.from(u) : [s]).forEach((d) => {
73
+ d.querySelectorAll(h).forEach((m, p) => {
74
+ t.has(`${r}_${p}`) && (D(m).textContent = "");
74
75
  });
75
76
  });
76
77
  });
77
- const o = (i = e.match(/<!DOCTYPE[^>]*>/i)) == null ? void 0 : i[0];
78
- return ((o ? `${o}
79
- ` : "") + s.documentElement.outerHTML).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
78
+ const n = (o = e.match(/<!DOCTYPE[^>]*>/i)) == null ? void 0 : o[0];
79
+ return ((n ? `${n}
80
+ ` : "") + c.documentElement.outerHTML).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
80
81
  }
81
- function I(e) {
82
+ function y(e) {
82
83
  if (!e || !e.includes("recommendation-block-v2"))
83
84
  return e;
84
- const t = h(), n = new DOMParser().parseFromString(e, "text/html"), s = Array.from(n.querySelectorAll(f)), o = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set();
85
- if (s.forEach((c) => {
85
+ const t = C(), i = new DOMParser().parseFromString(e, "text/html"), c = Array.from(i.querySelectorAll(S)), n = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set();
86
+ if (c.forEach((s) => {
86
87
  var l;
87
- const r = Number(c.getAttribute("recommendation-id"));
88
+ const r = Number(s.getAttribute("recommendation-id"));
88
89
  if (!Number.isFinite(r))
89
90
  return;
90
91
  const u = ((l = t.blockStates[r]) == null ? void 0 : l.recommendationProducts) ?? [];
91
92
  u.length && P(
92
- o,
93
+ n,
93
94
  a,
94
95
  r,
95
96
  u,
96
- N(c),
97
- c.getAttribute("hide-price") === "true"
97
+ N(s),
98
+ s.getAttribute("hide-price") === "true"
98
99
  );
99
- }), !o.size)
100
+ }), !n.size)
100
101
  return e;
101
- let i = D(e, a);
102
- return i = i.replace(
103
- R,
104
- (c, r) => o.has(r) ? b(o.get(r)) : c
105
- ), i = z(i, o), i;
102
+ let o = I(e, a);
103
+ return o = o.replace(
104
+ T,
105
+ (s, r) => n.has(r) ? L(n.get(r)) : s
106
+ ), o = w(o, n), o;
106
107
  }
107
- const q = () => ({ substituteRecommendationPreview: I });
108
+ const q = () => ({ substituteRecommendationPreview: y });
108
109
  export {
109
- I as substituteRecommendationPreview,
110
+ y as substituteRecommendationPreview,
110
111
  q as useRecommendationPreview
111
112
  };
@@ -0,0 +1,16 @@
1
+ import { parseJsonField as i } from "../utils/genericUtil.js";
2
+ import { ref as n, computed as e } from "vue";
3
+ const r = 2;
4
+ function m(u) {
5
+ const l = n(r), t = n(!0), s = e(
6
+ () => i(u(), {})
7
+ ), o = e(() => Object.keys(s.value).length), c = e(() => o.value > 0), a = e(() => o.value > r);
8
+ return { filterQuery: e(() => Object.fromEntries(
9
+ Object.entries(s.value).slice(0, l.value)
10
+ )), hasAnyFilter: c, canToggle: a, isCollapsed: t, toggleMore: () => {
11
+ t.value = !t.value, l.value = t.value ? r : o.value;
12
+ } };
13
+ }
14
+ export {
15
+ m as useStrategyFilters
16
+ };
@@ -1,6 +1,6 @@
1
1
  import { BlockId as f } from "../../enums/block.js";
2
- import { useTemplateStore as b } from "../../stores/template.js";
3
- import { mapComposition as y } from "./recommendation/compositionMapper.js";
2
+ import { useTemplateStore as y } from "../../stores/template.js";
3
+ import { mapComposition as b } from "./recommendation/compositionMapper.js";
4
4
  import { extractCurrencyFromBlock as v, extractTitleText as C, extractCardBgColor as M, isPartnerManagedBlock as S } from "./recommendation/extractors.js";
5
5
  import { buildBlockHtml as w } from "./recommendation/htmlBuilder.js";
6
6
  import { parseRecommendationId as x, parseLegacyConfig as R } from "./recommendation/parseLegacyConfig.js";
@@ -20,8 +20,11 @@ function B(i, t, a) {
20
20
  ), !1;
21
21
  const n = a[String(o)] ?? {
22
22
  currencySettings: v(t)
23
- }, c = T(n, r, o), e = y((d = r.composition) == null ? void 0 : d.variables), l = C(t), g = M(t), p = {
23
+ }, c = T(n, r, o), e = b((d = r.composition) == null ? void 0 : d.variables), l = C(t), g = M(t), p = {
24
24
  ...c,
25
+ // Legacy blocks predate RRS and carry no strategy reference. Migrated
26
+ // blocks keep running on their algorithm until a strategy is assigned.
27
+ strategyId: "",
25
28
  composition: e.composition,
26
29
  visibility: e.visibility,
27
30
  textTrimming: e.anyTextTrimming
@@ -56,7 +59,7 @@ function B(i, t, a) {
56
59
  function q(i, t = {}) {
57
60
  const a = new DOMParser(), o = a.parseFromString(i, "text/html"), r = Array.from(o.querySelectorAll(h));
58
61
  try {
59
- b().$patch((e) => {
62
+ y().$patch((e) => {
60
63
  e.migrations = {
61
64
  ...e.migrations,
62
65
  [f.Recommendation]: r.length
@@ -1,5 +1,6 @@
1
- const t = "tr-TR", L = "default";
1
+ const t = "tr-TR", T = "default", L = "UTC";
2
2
  export {
3
- L as DEFAULT,
4
- t as DEFAULT_LOCALE
3
+ T as DEFAULT,
4
+ t as DEFAULT_LOCALE,
5
+ L as DEFAULT_TZ
5
6
  };