@agile-team/mach-report 2.16.0 → 2.18.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 +25 -12
- package/dist/{ExcelBindingWizard-CP6h2x1f.cjs → ExcelBindingWizard-Czn3C2yE.cjs} +1 -1
- package/dist/{ExcelBindingWizard-HhB3hAJE.js → ExcelBindingWizard-DMGZj6I6.js} +3 -3
- package/dist/ParamEditor-KzDQvbHY.js +732 -0
- package/dist/ParamEditor-oDfD8LgE.cjs +1 -0
- package/dist/{ReportBatchPanel-ruxcbfY6.js → ReportBatchPanel-BJK7PvZ4.js} +39 -39
- package/dist/ReportBatchPanel-DnmNRssu.cjs +1 -0
- package/dist/ReportParamPanel-mQkeN70Q.js +1020 -0
- package/dist/ReportParamPanel-sOANVRz-.cjs +1 -0
- package/dist/ReportPreview-BxWWTUL5.js +5583 -0
- package/dist/ReportPreview-Yf99omi3.cjs +6 -0
- package/dist/{ReportTemplateLibrary-DcwrH-63.js → ReportTemplateLibrary-BFjB08Wu.js} +1 -1
- package/dist/{ReportTemplateLibrary-BDlNT8JN.cjs → ReportTemplateLibrary-BO42QnWd.cjs} +1 -1
- package/dist/RuleEditor-CqxT1a-W.js +2337 -0
- package/dist/RuleEditor-D7YWigD9.cjs +1 -0
- package/dist/{TemplateOutlinePanel-CGrT5DFN.cjs → TemplateOutlinePanel-B0XX350V.cjs} +1 -1
- package/dist/{TemplateOutlinePanel-SXCjaPKR.js → TemplateOutlinePanel-zG0DrsIB.js} +2 -2
- package/dist/{TemplateReusePanel-6Z3wRFz8.cjs → TemplateReusePanel-BD0HSKp_.cjs} +1 -1
- package/dist/{TemplateReusePanel-lHLOS9Wn.js → TemplateReusePanel-Czwe5GbC.js} +2 -2
- package/dist/{TemplateReviewPanel-Dpk7sLcF.cjs → TemplateReviewPanel-CA5sdffM.cjs} +1 -1
- package/dist/{TemplateReviewPanel-CJ9PLc48.js → TemplateReviewPanel-NhmQI65C.js} +2 -2
- package/dist/analytics.cjs +1 -1
- package/dist/analytics.d.cts +163 -42
- package/dist/analytics.d.ts +163 -42
- package/dist/analytics.js +76 -141
- package/dist/artifact-integrity.json +110 -108
- package/dist/assets-2eC3mOcV.js +232 -0
- package/dist/assets-B0Hxn4l6.cjs +1 -0
- package/dist/{auto-uVBjX1j5.cjs → auto-B0EZFIK1.cjs} +1 -1
- package/dist/{auto-YR7a4BtF.js → auto-BlchZ1b8.js} +10 -10
- package/dist/{batch-WzDIXJAt.js → batch-DGCt44XM.js} +1 -1
- package/dist/{batch-z6Aw5GEY.cjs → batch-DYcokH4v.cjs} +1 -1
- package/dist/charts-Dlv8j2AG.js +141 -0
- package/dist/charts-aCtoswXq.cjs +1 -0
- package/dist/codes.cjs +9 -9
- package/dist/codes.d.cts +54 -0
- package/dist/codes.d.ts +54 -0
- package/dist/codes.js +12097 -13668
- package/dist/column-visual-BpgQVWwT.js +238 -0
- package/dist/column-visual-CtYxnBCP.cjs +1 -0
- package/dist/component-tree-6TV7W6Yj.cjs +1 -0
- package/dist/component-tree-CvW4lzpv.js +67 -0
- package/dist/computed-4TnxzgIh.cjs +1 -0
- package/dist/computed-C8NRZQss.js +739 -0
- package/dist/data-bar-Ce38juRZ.cjs +1 -0
- package/dist/data-bar-PtjXhMgN.js +9 -0
- package/dist/dataset-DL83majE.js +161 -0
- package/dist/dataset-IrlXbUvh.cjs +1 -0
- package/dist/designer--TKECSEc.cjs +2 -0
- package/dist/designer-d6hJS41w.js +5683 -0
- package/dist/designer.cjs +1 -1
- package/dist/designer.d.cts +835 -45
- package/dist/designer.d.ts +835 -45
- package/dist/designer.js +23 -20
- package/dist/{encoding-BYF9ZTl9.cjs → encoding-B--eZpp1.cjs} +1 -1
- package/dist/{encoding-BOGq4qYL.js → encoding-mctOLocI.js} +2 -2
- package/dist/{font-loader-EKLzOJxf.cjs → font-loader-DBBJ5KE9.cjs} +1 -1
- package/dist/{font-loader-CzI1GuBc.js → font-loader-DW8tIaNp.js} +1 -1
- package/dist/index-CPh6tqge.js +1575 -0
- package/dist/index-CUNw7dL9.cjs +1 -0
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +534 -16
- package/dist/index.d.ts +534 -16
- package/dist/index.js +1393 -955
- package/dist/json-snapshot-By4ZVVUt.js +1967 -0
- package/dist/json-snapshot-jiXff4lc.cjs +2 -0
- package/dist/matrix-0hywp0-F.cjs +1 -0
- package/dist/matrix-Dy-tyY7E.js +381 -0
- package/dist/param-validation-C-8sRJLq.cjs +1 -0
- package/dist/param-validation-CnDEd2l-.js +333 -0
- package/dist/{pdf-DJ5S6ukC.js → pdf-CKROKygt.js} +1845 -1845
- package/dist/{pdf-ByVCb1i6.cjs → pdf-DqyxJ96U.cjs} +47 -47
- package/dist/pdf.cjs +1 -1
- package/dist/pdf.d.cts +66 -0
- package/dist/pdf.d.ts +66 -0
- package/dist/pdf.js +2 -2
- package/dist/{plugin-C2j5_mhx.js → plugin-ByjF2kiV.js} +5 -5
- package/dist/{plugin-Dr39GBRG.cjs → plugin-DM1M2wlI.cjs} +1 -1
- package/dist/prefill-B8H9qwE4.js +371 -0
- package/dist/prefill-D7EswyTI.cjs +1 -0
- package/dist/{prepared-DqtpvRTn.js → prepared-BE-4jfX5.js} +2 -2
- package/dist/{prepared-DdrjLC7L.cjs → prepared-CGVphji3.cjs} +1 -1
- package/dist/{protocol-BzwMP4Vw.cjs → protocol-ByRVzzQG.cjs} +1 -1
- package/dist/{protocol-kt4Iy6-3.js → protocol-Cr81vFSQ.js} +3 -3
- package/dist/{record-bindings-CZWBJ1fU.js → record-bindings-DEJtmo3p.js} +67 -107
- package/dist/record-bindings-ehjnCDHt.cjs +1 -0
- package/dist/{region-binding-workflow-CWNvIjkV.js → region-binding-workflow-CBg0l_tj.js} +2 -2
- package/dist/{region-binding-workflow-CqSMxQ4p.cjs → region-binding-workflow-D05tOYn3.cjs} +1 -1
- package/dist/report-encoding-worker.cjs +1 -1
- package/dist/report-encoding-worker.js +1 -1
- package/dist/{report-params-B1RzkhJj.js → report-params-D9tBuM9B.js} +1 -1
- package/dist/{report-params-WDGrA4oP.cjs → report-params-VTg8MoCp.cjs} +1 -1
- package/dist/runtime-CDA6d263.cjs +1 -0
- package/dist/runtime-CEMvybO7.js +170 -0
- package/dist/sbom.cdx.json +1 -1
- package/dist/server/node.d.cts +121 -7
- package/dist/server/node.d.ts +121 -7
- package/dist/server-node.cjs +4 -4
- package/dist/server-node.js +3446 -2115
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +417 -29
- package/dist/server.d.ts +417 -29
- package/dist/server.js +787 -544
- package/dist/sha256-BDQ1Qk7A.js +158 -0
- package/dist/sha256-DgZAKXqI.cjs +1 -0
- package/dist/style.css +1 -1
- package/dist/template-bindings-Cg5oBLFT.cjs +1 -0
- package/dist/template-bindings-TKnXM7ll.js +62 -0
- package/dist/{template-catalog-BtR2JmCL.js → template-catalog-CmbWOJqy.js} +16 -16
- package/dist/template-catalog-Utu4GP09.cjs +1 -0
- package/dist/{template-fragments-BVsbxs4a.cjs → template-fragments-C_zSHJAa.cjs} +1 -1
- package/dist/{template-fragments-By0aZC1D.js → template-fragments-DWgo9tlZ.js} +2 -2
- package/dist/{template-outline-BwRV_eRo.cjs → template-outline-DWkzZXVC.cjs} +1 -1
- package/dist/{template-outline-cnWfT_LK.js → template-outline-DiADphlq.js} +1 -1
- package/dist/{template-registry-Cw3vRTX2.js → template-registry-BIhIHOab.js} +319 -314
- package/dist/template-registry-DzWswQI5.cjs +1 -0
- package/dist/vue/async.d.cts +636 -35
- package/dist/vue/async.d.ts +636 -35
- package/dist/vue/index.d.cts +746 -67
- package/dist/vue/index.d.ts +746 -67
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +94 -89
- package/dist/{workbook-session-Cbts-22R.cjs → workbook-session-B94EwVa_.cjs} +1 -1
- package/dist/{workbook-session-BeSO8PFB.js → workbook-session-BoScoOg-.js} +2 -2
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +75 -7
- package/dist/worker.d.ts +75 -7
- package/dist/worker.js +4 -4
- package/dist/xlsx.cjs +4 -4
- package/dist/xlsx.d.cts +208 -15
- package/dist/xlsx.d.ts +208 -15
- package/dist/xlsx.js +288 -252
- package/package.json +1 -1
- package/dist/ParamEditor-CUQLgoxa.cjs +0 -1
- package/dist/ParamEditor-OKesP_nO.js +0 -594
- package/dist/ReportBatchPanel-cZCAMAwH.cjs +0 -1
- package/dist/ReportPreview-BcDKCLiK.js +0 -4834
- package/dist/ReportPreview-Bk9nLfO9.cjs +0 -6
- package/dist/RuleEditor-BX5S8RSF.cjs +0 -1
- package/dist/RuleEditor-CGl9XY2s.js +0 -2037
- package/dist/assets-CqIbfbTr.js +0 -126
- package/dist/assets-e4YSke8n.cjs +0 -1
- package/dist/capabilities-DDwXr_cA.js +0 -103
- package/dist/capabilities-DNLyZdNw.cjs +0 -1
- package/dist/component-tree-Ca6YYfHq.js +0 -61
- package/dist/component-tree-DkGLEfZC.cjs +0 -1
- package/dist/computed-C-4C2S5h.js +0 -521
- package/dist/computed-CGV2a809.cjs +0 -1
- package/dist/config-Dg_o8e7m.cjs +0 -1
- package/dist/config-XQ4qrQ7Q.js +0 -844
- package/dist/dataset-BkRmwgeJ.cjs +0 -1
- package/dist/dataset-H5pFuQGU.js +0 -121
- package/dist/designer-BfQSahxq.js +0 -5163
- package/dist/designer-CPPdeM5_.cjs +0 -2
- package/dist/diagnostic-notification-B9K9We3h.cjs +0 -1
- package/dist/diagnostic-notification-qGAYZdkB.js +0 -7
- package/dist/drill-CsdjgkRM.cjs +0 -1
- package/dist/drill-DIGsZfyB.js +0 -145
- package/dist/json-snapshot-D6ioHth9.js +0 -1702
- package/dist/json-snapshot-DknkjvxP.cjs +0 -2
- package/dist/matrix-CGRGkn5s.js +0 -112
- package/dist/matrix-gEO7ZM_u.cjs +0 -1
- package/dist/param-validation-C3HlcLLO.cjs +0 -1
- package/dist/param-validation-Do7Eg8Zv.js +0 -181
- package/dist/record-bindings-DUX1VMlR.cjs +0 -1
- package/dist/runtime-BjKBI530.js +0 -168
- package/dist/runtime-CBFEPKEs.cjs +0 -1
- package/dist/sha256-BshdOkCC.cjs +0 -1
- package/dist/sha256-DTG-Gq8i.js +0 -157
- package/dist/template-bindings-C2SpvsMU.js +0 -58
- package/dist/template-bindings-CEtWyiLX.cjs +0 -1
- package/dist/template-catalog-C2NLdrwB.cjs +0 -1
- package/dist/template-registry-C62vpv4a.cjs +0 -1
- package/dist/tree-BX380Rr7.cjs +0 -1
- package/dist/tree-CjVZLRw7.js +0 -172
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { e as $, c as v } from "./computed-C8NRZQss.js";
|
|
2
|
+
class T extends Error {
|
|
3
|
+
constructor(e) {
|
|
4
|
+
super(`树节点超出行数预算 ${e}`), this.limit = e, this.code = "tree-row-limit", this.name = "TreeRowLimitError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
function p(r, e, n, i) {
|
|
8
|
+
const t = r ?? e;
|
|
9
|
+
if (!Number.isInteger(t) || t < 1 || t > n) throw new Error(`${i}应为 1–${n} 的整数`);
|
|
10
|
+
return t;
|
|
11
|
+
}
|
|
12
|
+
function E(r) {
|
|
13
|
+
return { rows: p(r.maxRows, 1e5, 1e6, "树行数预算"), depth: p(r.maxDepth, 64, 256, "树深度预算"), visits: p(r.maxAggregationVisits, 1e6, 1e7, "树聚合访问预算") };
|
|
14
|
+
}
|
|
15
|
+
function A(r) {
|
|
16
|
+
return typeof r == "string" && !!r.trim();
|
|
17
|
+
}
|
|
18
|
+
function h(r) {
|
|
19
|
+
return A(r) && !["__proto__", "prototype", "constructor"].includes(r);
|
|
20
|
+
}
|
|
21
|
+
function k(r) {
|
|
22
|
+
if (A(r) || typeof r == "number" && Number.isFinite(r)) return r;
|
|
23
|
+
throw new Error("树节点业务键应为非空字符串或有限数字");
|
|
24
|
+
}
|
|
25
|
+
function M(r) {
|
|
26
|
+
return JSON.stringify([typeof r, r]);
|
|
27
|
+
}
|
|
28
|
+
function N(r) {
|
|
29
|
+
return [r.idField, ...r.input === "flat" ? [r.parentField ?? ""] : [r.childrenField ?? "children"]];
|
|
30
|
+
}
|
|
31
|
+
function S(r, e) {
|
|
32
|
+
const n = N(r);
|
|
33
|
+
if (e?.some((i) => i.scope && i.scope !== "row" || n.includes(i.field))) throw new Error("树形布局仅支持不覆盖结构键的当前行计算");
|
|
34
|
+
}
|
|
35
|
+
function w(r) {
|
|
36
|
+
if (!r?.aborted) return;
|
|
37
|
+
const e = new Error("树报表处理已取消");
|
|
38
|
+
throw e.name = "AbortError", e;
|
|
39
|
+
}
|
|
40
|
+
function I(r) {
|
|
41
|
+
const e = r.aggregates ?? [];
|
|
42
|
+
if (!Array.isArray(e) || e.length > 32) throw new Error("树聚合最多 32 项");
|
|
43
|
+
if (r.parentValues !== "leaf-aggregate" && e.length) throw new Error("树聚合需显式选择 leaf-aggregate 父级取值策略");
|
|
44
|
+
if (r.parentValues === "leaf-aggregate" && !e.length) throw new Error("叶子聚合策略至少需要一个聚合字段");
|
|
45
|
+
const n = /* @__PURE__ */ new Set();
|
|
46
|
+
for (const i of e) {
|
|
47
|
+
if (!i || !h(i.field) || n.has(i.field)) throw new Error("树聚合输出字段应安全、非空且唯一");
|
|
48
|
+
for (const t of [i.valueField, i.weightField]) if (t !== void 0 && !h(t)) throw new Error("树聚合来源字段应安全且非空");
|
|
49
|
+
if ([...N(r), r.labelField].includes(i.field)) throw new Error("树聚合不能覆盖结构键或标签字段");
|
|
50
|
+
n.add(i.field), v({ ...i, field: i.valueField ?? i.field });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function O(r) {
|
|
54
|
+
if (!h(r.idField) || !h(r.labelField)) throw new Error("树需要安全的业务键和标签字段");
|
|
55
|
+
if (r.input === "flat" && (!h(r.parentField) || r.parentField === r.idField)) throw new Error("扁平树需要独立的父键字段");
|
|
56
|
+
if (r.childrenField !== void 0 && !h(r.childrenField)) throw new Error("子节点字段应安全且非空");
|
|
57
|
+
if (r.input === "nested" && [r.idField, r.labelField].includes(r.childrenField ?? "children")) throw new Error("子节点字段不能覆盖业务键或标签字段");
|
|
58
|
+
}
|
|
59
|
+
function R(r) {
|
|
60
|
+
if (!r || typeof r != "object" || !["flat", "nested"].includes(r.input)) throw new Error("树输入应为 flat 或 nested");
|
|
61
|
+
if (O(r), r.orphan !== void 0 && !["error", "root"].includes(r.orphan)) throw new Error("树孤儿策略应为 error 或 root");
|
|
62
|
+
if (r.parentValues !== void 0 && !["source", "leaf-aggregate"].includes(r.parentValues)) throw new Error("未知树父级取值策略");
|
|
63
|
+
if (r.indentMm !== void 0 && (!Number.isFinite(r.indentMm) || r.indentMm < 0 || r.indentMm > 20)) throw new Error("树每级缩进应为 0–20 mm");
|
|
64
|
+
E(r), I(r);
|
|
65
|
+
}
|
|
66
|
+
function C(r, e, n, i) {
|
|
67
|
+
if (!r || typeof r != "object" || Array.isArray(r)) throw new Error("树节点应为对象");
|
|
68
|
+
if (n.size >= i.rows) throw new T(i.rows);
|
|
69
|
+
const t = k(r[e.idField]), f = M(t);
|
|
70
|
+
if (n.has(f)) throw new Error(`树节点业务键重复:${String(t)}`);
|
|
71
|
+
const o = { original: r, row: r, key: t, depth: 0, children: [] };
|
|
72
|
+
return n.set(f, o), o;
|
|
73
|
+
}
|
|
74
|
+
function j(r, e, n, i, t) {
|
|
75
|
+
for (const o of r)
|
|
76
|
+
w(t), C(o, e, n, i);
|
|
77
|
+
const f = [];
|
|
78
|
+
for (const o of n.values()) {
|
|
79
|
+
w(t);
|
|
80
|
+
const a = o.row[e.parentField];
|
|
81
|
+
if (a == null) {
|
|
82
|
+
f.push(o);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const l = n.get(M(k(a)));
|
|
86
|
+
if (!l) {
|
|
87
|
+
if (e.orphan !== "root") throw new Error(`树节点 ${String(o.key)} 的父节点不存在`);
|
|
88
|
+
f.push(o);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (l === o) throw new Error("树节点不能以自身为父节点");
|
|
92
|
+
o.parent = l, l.children.push(o);
|
|
93
|
+
}
|
|
94
|
+
return f;
|
|
95
|
+
}
|
|
96
|
+
function _(r, e, n, i, t) {
|
|
97
|
+
const f = [], o = [{ rows: r, next: 0 }];
|
|
98
|
+
for (; o.length; ) {
|
|
99
|
+
w(t);
|
|
100
|
+
const a = o[o.length - 1];
|
|
101
|
+
if (a.next >= a.rows.length) {
|
|
102
|
+
o.pop();
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const l = C(a.rows[a.next++], e, n, i);
|
|
106
|
+
if (l.parent = a.parent, l.depth = o.length - 1, o.length > i.depth) throw new Error(`树节点超出深度预算 ${i.depth}`);
|
|
107
|
+
(a.parent?.children ?? f).push(l);
|
|
108
|
+
const d = l.row[e.childrenField ?? "children"];
|
|
109
|
+
if (d != null) {
|
|
110
|
+
if (!Array.isArray(d)) throw new Error("嵌套树 children 字段应为数组");
|
|
111
|
+
d.length && o.push({ rows: d, next: 0, parent: l });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return f;
|
|
115
|
+
}
|
|
116
|
+
function B(r, e, n, i) {
|
|
117
|
+
const t = [], f = [{ nodes: r, next: 0 }];
|
|
118
|
+
for (; f.length; ) {
|
|
119
|
+
w(i);
|
|
120
|
+
const o = f[f.length - 1];
|
|
121
|
+
if (o.next >= o.nodes.length) {
|
|
122
|
+
f.pop();
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (f.length > n.depth) throw new Error(`树节点超出深度预算 ${n.depth}`);
|
|
126
|
+
const a = o.nodes[o.next++];
|
|
127
|
+
a.depth = f.length - 1, t.push(a), a.children.length && f.push({ nodes: a.children, next: 0 });
|
|
128
|
+
}
|
|
129
|
+
if (t.length !== e) throw new Error("树父子关系存在循环");
|
|
130
|
+
return t;
|
|
131
|
+
}
|
|
132
|
+
function D(r, e, n, i) {
|
|
133
|
+
if (e.parentValues !== "leaf-aggregate") return;
|
|
134
|
+
const t = e.aggregates, f = /* @__PURE__ */ new Map();
|
|
135
|
+
for (const a of r) a.children.length && f.set(a, t.map((l) => v({ ...l, field: l.valueField ?? l.field })));
|
|
136
|
+
let o = 0;
|
|
137
|
+
for (const a of r)
|
|
138
|
+
if (!a.children.length)
|
|
139
|
+
for (let l = a.parent; l; l = l.parent) {
|
|
140
|
+
if (w(i), o += t.length, o > n.visits) throw new Error(`树聚合超出访问预算 ${n.visits}`);
|
|
141
|
+
for (const d of f.get(l)) d.add(a.row);
|
|
142
|
+
}
|
|
143
|
+
for (const [a, l] of f)
|
|
144
|
+
a.row = { ...a.row }, t.forEach((d, c) => {
|
|
145
|
+
a.row[d.field] = l[c].value();
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function x(r, e, n) {
|
|
149
|
+
if (R(e), w(n), !Array.isArray(r)) throw new Error("树数据应为节点数组");
|
|
150
|
+
const i = E(e), t = /* @__PURE__ */ new Map(), f = e.input === "flat" ? j(r, e, t, i, n) : _(r, e, t, i, n);
|
|
151
|
+
return B(f, t.size, i, n);
|
|
152
|
+
}
|
|
153
|
+
function G(r, e, n) {
|
|
154
|
+
return x(r, e, n).map((i) => i.original);
|
|
155
|
+
}
|
|
156
|
+
function H(r, e, n = {}) {
|
|
157
|
+
const i = x(r, e, n.signal);
|
|
158
|
+
if (S(e, n.computed?.fields), n.computed?.fields.length) {
|
|
159
|
+
const t = $(i.map((f) => f.row), { ...n.computed, signal: n.signal }).rows;
|
|
160
|
+
i.forEach((f, o) => {
|
|
161
|
+
f.row = t[o];
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return D(i, e, E(e), n.signal), { rows: i.map((t) => t.row), entries: i.map((t) => ({ row: t.row, original: t.original, key: t.key, depth: t.depth, hasChildren: !!t.children.length })), leaves: i.filter((t) => !t.children.length).map((t) => t.row) };
|
|
165
|
+
}
|
|
166
|
+
const L = /^#[0-9a-f]{6}$/i;
|
|
167
|
+
function z(r) {
|
|
168
|
+
if (!r || typeof r != "object" || Array.isArray(r)) return !1;
|
|
169
|
+
const e = r;
|
|
170
|
+
return e.kind !== "colorScale" && e.kind !== "dataBar" || e.field !== void 0 && (typeof e.field != "string" || !e.field.trim()) || e.numeric !== void 0 && !["number", "decimal"].includes(e.numeric) || [e.min, e.max].some((n) => n !== void 0 && (typeof n != "number" || !Number.isFinite(n))) || e.min !== void 0 && e.max !== void 0 && e.min > e.max ? !1 : Object.entries(e).every(([n, i]) => !["color", "negativeColor", "lowColor", "highColor"].includes(n) || typeof i == "string" && L.test(i));
|
|
171
|
+
}
|
|
172
|
+
function V(r, e) {
|
|
173
|
+
if (typeof r == "number") return Number.isFinite(r) ? r : void 0;
|
|
174
|
+
if (e !== "decimal" || typeof r != "string" || r.length > 1024 || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(r)) return;
|
|
175
|
+
const n = Number(r);
|
|
176
|
+
return Number.isFinite(n) ? n : void 0;
|
|
177
|
+
}
|
|
178
|
+
function J(r, e, n) {
|
|
179
|
+
let i = "#";
|
|
180
|
+
for (const t of [1, 3, 5]) {
|
|
181
|
+
const f = parseInt(r.slice(t, t + 2), 16), o = parseInt(e.slice(t, t + 2), 16);
|
|
182
|
+
i += Math.round(f + (o - f) * n).toString(16).padStart(2, "0");
|
|
183
|
+
}
|
|
184
|
+
return i;
|
|
185
|
+
}
|
|
186
|
+
function y(r, e, n) {
|
|
187
|
+
if (e === n) return r < e ? 0 : r > n ? 1 : 0.5;
|
|
188
|
+
if (r <= e) return 0;
|
|
189
|
+
if (r >= n) return 1;
|
|
190
|
+
const i = n - e;
|
|
191
|
+
return Number.isFinite(i) ? (r - e) / i : (r / 2 - e / 2) / (n / 2 - e / 2);
|
|
192
|
+
}
|
|
193
|
+
function W(r, e, n, i) {
|
|
194
|
+
const t = /* @__PURE__ */ new WeakMap();
|
|
195
|
+
return { apply(f, o) {
|
|
196
|
+
const a = V(o[e], r.numeric);
|
|
197
|
+
if (a === void 0) return;
|
|
198
|
+
if (r.kind === "dataBar") {
|
|
199
|
+
const s = Math.min(n, 0), g = Math.max(i, 0), m = y(0, s, g), b = s === g ? m : y(a, s, g);
|
|
200
|
+
f.dataBar = { start: Math.min(m, b), end: Math.max(m, b), color: a < 0 ? r.negativeColor ?? "#f3bcc3" : r.color ?? "#bad8fa" };
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const l = J(r.lowColor ?? "#f0f7ff", r.highColor ?? "#8bbcf1", y(a, n, i)), d = f.style ?? {}, c = t.get(d) ?? /* @__PURE__ */ new Map();
|
|
204
|
+
t.set(d, c);
|
|
205
|
+
let u = c.get(l);
|
|
206
|
+
u || (u = { ...d, backgroundColor: l }, c.set(l, u)), f.style = u;
|
|
207
|
+
} };
|
|
208
|
+
}
|
|
209
|
+
function K(r, e, n) {
|
|
210
|
+
return r.map((i) => {
|
|
211
|
+
F(n);
|
|
212
|
+
const t = i.visual;
|
|
213
|
+
if (!t) return;
|
|
214
|
+
if (!z(t)) throw new TypeError("Invalid column visual rule");
|
|
215
|
+
const f = t.field ?? i.field;
|
|
216
|
+
let o = 1 / 0, a = -1 / 0, l = 0;
|
|
217
|
+
if (t.min === void 0 || t.max === void 0) for (const u of e) {
|
|
218
|
+
(l++ & 1023) === 0 && F(n);
|
|
219
|
+
const s = V(u[f], t.numeric);
|
|
220
|
+
s !== void 0 && (o = Math.min(o, s), a = Math.max(a, s));
|
|
221
|
+
}
|
|
222
|
+
let d = t.min ?? o, c = t.max ?? a;
|
|
223
|
+
if (!(!Number.isFinite(d) || !Number.isFinite(c)))
|
|
224
|
+
return d > c && (t.min !== void 0 ? c = d : d = c), W(t, f, d, c);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
function F(r) {
|
|
228
|
+
if (r?.aborted) throw r.reason ?? new DOMException("Aborted", "AbortError");
|
|
229
|
+
}
|
|
230
|
+
export {
|
|
231
|
+
T,
|
|
232
|
+
R as a,
|
|
233
|
+
S as b,
|
|
234
|
+
H as c,
|
|
235
|
+
K as d,
|
|
236
|
+
G as f,
|
|
237
|
+
z as v
|
|
238
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const y=require("./computed-4TnxzgIh.cjs");class A extends Error{constructor(r){super(`树节点超出行数预算 ${r}`),this.limit=r,this.code="tree-row-limit",this.name="TreeRowLimitError"}}function p(e,r,n,i){const t=e??r;if(!Number.isInteger(t)||t<1||t>n)throw new Error(`${i}应为 1–${n} 的整数`);return t}function b(e){return{rows:p(e.maxRows,1e5,1e6,"树行数预算"),depth:p(e.maxDepth,64,256,"树深度预算"),visits:p(e.maxAggregationVisits,1e6,1e7,"树聚合访问预算")}}function k(e){return typeof e=="string"&&!!e.trim()}function h(e){return k(e)&&!["__proto__","prototype","constructor"].includes(e)}function M(e){if(k(e)||typeof e=="number"&&Number.isFinite(e))return e;throw new Error("树节点业务键应为非空字符串或有限数字")}function C(e){return JSON.stringify([typeof e,e])}function N(e){return[e.idField,...e.input==="flat"?[e.parentField??""]:[e.childrenField??"children"]]}function T(e,r){const n=N(e);if(r?.some(i=>i.scope&&i.scope!=="row"||n.includes(i.field)))throw new Error("树形布局仅支持不覆盖结构键的当前行计算")}function w(e){if(!e?.aborted)return;const r=new Error("树报表处理已取消");throw r.name="AbortError",r}function S(e){const r=e.aggregates??[];if(!Array.isArray(r)||r.length>32)throw new Error("树聚合最多 32 项");if(e.parentValues!=="leaf-aggregate"&&r.length)throw new Error("树聚合需显式选择 leaf-aggregate 父级取值策略");if(e.parentValues==="leaf-aggregate"&&!r.length)throw new Error("叶子聚合策略至少需要一个聚合字段");const n=new Set;for(const i of r){if(!i||!h(i.field)||n.has(i.field))throw new Error("树聚合输出字段应安全、非空且唯一");for(const t of[i.valueField,i.weightField])if(t!==void 0&&!h(t))throw new Error("树聚合来源字段应安全且非空");if([...N(e),e.labelField].includes(i.field))throw new Error("树聚合不能覆盖结构键或标签字段");n.add(i.field),y.createAggregateAccumulator({...i,field:i.valueField??i.field})}}function R(e){if(!h(e.idField)||!h(e.labelField))throw new Error("树需要安全的业务键和标签字段");if(e.input==="flat"&&(!h(e.parentField)||e.parentField===e.idField))throw new Error("扁平树需要独立的父键字段");if(e.childrenField!==void 0&&!h(e.childrenField))throw new Error("子节点字段应安全且非空");if(e.input==="nested"&&[e.idField,e.labelField].includes(e.childrenField??"children"))throw new Error("子节点字段不能覆盖业务键或标签字段")}function V(e){if(!e||typeof e!="object"||!["flat","nested"].includes(e.input))throw new Error("树输入应为 flat 或 nested");if(R(e),e.orphan!==void 0&&!["error","root"].includes(e.orphan))throw new Error("树孤儿策略应为 error 或 root");if(e.parentValues!==void 0&&!["source","leaf-aggregate"].includes(e.parentValues))throw new Error("未知树父级取值策略");if(e.indentMm!==void 0&&(!Number.isFinite(e.indentMm)||e.indentMm<0||e.indentMm>20))throw new Error("树每级缩进应为 0–20 mm");b(e),S(e)}function x(e,r,n,i){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("树节点应为对象");if(n.size>=i.rows)throw new A(i.rows);const t=M(e[r.idField]),l=C(t);if(n.has(l))throw new Error(`树节点业务键重复:${String(t)}`);const o={original:e,row:e,key:t,depth:0,children:[]};return n.set(l,o),o}function j(e,r,n,i,t){for(const o of e)w(t),x(o,r,n,i);const l=[];for(const o of n.values()){w(t);const a=o.row[r.parentField];if(a==null){l.push(o);continue}const f=n.get(C(M(a)));if(!f){if(r.orphan!=="root")throw new Error(`树节点 ${String(o.key)} 的父节点不存在`);l.push(o);continue}if(f===o)throw new Error("树节点不能以自身为父节点");o.parent=f,f.children.push(o)}return l}function L(e,r,n,i,t){const l=[],o=[{rows:e,next:0}];for(;o.length;){w(t);const a=o[o.length-1];if(a.next>=a.rows.length){o.pop();continue}const f=x(a.rows[a.next++],r,n,i);if(f.parent=a.parent,f.depth=o.length-1,o.length>i.depth)throw new Error(`树节点超出深度预算 ${i.depth}`);(a.parent?.children??l).push(f);const c=f.row[r.childrenField??"children"];if(c!=null){if(!Array.isArray(c))throw new Error("嵌套树 children 字段应为数组");c.length&&o.push({rows:c,next:0,parent:f})}}return l}function _(e,r,n,i){const t=[],l=[{nodes:e,next:0}];for(;l.length;){w(i);const o=l[l.length-1];if(o.next>=o.nodes.length){l.pop();continue}if(l.length>n.depth)throw new Error(`树节点超出深度预算 ${n.depth}`);const a=o.nodes[o.next++];a.depth=l.length-1,t.push(a),a.children.length&&l.push({nodes:a.children,next:0})}if(t.length!==r)throw new Error("树父子关系存在循环");return t}function B(e,r,n,i){if(r.parentValues!=="leaf-aggregate")return;const t=r.aggregates,l=new Map;for(const a of e)a.children.length&&l.set(a,t.map(f=>y.createAggregateAccumulator({...f,field:f.valueField??f.field})));let o=0;for(const a of e)if(!a.children.length)for(let f=a.parent;f;f=f.parent){if(w(i),o+=t.length,o>n.visits)throw new Error(`树聚合超出访问预算 ${n.visits}`);for(const c of l.get(f))c.add(a.row)}for(const[a,f]of l)a.row={...a.row},t.forEach((c,d)=>{a.row[c.field]=f[d].value()})}function $(e,r,n){if(V(r),w(n),!Array.isArray(e))throw new Error("树数据应为节点数组");const i=b(r),t=new Map,l=r.input==="flat"?j(e,r,t,i,n):L(e,r,t,i,n);return _(l,t.size,i,n)}function D(e,r,n){return $(e,r,n).map(i=>i.original)}function z(e,r,n={}){const i=$(e,r,n.signal);if(T(r,n.computed?.fields),n.computed?.fields.length){const t=y.computeDataset(i.map(l=>l.row),{...n.computed,signal:n.signal}).rows;i.forEach((l,o)=>{l.row=t[o]})}return B(i,r,b(r),n.signal),{rows:i.map(t=>t.row),entries:i.map(t=>({row:t.row,original:t.original,key:t.key,depth:t.depth,hasChildren:!!t.children.length})),leaves:i.filter(t=>!t.children.length).map(t=>t.row)}}const q=/^#[0-9a-f]{6}$/i;function I(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const r=e;return r.kind!=="colorScale"&&r.kind!=="dataBar"||r.field!==void 0&&(typeof r.field!="string"||!r.field.trim())||r.numeric!==void 0&&!["number","decimal"].includes(r.numeric)||[r.min,r.max].some(n=>n!==void 0&&(typeof n!="number"||!Number.isFinite(n)))||r.min!==void 0&&r.max!==void 0&&r.min>r.max?!1:Object.entries(r).every(([n,i])=>!["color","negativeColor","lowColor","highColor"].includes(n)||typeof i=="string"&&q.test(i))}function O(e,r){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(r!=="decimal"||typeof e!="string"||e.length>1024||!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(e))return;const n=Number(e);return Number.isFinite(n)?n:void 0}function J(e,r,n){let i="#";for(const t of[1,3,5]){const l=parseInt(e.slice(t,t+2),16),o=parseInt(r.slice(t,t+2),16);i+=Math.round(l+(o-l)*n).toString(16).padStart(2,"0")}return i}function E(e,r,n){if(r===n)return e<r?0:e>n?1:.5;if(e<=r)return 0;if(e>=n)return 1;const i=n-r;return Number.isFinite(i)?(e-r)/i:(e/2-r/2)/(n/2-r/2)}function W(e,r,n,i){const t=new WeakMap;return{apply(l,o){const a=O(o[r],e.numeric);if(a===void 0)return;if(e.kind==="dataBar"){const s=Math.min(n,0),g=Math.max(i,0),m=E(0,s,g),F=s===g?m:E(a,s,g);l.dataBar={start:Math.min(m,F),end:Math.max(m,F),color:a<0?e.negativeColor??"#f3bcc3":e.color??"#bad8fa"};return}const f=J(e.lowColor??"#f0f7ff",e.highColor??"#8bbcf1",E(a,n,i)),c=l.style??{},d=t.get(c)??new Map;t.set(c,d);let u=d.get(f);u||(u={...c,backgroundColor:f},d.set(f,u)),l.style=u}}}function G(e,r,n){return e.map(i=>{v(n);const t=i.visual;if(!t)return;if(!I(t))throw new TypeError("Invalid column visual rule");const l=t.field??i.field;let o=1/0,a=-1/0,f=0;if(t.min===void 0||t.max===void 0)for(const u of r){(f++&1023)===0&&v(n);const s=O(u[l],t.numeric);s!==void 0&&(o=Math.min(o,s),a=Math.max(a,s))}let c=t.min??o,d=t.max??a;if(!(!Number.isFinite(c)||!Number.isFinite(d)))return c>d&&(t.min!==void 0?d=c:c=d),W(t,l,c,d)})}function v(e){if(e?.aborted)throw e.reason??new DOMException("Aborted","AbortError")}exports.TreeRowLimitError=A;exports.createColumnVisualResolvers=G;exports.createTreeTable=z;exports.flattenTreeInput=D;exports.validColumnVisual=I;exports.validateTreeComputed=T;exports.validateTreeOptions=V;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const $=require("./style-C22Pbv3T.cjs"),l=$.SCHEMA_VERSION_MACH;function E(e){return(e.kind==="image"||e.kind==="barcode"||e.kind==="qrcode"||e.kind==="chart")&&!!e.imageData}function R(e){return e.kind==="text"&&Array.isArray(e.richParagraphs)&&e.richParagraphs.length>0}function h(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const{start:r,end:i,color:n}=e;return typeof r=="number"&&typeof i=="number"&&Number.isFinite(r)&&Number.isFinite(i)&&r>=0&&i<=1&&r<=i&&typeof n=="string"&&/^#[0-9a-f]{6}$/i.test(n)}function o(e){return!!e&&typeof e=="object"}function d(e,r,i,n,s){if(++s.nodes>1e6)return{path:r,message:"组件树超过100万个结构节点预算"};if(o(e)){if(i>64)return{path:r,message:"组件嵌套超过64层预算"};if(n.has(e))return{path:r,message:"组件树包含循环引用"};if(!(!o(e.grid)||!Array.isArray(e.grid.cells))){n.add(e);try{for(const[t,f]of e.grid.cells.entries())if(Array.isArray(f))for(const[g,c]of f.entries()){if(++s.nodes>1e6)return{path:r,message:"组件树超过100万个结构节点预算"};if(!(!o(c)||!Array.isArray(c.children)))for(const[A,m]of c.children.entries()){const a=d(m,`${r}.grid.cells.${t}.${g}.children.${A}`,i+1,n,s);if(a)return a}}}finally{n.delete(e)}}}}function u(e,r="$.components",i={nodes:0}){for(const[n,s]of e.entries()){const t=d(s,`${r}.${n}`,0,new Set,i);if(t)return t}}function y(e){const r={nodes:0};for(const[i,n]of e.entries()){if(!o(n)||!Array.isArray(n.components))continue;const s=u(n.components,`$.pages.${i}.components`,r);if(s)return s}}function p(e){const r=y(e.pages);if(r)throw new TypeError(`${r.path}: ${r.message}`)}exports.RENDER_PLAN_SCHEMA_VERSION=l;exports.assertBoundedRenderTree=p;exports.componentTreeIssue=u;exports.isImageBackedComponent=E;exports.isRichText=R;exports.renderTreeIssue=y;exports.validDataBar=h;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { S as A } from "./style-67OqfNed.js";
|
|
2
|
+
const h = A;
|
|
3
|
+
function l(r) {
|
|
4
|
+
return (r.kind === "image" || r.kind === "barcode" || r.kind === "qrcode" || r.kind === "chart") && !!r.imageData;
|
|
5
|
+
}
|
|
6
|
+
function b(r) {
|
|
7
|
+
return r.kind === "text" && Array.isArray(r.richParagraphs) && r.richParagraphs.length > 0;
|
|
8
|
+
}
|
|
9
|
+
function k(r) {
|
|
10
|
+
if (!r || typeof r != "object" || Array.isArray(r)) return !1;
|
|
11
|
+
const { start: e, end: i, color: n } = r;
|
|
12
|
+
return typeof e == "number" && typeof i == "number" && Number.isFinite(e) && Number.isFinite(i) && e >= 0 && i <= 1 && e <= i && typeof n == "string" && /^#[0-9a-f]{6}$/i.test(n);
|
|
13
|
+
}
|
|
14
|
+
function o(r) {
|
|
15
|
+
return !!r && typeof r == "object";
|
|
16
|
+
}
|
|
17
|
+
function d(r, e, i, n, s) {
|
|
18
|
+
if (++s.nodes > 1e6) return { path: e, message: "组件树超过100万个结构节点预算" };
|
|
19
|
+
if (o(r)) {
|
|
20
|
+
if (i > 64) return { path: e, message: "组件嵌套超过64层预算" };
|
|
21
|
+
if (n.has(r)) return { path: e, message: "组件树包含循环引用" };
|
|
22
|
+
if (!(!o(r.grid) || !Array.isArray(r.grid.cells))) {
|
|
23
|
+
n.add(r);
|
|
24
|
+
try {
|
|
25
|
+
for (const [t, f] of r.grid.cells.entries())
|
|
26
|
+
if (Array.isArray(f))
|
|
27
|
+
for (const [u, c] of f.entries()) {
|
|
28
|
+
if (++s.nodes > 1e6) return { path: e, message: "组件树超过100万个结构节点预算" };
|
|
29
|
+
if (!(!o(c) || !Array.isArray(c.children)))
|
|
30
|
+
for (const [y, g] of c.children.entries()) {
|
|
31
|
+
const a = d(g, `${e}.grid.cells.${t}.${u}.children.${y}`, i + 1, n, s);
|
|
32
|
+
if (a) return a;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
} finally {
|
|
36
|
+
n.delete(r);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function m(r, e = "$.components", i = { nodes: 0 }) {
|
|
42
|
+
for (const [n, s] of r.entries()) {
|
|
43
|
+
const t = d(s, `${e}.${n}`, 0, /* @__PURE__ */ new Set(), i);
|
|
44
|
+
if (t) return t;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function $(r) {
|
|
48
|
+
const e = { nodes: 0 };
|
|
49
|
+
for (const [i, n] of r.entries()) {
|
|
50
|
+
if (!o(n) || !Array.isArray(n.components)) continue;
|
|
51
|
+
const s = m(n.components, `$.pages.${i}.components`, e);
|
|
52
|
+
if (s) return s;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function E(r) {
|
|
56
|
+
const e = $(r.pages);
|
|
57
|
+
if (e) throw new TypeError(`${e.path}: ${e.message}`);
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
h as R,
|
|
61
|
+
b as a,
|
|
62
|
+
E as b,
|
|
63
|
+
m as c,
|
|
64
|
+
l as i,
|
|
65
|
+
$ as r,
|
|
66
|
+
k as v
|
|
67
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function d(e){if(!Number.isSafeInteger(e)||e<0||e>1e3*2)throw new Error("十进制精度超出预算");return 10n**BigInt(e)}function S(e){if(e.coefficient.toString().length>1e3*2||e.scale>1e3*2)throw new Error("十进制结果超出精度预算");return e}function l(e){if(typeof e!="string"&&!(typeof e=="number"&&Number.isFinite(e)))throw new Error("十进制参数必须是有限数字或十进制文本");const t=String(e);if(t.length>1e3)throw new Error("十进制文本超出精度预算");const r=/^([+-]?)(\d+)(?:\.(\d*))?(?:[eE]([+-]?\d{1,4}))?$/.exec(t);if(!r)throw new Error("无效十进制文本");const n=r[3]??"",i=Number(r[4]??0),c=n.length-i,o=BigInt(`${r[1]==="-"?"-":""}${r[2]}${n}`);return S(c<0?{coefficient:o*d(-c),scale:0}:{coefficient:o,scale:c})}function J(e,t){const r=Math.max(e.scale,t.scale);return[e.coefficient*d(r-e.scale),t.coefficient*d(r-t.scale),r]}function h(e,t){const[r,n]=J(e,t);return r<n?-1:r>n?1:0}function y(e,t){const[r,n,i]=J(e,t);return S({coefficient:r+n,scale:i})}function N(e,t){return S({coefficient:e.coefficient*t.coefficient,scale:e.scale+t.scale})}function V(e,t){const r=e/t,n=e%t,i=c=>c<0n?-c:c;return i(n)*2n<i(t)?r:r+(e<0n==t<0n?1n:-1n)}function w(e){if(!Number.isInteger(e)||e<0||e>100)throw new Error("十进制小数位应为 0–100 的整数")}function v(e,t,r=20){if(w(r),t.coefficient===0n)throw new Error("不能除以零");const n=t.scale-e.scale+r,i=e.coefficient*d(Math.max(0,n)),c=t.coefficient*d(Math.max(0,-n));return S({coefficient:V(i,c),scale:r})}function b(e,t){let r=e.coefficient,n=e.scale;t!==void 0&&(w(t),r=t>=n?r*d(t-n):V(r,d(n-t)),n=t);const i=r<0n,c=(i?-r:r).toString().padStart(n+1,"0");let o=n?c.slice(-n):"";return t===void 0&&(o=o.replace(/0+$/,"")),`${i?"-":""}${n?c.slice(0,-n):c}${o?`.${o}`:""}`}function q(e,t,r=!1,n=!1){let i=l(e);n&&(i=N(i,{coefficient:100n,scale:0}));const[c,o]=b(i,t).split(".");return`${r?c.replace(/\B(?=(\d{3})+(?!\d))/g,","):c}${o===void 0?"":`.${o}`}${n?"%":""}`}const ee=["sum","count","avg","min","max","weightedAvg"];function $(e){if(typeof e!="number"||!Number.isFinite(e))throw new Error("聚合度量必须是有限数字,不能隐式转换;小数文本请显式选择 decimal");return e}function O(e,t){return t&&Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function te(e){let t=0,r=0,n=0,i=0,c=1/0,o=-1/0;const a=s=>{const f=s-n,u=r+f;n=u-r-f,r=u};return{add(s){const f=O(s,e.field);if(e.op==="count"){(!e.field||f!=null)&&t++;return}if(f==null)return;const u=$(f),_=e.op==="weightedAvg"?O(s,e.weightField):1;if(_==null)return;const M=$(_);if(e.op==="weightedAvg"&&M<0)throw new Error("加权平均的权重不能为负数");["sum","avg","weightedAvg"].includes(e.op)&&a(u*M),i+=M,c=Math.min(c,u),o=Math.max(o,u),t++},value(){if(e.op==="count")return t;if(!t)return null;const s=e.op==="min"?c:e.op==="max"?o:e.op==="avg"?r/t:e.op==="weightedAvg"?i===0?null:r/i:r;if(s!==null&&!Number.isFinite(s))throw new Error("聚合计算溢出");return s}}}function re(e){let t=0,r=l("0"),n=l("0"),i,c;return{add(o){const a=O(o,e.field);if(e.op==="count"){(!e.field||a!=null)&&t++;return}if(a==null)return;const s=e.op==="weightedAvg"?O(o,e.weightField):"1";if(s==null)return;const f=l(a),u=l(s);if(e.op==="weightedAvg"&&u.coefficient<0n)throw new Error("加权平均的权重不能为负数");["sum","avg","weightedAvg"].includes(e.op)&&(r=y(r,N(f,u))),e.op==="weightedAvg"&&(n=y(n,u)),(!i||h(f,i)<0)&&(i=f),(!c||h(f,c)>0)&&(c=f),t++},value(){if(e.op==="count")return t;if(!t||e.op==="weightedAvg"&&n.coefficient===0n)return null;let o=e.op==="min"?i:e.op==="max"?c:r;return e.op==="avg"&&(o=v(r,l(t),e.digits)),e.op==="weightedAvg"&&(o=v(r,n,e.digits)),b(o,e.digits)}}}function Z(e){if(e.digits!==void 0&&w(e.digits),e.numeric!==void 0&&e.numeric!=="number"&&e.numeric!=="decimal")throw new Error("未知聚合数值模式");if(!ee.includes(e.op))throw new Error("未知聚合操作");if(e.op!=="count"&&!e.field)throw new Error("聚合需要度量字段");if(e.op==="weightedAvg"&&!e.weightField)throw new Error("加权平均需要权重字段");return e.numeric==="decimal"?re(e):te(e)}function x(e,t){const r=Z(t);for(const n of e)r.add(n);return r.value()}const K=new Set(["__proto__","prototype","constructor"]);function L(e){if(!e||typeof e!="object"||Array.isArray(e)||![Object.prototype,null].includes(Object.getPrototypeOf(e)))throw new Error("条件应为普通声明式对象");for(const[t,r]of Object.entries(Object.getOwnPropertyDescriptors(e)))if(K.has(t)||!Object.prototype.hasOwnProperty.call(r,"value"))throw new Error("条件不允许访问器或不安全属性")}function T(e){if(typeof e!="string"||!e.trim()||e.length>512||K.has(e))throw new Error("条件字段应为安全的非空字段名")}function F(e){if(e!==null&&typeof e!="boolean"&&typeof e!="string"&&!(typeof e=="number"&&Number.isFinite(e)))throw new Error("条件常量应为有限 JSON 标量");if(typeof e=="string"&&e.length>16384)throw new Error("条件文本超出预算")}function k(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e))throw new Error("日期条件使用 YYYY-MM-DD 日历日");const[t,r,n]=e.split("-").map(Number),i=new Date(0);if(i.setUTCFullYear(t,r-1,n),i.setUTCHours(0,0,0,0),i.getUTCFullYear()!==t||i.getUTCMonth()!==r-1||i.getUTCDate()!==n)throw new Error("无效日历日");return e}function B(e){return["string","boolean"].includes(typeof e)||typeof e=="number"&&Number.isFinite(e)}function U(e){return e==null||e===""}function ne(e){const t=e.values?.[0]??(e.right&&"value"in e.right?e.right.value:e.value);return e.valueType??e.numeric??(typeof t=="number"?"decimal":typeof t=="boolean"?"boolean":"text")}function E(e,t,r){if(U(e)||U(t))return;const n=ne(r);try{if(n==="decimal")return h(l(e),l(t));if(n==="number")return!["number","string"].includes(typeof e)||!["number","string"].includes(typeof t)?void 0:h(l(e),l(t));if(n==="date"&&(e=k(e),t=k(t)),n==="boolean"&&(typeof e!="boolean"||typeof t!="boolean")||n==="text"&&(!B(e)||!B(t)))return;const i=String(e),c=String(t);return i<c?-1:i>c?1:0}catch{return}}function ie(e){if(T(e.field),![">",">=","<","<=","==","!=","between","contains","isNull","isNotNull"].includes(e.op))throw new Error("未知条件运算符");if(e.numeric!==void 0&&!["number","decimal"].includes(e.numeric))throw new Error("未知条件数值模式");if(e.valueType!==void 0&&!["number","decimal","text","date","boolean"].includes(e.valueType))throw new Error("未知条件值类型");if(!(e.op==="isNull"||e.op==="isNotNull"))if(e.op==="between"){if(!Array.isArray(e.values)||e.values.length!==2||Object.keys(e.values).length!==2)throw new Error("范围条件需要两个明确边界");e.values.forEach(F);const t=E(e.values[0],e.values[1],e);if(t===void 0||t>0)throw new Error("范围边界无效或顺序颠倒")}else if(e.right!==void 0){if(L(e.right),Object.keys(e.right).length!==1)throw new Error("条件 right 只能指定一个 field 或 value");if("field"in e.right?T(e.right.field):F(e.right.value),e.value!==void 0)throw new Error("条件不能同时指定 value 和 right")}else F(e.value)}function j(e,t){if(t===void 0)return!1;switch(e){case">":return t>0;case">=":return t>=0;case"<":return t<0;case"<=":return t<=0;case"==":return t===0;case"!=":return t!==0;default:return!1}}function oe(e){ie(e),e={...e,right:e.right?{...e.right}:void 0,values:e.values?[e.values[0],e.values[1]]:void 0};const t=(r,n)=>Object.prototype.hasOwnProperty.call(r,n)?r[n]:void 0;return r=>{const n=t(r,e.field);if(e.op==="isNull")return n==null;if(e.op==="isNotNull")return n!=null;if(e.op==="between")return j(">=",E(n,e.values[0],e))&&j("<=",E(n,e.values[1],e));const i=e.right?"field"in e.right?t(r,e.right.field):e.right.value:e.value;return e.op==="contains"?typeof n=="string"&&typeof i=="string"&&n.includes(i):j(e.op,E(n,i,e))}}function p(e,t={nodes:0},r=0){if(++t.nodes>256||r>16)throw new Error("条件超出深度或节点预算");if(L(e),["all","any","not","field"].filter(i=>Object.prototype.hasOwnProperty.call(e,i)).length!==1)throw new Error("条件只能指定一种组合或比较");if("not"in e){const i=p(e.not,t,r+1);return c=>!i(c)}if("all"in e||"any"in e){const i="all"in e?e.all:e.any;if(!Array.isArray(i)||i.length<1||i.length>256||Object.keys(i).length!==i.length)throw new Error("组合条件需要有界、无空位的非空数组");const c=i.map(o=>p(o,t,r+1));return"all"in e?o=>c.every(a=>a(o)):o=>c.some(a=>a(o))}return oe(e)}function ce(e,t){return p(t)(e)}function H(e){p(e);const t=new Set;function r(n){"all"in n?n.all.forEach(r):"any"in n?n.any.forEach(r):"not"in n?r(n.not):(t.add(n.field),n.right&&"field"in n.right&&t.add(n.right.field))}return r(e),[...t]}const ae=[{name:"add",minArgs:2,maxArgs:256,input:"numeric",output:"numeric",example:"add(quantity, adjustment)"},{name:"subtract",minArgs:2,maxArgs:2,input:"numeric",output:"numeric",example:"subtract(input, output)"},{name:"multiply",minArgs:2,maxArgs:256,input:"numeric",output:"numeric",example:"multiply(quantity, price)"},{name:"divide",minArgs:2,maxArgs:2,input:"numeric",output:"numeric",example:"divide(amount, quantity)"},{name:"coalesce",minArgs:2,maxArgs:256,input:"scalar",output:"scalar",example:"coalesce(actual, planned)"},{name:"if",minArgs:2,maxArgs:2,input:"condition + branches",output:"scalar",example:"if(quantity > 0, divide(amount, quantity), null)"},{name:"round",minArgs:1,maxArgs:2,input:"numeric, digits?",output:"numeric",example:"round(amount, 2)"},{name:"abs",minArgs:1,maxArgs:1,input:"numeric",output:"numeric",example:"abs(difference)"},{name:"concat",minArgs:2,maxArgs:256,input:"text",output:"text",example:"concat(plant, '-' , heat)"},{name:"trim",minArgs:1,maxArgs:1,input:"text",output:"text",example:"trim(heat)"},{name:"upper",minArgs:1,maxArgs:1,input:"text",output:"text",example:"upper(grade)"},{name:"lower",minArgs:1,maxArgs:1,input:"text",output:"text",example:"lower(code)"},{name:"dateYear",minArgs:1,maxArgs:1,input:"YYYY-MM-DD",output:"number",example:"dateYear(reportDate)"},{name:"dateMonth",minArgs:1,maxArgs:1,input:"YYYY-MM-DD",output:"number",example:"dateMonth(reportDate)"},{name:"dateDay",minArgs:1,maxArgs:1,input:"YYYY-MM-DD",output:"number",example:"dateDay(reportDate)"}],C=Object.freeze(ae.map(e=>Object.freeze(e)));function se(e,t,r,n,i){if(t.some(a=>a==null)){if(i==="error")throw new Error("函数参数包含空值");return null}if(e==="round"||e==="abs")return fe(e,t,r,n);if(e.startsWith("date")){const a=k(t[0]);return Number(a.slice(e==="dateYear"?0:e==="dateMonth"?5:8,e==="dateYear"?4:e==="dateMonth"?7:10))}if(t.some(a=>typeof a!="string"))throw new Error("文本函数只接受文本,不隐式转换数字或空值");if(t.reduce((a,s)=>a+s.length,0)>1e6)throw new Error("计算文本超出长度预算");const c=t[0],o=e==="concat"?t.join(""):e==="trim"?c.trim():e==="upper"?c.toUpperCase():c.toLowerCase();if(o.length>1e6)throw new Error("计算文本超出长度预算");return o}function fe(e,t,r,n){const i=t[0];if(r!=="decimal"&&(typeof i!="number"||!Number.isFinite(i)))throw new Error("普通数值函数需要有限数字");const c=l(i);e==="abs"&&(c.coefficient=c.coefficient<0n?-c.coefficient:c.coefficient);const o=e==="round"?t.length===2?t[1]:n??0:n;if(o!==void 0){if(typeof o!="number")throw new Error("小数位必须为数字");w(o)}const a=b(c,o),s=Number(a);if(r!=="decimal"&&!Number.isFinite(s))throw new Error("计算结果不是有限数字");return r==="decimal"?a:s}const ue=new Set(["__proto__","prototype","constructor"]);function g(e){if(typeof e!="string"||!e.trim()||ue.has(e))throw new Error("计算字段应为安全的非空字段名")}function R(e){return e===null||["string","boolean"].includes(typeof e)||typeof e=="number"&&Number.isFinite(e)}function le(e){if(e.some(t=>typeof t!="number"||!Number.isFinite(t)))throw new Error("算术参数必须是有限数字;空值和小数文本不会隐式转换");return e}function me(e,t){const r=le(t);let n;if(e==="add")n=r.reduce((i,c)=>i+c,0);else if(e==="multiply")n=r.reduce((i,c)=>i*c,1);else if(e==="subtract")n=r[0]-r[1];else{if(r[1]===0)throw new Error("不能除以零");n=r[0]/r[1]}if(!Number.isFinite(n))throw new Error("计算结果不是有限数字");return n}function de(e,t,r){const n=t.map(l);let i;return e==="add"?i=n.reduce(y):e==="multiply"?i=n.reduce(N):e==="subtract"?i=y(n[0],{...n[1],coefficient:-n[1].coefficient}):i=v(n[0],n[1],r),b(i,r)}function ge(e,t,r){return r.nulls!=="error"&&t.some(n=>n==null)||e==="divide"&&r.divisionByZero==="null"&&(r.numeric==="decimal"?l(t[1]).coefficient===0n:t[1]===0)?null:r.numeric==="decimal"?de(e,t,r.digits):me(e,t)}function pe(e,t){e.field!==void 0&&g(e.field),e.weightField!==void 0&&g(e.weightField);const r={op:e.aggregate,field:e.field,weightField:e.weightField,numeric:t.numeric,digits:t.digits};x([],r);const n=new WeakMap;return i=>{let c=n.get(i.rows);if(!c){try{c={value:x(i.rows,r)}}catch(o){c={error:o instanceof Error?o:new Error(String(o))}}n.set(i.rows,c)}if(c.error)throw c.error;return c.value}}function we(e,t){for(const r of e){const n=r(t);if(n!=null)return n}return null}function Y(e,t={},r={nodes:0},n=0){if(++r.nodes>256||n>16)throw new Error("计算表达式超出深度或节点预算");if(!e||typeof e!="object"||Array.isArray(e))throw new Error("计算表达式应为声明式对象");if("aggregate"in e)return pe(e,t);if("field"in e){g(e.field);const i=e.field;return({row:c})=>Object.prototype.hasOwnProperty.call(c,i)?c[i]:void 0}if("value"in e){if(!R(e.value))throw new Error("常量应为有限 JSON 标量");return()=>e.value}return he(e,t,r,n)}function he(e,t,r,n){const i=C.find(a=>a.name===e.op);if(!i||!Array.isArray(e.args))throw new Error("未知计算操作");if(e.args.length>256||Object.keys(e.args).length!==e.args.length)throw new Error("计算参数超出预算或包含空位");if(e.args.length<i.minArgs||e.args.length>i.maxArgs)throw new Error("运算参数数量不正确");const c=e.op==="if"?p(e.condition,r,n+1):void 0;if(e.op!=="if"&&e.condition!==void 0)throw new Error("仅 IF 运算接受 condition");const o=e.args.map(a=>Y(a,t,r,n+1));return c?a=>o[c(a.row)?0:1](a):["add","subtract","multiply","divide","coalesce"].includes(e.op)?e.op==="coalesce"?a=>we(o,a):a=>ge(e.op,o.map(s=>s(a)),t):a=>se(e.op,o.map(s=>s(a)),t.numeric,t.digits,t.nulls)}function ye(e){Y(e);const t=new Set,r=n=>{"field"in n&&n.field&&t.add(n.field),"aggregate"in n&&n.weightField&&t.add(n.weightField),"args"in n&&(n.args.forEach(r),n.condition&&H(n.condition).forEach(i=>t.add(i)))};return r(e),[...t]}const be=16,P=1024*1024,X=5e5,D=new WeakMap,m=Symbol("uncacheable-computation-definition");function A(e,t,r=0){if(++t.nodes>1e4||r>32)throw m;if(e==null)return[String(e)];if(typeof e=="number")return["number",Object.is(e,-0)?"-0":String(e)];if(typeof e=="boolean")return["boolean",e];if(typeof e=="string"){if(t.units+=e.length,t.units>P)throw m;return["string",e]}if(typeof e!="object")throw m;if(Array.isArray(e)){if(Object.getPrototypeOf(e)!==Array.prototype||Object.keys(e).length!==e.length)throw m;return["array",Array.from({length:e.length},(n,i)=>A(W(e,String(i)),t,r+1))]}if(Object.getPrototypeOf(e)!==Object.prototype&&Object.getPrototypeOf(e)!==null)throw m;return["object",Object.keys(e).map(n=>[A(n,t,r+1),A(W(e,n),t,r+1)])]}function W(e,t){const r=Object.getOwnPropertyDescriptor(e,t);if(!r||r.get||r.set)throw m;return r.value}function Ee(e){try{return JSON.stringify(A(e,{nodes:0,units:0}))}catch(t){if(t!==m)throw t;return}}function Ae(e){D.set(e,{programs:new Map,units:0,slots:0})}function ve(e,t){const r=D.get(e);if(!r)return;const n={programs:new Map,units:r.units,slots:r.slots};for(const[i,c]of r.programs){const o=new WeakMap;t.forEach((a,s)=>{const f=c.rows.get(e[s]);f&&o.set(a,f)}),n.programs.set(i,{...c,rows:o})}D.set(t,n)}function Oe(e,t,r){const n=D.get(e);if(!n||t.some(f=>typeof f.expression=="string"))return;const i=Ee(t);if(i===void 0||i.length>P)return;const c=n.programs.get(i);if(c)return c;const o=r(),a=e.length*o.reduce((f,u)=>f+u.dependencies.length+1,0),s={fields:o,rows:new WeakMap,slots:a,cacheRows:a<=X};if(!s.cacheRows)return s;for(;n.programs.size>=be||n.units+i.length>P||n.slots+a>X;){const f=n.programs.keys().next().value;n.slots-=n.programs.get(f).slots,n.units-=f.length,n.programs.delete(f)}return n.programs.set(i,s),n.units+=i.length,n.slots+=a,s}function De(e,t,r,n){if((r.definition.scope??"row")!=="row")return;const i=e.program?.rows.get(t)?.get(r.definition.field);return i?.dependencies.every((c,o)=>Object.is(n[r.dependencies[o]],c))?i:void 0}function Se(e,t,r,n,i){const c=e.program;if(!c?.cacheRows||(r.definition.scope??"row")!=="row")return;let o=e.writes.get(t);o||(o=new Map(c.rows.get(t)),e.writes.set(t,o),c.rows.set(t,o)),o.set(r.definition.field,{dependencies:r.dependencies.map(a=>n[a]),value:n[r.definition.field],...i?{issue:{field:i.field,message:i.message}}:{}})}function Ne(e){if(g(e.field),e.scope!==void 0&&!["row","group","dataset"].includes(e.scope))throw new Error("未知计算范围");if(e.numeric!==void 0&&e.numeric!=="number"&&e.numeric!=="decimal")throw new Error("未知数值模式");if(e.digits!==void 0&&w(e.digits),e.nulls!==void 0&&e.nulls!=="propagate"&&e.nulls!=="error")throw new Error("未知空值规则");if(e.divisionByZero!==void 0&&e.divisionByZero!=="null"&&e.divisionByZero!=="error")throw new Error("未知除零规则");if(e.scope==="group"&&(!Array.isArray(e.groupBy)||!e.groupBy.length))throw new Error("分组计算需要 groupBy 字段");Me(e)}function Me(e){if(e.groupBy!==void 0){if(!Array.isArray(e.groupBy)||e.groupBy.length>16)throw new Error("计算分组最多 16 级");e.groupBy.forEach(g)}if(e.dependsOn!==void 0){if(!Array.isArray(e.dependsOn)||e.dependsOn.length>2048)throw new Error("计算依赖超出预算");e.dependsOn.forEach(g)}}function I(e){return[...new Set([...typeof e.expression=="string"?e.dependsOn??[]:ye(e.expression),...e.groupBy??[]])]}function Q(e){if(!Array.isArray(e)||e.length>2048)throw new Error("计算字段应为数组且最多2048项");const t=new Map;for(const o of e){if(Ne(o),t.has(o.field))throw new Error(`计算字段重复:${o.field}`);t.set(o.field,o)}const r=new Set,n=new Set,i=[];function c(o){if(!n.has(o.field)){if(r.has(o.field))throw new Error(`计算字段存在循环依赖:${[...r,o.field].join(" → ")}`);r.add(o.field);for(const a of I(o)){const s=t.get(a);s&&c(s)}r.delete(o.field),n.add(o.field),i.push(o)}}return e.forEach(c),i}function Fe(e){try{const t=Q(e);return{valid:!0,errors:[],order:t.map(r=>r.field),fields:e.map(r=>({field:r.field,dependencies:I(r),scope:r.scope??"row"}))}}catch(t){return{valid:!1,errors:[t instanceof Error?t.message:String(t)],fields:[],order:[]}}}function je(e=[]){return{fields:e.map(t=>({...t})),functions:C,operations:C.map(t=>t.name),aggregates:["sum","count","avg","min","max","weightedAvg"],scopes:["row","group","dataset"],numericModes:["number","decimal"],rules:{nulls:"propagate",aggregateNulls:"skip",emptyAggregate:null,countEmpty:0,divisionByZero:"error",decimalOutput:"string",rounding:"half-away-from-zero"}}}function z(e){return Q(e.fields).map(t=>{const r=I(t);if(typeof t.expression!="string")return{definition:t,dependencies:r,read:Y(t.expression,t)};if(!e.formula)throw new Error("字符串公式需要显式配置 formula adapter");const n=t.expression;return{definition:t,dependencies:r,read:i=>e.formula.evaluate(n,i)}})}function xe(e,t){return JSON.stringify(t.map(r=>{const n=Object.prototype.hasOwnProperty.call(e,r)?e[r]:null;if(n!=null&&!R(n))throw new Error("分组字段应为有限 JSON 标量");return[typeof n,n??null]}))}function ke(e,t){if(t.scope==="dataset")return()=>e;if(t.scope!=="group"){const i=new WeakMap;return c=>{let o=i.get(c);return o||(o=[c],i.set(c,o)),o}}const r=new Map,n=new WeakMap;for(const i of e){const c=xe(i,t.groupBy);n.set(i,c);const o=r.get(c);o?o.push(i):r.set(c,[i])}return i=>r.get(n.get(i))}function Ce(e,t){const r=t.maxRows??1e5,n=t.maxCells??2e6;if(!Array.isArray(e)||!Number.isSafeInteger(r)||r<1||e.length>r)throw new Error("计算数据行数超出预算或输入不是数组");if(!Array.isArray(t.fields)||t.fields.length>2048)throw new Error("计算字段应为数组且最多2048项");if(!Number.isSafeInteger(n)||n<1||e.length*t.fields.length>n)throw new Error("计算单元格超出 maxCells 预算")}function G(e){if(e?.aborted){const t=new Error("数据计算已取消");throw t.name="AbortError",t}}function Pe(e,t,r,n,i,c){try{const o=e.read({row:t,rowIndex:r,rows:n});if(o!==void 0&&!R(o))throw new Error("计算结果应为有限 JSON 标量,异步公式请先在数据源中求值");t[e.definition.field]=o??null}catch(o){const a=o instanceof Error?o.message:String(o);if(i.onError!=="null")throw Object.assign(new Error(`第 ${r+1} 行 ${e.definition.field}:${a}`),{cause:o});t[e.definition.field]=null,c.push({rowIndex:r,field:e.definition.field,message:a})}}function Re(e,t,r,n,i,c,o,a){const s=De(e,t,r,n);if(s&&(!s.issue||o.onError==="null")){n[r.definition.field]=s.value,s.issue&&a.push({...s.issue,rowIndex:i});return}const f=a.length;Pe(r,n,i,c,o,a),Se(e,t,r,n,a.length>f?a[a.length-1]:void 0)}function Ye(e,t){Ce(e,t),G(t.signal);const r=Oe(e,t.fields,()=>z(t)),n={program:r,writes:new WeakMap},i=r?.fields??z(t),c=[],o=e.map((a,s)=>{if(!a||typeof a!="object"||Array.isArray(a))throw new Error(`第 ${s+1} 行应为对象`);return{...a}});for(const a of i){const s=ke(o,a.definition);o.forEach((f,u)=>{G(t.signal),Re(n,e[u],a,f,u,s(f),t,c)})}return{rows:o,issues:c}}exports.addDecimal=y;exports.aggregateRows=x;exports.compareDecimal=h;exports.compileReportPredicate=p;exports.computationFieldName=g;exports.computeDataset=Ye;exports.createAggregateAccumulator=Z;exports.decimalDigits=w;exports.divideDecimal=v;exports.evaluateReportPredicate=ce;exports.forkComputedDataset=ve;exports.formatDecimal=q;exports.getComputationMetadata=je;exports.multiplyDecimal=N;exports.parseDecimal=l;exports.printDecimal=b;exports.registerComputedDataset=Ae;exports.reportPredicateFields=H;exports.validateComputedFields=Fe;
|