@agile-team/mach-report 2.13.0 → 2.14.0

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 (97) hide show
  1. package/README.md +10 -2
  2. package/dist/ExcelBindingWizard-CLT2p7P3.cjs +1 -0
  3. package/dist/ExcelBindingWizard-CvsWR8Ga.js +1485 -0
  4. package/dist/{ParamEditor-BLaE5q5W.js → ParamEditor-CflQV3eQ.js} +191 -187
  5. package/dist/ParamEditor-vIDzvpPV.cjs +1 -0
  6. package/dist/ReportBatchPanel-DkxTzBkD.cjs +1 -0
  7. package/dist/{ReportBatchPanel-CW2HV9I8.js → ReportBatchPanel-LqVgiqp7.js} +3 -3
  8. package/dist/ReportPreview-CvbqLUzM.cjs +6 -0
  9. package/dist/ReportPreview-D_ywJ_-H.js +4533 -0
  10. package/dist/{ReportTemplateLibrary-BZB-XWjj.js → ReportTemplateLibrary-MjWEtc7X.js} +1 -1
  11. package/dist/ReportTemplateLibrary-cQ1sqNYo.cjs +1 -0
  12. package/dist/RuleEditor-BaR6xUiI.cjs +1 -0
  13. package/dist/RuleEditor-ChuXMlei.js +2037 -0
  14. package/dist/TemplateOutlinePanel-BHKP89Xz.cjs +1 -0
  15. package/dist/TemplateOutlinePanel-Dci6aRn1.js +96 -0
  16. package/dist/TemplateReusePanel-B7Gmyc1z.js +388 -0
  17. package/dist/TemplateReusePanel-CY5eO2Sh.cjs +1 -0
  18. package/dist/TemplateReviewPanel-DjlX3xpt.js +592 -0
  19. package/dist/TemplateReviewPanel-JvZe9_4G.cjs +1 -0
  20. package/dist/{batch-mRqhhhjt.js → batch-DzaTNLWI.js} +23 -16
  21. package/dist/batch-xMkqYiTr.cjs +1 -0
  22. package/dist/config-0UIohTS7.cjs +1 -0
  23. package/dist/{config-XVwG87IA.js → config-Dt9NtCPl.js} +223 -186
  24. package/dist/data-explanation-BktvER5B.cjs +1 -0
  25. package/dist/data-explanation-C_J6jYNi.js +16 -0
  26. package/dist/designer-Ci1LizA9.js +5020 -0
  27. package/dist/designer-rtmVIIdN.cjs +2 -0
  28. package/dist/designer.cjs +1 -2
  29. package/dist/designer.d.cts +290 -3
  30. package/dist/designer.d.ts +290 -3
  31. package/dist/designer.js +21 -4312
  32. package/dist/font-loader-DHto6Lra.js +297 -0
  33. package/dist/font-loader-vhCT8znW.cjs +1 -0
  34. package/dist/index.cjs +8 -8
  35. package/dist/index.d.cts +157 -1
  36. package/dist/index.d.ts +157 -1
  37. package/dist/index.js +720 -639
  38. package/dist/{template-review-PgEe_Wr9.js → json-snapshot-BeFT3Tso.js} +795 -585
  39. package/dist/json-snapshot-D1NTP2oI.cjs +2 -0
  40. package/dist/pdf-8UPQebOE.js +36288 -0
  41. package/dist/pdf-AyJGb22z.cjs +101 -0
  42. package/dist/pdf.cjs +1 -101
  43. package/dist/pdf.js +9 -36579
  44. package/dist/plugin-BGKf-Tqg.js +22 -0
  45. package/dist/{plugin-DzS6pxTA.cjs → plugin-CktLH_Iy.cjs} +1 -1
  46. package/dist/{region-binding-workflow-CcUq8W2Q.js → region-binding-workflow-DEJbhpCv.js} +1 -1
  47. package/dist/server/node.d.cts +46 -11
  48. package/dist/server/node.d.ts +46 -11
  49. package/dist/server-node.cjs +1 -1
  50. package/dist/server-node.js +294 -280
  51. package/dist/server.cjs +1 -1
  52. package/dist/server.d.cts +107 -12
  53. package/dist/server.d.ts +107 -12
  54. package/dist/server.js +711 -451
  55. package/dist/style.css +1 -1
  56. package/dist/template-bindings-BJR4k7qZ.cjs +1 -0
  57. package/dist/template-bindings-Daui7hLF.js +252 -0
  58. package/dist/template-fragments-CLkGo6To.js +187 -0
  59. package/dist/template-fragments-DFUpq5QM.cjs +1 -0
  60. package/dist/template-outline-B3xVkzSv.cjs +1 -0
  61. package/dist/template-outline-CFenM1PV.js +88 -0
  62. package/dist/{template-registry-BjE1VS6g.js → template-registry-COXDEJEM.js} +1 -1
  63. package/dist/{useLocalDraft-C07SYRnC.js → useLocalDraft-BnhcxXk_.js} +1 -1
  64. package/dist/{useLocalDraft-Yiw1wFgI.cjs → useLocalDraft-CioIfDb6.cjs} +1 -1
  65. package/dist/{validate-DbgEM1Hh.js → validate-CkQBWCeg.js} +3 -3
  66. package/dist/vue/async.d.cts +68 -2
  67. package/dist/vue/async.d.ts +68 -2
  68. package/dist/vue/index.d.cts +117 -3
  69. package/dist/vue/index.d.ts +117 -3
  70. package/dist/vue-async.cjs +1 -1
  71. package/dist/vue-async.js +5 -5
  72. package/dist/vue.cjs +1 -1
  73. package/dist/vue.js +78 -71
  74. package/dist/{workbook-session-BPb3TMnT.js → workbook-session-BfK1yHOO.js} +1 -1
  75. package/dist/worker.cjs +1 -1
  76. package/dist/worker.d.cts +46 -11
  77. package/dist/worker.d.ts +46 -11
  78. package/dist/worker.js +59 -55
  79. package/dist/xlsx.js +3 -3
  80. package/package.json +1 -1
  81. package/dist/ExcelBindingWizard-CeAf4QSE.js +0 -1465
  82. package/dist/ExcelBindingWizard-y0mT-AHR.cjs +0 -1
  83. package/dist/ParamEditor-MBBC7lUE.cjs +0 -1
  84. package/dist/ReportBatchPanel-Fp1ePFag.cjs +0 -1
  85. package/dist/ReportPreview-BN6fk7Wz.cjs +0 -6
  86. package/dist/ReportPreview-D2Jkyh1U.js +0 -4243
  87. package/dist/ReportTemplateLibrary-5fk5CQBO.cjs +0 -1
  88. package/dist/RuleEditor-ChRzNQuF.cjs +0 -1
  89. package/dist/RuleEditor-DzAmW5YH.js +0 -2024
  90. package/dist/TemplateReviewPanel-BKofGrV9.js +0 -222
  91. package/dist/TemplateReviewPanel-DwtOcLue.cjs +0 -1
  92. package/dist/batch-Bt3Fd27Z.cjs +0 -1
  93. package/dist/config-Bb7RiIO5.cjs +0 -1
  94. package/dist/plugin-D4wizDXB.js +0 -22
  95. package/dist/record-bindings-By_UKZ2g.cjs +0 -1
  96. package/dist/record-bindings-D-5jQlTj.js +0 -196
  97. package/dist/template-review-DGwWOoCv.cjs +0 -2
