@agile-team/mach-report 2.8.3 → 2.9.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 (95) hide show
  1. package/README.md +28 -10
  2. package/dist/ExcelBindingWizard-DiaxvWpQ.cjs +1 -0
  3. package/dist/ExcelBindingWizard-RLJIXKKG.js +816 -0
  4. package/dist/{ReportPreview-DRBAUkxj.js → ReportPreview-B5ZNEasW.js} +23 -22
  5. package/dist/ReportPreview-DRtVPUYo.cjs +6 -0
  6. package/dist/RuleEditor-N4qnMZ-Z.cjs +1 -0
  7. package/dist/RuleEditor-ynnUEK0s.js +1575 -0
  8. package/dist/TemplateReviewPanel-C_Lmzis6.cjs +1 -0
  9. package/dist/TemplateReviewPanel-Cn32OY4_.js +173 -0
  10. package/dist/{_plugin-vue_export-helper-DPbiz14D.js → _plugin-vue_export-helper-8SL1F89S.js} +2 -2
  11. package/dist/analytics.cjs +1 -1
  12. package/dist/analytics.d.cts +188 -5
  13. package/dist/analytics.d.ts +188 -5
  14. package/dist/analytics.js +68 -202
  15. package/dist/{assets-B9qJku3V.js → assets-DDsfEi8R.js} +3 -3
  16. package/dist/{assets-RZan7EyL.cjs → assets-ahTRUXRk.cjs} +1 -1
  17. package/dist/binding-preview-B5834rml.cjs +2 -0
  18. package/dist/binding-preview-ChXjN5L5.js +649 -0
  19. package/dist/{capabilities-joSutDF8.js → capabilities-Cm9hZ3uV.js} +5 -5
  20. package/dist/{capabilities-xGTpnPjJ.cjs → capabilities-DYzWL7KS.cjs} +1 -1
  21. package/dist/dataset-BkRmwgeJ.cjs +1 -0
  22. package/dist/dataset-H5pFuQGU.js +121 -0
  23. package/dist/defaults-DXhiM1ZD.js +10 -0
  24. package/dist/defaults-xhmcLLrf.cjs +1 -0
  25. package/dist/designer.cjs +2 -1
  26. package/dist/designer.d.cts +1391 -6
  27. package/dist/designer.d.ts +1391 -6
  28. package/dist/designer.js +2636 -673
  29. package/dist/grid-geometry-BNptEcMm.js +65 -0
  30. package/dist/grid-geometry-CZ_cYB6O.cjs +1 -0
  31. package/dist/import-template-CNMLJSQw.js +23030 -0
  32. package/dist/import-template-CpxunKVp.cjs +29 -0
  33. package/dist/index.cjs +7 -7
  34. package/dist/index.d.cts +202 -3
  35. package/dist/index.d.ts +202 -3
  36. package/dist/index.js +554 -535
  37. package/dist/matrix-CNPDJxED.js +745 -0
  38. package/dist/matrix-Div9Ilh3.cjs +1 -0
  39. package/dist/pdf.cjs +46 -46
  40. package/dist/pdf.d.cts +2 -0
  41. package/dist/pdf.d.ts +2 -0
  42. package/dist/pdf.js +17 -16
  43. package/dist/{plugin-BurDDMcd.js → plugin-BWwIgZXV.js} +1 -1
  44. package/dist/{plugin-DSFu51Ua.cjs → plugin-Dg-J1Rbm.cjs} +1 -1
  45. package/dist/progress-7OSZbFok.js +39 -0
  46. package/dist/progress-BnLiS5eH.cjs +1 -0
  47. package/dist/render-plan-7xpGrCEl.cjs +1 -0
  48. package/dist/render-plan-Ck6koX9L.js +13 -0
  49. package/dist/server/node.d.cts +62 -0
  50. package/dist/server/node.d.ts +62 -0
  51. package/dist/server-node.cjs +1 -1
  52. package/dist/server-node.js +373 -145
  53. package/dist/server.cjs +1 -1
  54. package/dist/server.d.cts +311 -0
  55. package/dist/server.d.ts +311 -0
  56. package/dist/server.js +590 -186
  57. package/dist/{style-Dv5o_x6b.js → style-CQ1PK8ZB.js} +5 -5
  58. package/dist/style-UgIJSA1F.cjs +1 -0
  59. package/dist/style.css +1 -1
  60. package/dist/template-registry-CHMYZ7SD.cjs +1 -0
  61. package/dist/template-registry-R61AMCr0.js +433 -0
  62. package/dist/template-review-hvWWQFsi.js +1027 -0
  63. package/dist/template-review-jEcOfmGr.cjs +1 -0
  64. package/dist/textwrap-CWHyzkBH.cjs +4 -0
  65. package/dist/{textwrap-DOl04hCQ.js → textwrap-DE1kgcJB.js} +1 -1
  66. package/dist/{validate-DfHPD8wX.cjs → validate-BDiMqkJC.cjs} +1 -1
  67. package/dist/{validate-S6CgIm5d.js → validate-DWPF7icl.js} +13 -13
  68. package/dist/vue/async.d.cts +186 -0
  69. package/dist/vue/async.d.ts +186 -0
  70. package/dist/vue/index.d.cts +271 -3
  71. package/dist/vue/index.d.ts +271 -3
  72. package/dist/vue-async.cjs +1 -1
  73. package/dist/vue-async.js +3 -3
  74. package/dist/vue.cjs +1 -1
  75. package/dist/vue.js +4 -4
  76. package/dist/worker.cjs +1 -1
  77. package/dist/worker.d.cts +2 -0
  78. package/dist/worker.d.ts +2 -0
  79. package/dist/worker.js +1 -1
  80. package/dist/xlsx.cjs +2 -30
  81. package/dist/xlsx.d.cts +268 -0
  82. package/dist/xlsx.d.ts +268 -0
  83. package/dist/xlsx.js +220 -23440
  84. package/package.json +1 -1
  85. package/dist/ReportPreview-DjGeWHY-.cjs +0 -6
  86. package/dist/progress-DD964VAB.js +0 -102
  87. package/dist/progress-KvhwXZ1Q.cjs +0 -1
  88. package/dist/render-plan-CckPEQyf.cjs +0 -1
  89. package/dist/render-plan-uzZYYSy1.js +0 -19
  90. package/dist/report-source-BXHNy_AD.js +0 -755
  91. package/dist/report-source-CCAvFE3t.cjs +0 -1
  92. package/dist/style-CpwiOPyB.cjs +0 -1
  93. package/dist/template-registry-DWExx0gU.cjs +0 -1
  94. package/dist/template-registry-NpOakidD.js +0 -354
  95. package/dist/textwrap-CnGsEum6.cjs +0 -4
