@agile-team/mach-report 2.9.1 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +11 -7
  2. package/dist/ExcelBindingWizard-CjIiVox-.cjs +1 -0
  3. package/dist/ExcelBindingWizard-Dxm-K5HL.js +1240 -0
  4. package/dist/ParamEditor-D-Hf5xfO.cjs +1 -0
  5. package/dist/ParamEditor-DRGxzxeO.js +381 -0
  6. package/dist/ReportBatchPanel-BYgg0EDB.cjs +1 -0
  7. package/dist/ReportBatchPanel-Bby5yLzU.js +287 -0
  8. package/dist/ReportPreview-DWXROHBP.cjs +6 -0
  9. package/dist/ReportPreview-DiNXhQI0.js +4138 -0
  10. package/dist/ReportTemplateLibrary-C6CO7YCT.cjs +1 -0
  11. package/dist/ReportTemplateLibrary-DfzDXRvr.js +260 -0
  12. package/dist/RuleEditor-C2QsOHOs.cjs +1 -0
  13. package/dist/RuleEditor-D9wQHrkf.js +2024 -0
  14. package/dist/TemplateReviewPanel-BKofGrV9.js +222 -0
  15. package/dist/TemplateReviewPanel-DwtOcLue.cjs +1 -0
  16. package/dist/analytics.cjs +1 -1
  17. package/dist/analytics.d.cts +4 -0
  18. package/dist/analytics.d.ts +4 -0
  19. package/dist/analytics.js +40 -39
  20. package/dist/{assets-ahTRUXRk.cjs → assets-Bu6UohJx.cjs} +1 -1
  21. package/dist/{assets-DDsfEi8R.js → assets-DegqDNqY.js} +1 -1
  22. package/dist/batch-Bt3Fd27Z.cjs +1 -0
  23. package/dist/batch-mRqhhhjt.js +364 -0
  24. package/dist/{capabilities-Cm9hZ3uV.js → capabilities-CK_7hizc.js} +16 -16
  25. package/dist/capabilities-CsZ-pNHR.cjs +1 -0
  26. package/dist/computed-Bvk0W15F.js +521 -0
  27. package/dist/computed-CGV2a809.cjs +1 -0
  28. package/dist/config-B612mw0x.js +525 -0
  29. package/dist/config-BRoLo2oj.cjs +1 -0
  30. package/dist/designer.cjs +2 -2
  31. package/dist/designer.d.cts +695 -50
  32. package/dist/designer.d.ts +695 -50
  33. package/dist/designer.js +2213 -1748
  34. package/dist/index.cjs +8 -8
  35. package/dist/index.d.cts +205 -6
  36. package/dist/index.d.ts +205 -6
  37. package/dist/index.js +808 -1033
  38. package/dist/injection-keys-Db_DyLkm.cjs +1 -0
  39. package/dist/injection-keys-e85udZCp.js +7 -0
  40. package/dist/list-cell-BuYn4tGF.cjs +1 -0
  41. package/dist/list-cell-ClFra1zS.js +173 -0
  42. package/dist/matrix-DVyWiYsd.cjs +1 -0
  43. package/dist/matrix-yZsGnldA.js +227 -0
  44. package/dist/param-validation-BlHHXs6u.js +153 -0
  45. package/dist/param-validation-DCK039V1.cjs +1 -0
  46. package/dist/pdf.cjs +49 -49
  47. package/dist/pdf.d.cts +31 -1
  48. package/dist/pdf.d.ts +31 -1
  49. package/dist/pdf.js +4797 -4650
  50. package/dist/plugin-BDTU4D94.cjs +1 -0
  51. package/dist/plugin-Cd5G2QQn.js +22 -0
  52. package/dist/region-binding-workflow-CXDmt9Bs.js +977 -0
  53. package/dist/region-binding-workflow-DhQvu1co.cjs +3 -0
  54. package/dist/{report-params-B_VCihAh.js → report-params-B44imUd4.js} +1 -1
  55. package/dist/{report-params-CjWrjPl6.cjs → report-params-SJfhKgaX.cjs} +1 -1
  56. package/dist/server/node.d.cts +48 -5
  57. package/dist/server/node.d.ts +48 -5
  58. package/dist/server-node.cjs +1 -1
  59. package/dist/server-node.js +503 -317
  60. package/dist/server.cjs +1 -1
  61. package/dist/server.d.cts +252 -4
  62. package/dist/server.d.ts +252 -4
  63. package/dist/server.js +567 -469
  64. package/dist/style.css +1 -1
  65. package/dist/template-registry-WNXdkiET.js +506 -0
  66. package/dist/template-registry-ukBGlm8N.cjs +1 -0
  67. package/dist/template-review-BXp2oyqg.cjs +1 -0
  68. package/dist/template-review-BdcXSYbx.js +1616 -0
  69. package/dist/tree-BX380Rr7.cjs +1 -0
  70. package/dist/tree-CqcQ99NM.js +172 -0
  71. package/dist/useLocalDraft-C07SYRnC.js +11 -0
  72. package/dist/useLocalDraft-Yiw1wFgI.cjs +1 -0
  73. package/dist/{validate-DWPF7icl.js → validate-7s0yn6ii.js} +26 -26
  74. package/dist/validate-DsRiNw8h.cjs +1 -0
  75. package/dist/vue/async.d.cts +118 -6
  76. package/dist/vue/async.d.ts +118 -6
  77. package/dist/vue/index.d.cts +177 -11
  78. package/dist/vue/index.d.ts +177 -11
  79. package/dist/vue-async.cjs +1 -1
  80. package/dist/vue-async.js +5 -5
  81. package/dist/vue.cjs +1 -1
  82. package/dist/vue.js +116 -113
  83. package/dist/{import-template-CNMLJSQw.js → workbook-session-BKOTwcoq.js} +4290 -4227
  84. package/dist/{import-template-CpxunKVp.cjs → workbook-session-CLYLhZWu.cjs} +17 -17
  85. package/dist/worker.cjs +1 -1
  86. package/dist/worker.d.cts +9 -2
  87. package/dist/worker.d.ts +9 -2
  88. package/dist/worker.js +1 -1
  89. package/dist/xlsx.cjs +4 -2
  90. package/dist/xlsx.d.cts +159 -3
  91. package/dist/xlsx.d.ts +159 -3
  92. package/dist/xlsx.js +354 -192
  93. package/package.json +1 -1
  94. package/dist/ExcelBindingWizard-DiaxvWpQ.cjs +0 -1
  95. package/dist/ExcelBindingWizard-RLJIXKKG.js +0 -816
  96. package/dist/ReportPreview-B5ZNEasW.js +0 -4439
  97. package/dist/ReportPreview-DRtVPUYo.cjs +0 -6
  98. package/dist/RuleEditor-CskN5Fr3.cjs +0 -1
  99. package/dist/RuleEditor-CtJFzKuY.js +0 -1578
  100. package/dist/TemplateReviewPanel-C_Lmzis6.cjs +0 -1
  101. package/dist/TemplateReviewPanel-Cn32OY4_.js +0 -173
  102. package/dist/binding-preview-B5834rml.cjs +0 -2
  103. package/dist/binding-preview-ChXjN5L5.js +0 -649
  104. package/dist/capabilities-DYzWL7KS.cjs +0 -1
  105. package/dist/matrix-CNPDJxED.js +0 -745
  106. package/dist/matrix-Div9Ilh3.cjs +0 -1
  107. package/dist/param-validation-BWNjLcN0.js +0 -116
  108. package/dist/param-validation-CiTxFeZ8.cjs +0 -1
  109. package/dist/plugin-BWwIgZXV.js +0 -25
  110. package/dist/plugin-Dg-J1Rbm.cjs +0 -1
  111. package/dist/template-registry-CHMYZ7SD.cjs +0 -1
  112. package/dist/template-registry-R61AMCr0.js +0 -433
  113. package/dist/template-review-hvWWQFsi.js +0 -1027
  114. package/dist/template-review-jEcOfmGr.cjs +0 -1
  115. package/dist/validate-BDiMqkJC.cjs +0 -1