@@ -0,0 +1,297 @@
1
+ const f = /* @__PURE__ */ new Map();
2
+ let b = 0, d = { maxFonts: 8, maxBytes: 64 * 1024 * 1024, maxFontBytes: 24 * 1024 * 1024 };
3
+ function D() {
4
+ for (; f.size > d.maxFonts || b > d.maxBytes; ) {
5
+ const t = f.keys().next().value;
6
+ b -= f.get(t).byteLength, f.delete(t);
7
+ }
8
+ }
9
+ function nt(t) {
10
+ const e = { ...d, ...t };
11
+ if (!Object.values(e).every((n) => Number.isSafeInteger(n) && n > 0)) throw new Error("字体缓存预算应为正整数字节/数量");
12
+ d = e;
13
+ for (const [n, a] of f) a.byteLength > d.maxFontBytes && P(n);
14
+ D();
15
+ }
16
+ function B() {
17
+ return { fonts: f.size, bytes: b, ...d };
18
+ }
19
+ function U(t) {
20
+ const e = f.get(t);
21
+ return e && (f.delete(t), f.set(t, e)), e;
22
+ }
23
+ function P(t) {
24
+ const e = f.get(t);
25
+ e && (b -= e.byteLength), f.delete(t);
26
+ }
27
+ function z() {
28
+ f.clear(), b = 0;
29
+ }
30
+ function W(t, e) {
31
+ P(t), !(e.byteLength > d.maxBytes || e.byteLength > d.maxFontBytes) && (f.set(t, e), b += e.byteLength, D());
32
+ }
33
+ const j = "mach-report-fonts", u = "fonts";
34
+ function H() {
35
+ return new Promise((t, e) => {
36
+ const n = indexedDB.open(j, 1);
37
+ n.onupgradeneeded = () => {
38
+ n.result.objectStoreNames.contains(u) || n.result.createObjectStore(u);
39
+ }, n.onsuccess = () => t(n.result), n.onerror = () => e(n.error);
40
+ });
41
+ }
42
+ function M(t) {
43
+ if (t instanceof Uint8Array) return { bytes: t, accessedAt: 0 };
44
+ const e = t;
45
+ return e?.bytes instanceof Uint8Array && Number.isFinite(e.accessedAt) ? e : void 0;
46
+ }
47
+ async function T(t, e) {
48
+ if (typeof indexedDB > "u") return t;
49
+ let n;
50
+ try {
51
+ return n = await H(), await e(n);
52
+ } catch {
53
+ return t;
54
+ } finally {
55
+ n?.close();
56
+ }
57
+ }
58
+ function V(t) {
59
+ return T(null, (e) => new Promise((n, a) => {
60
+ const r = e.transaction(u, "readwrite"), o = r.objectStore(u), i = o.get(t);
61
+ let c = null;
62
+ i.onsuccess = () => {
63
+ const s = M(i.result);
64
+ s && s.bytes.byteLength <= B().maxFontBytes ? (c = s.bytes, o.put({ bytes: s.bytes, accessedAt: Date.now() }, t)) : i.result !== void 0 && o.delete(t);
65
+ }, r.oncomplete = () => n(c), r.onerror = () => a(r.error), r.onabort = () => a(r.error);
66
+ }));
67
+ }
68
+ function $(t, e, n, a) {
69
+ const r = B(), o = e.filter((s) => s.key !== n);
70
+ t.delete(n), a.byteLength <= Math.min(r.maxFontBytes, r.maxBytes) && o.unshift({ key: n, bytes: a.byteLength, accessedAt: Date.now() }), o.sort((s, h) => h.accessedAt - s.accessedAt);
71
+ let i = 0, c = 0;
72
+ for (const s of o) {
73
+ if (c >= r.maxFonts || i + s.bytes > r.maxBytes || s.bytes > r.maxFontBytes) {
74
+ t.delete(s.key);
75
+ continue;
76
+ }
77
+ i += s.bytes, c++, s.key === n && t.put({ bytes: a, accessedAt: s.accessedAt }, n);
78
+ }
79
+ }
80
+ function q(t, e) {
81
+ return T(void 0, (n) => new Promise((a, r) => {
82
+ const o = n.transaction(u, "readwrite"), i = o.objectStore(u), c = i.openCursor(), s = [];
83
+ c.onsuccess = () => {
84
+ const h = c.result;
85
+ if (!h) {
86
+ $(i, s, t, e);
87
+ return;
88
+ }
89
+ const L = M(h.value);
90
+ L ? s.push({ key: h.key, bytes: L.bytes.byteLength, accessedAt: L.accessedAt }) : h.delete(), h.continue();
91
+ }, o.oncomplete = () => a(), o.onerror = () => r(o.error), o.onabort = () => r(o.error);
92
+ }));
93
+ }
94
+ function C(t) {
95
+ return T(void 0, (e) => new Promise((n, a) => {
96
+ const r = e.transaction(u, "readwrite"), o = r.objectStore(u);
97
+ t === void 0 ? o.clear() : o.delete(t), r.oncomplete = () => n(), r.onerror = () => a(r.error), r.onabort = () => a(r.error);
98
+ }));
99
+ }
100
+ let p = 0, x = 0, v = Promise.resolve();
101
+ const g = /* @__PURE__ */ new Map();
102
+ async function G(t) {
103
+ y.set(t, (y.get(t) ?? 0) + 1), P(t), l.delete(t);
104
+ const e = g.get(t), n = (async () => {
105
+ await v, await e, await w.get(t), await C(t);
106
+ })();
107
+ g.set(t, n);
108
+ try {
109
+ await n;
110
+ } finally {
111
+ g.get(t) === n && g.delete(t);
112
+ }
113
+ }
114
+ async function rt() {
115
+ p++, z(), l.clear(), y.clear();
116
+ const t = v, e = (async () => {
117
+ await t, await Promise.all(w.values()), await C();
118
+ })();
119
+ v = e.catch(() => {
120
+ }), await e;
121
+ }
122
+ const y = /* @__PURE__ */ new Map(), w = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Set();
123
+ function N() {
124
+ !x && !E.size && y.clear();
125
+ }
126
+ const O = /* @__PURE__ */ new WeakMap();
127
+ function J(t) {
128
+ const e = new TextDecoder().decode(t.subarray(0, 256));
129
+ return /^\s*(?:\uFEFF)?\s*<(?:!doctype\s+html|html|head|body)(?:\s|>)/i.test(e);
130
+ }
131
+ function k(t) {
132
+ if (t.byteLength === 0) throw new Error("字体文件为空");
133
+ if (J(t)) throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");
134
+ }
135
+ function I(t) {
136
+ const e = O.get(t);
137
+ if (e) return e;
138
+ const n = (async () => {
139
+ const a = String.fromCharCode(...t.subarray(0, 4));
140
+ if (!["\0\0\0", "true", "OTTO", "wOFF", "wOF2", "ttcf"].includes(a))
141
+ throw new Error("文件内容不是支持的 TTF/OTF/WOFF 字体(可能返回了 JSON 或文本)");
142
+ const { default: r } = await import("./pdf-8UPQebOE.js").then((i) => i.f), o = r.create(t);
143
+ if (!Number.isFinite(o.unitsPerEm) || o.unitsPerEm <= 0 || !o.characterSet?.length || !o.numGlyphs)
144
+ throw new Error("字体结构无效或不含可嵌入的单字体;请提供有效的 TTF/OTF/WOFF 文件");
145
+ })();
146
+ return O.set(t, n), n;
147
+ }
148
+ function S(t, e, n = !1) {
149
+ const a = n ? "字体加载超时,请检查网络或字体服务" : e instanceof Error ? e.message : String(e);
150
+ return Object.assign(new Error(`PDF 字体 ${JSON.stringify(t)} 加载失败:${a}`), { cause: e });
151
+ }
152
+ function A(t, e) {
153
+ if (t > e) throw new Error(`字体文件超过单字体下载预算(${e}字节)`);
154
+ }
155
+ async function _(t, e, n) {
156
+ const a = Number(t.headers?.get("content-length"));
157
+ try {
158
+ Number.isFinite(a) && A(a, e);
159
+ } catch (r) {
160
+ throw t.body?.cancel(r).catch(() => {
161
+ }), r;
162
+ }
163
+ if (!t.body) {
164
+ const r = new Uint8Array(await F(t.arrayBuffer(), n));
165
+ return A(r.byteLength, e), r;
166
+ }
167
+ return R(t.body, e, n);
168
+ }
169
+ async function R(t, e, n) {
170
+ const a = t.getReader(), r = [];
171
+ let o = 0;
172
+ try {
173
+ for (; ; ) {
174
+ const s = await F(a.read(), n);
175
+ if (s.done) break;
176
+ o += s.value.byteLength, A(o, e), r.push(s.value);
177
+ }
178
+ const i = new Uint8Array(o);
179
+ let c = 0;
180
+ for (const s of r)
181
+ i.set(s, c), c += s.byteLength;
182
+ return i;
183
+ } catch (i) {
184
+ throw a.cancel(i).catch(() => {
185
+ }), i;
186
+ } finally {
187
+ a.releaseLock();
188
+ }
189
+ }
190
+ async function K(t, e, n) {
191
+ if (t[0] !== 31 || t[1] !== 139) return t;
192
+ if (typeof DecompressionStream > "u") throw new Error("当前环境不支持 gzip 字体解压,请使用未压缩的字体 URL 或支持 DecompressionStream 的浏览器 / Node 环境");
193
+ const r = new ReadableStream({ start(o) {
194
+ o.enqueue(t), o.close();
195
+ } }).pipeThrough(new DecompressionStream("gzip"));
196
+ return R(r, e, n);
197
+ }
198
+ async function Q(t) {
199
+ const e = new AbortController();
200
+ let n = !1;
201
+ const a = setTimeout(() => {
202
+ n = !0, e.abort();
203
+ }, 15e3);
204
+ try {
205
+ const r = await fetch(t, { signal: e.signal });
206
+ if (!r.ok) throw new Error(`字体请求返回 HTTP ${r.status}`);
207
+ if (/text\/html|application\/xhtml\+xml/i.test(r.headers?.get("content-type") ?? ""))
208
+ throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");
209
+ const o = B().maxFontBytes, i = await _(r, o, e.signal), c = await K(i, o, e.signal);
210
+ return k(c), { bytes: c, fromCache: !1 };
211
+ } catch (r) {
212
+ throw e.abort(), S(t, r, n);
213
+ } finally {
214
+ clearTimeout(a);
215
+ }
216
+ }
217
+ async function X(t) {
218
+ await v, await g.get(t);
219
+ const e = await V(t);
220
+ if (e)
221
+ try {
222
+ return k(e), { bytes: e, fromCache: !0 };
223
+ } catch {
224
+ }
225
+ return Q(t);
226
+ }
227
+ function Y(t) {
228
+ const e = l.get(t);
229
+ if (e) return e;
230
+ const n = X(t);
231
+ l.set(t, n), E.add(n);
232
+ const a = () => {
233
+ l.get(t) === n && l.delete(t), E.delete(n), N();
234
+ };
235
+ return n.then(a, a), n;
236
+ }
237
+ async function Z(t, e, n, a) {
238
+ if ((y.get(t) ?? 0) !== n || p !== a) return;
239
+ W(t, e);
240
+ const r = w.get(t);
241
+ if (r) {
242
+ await r;
243
+ return;
244
+ }
245
+ const o = q(t, e);
246
+ w.set(t, o), await o, w.get(t) === o && w.delete(t);
247
+ }
248
+ function m(t) {
249
+ return t.reason ?? new DOMException("字体加载已取消", "AbortError");
250
+ }
251
+ function F(t, e) {
252
+ return e ? e.aborted ? Promise.reject(m(e)) : new Promise((n, a) => {
253
+ const r = () => {
254
+ e.removeEventListener("abort", r), a(m(e));
255
+ };
256
+ e.addEventListener("abort", r, { once: !0 }), t.then((o) => {
257
+ e.removeEventListener("abort", r), n(o);
258
+ }, (o) => {
259
+ e.removeEventListener("abort", r), a(o);
260
+ });
261
+ }) : t;
262
+ }
263
+ async function tt(t, e, n, a, r) {
264
+ try {
265
+ return await F(I(e.bytes), n.signal), e.bytes;
266
+ } catch (o) {
267
+ if (n.signal?.aborted) throw m(n.signal);
268
+ if ((y.get(t) ?? 0) !== a || p !== r) throw S(t, o);
269
+ if (await G(t), e.fromCache) return await et(t, n);
270
+ throw S(t, o);
271
+ }
272
+ }
273
+ async function et(t, e = {}) {
274
+ if (e.signal?.aborted) throw m(e.signal);
275
+ const n = y.get(t) ?? 0, a = p, r = U(t);
276
+ if (r && !e.strict) return r;
277
+ const o = r ? void 0 : Y(t);
278
+ x++;
279
+ try {
280
+ const i = r ? { bytes: r, fromCache: !0 } : await F(o, e.signal), c = e.strict ? await tt(t, i, e, n, a) : i.bytes;
281
+ if (e.signal?.aborted) throw m(e.signal);
282
+ return r || await F(Z(t, c, n, a), e.signal), c;
283
+ } catch (i) {
284
+ if (e.signal?.aborted) throw m(e.signal);
285
+ if (e.strict) throw i;
286
+ return null;
287
+ } finally {
288
+ x--, N();
289
+ }
290
+ }
291
+ export {
292
+ rt as clearFontCache,
293
+ nt as configureFontCache,
294
+ B as getFontCacheStats,
295
+ G as invalidateFontCache,
296
+ et as loadFontWithCache
297
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=new Map;let b=0,d={maxFonts:8,maxBytes:64*1024*1024,maxFontBytes:24*1024*1024};function O(){for(;f.size>d.maxFonts||b>d.maxBytes;){const t=f.keys().next().value;b-=f.get(t).byteLength,f.delete(t)}}function W(t){const e={...d,...t};if(!Object.values(e).every(n=>Number.isSafeInteger(n)&&n>0))throw new Error("字体缓存预算应为正整数字节/数量");d=e;for(const[n,a]of f)a.byteLength>d.maxFontBytes&&B(n);O()}function p(){return{fonts:f.size,bytes:b,...d}}function j(t){const e=f.get(t);return e&&(f.delete(t),f.set(t,e)),e}function B(t){const e=f.get(t);e&&(b-=e.byteLength),f.delete(t)}function q(){f.clear(),b=0}function H(t,e){B(t),!(e.byteLength>d.maxBytes||e.byteLength>d.maxFontBytes)&&(f.set(t,e),b+=e.byteLength,O())}const V="mach-report-fonts",u="fonts";function $(){return new Promise((t,e)=>{const n=indexedDB.open(V,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(u)||n.result.createObjectStore(u)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error)})}function M(t){if(t instanceof Uint8Array)return{bytes:t,accessedAt:0};const e=t;return e?.bytes instanceof Uint8Array&&Number.isFinite(e.accessedAt)?e:void 0}async function C(t,e){if(typeof indexedDB>"u")return t;let n;try{return n=await $(),await e(n)}catch{return t}finally{n?.close()}}function G(t){return C(null,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u),i=o.get(t);let c=null;i.onsuccess=()=>{const s=M(i.result);s&&s.bytes.byteLength<=p().maxFontBytes?(c=s.bytes,o.put({bytes:s.bytes,accessedAt:Date.now()},t)):i.result!==void 0&&o.delete(t)},r.oncomplete=()=>n(c),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}function J(t,e,n,a){const r=p(),o=e.filter(s=>s.key!==n);t.delete(n),a.byteLength<=Math.min(r.maxFontBytes,r.maxBytes)&&o.unshift({key:n,bytes:a.byteLength,accessedAt:Date.now()}),o.sort((s,h)=>h.accessedAt-s.accessedAt);let i=0,c=0;for(const s of o){if(c>=r.maxFonts||i+s.bytes>r.maxBytes||s.bytes>r.maxFontBytes){t.delete(s.key);continue}i+=s.bytes,c++,s.key===n&&t.put({bytes:a,accessedAt:s.accessedAt},n)}}function _(t,e){return C(void 0,n=>new Promise((a,r)=>{const o=n.transaction(u,"readwrite"),i=o.objectStore(u),c=i.openCursor(),s=[];c.onsuccess=()=>{const h=c.result;if(!h){J(i,s,t,e);return}const x=M(h.value);x?s.push({key:h.key,bytes:x.bytes.byteLength,accessedAt:x.accessedAt}):h.delete(),h.continue()},o.oncomplete=()=>a(),o.onerror=()=>r(o.error),o.onabort=()=>r(o.error)}))}function D(t){return C(void 0,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u);t===void 0?o.clear():o.delete(t),r.oncomplete=()=>n(),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}let L=0,S=0,v=Promise.resolve();const g=new Map;async function N(t){l.set(t,(l.get(t)??0)+1),B(t),w.delete(t);const e=g.get(t),n=(async()=>{await v,await e,await y.get(t),await D(t)})();g.set(t,n);try{await n}finally{g.get(t)===n&&g.delete(t)}}async function I(){L++,q(),w.clear(),l.clear();const t=v,e=(async()=>{await t,await Promise.all(y.values()),await D()})();v=e.catch(()=>{}),await e}const l=new Map,y=new Map,w=new Map,E=new Set;function k(){!S&&!E.size&&l.clear()}const T=new WeakMap;function K(t){const e=new TextDecoder().decode(t.subarray(0,256));return/^\s*(?:\uFEFF)?\s*<(?:!doctype\s+html|html|head|body)(?:\s|>)/i.test(e)}function R(t){if(t.byteLength===0)throw new Error("字体文件为空");if(K(t))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件")}function Q(t){const e=T.get(t);if(e)return e;const n=(async()=>{const a=String.fromCharCode(...t.subarray(0,4));if(!["\0\0\0","true","OTTO","wOFF","wOF2","ttcf"].includes(a))throw new Error("文件内容不是支持的 TTF/OTF/WOFF 字体(可能返回了 JSON 或文本)");const{default:r}=await Promise.resolve().then(()=>require("./pdf-AyJGb22z.cjs")).then(i=>i.fontkit_es),o=r.create(t);if(!Number.isFinite(o.unitsPerEm)||o.unitsPerEm<=0||!o.characterSet?.length||!o.numGlyphs)throw new Error("字体结构无效或不含可嵌入的单字体;请提供有效的 TTF/OTF/WOFF 文件")})();return T.set(t,n),n}function A(t,e,n=!1){const a=n?"字体加载超时,请检查网络或字体服务":e instanceof Error?e.message:String(e);return Object.assign(new Error(`PDF 字体 ${JSON.stringify(t)} 加载失败:${a}`),{cause:e})}function P(t,e){if(t>e)throw new Error(`字体文件超过单字体下载预算(${e}字节)`)}async function X(t,e,n){const a=Number(t.headers?.get("content-length"));try{Number.isFinite(a)&&P(a,e)}catch(r){throw t.body?.cancel(r).catch(()=>{}),r}if(!t.body){const r=new Uint8Array(await F(t.arrayBuffer(),n));return P(r.byteLength,e),r}return U(t.body,e,n)}async function U(t,e,n){const a=t.getReader(),r=[];let o=0;try{for(;;){const s=await F(a.read(),n);if(s.done)break;o+=s.value.byteLength,P(o,e),r.push(s.value)}const i=new Uint8Array(o);let c=0;for(const s of r)i.set(s,c),c+=s.byteLength;return i}catch(i){throw a.cancel(i).catch(()=>{}),i}finally{a.releaseLock()}}async function Y(t,e,n){if(t[0]!==31||t[1]!==139)return t;if(typeof DecompressionStream>"u")throw new Error("当前环境不支持 gzip 字体解压,请使用未压缩的字体 URL 或支持 DecompressionStream 的浏览器 / Node 环境");const r=new ReadableStream({start(o){o.enqueue(t),o.close()}}).pipeThrough(new DecompressionStream("gzip"));return U(r,e,n)}async function Z(t){const e=new AbortController;let n=!1;const a=setTimeout(()=>{n=!0,e.abort()},15e3);try{const r=await fetch(t,{signal:e.signal});if(!r.ok)throw new Error(`字体请求返回 HTTP ${r.status}`);if(/text\/html|application\/xhtml\+xml/i.test(r.headers?.get("content-type")??""))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");const o=p().maxFontBytes,i=await X(r,o,e.signal),c=await Y(i,o,e.signal);return R(c),{bytes:c,fromCache:!1}}catch(r){throw e.abort(),A(t,r,n)}finally{clearTimeout(a)}}async function tt(t){await v,await g.get(t);const e=await G(t);if(e)try{return R(e),{bytes:e,fromCache:!0}}catch{}return Z(t)}function et(t){const e=w.get(t);if(e)return e;const n=tt(t);w.set(t,n),E.add(n);const a=()=>{w.get(t)===n&&w.delete(t),E.delete(n),k()};return n.then(a,a),n}async function nt(t,e,n,a){if((l.get(t)??0)!==n||L!==a)return;H(t,e);const r=y.get(t);if(r){await r;return}const o=_(t,e);y.set(t,o),await o,y.get(t)===o&&y.delete(t)}function m(t){return t.reason??new DOMException("字体加载已取消","AbortError")}function F(t,e){return e?e.aborted?Promise.reject(m(e)):new Promise((n,a)=>{const r=()=>{e.removeEventListener("abort",r),a(m(e))};e.addEventListener("abort",r,{once:!0}),t.then(o=>{e.removeEventListener("abort",r),n(o)},o=>{e.removeEventListener("abort",r),a(o)})}):t}async function rt(t,e,n,a,r){try{return await F(Q(e.bytes),n.signal),e.bytes}catch(o){if(n.signal?.aborted)throw m(n.signal);if((l.get(t)??0)!==a||L!==r)throw A(t,o);if(await N(t),e.fromCache)return await z(t,n);throw A(t,o)}}async function z(t,e={}){if(e.signal?.aborted)throw m(e.signal);const n=l.get(t)??0,a=L,r=j(t);if(r&&!e.strict)return r;const o=r?void 0:et(t);S++;try{const i=r?{bytes:r,fromCache:!0}:await F(o,e.signal),c=e.strict?await rt(t,i,e,n,a):i.bytes;if(e.signal?.aborted)throw m(e.signal);return r||await F(nt(t,c,n,a),e.signal),c}catch(i){if(e.signal?.aborted)throw m(e.signal);if(e.strict)throw i;return null}finally{S--,k()}}exports.clearFontCache=I;exports.configureFontCache=W;exports.getFontCacheStats=p;exports.invalidateFontCache=N;exports.loadFontWithCache=z;