@@ -0,0 +1 @@
1
+ "use strict";const me=require("./render-plan-7xpGrCEl.cjs"),Re=require("./validate-BDiMqkJC.cjs"),Ce=require("./report-params-CjWrjPl6.cjs"),B=require("./template-registry-CHMYZ7SD.cjs"),ie=require("./param-validation-CiTxFeZ8.cjs"),Ae=require("./task-events-DQ276fn2.cjs"),fe=require("./dataset-BkRmwgeJ.cjs"),D=require("./defaults-xhmcLLrf.cjs"),K=require("./textwrap-CWHyzkBH.cjs"),A=require("./matrix-Div9Ilh3.cjs"),E=require("./style-UgIJSA1F.cjs"),Fe=require("./capabilities-DYzWL7KS.cjs");function Z(e){if(!e||e.kind==="date")return;const t=e.digits;if(!(t!==void 0&&(!Number.isInteger(t)||t<0||t>100))){if(e.kind==="percent"){const r=t??2;return`0${r?`.${"0".repeat(r)}`:""}%`}return t===void 0?e.thousands?"#,##0.###############":void 0:`${e.thousands?"#,##0":"0"}${t?`.${"0".repeat(t)}`:""}`}}function ge(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const r=new Date(e);return Number.isNaN(r.getTime())?null:r}function Y(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function Ne(e,t){const r=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,r(e.getMonth()+1)).replace(/DD/g,r(e.getDate())).replace(/hh/g,r(e.getHours())).replace(/mm/g,r(e.getMinutes())).replace(/ss/g,r(e.getSeconds()))}function He(e,t,r){return r!=null?t?Y(e,r):e.toFixed(r):t?Y(e):String(e)}function J(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function ee(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{if(typeof e=="string")try{return A.formatDecimal(e,t.digits,t.thousands===!0)}catch{return e}const r=J(e);return r==null?String(e):He(r,t.thousands===!0,t.digits)}case"percent":{if(typeof e=="string")try{return A.formatDecimal(e,t.digits??2,!0,!0)}catch{return e}const r=J(e);return r==null?String(e):`${Y(r*100,t.digits??2)}%`}case"date":{const r=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:ge(String(e));return n?Ne(n,r):String(e)}default:return String(e)}}function L(e,t){const r=e[t.field];if(r==null||r==="")return!1;if(typeof t.value=="number"||t.numeric!==void 0){let o;try{o=A.compareDecimal(A.parseDecimal(r),A.parseDecimal(t.value))}catch{return!1}if(!Number.isFinite(o))return!1;switch(t.op){case">":return o>0;case">=":return o>=0;case"<":return o<0;case"<=":return o<=0;case"==":return o===0;case"!=":return o!==0}}const n=String(r),a=String(t.value);switch(t.op){case"==":return n===a;case"!=":return n!==a;case">":return n>a;case">=":return n>=a;case"<":return n<a;case"<=":return n<=a}return!1}function Le(e,t,r){const n=new Set,a=e.cells.map((o,s)=>{const i=[];let c=0;for(const l of o){for(;n.has(`${s}:${c}`);)c++;const d=l?.colSpan??1,g=l?.rowSpan??1;let f=0;for(let h=c;h<c+d;h++){t.has(h)&&f++;for(let p=s+1;p<s+g;p++)n.add(`${p}:${h}`)}f&&i.push(l?{...l,colSpan:f}:null),c+=d}return i});return{...e,cells:a,colWidthsMm:r}}function he(e){if(!e.columns.some(n=>n.hidden))return e;const t=new Set,r=e.columns.filter((n,a)=>n.hidden?!1:(t.add(a),!0));if(!r.length)throw new Error("列表至少需要一列可见列");return{...e,columns:r,...e.headerGrid?{headerGrid:Le(e.headerGrid,t,r.map(n=>n.widthMm))}:{}}}class O extends Error{constructor(t,r){super(`报表页数超出上限 ${t}(至少 ${r} 页)`),this.limit=t,this.actual=r,this.code="page-limit",this.name="PaginatePageLimitError"}}class I extends Error{constructor(t,r){super(`报表单元格数量超出上限 ${t}(至少 ${r} 格)`),this.limit=t,this.actual=r,this.code="cell-limit",this.name="PaginateCellLimitError"}}function De(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 ce(e,t){const r=t.heightMm-(e.layout==="wide"?t.marginBottomMm:e.marginBottomMm??t.marginBottomMm);return e.components.reduce((n,a)=>a.kind!=="list"&&a.pageAnchor==="footer"?Math.min(n,a.topMm):n,r)}function le(e){return e.components.reduce((t,r)=>r.kind!=="list"&&r.pageAnchor==="header"?Math.max(t,r.topMm+r.heightMm):t,0)}function te(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function pe(e,t){let r=e.textMetrics.get(t);if(!r){const n=E.resolveFontSize(t).fontSizePt;r={measureOptions:{fontSizePt:n,fontFamily:t.fontFamily??D.DEFAULT_FONT_FAMILY,italic:t.italic,bold:t.bold,letterSpacingPt:t.letterSpacing},lineMm:n*(t.lineHeight??D.LINE_HEIGHT)*25.4/72},e.textMetrics.set(t,r)}return r}function ye(e,t,r){return r==="identifier"||r==="dimension"||r==="date"?"center":r==="measure"?"right":r==="text"?"left":t?.kind==="number"||t?.kind==="percent"?"right":t?.kind==="date"||e instanceof Date||typeof e=="boolean"?"center":typeof e=="number"&&Number.isFinite(e)?"right":"left"}function Oe(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??D.DEFAULT_FONT_PT,n=e.paddingMm??1,a=e.columns.map(u=>u.align??u.style?.align??e.align??"left"),o=e.columns.map((u,m)=>({...E.mergeComponentStyles({fontSize:r,verticalAlign:"middle"},u.style),align:a[m]==="auto"?"left":a[m]})),s=o.map((u,m)=>a[m]==="auto"?{left:u,center:{...u,align:"center"},right:{...u,align:"right"}}:void 0),i=e.columns.map((u,m)=>u.rules?.map(w=>{const M=s[m];if(M)return{left:E.mergeComponentStyles(M.left,w.style),center:E.mergeComponentStyles(M.center,w.style),right:E.mergeComponentStyles(M.right,w.style)};const S=E.mergeComponentStyles(o[m],w.style);return{left:S,center:S,right:S}})),c=e.columns.map(u=>{let m=E.mergeComponentStyles({fontSize:r,bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor},u.style);return e.headerAlign!==void 0&&(m.align=e.headerAlign),m=E.mergeComponentStyles(m,e.headerStyle),u.headerAlign!==void 0&&(m.align=u.headerAlign),E.mergeComponentStyles(m,u.headerStyle)}),l=e.columns.map(u=>u.header);let d=e.rowHeightMm??0;for(let u=0;u<l.length;u++){const m=c[u],w=E.resolveFontSize(m).fontSizePt,M=K.wrapText(l[u],e.columns[u].widthMm-n*2,{fontSizePt:w,fontFamily:m.fontFamily??D.DEFAULT_FONT_FAMILY,italic:m.italic,bold:m.bold,letterSpacingPt:m.letterSpacing},t),S=w*(m.lineHeight??D.LINE_HEIGHT)*25.4/72;d=Math.max(d,Math.max(M.length,1)*S+n*2)}const g=l.map((u,m)=>({text:u,style:c[m]})),f=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0},h=e.columns.map(u=>u.widthMm),p=Ie(e.headerGrid,h,{cells:[g],colWidthsMm:h,rowHeightsMm:[d],paddingMm:n});return{fontSizePt:r,paddingMm:n,cellStyles:o,autoStyles:s,ruleStyles:i,textMetrics:new WeakMap,numberFormats:e.columns.map(u=>Z(u.format)),borderStyle:f,headerHeightMm:p.rowHeightsMm.reduce((u,m)=>u+m,0),headerGrid:p,colWidthsMm:h,columns:e.columns}}function Ie(e,t,r){if(!e)return r;if(!e.cells.length)throw new Error("自定义列表表头至少需要一行");const n=e.rowHeightsMm??e.cells.map(()=>r.rowHeightsMm[0]);if(n.length!==e.cells.length||n.some(a=>!Number.isFinite(a)||a<=0))throw new Error("自定义列表表头行高无效");return{...e,colWidthsMm:t,rowHeightsMm:n}}function We(e,t,r){const n=t.format?.kind==="number"||t.format?.kind==="percent";t.valueType!==void 0?e.valueType=t.valueType:n&&(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 U(e,t,r){const n=e.columns;let a=e.rowHeightFloorMm;const o=new Array(n.length);for(let s=0;s<n.length;s++){const i=n[s],c=i.visibleWhen&&!L(t,i.visibleWhen)?null:t[i.field],l=e.autoStyles[s]?ye(c,i.format,i.semanticRole):"left";let d=e.autoStyles[s]?.[l]??e.cellStyles[s];if(i.rules)for(let m=0;m<i.rules.length;m++){const w=i.rules[m];if(L(t,w.when)){d=e.ruleStyles[s][m][l];break}}const g=i.format?ee(c,i.format):te(c),f=pe(e,d),h=K.wrapText(g,i.widthMm-e.paddingMm*2,f.measureOptions,r);a=Math.max(a,h.length*f.lineMm+e.paddingMm*2);const p=Oe(c),u={text:g,style:d};p!==void 0&&(u.value=p),We(u,i,e.numberFormats[s]),i.visibleWhen&&c===null&&!L(t,i.visibleWhen)&&(u.editable=!1),o[s]=u}return{grid:{cells:[o],colWidthsMm:e.colWidthsMm,rowHeightsMm:[a],paddingMm:e.paddingMm},heightMm:a}}function Me(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*be(e,t,r=0){const n=t[r];if(!n){for(const o of e)yield{kind:"row",row:o};return}const a=new Map;for(const o of e){const s=Me(o[n.field]),i=a.get(s);i?i.push(o):a.set(s,[o])}for(const o of a.values())yield{kind:"groupHeader",label:(n.headerTemplate??"{value}").replace(/\{value\}/g,te(o[0][n.field])),firstRow:o[0],group:n,depth:r,rows:o},yield*be(o,t,r+1),(n.subtotal?.length||n.aggregates?.length)&&(yield{kind:"subtotal",label:n.subtotalLabel??"小计",rows:o,group:n,depth:r}),yield{kind:"groupEnd",depth:r}}function $e(e,t,r,n=[]){const a=[...r.filter(o=>!n.some(s=>s.field===o)).map(o=>({field:o,op:"sum"})),...n];return new Map(a.map(o=>{const s=e.find(c=>c.field===o.field)?.format??{kind:"number",thousands:!0},i=A.aggregateRows(t,{...o,field:o.valueField??o.field});return[o.field,{text:ee(i,s),...i===null?{}:{value:i},...typeof i=="number"?{numberFormat:Z(s)}:{}}]}))}function Se(e,t){const r=e.findIndex(n=>t.includes(n.field));return r>0?r:1}function W(e,t,r,n,a,o){const s=[],i=Math.max(1,Math.min(o,e.columns.length)),c=E.mergeComponentStyles({fontSize:e.fontSizePt},a);s.push({text:r,colSpan:i,style:{bold:!0,...c}});for(let g=i;g<e.columns.length;g++){const f=e.columns[g],h=n.get(f.field),p=e.autoStyles[g]?.[ye(h?.value,f.format)]??e.cellStyles[g];s.push({...h,text:h?.text??"",style:E.mergeComponentStyles(p,a)})}let l=e.rowHeightFloorMm,d=0;for(const g of s){let f=0;const h=d+(g.colSpan??1);for(;d<h;d++)f+=e.colWidthsMm[d]??0;const p=pe(e,g.style),u=K.wrapText(g.text??"",f-e.paddingMm*2,p.measureOptions,t);l=Math.max(l,u.length*p.lineMm+e.paddingMm*2)}return{grid:{cells:[s],colWidthsMm:e.colWidthsMm,rowHeightsMm:[l],paddingMm:e.paddingMm},heightMm:l}}function Be(e,t,r){const{templatePage:n,current:a,warnings:o,nextId:s,pushCurrent:i}=r,c=()=>ce(n,a),l=Math.max(a.marginTopMm,le(n)),d=n.layout==="wide"?le(n):l,g={id:r.tableId,columnKeys:e.columns.map(y=>y.field),...e.layout===void 0?{}:{layout:e.layout},...e.title===void 0?{}:{title:e.title}},f=new Map,h=new Map,p={kind:"rect",leftMm:e.leftMm,topMm:0,widthMm:e.widthMm,heightMm:t.headerHeightMm,grid:t.headerGrid,nid:s("listh"),table:{...g,role:"header",rowIndex:-1},style:t.borderStyle},u=y=>a.components.push({...p,topMm:y});let m=Math.max(e.topMm,l);u(m),m+=t.headerHeightMm+r.mmPerRow;function w(){const y=Math.max(n.layout==="wide"?0:e.topMm,d);return(e.headerEveryPage!==!1?y+t.headerHeightMm:d)+[...h.values()].reduce((P,R)=>P+R.heightMm,0)}function M(){const y=n.layout==="wide"?0:a.marginBottomMm;return Math.min(n.heightMm-y,ce(n,a))-w()}function S(y){if(m+y<=c())return;i(),a.components=[],a.heightMm=n.heightMm,n.layout==="wide"&&(a.marginTopMm=0,a.marginBottomMm=0);const x=Math.max(n.layout==="wide"?0:e.topMm,d);e.headerEveryPage!==!1?(u(x),m=x+t.headerHeightMm):m=d;for(const P of h.values())b(P,"listgr","group-header")}function _(y,x,P,R){const N=M();y.heightMm>N&&o.push(`列表 ${e.id??e.dataset} 行高 ${y.heightMm.toFixed(2)}mm 超出单页可用高度 ${N.toFixed(2)}mm,预览与打印可能截断内容`),S(y.heightMm),b(y,x,P,R)}function b(y,x,P,R){const N=y.table?.id??g.id,se=P==="header"?-1:f.get(N)??0;P!=="header"&&f.set(N,se+1),a.components.push({kind:"rect",leftMm:e.leftMm,topMm:m,widthMm:e.widthMm,heightMm:y.heightMm,grid:y.grid,nid:s(x),table:{...g,...y.table,role:P,rowIndex:se,...R?{source:R}:{}},style:t.borderStyle}),m+=y.heightMm}function k(y){y<=M()&&S(y)}return{keepTogether:k,placeGridRow:_,setGroupHeader:(y,x)=>{x?h.set(y,x):h.delete(y)}}}function je(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 n=e.revisionField?t[e.revisionField]:void 0,a=e.sourceTokenField?t[e.sourceTokenField]:void 0;if(n!==void 0&&typeof n!="string"&&!(typeof n=="number"&&Number.isFinite(n)))throw new Error("业务修订号应为字符串或有限数字");if(a!==void 0&&typeof a!="string")throw new Error("来源令牌应为字符串");return{datasetId:e.dataset,rowKey:r,...n===void 0?{}:{revision:n},...a===void 0?{}:{sourceToken:a}}}function ve(e,t){const r=new Map;if(!e.rowKey)return r;const n=new Set;for(const a of t){const o=je(e,a),s=JSON.stringify(o.rowKey);if(n.has(s))throw new Error(`数据集 ${e.dataset} 的业务主键重复:${String(o.rowKey)}`);n.add(s),r.set(a,o)}return r}function Ge(e,t,r,n,a){if(!e.grandTotal)return;const o=typeof e.grandTotal=="object"?e.grandTotal:void 0,s=ne(e)[0],i=o?.fields??s?.subtotal??[],c=o?.aggregates??s?.aggregates??[];if(i.length===0&&c.length===0){n.warnings.push(`列表 ${e.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`);return}const l=W(r,n.measurer,o?.label??"合计",$e(e.columns,t,i,c),o?.style??{},Se(e.columns,[...i,...c.map(d=>d.field)]));a.placeGridRow(l,"listgt","grand-total")}function re(e){if(e?.aborted){const t=new Error("报表排版已取消");throw t.name="AbortError",t}}function ne(e){const t=e.groups??(e.groupBy?[e.groupBy]:[]);if(t.length>16)throw new Error("列表最多支持 16 级分组");return t}function xe(e){const t=he(e),r=t.columns.reduce((a,o)=>a+o.widthMm,0),n=r>t.widthMm?t.widthMm/r:1;return n===1?t:{...t,columns:t.columns.map(a=>({...a,widthMm:a.widthMm*n}))}}function Ke(e,t,r){const n=e.detail;if(!n)return;const a=new Set;for(const c of t){const l=Q(c[n.parentKey]);if(a.has(l))throw new Error("主从明细的主表关联键重复");a.add(l)}const o=r.datasets[n.dataset]??[],s=new Map;for(const c of o){const l=Q(c[n.foreignKey]);if(!a.has(l)){if(n.unmatched!=="ignore")throw new Error(`明细数据集 ${n.dataset} 存在未关联的业务键`);continue}const d=s.get(l);d?d.push(c):s.set(l,[c])}const i=xe({...e,id:`${e.id??e.dataset}:detail`,dataset:n.dataset,rowKey:n.rowKey,columns:n.columns,headerGrid:void 0,rowHeightMm:n.rowHeightMm??e.rowHeightMm,detail:void 0});return{list:i,inter:{...we(i,r.measurer),rowHeightFloorMm:i.rowHeightMm??0},rows:s,sources:ve(i,o)}}function Q(e){if((typeof e!="string"||!e.trim())&&!(typeof e=="number"&&Number.isFinite(e)))throw new Error("主从关联键必须是非空字符串或有限数字");return Me(e)}function*qe(e,t,r,n,a){if(!r)return;const o=r.rows.get(Q(t[e.detail.parentKey]))??[];if(!o.length)return;const s={id:`${n.tableId}:detail`,columnKeys:r.list.columns.map(i=>i.field),title:e.detail.label};e.detail.label&&a.placeGridRow({...W(r.inter,n.measurer,e.detail.label,new Map,{},r.list.columns.length),table:s},"listdl","group-header"),e.detail.header!==!1&&a.placeGridRow({grid:r.inter.headerGrid,heightMm:r.inter.headerHeightMm,table:s},"listdh","header"),yield*n.takePages();for(const i of o)re(n.signal),a.placeGridRow({...U(r.inter,i,n.measurer),table:s},"listdr","body",r.sources.get(i)),yield*n.takePages()}function Ve(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=A.createMatrixTable(t,e.matrix),n=r.columns.map((o,s)=>({...o,widthMm:s===0?e.matrix.rowWidthMm??40:e.matrix.columnWidthMm??28,editable:!1,align:s===0?"center":"right"})),a={...e,columns:n,headerGrid:void 0,rowKey:void 0,revisionField:void 0,sourceTokenField:void 0};return e.layout==="wide"&&(a.widthMm=n.reduce((o,s)=>o+s.widthMm,0)),{list:a,rows:r.rows}}function _e(e,t,r){const n=r.prepared.get(e);if(n)return n;let a=e.computed?.length?A.computeDataset(t,{fields:e.computed,signal:r.signal,formula:r.formula}).rows:t;e.rowVisibleWhen&&(a=a.filter(s=>L(s,e.rowVisibleWhen)));const o=Ve(e,a);return r.prepared.set(e,o),o}function*ze(e,t,r){const n=_e(e,t,r),a=n.rows;e=n.list,e.layout==="wide"&&(r.current.widthMm=Math.max(r.current.widthMm,e.leftMm+e.widthMm+r.current.marginRightMm));const o=ve(e,a),s=xe(e),i=ne(s),c={...we(s,r.measurer),rowHeightFloorMm:s.rowHeightMm??0},l=Be(s,c,r),d=Ke(s,a,r);let g;for(const f of be(a,i)){if(re(r.signal),f.kind==="row")l.placeGridRow(g??U(c,f.row,r.measurer),"listr","body",o.get(f.row)),g=void 0,yield*r.takePages(),yield*qe(s,f.row,d,r,l);else if(f.kind==="groupHeader"){const h=W(c,r.measurer,f.label,new Map,f.group.headerStyle??{},s.columns.length);g??=U(c,f.firstRow,r.measurer);const p=i.slice(f.depth+1).reduce((u,m)=>u+W(c,r.measurer,(m.headerTemplate??"{value}").replace(/\{value\}/g,te(f.firstRow[m.field])),new Map,m.headerStyle??{},s.columns.length).heightMm,0);f.group.keepWithNext!==!1&&l.keepTogether(h.heightMm+p+g.heightMm),l.placeGridRow(h,"listg","group-header"),f.group.repeatHeader&&l.setGroupHeader(f.depth,h)}else if(f.kind==="subtotal"){const h=f.group.subtotal??[],p=f.group.aggregates??[],u=W(c,r.measurer,f.label,$e(s.columns,f.rows,h,p),f.group.subtotalStyle??{},Se(s.columns,[...h,...p.map(m=>m.field)]));l.placeGridRow(u,"listst","subtotal")}else l.setGroupHeader(f.depth);yield*r.takePages()}Ge(s,a,c,r,l),yield*r.takePages()}function j(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 q(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(n=>({...n,...n.text===void 0?{}:{text:t(n.text)}}))}))}:{},...e.grid?{grid:{...e.grid,cells:e.grid.cells.map(r=>r.map(n=>n?{...n,...n.text===void 0?{}:{text:t(n.text)},...n.children?{children:n.children.map(a=>q(a,t))}:{}}:null))}}:{}}}function Ye(e){let t=!1;for(const r of e.pages)for(const n of r.components)j(n)&&q(n,a=>(a.includes("{totalPages}")&&(t=!0),a));return t}function Je(e,t,r,n,a,o){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},i=c=>{const l=c.replace(/\{page\}/g,String(n));return o===void 0?l:l.replace(/\{totalPages\}/g,String(o))};for(const c of r)s.components.push(q(c,i));if(e.layout==="wide"){const c=s.components.reduce((l,d)=>Math.max(l,d.topMm+d.heightMm),0);s.marginBottomMm=a?e.marginBottomMm??0:0,s.pageHeightMm=Math.max(1,c+s.marginBottomMm)}return s}function Pe(e){return e.cells.reduce((t,r)=>t+r.reduce((n,a)=>n+(a?1+(a.children?.reduce((o,s)=>o+Te(s),0)??0):0),0),0)}function Te(e){return e.grid?Pe(e.grid):0}function ae(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*G(e,t,r,n,a,o=new WeakMap){let s=0,i=0,c=0;const l=d=>`${d}_${(++s).toString(36)}`;for(const[d,g]of e.pages.entries()){re(r.signal);const f=De(g),h=g.components.filter(j);let p=[];const u=(w=!1)=>{if(r.maxPages!==void 0&&i>=r.maxPages)throw new O(r.maxPages,i+1);if(r.maxCells!==void 0&&(c+=[...f.components,...h].reduce((M,S)=>M+Te(S),0),c>r.maxCells))throw new I(r.maxCells,c);p.push(Je(g,f,h,++i,w,a))},m=()=>{const w=p;return p=[],w};for(const[w,M]of g.components.entries()){if(j(M))continue;if(M.kind!=="list"){f.components.push(M);continue}const S=t[M.dataset];Array.isArray(S)||n.push(`数据集 ${M.dataset} 未提供数据,列表 ${M.id??""} 输出为空`),yield*ze(M,Array.isArray(S)?S:[],{templatePage:g,current:f,warnings:n,nextId:l,pushCurrent:u,takePages:m,datasets:t,signal:r.signal,formula:r.formula,prepared:o,measurer:r.measurer??K.heuristicMeasurer,mmPerRow:r.mmPerRow??0,tableId:`table:${d}:${w}`})}u(!0),yield*m()}}function Ue(e,t,r={}){ae(r);let n=0;for(const a of G(e,t,{...r},[]))n++;return n}function*Qe(e,t,r={}){ae(r);const n=Ye(e),a=new WeakMap;let o=r.knownTotalPages;if(n&&o===void 0){o=0;for(const c of G(e,t,r,[],void 0,a))o++}const s=[];let i=0;for(const c of G(e,t,r,s,o,a)){for(;i<s.length;i++)r.onWarning?.(s[i]);yield c}}function oe(e,t,r={}){const n=typeof r=="number"?{mmPerRow:r}:r;ae(n);const a=[],o=[...G(e,t,n,a,n.knownTotalPages)];for(const s of o)s.components=s.components.map(i=>j(i)?q(i,c=>c.replace(/\{totalPages\}/g,String(o.length))):i);return a.forEach(s=>n.onWarning?.(s)),{plan:{schemaVersion:me.RENDER_PLAN_SCHEMA_VERSION,pages:o},warnings:a}}function Xe(e,t,r={}){if(e.matrix){let i=t[e.dataset]??[];e.computed?.length&&(i=A.computeDataset(i,{fields:e.computed,...r}).rows),e.rowVisibleWhen&&(i=i.filter(l=>L(l,e.rowVisibleWhen)));const c=A.estimateMatrixTable(i,e.matrix);return c.cells+c.columnCount}const n=t[e.dataset]?.length??0,a=e.columns.filter(i=>!i.hidden).length,o=ne(e).length;let s=(n*(1+2*o)+ +!!e.grandTotal)*a;if(s+=e.headerGrid?Pe(e.headerGrid):a,e.detail){const i=t[e.detail.dataset]?.length??0,c=e.detail.columns.filter(l=>!l.hidden).length;s+=(i+n*(+(e.detail.header!==!1)+ +!!e.detail.label))*c}if(!Number.isSafeInteger(s))throw new RangeError("报表单元格估算超出安全整数预算");return s}function Ze(e){if(!("mapData"in e))return e;const{load:t,mapData:r,...n}=e;return{...n,load:async a=>{const o=await t(a);C(a.signal);try{return r(o,a)}catch(s){throw new $("validate",`报表 ${a.reportId} 数据映射失败`,s)}}}}class $ extends Error{constructor(t,r,n){super(r),this.name="ReportSourceError",this.code=t,this.cause=n}}function V(e){const t=new Error("报表加载已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e.reason}),t}function C(e){if(e?.aborted)throw V(e)}function X(e,t){return t?new Promise((r,n)=>{const a=()=>t.removeEventListener("abort",o),o=()=>{a(),n(V(t))};t.addEventListener("abort",o,{once:!0}),t.aborted&&o(),Promise.resolve(e).then(s=>{a(),r(s)},s=>{a(),n(s)})}):Promise.resolve(e)}function et(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new $("validate",`报表 ${t} 的数据集应为对象`);for(const[r,n]of Object.entries(e))if(!Array.isArray(n)||n.some(a=>!a||typeof a!="object"||Array.isArray(a)))throw new $("validate",`报表 ${t} 的数据集 ${r} 应为对象数组`)}async function tt(e,t,r){const{reportId:n,signal:a}=t;try{const o=await X(e(t),a);C(a);const s=B.validateReportTemplate(o);if(!s.ok)throw new $("validate",`报表 ${n} 模板校验失败:${s.errors.slice(0,3).map(i=>`${i.path}: ${i.message}`).join("; ")}`);return r.push(...s.warnings.map(i=>`${n}: ${i.path}: ${i.message}`)),o}catch(o){throw a?.aborted?V(a):o instanceof $?o:o instanceof B.ReportTemplateError?new $("validate",`报表 ${n} 模板校验失败:${o.message}`,o):new $("fetch",`报表 ${n} 模板加载失败:${o instanceof Error?o.message:String(o)}`,o)}}async function rt(e,t,r,n){const a=t.signal;let o;try{if(e.load)o=await X(e.load(t),a);else if(e.provider){const s=await X(e.provider.query(t),a);C(a),nt(s,r),o=s.datasets,n?.(r,s)}else o=e.datasets??{}}catch(s){throw a?.aborted?V(a):s instanceof $?s:new $("fetch",`报表 ${r} 取数失败:${s instanceof Error?s.message:String(s)}`,s)}return C(a),o}function nt(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new $("validate",`报表 ${t} Provider 应返回 datasets 结果对象`);for(const r of["revision","sourceToken"])if(e[r]!==void 0&&typeof e[r]!="string")throw new $("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 $("validate",`报表 ${t} Provider diagnostics 不符合结构化诊断契约`)}function at(e,t,r){for(const[n,a]of Object.entries(e.dataSchema??{})){let o;try{o=fe.validateDatasetRows(Object.prototype.hasOwnProperty.call(t,n)?t[n]:void 0,a,{...e.dataValidation,path:`$.datasets.${n}`})}catch(s){throw new $("config",`报表 ${r} 数据集 ${n} 字段契约配置无效`,s)}if(!o.ok)throw new $("validate",`报表 ${r} 数据集 ${n} 不符合字段契约:${o.issues[0]?.message}`,{issues:o.issues})}}function ot(e){const t=r=>r.grid?.cells.reduce((n,a)=>n+a.reduce((o,s)=>o+(s?1+(s.children?.reduce((i,c)=>i+t(c),0)??0):0),0),0)??0;return e.pages.reduce((r,n)=>r+n.components.reduce((a,o)=>a+t(o),0),0)}function st(e,t,r,n){return{...e,signal:n??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 it(e,t,r,n,a,o){const s=a.maxPages===void 0?void 0:a.maxPages-a.usedPages,i=a.maxCells===void 0?void 0:a.maxCells-a.usedCells;try{if(s!==void 0&&s<1&&e.pages.length)throw new O(0,1);const c=st(r.pagination,s,i,o),l=oe(e,t,c),d=ot(l.plan);if(i!==void 0&&d>i)throw new I(i,d);return{...l,cells:d}}catch(c){let l=c;throw c instanceof O&&a.maxPages!==void 0&&c.limit===s&&(l=new O(a.maxPages,a.usedPages+c.actual)),c instanceof I&&a.maxCells!==void 0&&(l=new I(a.maxCells,a.usedCells+c.actual)),new $("validate",`报表 ${n} 排版失败:${l instanceof Error?l.message:String(l)}`,l)}}function ct(e,t,r,n){const a=new Map,o=s=>{let i=a.get(s);return i===void 0&&(i=JSON.stringify([r,n,s]),a.set(s,i)),i};for(const s of t.pages)e.push({...s,components:s.components.map(i=>i.table?{...i,table:{...i.table,id:o(i.table.id)}}:i)})}function lt(e,t={}){if(t.maxPages!==void 0&&(!Number.isSafeInteger(t.maxPages)||t.maxPages<1))throw new $("config","maxPages 应为正安全整数");if(t.maxCells!==void 0&&(!Number.isSafeInteger(t.maxCells)||t.maxCells<1))throw new $("config","maxCells 应为正安全整数");function r(a){const o=Object.prototype.hasOwnProperty.call(e,a)?e[a]:void 0;if(!o)throw new $("config",`未注册报表 ${a}`);return o}return Object.assign(async({reportIds:a,params:o,signal:s,onWarning:i,onQueryResult:c,...l})=>{C(s);const d=Ae.createReportTaskReporter({...l,signal:s}),g=[...a],f={...o};if(g.length===0)throw new $("config","缺少报表 ID");const h=g.map(r),p=d.runSync("validate",()=>h.map(b=>ie.assertReportParams(b.params??(typeof b.template=="function"?[]:b.template.params)??[],f))),u=[];let m=0;const w=[];for(const[b,k]of h.entries()){C(s);const v=g[b],y={reportId:v,params:p[b],signal:s},x=typeof k.template=="function"?await d.run("query",()=>tt(k.template,y,w),v):k.template;y.params=d.runSync("validate",()=>ie.assertReportParams(k.params??x.params??[],y.params),v);const P=await d.run("query",()=>rt(k,y,v,c),v);d.runSync("validate",()=>{et(P,v),t.onDatasets?.(v,P,x),at(k,P,v)},v),C(s);const R=d.runSync("layout",()=>it(x,P,k,v,{maxPages:t.maxPages,usedPages:u.length,maxCells:t.maxCells,usedCells:m},s),v);m+=R.cells,ct(u,R.plan,b,v),w.push(...R.warnings.map(N=>`${v}: ${N}`))}C(s);const M={schemaVersion:me.RENDER_PLAN_SCHEMA_VERSION,pages:u},S=d.runSync("validate",()=>{const b=Re.validateRenderPlan(M);if(!b.ok)throw new $("validate",`渲染计划校验失败:${b.errors.slice(0,3).map(k=>`${k.path}: ${k.message}`).join("; ")}`);return b});w.push(...S.warnings.map(b=>`${b.path}: ${b.message}`));const _=i??t.onWarning??(b=>console.warn("[mach-report]",b));for(const b of w)C(s),_(b);return C(s),M},{getParamDefs:a=>Ce.getReportParamDefs(e,a)})}function de(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 dt(e){return/\.(?: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 ue(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 ut(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(n=>!!n&&typeof n=="object"&&"required"in n&&n.required===!0):!!r&&typeof r=="object"&&"required"in r&&r.required===!0}function ke(e,t,r={}){const n=B.parseReportTemplate(e),a=B.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 i(d,g,f,h){const p=dt(g),u=d!=="moved"&&(p==="binding"||g==="$.id"||d==="removed"&&p==="structure"||ut(g,d,h));s.totalChanges++,u&&s.breakingChanges++,s.changes.length<o&&s.changes.push({kind:d,category:p,path:g,before:de(f),after:de(h),breaking:u})}function c(d,g,f){const h=ue(d),p=ue(g);if(!h||!p)return!1;const u=new Map(g.map((m,w)=>[m.field,w]));Array.from(h).forEach(([m,w],M)=>{const S=`${f}[${JSON.stringify(m)}]`;p.has(m)?(u.get(m)!==M&&i("moved",S,M,u.get(m)),l(w,p.get(m),S)):i("removed",S,w,void 0)});for(const[m,w]of p)h.has(m)||i("added",`${f}[${JSON.stringify(m)}]`,void 0,w);return!0}function l(d,g,f){if(!(Object.is(d,g)||f==="$.revision")){if(d===void 0||g===void 0){i(d===void 0?"added":"removed",f,d,g);return}if(Array.isArray(d)&&Array.isArray(g)){if((f.endsWith(".columns")||f.endsWith(".params"))&&c(d,g,f))return;for(let h=0;h<Math.max(d.length,g.length);h++)l(d[h],g[h],`${f}[${h}]`)}else if(d&&g&&typeof d=="object"&&typeof g=="object"&&!Array.isArray(d)&&!Array.isArray(g)){const h=d,p=g;for(const u of new Set([...Object.keys(h),...Object.keys(p)]))l(h[u],p[u],`${f}.${u}`)}else i("modified",f,d,g)}}return l(n,a,"$"),s.truncated=s.totalChanges>s.changes.length,s}function F(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function T(e,t,r){typeof e=="string"?r.push({field:e,path:t}):Array.isArray(e)&&e.forEach((n,a)=>T(n,`${t}[${a}]`,r))}function H(e,t,r){if(Array.isArray(e)){e.forEach((n,a)=>H(n,`${t}[${a}]`,r));return}if(F(e))for(const[n,a]of Object.entries(e))["field","weightField"].includes(n)?T(a,`${t}.${n}`,r):n!=="value"&&n!=="style"&&H(a,`${t}.${n}`,r)}function z(e,t,r){Array.isArray(e)&&e.forEach((n,a)=>{F(n)&&(typeof n.field=="string"&&n.valueField!==void 0&&n.valueField!==n.field&&r.summaries.add(n.field),T(n.valueField??n.field,`${t}[${a}].valueField`,r.fields),T(n.weightField,`${t}[${a}].weightField`,r.fields))})}function mt(e,t,r){for(const a of["rowKey","revisionField","sourceTokenField"])T(e[a],`${t}.${a}`,r.fields);!e.matrix&&Array.isArray(e.columns)&&e.columns.forEach((a,o)=>{F(a)&&(typeof a.field=="string"&&r.fields.push({field:a.field,path:`${t}.columns[${o}].field`,summary:!0}),H(a.rules,`${t}.columns[${o}].rules`,r.fields),H(a.visibleWhen,`${t}.columns[${o}].visibleWhen`,r.fields))}),H(e.rowVisibleWhen,`${t}.rowVisibleWhen`,r.fields),Array.isArray(e.computed)&&e.computed.forEach((a,o)=>{F(a)&&(typeof a.field=="string"&&r.generated.add(a.field),H(a.expression,`${t}.computed[${o}].expression`,r.fields),T(a.dependsOn,`${t}.computed[${o}].dependsOn`,r.fields),T(a.groupBy,`${t}.computed[${o}].groupBy`,r.fields))}),(Array.isArray(e.groups)?e.groups:e.groupBy?[e.groupBy]:[]).forEach((a,o)=>{F(a)&&(T(a.field,`${t}.groups[${o}].field`,r.fields),T(a.subtotal,`${t}.groups[${o}].subtotal`,r.fields),z(a.aggregates,`${t}.groups[${o}].aggregates`,r))}),F(e.grandTotal)&&(T(e.grandTotal.fields,`${t}.grandTotal.fields`,r.fields),z(e.grandTotal.aggregates,`${t}.grandTotal.aggregates`,r)),F(e.matrix)&&(T(e.matrix.rowFields,`${t}.matrix.rowFields`,r.fields),T(e.matrix.columnFields,`${t}.matrix.columnFields`,r.fields),z(e.matrix.measures,`${t}.matrix.measures`,r)),F(e.detail)&&T(e.detail.parentKey,`${t}.detail.parentKey`,r.fields)}function Ee(e){const t=[];function r(n,a){if(Array.isArray(n)){n.forEach((o,s)=>r(o,`${a}[${s}]`));return}if(F(n)){if(typeof n.dataset=="string"&&Array.isArray(n.columns)){const o={dataset:n.dataset,path:a,fields:[],generated:new Set,summaries:new Set};mt(n,a,o),typeof n.foreignKey=="string"&&T(n.foreignKey,`${a}.foreignKey`,o.fields),t.push(o)}for(const[o,s]of Object.entries(n))r(s,`${a}.${o}`)}}return r(e,"$.template"),t}function ft(e,t,r){for(const n of Ee(e)){const a=Object.prototype.hasOwnProperty.call(t,n.dataset)?t[n.dataset]:void 0;if(!a){r.push({code:"dataset",severity:"error",path:`${n.path}.dataset`,message:`未声明数据集 ${n.dataset}`});continue}const o=new Set(a.fields.map(s=>s.field));n.fields.forEach(({field:s,path:i,summary:c})=>{!o.has(s)&&!n.generated.has(s)&&!(c&&n.summaries.has(s))&&r.push({code:"field",severity:"error",path:i,field:s,message:`数据集 ${n.dataset} 缺少字段 ${s}`})})}}function gt(e,t,r,n){const a=r.maxSampleRows??1e3,o=Object.values(e.datasets).reduce((i,c)=>i+c.length,0);if(o>a)return n.push({code:"sample",severity:"error",path:"$.fixtures",fixture:e.name,message:`样例 ${o} 行超过预算 ${a},请显式选择验收样例`}),!1;const s=new Set(Ee(t).map(i=>i.dataset));for(const[i,c]of Object.entries(r.dataSchemas??{}).filter(([l])=>s.has(l)))try{const l=fe.validateDatasetRows(e.datasets[i],c,{path:`$.datasets.${i}`,maxRows:a});if(n.push(...l.issues.map(d=>({...d,code:"sample",severity:"error",fixture:e.name}))),!l.ok)return!1}catch(l){return n.push({code:"dataset",severity:"error",path:`$.dataSchemas.${i}`,message:String(l)}),!1}return!0}function ht(e,t,r){const n=t.pages[r.pageIndex]?.components[r.componentIndex],a=/^table:(\d+):(\d+)(?::|$)/.exec(n?.table?.id??"");if(a)return{path:`$.template.pages[${a[1]}].components[${a[2]}]`,pageIndex:Number(a[1]),componentIndex:Number(a[2])};for(const[o,s]of e.pages.entries()){const i=s.components.findIndex(c=>c===n||n?.nid!==void 0&&"nid"in c&&c.nid===n.nid);if(i>=0)return{path:`$.template.pages[${o}].components[${i}]`,pageIndex:o,componentIndex:i}}return{path:"$.template"}}function pt(e,t,r,n){if(gt(t,e.template,r,n.issues))try{const{plan:a,warnings:o}=oe(e.template,t.datasets,{maxPages:r.maxPages??100,maxCells:r.maxCells??25e4}),s=(r.formats??["pdf","xlsx"]).flatMap(i=>Fe.inspectOutputCapabilities(a,i));n.issues.push(...o.map(i=>({code:"layout",severity:"warning",path:"$.template",fixture:t.name,message:i}))),n.issues.push(...s.map(i=>({code:"output",severity:r.strictOutputs?"error":"warning",...ht(e.template,a,i),fixture:t.name,message:`${i.format}: ${i.message}`}))),n.samples.push({name:t.name,pages:a.pages.length,rows:Object.values(t.datasets).reduce((i,c)=>i+c.length,0),diagnostics:s})}catch(a){n.issues.push({code:"layout",severity:"error",path:"$.template",fixture:t.name,message:a instanceof Error?a.message:String(a)})}}function yt(e,t={}){const r={ok:!1,issues:[],samples:[]};try{for(const[a,o]of[["maxPages",t.maxPages],["maxCells",t.maxCells],["maxSampleRows",t.maxSampleRows]])if(o!==void 0&&(!Number.isSafeInteger(o)||o<1))throw new RangeError(`${a} must be a positive safe integer`);if((t.fixtures?.length??0)>20)throw new RangeError("At most 20 review fixtures are allowed");const n=B.parseReportTemplate(e);t.previous&&(r.changes=ke(t.previous,n),r.changes.breakingChanges&&!t.allowBreakingChanges&&r.issues.push({code:"compatibility",severity:"error",path:"$.template",message:`${r.changes.breakingChanges} 项字段或结构变更需要明确确认兼容性`})),t.dataSchemas&&ft(n.template,t.dataSchemas,r.issues);for(const a of t.fixtures??[])pt(n,a,t,r);t.fixtures?.length||r.issues.push({code:"sample",severity:"warning",path:"$.fixtures",message:"未提供验收样例,仅完成结构和字段检查,尚未验证排版与输出"})}catch(n){r.issues.push({code:"template",severity:"error",path:"$",message:n instanceof Error?n.message:String(n)})}return r.ok=r.issues.every(n=>n.severity!=="error"),r}exports.PaginateCellLimitError=I;exports.PaginatePageLimitError=O;exports.ReportSourceError=$;exports.countTemplatePages=Ue;exports.createReportSource=lt;exports.defineReport=Ze;exports.diffReportTemplates=ke;exports.estimateListLayoutCells=Xe;exports.evalStyleRule=L;exports.formatValue=ee;exports.paginateTemplate=oe;exports.paginateTemplatePages=Qe;exports.parseDateLocal=ge;exports.projectListColumns=he;exports.reviewReportTemplate=yt;exports.toExcelNumberFormat=Z;exports.toNumber=J;
@@ -0,0 +1,4 @@
1
+ "use strict";const w=require("./defaults-xhmcLLrf.cjs"),M=/[\u3000-\u9fff\uff00-\uffef]/,s=new Uint8Array(128);{for(const t of"iljtf.,:;'`|!()[]")s[t.charCodeAt(0)]=1;for(const t of"mwMW@")s[t.charCodeAt(0)]=2;for(let t=48;t<=57;t++)s[t]=3;for(let t=65;t<=90;t++)s[t]=4;s[32]=5}const g=[.54,.26,.95,.59,.67,.3];function d(t){const e=t.charCodeAt(0);return e<128?g[s[e]]:M.test(t)?1:/[A-Z]/.test(t)?.67:.54}const o={measureMm(t,e){const{fontSizePt:i,bold:c=!1,letterSpacingPt:u=0}=e,r=25.4/72;let n=0;for(const h of t)n+=d(h);return c&&(n*=1.04),(n*i+u*Math.max(0,Array.from(t).length-1))*r}};function p(){return o}function A(t,e){return o.measureMm(t,e)}function x(t){let e;return{measureMm(i,c){if(e===void 0&&(e=t()),!e)return o.measureMm(i,c);const u=c.fontSizePt*96/72;e.font=`${c.italic?"italic ":""}${c.bold?"bold ":""}${u}px ${c.fontFamily??w.DEFAULT_FONT_FAMILY}`,"letterSpacing"in e&&(e.letterSpacing="0px");const r=(c.letterSpacingPt??0)*Math.max(0,Array.from(i).length-1);return e.measureText(i).width*25.4/96+r*25.4/72}}}function T(t,e,i){const c=[];let u="";const r=()=>{u&&(c.push({text:u,widthMm:i.measureMm(u,e),cjk:!1}),u="")};for(const n of t){if(n===`
2
+ `){r(),c.push({text:`
3
+ `,widthMm:0,cjk:!1,br:!0});continue}if(n===" "){r(),c.push({text:n,widthMm:i.measureMm(n,e),cjk:!1,space:!0});continue}if(M.test(n)){r(),c.push({text:n,widthMm:i.measureMm(n,e),cjk:!0});continue}u+=n}return r(),c}function S(t,e,i,c=o){if(!t)return[""];t=t.replace(/\r\n?/g,`
4
+ `);const u=[];let r="",n=0;const h=(i.letterSpacingPt??0)*25.4/72,a=()=>{u.push(r),r="",n=0};for(const f of T(t,i,c)){if(f.br){a();continue}const m=r.length>0?h:0;if(n+m+f.widthMm<=e){r+=f.text,n+=m+f.widthMm;continue}if(f.space){a();continue}if(f.cjk){r.length>0&&a(),r=f.text,n=f.widthMm;continue}if(r.length>0&&a(),f.widthMm<=e){r=f.text,n=f.widthMm;continue}for(const l of f.text)c.measureMm(r+l,i)>e&&r.length>0&&a(),r+=l,n=c.measureMm(r,i)}return a(),u}exports.charWidthEm=d;exports.createCanvasMeasurer=x;exports.createHeuristicMeasurer=p;exports.heuristicMeasurer=o;exports.measureTextMm=A;exports.wrapText=S;
@@ -1,4 +1,4 @@
1
- import { D as M } from "./render-plan-uzZYYSy1.js";
1
+ import { D as M } from "./defaults-DXhiM1ZD.js";
2
2
  const d = /[\u3000-\u9fff\uff00-\uffef]/, s = new Uint8Array(128);
3
3
  {
4
4
  for (const t of "iljtf.,:;'`|!()[]") s[t.charCodeAt(0)] = 1;
@@ -1 +1 @@
1
- "use strict";function r(e,i,s){e.editable!==void 0&&typeof e.editable!="boolean"&&s.push({path:`${i}.editable`,message:"编辑控制应为布尔值"}),e.valueType!==void 0&&!["text","number","boolean"].includes(e.valueType)&&s.push({path:`${i}.valueType`,message:"编辑类型应为 text、number 或 boolean"})}function $(e,i,s){r(e,i,s),m(e.source,`${i}.source`,s,!0),e.formula!==void 0&&typeof e.formula!="string"&&s.push({path:`${i}.formula`,message:"单元格公式应为字符串"})}function m(e,i,s,t=!1){if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e)){s.push({path:i,message:"业务来源应为对象"});return}const a=e;for(const n of["datasetId",...t?["field"]:[]])(typeof a[n]!="string"||!a[n].trim())&&s.push({path:`${i}.${n}`,message:"业务标识应为非空字符串"});for(const n of["rowKey","revision"]){const o=a[n];o===void 0&&!(t&&n==="rowKey")||typeof o!="string"&&!(typeof o=="number"&&Number.isFinite(o))&&s.push({path:`${i}.${n}`,message:"业务键及修订号应为字符串或有限数字"})}a.sourceToken!==void 0&&typeof a.sourceToken!="string"&&s.push({path:`${i}.sourceToken`,message:"来源令牌应为字符串"})}const v=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function f(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function A(e,i,s,t){const a=e[i];(typeof a!="number"||!Number.isFinite(a))&&t.push({path:`${s}.${i}`,message:`应为有限数字,实际 ${JSON.stringify(a)}`})}function b(e,i,s){if(e!==void 0){const t=`${i}.table`;if(!f(e))s.push({path:t,message:"逻辑表来源应为对象"});else{m(e.source,`${t}.source`,s),(typeof e.id!="string"||!e.id.trim())&&s.push({path:`${t}.id`,message:"逻辑表 ID 应为非空字符串"});const a=e.role;["header","body","group-header","subtotal","grand-total"].includes(a)||s.push({path:`${t}.role`,message:"未知逻辑表行角色"});const n=e.rowIndex;(typeof n!="number"||!Number.isInteger(n)||(a==="header"?n!==-1:n<0))&&s.push({path:`${t}.rowIndex`,message:"表头索引应为 -1,内容行索引应为非负整数"}),(!Array.isArray(e.columnKeys)||e.columnKeys.some(o=>typeof o!="string"))&&s.push({path:`${t}.columnKeys`,message:"逻辑列字段应为字符串数组"}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&s.push({path:`${t}.layout`,message:"布局应为 page 或 wide"}),e.title!==void 0&&typeof e.title!="string"&&s.push({path:`${t}.title`,message:"逻辑表名称应为字符串"})}}}function M(e,i,s,t){if(e!==void 0)if(!f(e)||!Array.isArray(e.cells))s.push({path:`${i}.grid.cells`,message:"grid.cells 应为二维数组"});else{const a=e.paddingMm;a!==void 0&&(typeof a!="number"||!Number.isFinite(a)||a<0)&&s.push({path:`${i}.grid.paddingMm`,message:"单元格内距应为有限非负数"}),e.cells.forEach((n,o)=>{if(!Array.isArray(n)){s.push({path:`${i}.grid.cells.${o}`,message:"行应为数组"});return}n.forEach((u,d)=>{if(u==null)return;const h=`${i}.grid.cells.${o}.${d}`;if(!f(u)){s.push({path:h,message:"网格单元格应为对象或 null"});return}$(u,h,s),Array.isArray(u.children)&&u.children.forEach((c,y)=>{g(c,`${i}.grid.cells.${o}.${d}.children.${y}`,s,t)})})})}}function w(e,i,s){e!==void 0&&(Array.isArray(e)?e.forEach((t,a)=>{(!f(t)||!Array.isArray(t.segments))&&s.push({path:`${i}.richParagraphs.${a}`,message:"段落缺少 segments 数组"})}):s.push({path:`${i}.richParagraphs`,message:"richParagraphs 应为数组"}))}function g(e,i,s,t=[]){if(!f(e)){s.push({path:i,message:"组件应为对象"});return}const a=e.kind;typeof a!="string"?s.push({path:`${i}.kind`,message:"组件缺少 kind 字符串"}):v.has(a)||t.push({path:`${i}.kind`,message:`未知组件类型 ${JSON.stringify(a)},将以兜底方式渲染`});for(const n of["leftMm","topMm","widthMm","heightMm"])A(e,n,i,s);typeof e.leftMm=="number"&&e.leftMm<-100&&s.push({path:`${i}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const n of["widthMm","heightMm"])typeof e[n]=="number"&&e[n]<0&&s.push({path:`${i}.${n}`,message:"组件尺寸不能为负数"});b(e.table,i,s),e.lineDirection!==void 0&&!["down","up"].includes(e.lineDirection)&&s.push({path:`${i}.lineDirection`,message:"线段方向应为 down 或 up"}),M(e.grid,i,s,t),w(e.richParagraphs,i,s)}function p(e,i,s,t=[]){if(!f(e)){s.push({path:i,message:"页应为对象"});return}const a=e.pageWidthMm,n=e.pageHeightMm;(typeof a!="number"||!Number.isFinite(a)||a<=0)&&s.push({path:`${i}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(a)}`}),(typeof n!="number"||!(n>0&&n<5e3))&&s.push({path:`${i}.pageHeightMm`,message:`页高非法: ${JSON.stringify(n)}`}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&s.push({path:`${i}.layout`,message:"布局应为 page 或 wide"});const o=e.components;Array.isArray(o)?Array.isArray(o)&&o.forEach((u,d)=>g(u,`${i}.components.${d}`,s,t)):s.push({path:`${i}.components`,message:"components 应为数组"})}function l(e){const i=[],s=[],t=f(e)?e.pages:void 0;if(!Array.isArray(t))i.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{t.forEach((n,o)=>p(n,`$.pages.${o}`,i,s)),t.length>2e3&&s.push({path:"$.pages",message:`页数异常大(${t.length} 页),渲染与打印耗时可能显著增加`});const a=t.reduce((n,o)=>n+(f(o)&&Array.isArray(o.components)?o.components.length:0),0);a>5e4&&s.push({path:"$.pages",message:`组件总数异常大(${a} 个),可能触发浏览器性能限制`})}return{ok:i.length===0,errors:i,warnings:s}}function k(e){const i=l(e);if(!i.ok){const s=i.errors.slice(0,3).map(t=>`${t.path}: ${t.message}`).join("; ");throw new Error(`渲染计划校验失败(${i.errors.length} 处): ${s}`)}return e.pages}exports.assertRenderPlan=k;exports.validateComponent=g;exports.validateEditableMetadata=r;exports.validatePage=p;exports.validateRenderPlan=l;
1
+ "use strict";function r(e,i,s){e.editable!==void 0&&typeof e.editable!="boolean"&&s.push({path:`${i}.editable`,message:"编辑控制应为布尔值"}),e.valueType!==void 0&&!["text","number","boolean"].includes(e.valueType)&&s.push({path:`${i}.valueType`,message:"编辑类型应为 text、number 或 boolean"})}function $(e,i,s){r(e,i,s),p(e.source,`${i}.source`,s,!0),e.formula!==void 0&&typeof e.formula!="string"&&s.push({path:`${i}.formula`,message:"单元格公式应为字符串"})}function p(e,i,s,t=!1){if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e)){s.push({path:i,message:"业务来源应为对象"});return}const a=e;for(const n of["datasetId",...t?["field"]:[]])(typeof a[n]!="string"||!a[n].trim())&&s.push({path:`${i}.${n}`,message:"业务标识应为非空字符串"});for(const n of["rowKey","revision"]){const o=a[n];o===void 0&&!(t&&n==="rowKey")||typeof o!="string"&&!(typeof o=="number"&&Number.isFinite(o))&&s.push({path:`${i}.${n}`,message:"业务键及修订号应为字符串或有限数字"})}a.sourceToken!==void 0&&typeof a.sourceToken!="string"&&s.push({path:`${i}.sourceToken`,message:"来源令牌应为字符串"})}const A=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function f(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function v(e,i,s,t){const a=e[i];(typeof a!="number"||!Number.isFinite(a))&&t.push({path:`${s}.${i}`,message:`应为有限数字,实际 ${JSON.stringify(a)}`})}function b(e,i,s){if(e!==void 0){const t=`${i}.table`;if(!f(e))s.push({path:t,message:"逻辑表来源应为对象"});else{p(e.source,`${t}.source`,s),(typeof e.id!="string"||!e.id.trim())&&s.push({path:`${t}.id`,message:"逻辑表 ID 应为非空字符串"});const a=e.role;["header","body","group-header","subtotal","grand-total"].includes(a)||s.push({path:`${t}.role`,message:"未知逻辑表行角色"});const n=e.rowIndex;(typeof n!="number"||!Number.isInteger(n)||(a==="header"?n!==-1:n<0))&&s.push({path:`${t}.rowIndex`,message:"表头索引应为 -1,内容行索引应为非负整数"}),(!Array.isArray(e.columnKeys)||e.columnKeys.some(o=>typeof o!="string"))&&s.push({path:`${t}.columnKeys`,message:"逻辑列字段应为字符串数组"}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&s.push({path:`${t}.layout`,message:"布局应为 page 或 wide"}),e.title!==void 0&&typeof e.title!="string"&&s.push({path:`${t}.title`,message:"逻辑表名称应为字符串"})}}}function M(e,i,s,t){if(e!==void 0)if(!f(e)||!Array.isArray(e.cells))s.push({path:`${i}.grid.cells`,message:"grid.cells 应为二维数组"});else{const a=e.paddingMm;a!==void 0&&(typeof a!="number"||!Number.isFinite(a)||a<0)&&s.push({path:`${i}.grid.paddingMm`,message:"单元格内距应为有限非负数"}),e.cells.forEach((n,o)=>{if(!Array.isArray(n)){s.push({path:`${i}.grid.cells.${o}`,message:"行应为数组"});return}n.forEach((u,d)=>{if(u==null)return;const g=`${i}.grid.cells.${o}.${d}`;if(!f(u)){s.push({path:g,message:"网格单元格应为对象或 null"});return}$(u,g,s),Array.isArray(u.children)&&u.children.forEach((c,y)=>{h(c,`${i}.grid.cells.${o}.${d}.children.${y}`,s,t)})})})}}function w(e,i,s){e!==void 0&&(Array.isArray(e)?e.forEach((t,a)=>{(!f(t)||!Array.isArray(t.segments))&&s.push({path:`${i}.richParagraphs.${a}`,message:"段落缺少 segments 数组"})}):s.push({path:`${i}.richParagraphs`,message:"richParagraphs 应为数组"}))}function h(e,i,s,t=[]){if(!f(e)){s.push({path:i,message:"组件应为对象"});return}const a=e.kind;typeof a!="string"?s.push({path:`${i}.kind`,message:"组件缺少 kind 字符串"}):A.has(a)||t.push({path:`${i}.kind`,message:`未知组件类型 ${JSON.stringify(a)},将以兜底方式渲染`});for(const n of["leftMm","topMm","widthMm","heightMm"])v(e,n,i,s);typeof e.leftMm=="number"&&e.leftMm<-100&&s.push({path:`${i}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const n of["widthMm","heightMm"])typeof e[n]=="number"&&e[n]<0&&s.push({path:`${i}.${n}`,message:"组件尺寸不能为负数"});b(e.table,i,s),e.pageAnchor!==void 0&&!["header","footer"].includes(e.pageAnchor)&&s.push({path:`${i}.pageAnchor`,message:"页面锚点应为 header 或 footer"}),e.lineDirection!==void 0&&!["down","up"].includes(e.lineDirection)&&s.push({path:`${i}.lineDirection`,message:"线段方向应为 down 或 up"}),M(e.grid,i,s,t),w(e.richParagraphs,i,s)}function m(e,i,s,t=[]){if(!f(e)){s.push({path:i,message:"页应为对象"});return}const a=e.pageWidthMm,n=e.pageHeightMm;(typeof a!="number"||!Number.isFinite(a)||a<=0)&&s.push({path:`${i}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(a)}`}),(typeof n!="number"||!(n>0&&n<5e3))&&s.push({path:`${i}.pageHeightMm`,message:`页高非法: ${JSON.stringify(n)}`}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&s.push({path:`${i}.layout`,message:"布局应为 page 或 wide"});const o=e.components;Array.isArray(o)?Array.isArray(o)&&o.forEach((u,d)=>h(u,`${i}.components.${d}`,s,t)):s.push({path:`${i}.components`,message:"components 应为数组"})}function l(e){const i=[],s=[],t=f(e)?e.pages:void 0;if(!Array.isArray(t))i.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{t.forEach((n,o)=>m(n,`$.pages.${o}`,i,s)),t.length>2e3&&s.push({path:"$.pages",message:`页数异常大(${t.length} 页),渲染与打印耗时可能显著增加`});const a=t.reduce((n,o)=>n+(f(o)&&Array.isArray(o.components)?o.components.length:0),0);a>5e4&&s.push({path:"$.pages",message:`组件总数异常大(${a} 个),可能触发浏览器性能限制`})}return{ok:i.length===0,errors:i,warnings:s}}function k(e){const i=l(e);if(!i.ok){const s=i.errors.slice(0,3).map(t=>`${t.path}: ${t.message}`).join("; ");throw new Error(`渲染计划校验失败(${i.errors.length} 处): ${s}`)}return e.pages}exports.assertRenderPlan=k;exports.validateComponent=h;exports.validateEditableMetadata=r;exports.validatePage=m;exports.validateRenderPlan=l;
@@ -1,10 +1,10 @@
1
1
  function c(e, i, s) {
2
2
  e.editable !== void 0 && typeof e.editable != "boolean" && s.push({ path: `${i}.editable`, message: "编辑控制应为布尔值" }), e.valueType !== void 0 && !["text", "number", "boolean"].includes(e.valueType) && s.push({ path: `${i}.valueType`, message: "编辑类型应为 text、number 或 boolean" });
3
3
  }
4
- function y(e, i, s) {
5
- c(e, i, s), h(e.source, `${i}.source`, s, !0), e.formula !== void 0 && typeof e.formula != "string" && s.push({ path: `${i}.formula`, message: "单元格公式应为字符串" });
4
+ function l(e, i, s) {
5
+ c(e, i, s), g(e.source, `${i}.source`, s, !0), e.formula !== void 0 && typeof e.formula != "string" && s.push({ path: `${i}.formula`, message: "单元格公式应为字符串" });
6
6
  }
7
- function h(e, i, s, t = !1) {
7
+ function g(e, i, s, t = !1) {
8
8
  if (e === void 0) return;
9
9
  if (!e || typeof e != "object" || Array.isArray(e)) {
10
10
  s.push({ path: i, message: "业务来源应为对象" });
@@ -19,7 +19,7 @@ function h(e, i, s, t = !1) {
19
19
  }
20
20
  n.sourceToken !== void 0 && typeof n.sourceToken != "string" && s.push({ path: `${i}.sourceToken`, message: "来源令牌应为字符串" });
21
21
  }
22
- const l = /* @__PURE__ */ new Set([
22
+ const y = /* @__PURE__ */ new Set([
23
23
  "text",
24
24
  "image",
25
25
  "barcode",
@@ -41,7 +41,7 @@ function A(e, i, s) {
41
41
  const t = `${i}.table`;
42
42
  if (!f(e)) s.push({ path: t, message: "逻辑表来源应为对象" });
43
43
  else {
44
- h(e.source, `${t}.source`, s), (typeof e.id != "string" || !e.id.trim()) && s.push({ path: `${t}.id`, message: "逻辑表 ID 应为非空字符串" });
44
+ g(e.source, `${t}.source`, s), (typeof e.id != "string" || !e.id.trim()) && s.push({ path: `${t}.id`, message: "逻辑表 ID 应为非空字符串" });
45
45
  const n = e.role;
46
46
  ["header", "body", "group-header", "subtotal", "grand-total"].includes(n) || s.push({ path: `${t}.role`, message: "未知逻辑表行角色" });
47
47
  const a = e.rowIndex;
@@ -60,15 +60,15 @@ function v(e, i, s, t) {
60
60
  s.push({ path: `${i}.grid.cells.${o}`, message: "行应为数组" });
61
61
  return;
62
62
  }
63
- a.forEach((u, d) => {
63
+ a.forEach((u, h) => {
64
64
  if (u == null) return;
65
- const g = `${i}.grid.cells.${o}.${d}`;
65
+ const d = `${i}.grid.cells.${o}.${h}`;
66
66
  if (!f(u)) {
67
- s.push({ path: g, message: "网格单元格应为对象或 null" });
67
+ s.push({ path: d, message: "网格单元格应为对象或 null" });
68
68
  return;
69
69
  }
70
- y(u, g, s), Array.isArray(u.children) && u.children.forEach((p, m) => {
71
- r(p, `${i}.grid.cells.${o}.${d}.children.${m}`, s, t);
70
+ l(u, d, s), Array.isArray(u.children) && u.children.forEach((p, m) => {
71
+ r(p, `${i}.grid.cells.${o}.${h}.children.${m}`, s, t);
72
72
  });
73
73
  });
74
74
  });
@@ -85,7 +85,7 @@ function r(e, i, s, t = []) {
85
85
  return;
86
86
  }
87
87
  const n = e.kind;
88
- typeof n != "string" ? s.push({ path: `${i}.kind`, message: "组件缺少 kind 字符串" }) : l.has(n) || t.push({
88
+ typeof n != "string" ? s.push({ path: `${i}.kind`, message: "组件缺少 kind 字符串" }) : y.has(n) || t.push({
89
89
  path: `${i}.kind`,
90
90
  message: `未知组件类型 ${JSON.stringify(n)},将以兜底方式渲染`
91
91
  });
@@ -94,7 +94,7 @@ function r(e, i, s, t = []) {
94
94
  typeof e.leftMm == "number" && e.leftMm < -100 && s.push({ path: `${i}.leftMm`, message: "几何数值异常(leftMm<-100)" });
95
95
  for (const a of ["widthMm", "heightMm"])
96
96
  typeof e[a] == "number" && e[a] < 0 && s.push({ path: `${i}.${a}`, message: "组件尺寸不能为负数" });
97
- A(e.table, i, s), e.lineDirection !== void 0 && !["down", "up"].includes(e.lineDirection) && s.push({ path: `${i}.lineDirection`, message: "线段方向应为 down 或 up" }), v(e.grid, i, s, t), b(e.richParagraphs, i, s);
97
+ A(e.table, i, s), e.pageAnchor !== void 0 && !["header", "footer"].includes(e.pageAnchor) && s.push({ path: `${i}.pageAnchor`, message: "页面锚点应为 header 或 footer" }), e.lineDirection !== void 0 && !["down", "up"].includes(e.lineDirection) && s.push({ path: `${i}.lineDirection`, message: "线段方向应为 down 或 up" }), v(e.grid, i, s, t), b(e.richParagraphs, i, s);
98
98
  }
99
99
  function M(e, i, s, t = []) {
100
100
  if (!f(e)) {
@@ -105,7 +105,7 @@ function M(e, i, s, t = []) {
105
105
  (typeof n != "number" || !Number.isFinite(n) || n <= 0) && s.push({ path: `${i}.pageWidthMm`, message: `页宽非法: ${JSON.stringify(n)}` }), (typeof a != "number" || !(a > 0 && a < 5e3)) && s.push({ path: `${i}.pageHeightMm`, message: `页高非法: ${JSON.stringify(a)}` }), e.layout !== void 0 && e.layout !== "page" && e.layout !== "wide" && s.push({ path: `${i}.layout`, message: "布局应为 page 或 wide" });
106
106
  const o = e.components;
107
107
  Array.isArray(o) ? Array.isArray(o) && o.forEach(
108
- (u, d) => r(u, `${i}.components.${d}`, s, t)
108
+ (u, h) => r(u, `${i}.components.${h}`, s, t)
109
109
  ) : s.push({ path: `${i}.components`, message: "components 应为数组" });
110
110
  }
111
111
  function w(e) {
@@ -1,4 +1,24 @@
1
1
  import { App } from 'vue';
2
+ declare interface AggregateDefinition {
3
+ /** Output column; valueField defaults to this field. */
4
+ field: string;
5
+ op: AggregateOperation;
6
+ valueField?: string;
7
+ weightField?: string;
8
+ numeric?: "number" | "decimal";
9
+ digits?: number;
10
+ }
11
+ declare interface AggregateDefinition_2 {
12
+ /** Output column; valueField defaults to this field. */
13
+ field: string;
14
+ op: AggregateOperation_2;
15
+ valueField?: string;
16
+ weightField?: string;
17
+ numeric?: "number" | "decimal";
18
+ digits?: number;
19
+ }
20
+ declare type AggregateOperation = "sum" | "count" | "avg" | "min" | "max" | "weightedAvg";
21
+ declare type AggregateOperation_2 = "sum" | "count" | "avg" | "min" | "max" | "weightedAvg";
2
22
  declare interface AssetRenderBudget {
3
23
  /** Maximum newly rendered assets, default 1000. Existing imageData is kept unchanged. */
4
24
  maxAssets?: number;
@@ -140,6 +160,24 @@ declare interface ComponentStyle_3 {
140
160
  opacity?: number;
141
161
  rotateDeg?: number;
142
162
  }
163
+ declare interface ComputedField extends ExpressionOptions {
164
+ field: string;
165
+ expression: ReportExpression | string;
166
+ /** Scope controls aggregate inputs; row expressions may reference the current row in any scope. */
167
+ scope?: "row" | "group" | "dataset";
168
+ groupBy?: readonly string[];
169
+ /** String adapter expressions cannot be inspected; declare dependencies explicitly. */
170
+ dependsOn?: readonly string[];
171
+ }
172
+ declare interface ComputedField_2 extends ExpressionOptions_2 {
173
+ field: string;
174
+ expression: ReportExpression_2 | string;
175
+ /** Scope controls aggregate inputs; row expressions may reference the current row in any scope. */
176
+ scope?: "row" | "group" | "dataset";
177
+ groupBy?: readonly string[];
178
+ /** String adapter expressions cannot be inspected; declare dependencies explicitly. */
179
+ dependsOn?: readonly string[];
180
+ }
143
181
  declare interface DatasetContract {
144
182
  fields: readonly ReportFieldContract[];
145
183
  rowKey?: string;
@@ -225,6 +263,26 @@ declare interface ExcelImportResult {
225
263
  warnings: string[];
226
264
  sheets: ExcelImportedSheet[];
227
265
  }
266
+ declare interface ExpressionOptions {
267
+ numeric?: "number" | "decimal";
268
+ digits?: number;
269
+ nulls?: "propagate" | "error";
270
+ divisionByZero?: "null" | "error";
271
+ }
272
+ declare interface ExpressionOptions_2 {
273
+ numeric?: "number" | "decimal";
274
+ digits?: number;
275
+ nulls?: "propagate" | "error";
276
+ divisionByZero?: "null" | "error";
277
+ }
278
+ declare interface FormulaAdapter {
279
+ /** Explicit trusted engine; core never evaluates source code/macros/external workbook references. */
280
+ evaluate(expression: string, context: {
281
+ row: Readonly<Record<string, unknown>>;
282
+ rowIndex: number;
283
+ rows: readonly Record<string, unknown>[];
284
+ }): unknown;
285
+ }
228
286
  declare interface GridCell {
229
287
  text?: string;
230
288
  rawText?: string;
@@ -308,6 +366,9 @@ declare interface ListColumn {
308
366
  valueType?: GridCell["valueType"];
309
367
  /** 字段语义用于 auto 对齐;明确声明编号,避免把数字编号当成度量。 */
310
368
  semanticRole?: "identifier" | "dimension" | "measure" | "date" | "text";
369
+ hidden?: boolean;
370
+ /** Condition hides cell content, preserving its physical layout in preview and exports. */
371
+ visibleWhen?: StyleRule["when"];
311
372
  }
312
373
  declare interface ListColumn_2 {
313
374
  header: string;
@@ -330,6 +391,9 @@ declare interface ListColumn_2 {
330
391
  valueType?: GridCell_3["valueType"];
331
392
  /** 字段语义用于 auto 对齐;明确声明编号,避免把数字编号当成度量。 */
332
393
  semanticRole?: "identifier" | "dimension" | "measure" | "date" | "text";
394
+ hidden?: boolean;
395
+ /** Condition hides cell content, preserving its physical layout in preview and exports. */
396
+ visibleWhen?: StyleRule_2["when"];
333
397
  }
334
398
  declare interface ListComponent {
335
399
  kind: "list";
@@ -363,6 +427,15 @@ declare interface ListComponent {
363
427
  border?: boolean;
364
428
  /** 分组小计(组头/组尾小计/组头防孤行) */
365
429
  groupBy?: ListGroupBy;
430
+ /** Ordered outer-to-inner grouping; groupBy remains the single-level shorthand. */
431
+ groups?: ListGroupBy[];
432
+ computed?: ComputedField[];
433
+ /** Dynamic pivot of the current source dataset, with read-only derived identities. */
434
+ matrix?: MatrixTableOptions;
435
+ /** Explicit row visibility; hidden rows do not participate in summaries. */
436
+ rowVisibleWhen?: StyleRule["when"];
437
+ /** Master/detail relation is keyed by business identity, never by display row index. */
438
+ detail?: ListDetail;
366
439
  /** 末尾总合计行(依赖 groupBy.subtotal 或显式 fields) */
367
440
  grandTotal?: ListGrandTotal;
368
441
  }
@@ -398,20 +471,55 @@ declare interface ListComponent_2 {
398
471
  border?: boolean;
399
472
  /** 分组小计(组头/组尾小计/组头防孤行) */
400
473
  groupBy?: ListGroupBy_2;
474
+ /** Ordered outer-to-inner grouping; groupBy remains the single-level shorthand. */
475
+ groups?: ListGroupBy_2[];
476
+ computed?: ComputedField_2[];
477
+ /** Dynamic pivot of the current source dataset, with read-only derived identities. */
478
+ matrix?: MatrixTableOptions_2;
479
+ /** Explicit row visibility; hidden rows do not participate in summaries. */
480
+ rowVisibleWhen?: StyleRule_2["when"];
481
+ /** Master/detail relation is keyed by business identity, never by display row index. */
482
+ detail?: ListDetail_2;
401
483
  /** 末尾总合计行(依赖 groupBy.subtotal 或显式 fields) */
402
484
  grandTotal?: ListGrandTotal_2;
403
485
  }
486
+ declare interface ListDetail {
487
+ dataset: string;
488
+ parentKey: string;
489
+ foreignKey: string;
490
+ rowKey?: string;
491
+ columns: ListColumn[];
492
+ rowHeightMm?: number;
493
+ header?: boolean;
494
+ label?: string;
495
+ /** Unmatched children fail by default; opt-in ignore is explicit. */
496
+ unmatched?: "error" | "ignore";
497
+ }
498
+ declare interface ListDetail_2 {
499
+ dataset: string;
500
+ parentKey: string;
501
+ foreignKey: string;
502
+ rowKey?: string;
503
+ columns: ListColumn_2[];
504
+ rowHeightMm?: number;
505
+ header?: boolean;
506
+ label?: string;
507
+ /** Unmatched children fail by default; opt-in ignore is explicit. */
508
+ unmatched?: "error" | "ignore";
509
+ }
404
510
  declare type ListGrandTotal = boolean | {
405
511
  label?: string;
406
512
  style?: ComponentStyle;
407
513
  /** 合计列(缺省沿用 groupBy.subtotal) */
408
514
  fields?: string[];
515
+ aggregates?: AggregateDefinition[];
409
516
  };
410
517
  declare type ListGrandTotal_2 = boolean | {
411
518
  label?: string;
412
519
  style?: ComponentStyle_3;
413
520
  /** 合计列(缺省沿用 groupBy.subtotal) */
414
521
  fields?: string[];
522
+ aggregates?: AggregateDefinition_2[];
415
523
  };
416
524
  /** 分组小计配置(声明式,见 ListComponent.groupBy) */
417
525
  declare interface ListGroupBy {
@@ -426,6 +534,9 @@ declare interface ListGroupBy {
426
534
  subtotalLabel?: string;
427
535
  /** 组头防孤行(默认 true:页尾放不下"组头+首行"时整体换页) */
428
536
  keepWithNext?: boolean;
537
+ aggregates?: AggregateDefinition[];
538
+ /** Repeat this group heading after page breaks within the group. */
539
+ repeatHeader?: boolean;
429
540
  }
430
541
  /** 分组小计配置(声明式,见 ListComponent.groupBy) */
431
542
  declare interface ListGroupBy_2 {
@@ -440,6 +551,9 @@ declare interface ListGroupBy_2 {
440
551
  subtotalLabel?: string;
441
552
  /** 组头防孤行(默认 true:页尾放不下"组头+首行"时整体换页) */
442
553
  keepWithNext?: boolean;
554
+ aggregates?: AggregateDefinition_2[];
555
+ /** Repeat this group heading after page breaks within the group. */
556
+ repeatHeader?: boolean;
443
557
  }
444
558
  declare const machReportAsyncPlugin: {
445
559
  install(app: App, options?: MachReportPluginOptions): void;
@@ -740,6 +854,36 @@ declare interface MachReportToolbarOptions {
740
854
  /** 未传时显示全部已有出口;空数组表示不提供导出工具。 */
741
855
  exportFormats?: ReportExportFormat[];
742
856
  }
857
+ declare interface MatrixTableOptions {
858
+ rowFields: readonly string[];
859
+ columnFields: readonly string[];
860
+ measures: readonly (AggregateDefinition & {
861
+ label?: string;
862
+ })[];
863
+ totals?: boolean;
864
+ rowHeader?: string;
865
+ columnWidthMm?: number;
866
+ rowWidthMm?: number;
867
+ maxRows?: number;
868
+ maxColumns?: number;
869
+ maxInputRows?: number;
870
+ maxCells?: number;
871
+ }
872
+ declare interface MatrixTableOptions_2 {
873
+ rowFields: readonly string[];
874
+ columnFields: readonly string[];
875
+ measures: readonly (AggregateDefinition_2 & {
876
+ label?: string;
877
+ })[];
878
+ totals?: boolean;
879
+ rowHeader?: string;
880
+ columnWidthMm?: number;
881
+ rowWidthMm?: number;
882
+ maxRows?: number;
883
+ maxColumns?: number;
884
+ maxInputRows?: number;
885
+ maxCells?: number;
886
+ }
743
887
  declare interface OutputDiagnostic {
744
888
  code: "missing-image" | "unsupported-component" | "unsupported-image-format" | "unsupported-style" | "rich-text-flattened" | "nested-components-omitted" | "async-image-required" | "image-decode-failed" | "asset-render-failed" | "asset-budget-exceeded";
745
889
  severity: "warning";
@@ -800,6 +944,14 @@ declare interface PaginateOptions {
800
944
  measurer?: TextMeasurer;
801
945
  /** 可选页数上限;在追加超限页前终止,避免先分配全部页面再检查。 */
802
946
  maxPages?: number;
947
+ /** Actual grid cells, including repeated furniture and nested children; checked before each page is appended. */
948
+ maxCells?: number;
949
+ signal?: AbortSignal;
950
+ /** Streaming total-page anchors can skip the bounded counting pass when known. */
951
+ knownTotalPages?: number;
952
+ onWarning?: (warning: string) => void;
953
+ /** Trusted formula adapter is passed at execution time; it is never serialized in templates. */
954
+ formula?: FormulaAdapter;
803
955
  }
804
956
  /** PDF 导出器:RenderPlan → PDF 字节;第二参数可上报非致命保真告警。 */
805
957
  declare interface PdfExporter {
@@ -818,6 +970,8 @@ declare interface PdfFontCheckResult {
818
970
  /** available 仅表示字体资源可达;实际导出仍会校验文字能否编码。 */
819
971
  declare type PdfFontStatus = "unchecked" | "checking" | "available" | "disabled" | "unverified" | "error";
820
972
  declare interface PlanComponent {
973
+ /** Template page furniture repeats per page and reserves its vertical band. */
974
+ pageAnchor?: "header" | "footer";
821
975
  kind: ComponentKind;
822
976
  leftMm: number;
823
977
  topMm: number;
@@ -840,6 +994,8 @@ declare interface PlanComponent {
840
994
  fallbackText?: string;
841
995
  }
842
996
  declare interface PlanComponent_2 {
997
+ /** Template page furniture repeats per page and reserves its vertical band. */
998
+ pageAnchor?: "header" | "footer";
843
999
  kind: ComponentKind_2;
844
1000
  leftMm: number;
845
1001
  topMm: number;
@@ -862,6 +1018,8 @@ declare interface PlanComponent_2 {
862
1018
  fallbackText?: string;
863
1019
  }
864
1020
  declare interface PlanComponent_3 {
1021
+ /** Template page furniture repeats per page and reserves its vertical band. */
1022
+ pageAnchor?: "header" | "footer";
865
1023
  kind: ComponentKind_3;
866
1024
  leftMm: number;
867
1025
  topMm: number;
@@ -1205,6 +1363,30 @@ declare interface ReportEmptyState {
1205
1363
  }
1206
1364
  /** 输出能力仍由宿主授权;工具偏好只决定当前预览实例的可见与启用状态。 */
1207
1365
  declare type ReportExportFormat = "html" | "pdf" | "xlsx" | "png" | "word";
1366
+ declare type ReportExpression = {
1367
+ field: string;
1368
+ } | {
1369
+ value: string | number | boolean | null;
1370
+ } | {
1371
+ aggregate: AggregateOperation;
1372
+ field?: string;
1373
+ weightField?: string;
1374
+ } | {
1375
+ op: "add" | "subtract" | "multiply" | "divide" | "coalesce";
1376
+ args: readonly ReportExpression[];
1377
+ };
1378
+ declare type ReportExpression_2 = {
1379
+ field: string;
1380
+ } | {
1381
+ value: string | number | boolean | null;
1382
+ } | {
1383
+ aggregate: AggregateOperation_2;
1384
+ field?: string;
1385
+ weightField?: string;
1386
+ } | {
1387
+ op: "add" | "subtract" | "multiply" | "divide" | "coalesce";
1388
+ args: readonly ReportExpression_2[];
1389
+ };
1208
1390
  /** 保持 Promise<RenderPlan> 契约;元数据为可选,旧业务 fetcher 无需改造。 */
1209
1391
  declare interface ReportFetcher {
1210
1392
  (input: ReportFetchInput): Promise<RenderPlan>;
@@ -1476,6 +1658,8 @@ declare interface StyleRule {
1476
1658
  field: string;
1477
1659
  op: ">" | ">=" | "<" | "<=" | "==" | "!=";
1478
1660
  value: number | string;
1661
+ /** Explicit decimal comparisons retain decimal thresholds as text. */
1662
+ numeric?: "number" | "decimal";
1479
1663
  };
1480
1664
  /** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
1481
1665
  style: Record<string, unknown>;
@@ -1486,6 +1670,8 @@ declare interface StyleRule_2 {
1486
1670
  field: string;
1487
1671
  op: ">" | ">=" | "<" | "<=" | "==" | "!=";
1488
1672
  value: number | string;
1673
+ /** Explicit decimal comparisons retain decimal thresholds as text. */
1674
+ numeric?: "number" | "decimal";
1489
1675
  };
1490
1676
  /** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
1491
1677
  style: Record<string, unknown>;