@agile-team/mach-report 2.16.0 → 2.17.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 (128) hide show
  1. package/README.md +10 -6
  2. package/dist/{ExcelBindingWizard-CP6h2x1f.cjs → ExcelBindingWizard-Bq6FYME6.cjs} +1 -1
  3. package/dist/{ExcelBindingWizard-HhB3hAJE.js → ExcelBindingWizard-Co1svTsw.js} +3 -3
  4. package/dist/{ParamEditor-CUQLgoxa.cjs → ParamEditor-B5UZRgxv.cjs} +1 -1
  5. package/dist/{ParamEditor-OKesP_nO.js → ParamEditor-DNNARyeB.js} +1 -1
  6. package/dist/{ReportBatchPanel-cZCAMAwH.cjs → ReportBatchPanel-Ctvs2t_9.cjs} +1 -1
  7. package/dist/{ReportBatchPanel-ruxcbfY6.js → ReportBatchPanel-uQh06usx.js} +1 -1
  8. package/dist/ReportPreview-BdQawRh0.js +4879 -0
  9. package/dist/ReportPreview-CJC_-j2I.cjs +6 -0
  10. package/dist/{ReportTemplateLibrary-BDlNT8JN.cjs → ReportTemplateLibrary-CnP7_1pH.cjs} +1 -1
  11. package/dist/{ReportTemplateLibrary-DcwrH-63.js → ReportTemplateLibrary-TIL_Oj2l.js} +1 -1
  12. package/dist/RuleEditor-DkRjOLlr.js +2141 -0
  13. package/dist/RuleEditor-h5anGsDB.cjs +1 -0
  14. package/dist/{TemplateOutlinePanel-CGrT5DFN.cjs → TemplateOutlinePanel-BlLxRrfu.cjs} +1 -1
  15. package/dist/{TemplateOutlinePanel-SXCjaPKR.js → TemplateOutlinePanel-BouxsuqQ.js} +1 -1
  16. package/dist/{TemplateReusePanel-lHLOS9Wn.js → TemplateReusePanel-BEACLPaN.js} +2 -2
  17. package/dist/{TemplateReusePanel-6Z3wRFz8.cjs → TemplateReusePanel-yxsHSO40.cjs} +1 -1
  18. package/dist/{TemplateReviewPanel-CJ9PLc48.js → TemplateReviewPanel-B1OGRY2i.js} +1 -1
  19. package/dist/{TemplateReviewPanel-Dpk7sLcF.cjs → TemplateReviewPanel-D9Cx0m2N.cjs} +1 -1
  20. package/dist/analytics.cjs +1 -1
  21. package/dist/analytics.d.cts +63 -1
  22. package/dist/analytics.d.ts +63 -1
  23. package/dist/analytics.js +4 -4
  24. package/dist/artifact-integrity.json +86 -90
  25. package/dist/assets-BIMVwjQe.js +231 -0
  26. package/dist/assets-Dfs2ElxI.cjs +1 -0
  27. package/dist/{auto-YR7a4BtF.js → auto-BIOmtVhk.js} +14 -14
  28. package/dist/{auto-uVBjX1j5.cjs → auto-DDHflI9v.cjs} +1 -1
  29. package/dist/computed-BW5a8QFk.js +612 -0
  30. package/dist/computed-C2GD3XcE.cjs +1 -0
  31. package/dist/dataset-DL83majE.js +161 -0
  32. package/dist/dataset-IrlXbUvh.cjs +1 -0
  33. package/dist/{designer-BfQSahxq.js → designer-D9XAxqSc.js} +1194 -1179
  34. package/dist/designer-uCDo5XSK.cjs +2 -0
  35. package/dist/designer.cjs +1 -1
  36. package/dist/designer.d.cts +125 -3
  37. package/dist/designer.d.ts +125 -3
  38. package/dist/designer.js +1 -1
  39. package/dist/{drill-CsdjgkRM.cjs → drill-ByN8COs_.cjs} +1 -1
  40. package/dist/{drill-DIGsZfyB.js → drill-CKW3Xtfa.js} +11 -11
  41. package/dist/{encoding-BYF9ZTl9.cjs → encoding-BFMFIc4r.cjs} +1 -1
  42. package/dist/{encoding-BOGq4qYL.js → encoding-DP_Eaf0A.js} +2 -2
  43. package/dist/{font-loader-EKLzOJxf.cjs → font-loader-7FWVlykp.cjs} +1 -1
  44. package/dist/{font-loader-CzI1GuBc.js → font-loader-CQZowp0I.js} +1 -1
  45. package/dist/index.cjs +8 -8
  46. package/dist/index.d.cts +173 -1
  47. package/dist/index.d.ts +173 -1
  48. package/dist/index.js +1205 -808
  49. package/dist/json-snapshot-D7PE1NsU.cjs +2 -0
  50. package/dist/{json-snapshot-D6ioHth9.js → json-snapshot-DYmEe3sO.js} +769 -692
  51. package/dist/matrix-JLAXlux-.js +302 -0
  52. package/dist/matrix-gTHpDTGm.cjs +1 -0
  53. package/dist/{pdf-ByVCb1i6.cjs → pdf-B8JouyYv.cjs} +47 -47
  54. package/dist/{pdf-DJ5S6ukC.js → pdf-l3ea86di.js} +13 -15
  55. package/dist/pdf.cjs +1 -1
  56. package/dist/pdf.d.cts +12 -0
  57. package/dist/pdf.d.ts +12 -0
  58. package/dist/pdf.js +2 -2
  59. package/dist/{plugin-C2j5_mhx.js → plugin-BBp74CQZ.js} +1 -1
  60. package/dist/{plugin-Dr39GBRG.cjs → plugin-CtFX9PFG.cjs} +1 -1
  61. package/dist/{prepared-DqtpvRTn.js → prepared-CARicKYh.js} +1 -1
  62. package/dist/{prepared-DdrjLC7L.cjs → prepared-Ch1x_Gog.cjs} +1 -1
  63. package/dist/{protocol-BzwMP4Vw.cjs → protocol-B5A2uom4.cjs} +1 -1
  64. package/dist/{protocol-kt4Iy6-3.js → protocol-BaiWjq5w.js} +3 -3
  65. package/dist/{record-bindings-DUX1VMlR.cjs → record-bindings-B86Sur_y.cjs} +1 -1
  66. package/dist/{record-bindings-CZWBJ1fU.js → record-bindings-D4TuMzHs.js} +1 -1
  67. package/dist/{region-binding-workflow-CWNvIjkV.js → region-binding-workflow-BNasF5kz.js} +2 -2
  68. package/dist/{region-binding-workflow-CqSMxQ4p.cjs → region-binding-workflow-O2Cni3mF.cjs} +1 -1
  69. package/dist/report-encoding-worker.cjs +1 -1
  70. package/dist/report-encoding-worker.js +1 -1
  71. package/dist/runtime-DakRXui3.js +170 -0
  72. package/dist/runtime-dL5ygIfa.cjs +1 -0
  73. package/dist/sbom.cdx.json +1 -1
  74. package/dist/server/node.d.cts +46 -0
  75. package/dist/server/node.d.ts +46 -0
  76. package/dist/server-node.cjs +4 -4
  77. package/dist/server-node.js +2540 -1911
  78. package/dist/server.cjs +1 -1
  79. package/dist/server.d.cts +174 -1
  80. package/dist/server.d.ts +174 -1
  81. package/dist/server.js +787 -544
  82. package/dist/style.css +1 -1
  83. package/dist/template-catalog-Dua8h9ZA.cjs +1 -0
  84. package/dist/{template-catalog-BtR2JmCL.js → template-catalog-wT1fNeAP.js} +4 -4
  85. package/dist/{template-fragments-BVsbxs4a.cjs → template-fragments-BajTajb4.cjs} +1 -1
  86. package/dist/{template-fragments-By0aZC1D.js → template-fragments-DmX5XK4N.js} +1 -1
  87. package/dist/{template-registry-C62vpv4a.cjs → template-registry-CpysHAxy.cjs} +1 -1
  88. package/dist/{template-registry-Cw3vRTX2.js → template-registry-u11fPd8D.js} +5 -5
  89. package/dist/{tree-BX380Rr7.cjs → tree-CLpxYbKa.cjs} +1 -1
  90. package/dist/{tree-CjVZLRw7.js → tree-DNJorJUf.js} +1 -1
  91. package/dist/vue/async.d.cts +108 -2
  92. package/dist/vue/async.d.ts +108 -2
  93. package/dist/vue/index.d.cts +130 -3
  94. package/dist/vue/index.d.ts +130 -3
  95. package/dist/vue-async.cjs +1 -1
  96. package/dist/vue-async.js +3 -3
  97. package/dist/vue.cjs +1 -1
  98. package/dist/vue.js +4 -4
  99. package/dist/{workbook-session-BeSO8PFB.js → workbook-session-B8pNW24X.js} +1 -1
  100. package/dist/{workbook-session-Cbts-22R.cjs → workbook-session-DN5LSA5C.cjs} +1 -1
  101. package/dist/worker.cjs +1 -1
  102. package/dist/worker.js +4 -4
  103. package/dist/xlsx.cjs +4 -4
  104. package/dist/xlsx.d.cts +88 -2
  105. package/dist/xlsx.d.ts +88 -2
  106. package/dist/xlsx.js +232 -230
  107. package/package.json +1 -1
  108. package/dist/ReportPreview-BcDKCLiK.js +0 -4834
  109. package/dist/ReportPreview-Bk9nLfO9.cjs +0 -6
  110. package/dist/RuleEditor-BX5S8RSF.cjs +0 -1
  111. package/dist/RuleEditor-CGl9XY2s.js +0 -2037
  112. package/dist/assets-CqIbfbTr.js +0 -126
  113. package/dist/assets-e4YSke8n.cjs +0 -1
  114. package/dist/capabilities-DDwXr_cA.js +0 -103
  115. package/dist/capabilities-DNLyZdNw.cjs +0 -1
  116. package/dist/computed-C-4C2S5h.js +0 -521
  117. package/dist/computed-CGV2a809.cjs +0 -1
  118. package/dist/dataset-BkRmwgeJ.cjs +0 -1
  119. package/dist/dataset-H5pFuQGU.js +0 -121
  120. package/dist/designer-CPPdeM5_.cjs +0 -2
  121. package/dist/diagnostic-notification-B9K9We3h.cjs +0 -1
  122. package/dist/diagnostic-notification-qGAYZdkB.js +0 -7
  123. package/dist/json-snapshot-DknkjvxP.cjs +0 -2
  124. package/dist/matrix-CGRGkn5s.js +0 -112
  125. package/dist/matrix-gEO7ZM_u.cjs +0 -1
  126. package/dist/runtime-BjKBI530.js +0 -168
  127. package/dist/runtime-CBFEPKEs.cjs +0 -1
  128. package/dist/template-catalog-C2NLdrwB.cjs +0 -1
