@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.
Files changed (29) hide show
  1. package/dist/composables/useEmailTemplateApplier.js +46 -32
  2. package/dist/composables/useHtmlValidator.js +111 -106
  3. package/dist/config/compiler/itemsCompilerRules.js +25 -4
  4. package/dist/config/compiler/utils/itemsCompilerUtils.js +28 -0
  5. package/dist/config/migrator/index.js +9 -8
  6. package/dist/config/migrator/itemsBlockMigrator.js +47 -45
  7. package/dist/config/migrator/productNameLinkMigrator.js +27 -0
  8. package/dist/extensions/Blocks/Items/block.js +30 -30
  9. package/dist/extensions/Blocks/Items/controls/name/trimming.js +16 -16
  10. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +26 -22
  11. package/dist/extensions/Blocks/Items/controls/settingsControl.js +36 -35
  12. package/dist/extensions/Blocks/Items/template.js +228 -263
  13. package/dist/extensions/Blocks/Items/utils/nameNode.js +4 -0
  14. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +5 -9
  15. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +98 -113
  16. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +21 -0
  17. package/dist/src/config/compiler/utils/itemsCompilerUtils.d.ts +12 -0
  18. package/dist/src/config/migrator/productNameLinkMigrator.d.ts +1 -0
  19. package/dist/src/extensions/Blocks/Items/block.d.ts +1 -1
  20. package/dist/src/extensions/Blocks/Items/utils/nameNode.d.ts +9 -0
  21. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +5 -0
  22. package/dist/src/stores/dynamic-content.d.ts +8 -0
  23. package/dist/src/utils/registerUsedDynamicContent.d.ts +8 -0
  24. package/dist/src/utils/unwrapProductNameLink.d.ts +15 -0
  25. package/dist/stores/dynamic-content.js +12 -2
  26. package/dist/utils/pairProductVariables.js +75 -72
  27. package/dist/utils/registerUsedDynamicContent.js +23 -0
  28. package/dist/utils/unwrapProductNameLink.js +37 -0
  29. package/package.json +1 -1
