@useinsider/guido 3.5.1 → 3.6.0-beta.3eeb930
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.
- package/dist/composables/useRecommendation.js +33 -36
- package/dist/composables/useStripo.js +12 -11
- package/dist/config/compiler/utils/recommendationCompilerUtils.js +84 -78
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +13 -9
- package/dist/extensions/Blocks/Recommendation/utils/partnerCustomizations.js +21 -0
- package/dist/package.json.js +1 -1
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.test.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/partnerCustomizations.d.ts +7 -0
- package/package.json +2 -2
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import { getRecommendationFeedSourceMaps as I, URLS as
|
|
2
|
-
import { MinDeviceViewport as
|
|
3
|
-
import { useRecommendationExtensionStore as
|
|
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";
|
|
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";
|
|
5
6
|
import { useConfigStore as x } from "../stores/config.js";
|
|
6
|
-
const
|
|
7
|
+
const k = () => ({
|
|
7
8
|
calculateCardWidth: ({
|
|
8
|
-
mobileLeftPadding:
|
|
9
|
-
mobileRightPadding:
|
|
9
|
+
mobileLeftPadding: a,
|
|
10
|
+
mobileRightPadding: s,
|
|
10
11
|
cardsInRow: c,
|
|
11
|
-
unresponsive:
|
|
12
|
+
unresponsive: o
|
|
12
13
|
}) => {
|
|
13
|
-
const r =
|
|
14
|
-
return (
|
|
14
|
+
const r = o ? c : 1, e = a + s + (r - 1) * b;
|
|
15
|
+
return (C - e) / r;
|
|
15
16
|
},
|
|
16
|
-
getRecommendationCampaignData: (
|
|
17
|
-
const
|
|
18
|
-
if (!
|
|
17
|
+
getRecommendationCampaignData: (a) => {
|
|
18
|
+
const s = l(), c = Number(a), o = s.blockStates[c];
|
|
19
|
+
if (!o)
|
|
19
20
|
return {
|
|
20
21
|
textTrimming: !1,
|
|
21
22
|
orientation: "vertical",
|
|
@@ -28,7 +29,7 @@ const w = () => ({
|
|
|
28
29
|
discountBeforeTextValue: "",
|
|
29
30
|
discountAfterTextValue: ""
|
|
30
31
|
};
|
|
31
|
-
const { recommendationConfigs: r } =
|
|
32
|
+
const { recommendationConfigs: r } = o, e = r.orientation === "grid" ? "vertical" : "horizontal";
|
|
32
33
|
return {
|
|
33
34
|
textTrimming: r.textTrimming,
|
|
34
35
|
orientation: e,
|
|
@@ -42,39 +43,35 @@ const w = () => ({
|
|
|
42
43
|
discountAfterTextValue: ""
|
|
43
44
|
};
|
|
44
45
|
},
|
|
45
|
-
buildCampaignUrl: (
|
|
46
|
-
var
|
|
47
|
-
const c =
|
|
46
|
+
buildCampaignUrl: (a, s) => {
|
|
47
|
+
var m;
|
|
48
|
+
const c = l(), o = x(), r = Number(a);
|
|
48
49
|
let e;
|
|
49
|
-
if (
|
|
50
|
-
e =
|
|
50
|
+
if (s)
|
|
51
|
+
e = s;
|
|
51
52
|
else {
|
|
52
53
|
const i = c.blockStates[r];
|
|
53
54
|
if (!i)
|
|
54
55
|
return "";
|
|
55
|
-
const { recommendationConfigs:
|
|
56
|
+
const { recommendationConfigs: n } = i;
|
|
56
57
|
e = {
|
|
57
|
-
strategy:
|
|
58
|
-
language:
|
|
59
|
-
currencyCode:
|
|
60
|
-
size:
|
|
61
|
-
productIds:
|
|
62
|
-
filters:
|
|
63
|
-
shuffleProducts:
|
|
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
|
|
64
65
|
};
|
|
65
66
|
}
|
|
66
|
-
const f = ((
|
|
67
|
-
|
|
68
|
-
const i = parseInt(e.size) || 6;
|
|
69
|
-
t.set("productId", e.productIds.slice(0, i).join(","));
|
|
70
|
-
} else e.strategy === "similarViewed" && t.set("productId", "{itemId}");
|
|
71
|
-
e.strategy === "userBased" && t.set("userId", "{user_id}");
|
|
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}");
|
|
72
69
|
const g = e.filters.filter((i) => i.isValid), d = h(g);
|
|
73
|
-
d && t.set("filter", d), e.shuffleProducts && t.set("shuffle", "true");
|
|
74
|
-
const p = decodeURIComponent(t.toString()), u = `${
|
|
75
|
-
return c.recommendationCampaignUrls[
|
|
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;
|
|
76
73
|
}
|
|
77
74
|
});
|
|
78
75
|
export {
|
|
79
|
-
|
|
76
|
+
k as useRecommendation
|
|
80
77
|
};
|
|
@@ -9,12 +9,12 @@ import { localePatch as H } from "../config/i18n/index.js";
|
|
|
9
9
|
import { useStripoApi as O } from "../services/stripoApi.js";
|
|
10
10
|
import j from "../static/styles/customEditorStyle.css.js";
|
|
11
11
|
import { useEditorStore as E } from "../stores/editor.js";
|
|
12
|
-
import { dynamicContentToMergeTags as
|
|
13
|
-
import
|
|
12
|
+
import { dynamicContentToMergeTags as z } from "../utils/genericUtil.js";
|
|
13
|
+
import L from "../package.json.js";
|
|
14
14
|
const se = (C, l) => {
|
|
15
|
-
const { features: c, template: h, isFeatureEnabled: u } = P(), { handleError: m } = x(), { getToken: w, getCustomFonts: b, getSyncModulesStatus: k } = O(), { handleEvent:
|
|
15
|
+
const { features: c, template: h, isFeatureEnabled: u } = P(), { handleError: m } = x(), { getToken: w, getCustomFonts: b, getSyncModulesStatus: k } = O(), { handleEvent: F } = q(), { getStripoBlocksConfig: B } = I(), T = async (i, r = [], s = !1) => {
|
|
16
16
|
var g, S, y;
|
|
17
|
-
const e = E(), { html: p, css: a } = i, { baseBlocks: o, extensions: d } = await
|
|
17
|
+
const e = E(), { html: p, css: a } = i, { baseBlocks: o, extensions: d } = await B(), f = ((g = c.value) == null ? void 0 : g.displayConditions) ?? !0, _ = ((S = c.value) == null ? void 0 : S.modulesDisabled) ?? !1, v = ((y = h.value) == null ? void 0 : y.forceRecreate) ?? !1;
|
|
18
18
|
window.UIEditor.initEditor(
|
|
19
19
|
document.querySelector("#guido-editor"),
|
|
20
20
|
{
|
|
@@ -35,7 +35,7 @@ const se = (C, l) => {
|
|
|
35
35
|
conditionsEnabled: f,
|
|
36
36
|
customConditionsEnabled: f,
|
|
37
37
|
enableXSSSecurity: !0,
|
|
38
|
-
modulesDisabled:
|
|
38
|
+
modulesDisabled: _,
|
|
39
39
|
syncModulesEnabled: s,
|
|
40
40
|
messageSettingsEnabled: !0,
|
|
41
41
|
displayGmailAnnotations: !0,
|
|
@@ -43,6 +43,7 @@ const se = (C, l) => {
|
|
|
43
43
|
displayTitle: !1,
|
|
44
44
|
displayUTM: !1,
|
|
45
45
|
selectElementAfterDrop: !0,
|
|
46
|
+
sameFontSizeForOutlook: !0,
|
|
46
47
|
allowedScriptSourceDomains: "https://email-static.useinsider.com https://edge.fullstory.com https://rs.fullstory.com",
|
|
47
48
|
...o ? { baseBlocks: o } : {},
|
|
48
49
|
editorFonts: {
|
|
@@ -52,7 +53,7 @@ const se = (C, l) => {
|
|
|
52
53
|
},
|
|
53
54
|
mergeTags: [
|
|
54
55
|
{
|
|
55
|
-
entries:
|
|
56
|
+
entries: z(
|
|
56
57
|
l.preselectedDynamicContentList,
|
|
57
58
|
u("liquidSyntax")
|
|
58
59
|
)
|
|
@@ -88,7 +89,7 @@ const se = (C, l) => {
|
|
|
88
89
|
onDataChanged() {
|
|
89
90
|
e.hasChanges = !0;
|
|
90
91
|
},
|
|
91
|
-
onEvent:
|
|
92
|
+
onEvent: F,
|
|
92
93
|
ignoreClickOutsideSelectors: [
|
|
93
94
|
"#guido-dynamic-content-modal",
|
|
94
95
|
".in-on-board-wrapper",
|
|
@@ -98,13 +99,13 @@ const se = (C, l) => {
|
|
|
98
99
|
localePatch: H
|
|
99
100
|
}
|
|
100
101
|
);
|
|
101
|
-
},
|
|
102
|
+
}, V = (i) => new Promise((r, s) => {
|
|
102
103
|
var d;
|
|
103
104
|
if (document.getElementById("UiEditorScript")) {
|
|
104
105
|
i(), r();
|
|
105
106
|
return;
|
|
106
107
|
}
|
|
107
|
-
const e =
|
|
108
|
+
const e = L.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
|
|
108
109
|
o.id = "UiEditorScript", o.type = "module", o.src = a, o.onload = () => {
|
|
109
110
|
i(), r();
|
|
110
111
|
}, o.onerror = () => {
|
|
@@ -112,12 +113,12 @@ const se = (C, l) => {
|
|
|
112
113
|
}, document.body.appendChild(o);
|
|
113
114
|
});
|
|
114
115
|
return { initPlugin: async (i) => {
|
|
115
|
-
await
|
|
116
|
+
await V(async () => {
|
|
116
117
|
const r = E(), [s, e] = await Promise.all([
|
|
117
118
|
b(),
|
|
118
119
|
k()
|
|
119
120
|
]);
|
|
120
|
-
r.syncModulesEnabled = e, await
|
|
121
|
+
r.syncModulesEnabled = e, await T(i, s, e);
|
|
121
122
|
});
|
|
122
123
|
} };
|
|
123
124
|
};
|
|
@@ -1,127 +1,133 @@
|
|
|
1
|
-
import { useConfig as
|
|
2
|
-
import { useRecommendation as
|
|
3
|
-
import { CSS_CLASS_RECO_BUTTON as
|
|
4
|
-
import { useRecommendationExtensionStore as
|
|
5
|
-
function y(r,
|
|
6
|
-
const
|
|
7
|
-
return o === "before" ? `${t} ${
|
|
1
|
+
import { useConfig as g } from "../../../composables/useConfig.js";
|
|
2
|
+
import { useRecommendation as _ } from "../../../composables/useRecommendation.js";
|
|
3
|
+
import { CSS_CLASS_RECO_BUTTON as q } from "../../../extensions/Blocks/Recommendation/constants/selectors.js";
|
|
4
|
+
import { useRecommendationExtensionStore as C } from "../../../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
5
|
+
function y(r, n, e, o, i = "") {
|
|
6
|
+
const c = `{{${i}${r}_${n}_${e}}}`, t = `{{${i}${r}_${n}_currency}}`;
|
|
7
|
+
return o === "before" ? `${t} ${c}` : `${c} ${t}`;
|
|
8
8
|
}
|
|
9
|
-
function
|
|
10
|
-
|
|
9
|
+
function A(r) {
|
|
10
|
+
let n = r;
|
|
11
|
+
for (; n.children.length === 1; )
|
|
12
|
+
[n] = n.children;
|
|
13
|
+
return n;
|
|
14
|
+
}
|
|
15
|
+
function f(r, n, e, o, i, c) {
|
|
16
|
+
switch (n) {
|
|
11
17
|
case "productImage": {
|
|
12
18
|
const t = r.querySelector("img");
|
|
13
|
-
t && (t.setAttribute("src", `{{${
|
|
14
|
-
const
|
|
15
|
-
|
|
19
|
+
t && (t.setAttribute("src", `{{${c}${e}_${o}_image_url}}`), t.setAttribute("alt", `{{${c}${e}_${o}_name}}`));
|
|
20
|
+
const s = r.querySelector("a");
|
|
21
|
+
s && (s.setAttribute("href", `{{${c}${e}_${o}_url}}`), s.classList.add(q));
|
|
16
22
|
break;
|
|
17
23
|
}
|
|
18
24
|
case "productName": {
|
|
19
25
|
const t = r.querySelector("p");
|
|
20
26
|
if (t) {
|
|
21
|
-
const
|
|
22
|
-
|
|
27
|
+
const s = t.querySelector("strong") || t;
|
|
28
|
+
s.textContent = `{{${c}${e}_${o}_name}}`;
|
|
23
29
|
}
|
|
24
30
|
break;
|
|
25
31
|
}
|
|
26
32
|
case "productPrice": {
|
|
27
33
|
const t = r.querySelector("p");
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
t && (A(t).textContent = y(
|
|
35
|
+
e,
|
|
36
|
+
o,
|
|
37
|
+
"price",
|
|
38
|
+
i,
|
|
39
|
+
c
|
|
40
|
+
));
|
|
32
41
|
break;
|
|
33
42
|
}
|
|
34
43
|
case "productOldPrice": {
|
|
35
44
|
const t = r.querySelector("p");
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
n
|
|
44
|
-
), t.setAttribute("product-attr", "discount");
|
|
45
|
-
}
|
|
45
|
+
t && (A(t).textContent = y(
|
|
46
|
+
e,
|
|
47
|
+
o,
|
|
48
|
+
"original_price",
|
|
49
|
+
i,
|
|
50
|
+
c
|
|
51
|
+
), t.setAttribute("product-attr", "discount"));
|
|
46
52
|
break;
|
|
47
53
|
}
|
|
48
54
|
case "productButton": {
|
|
49
55
|
const t = r.querySelector("a");
|
|
50
|
-
t && t.setAttribute("href", `{{${
|
|
56
|
+
t && t.setAttribute("href", `{{${c}${e}_${o}_url}}`);
|
|
51
57
|
break;
|
|
52
58
|
}
|
|
53
59
|
case "productOmnibusPrice": {
|
|
54
60
|
const t = r.querySelector(".omnibus-price-value");
|
|
55
61
|
if (t) {
|
|
56
|
-
t.textContent = `{{${
|
|
57
|
-
const
|
|
58
|
-
|
|
62
|
+
t.textContent = `{{${c}${e}_${o}_omnibus_price}}`;
|
|
63
|
+
const s = t.closest("p");
|
|
64
|
+
s && (s.setAttribute("product-attr", "omnibus_price"), s.setAttribute("composition", "true"));
|
|
59
65
|
}
|
|
60
66
|
break;
|
|
61
67
|
}
|
|
62
68
|
case "productOmnibusDiscount": {
|
|
63
69
|
const t = r.querySelector(".omnibus-discount-value");
|
|
64
70
|
if (t) {
|
|
65
|
-
t.textContent = `{{${
|
|
66
|
-
const
|
|
67
|
-
|
|
71
|
+
t.textContent = `{{${c}${e}_${o}_omnibus_discount}}`;
|
|
72
|
+
const s = t.closest("p");
|
|
73
|
+
s && (s.setAttribute("product-attr", "omnibus_discount"), s.setAttribute("composition", "true"));
|
|
68
74
|
}
|
|
69
75
|
break;
|
|
70
76
|
}
|
|
71
77
|
default: {
|
|
72
78
|
const t = r.getAttribute("product-attr") ? r : r.querySelector("[product-attr]");
|
|
73
79
|
if (t) {
|
|
74
|
-
const
|
|
80
|
+
const s = t.getAttribute("product-attr"), a = t.querySelector("p");
|
|
75
81
|
if (a) {
|
|
76
82
|
const u = a.querySelector("strong") || a;
|
|
77
|
-
u.textContent = `{{${
|
|
83
|
+
u.textContent = `{{${c}${e}_${o}_${s}}}`;
|
|
78
84
|
}
|
|
79
85
|
}
|
|
80
86
|
break;
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
|
-
function
|
|
85
|
-
r.querySelectorAll(".recommendation-product-row").forEach((
|
|
86
|
-
|
|
90
|
+
function w(r, n, e, o) {
|
|
91
|
+
r.querySelectorAll(".recommendation-product-row").forEach((c, t) => {
|
|
92
|
+
c.querySelectorAll("[data-attribute-type]").forEach((a) => {
|
|
87
93
|
const u = a.getAttribute("data-attribute-type") || "", p = a.querySelectorAll(".attribute-cell");
|
|
88
94
|
p.length > 0 ? p.forEach((l) => {
|
|
89
|
-
f(l, u,
|
|
90
|
-
}) : f(a, u,
|
|
95
|
+
f(l, u, n, t, e, o);
|
|
96
|
+
}) : f(a, u, n, t, e, o);
|
|
91
97
|
});
|
|
92
98
|
});
|
|
93
99
|
}
|
|
94
|
-
function E(r,
|
|
95
|
-
const
|
|
96
|
-
if (!
|
|
100
|
+
function E(r, n, e, o) {
|
|
101
|
+
const i = r.querySelectorAll(".recommendation-product-row");
|
|
102
|
+
if (!i.length)
|
|
97
103
|
return;
|
|
98
|
-
const [
|
|
99
|
-
|
|
104
|
+
const [c] = i, t = c.querySelector("[data-attribute-type]"), s = t ? t.querySelectorAll(".attribute-cell").length : 1;
|
|
105
|
+
i.forEach((a, u) => {
|
|
100
106
|
a.querySelectorAll("[data-attribute-type]").forEach((l) => {
|
|
101
107
|
const d = l.getAttribute("data-attribute-type") || "";
|
|
102
|
-
l.querySelectorAll(".attribute-cell").forEach((
|
|
103
|
-
const
|
|
104
|
-
f(
|
|
108
|
+
l.querySelectorAll(".attribute-cell").forEach((h, $) => {
|
|
109
|
+
const S = u * s + $;
|
|
110
|
+
f(h, d, n, S, e, o);
|
|
105
111
|
});
|
|
106
112
|
});
|
|
107
113
|
});
|
|
108
114
|
}
|
|
109
|
-
function
|
|
110
|
-
r.querySelectorAll(".ins-recommendation-product-container").forEach((
|
|
111
|
-
E(
|
|
115
|
+
function R(r, n, e, o) {
|
|
116
|
+
r.querySelectorAll(".ins-recommendation-product-container").forEach((c) => {
|
|
117
|
+
E(c, n, e, o);
|
|
112
118
|
});
|
|
113
119
|
}
|
|
114
|
-
function
|
|
115
|
-
const o = r.getAttribute("data-layout") || "grid",
|
|
116
|
-
o === "list" ?
|
|
120
|
+
function P(r, n, e) {
|
|
121
|
+
const o = r.getAttribute("data-layout") || "grid", i = r.getAttribute("currency-alignment") || "after";
|
|
122
|
+
o === "list" ? w(r, n, i, e) : R(r, n, i, e);
|
|
117
123
|
}
|
|
118
|
-
function b(r,
|
|
119
|
-
const o = new RegExp(`${
|
|
120
|
-
return
|
|
124
|
+
function b(r, n, e) {
|
|
125
|
+
const o = new RegExp(`${n}\\s*:\\s*(\\d+)\\s*px`, "i"), i = r.match(o);
|
|
126
|
+
return i ? parseInt(i[1]) : e;
|
|
121
127
|
}
|
|
122
|
-
function
|
|
128
|
+
function T(r, n) {
|
|
123
129
|
let e = r.parentElement;
|
|
124
|
-
for (; e && e !==
|
|
130
|
+
for (; e && e !== n; ) {
|
|
125
131
|
if (e.tagName === "TD") {
|
|
126
132
|
const o = e.getAttribute("width");
|
|
127
133
|
if (o && o.endsWith("%") && parseFloat(o) < 100)
|
|
@@ -131,40 +137,40 @@ function P(r, c) {
|
|
|
131
137
|
}
|
|
132
138
|
return null;
|
|
133
139
|
}
|
|
134
|
-
function
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
if (
|
|
140
|
+
function v(r) {
|
|
141
|
+
const n = r.getAttribute("style") || "", e = b(n, "width", 600), o = b(n, "padding", 0) * 2, i = Math.max(0, e - o);
|
|
142
|
+
i !== 0 && r.querySelectorAll("img.adapt-img").forEach((c) => {
|
|
143
|
+
if (c.hasAttribute("width"))
|
|
138
144
|
return;
|
|
139
|
-
const t =
|
|
145
|
+
const t = T(c, r);
|
|
140
146
|
if (!t)
|
|
141
147
|
return;
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
const d =
|
|
148
|
+
const s = t.getAttribute("width"), a = parseFloat(s), u = b(t.getAttribute("style") || "", "padding", 0) * 2, p = Math.floor(i * a / 100), l = Math.max(1, p - u);
|
|
149
|
+
c.setAttribute("width", String(l));
|
|
150
|
+
const d = c.getAttribute("style") || "";
|
|
145
151
|
if (!/\bwidth\s*:\s*\d/i.test(d)) {
|
|
146
152
|
const m = d && !d.trim().endsWith(";") ? "; " : "";
|
|
147
|
-
|
|
153
|
+
c.setAttribute("style", `${d}${m}width: ${l}px`);
|
|
148
154
|
}
|
|
149
155
|
});
|
|
150
156
|
}
|
|
151
|
-
function
|
|
157
|
+
function O(r, n) {
|
|
152
158
|
const e = r.match(/<!DOCTYPE[^>]*>/i);
|
|
153
159
|
return (e ? `${e[0]}
|
|
154
|
-
` : "") +
|
|
160
|
+
` : "") + n.documentElement.outerHTML;
|
|
155
161
|
}
|
|
156
162
|
function N(r) {
|
|
157
|
-
const
|
|
163
|
+
const n = r.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), e = new DOMParser().parseFromString(n, "text/html"), o = e.querySelectorAll(".recommendation-block-v2");
|
|
158
164
|
if (!o.length)
|
|
159
165
|
return r;
|
|
160
|
-
const { buildCampaignUrl:
|
|
161
|
-
|
|
162
|
-
const { isFeatureEnabled: t } =
|
|
166
|
+
const { buildCampaignUrl: i } = _(), c = C();
|
|
167
|
+
c.recommendationCampaignUrls = {};
|
|
168
|
+
const { isFeatureEnabled: t } = g(), s = t("liquidSyntax") ? "reco_" : "";
|
|
163
169
|
return o.forEach((u) => {
|
|
164
170
|
var l, d;
|
|
165
171
|
const p = u.getAttribute("recommendation-id");
|
|
166
|
-
p && ((l = u.parentNode) == null || l.insertBefore(e.createComment("REC_START"), u), (d = u.parentNode) == null || d.insertBefore(e.createComment("REC_END"), u.nextSibling), u.querySelectorAll('[data-visibility="0"]').forEach((m) => m.remove()),
|
|
167
|
-
}),
|
|
172
|
+
p && ((l = u.parentNode) == null || l.insertBefore(e.createComment("REC_START"), u), (d = u.parentNode) == null || d.insertBefore(e.createComment("REC_END"), u.nextSibling), u.querySelectorAll('[data-visibility="0"]').forEach((m) => m.remove()), i(p), P(u, p, s), v(u));
|
|
173
|
+
}), O(n, e).replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}");
|
|
168
174
|
}
|
|
169
175
|
export {
|
|
170
176
|
y as formatPriceVariable,
|
|
@@ -6,8 +6,9 @@ import { DEFAULT_CARDS_IN_ROW as F } from "../constants/layout.js";
|
|
|
6
6
|
import { EXCLUDED_ALGORITHM_IDS as D } from "../constants/defaultConfig.js";
|
|
7
7
|
import { getDefaultProducts as S } from "../templates/utils.js";
|
|
8
8
|
import { generateCompleteFilterQuery as b } from "../utils/filterUtil.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { getPartnerRecommendationParams as v } from "../utils/partnerCustomizations.js";
|
|
10
|
+
import { isFilterValid as w } from "../validation/filterSchema.js";
|
|
11
|
+
import { isConfigValid as N } from "../validation/requiredFields.js";
|
|
11
12
|
const h = y();
|
|
12
13
|
let m = null, u = null, d = null;
|
|
13
14
|
function I() {
|
|
@@ -49,7 +50,7 @@ function k() {
|
|
|
49
50
|
filterSnapshot: null
|
|
50
51
|
};
|
|
51
52
|
}
|
|
52
|
-
const
|
|
53
|
+
const x = () => ({
|
|
53
54
|
recommendationCampaignUrls: {},
|
|
54
55
|
activePredictiveAlgorithms: [],
|
|
55
56
|
languages: {},
|
|
@@ -58,8 +59,8 @@ const N = () => ({
|
|
|
58
59
|
blockStates: {},
|
|
59
60
|
currentRecommendationId: null,
|
|
60
61
|
configVersion: 0
|
|
61
|
-
}),
|
|
62
|
-
state: () =>
|
|
62
|
+
}), T = P("guidoRecommendationExtension", {
|
|
63
|
+
state: () => x(),
|
|
63
64
|
getters: {
|
|
64
65
|
// ====================================================================
|
|
65
66
|
// Proxy Getters — Backward Compatible Access to Current Block State
|
|
@@ -378,7 +379,7 @@ const N = () => ({
|
|
|
378
379
|
const n = [...e.recommendationConfigs.filters];
|
|
379
380
|
n[r] = {
|
|
380
381
|
...t,
|
|
381
|
-
isValid:
|
|
382
|
+
isValid: w(t)
|
|
382
383
|
}, e.recommendationConfigs.filters = n;
|
|
383
384
|
}
|
|
384
385
|
},
|
|
@@ -424,7 +425,7 @@ const N = () => ({
|
|
|
424
425
|
* every block's recommendationConfigs across user edits.
|
|
425
426
|
*/
|
|
426
427
|
hasInvalidBlock() {
|
|
427
|
-
return Object.values(this.blockStates).some((t) => !
|
|
428
|
+
return Object.values(this.blockStates).some((t) => !N(t.recommendationConfigs, this));
|
|
428
429
|
},
|
|
429
430
|
// ====================================================================
|
|
430
431
|
// Per-Block Product Fetching
|
|
@@ -453,7 +454,10 @@ const N = () => ({
|
|
|
453
454
|
details: !0,
|
|
454
455
|
campaignId: o.variationId
|
|
455
456
|
};
|
|
456
|
-
r.strategy === "manualMerchandising" ? a.productId = r.productIds.
|
|
457
|
+
r.strategy === "manualMerchandising" ? a.productId = r.productIds.join(",") : r.strategy === "similarViewed" && (a.productId = "{itemId}"), r.strategy === "userBased" && (a.userId = "{user_id}"), c && (a.filter = c), r.shuffleProducts && (a.shuffle = !0), Object.assign(
|
|
458
|
+
a,
|
|
459
|
+
v(o.partnerName, r.strategy)
|
|
460
|
+
);
|
|
457
461
|
let f;
|
|
458
462
|
try {
|
|
459
463
|
f = await h.fetchRecommendationProducts(i, a);
|
|
@@ -471,5 +475,5 @@ const N = () => ({
|
|
|
471
475
|
}
|
|
472
476
|
});
|
|
473
477
|
export {
|
|
474
|
-
|
|
478
|
+
T as useRecommendationExtensionStore
|
|
475
479
|
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const i = [
|
|
2
|
+
"ozonebg",
|
|
3
|
+
"ozonehr",
|
|
4
|
+
"ozonero",
|
|
5
|
+
"ozoneinfo",
|
|
6
|
+
"babybg",
|
|
7
|
+
"ozongr",
|
|
8
|
+
"iboodat",
|
|
9
|
+
"iboodbe",
|
|
10
|
+
"iboodde",
|
|
11
|
+
"iboodfr",
|
|
12
|
+
"iboodnl",
|
|
13
|
+
"iboodpl"
|
|
14
|
+
], r = ["interencheres", "interencherespreprod"], d = ["lodenfrey", "lodenfreyuat"], c = "manualMerchandising";
|
|
15
|
+
function s(e, n) {
|
|
16
|
+
const o = {};
|
|
17
|
+
return i.includes(e) && (o.excludePurchaseDay = "30", o.userId = "{user_id}"), r.includes(e) && (o.hp = "1"), d.includes(e) && n === c && (o.includeOutOfStockItems = "true"), o;
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
s as getPartnerRecommendationParams
|
|
21
|
+
};
|
package/dist/package.json.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the extra recommendation feed query params for an account, if any.
|
|
3
|
+
* Accounts without customizations get an empty object.
|
|
4
|
+
* @param partnerName Account subdomain (`config.partner.name`)
|
|
5
|
+
* @param strategy Recommendation strategy key of the block
|
|
6
|
+
*/
|
|
7
|
+
export declare function getPartnerRecommendationParams(partnerName: string, strategy: string): Record<string, string>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useinsider/guido",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0-beta.3eeb930",
|
|
4
4
|
"description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
|
|
5
5
|
"main": "./dist/guido.umd.cjs",
|
|
6
6
|
"module": "./dist/library.js",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
},
|
|
93
93
|
"guido": {
|
|
94
94
|
"stripo": {
|
|
95
|
-
"version": "2.
|
|
95
|
+
"version": "2.65.0"
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
}
|