@unicom-cloud/utils 0.1.14 → 0.1.15

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.
@@ -1,56 +1,59 @@
1
- function m(t) {
2
- if (!t) return null;
1
+ import "../is/index.js";
2
+ import m from "lodash/isString";
3
+ function p(t) {
4
+ if (!(m(t) && t.trim())) return null;
3
5
  const e = {
4
6
  type: "",
5
- parameters: {}
6
- }, o = t.match(/^([^;]+)/);
7
- o && (e.type = o[1].trim());
8
- const s = t.matchAll(
9
- /;\s*([^=]+)=(?:"([^"]*)"|([^;]*))/g
10
- );
11
- for (const r of s) {
12
- const n = r[1].trim().toLowerCase(), i = r[2] || r[3];
13
- if (n.endsWith("*")) {
14
- const a = p(i);
15
- e.parameters[n] = a;
16
- const c = n.slice(0, -1);
17
- e.parameters[c] || (e.parameters[c] = a);
18
- } else e.parameters[n] || (e.parameters[n] = i);
7
+ parameters: /* @__PURE__ */ Object.create(null)
8
+ // 避免原型污染
9
+ }, a = t.match(/^\s*([^;\s]+)\s*/);
10
+ m(a?.[1]) && (e.type = a[1].toLowerCase());
11
+ const s = /;\s*([^=\s]+)\s*=\s*(?:"([^"]*)"|([^;\s]*))/g;
12
+ let o;
13
+ for (; (o = s.exec(t)) !== null; ) {
14
+ const r = o[1].trim().toLowerCase(), n = o[2] || o[3] || "";
15
+ if (r.endsWith("*"))
16
+ try {
17
+ const c = f(n), i = r.slice(0, -1);
18
+ e.parameters[i] || (e.parameters[i] = c), e.parameters[r] = c;
19
+ } catch (c) {
20
+ console.debug(`RFC5987解码失败: ${n}`, c), e.parameters[r] = n;
21
+ }
22
+ else !e.parameters[r] && !e.parameters[`${r}*`] && (e.parameters[r] = n);
19
23
  }
20
24
  return e;
21
25
  }