@@ -1,85 +1,88 @@
1
- import { productPairs as N } from "../extensions/Blocks/Items/enums/productEnums.js";
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
- function V(L) {
5
- const H = L.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), g = new DOMParser().parseFromString(H, "text/html"), m = N.PAIRS_FOR_EXTENSION;
6
- Object.entries(m).forEach(([r, f]) => {
7
- g.querySelectorAll(".ins-product-td").forEach((c) => {
8
- const A = c.getAttribute("data-number") || "1", y = c.getAttribute("data-type") || "CART_ITEMS";
9
- c.querySelectorAll(`[product-attr="${r}"]`).forEach((t) => {
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") || y, u = t.getAttribute("data-number") || A, d = f[T];
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, i = null;
16
- if (t.tagName === "IMG" ? (e = t, i = e.closest("a")) : (e = t.querySelector("img"), i = t.querySelector("a") || t.closest("a")), !e)
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 a = d.DEFAULT, s = d.ATTR;
19
- if (a && e.src) {
21
+ const i = d.DEFAULT, a = d.ATTR;
22
+ if (i && e.src) {
20
23
  const o = e.src;
21
- a.some((h) => {
22
- const l = h.split("/").pop() || "", $ = o.split("/").pop() || "";
23
- return o.includes(h) || o.includes(l) || $ === l;
24
- }) && (e.src = `{{${s}_${u}}}`);
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 = m.name) == null ? void 0 : F[T]) == null ? void 0 : I.ATTR;
27
- if (n && e.setAttribute("alt", `{{${n}_${u}}}`), i) {
28
- const o = (w = m.itemLink) == null ? void 0 : w[T];
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 E = o.HREF, h = o.DEFAULT_HREF || "#!", l = i.href;
31
- (l === "#" || l === "" || l.endsWith("#!") || l.endsWith(h) || l === `${window.location.href}${h}` || !l || l === window.location.href) && (i.href = `{{${E}_${u}}}`);
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, i = e.ATTR, a = e.DEFAULT_HREF || "#!", s = e.HREF;
38
- t.textContent && (t.innerHTML = C(t, `{{${i}_${u}}}`));
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 && s) {
41
- const o = n.href, E = `${window.location.href}${a}`;
42
- (o === E || o.endsWith(a)) && (n.href = `{{${s}_${u}}}`);
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, i = t.getAttribute("data-formated"), a = t.getAttribute("data-single_price"), s = i === "true", n = a === "true", o = t.getAttribute("data-curency") || "before";
49
- let E;
50
- n ? E = s ? e.SINGLE_PRICE_FORMATTED : e.SINGLE_PRICE : E = s ? e.PRICE_FORMATTED : e.PRICE;
51
- const h = e.CURRENCY;
52
- let l = `{{${E}_${u}}}`;
53
- const $ = (t.getAttribute("data-currency_symbol") || "").trim(), q = $ !== "" && $ !== O.productPriceCurrencySymbolControlValue;
54
- let b = "";
55
- q ? b = $ : h && (b = `{{${h}_${u}}}`), b && (l = o === "after" ? `${l} ${b}` : `${b} ${l}`), t.innerHTML = C(t, l);
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, i = e.ATTR, a = e.DEFAULT;
60
- t.textContent && t.textContent.trim() === a && (t.innerHTML = C(t, `{{${i}_${u}}}`));
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, i = e.HREF, a = e.DEFAULT_HREF || "#!", s = t.tagName === "A" ? t : t.querySelector("a");
65
- if (s) {
66
- const n = s.href || "", o = `${window.location.href}${a}`;
67
- (n === "" || n === "#" || n === o || n.endsWith(a) || n.endsWith("#!") || n === window.location.href) && (s.href = `{{${i}_${u}}}`);
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, i = e.HREF, a = e.DEFAULT_HREF || "#!", s = t;
73
- if (s.href) {
74
- const n = s.href, o = `${window.location.href}${a}`;
75
- (n === o || n.endsWith(a)) && (s.href = `{{${i}_${u}}}`);
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}_${u}}}`));
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 = g.querySelectorAll(".ins-product-td"), M = [];
94
+ ` : "", D = b.querySelectorAll(".ins-product-td"), M = [];
92
95
  D.forEach((r) => {
93
- const f = r.getAttribute("data-type") || "CART_ITEMS", p = r.getAttribute("data-number") || "1", c = r.getAttribute("data-nodup"), A = r.outerHTML;
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: A,
97
- type: f,
98
- number: p,
99
- nodup: c || void 0
99
+ outerHtml: l,
100
+ type: u,
101
+ number: p
100
102
  });
101
103
  });
102
- let _ = P + g.documentElement.outerHTML;
103
- M.reverse().forEach(({ outerHtml: r, type: f, number: p }) => {
104
- let c = "";
105
- switch (f) {
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
- c = "ins_apr_total_product_kind";
109
+ l = "ins_apr_total_product_kind";
108
110
  break;
109
111
  case "BROWSED_ITEMS":
110
- c = "browsed_item_total_product_kind";
112
+ l = "browsed_item_total_product_kind";
111
113
  break;
112
114
  case "PURCHASED_ITEMS":
113
- c = "purchased_item_total_product_kind";
115
+ l = "purchased_item_total_product_kind";
114
116
  break;
115
117
  }
116
- if (c) {
117
- const y = parseInt(p) - 1, T = `${`{% if ${c} > ${y} %}`}${r}{% endif %}`;
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 = g.querySelectorAll('[product-attr="originalPrice"][data-type="CART_ITEMS"]'), R = [];
123
+ const x = b.querySelectorAll('[product-attr="originalPrice"][data-type="CART_ITEMS"]'), S = [];
122
124
  return x.forEach((r) => {
123
- const f = r.getAttribute("data-number"), p = r.getAttribute("data-type");
124
- if (!f || p !== "CART_ITEMS")
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 c = r.closest(".product-original-price-class");
127
- if (c) {
128
- const A = c.outerHTML;
129
- R.some((S) => S.tdOuterHtml === A) || R.push({ tdOuterHtml: A, number: f });
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
- }), R.reverse().forEach(({ tdOuterHtml: r, number: f }) => {
132
- const p = `{% if ins_apr_price_${f} != ins_apr_originalprice_${f} %}`;
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 A = `${p}${r}{% endif %}`;
135
- _ = _.replace(r, A);
137
+ const h = `${p}${r}{% endif %}`;
138
+ _ = _.replace(r, h);
136
139
  }
137
140
  }), _.replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
138
141
  }
139
142
  export {
140
- V as pairProductVariables
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.14.0",
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",