@@ -1,745 +0,0 @@
1
- function y(e) {
2
- if (!Number.isSafeInteger(e) || e < 0 || e > 1e3 * 2)
3
- throw new Error("十进制精度超出预算");
4
- return 10n ** BigInt(e);
5
- }
6
- function S(e) {
7
- if (e.coefficient.toString().length > 1e3 * 2 || e.scale > 1e3 * 2)
8
- throw new Error("十进制结果超出精度预算");
9
- return e;
10
- }
11
- function g(e) {
12
- if (typeof e != "string" && !(typeof e == "number" && Number.isFinite(e)))
13
- throw new Error("十进制参数必须是有限数字或十进制文本");
14
- const r = String(e);
15
- if (r.length > 1e3) throw new Error("十进制文本超出精度预算");
16
- const t = /^([+-]?)(\d+)(?:\.(\d*))?(?:[eE]([+-]?\d{1,4}))?$/.exec(
17
- r
18
- );
19
- if (!t) throw new Error("无效十进制文本");
20
- const n = t[3] ?? "", l = Number(t[4] ?? 0), o = n.length - l, i = BigInt(
21
- `${t[1] === "-" ? "-" : ""}${t[2]}${n}`
22
- );
23
- return S(
24
- o < 0 ? { coefficient: i * y(-o), scale: 0 } : { coefficient: i, scale: o }
25
- );
26
- }
27
- function T(e, r) {
28
- const t = Math.max(e.scale, r.scale);
29
- return [
30
- e.coefficient * y(t - e.scale),
31
- r.coefficient * y(t - r.scale),
32
- t
33
- ];
34
- }
35
- function R(e, r) {
36
- const [t, n] = T(e, r);
37
- return t < n ? -1 : t > n ? 1 : 0;
38
- }
39
- function A(e, r) {
40
- const [t, n, l] = T(e, r);
41
- return S({ coefficient: t + n, scale: l });
42
- }
43
- function x(e, r) {
44
- return S({
45
- coefficient: e.coefficient * r.coefficient,
46
- scale: e.scale + r.scale
47
- });
48
- }
49
- function J(e, r) {
50
- const t = e / r, n = e % r, l = (o) => o < 0n ? -o : o;
51
- return l(n) * 2n < l(r) ? t : t + (e < 0n == r < 0n ? 1n : -1n);
52
- }
53
- function N(e) {
54
- if (!Number.isInteger(e) || e < 0 || e > 100)
55
- throw new Error("十进制小数位应为 0–100 的整数");
56
- }
57
- function M(e, r, t = 20) {
58
- if (N(t), r.coefficient === 0n) throw new Error("不能除以零");
59
- const n = r.scale - e.scale + t, l = e.coefficient * y(Math.max(0, n)), o = r.coefficient * y(Math.max(0, -n));
60
- return S({
61
- coefficient: J(l, o),
62
- scale: t
63
- });
64
- }
65
- function $(e, r) {
66
- let t = e.coefficient, n = e.scale;
67
- r !== void 0 && (N(r), t = r >= n ? t * y(r - n) : J(t, y(n - r)), n = r);
68
- const l = t < 0n, o = (l ? -t : t).toString().padStart(n + 1, "0");
69
- let i = n ? o.slice(-n) : "";
70
- return r === void 0 && (i = i.replace(/0+$/, "")), `${l ? "-" : ""}${n ? o.slice(0, -n) : o}${i ? `.${i}` : ""}`;
71
- }
72
- function ge(e, r, t = !1, n = !1) {
73
- let l = g(e);
74
- n && (l = x(l, { coefficient: 100n, scale: 0 }));
75
- const [o, i] = $(l, r).split(".");
76
- return `${t ? o.replace(/\B(?=(\d{3})+(?!\d))/g, ",") : o}${i === void 0 ? "" : `.${i}`}${n ? "%" : ""}`;
77
- }
78
- const X = [
79
- "sum",
80
- "count",
81
- "avg",
82
- "min",
83
- "max",
84
- "weightedAvg"
85
- ];
86
- function j(e) {
87
- if (typeof e != "number" || !Number.isFinite(e))
88
- throw new Error(
89
- "聚合度量必须是有限数字,不能隐式转换;小数文本请显式选择 decimal"
90
- );
91
- return e;
92
- }
93
- function v(e, r) {
94
- return r && Object.prototype.hasOwnProperty.call(e, r) ? e[r] : void 0;
95
- }
96
- function Z(e) {
97
- let r = 0, t = 0, n = 0, l = 0, o = 1 / 0, i = -1 / 0;
98
- const a = (c) => {
99
- const f = c - n, d = t + f;
100
- n = d - t - f, t = d;
101
- };
102
- return {
103
- add(c) {
104
- const f = v(c, e.field);
105
- if (e.op === "count") {
106
- (!e.field || f != null) && r++;
107
- return;
108
- }
109
- if (f == null) return;
110
- const d = j(f), u = e.op === "weightedAvg" ? v(c, e.weightField) : 1;
111
- if (u == null) return;
112
- const s = j(u);
113
- if (e.op === "weightedAvg" && s < 0)
114
- throw new Error("加权平均的权重不能为负数");
115
- ["sum", "avg", "weightedAvg"].includes(e.op) && a(d * s), l += s, o = Math.min(o, d), i = Math.max(i, d), r++;
116
- },
117
- value() {
118
- if (e.op === "count") return r;
119
- if (!r) return null;
120
- const c = e.op === "min" ? o : e.op === "max" ? i : e.op === "avg" ? t / r : e.op === "weightedAvg" ? l === 0 ? null : t / l : t;
121
- if (c !== null && !Number.isFinite(c))
122
- throw new Error("聚合计算溢出");
123
- return c;
124
- }
125
- };
126
- }
127
- function H(e) {
128
- let r = 0, t = g("0"), n = g("0"), l, o;
129
- return {
130
- add(i) {
131
- const a = v(i, e.field);
132
- if (e.op === "count") {
133
- (!e.field || a != null) && r++;
134
- return;
135
- }
136
- if (a == null) return;
137
- const c = e.op === "weightedAvg" ? v(i, e.weightField) : "1";
138
- if (c == null) return;
139
- const f = g(a), d = g(c);
140
- if (e.op === "weightedAvg" && d.coefficient < 0n)
141
- throw new Error("加权平均的权重不能为负数");
142
- ["sum", "avg", "weightedAvg"].includes(e.op) && (t = A(t, x(f, d))), e.op === "weightedAvg" && (n = A(n, d)), (!l || R(f, l) < 0) && (l = f), (!o || R(f, o) > 0) && (o = f), r++;
143
- },
144
- value() {
145
- if (e.op === "count") return r;
146
- if (!r || e.op === "weightedAvg" && n.coefficient === 0n)
147
- return null;
148
- let i = e.op === "min" ? l : e.op === "max" ? o : t;
149
- return e.op === "avg" && (i = M(t, g(r), e.digits)), e.op === "weightedAvg" && (i = M(t, n, e.digits)), $(i, e.digits);
150
- }
151
- };
152
- }
153
- function k(e) {
154
- if (e.digits !== void 0 && N(e.digits), e.numeric !== void 0 && e.numeric !== "number" && e.numeric !== "decimal")
155
- throw new Error("未知聚合数值模式");
156
- if (!X.includes(e.op)) throw new Error("未知聚合操作");
157
- if (e.op !== "count" && !e.field)
158
- throw new Error("聚合需要度量字段");
159
- if (e.op === "weightedAvg" && !e.weightField)
160
- throw new Error("加权平均需要权重字段");
161
- return e.numeric === "decimal" ? H(e) : Z(e);
162
- }
163
- function B(e, r) {
164
- const t = k(r);
165
- for (const n of e) t.add(n);
166
- return t.value();
167
- }
168
- function b(e, r) {
169
- return Object.prototype.hasOwnProperty.call(e, r) ? e[r] : void 0;
170
- }
171
- function z(e) {
172
- if (e == null) return "null";
173
- if (typeof e != "string" && typeof e != "boolean" && !(typeof e == "number" && Number.isFinite(e)))
174
- throw new Error("交叉表维度应为字符串、布尔、有限数字或空值");
175
- return JSON.stringify([typeof e, e]);
176
- }
177
- function D(e) {
178
- return e == null ? "" : String(e);
179
- }
180
- function p(e, r) {
181
- const t = e ?? r;
182
- if (!Number.isInteger(t) || t < 1)
183
- throw new Error("交叉表预算应为正整数");
184
- return t;
185
- }
186
- function K(e, r, t, n) {
187
- const l = t ? 1 : 0;
188
- if ((e + l) * (r + 1 + l) > n)
189
- throw new Error(
190
- "交叉表输出单元格超出 maxCells 预算,请减少维度或服务端预聚合"
191
- );
192
- }
193
- function Q(e, r) {
194
- if (!Array.isArray(e)) throw new Error("交叉表数据应为对象数组");
195
- const t = r.aggregate ?? "sum";
196
- if (!["sum", "count", "avg", "min", "max", "weightedAvg"].includes(t))
197
- throw new Error("未知交叉表聚合类型");
198
- if (!r.rowField || !r.columnField || t !== "count" && !r.valueField)
199
- throw new Error("交叉表需要明确的行维度、列维度和度量字段");
200
- if (e.length > p(r.maxInputRows, 1e5))
201
- throw new Error("交叉表输入超出预算,请在服务端预聚合");
202
- const n = p(r.maxRows, 1e3), l = p(r.maxColumns, 200), o = p(r.maxCells, 2e6), i = () => k({
203
- op: t,
204
- field: t === "count" && r.countMode !== "nonNull" ? void 0 : r.valueField,
205
- weightField: r.weightField,
206
- numeric: r.numeric,
207
- digits: r.digits
208
- }), a = /* @__PURE__ */ new Map(), c = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map(), d = i();
209
- for (const s of e) {
210
- const m = z(b(s, r.rowField)), w = z(b(s, r.columnField));
211
- if (a.has(w) || a.set(w, D(b(s, r.columnField))), c.has(m) || c.set(m, {
212
- label: D(b(s, r.rowField)),
213
- cells: /* @__PURE__ */ new Map(),
214
- total: i()
215
- }), a.size > l || c.size > n)
216
- throw new Error("交叉表维度数量超出预算");
217
- K(c.size, a.size, r.totals, o);
218
- const h = c.get(m);
219
- h.cells.has(w) || h.cells.set(w, i()), f.has(w) || f.set(w, i());
220
- for (const O of [
221
- h.cells.get(w),
222
- h.total,
223
- f.get(w),
224
- d
225
- ])
226
- O.add(s);
227
- }
228
- const u = {
229
- columns: [
230
- {
231
- header: r.rowHeader ?? r.rowField,
232
- field: "rowLabel",
233
- semanticRole: "dimension"
234
- },
235
- ...[...a.values()].map(
236
- (s, m) => ({
237
- header: s,
238
- field: `c${m}`,
239
- semanticRole: "measure"
240
- })
241
- )
242
- ],
243
- rows: [...c.values()].map((s) => ({
244
- rowLabel: s.label,
245
- ...Object.fromEntries(
246
- [...a.keys()].map((m, w) => [
247
- `c${w}`,
248
- s.cells.get(m)?.value() ?? (t === "count" ? 0 : null)
249
- ])
250
- ),
251
- ...r.totals ? { total: s.total.value() } : {}
252
- }))
253
- };
254
- return r.totals && (u.columns.push({
255
- header: "合计",
256
- field: "total",
257
- semanticRole: "measure"
258
- }), e.length && u.rows.push({
259
- rowLabel: "合计",
260
- ...Object.fromEntries(
261
- [...a.keys()].map((s, m) => [
262
- `c${m}`,
263
- f.get(s)?.value() ?? (t === "count" ? 0 : null)
264
- ])
265
- ),
266
- total: d.value()
267
- })), u;
268
- }
269
- const U = /* @__PURE__ */ new Set(["__proto__", "prototype", "constructor"]);
270
- function E(e) {
271
- if (typeof e != "string" || !e.trim() || U.has(e))
272
- throw new Error("计算字段应为安全的非空字段名");
273
- }
274
- function I(e) {
275
- return e === null || ["string", "boolean"].includes(typeof e) || typeof e == "number" && Number.isFinite(e);
276
- }
277
- function V(e) {
278
- if (e.some((r) => typeof r != "number" || !Number.isFinite(r)))
279
- throw new Error("算术参数必须是有限数字;空值和小数文本不会隐式转换");
280
- return e;
281
- }
282
- function Y(e, r) {
283
- const t = V(r);
284
- let n;
285
- if (e === "add") n = t.reduce((l, o) => l + o, 0);
286
- else if (e === "multiply") n = t.reduce((l, o) => l * o, 1);
287
- else if (e === "subtract") n = t[0] - t[1];
288
- else {
289
- if (t[1] === 0) throw new Error("不能除以零");
290
- n = t[0] / t[1];
291
- }
292
- if (!Number.isFinite(n)) throw new Error("计算结果不是有限数字");
293
- return n;
294
- }
295
- function q(e, r, t) {
296
- const n = r.map(g);
297
- let l;
298
- return e === "add" ? l = n.reduce(A) : e === "multiply" ? l = n.reduce(x) : e === "subtract" ? l = A(n[0], {
299
- ...n[1],
300
- coefficient: -n[1].coefficient
301
- }) : l = M(n[0], n[1], t), $(l, t);
302
- }
303
- function ee(e, r, t) {
304
- return t.nulls !== "error" && r.some((n) => n == null) || e === "divide" && t.divisionByZero === "null" && (t.numeric === "decimal" ? g(r[1]).coefficient === 0n : r[1] === 0) ? null : t.numeric === "decimal" ? q(e, r, t.digits) : Y(e, r);
305
- }
306
- function re(e, r) {
307
- e.field !== void 0 && E(e.field), e.weightField !== void 0 && E(e.weightField);
308
- const t = {
309
- op: e.aggregate,
310
- field: e.field,
311
- weightField: e.weightField,
312
- numeric: r.numeric,
313
- digits: r.digits
314
- };
315
- B([], t);
316
- const n = /* @__PURE__ */ new WeakMap();
317
- return (l) => {
318
- let o = n.get(l.rows);
319
- if (!o) {
320
- try {
321
- o = { value: B(l.rows, t) };
322
- } catch (i) {
323
- o = {
324
- error: i instanceof Error ? i : new Error(String(i))
325
- };
326
- }
327
- n.set(l.rows, o);
328
- }
329
- if (o.error) throw o.error;
330
- return o.value;
331
- };
332
- }
333
- function te(e, r) {
334
- for (const t of e) {
335
- const n = t(r);
336
- if (n != null) return n;
337
- }
338
- return null;
339
- }
340
- function C(e, r = {}, t = { nodes: 0 }, n = 0) {
341
- if (++t.nodes > 256 || n > 16)
342
- throw new Error("计算表达式超出深度或节点预算");
343
- if (!e || typeof e != "object" || Array.isArray(e))
344
- throw new Error("计算表达式应为声明式对象");
345
- if ("aggregate" in e) return re(e, r);
346
- if ("field" in e) {
347
- E(e.field);
348
- const l = e.field;
349
- return ({ row: o }) => Object.prototype.hasOwnProperty.call(o, l) ? o[l] : void 0;
350
- }
351
- if ("value" in e) {
352
- if (!I(e.value))
353
- throw new Error("常量应为有限 JSON 标量");
354
- return () => e.value;
355
- }
356
- return ne(e, r, t, n);
357
- }
358
- function ne(e, r, t, n) {
359
- if (!["add", "subtract", "multiply", "divide", "coalesce"].includes(
360
- e.op
361
- ) || !Array.isArray(e.args))
362
- throw new Error("未知计算操作");
363
- if (e.args.length > 256 || Object.keys(e.args).length !== e.args.length)
364
- throw new Error("计算参数超出预算或包含空位");
365
- if (e.args.length < 2 || ["subtract", "divide"].includes(e.op) && e.args.length !== 2)
366
- throw new Error("运算参数数量不正确");
367
- const l = e.args.map(
368
- (o) => C(o, r, t, n + 1)
369
- );
370
- return e.op === "coalesce" ? (o) => te(l, o) : (o) => ee(
371
- e.op,
372
- l.map((i) => i(o)),
373
- r
374
- );
375
- }
376
- function ie(e) {
377
- C(e);
378
- const r = /* @__PURE__ */ new Set(), t = (n) => {
379
- "field" in n && n.field && r.add(n.field), "aggregate" in n && n.weightField && r.add(n.weightField), "args" in n && n.args.forEach(t);
380
- };
381
- return t(e), [...r];
382
- }
383
- function oe(e) {
384
- if (E(e.field), e.scope !== void 0 && !["row", "group", "dataset"].includes(e.scope))
385
- throw new Error("未知计算范围");
386
- if (e.numeric !== void 0 && e.numeric !== "number" && e.numeric !== "decimal")
387
- throw new Error("未知数值模式");
388
- if (e.digits !== void 0 && N(e.digits), e.nulls !== void 0 && e.nulls !== "propagate" && e.nulls !== "error")
389
- throw new Error("未知空值规则");
390
- if (e.divisionByZero !== void 0 && e.divisionByZero !== "null" && e.divisionByZero !== "error")
391
- throw new Error("未知除零规则");
392
- if (e.scope === "group" && (!Array.isArray(e.groupBy) || !e.groupBy.length))
393
- throw new Error("分组计算需要 groupBy 字段");
394
- le(e);
395
- }
396
- function le(e) {
397
- if (e.groupBy !== void 0) {
398
- if (!Array.isArray(e.groupBy) || e.groupBy.length > 16)
399
- throw new Error("计算分组最多 16 级");
400
- e.groupBy.forEach(E);
401
- }
402
- if (e.dependsOn !== void 0) {
403
- if (!Array.isArray(e.dependsOn) || e.dependsOn.length > 2048)
404
- throw new Error("计算依赖超出预算");
405
- e.dependsOn.forEach(E);
406
- }
407
- }
408
- function P(e) {
409
- return [
410
- .../* @__PURE__ */ new Set([
411
- ...typeof e.expression == "string" ? e.dependsOn ?? [] : ie(e.expression),
412
- ...e.groupBy ?? []
413
- ])
414
- ];
415
- }
416
- function G(e) {
417
- if (!Array.isArray(e) || e.length > 2048)
418
- throw new Error("计算字段应为数组且最多2048项");
419
- const r = /* @__PURE__ */ new Map();
420
- for (const i of e) {
421
- if (oe(i), r.has(i.field)) throw new Error(`计算字段重复:${i.field}`);
422
- r.set(i.field, i);
423
- }
424
- const t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set(), l = [];
425
- function o(i) {
426
- if (!n.has(i.field)) {
427
- if (t.has(i.field))
428
- throw new Error(
429
- `计算字段存在循环依赖:${[...t, i.field].join(" → ")}`
430
- );
431
- t.add(i.field);
432
- for (const a of P(i)) {
433
- const c = r.get(a);
434
- c && o(c);
435
- }
436
- t.delete(i.field), n.add(i.field), l.push(i);
437
- }
438
- }
439
- return e.forEach(o), l;
440
- }
441
- function he(e) {
442
- try {
443
- const r = G(e);
444
- return {
445
- valid: !0,
446
- errors: [],
447
- order: r.map((t) => t.field),
448
- fields: e.map((t) => ({
449
- field: t.field,
450
- dependencies: P(t),
451
- scope: t.scope ?? "row"
452
- }))
453
- };
454
- } catch (r) {
455
- return {
456
- valid: !1,
457
- errors: [r instanceof Error ? r.message : String(r)],
458
- fields: [],
459
- order: []
460
- };
461
- }
462
- }
463
- function ye(e = []) {
464
- return {
465
- fields: e.map((r) => ({ ...r })),
466
- functions: [
467
- {
468
- name: "add",
469
- minArgs: 2,
470
- maxArgs: 256,
471
- input: "numeric",
472
- output: "numeric"
473
- },
474
- {
475
- name: "subtract",
476
- minArgs: 2,
477
- maxArgs: 2,
478
- input: "numeric",
479
- output: "numeric"
480
- },
481
- {
482
- name: "multiply",
483
- minArgs: 2,
484
- maxArgs: 256,
485
- input: "numeric",
486
- output: "numeric"
487
- },
488
- {
489
- name: "divide",
490
- minArgs: 2,
491
- maxArgs: 2,
492
- input: "numeric",
493
- output: "numeric"
494
- },
495
- {
496
- name: "coalesce",
497
- minArgs: 2,
498
- maxArgs: 256,
499
- input: "scalar",
500
- output: "scalar"
501
- }
502
- ],
503
- operations: ["add", "subtract", "multiply", "divide", "coalesce"],
504
- aggregates: ["sum", "count", "avg", "min", "max", "weightedAvg"],
505
- scopes: ["row", "group", "dataset"],
506
- numericModes: ["number", "decimal"],
507
- rules: {
508
- nulls: "propagate",
509
- aggregateNulls: "skip",
510
- emptyAggregate: null,
511
- countEmpty: 0,
512
- divisionByZero: "error",
513
- decimalOutput: "string",
514
- rounding: "half-away-from-zero"
515
- }
516
- };
517
- }
518
- function ce(e) {
519
- return G(e.fields).map((r) => {
520
- if (typeof r.expression != "string")
521
- return {
522
- definition: r,
523
- read: C(r.expression, r)
524
- };
525
- if (!e.formula)
526
- throw new Error("字符串公式需要显式配置 formula adapter");
527
- const t = r.expression;
528
- return {
529
- definition: r,
530
- read: (n) => e.formula.evaluate(t, n)
531
- };
532
- });
533
- }
534
- function ae(e, r) {
535
- return JSON.stringify(
536
- r.map((t) => {
537
- const n = Object.prototype.hasOwnProperty.call(e, t) ? e[t] : null;
538
- if (n != null && !I(n))
539
- throw new Error("分组字段应为有限 JSON 标量");
540
- return [typeof n, n ?? null];
541
- })
542
- );
543
- }
544
- function ue(e, r) {
545
- if (r.scope === "dataset") return () => e;
546
- if (r.scope !== "group") {
547
- const l = /* @__PURE__ */ new WeakMap();
548
- return (o) => {
549
- let i = l.get(o);
550
- return i || (i = [o], l.set(o, i)), i;
551
- };
552
- }
553
- const t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new WeakMap();
554
- for (const l of e) {
555
- const o = ae(l, r.groupBy);
556
- n.set(l, o);
557
- const i = t.get(o);
558
- i ? i.push(l) : t.set(o, [l]);
559
- }
560
- return (l) => t.get(n.get(l));
561
- }
562
- function se(e, r) {
563
- const t = r.maxRows ?? 1e5, n = r.maxCells ?? 2e6;
564
- if (!Array.isArray(e) || !Number.isSafeInteger(t) || t < 1 || e.length > t)
565
- throw new Error("计算数据行数超出预算或输入不是数组");
566
- if (!Array.isArray(r.fields) || r.fields.length > 2048)
567
- throw new Error("计算字段应为数组且最多2048项");
568
- if (!Number.isSafeInteger(n) || n < 1 || e.length * r.fields.length > n)
569
- throw new Error("计算单元格超出 maxCells 预算");
570
- }
571
- function _(e) {
572
- if (e?.aborted) {
573
- const r = new Error("数据计算已取消");
574
- throw r.name = "AbortError", r;
575
- }
576
- }
577
- function fe(e, r, t, n, l, o) {
578
- try {
579
- const i = e.read({ row: r, rowIndex: t, rows: n });
580
- if (i !== void 0 && !I(i))
581
- throw new Error("计算结果应为有限 JSON 标量,异步公式请先在数据源中求值");
582
- r[e.definition.field] = i ?? null;
583
- } catch (i) {
584
- const a = i instanceof Error ? i.message : String(i);
585
- if (l.onError !== "null")
586
- throw Object.assign(
587
- new Error(`第 ${t + 1} 行 ${e.definition.field}:${a}`),
588
- { cause: i }
589
- );
590
- r[e.definition.field] = null, o.push({ rowIndex: t, field: e.definition.field, message: a });
591
- }
592
- }
593
- function Ee(e, r) {
594
- se(e, r), _(r.signal);
595
- const t = ce(r), n = [], l = e.map((o, i) => {
596
- if (!o || typeof o != "object" || Array.isArray(o))
597
- throw new Error(`第 ${i + 1} 行应为对象`);
598
- return { ...o };
599
- });
600
- for (const o of t) {
601
- const i = ue(l, o.definition);
602
- l.forEach((a, c) => {
603
- _(r.signal), fe(o, a, c, i(a), r, n);
604
- });
605
- }
606
- return { rows: l, issues: n };
607
- }
608
- function F(e, r) {
609
- const t = r.map(
610
- (n) => Object.prototype.hasOwnProperty.call(e, n) ? e[n] : null
611
- );
612
- if (t.some(
613
- (n) => n != null && typeof n != "string" && typeof n != "boolean" && !(typeof n == "number" && Number.isFinite(n))
614
- ))
615
- throw new Error("矩阵维度必须是有限 JSON 标量");
616
- return {
617
- key: JSON.stringify(t.map((n) => [typeof n, n ?? null])),
618
- label: t.map((n) => n == null ? "" : String(n)).join(" / ")
619
- };
620
- }
621
- function me(e) {
622
- for (const r of [
623
- "maxRows",
624
- "maxColumns",
625
- "maxInputRows",
626
- "maxCells"
627
- ])
628
- if (e[r] !== void 0 && (!Number.isSafeInteger(e[r]) || e[r] < 1))
629
- throw new Error("矩阵预算应为正安全整数");
630
- for (const r of ["columnWidthMm", "rowWidthMm"])
631
- if (e[r] !== void 0 && (!Number.isFinite(e[r]) || e[r] <= 0))
632
- throw new Error("矩阵列宽应为正数");
633
- }
634
- function de(e) {
635
- if (!e || !Array.isArray(e.rowFields) || !Array.isArray(e.columnFields) || !Array.isArray(e.measures))
636
- throw new Error("矩阵需要行维度、列维度和度量数组");
637
- for (const t of [e.rowFields, e.columnFields])
638
- if (t.some((n) => typeof n != "string" || !n.trim()) || new Set(t).size !== t.length)
639
- throw new Error("矩阵维度字段应非空且唯一");
640
- if (me(e), !e.rowFields.length || !e.columnFields.length || e.rowFields.length > 16 || e.columnFields.length > 16)
641
- throw new Error("矩阵需要 1–16 个行/列维度");
642
- if (!e.measures.length || e.measures.length > 32)
643
- throw new Error("矩阵需要 1–32 个度量");
644
- if (e.measures.map((t) => {
645
- if (!t || typeof t != "object") throw new Error("矩阵度量应为对象");
646
- if (k({
647
- ...t,
648
- field: t.valueField ?? t.field
649
- }), t.label !== void 0 && typeof t.label != "string")
650
- throw new Error("矩阵度量标签应为字符串");
651
- return t.field;
652
- }).some((t) => typeof t != "string" || !t.trim()))
653
- throw new Error("矩阵度量字段应非空");
654
- }
655
- function we(e, r) {
656
- if (de(r), !Array.isArray(e) || e.length > (r.maxInputRows ?? 1e5))
657
- throw new Error("矩阵输入超出预算");
658
- const t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
659
- for (const i of e) {
660
- if (!i || typeof i != "object" || Array.isArray(i))
661
- throw new Error("矩阵数据行应为对象");
662
- if (t.add(F(i, r.rowFields).key), n.add(F(i, r.columnFields).key), t.size > (r.maxRows ?? 1e3) || n.size > (r.maxColumns ?? 200))
663
- throw new Error("矩阵维度数量超出预算");
664
- if ((t.size + +!!r.totals) * ((n.size + +!!r.totals) * r.measures.length + 1) > (r.maxCells ?? 2e6))
665
- throw new Error("矩阵输出超出 maxCells 预算");
666
- }
667
- const l = t.size + +(!!r.totals && e.length > 0), o = (n.size + +!!r.totals) * r.measures.length + 1;
668
- return { rowCount: l, columnCount: o, cells: l * o };
669
- }
670
- function L(e, r) {
671
- let t = r;
672
- for (; e.some((n) => Object.prototype.hasOwnProperty.call(n, t)); )
673
- t += "_";
674
- return t;
675
- }
676
- function be(e, r) {
677
- we(e, r);
678
- const t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), l = L(e, "__matrix_row"), o = L(e, "__matrix_column"), i = e.map((u) => {
679
- const s = F(u, r.rowFields), m = F(u, r.columnFields);
680
- return t.set(s.key, s.label), n.set(m.key, m.label), { ...u, [l]: s.key, [o]: m.key };
681
- }), a = r.maxCells ?? 2e6;
682
- if ((t.size + +!!r.totals) * ((n.size + +!!r.totals) * r.measures.length + 1) > a)
683
- throw new Error("矩阵输出超出 maxCells 预算");
684
- const c = r.measures.map(
685
- (u) => Q(i, {
686
- rowField: l,
687
- columnField: o,
688
- valueField: u.valueField ?? u.field,
689
- aggregate: u.op,
690
- countMode: "nonNull",
691
- weightField: u.weightField,
692
- numeric: u.numeric,
693
- digits: u.digits,
694
- totals: r.totals,
695
- maxRows: r.maxRows,
696
- maxColumns: r.maxColumns,
697
- maxInputRows: r.maxInputRows,
698
- maxCells: a
699
- })
700
- ), f = c[0].rows.map(
701
- (u) => ({
702
- rowLabel: t.get(String(u.rowLabel)) ?? String(u.rowLabel)
703
- })
704
- ), d = [
705
- {
706
- field: "rowLabel",
707
- header: r.rowHeader ?? r.rowFields.join(" / "),
708
- semanticRole: "dimension"
709
- }
710
- ];
711
- for (let u = 0; u < c.length; u++) {
712
- const s = c[u], m = r.measures[u];
713
- for (const w of s.columns.slice(1)) {
714
- const h = `${w.field}_${u}`;
715
- d.push({
716
- ...w,
717
- field: h,
718
- ...m.digits === void 0 ? {} : { format: { kind: "number", digits: m.digits } },
719
- header: `${n.get(w.header) ?? w.header} · ${m.label ?? `${m.field} (${m.op})`}`
720
- }), s.rows.forEach((O, W) => {
721
- f[W][h] = O[w.field];
722
- });
723
- }
724
- }
725
- return { rows: f, columns: d };
726
- }
727
- export {
728
- A as a,
729
- B as b,
730
- R as c,
731
- Ee as d,
732
- k as e,
733
- Q as f,
734
- be as g,
735
- N as h,
736
- M as i,
737
- we as j,
738
- ge as k,
739
- ye as l,
740
- x as m,
741
- $ as n,
742
- de as o,
743
- g as p,
744
- he as v
745
- };