@agile-team/mach-report 2.21.0 → 2.22.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 +16 -2
- package/dist/{ExcelBindingWizard-B2xXBOJu.cjs → ExcelBindingWizard-CW79I6Gl.cjs} +1 -1
- package/dist/{ExcelBindingWizard-CixTPQAL.js → ExcelBindingWizard-CZyppD7I.js} +3 -3
- package/dist/{ParamEditor-DhHlNxai.cjs → ParamEditor-CiYCJI0b.cjs} +1 -1
- package/dist/{ParamEditor-gKhvEsnr.js → ParamEditor-DQit-Gdf.js} +2 -2
- package/dist/{ReportBatchPanel-D-lyWKyf.js → ReportBatchPanel-DKTpV7MU.js} +2 -2
- package/dist/{ReportBatchPanel-BUdUfTdm.cjs → ReportBatchPanel-Db6TAfG5.cjs} +1 -1
- package/dist/ReportLabelStudio-B0i9ohQj.cjs +1 -0
- package/dist/ReportLabelStudio-BYnRqmje.js +780 -0
- package/dist/{ReportParamPanel-peB-KEmm.js → ReportParamPanel-BHSKVL8k.js} +231 -224
- package/dist/ReportParamPanel-lngONOEz.cjs +1 -0
- package/dist/ReportPreview-BDgKssYR.js +5887 -0
- package/dist/ReportPreview-Dw-4icG6.cjs +6 -0
- package/dist/{ReportTemplateLibrary-WZl-AK-2.js → ReportTemplateLibrary-BZuKn0YK.js} +1 -1
- package/dist/{ReportTemplateLibrary-Cs9WKneQ.cjs → ReportTemplateLibrary-DEXH07ND.cjs} +1 -1
- package/dist/{RuleEditor-DGpmjCko.js → RuleEditor-CIQn547x.js} +3 -3
- package/dist/{RuleEditor-Dtcq-7LO.cjs → RuleEditor-zSUmPjKa.cjs} +1 -1
- package/dist/{TemplateOutlinePanel-CkCh506f.cjs → TemplateOutlinePanel-B5SfGYVN.cjs} +1 -1
- package/dist/{TemplateOutlinePanel-cxp95OT9.js → TemplateOutlinePanel-D0PgOSQE.js} +2 -2
- package/dist/{TemplateReusePanel-BZ8VTtrO.js → TemplateReusePanel-BKlAEF8-.js} +2 -2
- package/dist/{TemplateReusePanel-CwttuSta.cjs → TemplateReusePanel-DAy_Hwqz.cjs} +1 -1
- package/dist/TemplateReviewPanel-CowmHaQQ.cjs +1 -0
- package/dist/{TemplateReviewPanel-C9cTvsRs.js → TemplateReviewPanel-div-EH_m.js} +2 -2
- package/dist/artifact-integrity.json +76 -76
- package/dist/{auto-Tq7ReIC1.cjs → auto-DcUHlKob.cjs} +1 -1
- package/dist/{auto-BkdGiNtr.js → auto-moShblh1.js} +4 -4
- package/dist/{designer-CIDHt5xz.js → designer-B7jJeAeG.js} +1500 -1455
- package/dist/{designer-CDqok4S5.cjs → designer-BWQVpJeN.cjs} +2 -2
- package/dist/designer.cjs +1 -1
- package/dist/designer.d.cts +149 -2
- package/dist/designer.d.ts +149 -2
- package/dist/designer.js +13 -12
- package/dist/{encoding-BSeUwrN7.js → encoding-DbnhbwI8.js} +2 -2
- package/dist/{encoding-B79hW4zq.cjs → encoding-ncQAvyOv.cjs} +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +38 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +299 -279
- package/dist/{json-snapshot-Kgn459Oj.js → json-snapshot-DvQbZlD7.js} +2 -2
- package/dist/{json-snapshot-I5VI84Vp.cjs → json-snapshot-nyV63AbB.cjs} +1 -1
- package/dist/{plugin-BaRUGORD.cjs → plugin-AcAQ2m9X.cjs} +1 -1
- package/dist/{plugin-D4kAxfLG.js → plugin-w5Nyt08U.js} +1 -1
- package/dist/{prefill-CJSazcVY.js → prefill-BXBxx5We.js} +1 -1
- package/dist/{prefill-Bpyn58AZ.cjs → prefill-DUvejVt1.cjs} +1 -1
- package/dist/prepared-YXy-fVLw.cjs +1 -0
- package/dist/{prepared-BwjwEzFz.js → prepared-rXCKqdHY.js} +35 -34
- package/dist/{protocol-C8VWF9An.cjs → protocol-C9ZaylID.cjs} +1 -1
- package/dist/{protocol-Bs9-ohHN.js → protocol-fjaeKkjf.js} +3 -3
- package/dist/{region-binding-workflow-JNowHd0A.cjs → region-binding-workflow-BiJQ7NU6.cjs} +1 -1
- package/dist/{region-binding-workflow-Cy4GIOUo.js → region-binding-workflow-aA8nxmkZ.js} +1 -1
- package/dist/report-encoding-worker.cjs +1 -1
- package/dist/report-encoding-worker.js +1 -1
- package/dist/{runtime-BDf5x1i1.js → runtime-BTtpjF3D.js} +4 -4
- package/dist/{runtime-DsJt1PIf.cjs → runtime-Dq0LUsyS.cjs} +1 -1
- package/dist/sbom.cdx.json +1 -1
- package/dist/server/node.d.cts +9 -0
- package/dist/server/node.d.ts +9 -0
- package/dist/server-node.cjs +5 -4
- package/dist/server-node.js +1838 -1760
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +81 -0
- package/dist/server.d.ts +81 -0
- package/dist/server.js +6 -6
- package/dist/style.css +1 -1
- package/dist/template-catalog-CLAM4w7H.cjs +1 -0
- package/dist/{template-catalog-DFwIS9aN.js → template-catalog-JSxSqk5y.js} +3 -3
- package/dist/template-fragments-Ca25Jt7e.cjs +1 -0
- package/dist/{template-fragments-Dng-AlHk.js → template-fragments-D2JFj7Du.js} +18 -18
- package/dist/{template-outline-DiADphlq.js → template-outline-CDWXptuj.js} +1 -1
- package/dist/template-outline-K4jGhATu.cjs +1 -0
- package/dist/template-registry-CWnuGqyP.cjs +1 -0
- package/dist/{template-registry-DhBqoD7W.js → template-registry-Do1Uav2Z.js} +333 -261
- package/dist/template-serialization-CU4n_Miu.js +307 -0
- package/dist/template-serialization-CgqBo6s-.cjs +1 -0
- package/dist/vue/async.d.cts +97 -2
- package/dist/vue/async.d.ts +97 -2
- package/dist/vue/index.d.cts +197 -4
- package/dist/vue/index.d.ts +197 -4
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +75 -70
- package/dist/{workbook-session-NYv01LHe.cjs → workbook-session-BvEBRRMz.cjs} +1 -1
- package/dist/{workbook-session-oinxX3qo.js → workbook-session-f0wVlzst.js} +1 -1
- package/dist/workbook-sheets-CaPAulQ6.cjs +2 -0
- package/dist/workbook-sheets-D4M7XXBh.js +44 -0
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +9 -0
- package/dist/worker.d.ts +9 -0
- package/dist/worker.js +4 -4
- package/dist/xlsx.cjs +4 -4
- package/dist/xlsx.d.cts +39 -2
- package/dist/xlsx.d.ts +39 -2
- package/dist/xlsx.js +290 -270
- package/package.json +1 -1
- package/dist/ReportLabelStudio-BcjQt73a.cjs +0 -1
- package/dist/ReportLabelStudio-N2w6DdaZ.js +0 -764
- package/dist/ReportParamPanel-CVpK8mFc.cjs +0 -1
- package/dist/ReportPreview-BBJNlu2U.js +0 -5740
- package/dist/ReportPreview-nf4Dk1Jc.cjs +0 -6
- package/dist/TemplateReviewPanel-C2YjiaEC.cjs +0 -1
- package/dist/prepared-BiSz_9vN.cjs +0 -1
- package/dist/template-bindings-Cg5oBLFT.cjs +0 -1
- package/dist/template-bindings-TKnXM7ll.js +0 -62
- package/dist/template-catalog-D_2jdnkL.cjs +0 -1
- package/dist/template-fragments-DZVUBhuB.cjs +0 -1
- package/dist/template-outline-DWkzZXVC.cjs +0 -1
- package/dist/template-registry-DpLUSLwF.cjs +0 -1
- package/dist/template-serialization-Cc3h-miv.js +0 -247
- package/dist/template-serialization-D1R5oAqh.cjs +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const i=require("./json-snapshot-I5VI84Vp.cjs"),a=require("./sha256-DgZAKXqI.cjs");function y(r){return r&&{...r}}function g(r){if(!r)return;const t=e=>{if(!(e instanceof Uint8Array)&&!(e instanceof ArrayBuffer))throw new i.ReportSourceError("validate","字体应为 Uint8Array 或 ArrayBuffer");if(e.byteLength>32e6)throw new a.ReportRuntimeError("budget","单份字体超过 32 MB","$.pdf");return new Uint8Array(e instanceof Uint8Array?e:new Uint8Array(e))};if(r.customFontFaces){const e=r.customFontFaces;return{customFontName:r.customFontName,customFontFaces:{regular:t(e.regular),...e.bold?{bold:t(e.bold)}:{},...e.italic?{italic:t(e.italic)}:{},...e.boldItalic?{boldItalic:t(e.boldItalic)}:{}}}}return{customFontName:r.customFontName,...r.customFontBytes?{customFontBytes:t(r.customFontBytes)}:{}}}function f(r){const t=r?.customFontFaces??(r?.customFontBytes?{regular:r.customFontBytes}:void 0);if(!t)return;const e=["regular","bold","italic","boldItalic"].map(o=>{const n=t[o];if(!n)return[o,null];const s=n instanceof Uint8Array?n:new Uint8Array(n);if(s.byteLength>32e6)throw new a.ReportRuntimeError("budget","单份字体超过 32 MB","$.pdf");return[o,a.portableSha256Hex(s)]});return a.portableSha256Hex(new TextEncoder().encode(JSON.stringify(e)))}const d=new WeakMap;function w(r,t,e){const o=u(r,t,e);let n=!0;return{prepared:o,forward(){if(!n)throw new Error("报表快照只能交接一次");return n=!1,d.set(o,t),o}}}function u(r,t,e){if(a.throwIfAborted(e),!Number.isSafeInteger(t)||t<=0)throw new a.ReportRuntimeError("budget","快照预算应为正安全整数","$.budget.maxPreparedBytes");const o=d.get(r);if(d.delete(r),o!==void 0&&o<=t)return r;const n=i.snapshotReportJson(r,{maxBytes:t,maxNodes:t,check:()=>a.throwIfAborted(e),error:(s,c)=>s==="budget"?new a.ReportRuntimeError("budget",c,"$.budget.maxPreparedBytes"):new i.ReportSourceError("validate",c)});return l(n),n}function p(r){if(r===void 0)return!0;if(!Array.isArray(r))return!1;const t=new Set;return r.every(e=>!e||typeof e!="object"||Array.isArray(e)||typeof e.reportId!="string"||!e.reportId.trim()||!Number.isSafeInteger(e.reportIndex)||e.reportIndex<0||t.has(e.reportIndex)||typeof e.reportScope!="string"||!e.reportScope.trim()||e.reportScope.length>4096||e.revision!==void 0&&typeof e.revision!="string"||e.sourceToken!==void 0&&typeof e.sourceToken!="string"?!1:(t.add(e.reportIndex),!0))}function l(r){if(!p(r.sources))throw new i.ReportSourceError("validate","准备结果来源清单无效");if(!r?.stats||["rows","pages","cells"].some(t=>!Number.isSafeInteger(r.stats[t])||r.stats[t]<0)||!Number.isFinite(r.stats.durationMs)||r.stats.durationMs<0)throw new i.ReportSourceError("validate","准备结果统计无效");if(!Array.isArray(r.diagnostics)||r.diagnostics.some(t=>!t||typeof t.code!="string"||typeof t.message!="string"||!["info","warning","error"].includes(t.severity)||!i.hasValidDataExplanation(t)))throw new i.ReportSourceError("validate","准备结果诊断无效");if(!r.revisions||typeof r.revisions!="object"||Array.isArray(r.revisions)||Object.values(r.revisions).some(t=>!t||typeof t!="object"||t.revision!==void 0&&typeof t.revision!="string"||t.sourceToken!==void 0&&typeof t.sourceToken!="string"))throw new i.ReportSourceError("validate","准备结果修订无效");if(r.layout&&(!["heuristic","provided","font-bytes"].includes(r.layout.textMetrics)||r.layout.fontFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(r.layout.fontFingerprint)))throw new i.ReportSourceError("validate","准备结果字体度量标识无效")}function v(r){if(r.layoutPolicy!==void 0&&!["verify","preserve"].includes(r.layoutPolicy))throw new i.ReportSourceError("validate","无效的 layoutPolicy");if(r.format!=="pdf")return;if(r.layoutPolicy==="preserve"&&!r.prepared.layout?.fontFingerprint){r.prepared.diagnostics.push({code:"prepared-layout-preserved",severity:"info",message:"显式保持现有分页与几何;未验证排版字体身份,实际 PDF 输出仍遵循 fidelity 校验。"});return}const t=r.prepared.layout?.fontFingerprint,e=f(r.pdf);if(t===e&&(t!==void 0||r.prepared.layout?.textMetrics==="heuristic"&&!e))return;const o="已准备计划的字体度量无法与本次 PDF 字体确认一致;保持现有分页,未重新查询或排版。请在 prepare 和 exportPrepared 提供相同字体字节。";if(r.fidelity==="strict")throw new i.ReportSourceError("validate",o);r.prepared.diagnostics.push({code:"prepared-font-metrics",severity:"warning",message:o})}exports.capturePreparedHandoff=w;exports.checkPreparedFont=v;exports.reportFontFingerprint=f;exports.snapshotPdfFonts=g;exports.snapshotPreparedReport=u;exports.snapshotXlsxOptions=y;exports.validPreparedSources=p;exports.validatePreparedMetadata=l;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";function o(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function l(e,i,r){typeof e=="string"?r.push({field:e,path:i}):Array.isArray(e)&&e.forEach((d,s)=>l(d,`${i}[${s}]`,r))}function $(e,i,r){if(Array.isArray(e)){e.forEach((d,s)=>$(d,`${i}[${s}]`,r));return}if(o(e))for(const[d,s]of Object.entries(e))["field","weightField"].includes(d)?l(s,`${i}.${d}`,r):d!=="value"&&d!=="style"&&$(s,`${i}.${d}`,r)}function a(e,i,r){Array.isArray(e)&&e.forEach((d,s)=>{if(!o(d))return;typeof d.field=="string"&&d.valueField!==void 0&&d.valueField!==d.field&&r.summaries.add(d.field);const f=d.valueField===void 0?"field":"valueField";l(d[f],`${i}[${s}].${f}`,r.fields),d.valueField!==void 0&&d.valueField===d.field&&l(d.field,`${i}[${s}].field`,r.fields),l(d.weightField,`${i}[${s}].weightField`,r.fields)})}function u(e,i,r){for(const s of["rowKey","revisionField","sourceTokenField"])l(e[s],`${i}.${s}`,r.fields);if(!e.matrix&&Array.isArray(e.columns)&&e.columns.forEach((s,f)=>{o(s)&&(typeof s.field=="string"&&r.fields.push({field:s.field,path:`${i}.columns[${f}].field`,summary:!0}),$(s.rules,`${i}.columns[${f}].rules`,r.fields),$(s.visibleWhen,`${i}.columns[${f}].visibleWhen`,r.fields))}),$(e.rowVisibleWhen,`${i}.rowVisibleWhen`,r.fields),Array.isArray(e.computed)&&e.computed.forEach((s,f)=>{o(s)&&(typeof s.field=="string"&&r.generated.add(s.field),$(s.expression,`${i}.computed[${f}].expression`,r.fields),l(s.dependsOn,`${i}.computed[${f}].dependsOn`,r.fields),l(s.groupBy,`${i}.computed[${f}].groupBy`,r.fields))}),(Array.isArray(e.groups)?e.groups.map((s,f)=>({group:s,path:`${i}.groups[${f}]`})):e.groupBy?[{group:e.groupBy,path:`${i}.groupBy`}]:[]).forEach(({group:s,path:f})=>{o(s)&&(l(s.field,`${f}.field`,r.fields),l(s.subtotal,`${f}.subtotal`,r.fields),a(s.aggregates,`${f}.aggregates`,r))}),o(e.grandTotal)&&(l(e.grandTotal.fields,`${i}.grandTotal.fields`,r.fields),a(e.grandTotal.aggregates,`${i}.grandTotal.aggregates`,r)),o(e.matrix)&&(l(e.matrix.rowFields,`${i}.matrix.rowFields`,r.fields),l(e.matrix.columnFields,`${i}.matrix.columnFields`,r.fields),a(e.matrix.measures,`${i}.matrix.measures`,r)),o(e.tree)){for(const s of["idField","parentField","labelField"])l(e.tree[s],`${i}.tree.${s}`,r.fields);a(e.tree.aggregates,`${i}.tree.aggregates`,r)}o(e.detail)&&l(e.detail.parentKey,`${i}.detail.parentKey`,r.fields)}function p(e){const i=[],r=e.repeat,d=r?{dataset:r.dataset,path:"$.template.repeat",fields:[],generated:new Set,summaries:new Set}:void 0;d&&r&&(l(r.rowKey,"$.template.repeat.rowKey",d.fields),typeof r.copies=="object"&&l(r.copies.field,"$.template.repeat.copies.field",d.fields),i.push(d));function s(f,n){if(Array.isArray(f)){f.forEach((t,c)=>s(t,`${n}[${c}]`));return}if(o(f)){if(d&&o(f.binding)&&l(f.binding.field,`${n}.binding.field`,d.fields),o(f.chartBinding)&&typeof f.chartBinding.dataset=="string"){const t=`${n}.chartBinding`,c=f.chartBinding,y={dataset:c.dataset,path:t,fields:[],generated:new Set,summaries:new Set};l(c.categoryField,`${t}.categoryField`,y.fields),$(c.measures,`${t}.measures`,y.fields),i.push(y)}if(typeof f.dataset=="string"&&Array.isArray(f.columns)){const t={dataset:f.dataset,path:n,fields:[],generated:new Set,summaries:new Set};u(f,n,t),typeof f.foreignKey=="string"&&l(f.foreignKey,`${n}.foreignKey`,t.fields),i.push(t)}for(const[t,c]of Object.entries(f))s(c,`${n}.${t}`)}}return s(e,"$.template"),i}exports.collectTemplateDatasetBindings=p;
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
function l(e) {
|
|
2
|
-
return !!e && typeof e == "object" && !Array.isArray(e);
|
|
3
|
-
}
|
|
4
|
-
function o(e, i, r) {
|
|
5
|
-
typeof e == "string" ? r.push({ field: e, path: i }) : Array.isArray(e) && e.forEach((d, s) => o(d, `${i}[${s}]`, r));
|
|
6
|
-
}
|
|
7
|
-
function c(e, i, r) {
|
|
8
|
-
if (Array.isArray(e)) {
|
|
9
|
-
e.forEach((d, s) => c(d, `${i}[${s}]`, r));
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
if (l(e))
|
|
13
|
-
for (const [d, s] of Object.entries(e))
|
|
14
|
-
["field", "weightField"].includes(d) ? o(s, `${i}.${d}`, r) : d !== "value" && d !== "style" && c(s, `${i}.${d}`, r);
|
|
15
|
-
}
|
|
16
|
-
function a(e, i, r) {
|
|
17
|
-
Array.isArray(e) && e.forEach((d, s) => {
|
|
18
|
-
if (!l(d)) return;
|
|
19
|
-
typeof d.field == "string" && d.valueField !== void 0 && d.valueField !== d.field && r.summaries.add(d.field);
|
|
20
|
-
const f = d.valueField === void 0 ? "field" : "valueField";
|
|
21
|
-
o(d[f], `${i}[${s}].${f}`, r.fields), d.valueField !== void 0 && d.valueField === d.field && o(d.field, `${i}[${s}].field`, r.fields), o(d.weightField, `${i}[${s}].weightField`, r.fields);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
function u(e, i, r) {
|
|
25
|
-
for (const s of ["rowKey", "revisionField", "sourceTokenField"]) o(e[s], `${i}.${s}`, r.fields);
|
|
26
|
-
if (!e.matrix && Array.isArray(e.columns) && e.columns.forEach((s, f) => {
|
|
27
|
-
l(s) && (typeof s.field == "string" && r.fields.push({ field: s.field, path: `${i}.columns[${f}].field`, summary: !0 }), c(s.rules, `${i}.columns[${f}].rules`, r.fields), c(s.visibleWhen, `${i}.columns[${f}].visibleWhen`, r.fields));
|
|
28
|
-
}), c(e.rowVisibleWhen, `${i}.rowVisibleWhen`, r.fields), Array.isArray(e.computed) && e.computed.forEach((s, f) => {
|
|
29
|
-
l(s) && (typeof s.field == "string" && r.generated.add(s.field), c(s.expression, `${i}.computed[${f}].expression`, r.fields), o(s.dependsOn, `${i}.computed[${f}].dependsOn`, r.fields), o(s.groupBy, `${i}.computed[${f}].groupBy`, r.fields));
|
|
30
|
-
}), (Array.isArray(e.groups) ? e.groups.map((s, f) => ({ group: s, path: `${i}.groups[${f}]` })) : e.groupBy ? [{ group: e.groupBy, path: `${i}.groupBy` }] : []).forEach(({ group: s, path: f }) => {
|
|
31
|
-
l(s) && (o(s.field, `${f}.field`, r.fields), o(s.subtotal, `${f}.subtotal`, r.fields), a(s.aggregates, `${f}.aggregates`, r));
|
|
32
|
-
}), l(e.grandTotal) && (o(e.grandTotal.fields, `${i}.grandTotal.fields`, r.fields), a(e.grandTotal.aggregates, `${i}.grandTotal.aggregates`, r)), l(e.matrix) && (o(e.matrix.rowFields, `${i}.matrix.rowFields`, r.fields), o(e.matrix.columnFields, `${i}.matrix.columnFields`, r.fields), a(e.matrix.measures, `${i}.matrix.measures`, r)), l(e.tree)) {
|
|
33
|
-
for (const s of ["idField", "parentField", "labelField"]) o(e.tree[s], `${i}.tree.${s}`, r.fields);
|
|
34
|
-
a(e.tree.aggregates, `${i}.tree.aggregates`, r);
|
|
35
|
-
}
|
|
36
|
-
l(e.detail) && o(e.detail.parentKey, `${i}.detail.parentKey`, r.fields);
|
|
37
|
-
}
|
|
38
|
-
function p(e) {
|
|
39
|
-
const i = [], r = e.repeat, d = r ? { dataset: r.dataset, path: "$.template.repeat", fields: [], generated: /* @__PURE__ */ new Set(), summaries: /* @__PURE__ */ new Set() } : void 0;
|
|
40
|
-
d && r && (o(r.rowKey, "$.template.repeat.rowKey", d.fields), typeof r.copies == "object" && o(r.copies.field, "$.template.repeat.copies.field", d.fields), i.push(d));
|
|
41
|
-
function s(f, n) {
|
|
42
|
-
if (Array.isArray(f)) {
|
|
43
|
-
f.forEach((t, $) => s(t, `${n}[${$}]`));
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
if (l(f)) {
|
|
47
|
-
if (d && l(f.binding) && o(f.binding.field, `${n}.binding.field`, d.fields), l(f.chartBinding) && typeof f.chartBinding.dataset == "string") {
|
|
48
|
-
const t = `${n}.chartBinding`, $ = f.chartBinding, y = { dataset: $.dataset, path: t, fields: [], generated: /* @__PURE__ */ new Set(), summaries: /* @__PURE__ */ new Set() };
|
|
49
|
-
o($.categoryField, `${t}.categoryField`, y.fields), c($.measures, `${t}.measures`, y.fields), i.push(y);
|
|
50
|
-
}
|
|
51
|
-
if (typeof f.dataset == "string" && Array.isArray(f.columns)) {
|
|
52
|
-
const t = { dataset: f.dataset, path: n, fields: [], generated: /* @__PURE__ */ new Set(), summaries: /* @__PURE__ */ new Set() };
|
|
53
|
-
u(f, n, t), typeof f.foreignKey == "string" && o(f.foreignKey, `${n}.foreignKey`, t.fields), i.push(t);
|
|
54
|
-
}
|
|
55
|
-
for (const [t, $] of Object.entries(f)) s($, `${n}.${t}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return s(e, "$.template"), i;
|
|
59
|
-
}
|
|
60
|
-
export {
|
|
61
|
-
p as c
|
|
62
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const w=require("./json-snapshot-I5VI84Vp.cjs"),j=require("./assets-vbjAGgk8.cjs"),L=require("./dataset-IrlXbUvh.cjs"),h=require("./template-registry-DpLUSLwF.cjs"),E=require("./template-bindings-Cg5oBLFT.cjs"),P=require("./param-validation-C-8sRJLq.cjs");function R(e){if(e===void 0)return;const t=typeof e=="string"?e:JSON.stringify(e);return t.length>160?t.slice(0,157)+"…":t}function N(e){return/\.(?:repeat|binding)(?:\.|$)/.test(e)?/\.format(?:\.|$)/.test(e)?"format":"binding":/\.tree\.(?:idField|parentField|childrenField|labelField|input)$/.test(e)?"binding":/\.tree\.parentValues$/.test(e)?"calculation":/\.tree\.indentMm$/.test(e)?"format":/\.(?:computed|computeOptions|groups|groupBy|aggregates|grandTotal)(?:\.|\[|$)/.test(e)?"calculation":/\.(?:dataset|field|rowKey|revisionField|sourceTokenField|foreignKey|parentKey)$/.test(e)?"binding":/\.(?:style|headerStyle|format|rules|align|headerAlign|semanticRole|unit)(?:\.|\[|$)/.test(e)?"format":e.startsWith("$.template")?"structure":"metadata"}function T(e){const t=new Map;for(const r of e){if(!r||typeof r!="object"||!("field"in r)||typeof r.field!="string"||t.has(r.field))return;t.set(r.field,r)}return t}function D(e,t,r){return!e.startsWith("$.template.params")||t==="moved"?!1:/\.(?:type|required|min|max|minLength|maxLength|options|defaultValue)(?:\[|$)/.test(e)?!0:t!=="added"?!1:Array.isArray(r)?r.some(a=>!!a&&typeof a=="object"&&"required"in a&&a.required===!0):!!r&&typeof r=="object"&&"required"in r&&r.required===!0}function A(e,t,r={}){const a=h.parseReportTemplate(e),n=h.parseReportTemplate(t),o=r.maxChanges??500;if(!Number.isSafeInteger(o)||o<1||o>1e4)throw new RangeError("maxChanges must be between 1 and 10000");const s={changes:[],totalChanges:0,breakingChanges:0,truncated:!1};function d(c,l,u,m){const f=N(l),y=c!=="moved"&&(f==="binding"||l==="$.id"||c==="removed"&&f==="structure"||D(l,c,m));s.totalChanges++,y&&s.breakingChanges++,s.changes.length<o&&s.changes.push({kind:c,category:f,path:l,before:R(u),after:R(m),breaking:y})}function p(c,l,u){const m=T(c),f=T(l);if(!m||!f)return!1;const y=new Map(l.map((g,b)=>[g.field,b]));Array.from(m).forEach(([g,b],$)=>{const x=`${u}[${JSON.stringify(g)}]`;f.has(g)?(y.get(g)!==$&&d("moved",x,$,y.get(g)),i(b,f.get(g),x)):d("removed",x,b,void 0)});for(const[g,b]of f)m.has(g)||d("added",`${u}[${JSON.stringify(g)}]`,void 0,b);return!0}function i(c,l,u){if(!(Object.is(c,l)||u==="$.revision")){if(c===void 0||l===void 0){d(c===void 0?"added":"removed",u,c,l);return}if(Array.isArray(c)&&Array.isArray(l)){if((u.endsWith(".columns")||u.endsWith(".params"))&&p(c,l,u))return;for(let m=0;m<Math.max(c.length,l.length);m++)i(c[m],l[m],`${u}[${m}]`)}else if(c&&l&&typeof c=="object"&&typeof l=="object"&&!Array.isArray(c)&&!Array.isArray(l)){const m=c,f=l;for(const y of new Set([...Object.keys(m),...Object.keys(f)]))i(m[y],f[y],`${u}.${y}`)}else d("modified",u,c,l)}}return i(a,n,"$"),s.truncated=s.totalChanges>s.changes.length,s}function M(e,t,r){for(const a of E.collectTemplateDatasetBindings(e)){const n=Object.prototype.hasOwnProperty.call(t,a.dataset)?t[a.dataset]:void 0;if(!n){r.push({code:"dataset",severity:"error",path:`${a.path}.dataset`,message:`未声明数据集 ${a.dataset}`});continue}const o=new Set(n.fields.map(s=>s.field));a.fields.forEach(({field:s,path:d,summary:p})=>{!o.has(s)&&!a.generated.has(s)&&!(p&&a.summaries.has(s))&&r.push({code:"field",severity:"error",path:d,field:s,message:`数据集 ${a.dataset} 缺少字段 ${s}`})})}}function q(e,t,r,a){const n=r.maxSampleRows??1e3;let o;try{o=w.templateValidationDatasets(t,e.datasets,{maxRows:n})}catch(p){return a.push({code:"sample",severity:"error",path:"$.fixtures",fixture:e.name,message:p instanceof Error?p.message:String(p)}),!1}const s=Object.values(o).reduce((p,i)=>p+i.length,0);if(s>n)return a.push({code:"sample",severity:"error",path:"$.fixtures",fixture:e.name,message:`样例 ${s} 行超过预算 ${n},请显式选择验收样例`}),!1;const d=new Set(E.collectTemplateDatasetBindings(t).map(p=>p.dataset));for(const[p,i]of Object.entries(r.dataSchemas??{}).filter(([c])=>d.has(c)))try{const c=L.validateDatasetRows(o[p],i,{path:`$.datasets.${p}`,maxRows:n});if(a.push(...c.issues.map(l=>({...l,code:"sample",severity:"error",fixture:e.name}))),!c.ok)return!1}catch(c){return a.push({code:"dataset",severity:"error",path:`$.dataSchemas.${p}`,message:String(c)}),!1}return!0}function F(e,t){const r=e.pages[t.pageIndex]?.components[t.componentIndex]?.meta?.labelSource;if(r&&typeof r=="object"&&"pageIndex"in r&&"componentIndex"in r&&typeof r.pageIndex=="number"&&typeof r.componentIndex=="number")return{path:`$.template.pages[${r.pageIndex}].components[${r.componentIndex}]`,pageIndex:r.pageIndex,componentIndex:r.componentIndex};const a=e.pages[t.pageIndex]?.meta?.record;if(a&&typeof a=="object"&&"templatePageIndex"in a&&typeof a.templatePageIndex=="number")return{path:`$.template.pages[${a.templatePageIndex}].components[${t.componentIndex}]`,pageIndex:a.templatePageIndex,componentIndex:t.componentIndex}}function B(e,t,r){const a=F(t,r);if(a)return a;const n=t.pages[r.pageIndex]?.components[r.componentIndex],o=/^table:(\d+):(\d+)(?::|$)/.exec(n?.table?.id??"");if(o)return{path:`$.template.pages[${o[1]}].components[${o[2]}]`,pageIndex:Number(o[1]),componentIndex:Number(o[2])};for(const[s,d]of e.pages.entries()){const p=d.components.findIndex(i=>i===n||n?.nid!==void 0&&"nid"in i&&i.nid===n.nid);if(p>=0)return{path:`$.template.pages[${s}].components[${p}]`,pageIndex:s,componentIndex:p}}return{path:"$.template"}}function J(e,t,r,a,n){const o=P.validateReportParams(e.template.params??[],t.params??{});if(n.issues.push(...o.issues.map(s=>({...s,code:"params",severity:"error",fixture:t.name,path:s.path.replace(/^\$\.params/,`$.fixtures[${r}].params`)}))),!!o.ok&&q(t,e.template,a,n.issues))try{const{plan:s,warnings:d}=w.paginateTemplate(e.template,t.datasets,{maxPages:a.maxPages??100,maxCells:a.maxCells??25e4}),p=(a.formats??["pdf","xlsx"]).flatMap(i=>j.inspectOutputCapabilities(s,i));n.issues.push(...d.map(i=>({code:"layout",severity:"warning",path:"$.template",fixture:t.name,message:i}))),n.issues.push(...p.map(i=>({code:"output",severity:a.strictOutputs?"error":"warning",...B(e.template,s,i),fixture:t.name,message:`${i.format}: ${i.message}`,diagnostic:i}))),n.samples.push({name:t.name,pages:s.pages.length,rows:w.templateDatasetRowCount(e.template,t.datasets),diagnostics:p})}catch(s){n.issues.push({code:"layout",severity:"error",path:"$.template",fixture:t.name,message:s instanceof Error?s.message:String(s)})}}function V(e){for(const[r,a]of[["maxPages",e.maxPages],["maxCells",e.maxCells],["maxSampleRows",e.maxSampleRows]])if(a!==void 0&&(!Number.isSafeInteger(a)||a<1))throw new RangeError(`${r} must be a positive safe integer`);if((e.fixtures?.length??0)>20)throw new RangeError("At most 20 review fixtures are allowed");const t=new Set;for(const r of e.fixtures??[]){if(typeof r.name!="string"||!r.name.trim()||r.name.length>120||t.has(r.name))throw new Error("Review fixtures require unique non-empty names of at most 120 characters");t.add(r.name)}}function*C(e,t,r){let a;yield{stage:"template",run:()=>{V(t),a=h.parseReportTemplate(e)}};const n=t.previous;n&&(yield{stage:"baseline",run:()=>{r.changes=A(n,a),r.changes.breakingChanges&&!t.allowBreakingChanges&&r.issues.push({code:"compatibility",severity:"error",path:"$.template",message:`${r.changes.breakingChanges} 项字段或结构变更需要明确确认兼容性`})}}),t.dataSchemas&&(yield{stage:"bindings",run:()=>M(a.template,t.dataSchemas,r.issues)});for(const[o,s]of(t.fixtures??[]).entries())yield{stage:"fixture",fixture:s.name,run:()=>J(a,s,o,t,r)};t.fixtures?.length||r.issues.push({code:"sample",severity:"warning",path:"$.fixtures",message:"未提供验收样例,仅完成结构和字段检查,尚未验证排版与输出"})}function O(e){return e.ok=e.issues.every(t=>t.severity!=="error"),e}function k(e,t){e.issues.push({code:"template",severity:"error",path:"$",message:t instanceof Error?t.message:String(t)})}function W(e,t={}){const r={ok:!1,issues:[],samples:[]};try{for(const a of C(e,t,r))a.run()}catch(a){k(r,a)}return O(r)}function v(e){if(e?.aborted)throw e.reason??new DOMException("Template review was aborted","AbortError")}function K(e){return v(e),new Promise((t,r)=>{const a=()=>{clearTimeout(n),e?.removeEventListener("abort",a),r(e?.reason??new DOMException("Template review was aborted","AbortError"))},n=setTimeout(()=>{e?.removeEventListener("abort",a),t()},0);e?.addEventListener("abort",a,{once:!0}),e?.aborted&&a()})}function I(e,t){try{e.onProgress?.(t)}catch{}}async function _(e,t={}){const r={ok:!1,issues:[],samples:[]},a=t.fixtures?.length??0;let n=0;v(t.signal);try{const o=C(e,t,r),s=o.next();s.done||(s.value.run(),I(t,{completed:n,total:a,stage:s.value.stage})),v(t.signal);for(const d of o)await K(t.signal),v(t.signal),d.run(),d.stage==="fixture"&&n++,I(t,{completed:n,total:a,stage:d.stage,...d.fixture?{fixture:d.fixture}:{}}),v(t.signal)}catch(o){v(t.signal),k(r,o)}return O(r)}function z(e,t){const r=e.publishedRevision??e.published?.revision;for(const a of[e.draftRevision,r])if(a!==void 0&&(typeof a!="string"||!a.trim()))throw new TypeError("模板生命周期修订应为非空字符串");if(e.draftRevision!==void 0&&e.draftRevision!==t.revision)throw new TypeError("可编辑文档应与草稿修订一致");if(e.published&&(e.published.id!==t.id||e.published.revision!==r))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&r!==void 0&&r!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...r===void 0?{}:{publishedRevision:r}}}function G(e,t){const r=h.parseReportTemplate(e);if(t.id===r.id)throw new Error("复制模板应使用新的 ID");const{revision:a,...n}=r;return h.parseReportTemplate({...n,id:t.id,name:t.name})}function H(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,r=new Map,a=[];for(const n of e){const o=h.parseReportTemplate(n.document);if(t.has(o.id))throw new Error(`模板 ID 重复:${o.id}`);if(n.category!==void 0&&(typeof n.category!="string"||n.category.length>128)||n.tags!==void 0&&(!Array.isArray(n.tags)||n.tags.length>20||n.tags.some(i=>typeof i!="string"||i.length>128)))throw new TypeError("模板分类和标签无效");const s=z(n,o),{template:d,...p}=o;t.set(o.id,o),n.published?r.set(o.id,h.parseReportTemplate(n.published)):s.publishedRevision&&r.set(o.id,h.parseReportTemplate(o)),a.push({...p,...s,...n.category?{category:n.category}:{},...n.tags?{tags:[...n.tags]}:{}})}return a.sort((n,o)=>n.id<o.id?-1:1),{search:async n=>{S(n.signal);const o=n.limit??30;if(!Number.isSafeInteger(o)||o<1||o>100)throw new RangeError("模板每页数量应为 1–100");const s=n.query?.trim().toLocaleLowerCase()??"",d=a.filter(i=>(!n.category||i.category===n.category)&&(!n.cursor||i.id>n.cursor)&&(!s||[i.id,i.name,i.description,...i.tags??[]].some(c=>c?.toLocaleLowerCase().includes(s)))),p=new Map;for(const i of a)i.category&&p.set(i.category,(p.get(i.category)??0)+1);return JSON.parse(JSON.stringify({items:d.slice(0,o),...d.length>o?{next:d[o-1].id}:{},categories:Array.from(p,([i,c])=>({id:i,label:i,count:c}))}))},get:async(n,o)=>{S(o.signal);const s=o.mode==="published"?r.get(n):t.get(n);return s?h.parseReportTemplate(s):void 0}}}function S(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}exports.cloneReportTemplate=G;exports.createLocalTemplateCatalog=H;exports.diffReportTemplates=A;exports.reviewReportTemplate=W;exports.reviewReportTemplateAsync=_;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const f=require("./template-registry-DpLUSLwF.cjs"),T=require("./template-bindings-Cg5oBLFT.cjs"),g=require("./grid-geometry-D8ReblRV.cjs");function p(t){return JSON.parse(JSON.stringify(t))}function u(t){return{...t.repeatDataset?{repeat:{dataset:t.repeatDataset}}:{},pages:[{widthMm:4999,heightMm:4999,components:t.components}]}}function y(t){if(!t.id.trim()||!t.name.trim()||!t.revision.trim())throw new Error("Fragment identity, name and revision are required");if(!t.components.length||t.components.length>200)throw new RangeError("A fragment must contain 1–200 components");f.parseReportTemplate({schemaVersion:"1.0",id:t.id,name:t.name,template:u(t)})}function E(t,n,e,a){const r=f.parseReportTemplate(t).template.pages[n];if(!r||!e.length||e.some(o=>!Number.isSafeInteger(o)||!r.components[o]))throw new Error("Select existing components to capture a fragment");const s=[...new Set(e)].map(o=>r.components[o]),l=Math.min(...s.map(o=>o.leftMm)),i=Math.min(...s.map(o=>o.topMm)),m={...a,...t.template.repeat?{repeatDataset:t.template.repeat.dataset}:{},components:p(s).map(o=>({...o,leftMm:o.leftMm-l,topMm:o.topMm-i}))};return y(m),m}function b(t){y(t);const n=new Map;for(const e of T.collectTemplateDatasetBindings(u(t))){const a=n.get(e.dataset)??new Set;for(const r of e.fields)!e.generated.has(r.field)&&!e.summaries.has(r.field)&&a.add(r.field);n.set(e.dataset,a)}return[...n].map(([e,a])=>({dataset:e,fields:[...a]}))}function S(t,n,e){const a=n.replace(/^\$\.template\./,"").replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const s of a.slice(0,-1))r=r[s];r[a[a.length-1]]=e}function F(t,n,e={}){const a=u({...t,components:n});for(const r of T.collectTemplateDatasetBindings(a)){for(const l of r.fields){const i=e.fields?.[r.dataset]?.[l.field];i!==void 0&&S(a,l.path,i)}const s=e.datasets?.[r.dataset];s!==void 0&&S(a,`${r.path}.dataset`,s)}}function h(t){if(!t||typeof t!="object")return;if(Array.isArray(t)){t.forEach(h);return}const n=t;for(const e of["nid","rkey","table","source"])delete n[e];if(n.kind==="list"&&delete n.id,n.meta&&typeof n.meta=="object")for(const e of["fragment","labelSource","record"])delete n.meta[e];Object.values(n).forEach(h)}function D(t){const n=new Set(t.template.pages.flatMap(a=>a.components.map(r=>r.meta?.fragment?.instance)));let e=1;for(;n.has(`fragment-${e}`);)e++;return`fragment-${e}`}function R(t,n,e){const a=e?t.components.flatMap((s,l)=>s.meta?.fragment?.instance===e?[l]:[]):[];if(e&&!a.length)throw new Error("Fragment instance no longer exists");const r=a.map(s=>t.components[s]);if(r.some(s=>s.meta?.fragment?.id!==n.id))throw new Error("An upgrade must use the same fragment identity");return{replacing:a,left:r.length?Math.min(...r.map(s=>s.leftMm)):t.marginLeftMm??0,top:r.length?Math.min(...r.map(s=>s.topMm)):t.marginTopMm??0}}function x(t,n){if(n.some(e=>e.leftMm<0||e.topMm<0||e.leftMm+e.widthMm>t.widthMm+.001||e.topMm+(e.kind==="list"?e.rowHeightMm??7:e.heightMm)>t.heightMm+.001))throw new Error("Fragment exceeds the target page; choose a larger page or adjust its placement")}function k(t,n,e){y(n);const a=f.parseReportTemplate(t),r=a.template.pages[e.pageIndex];if(!r||r.flow)throw new Error("Choose a fixed page before inserting a fragment");const s=R(r,n,e.replaceInstance),l=s.replacing,i=e.leftMm??s.left,m=e.topMm??s.top,o=p(n.components),M=e.replaceInstance??D(a);if(n.repeatDataset&&a.template.repeat?.dataset!==(e.bindings?.datasets?.[n.repeatDataset]??n.repeatDataset))throw new Error("Bind this label fragment to the current record dataset");F(n,o,e.bindings),o.forEach(h),o.forEach((c,d)=>{c.leftMm+=i,c.topMm+=m,c.meta={...c.meta,fragment:{id:n.id,revision:n.revision,instance:M,slot:d}}}),x(r,o);const w=l[0]??r.components.length;return r.components=r.components.filter((c,d)=>!l.includes(d)),r.components.splice(w,0,...o),{document:f.parseReportTemplate(a),componentIndices:o.map((c,d)=>w+d),instance:M}}function C(t,n,e,a){const r=f.parseReportTemplate(t),s=r.template.pages[n];if(!s)throw new Error("Page no longer exists");for(const l of e){const i=s.components[l];if(!i)throw new Error("Component no longer exists");i.kind==="list"?a.target==="header"?I(i,a.style):i.columns.forEach(m=>{m.style=g.mergeComponentStyles(m.style,p(a.style)),a.style.align&&(m.align=a.style.align)}):i.style=g.mergeComponentStyles(i.style,p(a.style))}return f.parseReportTemplate(r)}function I(t,n){if(t.headerStyle=g.mergeComponentStyles(t.headerStyle,p(n)),t.columns.forEach(e=>{e.headerStyle=g.mergeComponentStyles(e.headerStyle,p(n)),n.align&&(e.headerAlign=n.align)}),t.headerGrid)for(const e of t.headerGrid.cells)for(const a of e)a&&(a.style=g.mergeComponentStyles(a.style,p(n)))}exports.applyReportDocumentStyle=C;exports.captureTemplateFragment=E;exports.insertTemplateFragment=k;exports.inspectTemplateFragmentBindings=b;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const u=require("./template-bindings-Cg5oBLFT.cjs");function $(e){const a=/\.pages\[(\d+)\](?:\.components\[(\d+)\])?/.exec(e);return a?{pageIndex:Number(a[1]),...a[2]===void 0?{}:{componentIndex:Number(a[2])}}:{}}function m(e,a,l){return u.collectTemplateDatasetBindings(e).filter(s=>s.dataset===a).flatMap(s=>s.fields.filter(t=>t.field===l).map(t=>({...t,...$(t.path),dataset:a,kind:/\.computed\[/.test(t.path)?"calculation":/\.columns\[\d+\]\.field$/.test(t.path)?"display":"binding"})))}function g(e,a){const l=e.kind==="list"?e.title||e.dataset:e.binding?.field||e.text||e.nid;return`${e.kind} · ${(l||String(a+1)).replace(/\s+/g," ").slice(0,80)}`}function k(e){const a=u.collectTemplateDatasetBindings(e),l=new Map;for(const t of a)for(const d of t.fields){const c=/^\$\.template\.pages\[\d+\]\.components\[\d+\]/.exec(d.path)?.[0];if(!c)continue;const n=l.get(c)??[];n.push({...d,dataset:t.dataset}),l.set(c,n)}const s=[];return e.pages.forEach((t,d)=>{const c=`$.template.pages[${d}]`;s.push({path:c,pageIndex:d,kind:"page",depth:0,title:typeof t.meta?.title=="string"?t.meta.title:`${d+1} · ${t.widthMm} × ${t.heightMm} mm`}),t.components.forEach((n,p)=>{const o=`${c}.components[${p}]`,f={pageIndex:d,componentIndex:p};s.push({path:o,...f,depth:1,kind:"component",title:g(n,p)}),n.kind==="list"&&(n.columns.forEach((i,h)=>s.push({path:`${o}.columns[${h}].field`,...f,depth:2,kind:"field",title:`${i.header} · ${i.field}`,field:i.field,dataset:n.dataset})),n.computed?.forEach((i,h)=>s.push({path:`${o}.computed[${h}]`,...f,depth:2,kind:"calculation",title:i.field,field:i.field,dataset:n.dataset})));const r=new Set;for(const i of l.get(o)??[])/\.columns\[\d+\]\.field$/.test(i.path)||r.has(i.path)||(r.add(i.path),s.push({...i,...f,depth:2,kind:"binding",title:i.field}))})}),s}exports.collectTemplateOutline=k;exports.inspectTemplateFieldUsage=m;exports.templatePathLocation=$;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const I=require("./computed-4TnxzgIh.cjs"),K=require("./matrix-0hywp0-F.cjs"),v=require("./component-tree-BjZIp6w9.cjs"),ne=require("./code-options-BUTChiZZ.cjs"),H=require("./param-validation-C-8sRJLq.cjs"),M=require("./template-serialization-D1R5oAqh.cjs");function ae(e,i,t){e!==void 0&&(typeof e!="string"||!e.trim()||e.length>4096)&&t.push({path:i,message:"来源范围应为不超过 4096 字符的非空字符串"})}function J(e,i,t){e.editable!==void 0&&typeof e.editable!="boolean"&&t.push({path:`${i}.editable`,message:"编辑控制应为布尔值"}),e.valueType!==void 0&&!["text","number","boolean"].includes(e.valueType)&&t.push({path:`${i}.valueType`,message:"编辑类型应为 text、number 或 boolean"})}function oe(e,i,t){J(e,i,t),e.indentMm!==void 0&&(typeof e.indentMm!="number"||!Number.isFinite(e.indentMm)||e.indentMm<0)&&t.push({path:`${i}.indentMm`,message:"单元格缩进应为有限非负数"}),e.derived!==void 0&&typeof e.derived!="boolean"&&t.push({path:`${i}.derived`,message:"派生结果标记应为布尔值"}),W(e.source,`${i}.source`,t,!0),e.formula!==void 0&&typeof e.formula!="string"&&t.push({path:`${i}.formula`,message:"单元格公式应为字符串"})}function W(e,i,t,s=!1){if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e)){t.push({path:i,message:"业务来源应为对象"});return}const n=e;ae(n.sourceScope,`${i}.sourceScope`,t);for(const a of["datasetId",...s?["field"]:[]])(typeof n[a]!="string"||!n[a].trim())&&t.push({path:`${i}.${a}`,message:"业务标识应为非空字符串"});for(const a of["rowKey","revision"]){const o=n[a];o===void 0&&!(s&&a==="rowKey")||typeof o!="string"&&!(typeof o=="number"&&Number.isFinite(o))&&t.push({path:`${i}.${a}`,message:"业务键及修订号应为字符串或有限数字"})}n.sourceToken!==void 0&&typeof n.sourceToken!="string"&&t.push({path:`${i}.sourceToken`,message:"来源令牌应为字符串"})}const re=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function g(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function S(e){return e===null?"null":typeof e=="string"?JSON.stringify(e.slice(0,120)):["number","boolean","undefined"].includes(typeof e)?String(e):`[${typeof e}]`}function fe(e,i,t,s){const n=e[i];(typeof n!="number"||!Number.isFinite(n))&&s.push({path:`${t}.${i}`,message:`应为有限数字,实际 ${S(n)}`})}function de(e,i,t){if(e!==void 0){const s=`${i}.table`;if(!g(e))t.push({path:s,message:"逻辑表来源应为对象"});else{W(e.source,`${s}.source`,t),(typeof e.id!="string"||!e.id.trim())&&t.push({path:`${s}.id`,message:"逻辑表 ID 应为非空字符串"});const n=e.role;["header","body","group-header","subtotal","grand-total"].includes(n)||t.push({path:`${s}.role`,message:"未知逻辑表行角色"});const a=e.rowIndex;(typeof a!="number"||!Number.isInteger(a)||(n==="header"?a!==-1:a<0))&&t.push({path:`${s}.rowIndex`,message:"表头索引应为 -1,内容行索引应为非负整数"}),(!Array.isArray(e.columnKeys)||e.columnKeys.some(o=>typeof o!="string"))&&t.push({path:`${s}.columnKeys`,message:"逻辑列字段应为字符串数组"}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&t.push({path:`${s}.layout`,message:"布局应为 page 或 wide"}),e.title!==void 0&&typeof e.title!="string"&&t.push({path:`${s}.title`,message:"逻辑表名称应为字符串"})}}}function ue(e,i,t,s){if(e!==void 0)if(!g(e)||!Array.isArray(e.cells))t.push({path:`${i}.grid.cells`,message:"grid.cells 应为二维数组"});else{const n=e.paddingMm;n!==void 0&&(typeof n!="number"||!Number.isFinite(n)||n<0)&&t.push({path:`${i}.grid.paddingMm`,message:"单元格内距应为有限非负数"}),e.cells.forEach((a,o)=>{if(!Array.isArray(a)){t.push({path:`${i}.grid.cells.${o}`,message:"行应为数组"});return}a.forEach((r,f)=>{if(r==null)return;const d=`${i}.grid.cells.${o}.${f}`;if(!g(r)){t.push({path:d,message:"网格单元格应为对象或 null"});return}oe(r,d,t),r.dataBar!==void 0&&!v.validDataBar(r.dataBar)&&t.push({path:`${d}.dataBar`,message:"数据条应包含 0–1 有序比例与 #RRGGBB 颜色"}),G(r.richParagraphs,d,t),Array.isArray(r.children)&&r.children.forEach((u,p)=>{C(u,`${i}.grid.cells.${o}.${f}.children.${p}`,t,s)})})})}}function R(e,i,t,s){e!==void 0&&!i.includes(e)&&s.push({path:t,message:"未知富文本属性值"})}function O(e,i,t,s,n=0){for(const a of i){const o=e[a];o!==void 0&&(typeof o!="number"||!Number.isFinite(o)||o<n)&&s.push({path:`${t}.${a}`,message:"富文本数值应为范围内有限数字"})}}function he(e,i,t){if(e!==void 0){if(!g(e)){t.push({path:i,message:"富文本样式应为对象"});return}for(const s of["fontFamily","color","backgroundColor","lineColor","borderColor"])e[s]!==void 0&&typeof e[s]!="string"&&t.push({path:`${i}.${s}`,message:"富文本样式应为字符串"});for(const s of["bold","italic","underline","borderTop","borderRight","borderBottom","borderLeft"])e[s]!==void 0&&typeof e[s]!="boolean"&&t.push({path:`${i}.${s}`,message:"富文本样式应为布尔值"});O(e,["fontSize","fontSizePx","lineWidthPt","lineHeight","opacity"],i,t),O(e,["letterSpacing","rotateDeg"],i,t,-1/0),typeof e.opacity=="number"&&e.opacity>1&&t.push({path:`${i}.opacity`,message:"透明度不能大于1"}),R(e.align,["left","center","right","justify"],`${i}.align`,t),R(e.verticalAlign,["top","middle","bottom"],`${i}.verticalAlign`,t)}}function me(e,i,t){if(!g(e)){t.push({path:i,message:"富文本片段应为对象"});return}R(e.kind,["text","field"],`${i}.kind`,t);for(const s of["text","field"])e[s]!==void 0&&typeof e[s]!="string"&&t.push({path:`${i}.${s}`,message:"富文本内容应为字符串"});he(e.style,`${i}.style`,t)}function G(e,i,t){if(e!==void 0){if(!Array.isArray(e)){t.push({path:`${i}.richParagraphs`,message:"richParagraphs 应为数组"});return}e.forEach((s,n)=>{const a=`${i}.richParagraphs.${n}`;if(!g(s)||!Array.isArray(s.segments)){t.push({path:a,message:"段落缺少 segments 数组"});return}R(s.align,["left","center","right","justify"],`${a}.align`,t),O(s,["lineHeight","spaceBeforeMm","spaceAfterMm","indentMm"],a,t),s.segments.forEach((o,r)=>me(o,`${a}.segments.${r}`,t))})}}function _(e,i,t,s=[]){const n=v.componentTreeIssue([e],i);if(n){t.push(n);return}C(e,i,t,s)}function C(e,i,t,s=[]){if(!g(e)){t.push({path:i,message:"组件应为对象"});return}const n=e.kind;typeof n!="string"?t.push({path:`${i}.kind`,message:"组件缺少 kind 字符串"}):re.has(n)||s.push({path:`${i}.kind`,message:`未知组件类型 ${S(n)},将以兜底方式渲染`});for(const a of["leftMm","topMm","widthMm","heightMm"])fe(e,a,i,t);typeof e.leftMm=="number"&&e.leftMm<-100&&t.push({path:`${i}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const a of["widthMm","heightMm"])typeof e[a]=="number"&&e[a]<0&&t.push({path:`${i}.${a}`,message:"组件尺寸不能为负数"});de(e.table,i,t),ge(e.code,n,i,t),ce(e,i,t),e.pageAnchor!==void 0&&!["header","footer"].includes(e.pageAnchor)&&t.push({path:`${i}.pageAnchor`,message:"页面锚点应为 header 或 footer"}),e.lineDirection!==void 0&&!["down","up"].includes(e.lineDirection)&&t.push({path:`${i}.lineDirection`,message:"线段方向应为 down 或 up"}),ue(e.grid,i,t,s),G(e.richParagraphs,i,t)}function ce(e,i,t){if(e.chartBinding!==void 0)try{if(K.validateReportChartBinding(e.chartBinding),e.kind!=="chart"||["binding","imageData","grid","pageAnchor"].some(s=>e[s]!==void 0))throw new Error("绑定图表不能设置图片、网格、记录绑定或页眉页脚");if(typeof e.widthMm!="number"||e.widthMm<45||typeof e.heightMm!="number"||e.heightMm<35)throw new Error("绑定图表至少需要 45×35mm")}catch(s){t.push({path:`${i}.chartBinding`,message:s instanceof Error?s.message:String(s)})}}function ge(e,i,t,s){if(e!==void 0)for(const n of ne.codeOptionIssues(e,i))s.push({path:`${t}.code${n.path?`.${n.path}`:""}`,message:n.message})}function U(e,i,t){if(!g(e))return;e.binding!==void 0&&t.push({path:`${i}.binding`,message:"渲染计划不允许未解析字段绑定"}),e.chartBinding!==void 0&&t.push({path:`${i}.chartBinding`,message:"渲染计划不允许未解析图表绑定"});const s=e.grid;!g(s)||!Array.isArray(s.cells)||s.cells.forEach((n,a)=>{Array.isArray(n)&&n.forEach((o,r)=>{!g(o)||!Array.isArray(o.children)||o.children.forEach((f,d)=>U(f,`${i}.grid.cells.${a}.${r}.children.${d}`,t))})})}function q(e,i,t,s=[]){if(!g(e)){t.push({path:i,message:"页应为对象"});return}const n=e.pageWidthMm,a=e.pageHeightMm;(typeof n!="number"||!Number.isFinite(n)||n<=0)&&t.push({path:`${i}.pageWidthMm`,message:`页宽非法: ${S(n)}`}),(typeof a!="number"||!(a>0&&a<5e3))&&t.push({path:`${i}.pageHeightMm`,message:`页高非法: ${S(a)}`}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&t.push({path:`${i}.layout`,message:"布局应为 page 或 wide"});const o=e.components;if(!Array.isArray(o))t.push({path:`${i}.components`,message:"components 应为数组"});else if(Array.isArray(o)){const r=v.componentTreeIssue(o,`${i}.components`);if(r){t.push(r);return}o.forEach((f,d)=>{C(f,`${i}.components.${d}`,t,s),U(f,`${i}.components.${d}`,t)})}}function z(e){const i=[],t=[],s=g(e)?e.pages:void 0;if(g(e)&&e.requiresRecalculation!==void 0&&typeof e.requiresRecalculation!="boolean"&&i.push({path:"$.requiresRecalculation",message:"重算能力要求应为布尔值"}),!Array.isArray(s))i.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{const n=v.renderTreeIssue(s);if(n)return{ok:!1,errors:[...i,n],warnings:t};s.forEach((o,r)=>q(o,`$.pages.${r}`,i,t)),s.length>2e3&&t.push({path:"$.pages",message:`页数异常大(${s.length} 页),渲染与打印耗时可能显著增加`});const a=s.reduce((o,r)=>o+(g(r)&&Array.isArray(r.components)?r.components.length:0),0);a>5e4&&t.push({path:"$.pages",message:`组件总数异常大(${a} 个),可能触发浏览器性能限制`})}return{ok:i.length===0,errors:i,warnings:t}}function pe(e){const i=z(e);if(!i.ok){const t=i.errors.slice(0,3).map(s=>`${s.path}: ${s.message}`).join("; ");throw new Error(`渲染计划校验失败(${i.errors.length} 处): ${t}`)}return e.pages}function L(e){return e.kind==="list"?e.id:e.nid}function ye(e){return e.kind==="list"?!1:e.pageAnchor!==void 0||e.kind==="text"&&typeof e.text=="string"&&/\{(?:page|totalPages)\}/.test(e.text)}function le(e,i){const t=e.filter(n=>i.componentIds.includes(L(n)??""));if(t.filter(n=>n.kind==="list"&&n.cardinality!=="record").length&&t.length!==1)throw new Error("纵向重复区域必须独占流式分段,不能与静态或单记录区域并排");for(const n of t){const a=n.kind==="list"?n.topMm+(n.rowHeightMm??0):n.topMm+n.heightMm;if(n.topMm<i.topMm-.001||a>i.topMm+i.heightMm+.001)throw new Error("流式分段应完整包含其组件的原始纵向范围")}}function $e(e,i){if(!i)return e.map(s=>({components:[s]}));const t=new Map(e.map(s=>[L(s),s]));return i.bands.map(s=>({band:s,components:s.componentIds.map(n=>{const a=t.get(n);if(!a)throw new Error(`流式区域引用不存在的组件:${n}`);return a})}))}function X(e,i){if(!i||!Array.isArray(i.bands)||!i.bands.length||i.bands.length>1e4)throw new Error("流式排版应包含 1–10000 个区域");const t=new Set,s=new Set;for(const n of e){if(ye(n))continue;const a=L(n);if(!a||t.has(a))throw new Error("流式排版组件应具有唯一标识");t.add(a)}if(be(e,i,t,s),s.size!==t.size)throw new Error("流式排版必须显式包含每个非锚点组件")}function be(e,i,t,s){let n=-1/0;for(const a of i.bands){if(!Number.isFinite(a.topMm)||!Number.isFinite(a.heightMm)||a.topMm<0||a.heightMm<=0||a.topMm<n-.001)throw new Error("流式区域应按原始位置排序,尺寸有效且不重叠");if(!Array.isArray(a.componentIds)||!a.componentIds.length)throw new Error("流式区域不能没有组件");for(const o of a.componentIds){if(!t.has(o)||s.has(o))throw new Error(`流式区域组件缺失、重复或包含页锚点:${o}`);s.add(o)}le(e,a),n=a.topMm+a.heightMm}}const Ae=new Set(["__proto__","prototype","constructor"]);function l(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function k(e){return typeof e=="string"&&!!e.trim()&&!Ae.has(e)}function T(e,i,t,s){for(const n of Object.keys(e))i.includes(n)||s.push({path:`${t}.${n}`,message:"存在未知配置字段"})}function we(e,i,t){if(e!==void 0){if(!l(e)||!["number","percent","date"].includes(String(e.kind))){t.push({path:i,message:"绑定格式应为 number、percent 或 date"});return}T(e,e.kind==="date"?["kind","pattern"]:e.kind==="number"?["kind","digits","thousands"]:["kind","digits"],i,t),e.digits!==void 0&&(!Number.isInteger(e.digits)||Number(e.digits)<0||Number(e.digits)>100)&&t.push({path:`${i}.digits`,message:"精度应为 0..100 整数"}),e.thousands!==void 0&&typeof e.thousands!="boolean"&&t.push({path:`${i}.thousands`,message:"千分位开关应为布尔值"}),e.pattern!==void 0&&typeof e.pattern!="string"&&t.push({path:`${i}.pattern`,message:"日期格式应为字符串"})}}function Me(e,i,t){const s=e.binding;if(s===void 0)return;const n=`${i}.binding`;if(!l(s)){t.push({path:n,message:"字段绑定应为对象"});return}(!["text","image","barcode","qrcode"].includes(String(e.kind))||e.grid!==void 0)&&t.push({path:n,message:"绑定仅支持独立文本、图片、条码与二维码组件"}),T(s,["field","format","prefix","suffix","emptyText"],n,t),k(s.field)||t.push({path:`${n}.field`,message:"绑定字段应为安全的非空字段名(按字面读取自有字段)"});for(const a of["prefix","suffix","emptyText"])s[a]!==void 0&&typeof s[a]!="string"&&t.push({path:`${n}.${a}`,message:"应为字符串"});we(s.format,`${n}.format`,t),e.kind==="image"&&["format","prefix","suffix"].some(a=>s[a]!==void 0)&&t.push({path:n,message:"图片绑定直接读取 PNG/JPEG data URL,不支持文本格式或前后缀"})}function Ee(e,i){if(!l(e)){i.push({path:"$.repeat",message:"逐记录配置应为对象"});return}T(e,["dataset","rowKey","copies"],"$.repeat",i),k(e.dataset)||i.push({path:"$.repeat.dataset",message:"数据集应为安全的非空名称"}),e.rowKey!==void 0&&!k(e.rowKey)&&i.push({path:"$.repeat.rowKey",message:"业务主键应为安全的非空字段名"});const t=e.copies;t!==void 0&&(l(t)?(T(t,["field"],"$.repeat.copies",i),k(t.field)||i.push({path:"$.repeat.copies.field",message:"复制数字段应为安全的非空字段名"})):(!Number.isSafeInteger(t)||Number(t)<1||Number(t)>1e3)&&i.push({path:"$.repeat.copies",message:"每条记录复制数应为 1..1000 整数"}))}function Y(e,i,t,s){if(!l(e))return;Me(e,i,s),e.binding!==void 0&&!t&&s.push({path:`${i}.binding`,message:"字段绑定需要模板 repeat 数据集;普通报表请使用列表字段"}),t&&e.kind==="list"&&s.push({path:i,message:"逐记录标签使用固定组件;动态列表请使用普通报表模板"}),e.chartBinding!==void 0&&(t||i.includes(".children."))&&s.push({path:`${i}.chartBinding`,message:"数据图表应放在普通报表的页面或流式分区,不放在逐记录标签或嵌套单元格内"});const n=e.grid;l(n)&&Array.isArray(n.cells)&&n.cells.forEach((a,o)=>{Array.isArray(a)&&a.forEach((r,f)=>{l(r)&&Array.isArray(r.children)&&r.children.forEach((d,u)=>Y(d,`${i}.grid.cells.${o}.${f}.children.${u}`,t,s))})})}function Q(e,i){const t=e.repeat!==void 0;t&&Ee(e.repeat,i),Array.isArray(e.pages)&&e.pages.forEach((s,n)=>{if(!l(s))return;const a=`$.pages.${n}`;t&&(s.layout==="wide"||s.flow!==void 0)&&i.push({path:a,message:"逐记录标签仅支持固定尺寸页面,不支持宽表或流式分区"}),Array.isArray(s.components)&&s.components.forEach((o,r)=>{const f=`${a}.components.${r}`;if(Y(o,f,t,i),!t||!l(o))return;const{leftMm:d,topMm:u,widthMm:p,heightMm:y}=o;[d,u,p,y,s.widthMm,s.heightMm].every(A=>typeof A=="number"&&Number.isFinite(A))&&(Number(d)<0||Number(u)<0||Number(d)+Number(p)>Number(s.widthMm)+.001||Number(u)+Number(y)>Number(s.heightMm)+.001)&&i.push({path:f,message:"标签组件超出纸张边界,请调整位置或尺寸"})})})}function ve(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function F(e,i,t){if(e!==void 0)try{I.compileReportPredicate(e)}catch(s){t.push({path:i,message:s instanceof Error?s.message:String(s)})}}function Z(e,i,t){if(e===void 0)return;if(!Array.isArray(e)||e.length>2048){t.push({path:i,message:"聚合应为数组且最多 2048 项"});return}const s=new Set;e.forEach((n,a)=>{const o=`${i}.${a}`;if(!ve(n)){t.push({path:o,message:"聚合应为对象"});return}const r=n.field;typeof r!="string"||!r.trim()||s.has(r)?t.push({path:`${o}.field`,message:"聚合输出字段应非空且唯一"}):s.add(r),n.numeric!==void 0&&n.numeric!=="number"&&n.numeric!=="decimal"&&t.push({path:`${o}.numeric`,message:"数值模式应为 number 或 decimal"}),n.digits!==void 0&&(!Number.isInteger(n.digits)||Number(n.digits)<0||Number(n.digits)>100)&&t.push({path:`${o}.digits`,message:"小数位应为 0–100 的整数"});try{I.createAggregateAccumulator({...n,field:n.valueField??r})}catch(f){t.push({path:o,message:f instanceof Error?f.message:String(f)})}})}function ke(e,i,t){if(e===void 0)return;const s=I.validateComputedFields(e);for(const n of s.errors)t.push({path:i,message:n})}function Ne(e,i,t){if(e!==void 0)try{K.validateMatrixOptions(e)}catch(s){t.push({path:i,message:s instanceof Error?s.message:String(s)})}}function Se(e,i,t){if(e.tree===void 0)return;const s=`${i}.tree`;try{M.validateTreeOptions(e.tree);const n=e.tree;if(e.matrix||e.detail||e.groupBy||Array.isArray(e.groups)&&e.groups.length||e.rowVisibleWhen)throw new Error("树形布局不能同时配置普通分组、矩阵、主从或行可见条件");if(e.rowKey!==void 0&&e.rowKey!==n.idField)throw new Error("树形 rowKey 应与 idField 一致");if(!Array.isArray(e.columns)||!e.columns.some(a=>a&&a.field===n.labelField&&!a.hidden))throw new Error("树形布局需要可见的标签列");Array.isArray(e.computed)&&M.validateTreeComputed(n,e.computed)}catch(n){t.push({path:s,message:n instanceof Error?n.message:String(n)})}}const D="1.0";class w extends Error{constructor(i){super(`模板校验失败:${i.slice(0,3).map(t=>`${t.path}: ${t.message}`).join("; ")}`),this.errors=i,this.name="ReportTemplateError"}}const Re=new Set(["__proto__","prototype","constructor"]),Te=new Set(["schemaVersion","id","name","revision","description","template"]),xe=new Set(["left","center","right","justify"]),N=2e5,Pe=64;function h(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Oe(e,i,t){const s=Object.getPrototypeOf(e),n=Array.isArray(e);if(n?s!==Array.prototype:s!==Object.prototype&&s!==null)return t.push({path:i,message:"模板对象必须使用普通 JSON 对象原型"}),!1;if(n){const a=Object.keys(e);if(a.length!==e.length||a.some(o=>!/^(0|[1-9]\d*)$/.test(o)||Number(o)>=e.length))return t.push({path:i,message:"模板数组不能包含空位或额外属性"}),!1}return Object.getOwnPropertySymbols(e).length>0?(t.push({path:i,message:"模板不能包含 Symbol 键"}),!1):!0}function Fe(e,i,t,s){return Re.has(e)?(s.push({path:t,message:"模板不能包含可能污染原型的键"}),!1):i.get||i.set||!i.enumerable?(s.push({path:t,message:"模板不能包含访问器或不可枚举字段"}),!1):!0}function Ie(e){return e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)}function V(e,i){const t=new Set;let s=0,n=0,a=!1;const o=(r,f,d)=>{if(!a){if(++s>N){s===N+1&&i.push({path:f,message:"模板超过 JSON 节点安全上限"});return}if(d>Pe){i.push({path:f,message:"模板嵌套层级过深"});return}if(typeof r=="string"){n+=r.length,n>M.MAX_TEMPLATE_JSON_CHARACTERS&&(a=!0,i.push({path:f,message:"模板文本超过 1000 万字符的安全上限"}));return}if(!Ie(r)){if(!r||typeof r!="object"){i.push({path:f,message:"模板只允许 JSON 值,不允许函数、undefined 或非有限数字"});return}if(t.has(r)){i.push({path:f,message:"模板不能包含循环引用"});return}if(Oe(r,f,i)){t.add(r);for(const[u,p]of Object.entries(Object.getOwnPropertyDescriptors(r))){if(Array.isArray(r)&&u==="length")continue;const y=`${f}.${u}`;if(Fe(u,p,y,i)&&o(p.value,y,d+1),s>N||a)break}t.delete(r)}}}};o(e,"$",0)}function m(e,i,t,s,n=!1){const a=e[i];a===void 0&&!n||(typeof a!="string"||n&&!a.trim())&&s.push({path:`${t}.${i}`,message:n?"应为非空字符串":"应为字符串"})}function c(e,i,t,s,n=0,a=!1){const o=e[i];o===void 0&&!a||(typeof o!="number"||!Number.isFinite(o)||o<n)&&s.push({path:`${t}.${i}`,message:`应为大于等于 ${n} 的有限数字`})}function b(e,i,t,s){e[i]!==void 0&&typeof e[i]!="boolean"&&s.push({path:`${t}.${i}`,message:"应为布尔值"})}function E(e,i,t,s=!1){e!==void 0&&!xe.has(e)&&!(s&&e==="auto")&&t.push({path:i,message:`未知对齐方式${s?"(支持 auto)":""}`})}function $(e,i,t){if(e!==void 0){if(!h(e)){t.push({path:i,message:"样式应为对象"});return}E(e.align,`${i}.align`,t),e.verticalAlign!==void 0&&!["top","middle","bottom"].includes(e.verticalAlign)&&t.push({path:`${i}.verticalAlign`,message:"未知垂直对齐方式"});for(const s of["fontSize","fontSizePx","lineWidthPt","lineHeight"])c(e,s,i,t);for(const s of["letterSpacing","rotateDeg"])c(e,s,i,t,-1/0);c(e,"opacity",i,t),typeof e.opacity=="number"&&e.opacity>1&&t.push({path:`${i}.opacity`,message:"透明度不能大于 1"});for(const s of["bold","italic","underline","borderTop","borderRight","borderBottom","borderLeft"])b(e,s,i,t);for(const s of["fontFamily","color","backgroundColor","lineColor","borderColor"])m(e,s,i,t)}}function _e(e,i,t){if(e===void 0)return;if(!Array.isArray(e)){t.push({path:i,message:"参数定义应为数组"});return}const s=new Set,n=t.length;e.forEach((a,o)=>{const r=`${i}.${o}`;if(!h(a)){t.push({path:r,message:"参数定义应为对象"});return}m(a,"field",r,t,!0),typeof a.field=="string"&&(s.has(a.field)&&t.push({path:`${r}.field`,message:"参数名重复"}),s.add(a.field)),a.type!==void 0&&!["text","number","date","month","year","dateRange","select","multiSelect","cascader","numberRange"].includes(a.type)&&t.push({path:`${r}.type`,message:"未知参数类型"});for(const f of["label","defaultValue","placeholder"])m(a,f,r,t);b(a,"required",r,t);for(const f of["minLength","maxLength"]){const d=a[f];d!==void 0&&(typeof d!="number"||!Number.isSafeInteger(d)||d<0)&&t.push({path:`${r}.${f}`,message:"长度边界应为非负整数"})}Ce(a,r,t),a.options!==void 0&&(Array.isArray(a.options)?a.options.forEach((f,d)=>{const u=`${r}.options.${d}`;if(!h(f))t.push({path:u,message:"选项应为对象"});else for(const p of["label","value"])typeof f[p]!="string"&&t.push({path:`${u}.${p}`,message:"选项标签与值应为字符串(允许空白选项)"})}):t.push({path:`${r}.options`,message:"选项应为数组"}))}),t.length===n&&t.push(...H.validateReportParamDefinitions(e).map(a=>({path:a.path.replace("$.paramDefs",i),message:a.message})))}function Ce(e,i,t){for(const a of["min","max"]){const o=e[a];if(o===void 0)continue;H.isReportTemporalBound(e.type,o)||["number","numberRange"].includes(e.type)&&typeof o=="number"&&Number.isFinite(o)||t.push({path:`${i}.${a}`,message:"数字使用有限数字边界,日期/月/年使用对应规范字符串边界"})}const s=typeof e.min=="number"&&typeof e.max=="number"&&e.min>e.max,n=typeof e.min=="string"&&typeof e.max=="string"&&e.min>e.max;(s||n)&&t.push({path:i,message:"最小边界不能大于最大边界"}),typeof e.minLength=="number"&&typeof e.maxLength=="number"&&e.minLength>e.maxLength&&t.push({path:i,message:"最小长度不能大于最大长度"})}function ee(e,i,t){if(!Array.isArray(e)||e.length===0){t.push({path:i,message:"列表至少需要一列"});return}e.every(s=>h(s)&&s.hidden===!0)&&t.push({path:i,message:"列表至少需要一列可见列"}),e.forEach((s,n)=>{const a=`${i}.${n}`;if(!h(s)){t.push({path:a,message:"列应为对象"});return}if(J(s,a,t),s.visual!==void 0&&!M.validColumnVisual(s.visual)&&t.push({path:`${a}.visual`,message:"列可视化配置无效,请检查类型、数值范围和颜色"}),b(s,"hidden",a,t),F(s.visibleWhen,`${a}.visibleWhen`,t),typeof s.header!="string"&&t.push({path:`${a}.header`,message:"表头应为字符串(允许空白表头)"}),m(s,"field",a,t,!0),c(s,"widthMm",a,t,Number.MIN_VALUE,!0),$(s.style,`${a}.style`,t),$(s.headerStyle,`${a}.headerStyle`,t),E(s.align,`${a}.align`,t,!0),E(s.headerAlign,`${a}.headerAlign`,t),s.semanticRole!==void 0&&!["identifier","dimension","measure","date","text"].includes(s.semanticRole)&&t.push({path:`${a}.semanticRole`,message:"未知列语义"}),s.format!==void 0)if(!h(s.format)||!["number","percent","date"].includes(s.format.kind))t.push({path:`${a}.format`,message:"未知列格式"});else{const o=s.format.digits;o!==void 0&&(typeof o!="number"||!Number.isInteger(o)||o<0||o>100)&&t.push({path:`${a}.format.digits`,message:"小数位应为 0–100 的整数"}),b(s.format,"thousands",`${a}.format`,t),m(s.format,"pattern",`${a}.format`,t)}s.rules!==void 0&&(Array.isArray(s.rules)?s.rules.forEach((o,r)=>{const f=`${a}.rules.${r}`;if(!h(o)||!h(o.when)){t.push({path:f,message:"条件格式缺少 when 对象"});return}F(o.when,`${f}.when`,t),$(o.style,`${f}.style`,t)}):t.push({path:`${a}.rules`,message:"条件格式应为数组"}))})}function te(e,i,t){if(e!==void 0){if(!h(e)){t.push({path:i,message:"分组应为对象"});return}m(e,"field",i,t,!0);for(const s of["headerTemplate","subtotalLabel"])m(e,s,i,t);for(const s of["headerStyle","subtotalStyle"])$(e[s],`${i}.${s}`,t);b(e,"keepWithNext",i,t),b(e,"repeatHeader",i,t),Z(e.aggregates,`${i}.aggregates`,t),e.subtotal!==void 0&&(!Array.isArray(e.subtotal)||e.subtotal.some(s=>typeof s!="string"))&&t.push({path:`${i}.subtotal`,message:"小计字段应为字符串数组"})}}function Le(e,i,t){if(!(e===void 0||typeof e=="boolean")){if(!h(e)){t.push({path:i,message:"合计应为布尔值或对象"});return}m(e,"label",i,t),Z(e.aggregates,`${i}.aggregates`,t),$(e.style,`${i}.style`,t),e.fields!==void 0&&(!Array.isArray(e.fields)||e.fields.some(s=>typeof s!="string"))&&t.push({path:`${i}.fields`,message:"合计字段应为字符串数组"})}}function De(e,i,t,s){const n={kind:"rect",leftMm:0,topMm:0,widthMm:1,heightMm:1,grid:e};if(_(n,t,s,[]),B(n,t,s),!h(e)||!Array.isArray(e.cells))return;const a=e.cells,o=Array.isArray(i)?i.length:0;if(a.length*o>N){s.push({path:t,message:"表头逻辑网格超过 20 万格安全上限"});return}e.cells.length||s.push({path:`${t}.cells`,message:"表头至少需要一行"}),Array.isArray(e.colWidthsMm)&&e.colWidthsMm.length!==o&&s.push({path:`${t}.colWidthsMm`,message:"表头列宽数量应与列表列数一致"}),Array.isArray(e.rowHeightsMm)&&e.rowHeightsMm.length!==e.cells.length&&s.push({path:`${t}.rowHeightsMm`,message:"表头行高数量应与行数一致"}),Ve(a,o,t,s)}function Ve(e,i,t,s){const n=new Set;e.forEach((a,o)=>{if(!Array.isArray(a))return;let r=0;a.forEach((f,d)=>{for(;n.has(`${o}:${r}`);)r++;const u=h(f)&&typeof f.colSpan=="number"?f.colSpan:1,p=h(f)&&typeof f.rowSpan=="number"?f.rowSpan:1;(r+u>i||o+p>e.length)&&s.push({path:`${t}.cells.${o}.${d}`,message:"表头合并区域超出表头边界"});for(let y=o;y<Math.min(e.length,o+p);y++)for(let A=r;A<Math.min(i,r+u);A++)n.has(`${y}:${A}`)&&s.push({path:`${t}.cells.${o}.${d}`,message:"表头合并区域重叠"}),n.add(`${y}:${A}`);r+=u})})}function Be(e,i,t){if(Se(e,i,t),ke(e.computed,`${i}.computed`,t),Ne(e.matrix,`${i}.matrix`,t),e.matrix&&(e.detail||e.groupBy||Array.isArray(e.groups)&&e.groups.length||e.grandTotal)&&t.push({path:`${i}.matrix`,message:"矩阵请使用自身 totals 汇总,不能同时配置普通分组、总计或主从明细"}),F(e.rowVisibleWhen,`${i}.rowVisibleWhen`,t),e.groups!==void 0&&(!Array.isArray(e.groups)||e.groups.length>16?t.push({path:`${i}.groups`,message:"分组应为数组,最多 16 级"}):e.groups.forEach((a,o)=>te(a,`${i}.groups.${o}`,t))),e.detail===void 0)return;const s=e.detail,n=`${i}.detail`;if(!h(s)){t.push({path:n,message:"主从关联应为对象"});return}for(const a of["dataset","parentKey","foreignKey"])m(s,a,n,t,!0);for(const a of["rowKey","revisionField","sourceTokenField"])m(s,a,n,t,s[a]!==void 0);m(s,"label",n,t),b(s,"header",n,t),c(s,"rowHeightMm",n,t,Number.MIN_VALUE),ee(s.columns,`${n}.columns`,t),s.unmatched!==void 0&&s.unmatched!=="error"&&s.unmatched!=="ignore"&&t.push({path:`${n}.unmatched`,message:"未关联明细策略应为 error 或 ignore"})}function je(e,i,t){for(const s of["leftMm","topMm"])c(e,s,i,t,-1/0,!0);c(e,"widthMm",i,t,Number.MIN_VALUE,!0),m(e,"dataset",i,t,!0),m(e,"title",i,t);for(const s of["rowKey","revisionField","sourceTokenField"])m(e,s,i,t,e[s]!==void 0);e.headerGrid!==void 0&&De(e.headerGrid,e.columns,`${i}.headerGrid`,t),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&t.push({path:`${i}.layout`,message:"布局应为 page 或 wide"}),ee(e.columns,`${i}.columns`,t);for(const s of["fontSizePt","rowHeightMm"])c(e,s,i,t,Number.MIN_VALUE);c(e,"paddingMm",i,t);for(const s of["header","headerBold","headerEveryPage","border"])b(e,s,i,t);e.cardinality!==void 0&&e.cardinality!=="record"&&t.push({path:`${i}.cardinality`,message:"单记录区域类型应为 record"}),m(e,"headerBackgroundColor",i,t),E(e.align,`${i}.align`,t,!0),E(e.headerAlign,`${i}.headerAlign`,t),$(e.headerStyle,`${i}.headerStyle`,t),Be(e,i,t),te(e.groupBy,`${i}.groupBy`,t),Le(e.grandTotal,`${i}.grandTotal`,t)}function j(e,i,t){Array.isArray(e.richParagraphs)&&e.richParagraphs.forEach((s,n)=>{if(!h(s))return;const a=`${i}.richParagraphs.${n}`;E(s.align,`${a}.align`,t);for(const o of["lineHeight","spaceBeforeMm","spaceAfterMm","indentMm"])c(s,o,a,t);Array.isArray(s.segments)&&s.segments.forEach((o,r)=>{const f=`${a}.segments.${r}`;if(!h(o)){t.push({path:f,message:"富文本片段应为对象"});return}o.kind!==void 0&&o.kind!=="text"&&o.kind!=="field"&&t.push({path:`${f}.kind`,message:"未知富文本片段类型"});for(const d of["text","field"])m(o,d,f,t);$(o.style,`${f}.style`,t)})})}function B(e,i,t){$(e.style,`${i}.style`,t);for(const n of["text","rawText","imageData","fallbackText","nid","rkey"])m(e,n,i,t);if(e.lines!==void 0&&(!Array.isArray(e.lines)||e.lines.some(n=>typeof n!="string"))&&t.push({path:`${i}.lines`,message:"文本行应为字符串数组"}),j(e,i,t),!h(e.grid))return;const s=e.grid;c(s,"gapMm",`${i}.grid`,t),c(s,"paddingMm",`${i}.grid`,t);for(const n of["colWidthsMm","rowHeightsMm"]){const a=s[n];a!==void 0&&(!Array.isArray(a)||a.some(o=>typeof o!="number"||!Number.isFinite(o)||o<0))&&t.push({path:`${i}.grid.${n}`,message:"网格尺寸应为有限非负数字数组"})}Array.isArray(s.cells)&&s.cells.forEach((n,a)=>{Array.isArray(n)&&n.forEach((o,r)=>{const f=`${i}.grid.cells.${a}.${r}`;if(o!==null){if(!h(o)){t.push({path:f,message:"网格单元格应为对象或 null"});return}for(const d of["text","rawText","numberFormat"])m(o,d,f,t);for(const d of["colSpan","rowSpan"]){const u=o[d];u!==void 0&&(typeof u!="number"||!Number.isInteger(u)||u<=0)&&t.push({path:`${f}.${d}`,message:"跨度应为正整数"})}o.value!==void 0&&o.value!==null&&!["string","number","boolean"].includes(typeof o.value)&&t.push({path:`${f}.value`,message:"Excel 原始值应为字符串、数字、布尔值或 null"}),$(o.style,`${f}.style`,t),j(o,f,t),o.children!==void 0&&(Array.isArray(o.children)?o.children.forEach((d,u)=>{h(d)&&B(d,`${f}.children.${u}`,t)}):t.push({path:`${f}.children`,message:"嵌套组件应为数组"}))}})})}function Ke(e,i,t){if(!(e.flow===void 0||!Array.isArray(e.components)))try{X(e.components,e.flow)}catch(s){t.push({path:`${i}.flow`,message:s instanceof Error?s.message:String(s)})}}function ie(e){const i=[],t=[];return V(e,i),i.length?{ok:!1,errors:i,warnings:t}:(h(e)?(e.schemaVersion!==void 0&&e.schemaVersion!==v.RENDER_PLAN_SCHEMA_VERSION&&i.push({path:"$.schemaVersion",message:"不支持的模板 schemaVersion"}),_e(e.params,"$.params",i),Q(e,i),!Array.isArray(e.pages)||e.pages.length===0?i.push({path:"$.pages",message:"模板至少需要一页"}):e.pages.forEach((s,n)=>{const a=`$.pages.${n}`;if(!h(s)){i.push({path:a,message:"页应为对象"});return}c(s,"widthMm",a,i,Number.MIN_VALUE,!0),c(s,"heightMm",a,i,Number.MIN_VALUE,!0),s.layout!==void 0&&s.layout!=="page"&&s.layout!=="wide"&&i.push({path:`${a}.layout`,message:"布局应为 page 或 wide"}),typeof s.heightMm=="number"&&s.heightMm>=5e3&&i.push({path:`${a}.heightMm`,message:"页高应小于 5000mm"});for(const o of["marginTopMm","marginBottomMm","marginLeftMm","marginRightMm"])c(s,o,a,i);typeof s.widthMm=="number"&&Number(s.marginLeftMm??0)+Number(s.marginRightMm??0)>=s.widthMm&&i.push({path:a,message:"横向页边距占满页面"}),typeof s.heightMm=="number"&&Number(s.marginTopMm??0)+Number(s.marginBottomMm??0)>=s.heightMm&&i.push({path:a,message:"纵向页边距占满页面"}),Array.isArray(s.components)?s.components.forEach((o,r)=>{const f=`${a}.components.${r}`;h(o)&&o.kind==="list"?je(o,f,i):(_(o,f,i,t),h(o)&&B(o,f,i))}):i.push({path:`${a}.components`,message:"组件应为数组"}),Ke(s,a,i)})):i.push({path:"$",message:"模板应为对象"}),{ok:i.length===0,errors:i,warnings:t})}function se(e){const i=[],t=[];if(V(e,i),i.length)return{ok:!1,errors:i,warnings:t};if(!h(e))i.push({path:"$",message:"模板文档应为对象"});else{for(const n of Object.keys(e))Te.has(n)||i.push({path:`$.${n}`,message:"模板文档存在未知字段;只保存模板与描述,不保存取数或业务数据"});e.schemaVersion!==D&&i.push({path:"$.schemaVersion",message:"不支持的模板文档版本"});for(const n of["id","name"])m(e,n,"$",i,!0);for(const n of["revision","description"])m(e,n,"$",i);const s=ie(e.template);i.push(...s.errors.map(n=>({...n,path:`$.template${n.path.slice(1)}`}))),t.push(...s.warnings.map(n=>({...n,path:`$.template${n.path.slice(1)}`})))}return{ok:i.length===0,errors:i,warnings:t}}function P(e){const i=se(e);if(!i.ok)throw new w(i.errors)}function He(e){const i=[];if(V(e,i),i.length)throw new w(i);const t={...e,schemaVersion:e.schemaVersion??D};return P(t),x(t)}function Je(e){let i=e;if(typeof e=="string"){if(e.length>M.MAX_TEMPLATE_JSON_CHARACTERS)throw new w([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);try{i=JSON.parse(e)}catch{throw new w([{path:"$",message:"模板 JSON 语法无效"}])}}return P(i),x(i)}function We(e){P(e);try{return M.stringifyValidatedTemplate(e)}catch(i){throw i instanceof RangeError?new w([{path:"$",message:i.message}]):i}}function x(e){return JSON.parse(JSON.stringify(e))}function Ge(e=[]){const i=new Map,t={get:s=>{const n=i.get(s);return n?x(n):void 0},list:()=>Array.from(i.values(),({template:s,...n})=>({...n})),register:(s,n={})=>{if(P(s),i.has(s.id)&&!n.replace)throw new w([{path:"$.id",message:`模板 ID ${s.id} 已注册;更新需显式 replace:true`}]);i.set(s.id,x(s))},remove:s=>i.delete(s)};for(const s of e)t.register(s);return t}exports.REPORT_TEMPLATE_DOCUMENT_VERSION=D;exports.ReportTemplateError=w;exports.assertRenderPlan=pe;exports.createTemplateRegistry=Ge;exports.defineReportTemplate=He;exports.parseReportTemplate=Je;exports.reportFlowGroups=$e;exports.serializeReportTemplate=We;exports.validateComponent=_;exports.validatePage=q;exports.validateRenderPlan=z;exports.validateReportPageFlow=X;exports.validateReportTemplate=ie;exports.validateReportTemplateDocument=se;exports.validateTemplateRepeat=Q;
|
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
import { e as x, c as v } from "./computed-C8NRZQss.js";
|
|
2
|
-
class V 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 y(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 M(r) {
|
|
22
|
-
if (A(r) || typeof r == "number" && Number.isFinite(r)) return r;
|
|
23
|
-
throw new Error("树节点业务键应为非空字符串或有限数字");
|
|
24
|
-
}
|
|
25
|
-
function N(r) {
|
|
26
|
-
return JSON.stringify([typeof r, r]);
|
|
27
|
-
}
|
|
28
|
-
function k(r) {
|
|
29
|
-
return [r.idField, ...r.input === "flat" ? [r.parentField ?? ""] : [r.childrenField ?? "children"]];
|
|
30
|
-
}
|
|
31
|
-
function O(r, e) {
|
|
32
|
-
const n = k(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 $(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 ([...k(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 R(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 I(r) {
|
|
60
|
-
if (!r || typeof r != "object" || !["flat", "nested"].includes(r.input)) throw new Error("树输入应为 flat 或 nested");
|
|
61
|
-
if (R(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
|
-
y(r), $(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 V(i.rows);
|
|
69
|
-
const t = M(r[e.idField]), f = N(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 _(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(N(M(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 j(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 s = l.row[e.childrenField ?? "children"];
|
|
109
|
-
if (s != null) {
|
|
110
|
-
if (!Array.isArray(s)) throw new Error("嵌套树 children 字段应为数组");
|
|
111
|
-
s.length && o.push({ rows: s, next: 0, parent: l });
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return f;
|
|
115
|
-
}
|
|
116
|
-
function J(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 L(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 s of f.get(l)) s.add(a.row);
|
|
142
|
-
}
|
|
143
|
-
for (const [a, l] of f)
|
|
144
|
-
a.row = { ...a.row }, t.forEach((s, c) => {
|
|
145
|
-
a.row[s.field] = l[c].value();
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
function T(r, e, n) {
|
|
149
|
-
if (I(e), w(n), !Array.isArray(r)) throw new Error("树数据应为节点数组");
|
|
150
|
-
const i = y(e), t = /* @__PURE__ */ new Map(), f = e.input === "flat" ? _(r, e, t, i, n) : j(r, e, t, i, n);
|
|
151
|
-
return J(f, t.size, i, n);
|
|
152
|
-
}
|
|
153
|
-
function X(r, e, n) {
|
|
154
|
-
return T(r, e, n).map((i) => i.original);
|
|
155
|
-
}
|
|
156
|
-
function q(r, e, n = {}) {
|
|
157
|
-
const i = T(r, e, n.signal);
|
|
158
|
-
if (O(e, n.computed?.fields), n.computed?.fields.length) {
|
|
159
|
-
const t = x(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 L(i, e, y(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 B = /^#[0-9a-f]{6}$/i;
|
|
167
|
-
function D(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" && B.test(i));
|
|
171
|
-
}
|
|
172
|
-
function S(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 z(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 E(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 H(r, e, n, i) {
|
|
194
|
-
const t = /* @__PURE__ */ new WeakMap();
|
|
195
|
-
return { apply(f, o) {
|
|
196
|
-
const a = S(o[e], r.numeric);
|
|
197
|
-
if (a === void 0) return;
|
|
198
|
-
if (r.kind === "dataBar") {
|
|
199
|
-
const d = Math.min(n, 0), g = Math.max(i, 0), m = E(0, d, g), b = d === g ? m : E(a, d, 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 = z(r.lowColor ?? "#f0f7ff", r.highColor ?? "#8bbcf1", E(a, n, i)), s = f.style ?? {}, c = t.get(s) ?? /* @__PURE__ */ new Map();
|
|
204
|
-
t.set(s, c);
|
|
205
|
-
let u = c.get(l);
|
|
206
|
-
u || (u = { ...s, backgroundColor: l }, c.set(l, u)), f.style = u;
|
|
207
|
-
} };
|
|
208
|
-
}
|
|
209
|
-
function G(r, e, n) {
|
|
210
|
-
return r.map((i) => {
|
|
211
|
-
F(n);
|
|
212
|
-
const t = i.visual;
|
|
213
|
-
if (!t) return;
|
|
214
|
-
if (!D(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 d = S(u[f], t.numeric);
|
|
220
|
-
d !== void 0 && (o = Math.min(o, d), a = Math.max(a, d));
|
|
221
|
-
}
|
|
222
|
-
let s = t.min ?? o, c = t.max ?? a;
|
|
223
|
-
if (!(!Number.isFinite(s) || !Number.isFinite(c)))
|
|
224
|
-
return s > c && (t.min !== void 0 ? c = s : s = c), H(t, f, s, c);
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
function F(r) {
|
|
228
|
-
if (r?.aborted) throw r.reason ?? new DOMException("Aborted", "AbortError");
|
|
229
|
-
}
|
|
230
|
-
const P = 1e7;
|
|
231
|
-
function K(r) {
|
|
232
|
-
const e = JSON.stringify(r, null, 2);
|
|
233
|
-
if (e.length > P)
|
|
234
|
-
throw new RangeError("模板 JSON 超过 1000 万字符的导出/导入上限");
|
|
235
|
-
return e;
|
|
236
|
-
}
|
|
237
|
-
export {
|
|
238
|
-
P as M,
|
|
239
|
-
V as T,
|
|
240
|
-
I as a,
|
|
241
|
-
O as b,
|
|
242
|
-
q as c,
|
|
243
|
-
G as d,
|
|
244
|
-
X as f,
|
|
245
|
-
K as s,
|
|
246
|
-
D as v
|
|
247
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
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 T(e){return typeof e=="string"&&!!e.trim()}function h(e){return T(e)&&!["__proto__","prototype","constructor"].includes(e)}function M(e){if(T(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 k(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 $(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 I(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 S(e){if(!e||typeof e!="object"||!["flat","nested"].includes(e.input))throw new Error("树输入应为 flat 或 nested");if(I(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),$(e)}function V(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 L(e,r,n,i,t){for(const o of e)w(t),V(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 j(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=V(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 J(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 O(e,r,n){if(S(r),w(n),!Array.isArray(e))throw new Error("树数据应为节点数组");const i=b(r),t=new Map,l=r.input==="flat"?L(e,r,t,i,n):j(e,r,t,i,n);return J(l,t.size,i,n)}function D(e,r,n){return O(e,r,n).map(i=>i.original)}function z(e,r,n={}){const i=O(e,r,n.signal);if(k(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 H=/^#[0-9a-f]{6}$/i;function R(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"&&H.test(i))}function x(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 P(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 X(e,r,n,i){const t=new WeakMap;return{apply(l,o){const a=x(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=P(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 q(e,r,n){return e.map(i=>{v(n);const t=i.visual;if(!t)return;if(!R(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=x(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),X(t,l,c,d)})}function v(e){if(e?.aborted)throw e.reason??new DOMException("Aborted","AbortError")}const _=1e7;function W(e){const r=JSON.stringify(e,null,2);if(r.length>_)throw new RangeError("模板 JSON 超过 1000 万字符的导出/导入上限");return r}exports.MAX_TEMPLATE_JSON_CHARACTERS=_;exports.TreeRowLimitError=A;exports.createColumnVisualResolvers=q;exports.createTreeTable=z;exports.flattenTreeInput=D;exports.stringifyValidatedTemplate=W;exports.validColumnVisual=R;exports.validateTreeComputed=k;exports.validateTreeOptions=S;
|