22
- function p(t) {
23
- const e = t.match(/^([^']*)'[^']*'(.*)$/);
26
+ function f(t) {
27
+ const e = t.match(/^([^']*)'([^']*)'(.*)$/);
24
28
  if (!e) return t;
25
- const [o, s, r] = e;
29
+ const [a, s, o, r] = e;
26
30
  try {
27
- const n = r.replace(
28
- /%([0-9A-Fa-f]{2})/g,
29
- (i, a) => String.fromCharCode(parseInt(a, 16))
31
+ const n = decodeURIComponent(
32
+ r.replace(/%(?![0-9A-Fa-f]{2})/g, "%25")
30
33
  );
31
- return s && s.toLowerCase() !== "utf-8", n;
34
+ return s && !/^utf-?8$/i.test(s) && console.warn(`非UTF-8编码暂未转换: ${s}`), n;
32
35
  } catch (n) {
33
- return console.warn("Failed to decode RFC 5987 value:", t, n), t;
36
+ return console.warn(`RFC5987解码失败: ${t}`, n), t;
34
37
  }
35
38
  }
36
- function f(t) {
39
+ function l(t) {
37
40
  let e = t?.["content-disposition"];
38
41
  if (e)
39
- return m(e);
42
+ return p(e);
40
43
  }
41
44
  function d(t) {
42
- const e = f(t);
45
+ const e = l(t);
43
46
  if (e)
44
47
  return e.parameters;
45
48
  }
46
- function l(t) {
49
+ function C(t) {
47
50
  const e = d(t);
48
51
  if (e)
49
52
  return e["filename*"] || e.filename;
50
53
  }
51
54
  export {
52
- m as default,
53
- f as getContentDispositionFromHeader,
54
- l as getContentDispositionParametersFilenameFromHeader,
55
+ p as default,
56
+ l as getContentDispositionFromHeader,
57
+ C as getContentDispositionParametersFilenameFromHeader,
55
58
  d as getContentDispositionParametersFromHeader
56
59
  };
@@ -1,7 +1,9 @@
1
- import { default as o, getContentDispositionFromHeader as r, getContentDispositionParametersFilenameFromHeader as i, getContentDispositionParametersFromHeader as n } from "./content-disposition/index.js";
1
+ import "./is/index.js";
2
+ import "lodash/isString";
3
+ import { default as i, getContentDispositionFromHeader as n, getContentDispositionParametersFilenameFromHeader as a, getContentDispositionParametersFromHeader as m } from "./content-disposition/index.js";
2
4
  export {
3
- o as default,
4
- r as getContentDispositionFromHeader,
5
- i as getContentDispositionParametersFilenameFromHeader,
6
- n as getContentDispositionParametersFromHeader
5
+ i as default,
6
+ n as getContentDispositionFromHeader,
7
+ a as getContentDispositionParametersFilenameFromHeader,
8
+ m as getContentDispositionParametersFromHeader
7
9
  };
package/file/saveAs.js CHANGED
@@ -1,34 +1,33 @@
1
1
  import { fileToURL as r } from "./fileToURL.js";
2
- function o(n) {
2
+ function o(t) {
3
3
  return new XMLHttpRequest();
4
4
  }
5
- function s(n, t) {
5
+ function s(t, n) {
6
6
  const e = o();
7
- e.open("GET", n), e.responseType = "blob", e.onload = () => {
8
- c(e.response, t);
7
+ e.open("GET", t), e.responseType = "blob", e.onload = () => {
8
+ c(e.response, n);
9
9
  }, e.onerror = () => {
10
10
  console.error("无法下载文件");
11
11
  }, e.send();
12
12
  }
13
- function a(n) {
14
- const t = o();
15
- t.open("HEAD", n, !1);
13
+ function a(t) {
14
+ const n = o();
15
+ n.open("HEAD", t, !1);
16
16
  try {
17
- t.send();
17
+ n.send();
18
18
  } catch (e) {
19
19
  console.error(e);
20
20
  }
21
- return t.status >= 200 && t.status <= 299;
21
+ return n.status >= 200 && n.status <= 299;
22
22
  }
23
- async function i(n, t) {
23
+ async function c(t, n) {
24
24
  const e = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
25
- e.rel = "noopener", typeof n == "string" && (e.href = n, e.origin === location.origin || (a(n) ? s(n, t) : e.target = "_blank")), n instanceof Blob && (e.href = await r(n)), n instanceof File && (t ||= n.name), t ||= "download", e.download = t, setTimeout(() => {
25
+ e.rel = "noopener", typeof t == "string" && (e.href = t, e.origin === location.origin || (a(t) ? s(t, n) : e.target = "_blank")), t instanceof File ? (e.href = await r(t), n ||= t.name) : t instanceof Blob && (e.href = URL.createObjectURL(t), setTimeout(() => {
26
+ URL.revokeObjectURL(e.href);
27
+ }, 4e4)), n ||= "download", e.download = n, setTimeout(() => {
26
28
  e.dispatchEvent(new MouseEvent("click"));
27
29
  }, 0);
28
30
  }
29
- function c(n, t) {
30
- i(n, t);
31
- }
32
31
  export {
33
32
  c as default,
34
33
  c as saveAs
@@ -19,7 +19,7 @@ class l extends EventTarget {
19
19
  this.dispatchEvent(t), this.onopen?.(t), clearTimeout(this.#i);
20
20
  },
21
21
  this.#t?.openTimeout ?? Math.random() * 27
22
- ), this.#a = setInterval(
22
+ ), this.#a = window.setInterval(
23
23
  () => {
24
24
  this.readyState === n.OPEN && this.#e.length && (this.send(this.#h), this.#s++);
25
25
  },
@@ -44,7 +44,7 @@ class l extends EventTarget {
44
44
  let t = new CloseEvent("close");
45
45
  this.dispatchEvent(t), this.onclose?.(t);
46
46
  }
47
- clearTimeout(this.#i), clearInterval(this.#a), this.#s = 0, this.#e = [];
47
+ clearTimeout(this.#i), window.clearInterval(this.#a), this.#s = 0, this.#e = [];
48
48
  } else
49
49
  this.#o?.close?.(e, s);
50
50
  }
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@unicom-cloud/utils","version":"0.1.14","dependencies":{},"peerDependencies":{"lodash":"^4.17.21"},"main":"./index.js","type":"module","types":"types/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"}}
1
+ {"name":"@unicom-cloud/utils","version":"0.1.15","dependencies":{},"peerDependencies":{"lodash":"^4.17.21"},"main":"./index.js","type":"module","types":"types/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"}}
@@ -1,112 +1,113 @@
1
1
  import { captureDOM as v } from "../core/capture.js";
2
2
  import { extendIconFonts as j } from "../modules/iconFonts.js";
3
- import { isSafari as R } from "../utils/helpers.js";
4
- async function B(a, { dpr: t = 1, scale: o = 1 }) {
5
- const e = new Image();
6
- return e.src = a, await e.decode(), e.width = e.width * o, e.height = e.height * o, e;
3
+ import { isSafari as x } from "../utils/helpers.js";
4
+ async function R(e, { scale: t = 1 } = {}) {
5
+ const n = new Image();
6
+ return n.src = e, await n.decode(), t !== 1 && (n.style.width = `${n.naturalWidth * t}px`, n.style.height = `${n.naturalHeight * t}px`), n;
7
7
  }
8
- async function f(a, { dpr: t = 1, scale: o = 1 } = {}) {
9
- const e = new Image();
10
- e.src = a, e.crossOrigin = "anonymous", e.loading = "eager", e.decoding = "sync";
11
- const c = R();
12
- let n = !1;
13
- if (c && (document.body.appendChild(e), n = !0), await e.decode(), c && await new Promise((w) => setTimeout(w, 100)), e.width === 0 || e.height === 0)
14
- throw n && e.remove(), new Error("Image failed to load or has no dimensions");
15
- const s = e.width * o, r = e.height * o, g = document.createElement("canvas");
8
+ async function h(e, { dpr: t = 1, scale: n = 1 } = {}) {
9
+ const c = new Image();
10
+ c.src = e, c.crossOrigin = "anonymous", c.loading = "eager", c.decoding = "sync";
11
+ const o = x();
12
+ let a = !1;
13
+ if (o && (document.body.appendChild(c), a = !0), await c.decode(), o && await new Promise((w) => setTimeout(w, 100)), c.width === 0 || c.height === 0)
14
+ throw a && c.remove(), new Error("Image failed to load or has no dimensions");
15
+ const s = c.naturalWidth * n, r = c.naturalHeight * n, g = document.createElement("canvas");
16
16
  g.width = Math.ceil(s * t), g.height = Math.ceil(r * t), g.style.width = `${s}px`, g.style.height = `${r}px`;
17
17
  const d = g.getContext("2d");
18
- return d.scale(t, t), d.drawImage(e, 0, 0, s, r), n && e.remove(), g;
18
+ return d.scale(t, t), d.drawImage(c, 0, 0, s, r), a && c.remove(), g;
19
19
  }
20
- async function b(a, { type: t = "svg", scale: o = 1, backgroundColor: e = "#fff", quality: c } = {}) {
21
- const n = {
20
+ async function y(e, { type: t = "svg", scale: n = 1, backgroundColor: c = "#fff", quality: o } = {}) {
21
+ const a = {
22
22
  jpg: "image/jpeg",
23
23
  jpeg: "image/jpeg",
24
24
  png: "image/png",
25
25
  webp: "image/webp"
26
26
  }[t] || "image/png";
27
27
  if (t === "svg") {
28
- const r = decodeURIComponent(a.split(",")[1]);
28
+ const r = decodeURIComponent(e.split(",")[1]);
29
29
  return new Blob([r], { type: "image/svg+xml" });
30
30
  }
31
31
  const s = await u(
32
- a,
33
- { dpr: 1, scale: o },
34
- e
32
+ e,
33
+ { dpr: 1, scale: n },
34
+ c
35
35
  );
36
36
  return new Promise((r) => {
37
- s.toBlob((g) => r(g), `${n}`, c);
37
+ s.toBlob((g) => r(g), `${a}`, o);
38
38
  });
39
39
  }
40
- async function u(a, { dpr: t = 1, scale: o = 1 }, e) {
41
- const c = await f(a, { dpr: t, scale: o });
42
- if (!e) return c;
43
- const n = document.createElement("canvas");
44
- n.width = c.width, n.height = c.height;
45
- const s = n.getContext("2d");
46
- return s.fillStyle = e, s.fillRect(0, 0, n.width, n.height), s.drawImage(c, 0, 0), n;
40
+ async function u(e, { dpr: t = 1, scale: n = 1 }, c) {
41
+ const o = await h(e, { dpr: t, scale: n });
42
+ if (!c) return o;
43
+ const a = document.createElement("canvas");
44
+ a.width = o.width, a.height = o.height;
45
+ const s = a.getContext("2d");
46
+ return s.fillStyle = c, s.fillRect(0, 0, a.width, a.height), s.drawImage(o, 0, 0), a;
47
47
  }
48
- async function l(a, { dpr: t = 1, scale: o = 1, backgroundColor: e, quality: c }, n = "png") {
49
- const s = ["jpg", "jpeg", "webp"].includes(n) ? "#fff" : void 0, g = await u(a, { dpr: t, scale: o }, e ?? s), d = new Image();
50
- return d.src = g.toDataURL(`image/${n}`, c), await d.decode(), d.style.width = `${g.width / t}px`, d.style.height = `${g.height / t}px`, d;
48
+ async function m(e, { dpr: t = 1, scale: n = 1, backgroundColor: c, quality: o }, a = "png") {
49
+ const s = ["jpg", "jpeg", "webp"].includes(a) ? "#fff" : void 0, g = await u(e, { dpr: t, scale: n }, c ?? s), d = new Image();
50
+ return d.src = g.toDataURL(`image/${a}`, o), await d.decode(), d.style.width = `${g.width / t}px`, d.style.height = `${g.height / t}px`, d;
51
51
  }
52
- async function x(a, {
52
+ async function B(e, {
53
53
  dpr: t = 1,
54
- scale: o = 1,
55
- backgroundColor: e,
56
- format: c = "png",
57
- filename: n = "snapDOM"
54
+ scale: n = 1,
55
+ backgroundColor: c,
56
+ format: o = "png",
57
+ filename: a = "snapDOM"
58
58
  } = {}) {
59
- if (c === "svg") {
60
- const y = await b(a), h = URL.createObjectURL(y), m = document.createElement("a");
61
- m.href = h, m.download = `${n}.svg`, m.click(), URL.revokeObjectURL(h);
59
+ if (o === "svg") {
60
+ const b = await y(e), f = URL.createObjectURL(b), l = document.createElement("a");
61
+ l.href = f, l.download = `${a}.svg`, l.click(), URL.revokeObjectURL(f);
62
62
  return;
63
63
  }
64
- const s = ["jpg", "jpeg", "webp"].includes(c) ? "#fff" : void 0, g = await u(a, { dpr: t, scale: o }, e ?? s), d = {
64
+ const s = ["jpg", "jpeg", "webp"].includes(o) ? "#fff" : void 0, g = await u(e, { dpr: t, scale: n }, c ?? s), d = {
65
65
  jpg: "image/jpeg",
66
66
  jpeg: "image/jpeg",
67
67
  png: "image/png",
68
68
  webp: "image/webp"
69
- }[c] || "image/png", w = g.toDataURL(d), p = document.createElement("a");
70
- p.href = w, p.download = `${n}.${c}`, p.click();
69
+ }[o] || "image/png", w = g.toDataURL(d), p = document.createElement("a");
70
+ p.href = w, p.download = `${a}.${o}`, p.click();
71
71
  }
72
- async function i(a, t = {}) {
73
- if (t = { scale: 1, ...t }, !a) throw new Error("Element cannot be null or undefined");
74
- return t.iconFonts && j(t.iconFonts), await i.capture(a, t);
72
+ async function i(e, t = {}) {
73
+ if (t = { scale: 1, ...t }, !e) throw new Error("Element cannot be null or undefined");
74
+ return t.iconFonts && j(t.iconFonts), await i.capture(e, t);
75
75
  }
76
- i.capture = async (a, t = {}) => {
77
- const o = await v(a, t), e = window.devicePixelRatio || 1, c = t.scale || 1;
76
+ i.capture = async (e, t = {}) => {
77
+ const n = await v(e, t), c = t.dpr ?? (window.devicePixelRatio || 1), o = t.scale || 1;
78
78
  return {
79
- url: o,
79
+ url: n,
80
80
  options: t,
81
- toRaw: () => o,
82
- toImg: () => B(o, { dpr: e, scale: c }),
83
- toCanvas: () => f(o, { dpr: e, scale: c }),
84
- toBlob: (n) => b(o, { scale: c, ...n }),
85
- toPng: (n) => l(o, { dpr: e, scale: c, ...n }, "png"),
86
- toJpg: (n) => l(o, { dpr: e, scale: c, ...n }, "jpeg"),
87
- toWebp: (n) => l(o, { dpr: e, scale: c, ...n }, "webp"),
81
+ toRaw: () => n,
82
+ toImg: (a = {}) => R(n, { scale: o, ...a }),
83
+ toCanvas: (a = {}) => h(n, { dpr: c, scale: o, ...a }),
84
+ toBlob: (a = {}) => y(n, { scale: o, ...a }),
85
+ toPng: (a = {}) => m(n, { dpr: c, scale: o, ...a }, "png"),
86
+ toJpg: (a = {}) => m(n, { dpr: c, scale: o, ...a }, "jpeg"),
87
+ toWebp: (a = {}) => m(n, { dpr: c, scale: o, ...a }, "webp"),
88
88
  download: ({
89
- format: n = "png",
90
- filename: s = "capture",
91
- backgroundColor: r
92
- } = {}) => x(o, { dpr: e, scale: c, backgroundColor: r, format: n, filename: s })
89
+ format: a = "png",
90
+ filename: s = "snapDOM",
91
+ backgroundColor: r,
92
+ ...g
93
+ } = {}) => B(n, { dpr: c, scale: o, format: a, filename: s, backgroundColor: r, ...g })
93
94
  };
94
95
  };
95
- i.toRaw = async (a, t) => (await i.capture(a, t)).toRaw();
96
- i.toImg = async (a, t) => (await i.capture(a, t)).toImg();
97
- i.toCanvas = async (a, t) => (await i.capture(a, t)).toCanvas();
98
- i.toBlob = async (a, t) => (await i.capture(a, t)).toBlob(t);
99
- i.toPng = async (a, t) => (await i.capture(a, t)).toPng(t);
100
- i.toJpg = async (a, t) => (await i.capture(a, t)).toJpg(t);
101
- i.toWebp = async (a, t) => (await i.capture(a, t)).toWebp(t);
102
- i.download = async (a, t = {}) => {
96
+ i.toRaw = async (e, t) => (await i.capture(e, t)).toRaw();
97
+ i.toImg = async (e, t) => (await i.capture(e, t)).toImg();
98
+ i.toCanvas = async (e, t) => (await i.capture(e, t)).toCanvas();
99
+ i.toBlob = async (e, t) => (await i.capture(e, t)).toBlob(t);
100
+ i.toPng = async (e, t) => (await i.capture(e, t)).toPng(t);
101
+ i.toJpg = async (e, t) => (await i.capture(e, t)).toJpg(t);
102
+ i.toWebp = async (e, t) => (await i.capture(e, t)).toWebp(t);
103
+ i.download = async (e, t = {}) => {
103
104
  const {
104
- format: o = "png",
105
- filename: e = "capture",
106
- backgroundColor: c,
107
- ...n
105
+ format: n = "png",
106
+ filename: c = "capture",
107
+ backgroundColor: o,
108
+ ...a
108
109
  } = t;
109
- return await (await i.capture(a, n)).download({ format: o, filename: e, backgroundColor: c });
110
+ return await (await i.capture(e, a)).download({ format: n, filename: c, backgroundColor: o });
110
111
  };
111
112
  export {
112
113
  i as snapdom
@@ -1,7 +1,7 @@
1
1
  import { cache as c } from "../core/cache.js";
2
- import { getStyle as y, splitBackgroundImage as h, inlineSingleBackgroundEntry as b } from "../utils/helpers.js";
3
- async function w(u, d, k = {}) {
4
- const t = [[u, d]], p = [
2
+ import { getStyle as f, splitBackgroundImage as h, inlineSingleBackgroundEntry as y } from "../utils/helpers.js";
3
+ async function S(d, u, b = {}) {
4
+ const n = [[d, u]], p = [
5
5
  "background-image",
6
6
  "mask",
7
7
  "mask-image",
@@ -9,26 +9,32 @@ async function w(u, d, k = {}) {
9
9
  "mask-source",
10
10
  "mask-box-image-source",
11
11
  "mask-border-source",
12
- "-webkit-mask-box-image-source"
12
+ "-webkit-mask-box-image-source",
13
+ "border-image",
14
+ "border-image-source",
15
+ "border-image-slice",
16
+ "border-image-width",
17
+ "border-image-outset",
18
+ "border-image-repeat"
13
19
  ];
14
- for (; t.length; ) {
15
- const [o, s] = t.shift(), a = c.preStyle.get(o) || y(o);
16
- c.preStyle.has(o) || c.preStyle.set(o, a);
20
+ for (; n.length; ) {
21
+ const [r, i] = n.shift(), s = c.preStyle.get(r) || f(r);
22
+ c.preStyle.has(r) || c.preStyle.set(r, s);
17
23
  for (const e of p) {
18
- const i = a.getPropertyValue(e);
19
- if (!i || i === "none") continue;
20
- const f = h(i), g = await Promise.all(
21
- f.map((r) => b(r, k))
24
+ const a = s.getPropertyValue(e);
25
+ if (!a || a === "none") continue;
26
+ const k = h(a), g = await Promise.all(
27
+ k.map((o) => y(o, b))
22
28
  );
23
- g.some((r) => r && r !== "none" && !/^url\(undefined/.test(r)) && s.style.setProperty(e, g.join(", "));
29
+ g.some((o) => o && o !== "none" && !/^url\(undefined/.test(o)) && i.style.setProperty(e, g.join(", "));
24
30
  }
25
- const n = a.getPropertyValue("background-color");
26
- n && n !== "transparent" && n !== "rgba(0, 0, 0, 0)" && (s.style.backgroundColor = n);
27
- const l = Array.from(o.children), m = Array.from(s.children);
31
+ const t = s.getPropertyValue("background-color");
32
+ t && t !== "transparent" && t !== "rgba(0, 0, 0, 0)" && (i.style.backgroundColor = t);
33
+ const l = Array.from(r.children), m = Array.from(i.children);
28
34
  for (let e = 0; e < Math.min(l.length, m.length); e++)
29
- t.push([l[e], m[e]]);
35
+ n.push([l[e], m[e]]);
30
36
  }
31
37
  }
32
38
  export {
33
- w as inlineBackgroundImages
39
+ S as inlineBackgroundImages
34
40
  };
@@ -1,85 +1,82 @@
1
1
  import { cache as M } from "../core/cache.js";
2
- import { iconToImage as q } from "./fonts.js";
3
- import { isIconFont as v } from "./iconFonts.js";
2
+ import { iconToImage as v } from "./fonts.js";
3
+ import { isIconFont as G } from "./iconFonts.js";
4
4
  import { getStyleKey as $ } from "../utils/cssTools.js";
5
- import { getStyle as G, snapshotComputedStyle as z, parseContent as H, extractURL as J, fetchImage as Q, safeEncodeURI as Y, splitBackgroundImage as Z, inlineSingleBackgroundEntry as tt } from "../utils/helpers.js";
6
- async function et(c, s, p, R = !1, b) {
7
- if (!(c instanceof Element) || !(s instanceof Element)) return;
5
+ import { getStyle as H, snapshotComputedStyle as z, parseContent as J, extractURL as Q, fetchImage as Y, safeEncodeURI as Z, splitBackgroundImage as tt, inlineSingleBackgroundEntry as nt } from "../utils/helpers.js";
6
+ async function et(a, s, m, R = !1, b) {
7
+ if (!(a instanceof Element) || !(s instanceof Element)) return;
8
8
  for (const n of ["::before", "::after", "::first-letter"])
9
9
  try {
10
- const t = G(c, n);
11
- if (!t || typeof t[Symbol.iterator] != "function") continue;
10
+ const t = H(a, n);
11
+ if (!t || typeof t[Symbol.iterator] != "function" || t.content === "none" && t.backgroundImage === "none" && t.backgroundColor === "transparent" && (t.borderStyle === "none" || parseFloat(t.borderWidth) === 0) && (!t.transform || t.transform === "none") && t.display === "inline") continue;
12
12
  if (n === "::first-letter") {
13
- const e = getComputedStyle(c);
13
+ const e = getComputedStyle(a);
14
14
  if (!(t.color !== e.color || t.fontSize !== e.fontSize || t.fontWeight !== e.fontWeight)) continue;
15
- const i = Array.from(s.childNodes).find(
16
- (C) => C.nodeType === Node.TEXT_NODE && C.textContent && C.textContent.trim().length > 0
15
+ const c = Array.from(s.childNodes).find(
16
+ (T) => T.nodeType === Node.TEXT_NODE && T.textContent?.trim().length > 0
17
17
  );
18
- if (!i) continue;
19
- const N = i.textContent, d = N.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u)?.[0], O = N.slice(d?.length || 0);
18
+ if (!c) continue;
19
+ const W = c.textContent, d = W.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u)?.[0], X = W.slice(d?.length || 0);
20
20
  if (!d || /[\uD800-\uDFFF]/.test(d)) continue;
21
21
  const f = document.createElement("span");
22
22
  f.textContent = d, f.dataset.snapdomPseudo = "::first-letter";
23
- const X = z(t), _ = $(X, "span", p);
24
- M.preStyleMap.set(f, _);
25
- const T = document.createTextNode(O);
26
- s.replaceChild(T, i), s.insertBefore(f, T);
23
+ const _ = z(t), q = $(_, "span", m);
24
+ M.preStyleMap.set(f, q);
25
+ const P = document.createTextNode(X);
26
+ s.replaceChild(P, c), s.insertBefore(f, P);
27
27
  continue;
28
28
  }
29
- const h = t.getPropertyValue("content"), m = t.getPropertyValue("background-image"), l = t.getPropertyValue("background-color"), E = t.getPropertyValue("font-family"), g = parseInt(t.getPropertyValue("font-size")) || 32, U = parseInt(t.getPropertyValue("font-weight")) || !1, W = t.getPropertyValue("color") || "#000", j = t.getPropertyValue("display"), A = parseFloat(t.getPropertyValue("width")), D = parseFloat(t.getPropertyValue("height")), V = t.getPropertyValue("border-style"), w = t.getPropertyValue("transform"), S = v(E);
30
- let r;
31
- /counter\s*\(|counters\s*\(/.test(h) ? r = "- " : r = H(h);
32
- const B = h !== "none" && r !== "", u = m && m !== "none", y = l && l !== "transparent" && l !== "rgba(0, 0, 0, 0)", F = j !== "inline" && (A > 0 || D > 0), k = V && V !== "none", I = w && w !== "none";
33
- if (!(B || u || y || F || k || I)) continue;
29
+ const h = t.content, i = /counter\s*\(|counters\s*\(/.test(h) ? "- " : J(h), p = t.backgroundImage, l = t.backgroundColor, S = t.fontFamily, g = parseInt(t.fontSize) || 32, U = parseInt(t.fontWeight) || !1, j = t.color || "#000", A = t.display, D = parseFloat(t.width), L = parseFloat(t.height), x = t.borderStyle, V = parseFloat(t.borderWidth), F = t.transform, w = G(S), k = h !== "none" && i !== "", u = p && p !== "none", y = l && l !== "transparent" && l !== "rgba(0, 0, 0, 0)", B = A !== "inline" && (D > 0 || L > 0), I = x && x !== "none" && V > 0, N = F && F !== "none";
30
+ if (!(k || u || y || B || I || N)) continue;
34
31
  const o = document.createElement("span");
35
32
  o.dataset.snapdomPseudo = n;
36
- const L = z(t), K = $(L, "span", p);
37
- if (M.preStyleMap.set(o, K), S && r.length === 1) {
33
+ const K = z(t), O = $(K, "span", m);
34
+ if (M.preStyleMap.set(o, O), w && i.length === 1) {
38
35
  const e = document.createElement("img");
39
- e.src = await q(
40
- r,
41
- E,
36
+ e.src = await v(
37
+ i,
38
+ S,
42
39
  U,
43
40
  g,
44
- W
41
+ j
45
42
  ), e.style = `width:${g}px;height:auto;object-fit:contain;`, o.appendChild(e);
46
- } else if (r.startsWith("url(")) {
47
- const e = J(r);
48
- if (e && e.trim() !== "")
43
+ } else if (i.startsWith("url(")) {
44
+ const e = Q(i);
45
+ if (e?.trim())
49
46
  try {
50
- const a = document.createElement("img"), i = await Q(
51
- Y(e, { useProxy: b })
47
+ const r = document.createElement("img"), c = await Y(
48
+ Z(e, { useProxy: b })
52
49
  );
53
- a.src = i, a.style = `width:${g}px;height:auto;object-fit:contain;`, o.appendChild(a);
54
- } catch (a) {
55
- console.error(`[snapdom] Error in pseudo ${n} for`, c, a);
50
+ r.src = c, r.style = `width:${g}px;height:auto;object-fit:contain;`, o.appendChild(r);
51
+ } catch (r) {
52
+ console.error(`[snapdom] Error in pseudo ${n} for`, a, r);
56
53
  }
57
- } else !S && B && (o.textContent = r);
54
+ } else !w && k && (o.textContent = i);
58
55
  if (u)
59
56
  try {
60
- const e = Z(m), a = await Promise.all(
61
- e.map((i) => tt(i))
57
+ const e = tt(p), r = await Promise.all(
58
+ e.map(nt)
62
59
  );
63
- o.style.backgroundImage = a.join(", ");
60
+ o.style.backgroundImage = r.join(", ");
64
61
  } catch (e) {
65
62
  console.warn(
66
63
  `[snapdom] Failed to inline background-image for ${n}`,
67
64
  e
68
65
  );
69
66
  }
70
- if (y && (o.style.backgroundColor = l), !(o.childNodes.length > 0 || o.textContent && o.textContent.trim() !== "" || u || y || F || k || I)) continue;
67
+ if (y && (o.style.backgroundColor = l), !(o.childNodes.length > 0 || o.textContent?.trim() !== "" || u || y || B || I || N)) continue;
71
68
  n === "::before" ? s.insertBefore(o, s.firstChild) : s.appendChild(o);
72
69
  } catch (t) {
73
- console.warn(`[snapdom] Failed to capture ${n} for`, c, t);
70
+ console.warn(`[snapdom] Failed to capture ${n} for`, a, t);
74
71
  }
75
- const x = Array.from(c.children), P = Array.from(s.children).filter(
72
+ const C = Array.from(a.children), E = Array.from(s.children).filter(
76
73
  (n) => !n.dataset.snapdomPseudo
77
74
  );
78
- for (let n = 0; n < Math.min(x.length, P.length); n++)
75
+ for (let n = 0; n < Math.min(C.length, E.length); n++)
79
76
  await et(
80
- x[n],
81
- P[n],
82
- p,
77
+ C[n],
78
+ E[n],
79
+ m,
83
80
  R,
84
81
  b
85
82
  );
@@ -1,2 +1,2 @@
1
1
  export default saveAs;
2
- export function saveAs(blob: any, name: any): void;
2
+ export function saveAs(blob: any, name: any): Promise<void>;