@agile-team/mach-report 2.5.0 → 2.7.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.
- package/README.md +126 -16
- package/dist/ReportPreview-BdvoqdOd.cjs +6 -0
- package/dist/ReportPreview-COFkbeEM.js +3719 -0
- package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
- package/dist/analytics.cjs +1 -0
- package/dist/analytics.d.cts +276 -0
- package/dist/analytics.d.ts +276 -0
- package/dist/analytics.js +223 -0
- package/dist/assets-B9qJku3V.js +160 -0
- package/dist/assets-RZan7EyL.cjs +1 -0
- package/dist/capabilities-joSutDF8.js +63 -0
- package/dist/capabilities-xGTpnPjJ.cjs +1 -0
- package/dist/designer.cjs +1 -0
- package/dist/designer.d.cts +869 -0
- package/dist/designer.d.ts +869 -0
- package/dist/designer.js +628 -0
- package/dist/index.cjs +8 -5
- package/dist/index.d.cts +497 -9
- package/dist/index.d.ts +497 -9
- package/dist/index.js +1088 -1499
- package/dist/param-validation-BWNjLcN0.js +116 -0
- package/dist/param-validation-CiTxFeZ8.cjs +1 -0
- package/dist/pdf.cjs +48 -48
- package/dist/pdf.d.cts +119 -1
- package/dist/pdf.d.ts +119 -1
- package/dist/pdf.js +3932 -3868
- package/dist/{plugin-DMPLDpBY.cjs → plugin-9t_ZFwhz.cjs} +1 -1
- package/dist/{plugin-DDLcFWlk.js → plugin-s8Ay8kKk.js} +2 -2
- package/dist/progress-DD964VAB.js +102 -0
- package/dist/progress-KvhwXZ1Q.cjs +1 -0
- package/dist/render-plan-CckPEQyf.cjs +1 -0
- package/dist/{render-plan-CXBWRog4.js → render-plan-uzZYYSy1.js} +11 -10
- package/dist/report-params-B_VCihAh.js +12 -0
- package/dist/report-params-CjWrjPl6.cjs +1 -0
- package/dist/report-source-BXHNy_AD.js +755 -0
- package/dist/report-source-CCAvFE3t.cjs +1 -0
- package/dist/server/node.d.cts +320 -0
- package/dist/server/node.d.ts +320 -0
- package/dist/server-node.cjs +1 -0
- package/dist/server-node.js +303 -0
- package/dist/server.cjs +1 -0
- package/dist/server.d.cts +668 -0
- package/dist/server.d.ts +668 -0
- package/dist/server.js +245 -0
- package/dist/style-CpwiOPyB.cjs +1 -0
- package/dist/style-Dv5o_x6b.js +67 -0
- package/dist/style.css +1 -1
- package/dist/task-events-DQ276fn2.cjs +1 -0
- package/dist/task-events-Dpsvf_t2.js +47 -0
- package/dist/template-registry-DWExx0gU.cjs +1 -0
- package/dist/template-registry-NpOakidD.js +354 -0
- package/dist/textwrap-CnGsEum6.cjs +4 -0
- package/dist/textwrap-DOl04hCQ.js +110 -0
- package/dist/validate-DfHPD8wX.cjs +1 -0
- package/dist/validate-S6CgIm5d.js +148 -0
- package/dist/vue/async.d.cts +1507 -1538
- package/dist/vue/async.d.ts +1507 -1538
- package/dist/vue/index.d.cts +2376 -2347
- package/dist/vue/index.d.ts +2376 -2347
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +184 -75
- package/dist/worker.cjs +1 -0
- package/dist/worker.d.cts +325 -0
- package/dist/worker.d.ts +325 -0
- package/dist/worker.js +158 -0
- package/dist/xlsx/node.d.cts +47 -0
- package/dist/xlsx/node.d.ts +47 -0
- package/dist/xlsx-node.cjs +221 -0
- package/dist/xlsx-node.js +36409 -0
- package/dist/xlsx.cjs +20 -20
- package/dist/xlsx.d.cts +87 -2
- package/dist/xlsx.d.ts +87 -2
- package/dist/xlsx.js +5987 -5840
- package/package.json +63 -3
- package/dist/ReportPreview-CBKLI--k.js +0 -2188
- package/dist/ReportPreview-ClM8h0pM.cjs +0 -6
- package/dist/grid-geometry-BNIvw52m.cjs +0 -1
- package/dist/grid-geometry-C8hGoe9o.js +0 -130
- package/dist/render-plan-CCTL4F9v.cjs +0 -1
- package/dist/report-params-B3Fia6JO.js +0 -10
- package/dist/report-params-D1gZ1DME.cjs +0 -1
- package/dist/textwrap-nH0UYU6D.js +0 -108
- package/dist/textwrap-oD-t4b4B.cjs +0 -4
package/dist/server.js
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { d as _, R as E, c as Q, P as W } from "./report-source-BXHNy_AD.js";
|
|
2
|
+
import { g as k } from "./report-params-B_VCihAh.js";
|
|
3
|
+
import { b as N, r as G, R as U } from "./param-validation-BWNjLcN0.js";
|
|
4
|
+
import { c as X } from "./validate-S6CgIm5d.js";
|
|
5
|
+
import { r as F, c as C, n as T } from "./task-events-Dpsvf_t2.js";
|
|
6
|
+
class b extends Error {
|
|
7
|
+
constructor(e, n, s) {
|
|
8
|
+
super(n), this.code = e, this.path = s, this.name = "ReportRuntimeError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function y(r) {
|
|
12
|
+
if (!r?.aborted) return;
|
|
13
|
+
if (r.reason instanceof b) throw r.reason;
|
|
14
|
+
const e = new Error("报表执行已取消");
|
|
15
|
+
throw e.name = "AbortError", Object.defineProperty(e, "cause", { value: r.reason }), e;
|
|
16
|
+
}
|
|
17
|
+
function x(r, e, n) {
|
|
18
|
+
if (!Number.isFinite(n) || n < 0) throw new b("budget", `${e} 的执行统计无效`, `$.budget.${e}`);
|
|
19
|
+
const s = r[e];
|
|
20
|
+
if (s !== void 0 && n > s) throw new b("budget", `${e} 超出预算 ${s}(实际 ${n})`, `$.budget.${e}`);
|
|
21
|
+
}
|
|
22
|
+
function H(r) {
|
|
23
|
+
for (const [e, n] of Object.entries(r)) {
|
|
24
|
+
if (n !== void 0 && (!Number.isFinite(n) || n <= 0)) throw new b("budget", `${e} 应为正有限数字`, `$.budget.${e}`);
|
|
25
|
+
if (e !== "maxDurationMs" && n !== void 0 && !Number.isSafeInteger(n)) throw new b("budget", `${e} 应为正安全整数`, `$.budget.${e}`);
|
|
26
|
+
if (e === "maxDurationMs" && n !== void 0 && n > 2147483647) throw new b("budget", "maxDurationMs 不能超过 2147483647", `$.budget.${e}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function A(r, e, n) {
|
|
30
|
+
const s = new AbortController(), t = () => s.abort(r?.reason);
|
|
31
|
+
r?.addEventListener("abort", t, { once: !0 }), r?.aborted && t();
|
|
32
|
+
const a = Date.now(), u = e === void 0 ? void 0 : setTimeout(() => s.abort(new b("timeout", `报表执行超过 ${e}ms`)), e);
|
|
33
|
+
let d;
|
|
34
|
+
try {
|
|
35
|
+
y(s.signal);
|
|
36
|
+
const m = new Promise((w, i) => {
|
|
37
|
+
d = () => {
|
|
38
|
+
try {
|
|
39
|
+
y(s.signal);
|
|
40
|
+
} catch (g) {
|
|
41
|
+
i(g);
|
|
42
|
+
}
|
|
43
|
+
}, s.signal.addEventListener("abort", d, { once: !0 });
|
|
44
|
+
}), c = await Promise.race([n(s.signal), m]);
|
|
45
|
+
if (y(s.signal), e !== void 0 && Date.now() - a > e) throw new b("timeout", `报表执行超过 ${e}ms`);
|
|
46
|
+
return c;
|
|
47
|
+
} finally {
|
|
48
|
+
u !== void 0 && clearTimeout(u), d && s.signal.removeEventListener("abort", d), r?.removeEventListener("abort", t);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function z(r, e) {
|
|
52
|
+
if (e.length === 0) throw new E("config", "缺少报表 ID");
|
|
53
|
+
return e.map((n) => {
|
|
54
|
+
if (!Object.prototype.hasOwnProperty.call(r, n)) throw new E("config", `未注册报表 ${n}`);
|
|
55
|
+
return r[n];
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function D(r) {
|
|
59
|
+
return r.grid?.cells.reduce((e, n) => e + n.reduce((s, t) => s + (t ? 1 + (t.children?.reduce((a, u) => a + D(u), 0) ?? 0) : 0), 0), 0) ?? 0;
|
|
60
|
+
}
|
|
61
|
+
function K(r, e) {
|
|
62
|
+
return r.pages.reduce((n, s) => n + s.components.reduce((t, a) => {
|
|
63
|
+
if (a.kind !== "list") return t + D(a);
|
|
64
|
+
const u = e[a.dataset]?.length ?? 0;
|
|
65
|
+
return t + a.columns.length * (u + (a.headerGrid?.cells.length ?? 1));
|
|
66
|
+
}, 0), 0);
|
|
67
|
+
}
|
|
68
|
+
function Y(r, e = Object.keys(r)) {
|
|
69
|
+
return z(r, e).map((n, s) => {
|
|
70
|
+
const t = e[s], a = k(r, [t]);
|
|
71
|
+
return {
|
|
72
|
+
id: t,
|
|
73
|
+
params: JSON.parse(JSON.stringify(a)),
|
|
74
|
+
paramsSchema: G(a),
|
|
75
|
+
datasetsSchema: Object.fromEntries(Object.entries(n.dataSchema ?? {}).map(([u, d]) => [u, _(d)])),
|
|
76
|
+
capabilities: {
|
|
77
|
+
save: !!n.provider?.save,
|
|
78
|
+
export: !!n.provider?.export,
|
|
79
|
+
templates: !!n.provider?.templates
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function J(r, e) {
|
|
85
|
+
z(r, e.reportIds);
|
|
86
|
+
const n = N(k(r, e.reportIds), e.params), s = e.reportIds.flatMap((a) => N(k(r, [a]), e.params).issues), t = new Map(s.map((a) => [JSON.stringify(a), a]));
|
|
87
|
+
return { ...n, ok: t.size === 0, issues: [...t.values()] };
|
|
88
|
+
}
|
|
89
|
+
function Z(r, e) {
|
|
90
|
+
const n = X(r.plan);
|
|
91
|
+
if (!n.ok) throw new E("validate", `执行器返回无效计划:${n.errors[0]?.path}`);
|
|
92
|
+
const s = r.plan.pages.length, t = r.plan.pages.reduce((a, u) => a + u.components.reduce((d, m) => d + D(m), 0), 0);
|
|
93
|
+
return x(e, "maxRows", r.stats.rows), x(e, "maxPages", s), x(e, "maxCells", t), { ...r, stats: { ...r.stats, pages: s, cells: t } };
|
|
94
|
+
}
|
|
95
|
+
function M(r, e) {
|
|
96
|
+
const n = J(r.reports, e);
|
|
97
|
+
if (!n.ok) throw new U(n.issues);
|
|
98
|
+
}
|
|
99
|
+
function q(r = []) {
|
|
100
|
+
return r.map(({ code: e, message: n, severity: s, pageIndex: t, componentIndex: a }) => ({ code: e, message: n, severity: s, path: `$.pages.${t}.components.${a}` }));
|
|
101
|
+
}
|
|
102
|
+
function ae(r) {
|
|
103
|
+
const e = { maxRows: 1e5, maxPages: 1e4, maxCells: 2e6, maxOutputBytes: 1e8, maxDurationMs: 12e4, ...r.budget };
|
|
104
|
+
H(e);
|
|
105
|
+
const n = async (t, a) => {
|
|
106
|
+
const u = Date.now();
|
|
107
|
+
let d = 0, m = 0;
|
|
108
|
+
const c = [], w = {}, i = Object.fromEntries(Object.entries(r.reports).map(([l, o]) => [l, {
|
|
109
|
+
...o,
|
|
110
|
+
pagination: { ...r.pagination, ...o.pagination, ...a ? { measurer: a } : {} },
|
|
111
|
+
dataValidation: {
|
|
112
|
+
...o.dataValidation,
|
|
113
|
+
maxRows: Math.min(e.maxRows ?? 1e5, o.dataValidation?.maxRows ?? 1 / 0),
|
|
114
|
+
maxCells: Math.min(e.maxCells ?? 2e6, o.dataValidation?.maxCells ?? 1 / 0)
|
|
115
|
+
}
|
|
116
|
+
}])), p = await Q(i, { maxPages: e.maxPages, onDatasets: (l, o, v) => {
|
|
117
|
+
d += Object.values(o).reduce((P, S) => P + S.length, 0), x(e, "maxRows", d), m += K(v, o), x(e, "maxCells", m);
|
|
118
|
+
} })({ ...t, params: t.params ?? {}, onWarning: (l) => c.push({ code: "layout", message: l, severity: "warning" }), onQueryResult: (l, o) => {
|
|
119
|
+
Object.defineProperty(w, l, { value: { revision: o.revision, sourceToken: o.sourceToken }, enumerable: !0, writable: !0 }), c.push(...o.diagnostics ?? []);
|
|
120
|
+
} }).catch((l) => {
|
|
121
|
+
throw l instanceof E && l.cause instanceof W ? new b("budget", l.cause.message, "$.budget.maxPages") : l;
|
|
122
|
+
});
|
|
123
|
+
y(t.signal);
|
|
124
|
+
const f = p.pages.reduce((l, o) => l + o.components.reduce((v, P) => v + D(P), 0), 0);
|
|
125
|
+
return x(e, "maxPages", p.pages.length), x(e, "maxCells", f), { plan: p, diagnostics: c, revisions: w, stats: { rows: d, pages: p.pages.length, cells: f, durationMs: Date.now() - u } };
|
|
126
|
+
}, s = async (t) => {
|
|
127
|
+
const a = Date.now();
|
|
128
|
+
if (t.format !== "pdf" && t.format !== "xlsx") throw new E("config", "不支持的报表导出格式");
|
|
129
|
+
const u = t.format === "pdf" ? await import("@agile-team/mach-report/pdf") : void 0;
|
|
130
|
+
y(t.signal);
|
|
131
|
+
const d = t.pdf?.customFontFaces ?? (t.pdf?.customFontBytes ? { regular: t.pdf.customFontBytes } : void 0), m = u && d ? u.createFontBytesMeasurer(d) : void 0, c = await n(t, m);
|
|
132
|
+
y(t.signal);
|
|
133
|
+
const w = C(t), i = await w.run("encode", async () => {
|
|
134
|
+
let f;
|
|
135
|
+
if (t.format === "pdf") {
|
|
136
|
+
y(t.signal);
|
|
137
|
+
const l = await u.renderPlanToPdf(c.plan, { ...t.pdf, ...m ? { measurer: m } : {}, fidelity: t.fidelity, signal: t.signal, onProgress: (o, v) => w.progress("encode", o, v) });
|
|
138
|
+
f = l.bytes, c.diagnostics.push(...q(l.diagnostics)), c.diagnostics.push(...l.fidelityWarnings.map((o) => ({ code: "pdf-fidelity", message: o, severity: "warning" })), ...l.pageErrors.map((o) => ({ code: "pdf-page", message: o, severity: "error" }))), l.unsupportedTextCount && c.diagnostics.push({ code: "pdf-font", message: `${l.unsupportedTextCount} 段文本包含当前字体不支持的字符`, severity: "warning" });
|
|
139
|
+
} else {
|
|
140
|
+
const { renderPlanToXlsx: l } = await import("@agile-team/mach-report/xlsx");
|
|
141
|
+
y(t.signal);
|
|
142
|
+
const o = await l(c.plan, { ...t.xlsx, fidelity: t.fidelity, signal: t.signal, onProgress: (v, P) => w.progress("encode", v, P) });
|
|
143
|
+
f = new Uint8Array(o.buffer), c.diagnostics.push(...q(o.diagnostics)), c.diagnostics.push(...o.warnings.map((v) => ({ code: "xlsx-fidelity", message: v, severity: "warning" })));
|
|
144
|
+
}
|
|
145
|
+
return y(t.signal), f;
|
|
146
|
+
});
|
|
147
|
+
x(e, "maxOutputBytes", i.byteLength);
|
|
148
|
+
const { plan: g, ...p } = c;
|
|
149
|
+
return { ...p, bytes: i, format: t.format, contentType: t.format === "pdf" ? "application/pdf" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", stats: { ...p.stats, durationMs: Date.now() - a, outputBytes: i.byteLength } };
|
|
150
|
+
};
|
|
151
|
+
return {
|
|
152
|
+
describe: (t) => Y(r.reports, t),
|
|
153
|
+
validate: (t) => J(r.reports, t),
|
|
154
|
+
prepare: (t) => A(t.signal, e.maxDurationMs, async (a) => {
|
|
155
|
+
const { signal: u, onEvent: d, ...m } = t, c = { ...m, taskId: m.taskId ?? F() }, w = d ? (p) => T(d, p, a) : void 0, i = { ...c, signal: a, onEvent: w };
|
|
156
|
+
C(i).runSync("validate", () => M(r, c));
|
|
157
|
+
const g = r.executor ? await r.executor.prepare(c, a, w) : await n(i);
|
|
158
|
+
return Z(g, e);
|
|
159
|
+
}),
|
|
160
|
+
export: (t) => A(t.signal, e.maxDurationMs, async (a) => {
|
|
161
|
+
const { signal: u, onEvent: d, ...m } = t, c = { ...m, taskId: m.taskId ?? F() }, w = d ? (p) => T(d, p, a) : void 0, i = { ...c, signal: a, onEvent: w };
|
|
162
|
+
if (C(i).runSync("validate", () => M(r, c)), c.format !== "pdf" && c.format !== "xlsx") throw new E("config", "不支持的报表导出格式");
|
|
163
|
+
const g = r.executor ? await r.executor.export(c, a, w) : await s(i);
|
|
164
|
+
return x(e, "maxRows", g.stats.rows), x(e, "maxPages", g.stats.pages), x(e, "maxCells", g.stats.cells), x(e, "maxOutputBytes", g.bytes.byteLength), { ...g, stats: { ...g.stats, outputBytes: g.bytes.byteLength } };
|
|
165
|
+
})
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function oe(r = {}) {
|
|
169
|
+
const e = r.concurrency ?? 1, n = r.maxQueued ?? 20;
|
|
170
|
+
if (!Number.isSafeInteger(e) || e < 1 || !Number.isSafeInteger(n) || n < 0) throw new b("budget", "队列并发应为正整数,排队上限应为非负整数");
|
|
171
|
+
const s = [], t = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set();
|
|
172
|
+
let u = !1, d = 0;
|
|
173
|
+
const m = () => {
|
|
174
|
+
for (; !u && t.size < e && s.length; ) s.shift().start();
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
get active() {
|
|
178
|
+
return t.size;
|
|
179
|
+
},
|
|
180
|
+
get pending() {
|
|
181
|
+
return s.length;
|
|
182
|
+
},
|
|
183
|
+
enqueue: (w, i = {}) => {
|
|
184
|
+
if (u) throw new b("closed", "任务队列已关闭");
|
|
185
|
+
if (y(i.signal), t.size >= e && s.length >= n) throw new b("queue-full", "报表任务队列已满");
|
|
186
|
+
const g = i.id ?? `report-${++d}`;
|
|
187
|
+
if (a.has(g)) throw new b("queue-full", "任务 ID 正在执行或排队");
|
|
188
|
+
const p = new AbortController();
|
|
189
|
+
let f = "queued", l, o, v, P;
|
|
190
|
+
const S = new Promise((h, R) => {
|
|
191
|
+
v = h, P = R;
|
|
192
|
+
}), j = () => {
|
|
193
|
+
i.signal?.removeEventListener("abort", L), a.delete(g);
|
|
194
|
+
}, I = (h) => {
|
|
195
|
+
if (f !== "queued" && f !== "running") return;
|
|
196
|
+
const R = f === "queued";
|
|
197
|
+
f = "cancelled", p.abort(h);
|
|
198
|
+
try {
|
|
199
|
+
y(p.signal);
|
|
200
|
+
} catch (O) {
|
|
201
|
+
P(O);
|
|
202
|
+
}
|
|
203
|
+
if (R) {
|
|
204
|
+
const O = s.indexOf($);
|
|
205
|
+
O >= 0 && s.splice(O, 1), j(), m();
|
|
206
|
+
}
|
|
207
|
+
}, L = () => I(i.signal?.reason), B = (h, R) => {
|
|
208
|
+
f === "running" && (!Number.isFinite(h) || h < 0 || R !== void 0 && (!Number.isFinite(R) || R < h) || (l = { completed: h, ...R === void 0 ? {} : { total: R } }));
|
|
209
|
+
}, V = (h) => {
|
|
210
|
+
f !== "running" || p.signal.aborted || (o = { ...h, taskId: g }, h.completed !== void 0 && B(h.completed, h.total), T(i.onEvent, o, p.signal));
|
|
211
|
+
}, $ = {
|
|
212
|
+
cancel: I,
|
|
213
|
+
start: () => {
|
|
214
|
+
f === "queued" && (f = "running", t.add($), Promise.resolve().then(() => (y(p.signal), w({ taskId: g, signal: p.signal, reportProgress: B, onEvent: V }))).then(
|
|
215
|
+
(h) => {
|
|
216
|
+
f === "running" && (f = "completed", v(h));
|
|
217
|
+
},
|
|
218
|
+
(h) => {
|
|
219
|
+
f === "running" && (f = "failed", P(h));
|
|
220
|
+
}
|
|
221
|
+
).finally(() => {
|
|
222
|
+
t.delete($), j(), m();
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
return a.add(g), i.signal?.addEventListener("abort", L, { once: !0 }), i.signal?.aborted ? I(i.signal.reason) : t.size < e ? $.start() : s.push($), { id: g, get status() {
|
|
227
|
+
return f;
|
|
228
|
+
}, get progress() {
|
|
229
|
+
return l;
|
|
230
|
+
}, get event() {
|
|
231
|
+
return o;
|
|
232
|
+
}, result: S, cancel: I };
|
|
233
|
+
},
|
|
234
|
+
close: (w = {}) => {
|
|
235
|
+
u = !0;
|
|
236
|
+
for (const i of [...s]) i.cancel(new b("closed", "任务队列已关闭"));
|
|
237
|
+
if (w.cancelRunning) for (const i of t) i.cancel(new b("closed", "任务队列已关闭"));
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
export {
|
|
242
|
+
b as ReportRuntimeError,
|
|
243
|
+
ae as createReportRuntime,
|
|
244
|
+
oe as createReportTaskQueue
|
|
245
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const r=require("./render-plan-CckPEQyf.cjs"),l=25.4,i=96;function f(o=i){return o/l}function S(o,t=i){return(o||0)*f(t)}function c(o,t=i){return o/f(t)}function P(o,t=i){return o*t/72}function m(o,t){const e=10**t;return Math.round(o*e)/e}const h={a3:{widthMm:297,heightMm:420},a4:{widthMm:210,heightMm:297},a5:{widthMm:148,heightMm:210},b4:{widthMm:250,heightMm:353},b5:{widthMm:176,heightMm:250}};function s(o,t=96,e=r.DEFAULT_FONT_PT){if(o?.fontSizePx!=null)return{fontSizePt:o.fontSizePx*72/t,fontSizePx:o.fontSizePx};const n=o?.fontSize??e;return{fontSizePt:n,fontSizePx:P(n,t)}}function T(o,t=r.DEFAULT_STROKE_COLOR){return{color:o?.borderColor??o?.lineColor??t,widthPt:o?.lineWidthPt??r.DEFAULT_BORDER_PT}}function x(o,t=r.DEFAULT_TEXT_COLOR){return o?.color??t}function M(o){return o?.lineHeight??r.LINE_HEIGHT}function _(o){const t=o?.borderTop!==!1,e=o?.borderRight!==!1,n=o?.borderBottom!==!1,u=o?.borderLeft!==!1;return{top:t,right:e,bottom:n,left:u,inner:t||e||n||u}}function d(o,t){const e={...o,...t};return t?.fontSize!=null&&t.fontSizePx==null&&delete e.fontSizePx,t?.fontSizePx!=null&&t.fontSize==null&&delete e.fontSize,e}exports.CSS_DPI=i;exports.MM_PER_INCH=l;exports.PAPER_SIZES=h;exports.mergeComponentStyles=d;exports.mmToPx=S;exports.mmToPxFactor=f;exports.ptToPx=P;exports.pxToMm=c;exports.resolveBoxBorders=_;exports.resolveFontSize=s;exports.resolveLineHeight=M;exports.resolveStroke=T;exports.resolveTextColor=x;exports.round=m;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { d as s, e as a, a as u, L as c, c as h } from "./render-plan-uzZYYSy1.js";
|
|
2
|
+
const l = 25.4, r = 96;
|
|
3
|
+
function f(t = r) {
|
|
4
|
+
return t / l;
|
|
5
|
+
}
|
|
6
|
+
function S(t, n = r) {
|
|
7
|
+
return (t || 0) * f(n);
|
|
8
|
+
}
|
|
9
|
+
function T(t, n = r) {
|
|
10
|
+
return t / f(n);
|
|
11
|
+
}
|
|
12
|
+
function m(t, n = r) {
|
|
13
|
+
return t * n / 72;
|
|
14
|
+
}
|
|
15
|
+
function d(t, n) {
|
|
16
|
+
const o = 10 ** n;
|
|
17
|
+
return Math.round(t * o) / o;
|
|
18
|
+
}
|
|
19
|
+
const x = {
|
|
20
|
+
a3: { widthMm: 297, heightMm: 420 },
|
|
21
|
+
a4: { widthMm: 210, heightMm: 297 },
|
|
22
|
+
a5: { widthMm: 148, heightMm: 210 },
|
|
23
|
+
b4: { widthMm: 250, heightMm: 353 },
|
|
24
|
+
b5: { widthMm: 176, heightMm: 250 }
|
|
25
|
+
};
|
|
26
|
+
function z(t, n = 96, o = s) {
|
|
27
|
+
if (t?.fontSizePx != null)
|
|
28
|
+
return { fontSizePt: t.fontSizePx * 72 / n, fontSizePx: t.fontSizePx };
|
|
29
|
+
const e = t?.fontSize ?? o;
|
|
30
|
+
return { fontSizePt: e, fontSizePx: m(e, n) };
|
|
31
|
+
}
|
|
32
|
+
function M(t, n = a) {
|
|
33
|
+
return {
|
|
34
|
+
color: t?.borderColor ?? t?.lineColor ?? n,
|
|
35
|
+
widthPt: t?.lineWidthPt ?? h
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function _(t, n = u) {
|
|
39
|
+
return t?.color ?? n;
|
|
40
|
+
}
|
|
41
|
+
function g(t) {
|
|
42
|
+
return t?.lineHeight ?? c;
|
|
43
|
+
}
|
|
44
|
+
function E(t) {
|
|
45
|
+
const n = t?.borderTop !== !1, o = t?.borderRight !== !1, e = t?.borderBottom !== !1, i = t?.borderLeft !== !1;
|
|
46
|
+
return { top: n, right: o, bottom: e, left: i, inner: n || o || e || i };
|
|
47
|
+
}
|
|
48
|
+
function L(t, n) {
|
|
49
|
+
const o = { ...t, ...n };
|
|
50
|
+
return n?.fontSize != null && n.fontSizePx == null && delete o.fontSizePx, n?.fontSizePx != null && n.fontSize == null && delete o.fontSize, o;
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
r as C,
|
|
54
|
+
l as M,
|
|
55
|
+
x as P,
|
|
56
|
+
z as a,
|
|
57
|
+
g as b,
|
|
58
|
+
M as c,
|
|
59
|
+
E as d,
|
|
60
|
+
L as e,
|
|
61
|
+
_ as f,
|
|
62
|
+
f as g,
|
|
63
|
+
T as h,
|
|
64
|
+
S as m,
|
|
65
|
+
m as p,
|
|
66
|
+
d as r
|
|
67
|
+
};
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.mrp-toolbar[data-v-4223ad9f]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-4223ad9f]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-4223ad9f]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-4223ad9f]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-4223ad9f]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-4223ad9f]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-settings-toggle[data-v-4223ad9f]{display:inline-flex;align-items:center;gap:5px}.mrp-pageinfo[data-v-4223ad9f]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-4223ad9f]{flex:1}.mrp-search[data-v-4223ad9f]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-4223ad9f]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-4223ad9f]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-4223ad9f]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mrp-settings-backdrop[data-v-fe89b48b]{position:absolute;inset:0;z-index:30;background:#0f172a1f;display:flex;justify-content:flex-end;padding:10px}.mrp-settings-panel[data-v-fe89b48b]{box-sizing:border-box;width:min(340px,100%);display:flex;flex-direction:column;min-height:0;border:1px solid var(--mrp-toolbar-border);border-radius:10px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);box-shadow:0 12px 40px #00000038;font-size:13px}.mrp-settings-header[data-v-fe89b48b]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 16px 10px}.mrp-settings-header strong[data-v-fe89b48b]{font-size:15px}.mrp-settings-header p[data-v-fe89b48b]{font-size:12px;opacity:.7;margin:7px 0 0;line-height:1.5}.mrp-settings-panel button[data-v-fe89b48b]{cursor:pointer;color:inherit;border:1px solid var(--mrp-btn-border);background:transparent;border-radius:5px;padding:5px 10px}.mrp-settings-panel button[data-v-fe89b48b]:hover{background:var(--mrp-btn-hover-bg)}.mrp-settings-close[data-v-fe89b48b]{font-size:20px;line-height:18px}.mrp-settings-content[data-v-fe89b48b]{overflow:auto;padding:0 16px 10px}.mrp-settings-content fieldset[data-v-fe89b48b]{border:0;border-top:1px solid var(--mrp-toolbar-border);margin:12px 0 0;padding:7px 0 0;min-width:0}.mrp-settings-content legend[data-v-fe89b48b]{font-weight:600;padding-right:10px}.mrp-settings-option[data-v-fe89b48b]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 0;cursor:pointer}.mrp-settings-option input[data-v-fe89b48b]{accent-color:var(--mrp-btn-active-bg);width:15px;height:15px;margin:0;flex:none}.mrp-settings-option small[data-v-fe89b48b]{display:block;font-size:11px;margin-top:3px;opacity:.75}.mrp-settings-unavailable[data-v-fe89b48b]{opacity:.5;cursor:default}.mrp-settings-note[data-v-fe89b48b]{font-size:11px;line-height:1.6;opacity:.75}.mrp-settings-panel footer[data-v-fe89b48b]{border-top:1px solid var(--mrp-toolbar-border);padding:10px 16px}.mrp-empty[data-v-07e9cb82]{box-sizing:border-box;position:sticky;left:max(0px,calc((100% - 560px)/2));width:min(560px,100%);margin:22px auto;padding:20px 24px 26px;text-align:center;color:var(--mrp-toolbar-fg, #526078);border:1px dashed var(--mrp-toolbar-border, #dfe5ed);border-radius:12px;background:var(--mrp-toolbar-bg, #fff)}.mrp-empty-art[data-v-07e9cb82]{display:block;width:144px;height:101px;margin:0 auto 10px}.mrp-empty strong[data-v-07e9cb82]{display:block;font-size:14px;font-weight:600}.mrp-empty p[data-v-07e9cb82]{font-size:12px;line-height:1.7;opacity:.7;margin:8px 0 0;overflow-wrap:anywhere}.mrp-params[data-v-aafce92d]{display:flex;align-items:flex-end;gap:12px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-params-title[data-v-aafce92d]{font-size:12px;font-weight:600;color:var(--mrp-toolbar-fg, #e8e8e8);padding-bottom:5px;white-space:nowrap}.mrp-params-grid[data-v-aafce92d]{display:flex;flex-wrap:wrap;gap:8px 12px;flex:1}.mrp-param[data-v-aafce92d]{display:flex;flex-direction:column;gap:2px}.mrp-param-label[data-v-aafce92d]{font-size:11px;color:var(--mrp-toolbar-fg, #e8e8e8);opacity:.85}.mrp-param-star[data-v-aafce92d]{color:#ff7b72;font-style:normal;margin-left:2px}.mrp-param-input[data-v-aafce92d]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:3px 8px;font-size:12px;min-width:130px;outline:none}.mrp-param-input[data-v-aafce92d]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-param-missing .mrp-param-input[data-v-aafce92d]{border-color:#ff7b72}select.mrp-param-input option[data-v-aafce92d]{background:#22252a}.mrp-params-actions[data-v-aafce92d]{display:flex;gap:6px;padding-bottom:1px}.mrp-nav[data-v-aafce92d]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:4px 14px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-aafce92d]:hover{background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-param-query[data-v-aafce92d]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mach-report-preview[data-v-a8ee1f0e]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-a8ee1f0e]{display:flex;flex:1;min-height:0}.mrp-body[data-v-a8ee1f0e]{flex:1;min-width:0;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-a8ee1f0e]{position:relative;margin:0 auto}.mrp-scale-inner[data-v-a8ee1f0e]{position:absolute;left:0;top:0;display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-a8ee1f0e]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--v54e94a63);flex:none}.mrp-wide-report .mrp-page-holder[data-v-a8ee1f0e]{box-shadow:none}.mrp-state[data-v-a8ee1f0e]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-a8ee1f0e]{color:#ff9d9d}.mrp-edit-hint[data-v-a8ee1f0e]{padding:5px 12px;font-size:12px;color:var(--mrp-shell-fg)}.mrp-export-notice[data-v-a8ee1f0e]{padding:7px 12px;font-size:12px;background:#fff0c2;color:#613c00}.mrp-export-error[data-v-a8ee1f0e]{background:#ffe0df;color:#8e1f1f}.mrp-export-progress[data-v-a8ee1f0e]{background:#e7f0ff;color:#1a4d86}.mrp-retry[data-v-a8ee1f0e]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-a8ee1f0e]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-a8ee1f0e] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px;scroll-margin:8px}.mrp-thumbs[data-v-a8ee1f0e]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column}.mrp-thumb[data-v-a8ee1f0e]{cursor:pointer;text-align:center;flex:none;margin-bottom:8px}.mrp-thumb-spacer[data-v-a8ee1f0e]{flex:none}.mrp-thumb-box[data-v-a8ee1f0e]{box-sizing:border-box;width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-a8ee1f0e]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-a8ee1f0e]{display:block;margin-top:4px;line-height:16px;font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-a8ee1f0e]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}
|
|
1
|
+
.mr-designer[data-v-e2d0e1d5]{display:flex;flex-direction:column;min-height:480px;height:100%;color:var(--mrp-toolbar-fg, #334155);background:var(--mrp-toolbar-bg, #fff);border:1px solid var(--mrp-toolbar-border, #e2e8f0);border-radius:10px;overflow:hidden;font:13px/1.5 sans-serif}.mr-designer-bar[data-v-e2d0e1d5]{display:flex;flex-wrap:wrap;justify-content:space-between;gap:10px;padding:12px 16px;border-bottom:1px solid var(--mrp-toolbar-border, #e2e8f0)}.mr-designer-bar span[data-v-e2d0e1d5]{display:block;font-size:11px;opacity:.7}.mr-designer-bar b[data-v-e2d0e1d5]{font-weight:400}.mr-designer-body[data-v-e2d0e1d5]{display:grid;grid-template-columns:minmax(230px,300px) minmax(0,1fr);flex:1;min-height:0}.mr-designer-panel[data-v-e2d0e1d5]{overflow:auto;padding:14px;border-right:1px solid var(--mrp-toolbar-border, #e2e8f0)}.mr-designer label[data-v-e2d0e1d5]{display:grid;grid-template-columns:90px minmax(0,1fr);align-items:center;gap:8px;margin:8px 0}.mr-designer input[data-v-e2d0e1d5],.mr-designer select[data-v-e2d0e1d5],.mr-designer textarea[data-v-e2d0e1d5],.mr-designer button[data-v-e2d0e1d5]{box-sizing:border-box;min-width:0;color:inherit;font:inherit;border:1px solid var(--mrp-toolbar-border, #cbd5e1);border-radius:5px;padding:5px 7px;background:var(--mrp-toolbar-bg, #fff)}.mr-designer input[data-v-e2d0e1d5]:focus-visible,.mr-designer select[data-v-e2d0e1d5]:focus-visible,.mr-designer textarea[data-v-e2d0e1d5]:focus-visible,.mr-designer button[data-v-e2d0e1d5]:focus-visible{outline:2px solid var(--mrp-btn-active-bg, #2563eb);outline-offset:2px}.mr-designer button[data-v-e2d0e1d5]{cursor:pointer;margin-right:6px}.mr-designer[data-v-e2d0e1d5] :disabled{cursor:default;opacity:.55}.mr-designer fieldset[data-v-e2d0e1d5]{margin:12px 0;border:1px solid var(--mrp-toolbar-border, #e2e8f0);border-radius:7px}.mr-designer legend[data-v-e2d0e1d5]{padding:0 6px;font-weight:600}.mr-designer .mr-designer-toggle[data-v-e2d0e1d5]{display:flex;justify-content:space-between}.mr-designer-preview[data-v-e2d0e1d5]{min-width:0;min-height:380px;display:flex;flex-direction:column}.mr-designer-preview[data-v-e2d0e1d5] .mrp-root{flex:1}.mr-designer-note[data-v-e2d0e1d5]{opacity:.7;font-size:11px}.mr-designer-error[data-v-e2d0e1d5]{padding:10px 16px;color:#b91c1c;background:#fef2f2}.mr-designer-json[data-v-e2d0e1d5]{width:100%;height:240px;font-family:monospace!important;margin:8px 0}.mr-designer-confirm[data-v-e2d0e1d5]{padding:12px 16px;border-bottom:1px solid var(--mrp-toolbar-border,#e2e8f0);background:var(--mrp-btn-hover-bg,#eff6ff)}.mr-designer-confirm p[data-v-e2d0e1d5]{margin:4px 0 10px}.mr-designer-column-tools[data-v-e2d0e1d5]{display:flex;align-items:center;flex-wrap:wrap;gap:4px}.mr-designer-column-tools span[data-v-e2d0e1d5]{font-size:11px;opacity:.7}.mr-designer-batch[data-v-e2d0e1d5]{margin:8px 0;padding:1px 8px;border-radius:5px;background:var(--mrp-btn-hover-bg,#eff6ff)}.mr-designer .mr-designer-select-column[data-v-e2d0e1d5]{display:flex;gap:6px;margin:0}.mr-designer-select-column input[data-v-e2d0e1d5]{width:auto}@media(max-width:720px){.mr-designer-body[data-v-e2d0e1d5]{grid-template-columns:1fr}.mr-designer-panel[data-v-e2d0e1d5]{max-height:300px;border-right:0;border-bottom:1px solid var(--mrp-toolbar-border, #e2e8f0)}}.mrp-toolbar[data-v-249cf7b0]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-249cf7b0]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-249cf7b0]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-249cf7b0]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-249cf7b0]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-249cf7b0]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-settings-toggle[data-v-249cf7b0]{display:inline-flex;align-items:center;gap:5px}.mrp-pageinfo[data-v-249cf7b0]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-249cf7b0]{flex:1}.mrp-search[data-v-249cf7b0]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-249cf7b0]{background:var(--mrp-toolbar-bg, #323639);color:var(--mrp-toolbar-fg, #e8e8e8);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-249cf7b0]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-249cf7b0]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mrp-settings-backdrop[data-v-f92f2c66]{position:absolute;inset:0;z-index:30;background:#0f172a1f;display:flex;justify-content:flex-end;padding:10px}.mrp-settings-panel[data-v-f92f2c66]{box-sizing:border-box;width:min(340px,100%);display:flex;flex-direction:column;min-height:0;border:1px solid var(--mrp-toolbar-border);border-radius:10px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);box-shadow:0 12px 40px #00000038;font-size:13px}.mrp-settings-header[data-v-f92f2c66]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 16px 10px}.mrp-settings-header strong[data-v-f92f2c66]{font-size:15px}.mrp-settings-header p[data-v-f92f2c66]{font-size:12px;opacity:.7;margin:7px 0 0;line-height:1.5}.mrp-settings-panel button[data-v-f92f2c66]{cursor:pointer;color:inherit;border:1px solid var(--mrp-btn-border);background:transparent;border-radius:5px;padding:5px 10px}.mrp-settings-panel button[data-v-f92f2c66]:hover{background:var(--mrp-btn-hover-bg)}.mrp-settings-close[data-v-f92f2c66]{font-size:20px;line-height:18px}.mrp-settings-content[data-v-f92f2c66]{overflow:auto;padding:0 16px 10px}.mrp-settings-content fieldset[data-v-f92f2c66]{border:0;border-top:1px solid var(--mrp-toolbar-border);margin:12px 0 0;padding:7px 0 0;min-width:0}.mrp-settings-content legend[data-v-f92f2c66]{font-weight:600;padding-right:10px}.mrp-settings-option[data-v-f92f2c66]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 0;cursor:pointer}.mrp-settings-option input[data-v-f92f2c66]{accent-color:var(--mrp-btn-active-bg);width:15px;height:15px;margin:0;flex:none}.mrp-settings-option input.mrp-frozen-count[data-v-f92f2c66]{width:54px;height:24px;color:inherit;background:transparent;border:1px solid var(--mrp-btn-border);border-radius:4px}.mrp-settings-option small[data-v-f92f2c66]{display:block;font-size:11px;margin-top:3px;opacity:.75}.mrp-settings-unavailable[data-v-f92f2c66]{opacity:.5;cursor:default}.mrp-settings-note[data-v-f92f2c66]{font-size:11px;line-height:1.6;opacity:.75}.mrp-settings-panel footer[data-v-f92f2c66]{border-top:1px solid var(--mrp-toolbar-border);padding:10px 16px}.mrp-empty[data-v-07e9cb82]{box-sizing:border-box;position:sticky;left:max(0px,calc((100% - 560px)/2));width:min(560px,100%);margin:22px auto;padding:20px 24px 26px;text-align:center;color:var(--mrp-toolbar-fg, #526078);border:1px dashed var(--mrp-toolbar-border, #dfe5ed);border-radius:12px;background:var(--mrp-toolbar-bg, #fff)}.mrp-empty-art[data-v-07e9cb82]{display:block;width:144px;height:101px;margin:0 auto 10px}.mrp-empty strong[data-v-07e9cb82]{display:block;font-size:14px;font-weight:600}.mrp-empty p[data-v-07e9cb82]{font-size:12px;line-height:1.7;opacity:.7;margin:8px 0 0;overflow-wrap:anywhere}.mrp-discard-backdrop[data-v-f7590294]{position:absolute;inset:0;z-index:45;background:#0f172a40;display:flex;align-items:center;justify-content:center;padding:18px}.mrp-discard-dialog[data-v-f7590294]{box-sizing:border-box;width:min(400px,100%);padding:22px;border-radius:10px;border:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);box-shadow:0 14px 45px #0003;font-size:13px}.mrp-discard-dialog strong[data-v-f7590294]{font-size:16px}.mrp-discard-dialog p[data-v-f7590294]{line-height:1.7;opacity:.8}footer[data-v-f7590294]{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}button[data-v-f7590294]{font:inherit;color:inherit;background:transparent;border:1px solid var(--mrp-btn-border);padding:7px 12px;border-radius:5px;cursor:pointer}button[data-v-f7590294]:hover{background:var(--mrp-btn-hover-bg)}button[data-v-f7590294]:focus-visible{outline:2px solid var(--mrp-btn-active-bg);outline-offset:2px}.mrp-task-status[data-v-657ac599]{display:flex;align-items:center;gap:12px;padding:9px 12px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);font-size:12px;border-bottom:1px solid var(--mrp-toolbar-border)}small[data-v-657ac599]{opacity:.7;margin-left:6px}progress[data-v-657ac599]{width:120px;height:7px;accent-color:var(--mrp-btn-active-bg)}button[data-v-657ac599]{margin-left:auto;color:inherit;background:transparent;border:1px solid var(--mrp-btn-border);border-radius:4px;padding:4px 9px;cursor:pointer}.mrp-diagnostics[data-v-3b7804ce]{background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);border-bottom:1px solid var(--mrp-toolbar-border);padding:9px 12px;font-size:12px}summary[data-v-3b7804ce]{cursor:pointer;font-weight:600}summary span[data-v-3b7804ce]{margin-left:5px;opacity:.7}input[data-v-3b7804ce]{box-sizing:border-box;margin-top:10px;width:100%;font:inherit;border:1px solid var(--mrp-btn-border);border-radius:4px;padding:6px;color:inherit;background:transparent}ol[data-v-3b7804ce]{list-style:none;margin:8px 0 0;padding:0;max-height:220px;overflow:auto}li[data-v-3b7804ce]{display:flex;align-items:center;gap:12px;padding:8px 0;border-bottom:1px solid var(--mrp-toolbar-border)}li div[data-v-3b7804ce]{min-width:0;flex:1}p[data-v-3b7804ce]{margin:4px 0;overflow-wrap:anywhere;line-height:1.5}small[data-v-3b7804ce]{opacity:.7}button[data-v-3b7804ce]{color:inherit;background:transparent;border:1px solid var(--mrp-btn-border);border-radius:4px;padding:4px 9px;cursor:pointer}.mrp-params[data-v-156737bc]{display:flex;align-items:flex-end;gap:12px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-params-title[data-v-156737bc]{font-size:12px;font-weight:600;color:var(--mrp-toolbar-fg, #e8e8e8);padding-bottom:5px;white-space:nowrap}.mrp-params-grid[data-v-156737bc]{display:flex;flex-wrap:wrap;gap:8px 12px;flex:1}.mrp-param[data-v-156737bc]{display:flex;flex-direction:column;gap:2px}.mrp-param-label[data-v-156737bc]{font-size:11px;color:var(--mrp-toolbar-fg, #e8e8e8);opacity:.85}.mrp-param-star[data-v-156737bc]{color:#ff7b72;font-style:normal;margin-left:2px}.mrp-param-input[data-v-156737bc]{background:var(--mrp-toolbar-bg, #323639);color:var(--mrp-toolbar-fg, #e8e8e8);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:3px 8px;font-size:12px;min-width:130px;outline:none}.mrp-param-input[data-v-156737bc]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-param-missing .mrp-param-input[data-v-156737bc]{border-color:#ff7b72}select.mrp-param-input option[data-v-156737bc]{background:var(--mrp-toolbar-bg, #323639);color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-param-error[data-v-156737bc]{max-width:260px;color:var(--mrp-error-fg, #e35d59);font-size:11px}.mrp-params-actions[data-v-156737bc]{display:flex;gap:6px;padding-bottom:1px}.mrp-nav[data-v-156737bc]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:4px 14px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-156737bc]:hover{background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-param-query[data-v-156737bc]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-edit-bar[data-v-df1c7b86]{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:6px 12px;border-bottom:1px solid var(--mrp-toolbar-border);font-size:12px;color:var(--mrp-toolbar-fg);background:var(--mrp-toolbar-bg)}button[data-v-df1c7b86]{font:inherit;background:transparent;color:inherit;border:1px solid var(--mrp-btn-border);border-radius:4px;padding:3px 8px;cursor:pointer}button[data-v-df1c7b86]:disabled{opacity:.45;cursor:default}summary[data-v-df1c7b86]{cursor:pointer;padding:3px 5px}.mrp-changes[data-v-df1c7b86]{position:relative}.mrp-changes section[data-v-df1c7b86]{position:absolute;z-index:15;top:28px;left:0;max-height:260px;overflow:auto;min-width:300px;max-width:min(480px,80vw);border:1px solid var(--mrp-btn-border);background:var(--mrp-toolbar-bg);padding:10px;box-shadow:0 5px 20px #0003;border-radius:6px}.mrp-changes ol[data-v-df1c7b86]{margin:0;padding-left:22px}.mrp-changes li[data-v-df1c7b86]{padding:5px 0}.mrp-changes li span[data-v-df1c7b86]{display:block;margin-top:5px;overflow-wrap:anywhere}s[data-v-df1c7b86]{opacity:.65}.mrp-conflicts[data-v-df1c7b86]{color:#b9382a;width:100%}.mrp-section-nav[data-v-3a2eb8c8]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:7px;padding:6px 12px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);font-size:12px;border-bottom:1px solid var(--mrp-toolbar-border)}.mrp-section-tabs[data-v-3a2eb8c8]{display:flex;gap:4px;overflow:auto;max-width:100%}button[data-v-3a2eb8c8],input[data-v-3a2eb8c8]{font:inherit;color:inherit;background:transparent;border:1px solid var(--mrp-btn-border);border-radius:4px;padding:4px 7px}button[data-v-3a2eb8c8]{cursor:pointer}.active[data-v-3a2eb8c8]{background:var(--mrp-btn-active-bg)}form[data-v-3a2eb8c8]{display:flex;gap:4px;margin-left:auto}input[data-v-3a2eb8c8]{width:min(220px,40vw)}input[data-v-3a2eb8c8]::placeholder{color:inherit;opacity:.6}.mrp-column-locator[data-v-3a2eb8c8]{position:relative;margin-left:auto;max-width:100%}.mrp-column-locator form[data-v-3a2eb8c8]{flex-wrap:wrap}.mrp-column-directory[data-v-3a2eb8c8]{position:absolute;right:0;top:calc(100% + 5px);z-index:12;width:min(460px,80vw);max-height:320px;overflow:auto;padding:8px;background:var(--mrp-toolbar-bg);border:1px solid var(--mrp-toolbar-border);border-radius:7px;box-shadow:0 8px 24px #0002}.mrp-column-directory section[data-v-3a2eb8c8]{margin-bottom:8px}.mrp-column-directory strong[data-v-3a2eb8c8]{display:block;font-size:11px;opacity:.7;padding:4px}.mrp-column-directory button[data-v-3a2eb8c8]{display:flex;justify-content:space-between;text-align:left;gap:12px;width:100%;border:0;padding:7px}.mrp-column-directory button[data-v-3a2eb8c8]:hover{background:var(--mrp-btn-hover-bg)}.mrp-column-directory code[data-v-3a2eb8c8]{opacity:.6;font-size:11px}button[data-v-3a2eb8c8]:focus-visible,input[data-v-3a2eb8c8]:focus-visible{outline:2px solid var(--mrp-btn-active-bg);outline-offset:2px}.mrp-import-summary[data-v-54f275e8]{padding:8px 12px;font-size:12px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);border-bottom:1px solid var(--mrp-toolbar-border);max-height:180px;overflow:auto}.mrp-import-summary summary[data-v-54f275e8]{cursor:pointer}.mrp-import-summary p[data-v-54f275e8]{opacity:.75}.mrp-import-summary li[data-v-54f275e8]{margin:4px 0}.mach-report-preview[data-v-f0801c0a]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-f0801c0a]{display:flex;flex:1;min-height:0}.mrp-body[data-v-f0801c0a]{flex:1;min-width:0;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-f0801c0a]{position:relative;margin:0 auto}.mrp-scale-inner[data-v-f0801c0a]{position:absolute;left:0;top:0;display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-f0801c0a]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--mrp-page-gap);flex:none}.mrp-wide-report .mrp-page-holder[data-v-f0801c0a]{box-shadow:none}.mrp-state[data-v-f0801c0a]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-f0801c0a]{color:#ff9d9d}.mrp-edit-hint[data-v-f0801c0a]{padding:5px 12px;font-size:12px;color:var(--mrp-shell-fg)}.mrp-body[data-v-f0801c0a] .mrp-cell-selected{background-image:linear-gradient(#2563eb12,#2563eb12)}.mrp-body[data-v-f0801c0a] .mrp-cell-focus{outline:2px solid #2563eb;outline-offset:-2px;z-index:8!important}.mrp-body[data-v-f0801c0a] .mrp-cell-modified:after{content:"";position:absolute;right:0;top:0;border-top:6px solid #d58916;border-left:6px solid transparent}.mrp-body[data-v-f0801c0a] .mrp-cell-frozen{background-color:#fff;box-shadow:1px 0 #aeb8c6,0 1px #aeb8c6}.mrp-export-notice[data-v-f0801c0a]{padding:7px 12px;font-size:12px;background:#fff0c2;color:#613c00}.mrp-export-error[data-v-f0801c0a]{background:#ffe0df;color:#8e1f1f}.mrp-export-progress[data-v-f0801c0a]{background:#e7f0ff;color:#1a4d86}.mrp-retry[data-v-f0801c0a]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-f0801c0a]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-f0801c0a] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px;scroll-margin:8px}.mrp-thumbs[data-v-f0801c0a]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column}.mrp-thumb[data-v-f0801c0a]{cursor:pointer;text-align:center;flex:none;margin:0 0 8px;padding:0;border:0;background:transparent;font:inherit}.mrp-thumb[data-v-f0801c0a]:focus-visible{outline:2px solid var(--mrp-btn-active-bg);outline-offset:2px}.mrp-thumb-spacer[data-v-f0801c0a]{flex:none}.mrp-thumb-box[data-v-f0801c0a]{display:block;box-sizing:border-box;width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-f0801c0a]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-f0801c0a]{display:block;margin-top:4px;line-height:16px;font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-f0801c0a]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}.mrp-page-holder[data-v-f0801c0a] .mrp-page-loading{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden;color:var(--mrp-btn-active-bg);font:13px/1.5 sans-serif;background:#fff}.mrp-page-holder[data-v-f0801c0a] .mrp-page-loading span{white-space:nowrap}.mrp-page-holder[data-v-f0801c0a] .mrp-page-render-error{box-sizing:border-box;padding:16px;color:#b42318;font:13px/1.5 sans-serif;white-space:normal}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";let i=0;function d(){return`report-${Date.now()}-${++i}`}function s(e,a,o){if(!o?.aborted)try{const r=e?.({...a});r&&typeof r.then=="function"&&Promise.resolve(r).catch(()=>{})}catch{}}function l(e){const a=e.taskId??d(),o=(r,n,t)=>{s(e.onEvent,{taskId:a,...e.correlationId===void 0?{}:{correlationId:e.correlationId},stage:r,status:n,...t===void 0?{}:{reportId:t}},e.signal)};return{taskId:a,progress(r,n,t){s(e.onEvent,{taskId:a,...e.correlationId===void 0?{}:{correlationId:e.correlationId},stage:r,status:"started",completed:n,total:t},e.signal)},async run(r,n,t){o(r,"started",t);try{const c=await n();return o(r,"completed",t),c}catch(c){throw o(r,"failed",t),c}},runSync(r,n,t){o(r,"started",t);try{const c=n();return o(r,"completed",t),c}catch(c){throw o(r,"failed",t),c}}}}exports.createReportTaskReporter=l;exports.notifyReportTaskEvent=s;exports.reportTaskId=d;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
let d = 0;
|
|
2
|
+
function i() {
|
|
3
|
+
return `report-${Date.now()}-${++d}`;
|
|
4
|
+
}
|
|
5
|
+
function s(e, a, o) {
|
|
6
|
+
if (!o?.aborted)
|
|
7
|
+
try {
|
|
8
|
+
const r = e?.({ ...a });
|
|
9
|
+
r && typeof r.then == "function" && Promise.resolve(r).catch(() => {
|
|
10
|
+
});
|
|
11
|
+
} catch {
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function l(e) {
|
|
15
|
+
const a = e.taskId ?? i(), o = (r, n, t) => {
|
|
16
|
+
s(e.onEvent, { taskId: a, ...e.correlationId === void 0 ? {} : { correlationId: e.correlationId }, stage: r, status: n, ...t === void 0 ? {} : { reportId: t } }, e.signal);
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
taskId: a,
|
|
20
|
+
progress(r, n, t) {
|
|
21
|
+
s(e.onEvent, { taskId: a, ...e.correlationId === void 0 ? {} : { correlationId: e.correlationId }, stage: r, status: "started", completed: n, total: t }, e.signal);
|
|
22
|
+
},
|
|
23
|
+
async run(r, n, t) {
|
|
24
|
+
o(r, "started", t);
|
|
25
|
+
try {
|
|
26
|
+
const c = await n();
|
|
27
|
+
return o(r, "completed", t), c;
|
|
28
|
+
} catch (c) {
|
|
29
|
+
throw o(r, "failed", t), c;
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
runSync(r, n, t) {
|
|
33
|
+
o(r, "started", t);
|
|
34
|
+
try {
|
|
35
|
+
const c = n();
|
|
36
|
+
return o(r, "completed", t), c;
|
|
37
|
+
} catch (c) {
|
|
38
|
+
throw o(r, "failed", t), c;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
l as c,
|
|
45
|
+
s as n,
|
|
46
|
+
i as r
|
|
47
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const L=require("./render-plan-CckPEQyf.cjs"),N=require("./validate-DfHPD8wX.cjs"),O=require("./param-validation-CiTxFeZ8.cjs"),E="1.0";class p extends Error{constructor(t){super(`模板校验失败:${t.slice(0,3).map(s=>`${s.path}: ${s.message}`).join("; ")}`),this.errors=t,this.name="ReportTemplateError"}}const P=new Set(["__proto__","prototype","constructor"]),x=new Set(["schemaVersion","id","name","revision","description","template"]),D=new Set(["left","center","right","justify"]),M=2e5,V=64,k=1e7;function r(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function J(e,t,s){const i=Object.getPrototypeOf(e),o=Array.isArray(e);if(o?i!==Array.prototype:i!==Object.prototype&&i!==null)return s.push({path:t,message:"模板对象必须使用普通 JSON 对象原型"}),!1;if(o){const n=Object.keys(e);if(n.length!==e.length||n.some(a=>!/^(0|[1-9]\d*)$/.test(a)||Number(a)>=e.length))return s.push({path:t,message:"模板数组不能包含空位或额外属性"}),!1}return Object.getOwnPropertySymbols(e).length>0?(s.push({path:t,message:"模板不能包含 Symbol 键"}),!1):!0}function I(e,t,s,i){return P.has(e)?(i.push({path:s,message:"模板不能包含可能污染原型的键"}),!1):t.get||t.set||!t.enumerable?(i.push({path:s,message:"模板不能包含访问器或不可枚举字段"}),!1):!0}function C(e){return e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)}function v(e,t){const s=new Set;let i=0,o=0,n=!1;const a=(f,h,m)=>{if(!n){if(++i>M){i===M+1&&t.push({path:h,message:"模板超过 JSON 节点安全上限"});return}if(m>V){t.push({path:h,message:"模板嵌套层级过深"});return}if(typeof f=="string"){o+=f.length,o>k&&(n=!0,t.push({path:h,message:"模板文本超过 1000 万字符的安全上限"}));return}if(!C(f)){if(!f||typeof f!="object"){t.push({path:h,message:"模板只允许 JSON 值,不允许函数、undefined 或非有限数字"});return}if(s.has(f)){t.push({path:h,message:"模板不能包含循环引用"});return}if(J(f,h,t)){s.add(f);for(const[u,g]of Object.entries(Object.getOwnPropertyDescriptors(f))){if(Array.isArray(f)&&u==="length")continue;const y=`${h}.${u}`;if(I(u,g,y,t)&&a(g.value,y,m+1),i>M||n)break}s.delete(f)}}}};a(e,"$",0)}function l(e,t,s,i,o=!1){const n=e[t];n===void 0&&!o||(typeof n!="string"||o&&!n.trim())&&i.push({path:`${s}.${t}`,message:o?"应为非空字符串":"应为字符串"})}function c(e,t,s,i,o=0,n=!1){const a=e[t];a===void 0&&!n||(typeof a!="number"||!Number.isFinite(a)||a<o)&&i.push({path:`${s}.${t}`,message:`应为大于等于 ${o} 的有限数字`})}function b(e,t,s,i){e[t]!==void 0&&typeof e[t]!="boolean"&&i.push({path:`${s}.${t}`,message:"应为布尔值"})}function $(e,t,s,i=!1){e!==void 0&&!D.has(e)&&!(i&&e==="auto")&&s.push({path:t,message:`未知对齐方式${i?"(支持 auto)":""}`})}function d(e,t,s){if(e!==void 0){if(!r(e)){s.push({path:t,message:"样式应为对象"});return}$(e.align,`${t}.align`,s),e.verticalAlign!==void 0&&!["top","middle","bottom"].includes(e.verticalAlign)&&s.push({path:`${t}.verticalAlign`,message:"未知垂直对齐方式"});for(const i of["fontSize","fontSizePx","lineWidthPt","lineHeight"])c(e,i,t,s);for(const i of["letterSpacing","rotateDeg"])c(e,i,t,s,-1/0);c(e,"opacity",t,s),typeof e.opacity=="number"&&e.opacity>1&&s.push({path:`${t}.opacity`,message:"透明度不能大于 1"});for(const i of["bold","italic","underline","borderTop","borderRight","borderBottom","borderLeft"])b(e,i,t,s);for(const i of["fontFamily","color","backgroundColor","lineColor","borderColor"])l(e,i,t,s)}}function F(e,t,s){if(e===void 0)return;if(!Array.isArray(e)){s.push({path:t,message:"参数定义应为数组"});return}const i=new Set,o=s.length;e.forEach((n,a)=>{const f=`${t}.${a}`;if(!r(n)){s.push({path:f,message:"参数定义应为对象"});return}l(n,"field",f,s,!0),typeof n.field=="string"&&(i.has(n.field)&&s.push({path:`${f}.field`,message:"参数名重复"}),i.add(n.field)),n.type!==void 0&&!["text","number","date","select"].includes(n.type)&&s.push({path:`${f}.type`,message:"未知参数类型"});for(const h of["label","defaultValue","placeholder"])l(n,h,f,s);b(n,"required",f,s);for(const h of["minLength","maxLength"]){const m=n[h];m!==void 0&&(typeof m!="number"||!Number.isSafeInteger(m)||m<0)&&s.push({path:`${f}.${h}`,message:"长度边界应为非负整数"})}j(n,f,s),n.options!==void 0&&(Array.isArray(n.options)?n.options.forEach((h,m)=>{const u=`${f}.options.${m}`;if(!r(h))s.push({path:u,message:"选项应为对象"});else for(const g of["label","value"])typeof h[g]!="string"&&s.push({path:`${u}.${g}`,message:"选项标签与值应为字符串(允许空白选项)"})}):s.push({path:`${f}.options`,message:"选项应为数组"}))}),s.length===o&&s.push(...O.validateReportParamDefinitions(e).map(n=>({path:n.path.replace("$.paramDefs",t),message:n.message})))}function j(e,t,s){for(const n of["min","max"]){const a=e[n];if(a===void 0)continue;(e.type==="date"?typeof a=="string"&&O.isReportDate(a):e.type==="number"&&typeof a=="number"&&Number.isFinite(a))||s.push({path:`${t}.${n}`,message:"number 使用有限数字边界,date 使用有效 YYYY-MM-DD 日期边界"})}const i=typeof e.min=="number"&&typeof e.max=="number"&&e.min>e.max,o=typeof e.min=="string"&&typeof e.max=="string"&&e.min>e.max;(i||o)&&s.push({path:t,message:"最小边界不能大于最大边界"}),typeof e.minLength=="number"&&typeof e.maxLength=="number"&&e.minLength>e.maxLength&&s.push({path:t,message:"最小长度不能大于最大长度"})}function H(e,t,s){if(!Array.isArray(e)||e.length===0){s.push({path:t,message:"列表至少需要一列"});return}e.forEach((i,o)=>{const n=`${t}.${o}`;if(!r(i)){s.push({path:n,message:"列应为对象"});return}if(N.validateEditableMetadata(i,n,s),typeof i.header!="string"&&s.push({path:`${n}.header`,message:"表头应为字符串(允许空白表头)"}),l(i,"field",n,s,!0),c(i,"widthMm",n,s,Number.MIN_VALUE,!0),d(i.style,`${n}.style`,s),d(i.headerStyle,`${n}.headerStyle`,s),$(i.align,`${n}.align`,s,!0),$(i.headerAlign,`${n}.headerAlign`,s),i.semanticRole!==void 0&&!["identifier","dimension","measure","date","text"].includes(i.semanticRole)&&s.push({path:`${n}.semanticRole`,message:"未知列语义"}),i.format!==void 0)if(!r(i.format)||!["number","percent","date"].includes(i.format.kind))s.push({path:`${n}.format`,message:"未知列格式"});else{const a=i.format.digits;a!==void 0&&(typeof a!="number"||!Number.isInteger(a)||a<0||a>100)&&s.push({path:`${n}.format.digits`,message:"小数位应为 0–100 的整数"}),b(i.format,"thousands",`${n}.format`,s),l(i.format,"pattern",`${n}.format`,s)}i.rules!==void 0&&(Array.isArray(i.rules)?i.rules.forEach((a,f)=>{const h=`${n}.rules.${f}`;if(!r(a)||!r(a.when)){s.push({path:h,message:"条件格式缺少 when 对象"});return}l(a.when,"field",`${h}.when`,s,!0),[">",">=","<","<=","==","!="].includes(a.when.op)||s.push({path:`${h}.when.op`,message:"未知条件运算符"}),typeof a.when.value!="number"&&typeof a.when.value!="string"&&s.push({path:`${h}.when.value`,message:"条件值应为数字或字符串"}),d(a.style,`${h}.style`,s)}):s.push({path:`${n}.rules`,message:"条件格式应为数组"}))})}function U(e,t,s){if(e!==void 0){if(!r(e)){s.push({path:t,message:"分组应为对象"});return}l(e,"field",t,s,!0);for(const i of["headerTemplate","subtotalLabel"])l(e,i,t,s);for(const i of["headerStyle","subtotalStyle"])d(e[i],`${t}.${i}`,s);b(e,"keepWithNext",t,s),e.subtotal!==void 0&&(!Array.isArray(e.subtotal)||e.subtotal.some(i=>typeof i!="string"))&&s.push({path:`${t}.subtotal`,message:"小计字段应为字符串数组"})}}function G(e,t,s){if(!(e===void 0||typeof e=="boolean")){if(!r(e)){s.push({path:t,message:"合计应为布尔值或对象"});return}l(e,"label",t,s),d(e.style,`${t}.style`,s),e.fields!==void 0&&(!Array.isArray(e.fields)||e.fields.some(i=>typeof i!="string"))&&s.push({path:`${t}.fields`,message:"合计字段应为字符串数组"})}}function W(e,t,s,i){const o={kind:"rect",leftMm:0,topMm:0,widthMm:1,heightMm:1,grid:e};if(N.validateComponent(o,s,i,[]),R(o,s,i),!r(e)||!Array.isArray(e.cells))return;const n=e.cells,a=Array.isArray(t)?t.length:0;if(n.length*a>M){i.push({path:s,message:"表头逻辑网格超过 20 万格安全上限"});return}e.cells.length||i.push({path:`${s}.cells`,message:"表头至少需要一行"}),Array.isArray(e.colWidthsMm)&&e.colWidthsMm.length!==a&&i.push({path:`${s}.colWidthsMm`,message:"表头列宽数量应与列表列数一致"}),Array.isArray(e.rowHeightsMm)&&e.rowHeightsMm.length!==e.cells.length&&i.push({path:`${s}.rowHeightsMm`,message:"表头行高数量应与行数一致"}),Y(n,a,s,i)}function Y(e,t,s,i){const o=new Set;e.forEach((n,a)=>{if(!Array.isArray(n))return;let f=0;n.forEach((h,m)=>{for(;o.has(`${a}:${f}`);)f++;const u=r(h)&&typeof h.colSpan=="number"?h.colSpan:1,g=r(h)&&typeof h.rowSpan=="number"?h.rowSpan:1;(f+u>t||a+g>e.length)&&i.push({path:`${s}.cells.${a}.${m}`,message:"表头合并区域超出表头边界"});for(let y=a;y<Math.min(e.length,a+g);y++)for(let A=f;A<Math.min(t,f+u);A++)o.has(`${y}:${A}`)&&i.push({path:`${s}.cells.${a}.${m}`,message:"表头合并区域重叠"}),o.add(`${y}:${A}`);f+=u})})}function z(e,t,s){for(const i of["leftMm","topMm"])c(e,i,t,s,-1/0,!0);c(e,"widthMm",t,s,Number.MIN_VALUE,!0),l(e,"dataset",t,s,!0),l(e,"title",t,s);for(const i of["rowKey","revisionField","sourceTokenField"])l(e,i,t,s,e[i]!==void 0);e.headerGrid!==void 0&&W(e.headerGrid,e.columns,`${t}.headerGrid`,s),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&s.push({path:`${t}.layout`,message:"布局应为 page 或 wide"}),H(e.columns,`${t}.columns`,s);for(const i of["fontSizePt","rowHeightMm"])c(e,i,t,s,Number.MIN_VALUE);c(e,"paddingMm",t,s);for(const i of["headerBold","headerEveryPage","border"])b(e,i,t,s);l(e,"headerBackgroundColor",t,s),$(e.align,`${t}.align`,s,!0),$(e.headerAlign,`${t}.headerAlign`,s),d(e.headerStyle,`${t}.headerStyle`,s),U(e.groupBy,`${t}.groupBy`,s),G(e.grandTotal,`${t}.grandTotal`,s)}function R(e,t,s){d(e.style,`${t}.style`,s);for(const o of["text","rawText","imageData","fallbackText","nid","rkey"])l(e,o,t,s);if(e.lines!==void 0&&(!Array.isArray(e.lines)||e.lines.some(o=>typeof o!="string"))&&s.push({path:`${t}.lines`,message:"文本行应为字符串数组"}),Array.isArray(e.richParagraphs)&&e.richParagraphs.forEach((o,n)=>{if(!r(o))return;const a=`${t}.richParagraphs.${n}`;$(o.align,`${a}.align`,s);for(const f of["lineHeight","spaceBeforeMm","spaceAfterMm","indentMm"])c(o,f,a,s);Array.isArray(o.segments)&&o.segments.forEach((f,h)=>{const m=`${a}.segments.${h}`;if(!r(f)){s.push({path:m,message:"富文本片段应为对象"});return}f.kind!==void 0&&f.kind!=="text"&&f.kind!=="field"&&s.push({path:`${m}.kind`,message:"未知富文本片段类型"});for(const u of["text","field"])l(f,u,m,s);d(f.style,`${m}.style`,s)})}),!r(e.grid))return;const i=e.grid;c(i,"gapMm",`${t}.grid`,s),c(i,"paddingMm",`${t}.grid`,s);for(const o of["colWidthsMm","rowHeightsMm"]){const n=i[o];n!==void 0&&(!Array.isArray(n)||n.some(a=>typeof a!="number"||!Number.isFinite(a)||a<0))&&s.push({path:`${t}.grid.${o}`,message:"网格尺寸应为有限非负数字数组"})}Array.isArray(i.cells)&&i.cells.forEach((o,n)=>{Array.isArray(o)&&o.forEach((a,f)=>{const h=`${t}.grid.cells.${n}.${f}`;if(a!==null){if(!r(a)){s.push({path:h,message:"网格单元格应为对象或 null"});return}for(const m of["text","rawText","numberFormat"])l(a,m,h,s);for(const m of["colSpan","rowSpan"]){const u=a[m];u!==void 0&&(typeof u!="number"||!Number.isInteger(u)||u<=0)&&s.push({path:`${h}.${m}`,message:"跨度应为正整数"})}a.value!==void 0&&a.value!==null&&!["string","number","boolean"].includes(typeof a.value)&&s.push({path:`${h}.value`,message:"Excel 原始值应为字符串、数字、布尔值或 null"}),d(a.style,`${h}.style`,s),a.children!==void 0&&(Array.isArray(a.children)?a.children.forEach((m,u)=>{r(m)&&R(m,`${h}.children.${u}`,s)}):s.push({path:`${h}.children`,message:"嵌套组件应为数组"}))}})})}function T(e){const t=[],s=[];return v(e,t),t.length?{ok:!1,errors:t,warnings:s}:(r(e)?(e.schemaVersion!==void 0&&e.schemaVersion!==L.RENDER_PLAN_SCHEMA_VERSION&&t.push({path:"$.schemaVersion",message:"不支持的模板 schemaVersion"}),F(e.params,"$.params",t),!Array.isArray(e.pages)||e.pages.length===0?t.push({path:"$.pages",message:"模板至少需要一页"}):e.pages.forEach((i,o)=>{const n=`$.pages.${o}`;if(!r(i)){t.push({path:n,message:"页应为对象"});return}c(i,"widthMm",n,t,Number.MIN_VALUE,!0),c(i,"heightMm",n,t,Number.MIN_VALUE,!0),i.layout!==void 0&&i.layout!=="page"&&i.layout!=="wide"&&t.push({path:`${n}.layout`,message:"布局应为 page 或 wide"}),typeof i.heightMm=="number"&&i.heightMm>=5e3&&t.push({path:`${n}.heightMm`,message:"页高应小于 5000mm"});for(const a of["marginTopMm","marginBottomMm","marginLeftMm","marginRightMm"])c(i,a,n,t);typeof i.widthMm=="number"&&Number(i.marginLeftMm??0)+Number(i.marginRightMm??0)>=i.widthMm&&t.push({path:n,message:"横向页边距占满页面"}),typeof i.heightMm=="number"&&Number(i.marginTopMm??0)+Number(i.marginBottomMm??0)>=i.heightMm&&t.push({path:n,message:"纵向页边距占满页面"}),Array.isArray(i.components)?i.components.forEach((a,f)=>{const h=`${n}.components.${f}`;r(a)&&a.kind==="list"?z(a,h,t):(N.validateComponent(a,h,t,s),r(a)&&R(a,h,t))}):t.push({path:`${n}.components`,message:"组件应为数组"})})):t.push({path:"$",message:"模板应为对象"}),{ok:t.length===0,errors:t,warnings:s})}function _(e){const t=[],s=[];if(v(e,t),t.length)return{ok:!1,errors:t,warnings:s};if(!r(e))t.push({path:"$",message:"模板文档应为对象"});else{for(const o of Object.keys(e))x.has(o)||t.push({path:`$.${o}`,message:"模板文档存在未知字段;只保存模板与描述,不保存取数或业务数据"});e.schemaVersion!==E&&t.push({path:"$.schemaVersion",message:"不支持的模板文档版本"});for(const o of["id","name"])l(e,o,"$",t,!0);for(const o of["revision","description"])l(e,o,"$",t);const i=T(e.template);t.push(...i.errors.map(o=>({...o,path:`$.template${o.path.slice(1)}`}))),s.push(...i.warnings.map(o=>({...o,path:`$.template${o.path.slice(1)}`})))}return{ok:t.length===0,errors:t,warnings:s}}function S(e){const t=_(e);if(!t.ok)throw new p(t.errors)}function K(e){const t=[];if(v(e,t),t.length)throw new p(t);const s={...e,schemaVersion:e.schemaVersion??E};return S(s),w(s)}function X(e){let t=e;if(typeof e=="string"){if(e.length>k)throw new p([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);try{t=JSON.parse(e)}catch{throw new p([{path:"$",message:"模板 JSON 语法无效"}])}}return S(t),w(t)}function q(e){S(e);const t=JSON.stringify(e,null,2);if(t.length>k)throw new p([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);return t}function w(e){return JSON.parse(JSON.stringify(e))}function B(e=[]){const t=new Map,s={get:i=>{const o=t.get(i);return o?w(o):void 0},list:()=>Array.from(t.values(),({template:i,...o})=>({...o})),register:(i,o={})=>{if(S(i),t.has(i.id)&&!o.replace)throw new p([{path:"$.id",message:`模板 ID ${i.id} 已注册;更新需显式 replace:true`}]);t.set(i.id,w(i))},remove:i=>t.delete(i)};for(const i of e)s.register(i);return s}exports.REPORT_TEMPLATE_DOCUMENT_VERSION=E;exports.ReportTemplateError=p;exports.createTemplateRegistry=B;exports.defineReportTemplate=K;exports.parseReportTemplate=X;exports.serializeReportTemplate=q;exports.validateReportTemplate=T;exports.validateReportTemplateDocument=_;
|