@@ -1,7 +0,0 @@
1
- import { b as a, a as s } from "./progress-Hc2vxoCs.js";
2
- function u(i, t) {
3
- a(t.signal), s(() => t.onDiagnostic?.(i)), a(t.signal);
4
- }
5
- export {
6
- u as n
7
- };
@@ -1,2 +0,0 @@
1
- "use strict";const Y=require("./component-tree-DkGLEfZC.cjs"),C=require("./style-C22Pbv3T.cjs"),D=require("./textwrap-BI-yJ6Wt.cjs"),R=require("./record-bindings-DUX1VMlR.cjs"),ge=require("./computed-CGV2a809.cjs"),Ne=require("./matrix-gEO7ZM_u.cjs"),Q=require("./tree-BX380Rr7.cjs"),L=require("./template-registry-C62vpv4a.cjs"),Tt=require("./report-params-WDGrA4oP.cjs"),$e=require("./param-validation-C3HlcLLO.cjs"),he=require("./grid-geometry-CZ_cYB6O.cjs"),Ke=require("./number-format-CZ2T_5kF.cjs"),Le=require("./dataset-BkRmwgeJ.cjs");function Et(e,t,r){const o=new Set,n=e.cells.map((a,s)=>{const i=[];let c=0;for(const d of a){for(;o.has(`${s}:${c}`);)c++;const l=d?.colSpan??1,f=d?.rowSpan??1;let u=0;for(let m=c;m<c+l;m++){t.has(m)&&u++;for(let h=s+1;h<s+f;h++)o.add(`${h}:${m}`)}u&&i.push(d?{...d,colSpan:u}:null),c+=l}return i});return{...e,cells:n,colWidthsMm:r}}function je(e){if(!e.columns.some(o=>o.hidden))return e;const t=new Set,r=e.columns.filter((o,n)=>o.hidden?!1:(t.add(n),!0));if(!r.length)throw new Error("列表至少需要一列可见列");return{...e,columns:r,...e.headerGrid?{headerGrid:Et(e.headerGrid,t,r.map(o=>o.widthMm))}:{}}}function*Pt(e){const{page:t}=e;L.validateReportPageFlow(t.components,t.flow);let r=0,o=0;for(const n of L.reportFlowGroups(t.components,t.flow)){e.active();const a=n.band,s=n.components.some(l=>l.kind==="list"&&l.cardinality!=="record"),i=s?0:n.components.reduce((l,f)=>Math.max(l,f.topMm-a.topMm+(f.kind==="list"?e.height(f):f.heightMm)),a.heightMm);let c=Math.max(e.top(),o+a.topMm-r);if(!s&&i>e.bottom()-e.top()+.001)throw new Error(`静态区域 ${a.componentIds.join(",")} 高度超出单页可用范围`);!s&&c+i>e.bottom()+.001&&(e.nextPage(),yield*e.takePages(),e.active(),c=e.top());let d=c+i;for(const l of n.components){const f=c+l.topMm-a.topMm;l.kind==="list"?(yield*e.list(l,f,u=>{d=s?u:Math.max(d,u)}),e.active()):e.append({...l,topMm:f})}o=d,r=a.topMm+a.heightMm}}function Ct(e){return!!(e.computed?.length||e.groups?.length||e.groupBy||e.grandTotal||e.rowVisibleWhen||e.matrix||e.tree||e.detail||e.columns.some(t=>t.rules?.length||t.visibleWhen))}function Z(e){return e.pages.some(t=>t.components.some(r=>r.kind==="list"&&Ct(r)))}const kt=512,Ie=256*1024;function $t(){const e=new Map;let t=0,r;return(o,n,a,s)=>{s!==r&&(e.clear(),t=0,r=s);const i=JSON.stringify([o,n,a.fontSizePt,a.fontFamily,a.bold,a.italic,a.letterSpacingPt]),c=e.get(i);if(c)return e.delete(i),e.set(i,c),c.lines.slice();const d=D.wrapText(o,n,a,s),l=i.length+d.reduce((f,u)=>f+u.length,0);if(l<=Ie){for(;e.size>=kt||t+l>Ie;){const f=e.keys().next().value;t-=e.get(f).units,e.delete(f)}e.set(i,{lines:d.slice(),units:l}),t+=l}return d}}class K extends Error{constructor(t,r){super(`报表页数超出上限 ${t}(至少 ${r} 页)`),this.limit=t,this.actual=r,this.code="page-limit",this.name="PaginatePageLimitError"}}class B extends Error{constructor(t,r){super(`报表单元格数量超出上限 ${t}(至少 ${r} 格)`),this.limit=t,this.actual=r,this.code="cell-limit",this.name="PaginateCellLimitError"}}const Be=1e4,Oe=25e4;function pe(e){if(e?.aborted)throw e.reason??new DOMException("标签生成已取消","AbortError")}function De(e,t,r){const o=typeof e.copies=="object"?R.readRecordScalar(t,e.copies.field,r):e.copies??1;if(typeof o!="number"||!Number.isSafeInteger(o)||o<1||o>1e3)throw new R.ReportBindingError(`$.datasets.${r.dataset}[${r.rowIndex}]`,"每条记录复制数必须是 1..1000 的数值型整数",r.rowIndex,typeof e.copies=="object"?e.copies.field:void 0);return o}function He(e,t,r){if(e.rowKey===void 0)return;const o=R.readRecordScalar(t,e.rowKey,r);if(typeof o=="string"&&o.trim()||typeof o=="number"&&Number.isFinite(o))return o;throw new R.ReportBindingError(`$.datasets.${r.dataset}[${r.rowIndex}].${e.rowKey}`,"业务主键必须是非空字符串或有限数字",r.rowIndex,e.rowKey)}function It(e){const t=r=>1+(r.grid?.cells.reduce((o,n)=>o+1+n.length+n.reduce((a,s)=>a+(s?.children?.reduce((i,c)=>i+t(c),0)??0),0),0)??0);return e.pages.reduce((r,o)=>r+o.components.reduce((n,a)=>n+t(a),0),0)}function Ot(e,t,r){const o=e.repeat,n=Object.prototype.hasOwnProperty.call(t,o.dataset)?t[o.dataset]:void 0;if(!Array.isArray(n))throw new R.ReportBindingError(`$.datasets.${o.dataset}`,"逐记录标签数据集缺失,应提供对象数组(允许空数组)");const a=new Set,s=r.maxPages??Be,i=It(e);let c=0,d=0;for(const[l,f]of n.entries()){if(pe(r.signal),!f||typeof f!="object"||Array.isArray(f))throw new R.ReportBindingError(`$.datasets.${o.dataset}[${l}]`,"标签记录应为对象",l);const u={rowIndex:l,dataset:o.dataset},m=He(o,f,u);if(m!==void 0){const g=JSON.stringify([typeof m,m]);if(a.has(g))throw new R.ReportBindingError(`$.datasets.${o.dataset}[${l}].${o.rowKey}`,"业务主键重复;请先确认记录来源,避免重复打印标签",l,o.rowKey);a.add(g)}const h=De(o,f,u);if(c+=h*e.pages.length,d+=h*i,c>s)throw new K(s,c);if(d>Oe)throw new R.ReportBindingError("$.repeat",`标签组件总量(含网格行、槽位及嵌套组件)超过安全预算 ${Oe},请分批生成`,l)}return n}function Ft(e,t,r){if(!e.binding)return e;const{binding:o,...n}=e,a=R.resolveComponentBinding(o,t.row,t);if(e.kind==="image"){if(!a)return;if(!R.isLabelImageData(a))throw new R.ReportBindingError(`${r}.binding`,"图片字段只接受 PNG/JPEG base64 data URL;业务 URL 应由宿主安全加载后转换",t.rowIndex,o.field);return{...n,imageData:a}}return e.kind==="barcode"||e.kind==="qrcode"?(delete n.imageData,{...n,code:{...n.code,value:a},fallbackText:a}):(delete n.lines,delete n.richParagraphs,{...n,text:a})}function At(e,t,r){if(e.kind!=="text"||e.grid||e.richParagraphs?.length)return e;const o=e.style??{},n=C.resolveFontSize(o).fontSizePt,a=e.text??e.lines?.join(`
2
- `)??"";if(a.length>16384)throw new R.ReportBindingError(r,"标签文本超过 16384 字符预算,请缩小字段内容",t.rowIndex);const s=t.wrapText(a,e.widthMm,{fontSizePt:n,bold:o.bold,italic:o.italic,fontFamily:o.fontFamily,letterSpacingPt:o.letterSpacing},t.options.measurer??D.heuristicMeasurer),i=s.length*n*C.resolveLineHeight(o)*25.4/72;if(i>e.heightMm+.05)throw new R.ReportBindingError(r,`标签文字需要约 ${i.toFixed(2)}mm 高,超出 ${e.heightMm}mm;请增大文本区域、减少内容或调整字号`,t.rowIndex,e.binding?.field);return{...e,lines:s}}function Ge(e,t,r){pe(t.options.signal);const o=Ft(e,t,r);if(!o)return;let n=o.grid;return n&&(n={...n,cells:n.cells.map((a,s)=>a.map((i,c)=>i?.children?.length?{...i,children:i.children.flatMap((d,l)=>{const f=Ge(d,t,`${r}.grid.cells.${s}.${c}.children.${l}`);return f?[f]:[]})}:i))}),At(n===o.grid?o:{...o,grid:n},t,r)}function Nt(e,t,r,o,n,a){return{...e,components:e.components.flatMap((s,i)=>{const c=Ge(s,r,`$.pages.${t}.components.${i}`);return c?[{...c,meta:{...c.meta,labelSource:{pageIndex:t,componentIndex:i}}}]:[]}),meta:{...e.meta,record:{dataset:r.dataset,rowIndex:r.rowIndex,...a===void 0?{}:{rowKey:a},copyIndex:o,copyCount:n,templatePageIndex:t}}}}function*Kt(e,t,r){const o=[];if(L.validateTemplateRepeat(e,o),o.length)throw new R.ReportBindingError(o[0].path,o[0].message);if(!e.repeat){for(const[i,c]of e.pages.entries())yield{page:c,pageIndex:i};return}const n=e.repeat,a=Ot(e,t,r),s=$t();for(const[i,c]of a.entries()){const d={row:c,rowIndex:i,dataset:n.dataset,options:r,wrapText:s},l=De(n,c,d),f=He(n,c,d);for(let u=0;u<l;u++)for(const[m,h]of e.pages.entries())pe(r.signal),yield{page:Nt(h,m,d,u,l,f),pageIndex:m}}}function Lt(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function U(e,t){const r=t.heightMm-(e.layout==="wide"?t.marginBottomMm:e.marginBottomMm??t.marginBottomMm);return e.components.reduce((o,n)=>n.kind!=="list"&&n.pageAnchor==="footer"?Math.min(o,n.topMm):o,r)}function _(e){return e.components.reduce((t,r)=>r.kind!=="list"&&r.pageAnchor==="header"?Math.max(t,r.topMm+r.heightMm):t,0)}function Ve(e,t){let r=e.textMetrics.get(t);if(!r){const o=C.resolveFontSize(t).fontSizePt;r={measureOptions:{fontSizePt:o,fontFamily:t.fontFamily??C.DEFAULT_FONT_FAMILY,italic:t.italic,bold:t.bold,letterSpacingPt:t.letterSpacing},lineMm:o*(t.lineHeight??C.LINE_HEIGHT)*25.4/72},e.textMetrics.set(t,r)}return r}function jt(e){if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e}function we(e,t){const r=e.fontSizePt??C.DEFAULT_FONT_PT,o=e.paddingMm??1,n=e.columns.map(g=>g.align??g.style?.align??e.align??"left"),a=e.columns.map((g,w)=>({...C.mergeComponentStyles({fontSize:r,verticalAlign:"middle"},g.style),align:n[w]==="auto"?"left":n[w]})),s=a.map((g,w)=>n[w]==="auto"?{left:g,center:{...g,align:"center"},right:{...g,align:"right"}}:void 0),i=e.columns.map((g,w)=>g.rules?.map(y=>{const v=s[w];if(v)return{left:C.mergeComponentStyles(v.left,y.style),center:C.mergeComponentStyles(v.center,y.style),right:C.mergeComponentStyles(v.right,y.style)};const T=C.mergeComponentStyles(a[w],y.style);return{left:T,center:T,right:T}})),c=e.columns.map(g=>R.resolveListHeaderStyle(e,g)),d=e.columns.map(g=>g.header);let l=e.rowHeightMm??0;for(let g=0;g<d.length;g++){const w=c[g],y=C.resolveFontSize(w).fontSizePt,v=D.wrapText(d[g],e.columns[g].widthMm-o*2,{fontSizePt:y,fontFamily:w.fontFamily??C.DEFAULT_FONT_FAMILY,italic:w.italic,bold:w.bold,letterSpacingPt:w.letterSpacing},t),T=y*(w.lineHeight??C.LINE_HEIGHT)*25.4/72;l=Math.max(l,Math.max(v.length,1)*T+o*2)}const f=d.map((g,w)=>({text:g,style:c[w]})),u=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0},m=e.columns.map(g=>g.widthMm),h=Bt(e.headerGrid,m,{cells:[f],colWidthsMm:m,rowHeightsMm:[l],paddingMm:o});return{fontSizePt:r,paddingMm:o,cellStyles:a,autoStyles:s,ruleStyles:i,textMetrics:new WeakMap,numberFormats:e.columns.map(g=>R.toExcelNumberFormat(g.format)),derivedFields:new Set(e.computed?.map(g=>g.field)),borderStyle:u,headerHeightMm:h.rowHeightsMm.reduce((g,w)=>g+w,0),headerGrid:h,colWidthsMm:m,columns:e.columns}}function Bt(e,t,r){if(!e)return r;if(!e.cells.length)throw new Error("自定义列表表头至少需要一行");const o=e.rowHeightsMm??e.cells.map(()=>r.rowHeightsMm[0]);if(o.length!==e.cells.length||o.some(n=>!Number.isFinite(n)||n<=0))throw new Error("自定义列表表头行高无效");return{...e,colWidthsMm:t,rowHeightsMm:o}}function Dt(e,t,r){const o=t.format?.kind==="number"||t.format?.kind==="percent";t.valueType!==void 0?e.valueType=t.valueType:o&&(e.valueType="number"),t.editable!==void 0&&(e.editable=t.editable),(typeof e.value=="number"||e.value==null)&&r!==void 0&&(e.numberFormat=r)}function W(e,t,r){const o=e.columns,n=e.tree?.rows.get(t);let a=e.rowHeightFloorMm;const s=new Array(o.length);for(let i=0;i<o.length;i++){const c=o[i],d=c.visibleWhen&&!R.evalStyleRule(t,c.visibleWhen)?null:t[c.field],l=e.autoStyles[i]?R.resolveListAutoAlignment(d,c.format,c.semanticRole):"left";let f=e.autoStyles[i]?.[l]??e.cellStyles[i];if(c.rules)for(let v=0;v<c.rules.length;v++){const T=c.rules[v];if(R.evalStyleRule(t,T.when)){f=e.ruleStyles[i][v][l];break}}const u=c.format?R.formatValue(d,c.format):R.listCellText(d),m=Ht(e,c,n);f=Gt(e,c,f,n);const h=Ve(e,f),g=D.wrapText(u,Math.max(1,c.widthMm-e.paddingMm*2-m),h.measureOptions,r);a=Math.max(a,g.length*h.lineMm+e.paddingMm*2);const w=jt(d),y={text:u,style:f};w!==void 0&&(y.value=w),Dt(y,c,e.numberFormats[i]),Vt(y,c,e,n,m),e.derivedFields.has(c.field)&&(y.derived=!0,y.editable=!1),c.visibleWhen&&d===null&&!R.evalStyleRule(t,c.visibleWhen)&&(y.editable=!1),s[i]=y}return{grid:{cells:[s],colWidthsMm:e.colWidthsMm,rowHeightsMm:[a],paddingMm:e.paddingMm},heightMm:a}}function Ht(e,t,r){return!r||t.field!==e.tree.list.tree.labelField?0:R.listTreeIndent(e.tree.list,t,r,e.paddingMm)}function Gt(e,t,r,o){return!o||t.field!==e.tree.list.tree.labelField||r.align==="left"?r:{...r,align:"left"}}function Vt(e,t,r,o,n=0){o&&(n&&(e.indentMm=n),R.applyListTreeMetadata(e,t,o,r.tree.list))}function _e(e){if(e!=null&&typeof e!="string"&&typeof e!="boolean"&&!(typeof e=="number"&&Number.isFinite(e)))throw new Error("分组字段应为有限 JSON 标量");return JSON.stringify([typeof e,e??null])}function*We(e,t,r=0){const o=t[r];if(!o){for(const a of e)yield{kind:"row",row:a};return}const n=new Map;for(const a of e){const s=_e(a[o.field]),i=n.get(s);i?i.push(a):n.set(s,[a])}for(const a of n.values())yield{kind:"groupHeader",label:(o.headerTemplate??"{value}").replace(/\{value\}/g,R.listCellText(a[0][o.field])),firstRow:a[0],group:o,depth:r,rows:a},yield*We(a,t,r+1),(o.subtotal?.length||o.aggregates?.length)&&(yield{kind:"subtotal",label:o.subtotalLabel??"小计",rows:a,group:o,depth:r}),yield{kind:"groupEnd",depth:r}}function Je(e,t,r,o=[]){const n=[...r.filter(a=>!o.some(s=>s.field===a)).map(a=>({field:a,op:"sum"})),...o];return new Map(n.map(a=>{const s=e.find(c=>c.field===a.field)?.format??{kind:"number",thousands:!0},i=ge.aggregateRows(t,{...a,field:a.valueField??a.field});return[a.field,{text:R.formatValue(i,s),...i===null?{}:{value:i},...typeof i=="number"?{numberFormat:R.toExcelNumberFormat(s)}:{}}]}))}function qe(e,t){const r=e.findIndex(o=>t.includes(o.field));return r<0?1:r}function V(e,t,r,o,n,a){const s=[],i=Math.max(0,Math.min(a,e.columns.length)),c=C.mergeComponentStyles({fontSize:e.fontSizePt},n);i&&s.push({text:r,colSpan:i,style:{bold:!0,...c}});for(let u=i;u<e.columns.length;u++){const m=e.columns[u],h=o.get(m.field),g=e.autoStyles[u]?.[R.resolveListAutoAlignment(h?.value,m.format)]??e.cellStyles[u];s.push({...h,text:h?.text??"",style:C.mergeComponentStyles(g,n)})}const d={text:r,colSpan:e.columns.length,style:{bold:!0,...c}},l=i?[s]:[[d],s],f=l.map(u=>_t(e,u,t));return{grid:{cells:l,colWidthsMm:e.colWidthsMm,rowHeightsMm:f,paddingMm:e.paddingMm},heightMm:f.reduce((u,m)=>u+m,0)}}function _t(e,t,r){let o=e.rowHeightFloorMm,n=0;for(const a of t){let s=0;const i=n+(a.colSpan??1);for(;n<i;n++)s+=e.colWidthsMm[n]??0;const c=Ve(e,a.style),d=D.wrapText(a.text??"",s-e.paddingMm*2,c.measureOptions,r);o=Math.max(o,d.length*c.lineMm+e.paddingMm*2)}return o}function Wt(e,t,r){const{templatePage:o,current:n,warnings:a,nextId:s,pushCurrent:i}=r,c=()=>U(o,n),d=Math.max(n.marginTopMm,_(o)),l=o.layout==="wide"?_(o):d,f={id:r.tableId,columnKeys:e.columns.map(p=>p.field),...e.layout===void 0?{}:{layout:e.layout},...e.title===void 0?{}:{title:e.title}},u=new Map,m=new Map,h={kind:"rect",leftMm:e.leftMm,topMm:0,widthMm:e.widthMm,heightMm:t.headerHeightMm,grid:t.headerGrid,nid:s("listh"),table:{...f,role:"header",rowIndex:-1},style:t.borderStyle,...e.meta?{meta:e.meta}:{}},g=p=>n.components.push({...h,topMm:p});if(r.flow&&e.header!==!1&&t.headerHeightMm>c()-d+.001)throw new Error(`流式列表 ${e.id??e.dataset} 的表头高度超出单页可用范围`);let w=Math.max(r.startTop??e.topMm,d);e.header!==!1&&(g(w),w+=t.headerHeightMm+r.mmPerRow);function y(){const p=Math.max(r.flow||o.layout==="wide"?0:e.topMm,l);return(e.header!==!1&&e.headerEveryPage!==!1?p+t.headerHeightMm:l)+[...m.values()].reduce((x,P)=>x+P.heightMm,0)}function v(){const p=o.layout==="wide"?0:n.marginBottomMm;return Math.min(o.heightMm-p,U(o,n))-y()}function T(p){if(w+p<=c())return;i(),n.components=[],n.heightMm=o.heightMm,o.layout==="wide"&&(n.marginTopMm=0,n.marginBottomMm=0);const M=Math.max(r.flow||o.layout==="wide"?0:e.topMm,l);e.header!==!1&&e.headerEveryPage!==!1?(g(M),w=M+t.headerHeightMm):w=l;for(const x of m.values())N(x,"listgr","group-header")}function S(p,M,x,P){const k=v();if(r.flow&&p.heightMm>k+.001)throw new Error(`流式列表 ${e.id??e.dataset} 的单行高度超出单页可用范围`);p.heightMm>k&&a.push(`列表 ${e.id??e.dataset} 行高 ${p.heightMm.toFixed(2)}mm 超出单页可用高度 ${k.toFixed(2)}mm,预览与打印可能截断内容`),T(p.heightMm),N(p,M,x,P)}function N(p,M,x,P){const k=p.table?.id??f.id,A=x==="header"?-1:u.get(k)??0;x!=="header"&&u.set(k,A+p.grid.cells.length),n.components.push({kind:"rect",leftMm:e.leftMm,topMm:w,widthMm:e.widthMm,heightMm:p.heightMm,grid:p.grid,nid:s(M),table:{...f,...p.table,role:x,rowIndex:A,...P?{source:P}:{}},style:t.borderStyle,...e.meta?{meta:e.meta}:{}}),w+=p.heightMm}function F(p){p<=v()&&T(p)}return{keepTogether:F,placeGridRow:S,setGroupHeader:(p,M)=>{M?m.set(p,M):m.delete(p)},bottom:()=>w}}function Jt(e,t){if(!e.rowKey)return;const r=t[e.rowKey];if((typeof r!="string"||!r.trim())&&!(typeof r=="number"&&Number.isFinite(r)))throw new Error(`数据集 ${e.dataset} 的 ${e.rowKey} 应为稳定的字符串或有限数字主键`);const o=e.revisionField?t[e.revisionField]:void 0,n=e.sourceTokenField?t[e.sourceTokenField]:void 0;if(o!==void 0&&typeof o!="string"&&!(typeof o=="number"&&Number.isFinite(o)))throw new Error("业务修订号应为字符串或有限数字");if(n!==void 0&&typeof n!="string")throw new Error("来源令牌应为字符串");return{datasetId:e.dataset,rowKey:r,...o===void 0?{}:{revision:o},...n===void 0?{}:{sourceToken:n}}}function ee(e,t){const r=new Map;if(!e.rowKey)return r;const o=new Set;for(const n of t){const a=Jt(e,n),s=JSON.stringify(a.rowKey);if(o.has(s))throw new Error(`数据集 ${e.dataset} 的业务主键重复:${String(a.rowKey)}`);o.add(s),r.set(n,a)}return r}function qt(e,t,r,o,n){if(!e.grandTotal)return;const a=typeof e.grandTotal=="object"?e.grandTotal:void 0,s=te(e)[0],i=a?.fields??s?.subtotal??[],c=a?.aggregates??s?.aggregates??[];if(i.length===0&&c.length===0){o.warnings.push(`列表 ${e.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`);return}const d=V(r,o.measurer,a?.label??"合计",Je(e.columns,t,i,c),a?.style??{},qe(e.columns,[...i,...c.map(l=>l.field)]));n.placeGridRow(d,"listgt","grand-total")}function J(e){if(e?.aborted){const t=new Error("报表排版已取消");throw t.name="AbortError",t}}function te(e){const t=e.groups??(e.groupBy?[e.groupBy]:[]);if(t.length>16)throw new Error("列表最多支持 16 级分组");return t}function ye(e){const t=je(e),r=t.columns.reduce((n,a)=>n+a.widthMm,0),o=r>t.widthMm?t.widthMm/r:1;return o===1?t:{...t,columns:t.columns.map(n=>({...n,widthMm:n.widthMm*o}))}}function zt(e,t,r){const o=e.detail;if(!o)return;const n=new Set;for(const d of t){const l=le(d[o.parentKey]);if(n.has(l))throw new Error("主从明细的主表关联键重复");n.add(l)}const a=r.datasets[o.dataset]??[],s=new Map,i=[];for(const d of a){const l=d[o.foreignKey];if(!ze(l)&&o.unmatched==="ignore")continue;const f=le(l);if(!n.has(f)){if(o.unmatched!=="ignore")throw new Error(`明细数据集 ${o.dataset} 存在未关联的业务键`);continue}const u=s.get(f);u?u.push(d):s.set(f,[d]),i.push(d)}const c=ye({...e,id:`${e.id??e.dataset}:detail`,dataset:o.dataset,rowKey:o.rowKey,revisionField:o.revisionField,sourceTokenField:o.sourceTokenField,computed:void 0,columns:o.columns,headerGrid:void 0,rowHeightMm:o.rowHeightMm??e.rowHeightMm,detail:void 0});return{list:c,inter:{...we(c,r.measurer),rowHeightFloorMm:c.rowHeightMm??0},rows:s,sources:ee(c,i)}}function ze(e){return typeof e=="string"&&!!e.trim()||typeof e=="number"&&Number.isFinite(e)}function le(e){if(!ze(e))throw new Error("主从关联键必须是非空字符串或有限数字");return _e(e)}function*Ut(e,t,r,o,n){if(!r)return;const a=r.rows.get(le(t[e.detail.parentKey]))??[];if(!a.length)return;const s={id:`${o.tableId}:detail`,columnKeys:r.list.columns.map(i=>i.field),title:e.detail.label};e.detail.label&&n.placeGridRow({...V(r.inter,o.measurer,e.detail.label,new Map,{},r.list.columns.length),table:s},"listdl","group-header"),e.detail.header!==!1&&n.placeGridRow({grid:r.inter.headerGrid,heightMm:r.inter.headerHeightMm,table:s},"listdh","header"),yield*o.takePages();for(const i of a)J(o.signal),n.placeGridRow({...W(r.inter,i,o.measurer),table:s},"listdr","body",r.sources.get(i)),yield*o.takePages()}function Xt(e,t){if(!e.matrix)return{list:e,rows:t};if(e.detail||e.groupBy||e.groups?.length||e.grandTotal)throw new Error("矩阵不能同时配置普通分组、总计或主从明细");const r=Ne.createMatrixTable(t,e.matrix),o=r.columns.map((a,s)=>({...a,widthMm:s===0?e.matrix.rowWidthMm??40:e.matrix.columnWidthMm??28,editable:!1,align:s===0?"center":"right"})),n={...e,columns:o,headerGrid:void 0,rowKey:void 0,revisionField:void 0,sourceTokenField:void 0};return e.layout==="wide"&&(n.widthMm=o.reduce((a,s)=>a+s.widthMm,0)),{list:n,rows:r.rows}}function Ue(e){if(e.matrix||e.detail||e.groups?.length||e.groupBy||e.rowVisibleWhen)throw new Error("树形布局不能同时配置普通分组、矩阵、主从或行可见条件");if(e.rowKey&&e.rowKey!==e.tree.idField)throw new Error("树形布局的 rowKey 应与 idField 一致");if(!e.columns.some(t=>t.field===e.tree.labelField&&!t.hidden))throw new Error("树形布局需要可见的标签列");Q.validateTreeComputed(e.tree,e.computed)}function Yt(e,t,r){Ue(e);const o=Q.createTreeTable(t,e.tree,{signal:r.signal,computed:e.computed?.length?{fields:e.computed,formula:r.formula}:void 0}),n={...e,rowKey:e.tree.idField},a=ee(n,o.entries.map(c=>c.original)),s=new Map,i=new WeakMap;for(const c of o.entries)s.set(c.row,a.get(c.original)),i.set(c.row,c);return{list:n,rows:o.rows,sources:s,treeRows:i,totalRows:o.leaves}}function Qt(e,t){if(e.cardinality==="record"){if(t.length>1)throw new Error(`单记录区域 ${e.id??e.dataset} 仅允许 0 或 1 行数据`);if(e.tree||e.matrix||e.detail||e.groups?.length||e.groupBy||e.grandTotal||e.rowVisibleWhen)throw new Error("单记录区域不能配置树、矩阵、主从、分组、总计或行过滤");if(!t.length)return{list:{...e,columns:e.columns.map(r=>({...r,editable:!1}))},rows:[{}],sources:new Map}}}function Xe(e,t,r){const o=r.prepared.get(e);if(o)return o;const n=Qt(e,t);if(n)return r.prepared.set(e,n),n;if(e.tree){const c=Yt(e,t,r);return r.prepared.set(e,c),c}let a=e.computed?.length?ge.computeDataset(t,{fields:e.computed,signal:r.signal,formula:r.formula}).rows:t;const s=a===t?void 0:new Map(a.map((c,d)=>[c,t[d]]));e.rowVisibleWhen&&(a=a.filter(c=>R.evalStyleRule(c,e.rowVisibleWhen)));const i=Xt(e,a);if(!e.matrix){const c=ee(e,s?a.map(d=>s.get(d)):a);i.sources=s?new Map(a.map(d=>[d,c.get(s.get(d))])):c}return r.prepared.set(e,i),i}function Zt(e,t,r,o){if(!o.flow)return;const{current:n,templatePage:a}=o,s=Math.max(n.marginTopMm,_(a)),i=Math.max(o.startTop??e.topMm,s),c=(e.header===!1?0:t.headerHeightMm)+(r[0]?W(t,r[0],o.measurer).heightMm:0);i+c<=U(a,n)+.001||i<=s+.001||(o.pushCurrent(),n.components=[],n.heightMm=a.heightMm,a.layout==="wide"&&(n.marginTopMm=0,n.marginBottomMm=0),o.startTop=Math.max(n.marginTopMm,_(a)))}function*er(e,t,r){const o=Xe(e,t,r),n=o.rows;e=o.list,e.layout==="wide"&&(r.current.widthMm=Math.max(r.current.widthMm,e.leftMm+e.widthMm+r.current.marginRightMm));const a=o.sources??ee(e,n),s=ye(e),i=te(s),c={...we(s,r.measurer),rowHeightFloorMm:s.rowHeightMm??0,...o.treeRows?{tree:{list:s,rows:o.treeRows}}:{}};Zt(s,c,n,r);const d=Wt(s,c,r),l=zt(s,n,r);let f;for(const u of We(n,i)){if(J(r.signal),u.kind==="row")d.placeGridRow(f??W(c,u.row,r.measurer),"listr","body",a.get(u.row)),f=void 0,yield*r.takePages(),yield*Ut(s,u.row,l,r,d);else if(u.kind==="groupHeader"){const m=V(c,r.measurer,u.label,new Map,u.group.headerStyle??{},s.columns.length);f??=W(c,u.firstRow,r.measurer);const h=i.slice(u.depth+1).reduce((g,w)=>g+V(c,r.measurer,(w.headerTemplate??"{value}").replace(/\{value\}/g,R.listCellText(u.firstRow[w.field])),new Map,w.headerStyle??{},s.columns.length).heightMm,0);u.group.keepWithNext!==!1&&d.keepTogether(m.heightMm+h+f.heightMm),d.placeGridRow(m,"listg","group-header"),u.group.repeatHeader&&d.setGroupHeader(u.depth,m)}else if(u.kind==="subtotal"){const m=u.group.subtotal??[],h=u.group.aggregates??[],g=V(c,r.measurer,u.label,Je(s.columns,u.rows,m,h),u.group.subtotalStyle??{},qe(s.columns,[...m,...h.map(w=>w.field)]));d.placeGridRow(g,"listst","subtotal")}else d.setGroupHeader(u.depth);yield*r.takePages()}qt(s,o.totalRows??n,c,r,d),r.finished?.(d.bottom()),yield*r.takePages()}function re(e){return e.kind!=="list"&&(e.pageAnchor!==void 0||e.kind==="text"&&typeof e.text=="string"&&(e.text.includes("{page}")||e.text.includes("{totalPages}")))}function oe(e,t){return{...e,...e.text===void 0?{}:{text:t(e.text)},...e.lines?{lines:e.lines.map(t)}:{},...e.richParagraphs?{richParagraphs:e.richParagraphs.map(r=>({...r,segments:r.segments.map(o=>({...o,...o.text===void 0?{}:{text:t(o.text)}}))}))}:{},...e.grid?{grid:{...e.grid,cells:e.grid.cells.map(r=>r.map(o=>o?{...o,...o.text===void 0?{}:{text:t(o.text)},...o.children?{children:o.children.map(n=>oe(n,t))}:{}}:null))}}:{}}}function tr(e){let t=!1;for(const r of e.pages)for(const o of r.components)re(o)&&oe(o,n=>(n.includes("{totalPages}")&&(t=!0),n));return t}function rr(e,t,r,o,n,a){const s={pageWidthMm:t.widthMm,pageHeightMm:t.heightMm,...e.layout===void 0?{}:{layout:e.layout},marginTopMm:t.marginTopMm,marginBottomMm:t.marginBottomMm,marginLeftMm:t.marginLeftMm,marginRightMm:t.marginRightMm,components:t.components,...e.meta?{meta:e.meta}:{}},i=c=>{const d=c.replace(/\{page\}/g,String(o));return a===void 0?d:d.replace(/\{totalPages\}/g,String(a))};for(const c of r)s.components.push(oe(c,i));if(e.layout==="wide"){const c=s.components.reduce((d,l)=>Math.max(d,l.topMm+l.heightMm),0);s.marginBottomMm=n?e.marginBottomMm??0:0,s.pageHeightMm=Math.max(1,c+s.marginBottomMm)}return s}function be(e){return e.cells.reduce((t,r)=>t+r.reduce((o,n)=>o+(n?1+(n.children?.reduce((a,s)=>a+Ye(s),0)??0):0),0),0)}function Ye(e){return e.grid?be(e.grid):0}function Me(e){for(const t of["maxPages","maxCells","knownTotalPages"])if(e[t]!==void 0&&(!Number.isSafeInteger(e[t])||e[t]<1))throw new RangeError(`${t} 应为正安全整数`)}function or(e,t){const r=Xe(e,t.datasets[e.dataset]??[],t),o=ye(r.list),n={...we(o,t.measurer),rowHeightFloorMm:o.rowHeightMm??0};return(o.header===!1?0:n.headerHeightMm)+r.rows.reduce((a,s)=>a+W(n,s,t.measurer).heightMm,0)}function*nr(e){const{templatePage:t,current:r}=e,o=new Map(t.components.map((a,s)=>[a,s])),n=(a,s,i)=>{const c=e.datasets[a.dataset];return Array.isArray(c)||e.warnings.push(`数据集 ${a.dataset} 未提供数据,列表 ${a.id??""} 输出为空`),er(a,Array.isArray(c)?c:[],{...e,tableId:`${e.tableId}:${o.get(a)}`,startTop:s,finished:i,flow:!!t.flow})};if(t.flow){yield*Pt({page:t,active:()=>J(e.signal),top:()=>Math.max(r.marginTopMm,_(t)),bottom:()=>U(t,r),append:a=>{r.components.push(a)},nextPage:()=>{e.pushCurrent(),r.components=[],r.heightMm=t.heightMm,t.layout==="wide"&&(r.marginTopMm=0,r.marginBottomMm=0)},takePages:e.takePages,height:a=>or(a,e),list:n});return}for(const a of t.components)re(a)||(a.kind==="list"?yield*n(a):r.components.push(a))}function*X(e,t,r,o,n,a=new WeakMap){let s=0,i=0,c=0;const d=l=>`${l}_${(++s).toString(36)}`;for(const{pageIndex:l,page:f}of Kt(e,t,r)){J(r.signal);const u=Lt(f),m=f.components.filter(re);let h=[];const g=(y=!1)=>{if(J(r.signal),r.maxPages!==void 0&&i>=r.maxPages)throw new K(r.maxPages,i+1);if(r.maxCells!==void 0&&(c+=[...u.components,...m].reduce((v,T)=>v+Ye(T),0),c>r.maxCells))throw new B(r.maxCells,c);h.push(rr(f,u,m,++i,y,n))},w=()=>{const y=h;return h=[],y};yield*nr({templatePage:f,current:u,warnings:o,nextId:d,pushCurrent:g,takePages:w,datasets:t,signal:r.signal,formula:r.formula,prepared:a,measurer:r.measurer??D.heuristicMeasurer,mmPerRow:r.mmPerRow??0,tableId:`table:${l}`}),g(!0),yield*w()}}function ar(e,t,r={}){Me(r);let o=0;for(const n of X(e,t,{...r,onWarning:void 0},[]))o++;return o}function*Qe(e,t,r={}){Me(r);const o=tr(e),n=new WeakMap;let a=r.knownTotalPages;if(o&&a===void 0){a=0;for(const c of X(e,t,r,[],void 0,n))a++}const s=[];let i=0;for(const c of X(e,t,r,s,a,n)){for(;i<s.length;i++)r.onWarning?.(s[i]);yield c}}function ve(e,t,r={}){const o=typeof r=="number"?{mmPerRow:r}:r;Me(o);const n=[],a=[...X(e,t,o,n,o.knownTotalPages)];for(const s of a)s.components=s.components.map(i=>re(i)?oe(i,c=>c.replace(/\{totalPages\}/g,String(a.length))):i);return n.forEach(s=>o.onWarning?.(s)),{plan:{schemaVersion:Y.RENDER_PLAN_SCHEMA_VERSION,...Z(e)?{requiresRecalculation:!0}:{},pages:a},warnings:n}}function sr(e){const t=e.columns.find(a=>!a.hidden)?.field;if(!t)return{groups:0,total:0};const r=te(e),o=(a=[],s=[])=>a.includes(t)||s.some(i=>i.field===t),n=typeof e.grandTotal=="object"?e.grandTotal:void 0;return{groups:r.filter(a=>o(a.subtotal,a.aggregates)).length,total:Number(o(n?.fields??r[0]?.subtotal,n?.aggregates??r[0]?.aggregates))}}function ir(e,t,r){Ue(e);const o=Q.flattenTreeInput(t[e.dataset]??[],e.tree,r),n=e.columns.filter(s=>!s.hidden).length,a=e.header===!1?0:e.headerGrid?be(e.headerGrid):n;return o.length*n+a+ +!!e.grandTotal*2*n}function cr(e,t,r={}){if(e.tree)return ir(e,t,r.signal);if(e.matrix){let c=t[e.dataset]??[];e.computed?.length&&(c=ge.computeDataset(c,{fields:e.computed,...r}).rows),e.rowVisibleWhen&&(c=c.filter(l=>R.evalStyleRule(l,e.rowVisibleWhen)));const d=Ne.estimateMatrixTable(c,e.matrix);return d.cells+d.columnCount}const o=t[e.dataset]?.length??0,n=e.columns.filter(c=>!c.hidden).length,a=te(e).length,s=sr(e);let i=(o*(1+2*a+s.groups)+ +!!e.grandTotal*(1+s.total))*n;if(i+=e.header===!1?0:e.headerGrid?be(e.headerGrid):n,e.cardinality==="record"&&o===0&&(i+=n),e.detail){const c=t[e.detail.dataset]?.length??0,d=e.detail.columns.filter(l=>!l.hidden).length;i+=(c+o*(+(e.detail.header!==!1)+ +!!e.detail.label))*d}if(!Number.isSafeInteger(i))throw new RangeError("报表单元格估算超出安全整数预算");return i}function Ze(e){return!e||typeof e!="object"?!1:[e.pageIndex,e.componentIndex,e.rowIndex,e.columnIndex].every(t=>Number.isInteger(t)&&t>=0)}function et(e,t,r){const o=e.grid;if(!o)return null;const n=o.cells[t];if(!n)return null;const s=he.resolveGridLayout(o,e.widthMm,e.heightMm).cells.filter(c=>c.ri===t).findIndex(c=>c.ci===r),i=n[s];return i?{cell:i,sourceColumnIndex:s}:null}function lr(e){return e.value!==void 0?e.value:e.rawText??e.text??null}function dr(e,t){return e.valueType?e.valueType:typeof t=="number"?"number":typeof t=="boolean"?"boolean":t===null&&e.numberFormat&&/[0#?]/.test(e.numberFormat)?"number":"text"}function ur(e,t){if(e.derived)return"derived";if(e.editable===!1)return"cell";if(e.formula!==void 0)return"formula";if(e.children?.length||e.richParagraphs?.length)return"complex";if(t.table&&t.table.role!=="body"&&e.editable!==!0)return"structure"}function fr(e,t){const r=e.table;if(r)return{id:r.id,rowIndex:r.rowIndex+t.rowIndex,role:r.role,columnKey:r.columnKeys[t.columnIndex]}}function mr(e,t,r){if(e.derived)return;if(e.source)return{...e.source};const o=t.table?.source,n=t.table?.columnKeys[r.columnIndex];if(!(!o||o.rowKey===void 0||n===void 0))return{...o,rowKey:o.rowKey,field:n}}function tt(e,t,r){const o=lr(r),n=ur(r,e);return{address:{...t},cell:r,component:e,value:o,valueType:dr(r,o),table:fr(e,t),source:mr(r,e,t),editable:n===void 0,readOnlyReason:n}}function ne(e,t){if(!Ze(t))return null;const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r)return null;const o=et(r,t.rowIndex,t.columnIndex);return o?tt(r,t,o.cell):null}function j(e){const t=new Map;return r=>{if(!Ze(r))return null;const o=e.pages[r.pageIndex]?.components[r.componentIndex];if(!o?.grid)return null;let n=t.get(o);if(!n){const s=new Map;n=new Map;for(const i of he.resolveGridLayout(o.grid,o.widthMm,o.heightMm).cells){const c=s.get(i.ri)??0;s.set(i.ri,c+1);const d=o.grid.cells[i.ri]?.[c];d&&n.set(`${i.ri}:${i.ci}`,d)}t.set(o,n)}const a=n.get(`${r.rowIndex}:${r.columnIndex}`);return a?tt(o,r,a):null}}class b extends Error{constructor(t){super(`Invalid report cell edit: ${t}`),this.code=t,this.name="ReportCellEditError"}}function gr(e,t){let r=e.trim();const o=t&&r.endsWith("%");if(o&&(r=r.slice(0,-1).trim()),/^[+-]?\d{1,3}(?:,\d{3})+(?:\.\d*)?(?:[eE][+-]?\d+)?$/.test(r)&&(r=r.replace(/,/g,"")),!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(r))throw new b("number");return Number(r)/(o?100:1)}function hr(e,t){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e!="string"&&typeof e!="number")throw new b("number");const r=typeof e=="number"?e:gr(e,Ke.isExcelPercentageFormat(t.cell.numberFormat));if(!Number.isFinite(r)||Number.isInteger(r)&&!Number.isSafeInteger(r))throw new b("number");return r}function pr(e){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e=="boolean")return e;const t=String(e).trim().toLowerCase();if(["true","yes","是","1"].includes(t))return!0;if(["false","no","否","0"].includes(t))return!1;throw new b("boolean")}function Se(e,t){return e.valueType==="number"?hr(t,e):e.valueType==="boolean"?pr(t):t===null?null:String(t)}function wr(e,t){const r=t.cell.text,n=[["是","否"],["TRUE","FALSE"],["True","False"],["true","false"],["1","0"]].find(a=>a.includes(r??""));return n?n[e?0:1]:String(e)}function H(e,t){return t===null?"":typeof t=="boolean"?wr(t,e):typeof t=="number"?Ke.formatExcelNumber(t,e.cell.numberFormat):String(t)}function yr(e,t,r){const o=ne(e,t);if(!o)throw new b("missing");return q(o,r)}function q(e,t){if(!e.editable)throw new b("readonly");const r=Se(e,t);return{address:{...e.address},table:e.table,source:e.source,previousValue:e.value,previousText:e.cell.text??"",value:r,text:H(e,r)}}function br(e,t){const r=e.table,o=t.table;return!r||!o||r.columnKey===void 0?!1:r.id===o.id&&r.rowIndex===o.rowIndex&&r.role===o.role&&r.columnKey===o.columnKey}function rt(e,t,r){const o=e.grid,{rowIndex:n,columnIndex:a}=t.address,s=et(e,n,a),i=[...o.cells],c=[...i[n]],d=H(t,r.value),l={...s.cell,value:r.value,text:d,rawText:d};return c[s.sourceColumnIndex]=l,i[n]=c,{...e,grid:{...o,cells:i}}}function Mr(e,t){const r=e.table?.columnKeys,o=t.table?.columnKey;return r&&o!==void 0?r.flatMap((n,a)=>n===o?[a]:[]):[]}function vr(e,t,r,o,n,a){const s=t.table,i=n.table;if(!s||!i||s.id!==i.id||s.role!==i.role||!t.grid)return t;const c=i.rowIndex-s.rowIndex;if(c<0||c>=t.grid.cells.length)return t;let d=t;for(const l of Mr(t,n)){const f=ne(e,{pageIndex:r,componentIndex:o,rowIndex:c,columnIndex:l});f?.editable&&br(n,f)&&(d=rt(d,f,a))}return d}function Sr(e,t,r,o,n,a){const s=n.address;return n.table?.columnKey!==void 0?vr(e,t,r,o,n,a):s.pageIndex===r&&s.componentIndex===o?rt(t,n,a):t}function xe(e,t){const r=t.source;if(!r)return!1;const o=e.source;return!o||["sourceScope","datasetId","rowKey","field","revision","sourceToken"].some(n=>!Object.is(o[n],r[n]))}function xr(e,t){const r=ne(e,t.address);if(!r)throw new b("missing");if(!r.editable)throw new b("readonly");if(xe(r,t))throw new b("conflict");if(!Object.is(r.value,t.previousValue)||(r.cell.text??"")!==t.previousText)throw new b("conflict");const o=Se(r,t.value),n={...t,value:o,text:H(r,o)};if(Object.is(o,r.value)&&n.text===r.cell.text)return e;const a=e.pages.map((s,i)=>{const c=s.components.map((d,l)=>Sr(e,d,i,l,r,n));return c.every((d,l)=>d===s.components[l])?s:{...s,components:c}});return{...e,pages:a}}function ot(e){const t=[];for(const r of e.template.pages)for(const o of r.components)o.kind==="list"&&(t.push(o.tree?{...o,rowKey:o.tree.idField}:o),o.detail&&t.push({...o.detail,relation:{detail:o.detail,parentRows:e.datasets[o.dataset]??[]}}));return t}function G(e){return JSON.stringify([e.sourceScope,e.datasetId])}function Fe(e){return JSON.stringify([e.sourceScope,e.datasetId,e.rowKey])}function nt(e){const t=new Map,r=new Set;return e.forEach((o,n)=>{for(const a of ot(o)){if(!a.rowKey)continue;const s=a.relation,i=s?new Set(s.parentRows.map(c=>JSON.stringify(c[s.detail.parentKey]))):void 0;(o.datasets[a.dataset]??[]).forEach((c,d)=>{if(s&&!i.has(JSON.stringify(c[s.detail.foreignKey])))return;const l=c[a.rowKey];if(typeof l!="string"&&typeof l!="number")return;const f=`${n}:${a.dataset}:${d}:${a.rowKey}`;if(r.has(f))return;r.add(f);const u=Fe({sourceScope:o.sourceScope,datasetId:a.dataset,rowKey:l}),m=t.get(u)??[];m.push({partIndex:n,dataset:a.dataset,rowIndex:d,row:c,binding:a}),t.set(u,m)})}}),o=>{const n=t.get(Fe(o));if(!n?.length)throw new b("missing");if(new Set(n.map(a=>`${a.partIndex}:${a.dataset}`)).size!==n.length)throw new b("conflict");return n}}function at(e,t){const r=e.map(n=>({...n,datasets:{...n.datasets}})),o=new Set;for(const{row:n,field:a,value:s}of t){const i=r[n.partIndex],c=`${n.partIndex}:${n.dataset}`;o.has(c)||(i.datasets[n.dataset]=[...i.datasets[n.dataset]],o.add(c)),i.datasets[n.dataset][n.rowIndex]={...i.datasets[n.dataset][n.rowIndex],[a]:s}}return r}function Rr(e,t,r){const o=[],n=new Set;return e.forEach((a,s)=>{for(const i of ot(a))t.has(G({sourceScope:a.sourceScope,datasetId:i.dataset}))&&(a.datasets[i.dataset]??[]).forEach((c,d)=>{const l={partIndex:s,dataset:i.dataset,rowIndex:d,row:c,binding:i};for(const[f,u]of[[i.revisionField,r.revision],[i.sourceTokenField,r.sourceToken]]){if(!f||u===void 0)continue;const m=`${s}:${i.dataset}:${d}:${f}`;n.has(m)||(n.add(m),o.push({row:l,field:f,value:u}))}})}),o}function st(e,t,r){if(!r||r.revision===void 0&&r.sourceToken===void 0)return e;const o=new Set(t.edits.flatMap(n=>n.source?[G(n.source)]:[]));return Re(e,new Map([...o].map(n=>[n,r])))}function Re(e,t){if(!t.size)return e;function r(a){const s=a.datasetId&&t.get(G({...a,datasetId:a.datasetId}));return!s||(s.revision===void 0||Object.is(s.revision,a.revision))&&(s.sourceToken===void 0||s.sourceToken===a.sourceToken)?a:{...a,...s.revision!==void 0?{revision:s.revision}:{},...s.sourceToken!==void 0?{sourceToken:s.sourceToken}:{}}}function o(a){const s=a.map(i=>{const c=i.table?.source?r(i.table.source):void 0,d=i.table&&c!==i.table.source?{...i.table,source:c}:i.table,l=i.grid?.cells.map(u=>{const m=u.map(h=>{if(!h)return h;const g=h.source?r(h.source):void 0,w=h.children?o(h.children):void 0;return g===h.source&&w===h.children?h:{...h,source:g,children:w}});return m.some((h,g)=>h!==u[g])?m:u}),f=i.grid&&l?.some((u,m)=>u!==i.grid.cells[m])?{...i.grid,cells:l}:i.grid;return d!==i.table||f!==i.grid?{...i,table:d,grid:f}:i});return s.some((i,c)=>i!==a[c])?s:a}const n=e.pages.map(a=>{const s=o(a.components);return s!==a.components?{...a,components:s}:a});return n.some((a,s)=>a!==e.pages[s])?{...e,pages:n}:e}function Tr(e){return JSON.stringify([e.pageIndex,e.componentIndex,e.rowIndex,e.columnIndex])}function Ae(e){const t=e.table;return t?.columnKey!==void 0?JSON.stringify([t.id,t.role,t.rowIndex,t.columnKey]):Tr(e.address)}function Er(e,t){if(!t.length)return e;const r=new Map(t.map(c=>[Ae(c),c])),o=new Set(t.flatMap(c=>c.table?[c.table.id]:[])),n=new Set(t.map(c=>`${c.address.pageIndex}:${c.address.componentIndex}`)),a=j(e);function s(c,d,l){const f=c.grid;if(!f||!n.has(`${d}:${l}`)&&!o.has(c.table?.id??""))return c;const u=new Map,m=new Map;for(const h of he.resolveGridLayout(f,c.widthMm,c.heightMm).cells){const g=m.get(h.ri)??0;m.set(h.ri,g+1);const w=a({pageIndex:d,componentIndex:l,rowIndex:h.ri,columnIndex:h.ci}),y=w&&r.get(Ae(w));if(!y||!w.editable)continue;const v=u.get(h.ri)??[...f.cells[h.ri]],T=H(w,y.value);Object.is(w.value,y.value)&&T===w.cell.text||(v[g]={...h.cell,value:y.value,text:T,rawText:T},u.set(h.ri,v))}return u.size?{...c,grid:{...f,cells:f.cells.map((h,g)=>u.get(g)??h)}}:c}const i=e.pages.map((c,d)=>{const l=c.components.map((f,u)=>s(f,d,u));return l.every((f,u)=>f===c.components[u])?c:{...c,components:l}});return i.every((c,d)=>c===e.pages[d])?e:{...e,pages:i}}function I(e){const t=e.source;if(t)return JSON.stringify([t.sourceScope,t.datasetId,t.rowKey,t.field]);const r=e.table;if(r?.columnKey!==void 0)return JSON.stringify([r.id,r.role,r.rowIndex,r.columnKey]);const o=e.address;return JSON.stringify([o.pageIndex,o.componentIndex,o.rowIndex,o.columnIndex])}function Pr(e,t,r){if(typeof r!="string"||!r.trim()||!Array.isArray(t))throw new b("missing");if(t.length>1e4)throw new b("limit");const o=new Set,n=j(e),a=t.map(({address:s,value:i})=>{const c=n(s);if(!c)throw new b("missing");const d=q(c,i),l=I(d);if(o.has(l))throw new b("duplicate");return o.add(l),d});return{requestId:r,edits:a}}function Cr(e,t){if(t.edits.length>1e4)throw new b("limit");const r=j(e),o=new Set,n=t.edits.map(a=>{const s=r(a.address);if(!s)throw new b("missing");const i=I(a);if(o.has(i))throw new b("duplicate");if(o.add(i),xe(s,a)||!Object.is(s.value,a.previousValue)||(s.cell.text??"")!==a.previousText)throw new b("conflict");return q(s,a.value)});return Er(e,n)}function kr(e){const t=new Map;for(const r of e){const o=I(r),n=t.get(o),a=n?{...r,previousValue:n.previousValue,previousText:n.previousText}:{...r};Object.is(a.previousValue,a.value)?t.delete(o):t.set(o,a)}return[...t.values()]}function it(e){const t=new Map,r=j(e);return e.pages.forEach((o,n)=>o.components.forEach((a,s)=>{if(!(!a.grid||a.table?.role!=="body"))for(let i=0;i<a.grid.cells.length;i++)for(let c=0;c<a.table.columnKeys.length;c++){const d=r({pageIndex:n,componentIndex:s,rowIndex:i,columnIndex:c});d?.source&&d.editable&&t.set(I(d),d)}})),t}function $r(e,t,r){const o=it(e),n=j(e);return t.map(a=>{const s=a.source?o.get(I(a)):n(a.address);if(!s||I(s)!==I(a))throw new b("missing");return{address:{...s.address},value:a[r]}})}function ct(e,t){if(++e.nodes>1e6||t>128)throw new b("limit")}function Te(e,t){const r=Object.getOwnPropertyDescriptor(e,t);if(!r||r.get||r.set)throw new b("conflict");return r.value}function lt(e){if(Object.getOwnPropertyDescriptor(e,"toJSON"))throw new b("conflict");const t=Object.getPrototypeOf(e);if(!(e instanceof Date)&&!Array.isArray(e)&&t!==Object.prototype&&t!==null)throw new b("conflict");for(const r of Reflect.ownKeys(e))if(!(Array.isArray(e)&&r==="length")){if(typeof r=="symbol"||!Object.getOwnPropertyDescriptor(e,r)?.enumerable)throw new b("conflict");if(e instanceof Date||Array.isArray(e)&&!/^(0|[1-9]\d*)$/.test(r))throw new b("conflict")}}function dt(e,t,r,o,n){if(ct(o,n),typeof e=="function"||typeof e=="symbol")throw new b("conflict");if(e===null||typeof e!="object")return;if(lt(e),r.has(e))throw new b("conflict");r.add(e);const a=Object.keys(e),s=a.map(i=>Te(e,i));t.push({object:e,prototype:Object.getPrototypeOf(e),keys:a,values:s,...e instanceof Date?{date:Date.prototype.getTime.call(e)}:{},...Array.isArray(e)?{length:e.length}:{}});for(const i of s)dt(i,t,r,o,n+1);r.delete(e)}function Ir(e){const{object:t,keys:r,values:o}=e;if(lt(t),Object.getPrototypeOf(t)!==e.prototype||Object.getOwnPropertyDescriptor(t,"toJSON")||e.date!==void 0&&!Object.is(Date.prototype.getTime.call(t),e.date)||e.length!==void 0&&t.length!==e.length)return!1;const n=Object.keys(t);return n.length===r.length&&r.every((a,s)=>n[s]===a&&Object.is(Te(t,a),o[s]))}function Or(e){const t=[];return dt(e,t,new Set,{nodes:0},0),()=>{try{return t.every(Ir)}catch{return!1}}}function de(e,t,r){return ct(t,r),e===null||typeof e!="object"?e:e instanceof Date?new Date(Date.prototype.getTime.call(e)):Array.isArray(e)?e.map(o=>de(o,t,r+1)):Object.fromEntries(Object.keys(e).map(o=>[o,de(Te(e,o),t,r+1)]))}function Fr(e){return de(e,{nodes:0},0)}async function ut(e,t,r={}){const o=[],n={...r,knownTotalPages:void 0};for(const a of Qe(e,t,n))o.push(a),o.length%8===0&&await new Promise(s=>setTimeout(s,0));if(r.signal?.aborted){const a=new Error("报表重算已取消");throw a.name="AbortError",a}return{schemaVersion:Y.RENDER_PLAN_SCHEMA_VERSION,...Z(e)?{requiresRecalculation:!0}:{},pages:o}}const ue=new WeakMap;function Ar(e){return ue.get(e)}function z(e){if(e?.aborted){const t=new Error("报表重算已取消");throw t.name="AbortError",t}}function ft(e,t){return e[t]===void 0?"":e[t]}function Nr(e,t){if(t.edits.length>1e4)throw new b("limit");const r=j(e),o=new Set,n=[],a=t.edits.map(s=>{const i=r(s.address);if(!i?.source)throw new b("missing");const c=I(s);if(o.has(c))throw new b("duplicate");if(o.add(c),xe(i,s)||!Object.is(i.value,s.previousValue)||(i.cell.text??"")!==s.previousText)throw new b("conflict");return n.push(i),q(i,s.value)});return{batch:{requestId:t.requestId,edits:a},contexts:n}}function Kr(e,t){const r=nt(e);return t.flatMap(o=>{if(!o.source)throw new b("missing");return r(o.source).map(n=>{if(!Object.is(ft(n.row,o.source.field),o.previousValue))throw new b("conflict");if(n.binding.rowKey===o.source.field)throw new b("readonly");return{row:n,field:o.source.field,value:o.value}})})}function ce(e,t,r){const o={...e,value:t,source:{...e.source,...r?.revision===void 0?{}:{revision:r.revision},...r?.sourceToken===void 0?{}:{sourceToken:r.sourceToken}}};return o.cell={...e.cell,value:o.value,text:H(o,o.value)},o}function Lr(e,t,r){if(!r||r.revision===void 0&&r.sourceToken===void 0)return[...e];const o=new Set(t.edits.flatMap(n=>n.source?[G(n.source)]:[]));return at(e,Rr(e,o,r))}function jr(e,t,r){const o=new Set(t.edits.map(n=>G(n.source)));for(const n of o)e.set(n,{...e.get(n),...r.revision!==void 0?{revision:r.revision}:{},...r.sourceToken!==void 0?{sourceToken:r.sourceToken}:{}});return o}function Ee(e,t){let r=t.parts;const o=t.rebuild;let n=Or(r),a=e,s;const i=new Map,c=new Map;function d(u){if(u!==a)throw new b("conflict");if(s)return s;if(!n?.())throw new b("conflict");return Fr(r)}async function l(u,m,h,g={}){z(g.signal),m={requestId:m.requestId,edits:m.edits.map(S=>({...S,address:{...S.address},source:S.source?{...S.source}:void 0,table:S.table?{...S.table}:void 0}))},h=h.map(S=>({...S,address:{...S.address},source:S.source?{...S.source}:void 0,table:S.table?{...S.table}:void 0,cell:{...S.cell}})),await new Promise(S=>setTimeout(S,0)),z(g.signal);const w=d(u),y=at(w,Kr(w,m.edits)),v=Re(await o(y,g.signal),c);z(g.signal);let T=!1;return{plan:v,commit(S){if(z(g.signal),T||a!==u)throw new b("conflict");if(S?.conflicts?.length)throw new b("conflict");const N=Lr(y,m,S),F=st(v,m,S);if(S){const O=jr(c,m,S);for(const[p,M]of i)O.has(G(M.source))&&i.set(p,ce(M,M.value,S))}return h.forEach((O,p)=>i.set(I(O),ce(O,m.edits[p].value,S))),T=!0,s=N,r=void 0,n=void 0,a=F,ue.set(a,f),a}}}const f={get plan(){return a},async prepare(u,m,h){const g=Nr(u,m);return l(u,g.batch,g.contexts,h)},async prepareHistory(u,m,h,g,w){if(!g.trim()||m.length>1e4)throw new b("limit");const y=d(u),v=nt(y),T=it(u),S=new Set,F=m.map(M=>{if(!M.source)throw new b("missing");const x=I(M);if(S.has(x))throw new b("duplicate");S.add(x);const P=T.get(x)??i.get(x);if(!P?.source)throw new b("missing");const k=v(P.source)[0];return ce(P,ft(k.row,P.source.field))}).map((M,x)=>({context:M,edit:q(M,m[x][h])})).filter(({edit:M})=>!Object.is(M.previousValue,M.value)),O={requestId:g,edits:F.map(({edit:M})=>M)},p=F.map(({context:M})=>M);return{batch:O,contexts:p,prepared:await l(u,O,p,w)}}};return ue.set(e,f),f}function Br(e){const t=ve(e.template,e.datasets,e.pagination).plan;return Ee(t,{parts:[{template:e.template,datasets:e.datasets}],rebuild:(r,o)=>ut(r[0].template,r[0].datasets,{...e.pagination,signal:o})})}let Dr=0;function mt(){return`report-${Date.now()}-${++Dr}`}function fe(e,t,r){if(!r?.aborted)try{const o=e?.({...t});o&&typeof o.then=="function"&&Promise.resolve(o).catch(()=>{})}catch{}}function gt(e){const t=e.taskId??mt(),r=(o,n,a)=>{fe(e.onEvent,{taskId:t,...e.correlationId===void 0?{}:{correlationId:e.correlationId},stage:o,status:n,...a===void 0?{}:{reportId:a}},e.signal)};return{taskId:t,progress(o,n,a){fe(e.onEvent,{taskId:t,...e.correlationId===void 0?{}:{correlationId:e.correlationId},stage:o,status:"started",completed:n,total:a},e.signal)},async run(o,n,a){r(o,"started",a);try{const s=await n();return r(o,"completed",a),s}catch(s){throw r(o,"failed",a),s}},runSync(o,n,a){r(o,"started",a);try{const s=n();return r(o,"completed",a),s}catch(s){throw r(o,"failed",a),s}}}}function ht(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const t=e,r=o=>typeof o=="string"&&o.trim().length>0&&o.length<=256;return!r(t.datasetId)||!r(t.field)||t.tableId!==void 0&&!r(t.tableId)||t.reportScope!==void 0&&(typeof t.reportScope!="string"||!t.reportScope.trim()||t.reportScope.length>4096)?!1:t.rowKey===void 0?!0:typeof t.rowKey=="string"?t.rowKey.trim().length>0&&t.rowKey.length<=1024:typeof t.rowKey=="number"&&Number.isFinite(t.rowKey)}function pt(e){return e==="missing-source"||e==="not-applicable"||e==="not-calculable"}function wt(e){return e.target!==void 0&&!ht(e.target)?!1:e.valueState===void 0||pt(e.valueState)&&e.target!==void 0}function Pe(e,t,r={}){const o=new Map;for(const a of e.pages)for(const s of a.components){if(s.kind!=="list"||s.tree?.input!=="nested")continue;const i=o.get(s.dataset);if(i&&(i.childrenField??"children")!==(s.tree.childrenField??"children"))throw new Error("同一数据集的嵌套树应使用相同 childrenField");o.set(s.dataset,s.tree)}if(!o.size)return t;const n={...t};for(const[a,s]of o){const i=Math.min(s.maxRows??1e5,r.maxRows??1/0);n[a]=Q.flattenTreeInput(t[a]??[],{...s,maxRows:i},r.signal)}return n}function Hr(e,t,r={}){return Object.values(Pe(e,t,r)).reduce((o,n)=>o+n.length,0)}function Gr(e,t,r){const o=Le.datasetJsonSchema(r),n=e?.pages.flatMap(i=>i.components).find(i=>i.kind==="list"&&i.dataset===t&&i.tree?.input==="nested");if(!n||n.kind!=="list"||!n.tree)return o;const a=o.items,s=n.tree.childrenField??"children";return{...o,items:{$ref:"#/$defs/treeNode"},$defs:{treeNode:{...a,properties:{...a.properties,[s]:{anyOf:[{type:"null"},{type:"array",items:{$ref:"#/$defs/treeNode"}}]}}}}}}function Ce(e,t){return JSON.stringify([e,t])}function yt(e,t,r){return r===void 0?Ce(e,t):JSON.stringify(["shared",r])}function bt(e,t,r){return e.map(o=>{const n=o.table?{...o.table,id:r(o.table.id),...o.table.source?{source:{...o.table.source,sourceScope:t}}:{}}:void 0,a=o.grid?.cells.map(s=>s.map(i=>!i||!i.source&&!i.children?i:{...i,...i.source?{source:{...i.source,sourceScope:t}}:{},...i.children?{children:bt(i.children,t,r)}:{}}));return n||a?{...o,...n?{table:n}:{},...a?{grid:{...o.grid,cells:a}}:{}}:o})}function Vr(e){if(!("mapData"in e))return e;const{load:t,mapData:r,...o}=e;return{...o,load:async n=>{const a=await t(n);$(n.signal);try{return r(a,n)}catch(s){throw new E("validate",`报表 ${n.reportId} 数据映射失败`,s)}}}}class E extends Error{constructor(t,r,o){super(r),this.name="ReportSourceError",this.code=t,this.cause=o}}function ae(e){const t=new Error("报表加载已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e.reason}),t}function $(e){if(e?.aborted)throw ae(e)}function me(e,t){return t?new Promise((r,o)=>{const n=()=>t.removeEventListener("abort",a),a=()=>{n(),o(ae(t))};t.addEventListener("abort",a,{once:!0}),t.aborted&&a(),Promise.resolve(e).then(s=>{n(),r(s)},s=>{n(),o(s)})}):Promise.resolve(e)}function _r(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new E("validate",`报表 ${t} 的数据集应为对象`);for(const[r,o]of Object.entries(e))if(!Array.isArray(o)||o.some(n=>!n||typeof n!="object"||Array.isArray(n)))throw new E("validate",`报表 ${t} 的数据集 ${r} 应为对象数组`)}async function Wr(e,t,r){const{reportId:o,signal:n}=t;try{const a=await me(e(t),n);$(n);const s=L.validateReportTemplate(a);if(!s.ok)throw new E("validate",`报表 ${o} 模板校验失败:${s.errors.slice(0,3).map(i=>`${i.path}: ${i.message}`).join("; ")}`);return r.push(...s.warnings.map(i=>`${o}: ${i.path}: ${i.message}`)),a}catch(a){throw n?.aborted?ae(n):a instanceof E?a:a instanceof L.ReportTemplateError?new E("validate",`报表 ${o} 模板校验失败:${a.message}`,a):new E("fetch",`报表 ${o} 模板加载失败:${a instanceof Error?a.message:String(a)}`,a)}}async function Jr(e,t,r,o){const n=t.signal;let a;try{if(e.load)a=await me(e.load(t),n);else if(e.provider){const s=await me(e.provider.query(t),n);$(n),qr(s,r),a=s.datasets,o?.(r,s)}else a=e.datasets??{}}catch(s){throw n?.aborted?ae(n):s instanceof E?s:new E("fetch",`报表 ${r} 取数失败:${s instanceof Error?s.message:String(s)}`,s)}return $(n),a}function qr(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new E("validate",`报表 ${t} Provider 应返回 datasets 结果对象`);for(const r of["revision","sourceToken"])if(e[r]!==void 0&&typeof e[r]!="string")throw new E("validate",`报表 ${t} Provider ${r} 应为字符串`);if(e.diagnostics!==void 0&&(!Array.isArray(e.diagnostics)||e.diagnostics.some(r=>!r||typeof r.code!="string"||typeof r.message!="string"||!["info","warning","error"].includes(r.severity))))throw new E("validate",`报表 ${t} Provider diagnostics 不符合结构化诊断契约`);if(e.diagnostics?.some(r=>!wt(r)))throw new E("validate",`报表 ${t} Provider 数据说明缺少有效的字段身份或值状态`)}function zr(e,t,r,o,n){try{t=Pe(o,t,{maxRows:e.dataValidation?.maxRows,signal:n})}catch(a){throw new E("validate",`报表 ${r} 树形数据无效:${a instanceof Error?a.message:String(a)}`,a)}for(const[a,s]of Object.entries(e.dataSchema??{})){let i;try{i=Le.validateDatasetRows(Object.prototype.hasOwnProperty.call(t,a)?t[a]:void 0,s,{...e.dataValidation,path:`$.datasets.${a}`})}catch(c){throw new E("config",`报表 ${r} 数据集 ${a} 字段契约配置无效`,c)}if(!i.ok)throw new E("validate",`报表 ${r} 数据集 ${a} 不符合字段契约:${i.issues[0]?.message}`,{issues:i.issues})}}function Mt(e,t){if(!e.repeat)return!1;const r=Object.prototype.hasOwnProperty.call(t,e.repeat.dataset)?t[e.repeat.dataset]:void 0;return Array.isArray(r)&&r.length===0}function vt(e){const t=r=>r.grid?.cells.reduce((o,n)=>o+n.reduce((a,s)=>a+(s?1+(s.children?.reduce((i,c)=>i+t(c),0)??0):0),0),0)??0;return e.pages.reduce((r,o)=>r+o.components.reduce((n,a)=>n+t(a),0),0)}function St(e,t,r,o){return{...e,signal:o??e?.signal,...t===void 0?{}:{maxPages:Math.max(1,Math.min(t,e?.maxPages??t))},...r===void 0?{}:{maxCells:Math.max(1,Math.min(r,e?.maxCells??r))}}}function Ur(e,t,r,o,n,a){const s=n.maxPages===void 0?void 0:n.maxPages-n.usedPages,i=n.maxCells===void 0?void 0:n.maxCells-n.usedCells;try{if(s!==void 0&&s<1&&e.pages.length&&!Mt(e,t))throw new K(0,1);const c=St(r.pagination,s,i,a),d=ve(e,t,c),l=vt(d.plan);if(i!==void 0&&l>i)throw new B(i,l);return{...d,cells:l}}catch(c){let d=c;throw c instanceof K&&n.maxPages!==void 0&&c.limit===s&&(d=new K(n.maxPages,n.usedPages+c.actual)),c instanceof B&&n.maxCells!==void 0&&(d=new B(n.maxCells,n.usedCells+c.actual)),new E("validate",`报表 ${o} 排版失败:${d instanceof Error?d.message:String(d)}`,d)}}function xt(e,t,r,o,n){const a=new Map,s=i=>{let c=a.get(i);return c===void 0&&(c=JSON.stringify([r,o,i]),a.set(i,c)),c};for(const i of t.pages)e.push({...i,meta:{...i.meta,reportScope:Ce(r,o)},components:bt(i.components,n??yt(r,o),s)})}async function Xr(e,t,r,o,n){const a=[];let s=0;for(const[d,l]of e.entries()){$(n);const f=o.maxPages===void 0?void 0:o.maxPages-a.length,u=o.maxCells===void 0?void 0:o.maxCells-s;if(f!==void 0&&f<1&&l.template.pages.length&&!Mt(l.template,l.datasets))throw new K(o.maxPages,a.length+1);const m=await ut(l.template,l.datasets,St(t[d]?.pagination,f,u,n));if(s+=vt(m),o.maxCells!==void 0&&s>o.maxCells)throw new B(o.maxCells,s);xt(a,m,d,r[d],l.sourceScope)}const i={schemaVersion:Y.RENDER_PLAN_SCHEMA_VERSION,...e.some(d=>Z(d.template))?{requiresRecalculation:!0}:{},pages:a},c=L.validateRenderPlan(i);if(!c.ok)throw new E("validate",`重算渲染计划校验失败:${c.errors[0]?.message}`);return i}function Yr(e,t={}){if(t.maxPages!==void 0&&(!Number.isSafeInteger(t.maxPages)||t.maxPages<1))throw new E("config","maxPages 应为正安全整数");if(t.maxCells!==void 0&&(!Number.isSafeInteger(t.maxCells)||t.maxCells<1))throw new E("config","maxCells 应为正安全整数");function r(n){const a=Object.prototype.hasOwnProperty.call(e,n)?e[n]:void 0;if(!a)throw new E("config",`未注册报表 ${n}`);if(a.sourceScope!==void 0&&(typeof a.sourceScope!="string"||!a.sourceScope.trim()||a.sourceScope.length>512))throw new E("config","sourceScope 应为不超过 512 字符的非空字符串");return a}return Object.assign(async({reportIds:n,params:a,signal:s,onWarning:i,onQueryResult:c,...d})=>{$(s);const l=gt({...d,signal:s}),f=[...n],u={...a};if(f.length===0)throw new E("config","缺少报表 ID");const m=f.map(r),h=l.runSync("validate",()=>m.map(p=>$e.assertReportParams(p.params??(typeof p.template=="function"?[]:p.template.params)??[],u))),g=[],w=[];let y=0;const v=[];for(const[p,M]of m.entries()){$(s);const x=f[p],P={reportId:x,params:h[p],signal:s},k=typeof M.template=="function"?await l.run("query",()=>Wr(M.template,P,v),x):M.template;P.params=l.runSync("validate",()=>$e.assertReportParams(M.params??k.params??[],P.params),x);const A=await l.run("query",()=>Jr(M,P,x,(ie,Rt)=>c?.(ie,Rt,p)),x);l.runSync("validate",()=>{_r(A,x),t.onDatasets?.(x,A,k),zr(M,A,x,k,s)},x),$(s);const se=l.runSync("layout",()=>Ur(k,A,M,x,{maxPages:t.maxPages,usedPages:g.length,maxCells:t.maxCells,usedCells:y},s),x);y+=se.cells;const ke=yt(p,x,M.sourceScope);w.push({template:k,datasets:A,sourceScope:ke}),xt(g,se.plan,p,x,ke),v.push(...se.warnings.map(ie=>`${x}: ${ie}`))}$(s);const T={schemaVersion:Y.RENDER_PLAN_SCHEMA_VERSION,...w.some(p=>Z(p.template))?{requiresRecalculation:!0}:{},pages:g},S=l.runSync("validate",()=>{const p=L.validateRenderPlan(T);if(!p.ok)throw new E("validate",`渲染计划校验失败:${p.errors.slice(0,3).map(M=>`${M.path}: ${M.message}`).join("; ")}`);return p});v.push(...S.warnings.map(p=>`${p.path}: ${p.message}`));const N=m.map(p=>({...p,pagination:{...p.pagination}})),F={maxPages:t.maxPages,maxCells:t.maxCells};try{Ee(T,{parts:w,rebuild:(p,M)=>Xr(p,N,f,F,M)})}catch{v.push("来源数据无法建立本地重算口径;当前预览仅支持计划内编辑,请使用可序列化模板数据启用规则重算")}const O=i??t.onWarning??(p=>console.warn("[mach-report]",p));for(const p of v)$(s),O(p);return $(s),T},{getParamDefs:n=>Tt.getReportParamDefs(e,n)})}function Qr(e,t){const r=t.maxNodes??1e6;if(![t.maxBytes,r].every(l=>Number.isSafeInteger(l)&&l>0))throw t.error("budget","快照预算应为正安全整数");let o=0,n=0;const a=new Set;function s(l){if(n+=l,n>t.maxBytes)throw t.error("budget","快照超过字节预算")}function i(l,f){if(++o>r||f>64)throw t.error("budget","快照节点或深度超过预算");if(o%1024===0&&t.check?.(),typeof l=="string")return s(l.length+2),l;if(l===null||typeof l=="boolean"||typeof l=="number"&&Number.isFinite(l))return s(String(l).length),l;if(!l||typeof l!="object"||a.has(l))throw t.error("input","快照应为无循环的有限 JSON 值");return c(l,f)}function c(l,f){const u=Array.isArray(l),m=Object.getPrototypeOf(l);if(m!==(u?Array.prototype:Object.prototype)&&!(m===null&&!u)||Object.getOwnPropertySymbols(l).length)throw t.error("input","快照应为普通 JSON 对象");const h=Object.getOwnPropertyNames(l).filter(y=>!(u&&y==="length"));if(u&&(h.length!==l.length||h.some((y,v)=>y!==String(v))))throw t.error("input","快照数组应为连续数组");a.add(l),s(2);const g=Object.create(null);let w=0;for(const y of h){const v=Object.getOwnPropertyDescriptor(l,y);if(v.get||v.set||!v.enumerable||["__proto__","constructor","prototype"].includes(y))throw t.error("input","快照不允许访问器或危险键");v.value===void 0&&!u||(s((w++?1:0)+(u?0:y.length+3)),g[y]=i(v.value===void 0?null:v.value,f+1))}return a.delete(l),u?h.map(y=>g[y]):g}t.check?.();const d=JSON.stringify(i(e,0));if(new TextEncoder().encode(d).byteLength>t.maxBytes)throw t.error("budget","快照超过字节预算");return JSON.parse(d)}exports.DEFAULT_LABEL_PAGE_LIMIT=Be;exports.PaginateCellLimitError=B;exports.PaginatePageLimitError=K;exports.ReportCellEditError=b;exports.ReportSourceError=E;exports.applyReportCellEdit=xr;exports.applyReportCellEditBatch=Cr;exports.applyReportEditResult=st;exports.applyReportSourceMetadata=Re;exports.countTemplatePages=ar;exports.createReportCellEdit=yr;exports.createReportCellEditBatch=Pr;exports.createReportCellResolver=j;exports.createReportEditSession=Br;exports.createReportSource=Yr;exports.createReportTaskReporter=gt;exports.defineReport=Vr;exports.estimateListLayoutCells=cr;exports.formatReportCellEdit=H;exports.getReportCellContext=ne;exports.getReportEditSession=Ar;exports.hasValidDataExplanation=wt;exports.isReportDataTarget=ht;exports.isReportValueState=pt;exports.notifyReportTaskEvent=fe;exports.paginateTemplate=ve;exports.paginateTemplatePages=Qe;exports.parseReportCellInput=Se;exports.projectListColumns=je;exports.registerReportEditSession=Ee;exports.relocateReportCellEdits=$r;exports.reportCellEditKey=I;exports.reportOccurrenceScope=Ce;exports.reportTaskId=mt;exports.snapshotReportJson=Qr;exports.summarizeReportCellEdits=kr;exports.templateDatasetJsonSchema=Gr;exports.templateDatasetRowCount=Hr;exports.templateValidationDatasets=Pe;
@@ -1,112 +0,0 @@
1
- import { c as h } from "./computed-C-4C2S5h.js";
2
- function y(l, e) {
3
- const r = () => e.measures.map((c) => h(c)), t = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = e.totals ? r() : void 0, n = (c, s) => c?.forEach((o) => o.add(s));
4
- for (const c of l) {
5
- const s = e.row(c), o = e.column(c);
6
- f.has(o.key) || f.set(o.key, o.label);
7
- let u = t.get(s.key);
8
- u || (u = { label: s.label, cells: /* @__PURE__ */ new Map(), ...e.totals ? { totals: r() } : {} }, t.set(s.key, u)), e.check(t.size, f.size);
9
- let w = u.cells.get(o.key);
10
- if (w || (w = r(), u.cells.set(o.key, w)), n(w, c), !e.totals) continue;
11
- let d = i.get(o.key);
12
- d || (d = r(), i.set(o.key, d)), n(u.totals, c), n(d, c), n(a, c);
13
- }
14
- return { groups: t, columns: f, columnTotals: i, totals: a };
15
- }
16
- function m(l, e) {
17
- const r = e.map(
18
- (t) => Object.prototype.hasOwnProperty.call(l, t) ? l[t] : null
19
- );
20
- if (r.some(
21
- (t) => t != null && typeof t != "string" && typeof t != "boolean" && !(typeof t == "number" && Number.isFinite(t))
22
- ))
23
- throw new Error("矩阵维度必须是有限 JSON 标量");
24
- return {
25
- key: JSON.stringify(r.map((t) => [typeof t, t ?? null])),
26
- label: r.map((t) => t == null ? "" : String(t)).join(" / ")
27
- };
28
- }
29
- function g(l) {
30
- for (const e of [
31
- "maxRows",
32
- "maxColumns",
33
- "maxInputRows",
34
- "maxCells"
35
- ])
36
- if (l[e] !== void 0 && (!Number.isSafeInteger(l[e]) || l[e] < 1))
37
- throw new Error("矩阵预算应为正安全整数");
38
- for (const e of ["columnWidthMm", "rowWidthMm"])
39
- if (l[e] !== void 0 && (!Number.isFinite(l[e]) || l[e] <= 0))
40
- throw new Error("矩阵列宽应为正数");
41
- }
42
- function b(l) {
43
- if (!l || !Array.isArray(l.rowFields) || !Array.isArray(l.columnFields) || !Array.isArray(l.measures))
44
- throw new Error("矩阵需要行维度、列维度和度量数组");
45
- for (const r of [l.rowFields, l.columnFields])
46
- if (r.some((t) => typeof t != "string" || !t.trim()) || new Set(r).size !== r.length)
47
- throw new Error("矩阵维度字段应非空且唯一");
48
- if (g(l), !l.rowFields.length || !l.columnFields.length || l.rowFields.length > 16 || l.columnFields.length > 16)
49
- throw new Error("矩阵需要 1–16 个行/列维度");
50
- if (!l.measures.length || l.measures.length > 32)
51
- throw new Error("矩阵需要 1–32 个度量");
52
- if (l.measures.map((r) => {
53
- if (!r || typeof r != "object") throw new Error("矩阵度量应为对象");
54
- if (h({
55
- ...r,
56
- field: r.valueField ?? r.field
57
- }), r.label !== void 0 && typeof r.label != "string")
58
- throw new Error("矩阵度量标签应为字符串");
59
- return r.field;
60
- }).some((r) => typeof r != "string" || !r.trim()))
61
- throw new Error("矩阵度量字段应非空");
62
- }
63
- function k(l, e) {
64
- if (b(e), !Array.isArray(l) || l.length > (e.maxInputRows ?? 1e5))
65
- throw new Error("矩阵输入超出预算");
66
- const r = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set();
67
- for (const a of l) {
68
- if (!a || typeof a != "object" || Array.isArray(a))
69
- throw new Error("矩阵数据行应为对象");
70
- if (r.add(m(a, e.rowFields).key), t.add(m(a, e.columnFields).key), r.size > (e.maxRows ?? 1e3) || t.size > (e.maxColumns ?? 200))
71
- throw new Error("矩阵维度数量超出预算");
72
- if ((r.size + +!!e.totals) * ((t.size + +!!e.totals) * e.measures.length + 1) > (e.maxCells ?? 2e6))
73
- throw new Error("矩阵输出超出 maxCells 预算");
74
- }
75
- const f = r.size + +(!!e.totals && l.length > 0), i = (t.size + +!!e.totals) * e.measures.length + 1;
76
- return { rowCount: f, columnCount: i, cells: f * i };
77
- }
78
- function E(l, e) {
79
- k(l, e);
80
- const r = y(l, {
81
- row: (a) => m(a, e.rowFields),
82
- column: (a) => m(a, e.columnFields),
83
- measures: e.measures.map((a) => ({ ...a, field: a.valueField ?? a.field })),
84
- totals: e.totals,
85
- check: () => {
86
- }
87
- // Cardinality/budgets were checked before allocating accumulators.
88
- }), t = [...r.groups.values()].map((a) => ({ rowLabel: a.label })), f = [{ field: "rowLabel", header: e.rowHeader ?? e.rowFields.join(" / "), semanticRole: "dimension" }], i = { rowLabel: "合计" };
89
- return e.measures.forEach((a, n) => {
90
- const c = [...r.columns.entries()].map(([s, o], u) => ({ key: s, label: o, field: `c${u}_${n}` }));
91
- e.totals && c.push({ key: "", label: "合计", field: `total_${n}` });
92
- for (const s of c) {
93
- const o = s.field === `total_${n}`;
94
- f.push({
95
- field: s.field,
96
- header: `${s.label} · ${a.label ?? `${a.field} (${a.op})`}`,
97
- semanticRole: "measure",
98
- ...a.digits === void 0 ? {} : { format: { kind: "number", digits: a.digits } }
99
- });
100
- let u = 0;
101
- for (const w of r.groups.values())
102
- t[u++][s.field] = (o ? w.totals?.[n] : w.cells.get(s.key)?.[n])?.value() ?? (a.op === "count" ? 0 : null);
103
- i[s.field] = (o ? r.totals?.[n] : r.columnTotals.get(s.key)?.[n])?.value() ?? (a.op === "count" ? 0 : null);
104
- }
105
- }), e.totals && l.length && t.push(i), { rows: t, columns: f };
106
- }
107
- export {
108
- y as a,
109
- E as c,
110
- k as e,
111
- b as v
112
- };
@@ -1 +0,0 @@
1
- "use strict";const h=require("./computed-CGV2a809.cjs");function g(r,e){const l=()=>e.measures.map(c=>h.createAggregateAccumulator(c)),t=new Map,u=new Map,i=new Map,a=e.totals?l():void 0,n=(c,s)=>c?.forEach(o=>o.add(s));for(const c of r){const s=e.row(c),o=e.column(c);u.has(o.key)||u.set(o.key,o.label);let f=t.get(s.key);f||(f={label:s.label,cells:new Map,...e.totals?{totals:l()}:{}},t.set(s.key,f)),e.check(t.size,u.size);let w=f.cells.get(o.key);if(w||(w=l(),f.cells.set(o.key,w)),n(w,c),!e.totals)continue;let d=i.get(o.key);d||(d=l(),i.set(o.key,d)),n(f.totals,c),n(d,c),n(a,c)}return{groups:t,columns:u,columnTotals:i,totals:a}}function m(r,e){const l=e.map(t=>Object.prototype.hasOwnProperty.call(r,t)?r[t]:null);if(l.some(t=>t!=null&&typeof t!="string"&&typeof t!="boolean"&&!(typeof t=="number"&&Number.isFinite(t))))throw new Error("矩阵维度必须是有限 JSON 标量");return{key:JSON.stringify(l.map(t=>[typeof t,t??null])),label:l.map(t=>t==null?"":String(t)).join(" / ")}}function k(r){for(const e of["maxRows","maxColumns","maxInputRows","maxCells"])if(r[e]!==void 0&&(!Number.isSafeInteger(r[e])||r[e]<1))throw new Error("矩阵预算应为正安全整数");for(const e of["columnWidthMm","rowWidthMm"])if(r[e]!==void 0&&(!Number.isFinite(r[e])||r[e]<=0))throw new Error("矩阵列宽应为正数")}function y(r){if(!r||!Array.isArray(r.rowFields)||!Array.isArray(r.columnFields)||!Array.isArray(r.measures))throw new Error("矩阵需要行维度、列维度和度量数组");for(const l of[r.rowFields,r.columnFields])if(l.some(t=>typeof t!="string"||!t.trim())||new Set(l).size!==l.length)throw new Error("矩阵维度字段应非空且唯一");if(k(r),!r.rowFields.length||!r.columnFields.length||r.rowFields.length>16||r.columnFields.length>16)throw new Error("矩阵需要 1–16 个行/列维度");if(!r.measures.length||r.measures.length>32)throw new Error("矩阵需要 1–32 个度量");if(r.measures.map(l=>{if(!l||typeof l!="object")throw new Error("矩阵度量应为对象");if(h.createAggregateAccumulator({...l,field:l.valueField??l.field}),l.label!==void 0&&typeof l.label!="string")throw new Error("矩阵度量标签应为字符串");return l.field}).some(l=>typeof l!="string"||!l.trim()))throw new Error("矩阵度量字段应非空")}function b(r,e){if(y(e),!Array.isArray(r)||r.length>(e.maxInputRows??1e5))throw new Error("矩阵输入超出预算");const l=new Set,t=new Set;for(const a of r){if(!a||typeof a!="object"||Array.isArray(a))throw new Error("矩阵数据行应为对象");if(l.add(m(a,e.rowFields).key),t.add(m(a,e.columnFields).key),l.size>(e.maxRows??1e3)||t.size>(e.maxColumns??200))throw new Error("矩阵维度数量超出预算");if((l.size+ +!!e.totals)*((t.size+ +!!e.totals)*e.measures.length+1)>(e.maxCells??2e6))throw new Error("矩阵输出超出 maxCells 预算")}const u=l.size+ +(!!e.totals&&r.length>0),i=(t.size+ +!!e.totals)*e.measures.length+1;return{rowCount:u,columnCount:i,cells:u*i}}function x(r,e){b(r,e);const l=g(r,{row:a=>m(a,e.rowFields),column:a=>m(a,e.columnFields),measures:e.measures.map(a=>({...a,field:a.valueField??a.field})),totals:e.totals,check:()=>{}}),t=[...l.groups.values()].map(a=>({rowLabel:a.label})),u=[{field:"rowLabel",header:e.rowHeader??e.rowFields.join(" / "),semanticRole:"dimension"}],i={rowLabel:"合计"};return e.measures.forEach((a,n)=>{const c=[...l.columns.entries()].map(([s,o],f)=>({key:s,label:o,field:`c${f}_${n}`}));e.totals&&c.push({key:"",label:"合计",field:`total_${n}`});for(const s of c){const o=s.field===`total_${n}`;u.push({field:s.field,header:`${s.label} · ${a.label??`${a.field} (${a.op})`}`,semanticRole:"measure",...a.digits===void 0?{}:{format:{kind:"number",digits:a.digits}}});let f=0;for(const w of l.groups.values())t[f++][s.field]=(o?w.totals?.[n]:w.cells.get(s.key)?.[n])?.value()??(a.op==="count"?0:null);i[s.field]=(o?l.totals?.[n]:l.columnTotals.get(s.key)?.[n])?.value()??(a.op==="count"?0:null)}}),e.totals&&r.length&&t.push(i),{rows:t,columns:u}}exports.accumulatePivotRows=g;exports.createMatrixTable=x;exports.estimateMatrixTable=b;exports.validateMatrixOptions=y;
@@ -1,168 +0,0 @@
1
- import { H as R, I as W, R as y, J as C, E as O, m as X, G as z, K as H, b as K, P as Q, n as Y } from "./json-snapshot-D6ioHth9.js";
2
- import { g as M } from "./report-params-B1RzkhJj.js";
3
- import { d as $, r as Z, R as ee } from "./param-validation-Do7Eg8Zv.js";
4
- import { t as P, b as x, D as te, v as se, c as T, R as D } from "./sha256-DTG-Gq8i.js";
5
- import { a as ae } from "./template-registry-Cw3vRTX2.js";
6
- import { T as re } from "./tree-CjVZLRw7.js";
7
- import { r as j } from "./assets-CqIbfbTr.js";
8
- import { s as S, a as J, d as oe, e as ne, r as ce } from "./prepared-DqtpvRTn.js";
9
- function I(e = []) {
10
- return e.map(({ code: s, message: r, severity: i, pageIndex: t, componentIndex: a }) => ({ code: s, message: r, severity: i, path: a < 0 ? `$.pages.${t}` : `$.pages.${t}.components.${a}` }));
11
- }
12
- async function _(e, s, r = Date.now()) {
13
- const i = e.prepared, t = e.format === "pdf" ? await import("@agile-team/mach-report/pdf") : void 0;
14
- P(e.signal);
15
- const a = e.pdf?.customFontFaces ?? (e.pdf?.customFontBytes ? { regular: e.pdf.customFontBytes } : void 0), p = t && a ? t.createFontBytesMeasurer(a) : void 0, m = R(e), c = await m.run("encode", async () => {
16
- let u;
17
- if (e.format === "pdf") {
18
- P(e.signal);
19
- const n = await t.renderPlanToPdf(i.plan, { ...e.pdf, ...p ? { measurer: p } : {}, fidelity: e.fidelity, signal: e.signal, onProgress: (f, d) => m.progress("encode", f, d) });
20
- u = n.bytes, i.diagnostics.push(...I(n.diagnostics)), i.diagnostics.push(...n.fidelityWarnings.map((f) => ({ code: "pdf-fidelity", message: f, severity: "warning" })), ...n.pageErrors.map((f) => ({ code: "pdf-page", message: f, severity: "error" }))), n.unsupportedTextCount && i.diagnostics.push({ code: "pdf-font", message: `${n.unsupportedTextCount} 段文本包含当前字体不支持的字符`, severity: "warning" });
21
- } else {
22
- const { renderPlanToXlsx: n } = await import("@agile-team/mach-report/xlsx");
23
- P(e.signal);
24
- const f = await n(i.plan, { ...e.xlsx, fidelity: e.fidelity, signal: e.signal, onProgress: (d, v) => m.progress("encode", d, v) });
25
- u = new Uint8Array(f.buffer), i.diagnostics.push(...I(f.diagnostics)), i.diagnostics.push(...f.warnings.map((d) => ({ code: "xlsx-fidelity", message: d, severity: "warning" })));
26
- }
27
- return P(e.signal), u;
28
- });
29
- x(s, "maxOutputBytes", c.byteLength);
30
- const { plan: o, ...w } = i;
31
- return { ...w, bytes: c, format: e.format, contentType: e.format === "pdf" ? "application/pdf" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", stats: { ...w.stats, durationMs: Date.now() - r, outputBytes: c.byteLength } };
32
- }
33
- function N(e) {
34
- return { ...e, reportIds: [...e.reportIds], ...e.params ? { params: { ...e.params } } : {} };
35
- }
36
- function A(e, s) {
37
- if (s.length === 0) throw new y("config", "缺少报表 ID");
38
- return s.map((r) => {
39
- if (!Object.prototype.hasOwnProperty.call(e, r)) throw new y("config", `未注册报表 ${r}`);
40
- return e[r];
41
- });
42
- }
43
- function k(e) {
44
- return e.grid?.cells.reduce((s, r) => s + r.reduce((i, t) => i + (t ? 1 + (t.children?.reduce((a, p) => a + k(p), 0) ?? 0) : 0), 0), 0) ?? 0;
45
- }
46
- function ie(e, s, r) {
47
- return e.pages.reduce((i, t) => i + t.components.reduce((a, p) => p.kind !== "list" ? a + k(p) : a + Y(p, s, r), 0), 0);
48
- }
49
- function de(e, s = Object.keys(e)) {
50
- return A(e, s).map((r, i) => {
51
- const t = s[i], a = M(e, [t]);
52
- return {
53
- id: t,
54
- params: JSON.parse(JSON.stringify(a)),
55
- paramsSchema: Z(a),
56
- datasetsSchema: Object.fromEntries(Object.entries(r.dataSchema ?? {}).map(([p, m]) => [p, W(typeof r.template == "function" ? void 0 : r.template, p, m)])),
57
- capabilities: {
58
- save: !!r.provider?.save,
59
- export: !!r.provider?.export,
60
- templates: !!r.provider?.templates
61
- }
62
- };
63
- });
64
- }
65
- function U(e, s) {
66
- A(e, s.reportIds);
67
- const r = $(M(e, s.reportIds), s.params), i = s.reportIds.flatMap((a) => $(M(e, [a]), s.params).issues), t = new Map(i.map((a) => [JSON.stringify(a), a]));
68
- return { ...r, ok: t.size === 0, issues: [...t.values()] };
69
- }
70
- function V(e, s) {
71
- const r = ae(e.plan);
72
- if (!r.ok) throw new y("validate", `执行器返回无效计划:${r.errors[0]?.path}`);
73
- const i = e.plan.pages.length, t = e.plan.pages.reduce((a, p) => a + p.components.reduce((m, c) => m + k(c), 0), 0);
74
- return x(s, "maxRows", e.stats.rows), x(s, "maxPages", i), x(s, "maxCells", t), { ...e, stats: { ...e.stats, pages: i, cells: t } };
75
- }
76
- function q(e, s) {
77
- const r = U(e.reports, s);
78
- if (!r.ok) throw new ee(r.issues);
79
- }
80
- function ye(e) {
81
- const s = { ...te, ...e.budget };
82
- se(s);
83
- const r = async (t, a) => {
84
- const p = Date.now();
85
- let m = 0, c = 0;
86
- const o = [], w = {}, u = [], n = Object.fromEntries(Object.entries(e.reports).map(([l, g]) => [l, {
87
- ...g,
88
- pagination: { ...e.pagination, ...g.pagination, ...a ? { measurer: a } : {} },
89
- dataValidation: {
90
- ...g.dataValidation,
91
- maxRows: Math.min(s.maxRows ?? 1e5, g.dataValidation?.maxRows ?? 1 / 0),
92
- maxCells: Math.min(s.maxCells ?? 2e6, g.dataValidation?.maxCells ?? 1 / 0)
93
- }
94
- }])), d = await X(n, { maxPages: s.maxPages, maxCells: s.maxCells, onDatasets: (l, g, h) => {
95
- try {
96
- m += z(h, g, { maxRows: s.maxRows, signal: t.signal });
97
- } catch (b) {
98
- throw b instanceof re ? new D("budget", b.message, "$.budget.maxRows") : b;
99
- }
100
- x(s, "maxRows", m), c += ie(h, g, n[l]?.pagination), x(s, "maxCells", c);
101
- } })({ ...t, params: t.params ?? {}, onWarning: (l) => o.push({ code: "layout", message: l, severity: "warning" }), onQueryResult: (l, g, h = 0) => {
102
- const b = H(h, l);
103
- Object.defineProperty(w, l, { value: { revision: g.revision, sourceToken: g.sourceToken }, enumerable: !0, writable: !0 }), u.push({ reportId: l, reportIndex: h, reportScope: b, ...g.revision === void 0 ? {} : { revision: g.revision }, ...g.sourceToken === void 0 ? {} : { sourceToken: g.sourceToken } }), o.push(...(g.diagnostics ?? []).map((E) => ({ ...E, ...E.target ? { target: {
104
- ...E.target,
105
- reportScope: b,
106
- ...E.target.tableId ? { tableId: JSON.stringify([h, l, E.target.tableId]) } : {}
107
- } } : {} })));
108
- } }).catch((l) => {
109
- throw l instanceof y && l.cause instanceof K ? new D("budget", l.cause.message, "$.budget.maxPages") : l instanceof y && l.cause instanceof Q ? new D("budget", l.cause.message, "$.budget.maxCells") : l;
110
- });
111
- P(t.signal);
112
- const v = e.assets ? await R(t).run("assets", () => j(d, { ...e.assets, signal: t.signal })) : { plan: d, diagnostics: [] }, F = v.plan;
113
- o.push(...I(v.diagnostics));
114
- const L = F.pages.reduce((l, g) => l + g.components.reduce((h, b) => h + k(b), 0), 0);
115
- x(s, "maxPages", F.pages.length), x(s, "maxCells", L);
116
- const B = ce(t.pdf), G = e.pagination?.measurer || Object.values(e.reports).some((l) => l.pagination?.measurer);
117
- return { plan: F, diagnostics: o, revisions: w, sources: u, layout: { textMetrics: B ? "font-bytes" : G ? "provided" : "heuristic", ...B ? { fontFingerprint: B } : {} }, stats: { rows: m, pages: F.pages.length, cells: L, durationMs: Date.now() - p } };
118
- }, i = async (t) => {
119
- const a = Date.now();
120
- if (t.format !== "pdf" && t.format !== "xlsx") throw new y("config", "不支持的报表导出格式");
121
- const p = t.format === "pdf" ? await import("@agile-team/mach-report/pdf") : void 0;
122
- P(t.signal);
123
- const m = t.pdf?.customFontFaces ?? (t.pdf?.customFontBytes ? { regular: t.pdf.customFontBytes } : void 0), c = p && m ? p.createFontBytesMeasurer(m) : void 0, o = await r(t, c);
124
- return P(t.signal), _({ ...t, prepared: o }, s, a);
125
- };
126
- return {
127
- describe: (t) => de(e.reports, t),
128
- validate: (t) => U(e.reports, t),
129
- prepare: (t) => T(t.signal, s.maxDurationMs, async (a) => {
130
- const { signal: p, onEvent: m, ...c } = N(t), o = { ...c, ...c.pdf ? { pdf: S(c.pdf) } : {}, taskId: c.taskId ?? C() }, w = m ? (v) => O(m, v, a) : void 0, u = { ...o, signal: a, onEvent: w };
131
- R(u).runSync("validate", () => q(e, o));
132
- let n;
133
- const f = o.pdf?.customFontFaces ?? (o.pdf?.customFontBytes ? { regular: o.pdf.customFontBytes } : void 0);
134
- if (!e.executor && f) {
135
- const v = await import("@agile-team/mach-report/pdf");
136
- P(a), n = v.createFontBytesMeasurer(f);
137
- }
138
- const d = e.executor ? await e.executor.prepare(o, a, w) : await r(u, n);
139
- return V(d, s);
140
- }),
141
- exportPrepared: (t) => T(t.signal, s.maxDurationMs, async (a) => {
142
- const p = Date.now(), { signal: m, onEvent: c, ...o } = t, w = V(oe(t.prepared, s.maxPreparedBytes ?? 64e6, a), s), u = { ...o, xlsx: J(o.xlsx), prepared: w, ...o.pdf ? { pdf: S(o.pdf) } : {}, taskId: o.taskId ?? C() };
143
- if (u.format !== "pdf" && u.format !== "xlsx") throw new y("config", "不支持的报表导出格式");
144
- const n = c ? (d) => O(c, d, a) : void 0;
145
- if (e.executor) {
146
- if (!e.executor.exportPrepared) throw new y("config", "执行器未实现 exportPrepared;请升级执行器或显式使用本地运行时");
147
- const d = await e.executor.exportPrepared(u, a, n);
148
- return x(s, "maxRows", d.stats.rows), x(s, "maxPages", d.stats.pages), x(s, "maxCells", d.stats.cells), x(s, "maxOutputBytes", d.bytes.byteLength), { ...d, stats: { ...d.stats, outputBytes: d.bytes.byteLength } };
149
- }
150
- const f = { ...u, signal: a, onEvent: n };
151
- if (R(f).runSync("validate", () => ne(f)), e.assets) {
152
- const d = await R(f).run("assets", () => j(w.plan, { ...e.assets, signal: a }));
153
- w.plan = d.plan, w.diagnostics.push(...I(d.diagnostics));
154
- }
155
- return _(f, s, p);
156
- }),
157
- export: (t) => T(t.signal, s.maxDurationMs, async (a) => {
158
- const { signal: p, onEvent: m, ...c } = N(t), o = { ...c, xlsx: J(c.xlsx), ...c.pdf ? { pdf: S(c.pdf) } : {}, taskId: c.taskId ?? C() }, w = m ? (f) => O(m, f, a) : void 0, u = { ...o, signal: a, onEvent: w };
159
- if (R(u).runSync("validate", () => q(e, o)), o.format !== "pdf" && o.format !== "xlsx") throw new y("config", "不支持的报表导出格式");
160
- const n = e.executor ? await e.executor.export(o, a, w) : await i(u);
161
- return x(s, "maxRows", n.stats.rows), x(s, "maxPages", n.stats.pages), x(s, "maxCells", n.stats.cells), x(s, "maxOutputBytes", n.bytes.byteLength), { ...n, stats: { ...n.stats, outputBytes: n.bytes.byteLength } };
162
- })
163
- };
164
- }
165
- export {
166
- ye as c,
167
- V as e
168
- };
@@ -1 +0,0 @@
1
- "use strict";var J=Object.create;var D=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var W=(e,t,a,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of N(t))!X.call(e,s)&&s!==a&&D(e,s,{get:()=>t[s],enumerable:!(c=V(t,s))||c.enumerable});return e};var E=(e,t,a)=>(a=e!=null?J(U(e)):{},W(t||!e||!e.__esModule?D(a,"default",{value:e,enumerable:!0}):a,e));const n=require("./json-snapshot-DknkjvxP.cjs"),F=require("./report-params-WDGrA4oP.cjs"),k=require("./param-validation-C3HlcLLO.cjs"),o=require("./sha256-BshdOkCC.cjs"),z=require("./template-registry-C62vpv4a.cjs"),G=require("./tree-BX380Rr7.cjs"),M=require("./assets-e4YSke8n.cjs"),b=require("./prepared-DdrjLC7L.cjs");function I(e=[]){return e.map(({code:t,message:a,severity:c,pageIndex:s,componentIndex:r})=>({code:t,message:a,severity:c,path:r<0?`$.pages.${s}`:`$.pages.${s}.components.${r}`}))}async function q(e,t,a=Date.now()){const c=e.prepared,s=e.format==="pdf"?await import("@agile-team/mach-report/pdf"):void 0;o.throwIfAborted(e.signal);const r=e.pdf?.customFontFaces??(e.pdf?.customFontBytes?{regular:e.pdf.customFontBytes}:void 0),u=s&&r?s.createFontBytesMeasurer(r):void 0,m=n.createReportTaskReporter(e),p=await m.run("encode",async()=>{let x;if(e.format==="pdf"){o.throwIfAborted(e.signal);const d=await s.renderPlanToPdf(c.plan,{...e.pdf,...u?{measurer:u}:{},fidelity:e.fidelity,signal:e.signal,onProgress:(f,l)=>m.progress("encode",f,l)});x=d.bytes,c.diagnostics.push(...I(d.diagnostics)),c.diagnostics.push(...d.fidelityWarnings.map(f=>({code:"pdf-fidelity",message:f,severity:"warning"})),...d.pageErrors.map(f=>({code:"pdf-page",message:f,severity:"error"}))),d.unsupportedTextCount&&c.diagnostics.push({code:"pdf-font",message:`${d.unsupportedTextCount} 段文本包含当前字体不支持的字符`,severity:"warning"})}else{const{renderPlanToXlsx:d}=await import("@agile-team/mach-report/xlsx");o.throwIfAborted(e.signal);const f=await d(c.plan,{...e.xlsx,fidelity:e.fidelity,signal:e.signal,onProgress:(l,h)=>m.progress("encode",l,h)});x=new Uint8Array(f.buffer),c.diagnostics.push(...I(f.diagnostics)),c.diagnostics.push(...f.warnings.map(l=>({code:"xlsx-fidelity",message:l,severity:"warning"})))}return o.throwIfAborted(e.signal),x});o.assertBudget(t,"maxOutputBytes",p.byteLength);const{plan:i,...y}=c;return{...y,bytes:p,format:e.format,contentType:e.format==="pdf"?"application/pdf":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",stats:{...y.stats,durationMs:Date.now()-a,outputBytes:p.byteLength}}}function A(e){return{...e,reportIds:[...e.reportIds],...e.params?{params:{...e.params}}:{}}}function $(e,t){if(t.length===0)throw new n.ReportSourceError("config","缺少报表 ID");return t.map(a=>{if(!Object.prototype.hasOwnProperty.call(e,a))throw new n.ReportSourceError("config",`未注册报表 ${a}`);return e[a]})}function T(e){return e.grid?.cells.reduce((t,a)=>t+a.reduce((c,s)=>c+(s?1+(s.children?.reduce((r,u)=>r+T(u),0)??0):0),0),0)??0}function Q(e,t,a){return e.pages.reduce((c,s)=>c+s.components.reduce((r,u)=>u.kind!=="list"?r+T(u):r+n.estimateListLayoutCells(u,t,a),0),0)}function H(e,t=Object.keys(e)){return $(e,t).map((a,c)=>{const s=t[c],r=F.getReportParamDefs(e,[s]);return{id:s,params:JSON.parse(JSON.stringify(r)),paramsSchema:k.reportParamsJsonSchema(r),datasetsSchema:Object.fromEntries(Object.entries(a.dataSchema??{}).map(([u,m])=>[u,n.templateDatasetJsonSchema(typeof a.template=="function"?void 0:a.template,u,m)])),capabilities:{save:!!a.provider?.save,export:!!a.provider?.export,templates:!!a.provider?.templates}}})}function j(e,t){$(e,t.reportIds);const a=k.validateReportParams(F.getReportParamDefs(e,t.reportIds),t.params),c=t.reportIds.flatMap(r=>k.validateReportParams(F.getReportParamDefs(e,[r]),t.params).issues),s=new Map(c.map(r=>[JSON.stringify(r),r]));return{...a,ok:s.size===0,issues:[...s.values()]}}function O(e,t){const a=z.validateRenderPlan(e.plan);if(!a.ok)throw new n.ReportSourceError("validate",`执行器返回无效计划:${a.errors[0]?.path}`);const c=e.plan.pages.length,s=e.plan.pages.reduce((r,u)=>r+u.components.reduce((m,p)=>m+T(p),0),0);return o.assertBudget(t,"maxRows",e.stats.rows),o.assertBudget(t,"maxPages",c),o.assertBudget(t,"maxCells",s),{...e,stats:{...e.stats,pages:c,cells:s}}}function L(e,t){const a=j(e.reports,t);if(!a.ok)throw new k.ReportParamValidationError(a.issues)}function K(e){const t={...o.DEFAULT_REPORT_RUNTIME_BUDGET,...e.budget};o.validateBudget(t);const a=async(s,r)=>{const u=Date.now();let m=0,p=0;const i=[],y={},x=[],d=Object.fromEntries(Object.entries(e.reports).map(([g,w])=>[g,{...w,pagination:{...e.pagination,...w.pagination,...r?{measurer:r}:{}},dataValidation:{...w.dataValidation,maxRows:Math.min(t.maxRows??1e5,w.dataValidation?.maxRows??1/0),maxCells:Math.min(t.maxCells??2e6,w.dataValidation?.maxCells??1/0)}}])),l=await n.createReportSource(d,{maxPages:t.maxPages,maxCells:t.maxCells,onDatasets:(g,w,v)=>{try{m+=n.templateDatasetRowCount(v,w,{maxRows:t.maxRows,signal:s.signal})}catch(R){throw R instanceof G.TreeRowLimitError?new o.ReportRuntimeError("budget",R.message,"$.budget.maxRows"):R}o.assertBudget(t,"maxRows",m),p+=Q(v,w,d[g]?.pagination),o.assertBudget(t,"maxCells",p)}})({...s,params:s.params??{},onWarning:g=>i.push({code:"layout",message:g,severity:"warning"}),onQueryResult:(g,w,v=0)=>{const R=n.reportOccurrenceScope(v,g);Object.defineProperty(y,g,{value:{revision:w.revision,sourceToken:w.sourceToken},enumerable:!0,writable:!0}),x.push({reportId:g,reportIndex:v,reportScope:R,...w.revision===void 0?{}:{revision:w.revision},...w.sourceToken===void 0?{}:{sourceToken:w.sourceToken}}),i.push(...(w.diagnostics??[]).map(P=>({...P,...P.target?{target:{...P.target,reportScope:R,...P.target.tableId?{tableId:JSON.stringify([v,g,P.target.tableId])}:{}}}:{}})))}}).catch(g=>{throw g instanceof n.ReportSourceError&&g.cause instanceof n.PaginatePageLimitError?new o.ReportRuntimeError("budget",g.cause.message,"$.budget.maxPages"):g instanceof n.ReportSourceError&&g.cause instanceof n.PaginateCellLimitError?new o.ReportRuntimeError("budget",g.cause.message,"$.budget.maxCells"):g});o.throwIfAborted(s.signal);const h=e.assets?await n.createReportTaskReporter(s).run("assets",()=>M.resolvePlanAssets(l,{...e.assets,signal:s.signal})):{plan:l,diagnostics:[]},B=h.plan;i.push(...I(h.diagnostics));const C=B.pages.reduce((g,w)=>g+w.components.reduce((v,R)=>v+T(R),0),0);o.assertBudget(t,"maxPages",B.pages.length),o.assertBudget(t,"maxCells",C);const S=b.reportFontFingerprint(s.pdf),_=e.pagination?.measurer||Object.values(e.reports).some(g=>g.pagination?.measurer);return{plan:B,diagnostics:i,revisions:y,sources:x,layout:{textMetrics:S?"font-bytes":_?"provided":"heuristic",...S?{fontFingerprint:S}:{}},stats:{rows:m,pages:B.pages.length,cells:C,durationMs:Date.now()-u}}},c=async s=>{const r=Date.now();if(s.format!=="pdf"&&s.format!=="xlsx")throw new n.ReportSourceError("config","不支持的报表导出格式");const u=s.format==="pdf"?await import("@agile-team/mach-report/pdf"):void 0;o.throwIfAborted(s.signal);const m=s.pdf?.customFontFaces??(s.pdf?.customFontBytes?{regular:s.pdf.customFontBytes}:void 0),p=u&&m?u.createFontBytesMeasurer(m):void 0,i=await a(s,p);return o.throwIfAborted(s.signal),q({...s,prepared:i},t,r)};return{describe:s=>H(e.reports,s),validate:s=>j(e.reports,s),prepare:s=>o.controlled(s.signal,t.maxDurationMs,async r=>{const{signal:u,onEvent:m,...p}=A(s),i={...p,...p.pdf?{pdf:b.snapshotPdfFonts(p.pdf)}:{},taskId:p.taskId??n.reportTaskId()},y=m?h=>n.notifyReportTaskEvent(m,h,r):void 0,x={...i,signal:r,onEvent:y};n.createReportTaskReporter(x).runSync("validate",()=>L(e,i));let d;const f=i.pdf?.customFontFaces??(i.pdf?.customFontBytes?{regular:i.pdf.customFontBytes}:void 0);if(!e.executor&&f){const h=await import("@agile-team/mach-report/pdf");o.throwIfAborted(r),d=h.createFontBytesMeasurer(f)}const l=e.executor?await e.executor.prepare(i,r,y):await a(x,d);return O(l,t)}),exportPrepared:s=>o.controlled(s.signal,t.maxDurationMs,async r=>{const u=Date.now(),{signal:m,onEvent:p,...i}=s,y=O(b.snapshotPreparedReport(s.prepared,t.maxPreparedBytes??64e6,r),t),x={...i,xlsx:b.snapshotXlsxOptions(i.xlsx),prepared:y,...i.pdf?{pdf:b.snapshotPdfFonts(i.pdf)}:{},taskId:i.taskId??n.reportTaskId()};if(x.format!=="pdf"&&x.format!=="xlsx")throw new n.ReportSourceError("config","不支持的报表导出格式");const d=p?l=>n.notifyReportTaskEvent(p,l,r):void 0;if(e.executor){if(!e.executor.exportPrepared)throw new n.ReportSourceError("config","执行器未实现 exportPrepared;请升级执行器或显式使用本地运行时");const l=await e.executor.exportPrepared(x,r,d);return o.assertBudget(t,"maxRows",l.stats.rows),o.assertBudget(t,"maxPages",l.stats.pages),o.assertBudget(t,"maxCells",l.stats.cells),o.assertBudget(t,"maxOutputBytes",l.bytes.byteLength),{...l,stats:{...l.stats,outputBytes:l.bytes.byteLength}}}const f={...x,signal:r,onEvent:d};if(n.createReportTaskReporter(f).runSync("validate",()=>b.checkPreparedFont(f)),e.assets){const l=await n.createReportTaskReporter(f).run("assets",()=>M.resolvePlanAssets(y.plan,{...e.assets,signal:r}));y.plan=l.plan,y.diagnostics.push(...I(l.diagnostics))}return q(f,t,u)}),export:s=>o.controlled(s.signal,t.maxDurationMs,async r=>{const{signal:u,onEvent:m,...p}=A(s),i={...p,xlsx:b.snapshotXlsxOptions(p.xlsx),...p.pdf?{pdf:b.snapshotPdfFonts(p.pdf)}:{},taskId:p.taskId??n.reportTaskId()},y=m?f=>n.notifyReportTaskEvent(m,f,r):void 0,x={...i,signal:r,onEvent:y};if(n.createReportTaskReporter(x).runSync("validate",()=>L(e,i)),i.format!=="pdf"&&i.format!=="xlsx")throw new n.ReportSourceError("config","不支持的报表导出格式");const d=e.executor?await e.executor.export(i,r,y):await c(x);return o.assertBudget(t,"maxRows",d.stats.rows),o.assertBudget(t,"maxPages",d.stats.pages),o.assertBudget(t,"maxCells",d.stats.cells),o.assertBudget(t,"maxOutputBytes",d.bytes.byteLength),{...d,stats:{...d.stats,outputBytes:d.bytes.byteLength}}})}}exports.createReportRuntime=K;exports.enforcePrepared=O;
@@ -1 +0,0 @@
1
- "use strict";const w=require("./json-snapshot-DknkjvxP.cjs"),j=require("./capabilities-DNLyZdNw.cjs"),L=require("./dataset-BkRmwgeJ.cjs"),h=require("./template-registry-C62vpv4a.cjs"),E=require("./template-bindings-CEtWyiLX.cjs"),P=require("./param-validation-C3HlcLLO.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=_;