@useinsider/guido 3.14.0 → 3.15.0-beta.166619d
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/useEmailTemplateApplier.js +46 -32
- package/dist/composables/useHtmlValidator.js +111 -106
- package/dist/config/compiler/itemsCompilerRules.js +25 -4
- package/dist/config/compiler/utils/itemsCompilerUtils.js +28 -0
- package/dist/config/migrator/index.js +9 -8
- package/dist/config/migrator/itemsBlockMigrator.js +47 -45
- package/dist/config/migrator/productNameLinkMigrator.js +27 -0
- package/dist/extensions/Blocks/Items/block.js +30 -30
- package/dist/extensions/Blocks/Items/controls/name/trimming.js +16 -16
- package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +26 -22
- package/dist/extensions/Blocks/Items/controls/settingsControl.js +36 -35
- package/dist/extensions/Blocks/Items/template.js +228 -263
- package/dist/extensions/Blocks/Items/utils/nameNode.js +4 -0
- package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +5 -9
- package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +98 -113
- package/dist/extensions/Blocks/Recommendation/recommendation.css.js +21 -0
- package/dist/src/config/compiler/utils/itemsCompilerUtils.d.ts +12 -0
- package/dist/src/config/migrator/productNameLinkMigrator.d.ts +1 -0
- package/dist/src/extensions/Blocks/Items/block.d.ts +1 -1
- package/dist/src/extensions/Blocks/Items/utils/nameNode.d.ts +9 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +5 -0
- package/dist/src/stores/dynamic-content.d.ts +8 -0
- package/dist/src/utils/registerUsedDynamicContent.d.ts +8 -0
- package/dist/src/utils/unwrapProductNameLink.d.ts +15 -0
- package/dist/stores/dynamic-content.js +12 -2
- package/dist/utils/pairProductVariables.js +75 -72
- package/dist/utils/registerUsedDynamicContent.js +23 -0
- package/dist/utils/unwrapProductNameLink.js +37 -0
- package/package.json +1 -1
|
@@ -1,85 +1,88 @@
|
|
|
1
|
-
import { productPairs as
|
|
1
|
+
import { productPairs as q } from "../extensions/Blocks/Items/enums/productEnums.js";
|
|
2
2
|
import { DefaultConfigValues as O } from "../extensions/Blocks/Items/enums/settingsEnums.js";
|
|
3
3
|
import { preserveTextStyles as C } from "./preserveTextStyles.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
import { unwrapProductNameLinks as U } from "./unwrapProductNameLink.js";
|
|
5
|
+
function Y(L) {
|
|
6
|
+
const H = L.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), b = new DOMParser().parseFromString(H, "text/html");
|
|
7
|
+
U(b);
|
|
8
|
+
const R = q.PAIRS_FOR_EXTENSION;
|
|
9
|
+
Object.entries(R).forEach(([r, u]) => {
|
|
10
|
+
b.querySelectorAll(".ins-product-td").forEach((l) => {
|
|
11
|
+
const h = l.getAttribute("data-number") || "1", $ = l.getAttribute("data-type") || "CART_ITEMS";
|
|
12
|
+
l.querySelectorAll(`[product-attr="${r}"]`).forEach((t) => {
|
|
10
13
|
var F, I, w;
|
|
11
|
-
const T = t.getAttribute("data-type") ||
|
|
14
|
+
const T = t.getAttribute("data-type") || $, f = t.getAttribute("data-number") || h, d = u[T];
|
|
12
15
|
if (d)
|
|
13
16
|
switch (r) {
|
|
14
17
|
case "imageSrc": {
|
|
15
|
-
let e = null,
|
|
16
|
-
if (t.tagName === "IMG" ? (e = t,
|
|
18
|
+
let e = null, c = null;
|
|
19
|
+
if (t.tagName === "IMG" ? (e = t, c = e.closest("a")) : (e = t.querySelector("img"), c = t.querySelector("a") || t.closest("a")), !e)
|
|
17
20
|
break;
|
|
18
|
-
const
|
|
19
|
-
if (
|
|
21
|
+
const i = d.DEFAULT, a = d.ATTR;
|
|
22
|
+
if (i && e.src) {
|
|
20
23
|
const o = e.src;
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
return o.includes(
|
|
24
|
-
}) && (e.src = `{{${
|
|
24
|
+
i.some((E) => {
|
|
25
|
+
const s = E.split("/").pop() || "", g = o.split("/").pop() || "";
|
|
26
|
+
return o.includes(E) || o.includes(s) || g === s;
|
|
27
|
+
}) && (e.src = `{{${a}_${f}}}`);
|
|
25
28
|
}
|
|
26
|
-
const n = (I = (F =
|
|
27
|
-
if (n && e.setAttribute("alt", `{{${n}_${
|
|
28
|
-
const o = (w =
|
|
29
|
+
const n = (I = (F = R.name) == null ? void 0 : F[T]) == null ? void 0 : I.ATTR;
|
|
30
|
+
if (n && e.setAttribute("alt", `{{${n}_${f}}}`), c) {
|
|
31
|
+
const o = (w = R.itemLink) == null ? void 0 : w[T];
|
|
29
32
|
if (o) {
|
|
30
|
-
const
|
|
31
|
-
(
|
|
33
|
+
const A = o.HREF, E = o.DEFAULT_HREF || "#!", s = c.href;
|
|
34
|
+
(s === "#" || s === "" || s.endsWith("#!") || s.endsWith(E) || s === `${window.location.href}${E}` || !s || s === window.location.href) && (c.href = `{{${A}_${f}}}`);
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
break;
|
|
35
38
|
}
|
|
36
39
|
case "name": {
|
|
37
|
-
const e = d,
|
|
38
|
-
t.textContent && (t.innerHTML = C(t, `{{${
|
|
40
|
+
const e = d, c = e.ATTR, i = e.DEFAULT_HREF || "#!", a = e.HREF;
|
|
41
|
+
t.textContent && (t.innerHTML = C(t, `{{${c}_${f}}}`));
|
|
39
42
|
const n = t.closest("a") || (t.tagName === "A" ? t : null);
|
|
40
|
-
if (n &&
|
|
41
|
-
const o = n.href,
|
|
42
|
-
(o ===
|
|
43
|
+
if (n && a) {
|
|
44
|
+
const o = n.href, A = `${window.location.href}${i}`;
|
|
45
|
+
(o === A || o.endsWith(i)) && (n.href = `{{${a}_${f}}}`);
|
|
43
46
|
}
|
|
44
47
|
break;
|
|
45
48
|
}
|
|
46
49
|
case "price":
|
|
47
50
|
case "originalPrice": {
|
|
48
|
-
const e = d,
|
|
49
|
-
let
|
|
50
|
-
n ?
|
|
51
|
-
const
|
|
52
|
-
let
|
|
53
|
-
const
|
|
54
|
-
let
|
|
55
|
-
|
|
51
|
+
const e = d, c = t.getAttribute("data-formated"), i = t.getAttribute("data-single_price"), a = c === "true", n = i === "true", o = t.getAttribute("data-curency") || "before";
|
|
52
|
+
let A;
|
|
53
|
+
n ? A = a ? e.SINGLE_PRICE_FORMATTED : e.SINGLE_PRICE : A = a ? e.PRICE_FORMATTED : e.PRICE;
|
|
54
|
+
const E = e.CURRENCY;
|
|
55
|
+
let s = `{{${A}_${f}}}`;
|
|
56
|
+
const g = (t.getAttribute("data-currency_symbol") || "").trim(), N = g !== "" && g !== O.productPriceCurrencySymbolControlValue;
|
|
57
|
+
let m = "";
|
|
58
|
+
N ? m = g : E && (m = `{{${E}_${f}}}`), m && (s = o === "after" ? `${s} ${m}` : `${m} ${s}`), t.innerHTML = C(t, s);
|
|
56
59
|
break;
|
|
57
60
|
}
|
|
58
61
|
case "quantity": {
|
|
59
|
-
const e = d,
|
|
60
|
-
t.textContent && t.textContent.trim() ===
|
|
62
|
+
const e = d, c = e.ATTR, i = e.DEFAULT;
|
|
63
|
+
t.textContent && t.textContent.trim() === i && (t.innerHTML = C(t, `{{${c}_${f}}}`));
|
|
61
64
|
break;
|
|
62
65
|
}
|
|
63
66
|
case "button": {
|
|
64
|
-
const e = d,
|
|
65
|
-
if (
|
|
66
|
-
const n =
|
|
67
|
-
(n === "" || n === "#" || n === o || n.endsWith(
|
|
67
|
+
const e = d, c = e.HREF, i = e.DEFAULT_HREF || "#!", a = t.tagName === "A" ? t : t.querySelector("a");
|
|
68
|
+
if (a) {
|
|
69
|
+
const n = a.href || "", o = `${window.location.href}${i}`;
|
|
70
|
+
(n === "" || n === "#" || n === o || n.endsWith(i) || n.endsWith("#!") || n === window.location.href) && (a.href = `{{${c}_${f}}}`);
|
|
68
71
|
}
|
|
69
72
|
break;
|
|
70
73
|
}
|
|
71
74
|
case "itemLink": {
|
|
72
|
-
const e = d,
|
|
73
|
-
if (
|
|
74
|
-
const n =
|
|
75
|
-
(n === o || n.endsWith(
|
|
75
|
+
const e = d, c = e.HREF, i = e.DEFAULT_HREF || "#!", a = t;
|
|
76
|
+
if (a.href) {
|
|
77
|
+
const n = a.href, o = `${window.location.href}${i}`;
|
|
78
|
+
(n === o || n.endsWith(i)) && (a.href = `{{${c}_${f}}}`);
|
|
76
79
|
}
|
|
77
80
|
break;
|
|
78
81
|
}
|
|
79
82
|
default: {
|
|
80
83
|
if ("ATTR" in d) {
|
|
81
84
|
const e = d.ATTR;
|
|
82
|
-
t.textContent && (t.innerHTML = C(t, `{{${e}_${
|
|
85
|
+
t.textContent && (t.innerHTML = C(t, `{{${e}_${f}}}`));
|
|
83
86
|
}
|
|
84
87
|
break;
|
|
85
88
|
}
|
|
@@ -88,54 +91,54 @@ function V(L) {
|
|
|
88
91
|
});
|
|
89
92
|
});
|
|
90
93
|
const k = H.match(/<!DOCTYPE[^>]*>/i), P = k ? `${k[0]}
|
|
91
|
-
` : "", D =
|
|
94
|
+
` : "", D = b.querySelectorAll(".ins-product-td"), M = [];
|
|
92
95
|
D.forEach((r) => {
|
|
93
|
-
const
|
|
96
|
+
const u = r.getAttribute("data-type") || "CART_ITEMS", p = r.getAttribute("data-number") || "1", l = r.outerHTML;
|
|
94
97
|
M.push({
|
|
95
98
|
element: r,
|
|
96
|
-
outerHtml:
|
|
97
|
-
type:
|
|
98
|
-
number: p
|
|
99
|
-
nodup: c || void 0
|
|
99
|
+
outerHtml: l,
|
|
100
|
+
type: u,
|
|
101
|
+
number: p
|
|
100
102
|
});
|
|
101
103
|
});
|
|
102
|
-
let _ = P +
|
|
103
|
-
M.reverse().forEach(({ outerHtml: r, type:
|
|
104
|
-
let
|
|
105
|
-
switch (
|
|
104
|
+
let _ = P + b.documentElement.outerHTML;
|
|
105
|
+
M.reverse().forEach(({ outerHtml: r, type: u, number: p }) => {
|
|
106
|
+
let l = "";
|
|
107
|
+
switch (u) {
|
|
106
108
|
case "CART_ITEMS":
|
|
107
|
-
|
|
109
|
+
l = "ins_apr_total_product_kind";
|
|
108
110
|
break;
|
|
109
111
|
case "BROWSED_ITEMS":
|
|
110
|
-
|
|
112
|
+
l = "browsed_item_total_product_kind";
|
|
111
113
|
break;
|
|
112
114
|
case "PURCHASED_ITEMS":
|
|
113
|
-
|
|
115
|
+
l = "purchased_item_total_product_kind";
|
|
114
116
|
break;
|
|
115
117
|
}
|
|
116
|
-
if (
|
|
117
|
-
const
|
|
118
|
+
if (l) {
|
|
119
|
+
const $ = parseInt(p) - 1, T = `${`{% if ${l} > ${$} %}`}${r}{% endif %}`;
|
|
118
120
|
_ = _.replace(r, T);
|
|
119
121
|
}
|
|
120
122
|
});
|
|
121
|
-
const x =
|
|
123
|
+
const x = b.querySelectorAll('[product-attr="originalPrice"][data-type="CART_ITEMS"]'), S = [];
|
|
122
124
|
return x.forEach((r) => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
var $;
|
|
126
|
+
const u = r.getAttribute("data-number"), p = r.getAttribute("data-type");
|
|
127
|
+
if (!u || p !== "CART_ITEMS" || (($ = r.closest(".ins-product-td")) == null ? void 0 : $.getAttribute("data-nodup")) === "false")
|
|
125
128
|
return;
|
|
126
|
-
const
|
|
127
|
-
if (
|
|
128
|
-
const
|
|
129
|
-
|
|
129
|
+
const h = r.closest(".product-original-price-class");
|
|
130
|
+
if (h) {
|
|
131
|
+
const y = h.outerHTML;
|
|
132
|
+
S.some((T) => T.tdOuterHtml === y) || S.push({ tdOuterHtml: y, number: u });
|
|
130
133
|
}
|
|
131
|
-
}),
|
|
132
|
-
const p = `{% if ins_apr_price_${
|
|
134
|
+
}), S.reverse().forEach(({ tdOuterHtml: r, number: u }) => {
|
|
135
|
+
const p = `{% if ins_apr_price_${u} != ins_apr_originalprice_${u} %}`;
|
|
133
136
|
if (!_.includes(p) && !r.includes("{% if")) {
|
|
134
|
-
const
|
|
135
|
-
_ = _.replace(r,
|
|
137
|
+
const h = `${p}${r}{% endif %}`;
|
|
138
|
+
_ = _.replace(r, h);
|
|
136
139
|
}
|
|
137
140
|
}), _.replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}");
|
|
138
141
|
}
|
|
139
142
|
export {
|
|
140
|
-
|
|
143
|
+
Y as pairProductVariables
|
|
141
144
|
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { DATA_ATTRIBUTE_REGEX as T } from "../enums/html-validator.js";
|
|
2
|
+
const d = /{{([a-zA-Z0-9_.\s]*)}}/gm, h = (n, e) => {
|
|
3
|
+
if (!e || e.length === 0)
|
|
4
|
+
return { matched: [], unmatchedTokens: [] };
|
|
5
|
+
const s = n.replace(T, "$1").match(d);
|
|
6
|
+
if (!s)
|
|
7
|
+
return { matched: [], unmatchedTokens: [] };
|
|
8
|
+
const u = new Map(
|
|
9
|
+
e.map((c) => [c.value.trim().toLowerCase(), c])
|
|
10
|
+
), a = /* @__PURE__ */ new Set(), o = [], m = [];
|
|
11
|
+
return s.forEach((c) => {
|
|
12
|
+
const t = c.slice(2, -2).trim().toLowerCase();
|
|
13
|
+
if (t === "" || a.has(t))
|
|
14
|
+
return;
|
|
15
|
+
a.add(t);
|
|
16
|
+
const r = u.get(t);
|
|
17
|
+
r ? o.push(r) : m.push(t);
|
|
18
|
+
}), { matched: o, unmatchedTokens: m };
|
|
19
|
+
}, E = (n, e) => h(n, e).matched, k = (n, e) => h(n, e).unmatchedTokens;
|
|
20
|
+
export {
|
|
21
|
+
E as extractUsedDynamicContent,
|
|
22
|
+
k as getUnmatchedDynamicContentTokens
|
|
23
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const f = "text-decoration", A = /(?:[^;"'()]|"[^"]*"|'[^']*'|\([^)]*\))+/g, c = (e) => (e.match(A) || []).map((r) => r.trim()).filter(Boolean), l = (e) => e.slice(0, e.indexOf(":")).trim().toLowerCase(), m = (e) => e.slice(e.indexOf(":") + 1).trim().toLowerCase(), u = (e, r) => {
|
|
2
|
+
const s = e.getAttribute("style");
|
|
3
|
+
if (!s)
|
|
4
|
+
return;
|
|
5
|
+
const t = c(r.getAttribute("style") || ""), i = new Set(t.map(l)), o = c(s).filter((n) => {
|
|
6
|
+
const a = l(n);
|
|
7
|
+
return !a || i.has(a) ? !1 : !a.startsWith(f) && m(n) !== "inherit";
|
|
8
|
+
});
|
|
9
|
+
o.length && r.setAttribute("style", [...t, ...o].join("; "));
|
|
10
|
+
}, y = ["product-attr", "data-type", "data-number", "data-slot-2"], p = (e, r) => {
|
|
11
|
+
y.forEach((s) => {
|
|
12
|
+
const t = e.getAttribute(s);
|
|
13
|
+
t !== null && !r.hasAttribute(s) && r.setAttribute(s, t);
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
function E(e) {
|
|
17
|
+
e.querySelectorAll(".ins-product-td").forEach((r) => {
|
|
18
|
+
const s = /* @__PURE__ */ new Set();
|
|
19
|
+
r.querySelectorAll('[product-attr="name"]').forEach((t) => {
|
|
20
|
+
const i = t.closest("a");
|
|
21
|
+
i && r.contains(i) && s.add(i);
|
|
22
|
+
}), s.forEach((t) => {
|
|
23
|
+
if (t.querySelector("img") || Array.from(t.querySelectorAll("[product-attr]")).some((a) => a.getAttribute("product-attr") !== "name"))
|
|
24
|
+
return;
|
|
25
|
+
const o = t.closest("p");
|
|
26
|
+
if (o && r.contains(o)) {
|
|
27
|
+
p(t, o), u(t, o), t.replaceWith(...Array.from(t.childNodes));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const n = e.createElement("span");
|
|
31
|
+
p(t, n), u(t, n), n.append(...Array.from(t.childNodes)), t.replaceWith(n);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
E as unwrapProductNameLinks
|
|
37
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useinsider/guido",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.15.0-beta.166619d",
|
|
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",
|