@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.
- package/README.md +28 -10
- package/dist/ExcelBindingWizard-DiaxvWpQ.cjs +1 -0
- package/dist/ExcelBindingWizard-RLJIXKKG.js +816 -0
- package/dist/{ReportPreview-DRBAUkxj.js → ReportPreview-B5ZNEasW.js} +23 -22
- package/dist/ReportPreview-DRtVPUYo.cjs +6 -0
- package/dist/RuleEditor-N4qnMZ-Z.cjs +1 -0
- package/dist/RuleEditor-ynnUEK0s.js +1575 -0
- package/dist/TemplateReviewPanel-C_Lmzis6.cjs +1 -0
- package/dist/TemplateReviewPanel-Cn32OY4_.js +173 -0
- package/dist/{_plugin-vue_export-helper-DPbiz14D.js → _plugin-vue_export-helper-8SL1F89S.js} +2 -2
- package/dist/analytics.cjs +1 -1
- package/dist/analytics.d.cts +188 -5
- package/dist/analytics.d.ts +188 -5
- package/dist/analytics.js +68 -202
- package/dist/{assets-B9qJku3V.js → assets-DDsfEi8R.js} +3 -3
- package/dist/{assets-RZan7EyL.cjs → assets-ahTRUXRk.cjs} +1 -1
- package/dist/binding-preview-B5834rml.cjs +2 -0
- package/dist/binding-preview-ChXjN5L5.js +649 -0
- package/dist/{capabilities-joSutDF8.js → capabilities-Cm9hZ3uV.js} +5 -5
- package/dist/{capabilities-xGTpnPjJ.cjs → capabilities-DYzWL7KS.cjs} +1 -1
- package/dist/dataset-BkRmwgeJ.cjs +1 -0
- package/dist/dataset-H5pFuQGU.js +121 -0
- package/dist/defaults-DXhiM1ZD.js +10 -0
- package/dist/defaults-xhmcLLrf.cjs +1 -0
- package/dist/designer.cjs +2 -1
- package/dist/designer.d.cts +1391 -6
- package/dist/designer.d.ts +1391 -6
- package/dist/designer.js +2636 -673
- package/dist/grid-geometry-BNptEcMm.js +65 -0
- package/dist/grid-geometry-CZ_cYB6O.cjs +1 -0
- package/dist/import-template-CNMLJSQw.js +23030 -0
- package/dist/import-template-CpxunKVp.cjs +29 -0
- package/dist/index.cjs +7 -7
- package/dist/index.d.cts +202 -3
- package/dist/index.d.ts +202 -3
- package/dist/index.js +554 -535
- package/dist/matrix-CNPDJxED.js +745 -0
- package/dist/matrix-Div9Ilh3.cjs +1 -0
- package/dist/pdf.cjs +46 -46
- package/dist/pdf.d.cts +2 -0
- package/dist/pdf.d.ts +2 -0
- package/dist/pdf.js +17 -16
- package/dist/{plugin-BurDDMcd.js → plugin-BWwIgZXV.js} +1 -1
- package/dist/{plugin-DSFu51Ua.cjs → plugin-Dg-J1Rbm.cjs} +1 -1
- package/dist/progress-7OSZbFok.js +39 -0
- package/dist/progress-BnLiS5eH.cjs +1 -0
- package/dist/render-plan-7xpGrCEl.cjs +1 -0
- package/dist/render-plan-Ck6koX9L.js +13 -0
- package/dist/server/node.d.cts +62 -0
- package/dist/server/node.d.ts +62 -0
- package/dist/server-node.cjs +1 -1
- package/dist/server-node.js +373 -145
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +311 -0
- package/dist/server.d.ts +311 -0
- package/dist/server.js +590 -186
- package/dist/{style-Dv5o_x6b.js → style-CQ1PK8ZB.js} +5 -5
- package/dist/style-UgIJSA1F.cjs +1 -0
- package/dist/style.css +1 -1
- package/dist/template-registry-CHMYZ7SD.cjs +1 -0
- package/dist/template-registry-R61AMCr0.js +433 -0
- package/dist/template-review-hvWWQFsi.js +1027 -0
- package/dist/template-review-jEcOfmGr.cjs +1 -0
- package/dist/textwrap-CWHyzkBH.cjs +4 -0
- package/dist/{textwrap-DOl04hCQ.js → textwrap-DE1kgcJB.js} +1 -1
- package/dist/{validate-DfHPD8wX.cjs → validate-BDiMqkJC.cjs} +1 -1
- package/dist/{validate-S6CgIm5d.js → validate-DWPF7icl.js} +13 -13
- package/dist/vue/async.d.cts +186 -0
- package/dist/vue/async.d.ts +186 -0
- package/dist/vue/index.d.cts +271 -3
- package/dist/vue/index.d.ts +271 -3
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +4 -4
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +2 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.js +1 -1
- package/dist/xlsx.cjs +2 -30
- package/dist/xlsx.d.cts +268 -0
- package/dist/xlsx.d.ts +268 -0
- package/dist/xlsx.js +220 -23440
- package/package.json +1 -1
- package/dist/ReportPreview-DjGeWHY-.cjs +0 -6
- package/dist/progress-DD964VAB.js +0 -102
- package/dist/progress-KvhwXZ1Q.cjs +0 -1
- package/dist/render-plan-CckPEQyf.cjs +0 -1
- package/dist/render-plan-uzZYYSy1.js +0 -19
- package/dist/report-source-BXHNy_AD.js +0 -755
- package/dist/report-source-CCAvFE3t.cjs +0 -1
- package/dist/style-CpwiOPyB.cjs +0 -1
- package/dist/template-registry-DWExx0gU.cjs +0 -1
- package/dist/template-registry-NpOakidD.js +0 -354
- 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 +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),
|
|
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
|
|
5
|
-
c(e, i, s),
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
|
63
|
+
a.forEach((u, h) => {
|
|
64
64
|
if (u == null) return;
|
|
65
|
-
const
|
|
65
|
+
const d = `${i}.grid.cells.${o}.${h}`;
|
|
66
66
|
if (!f(u)) {
|
|
67
|
-
s.push({ path:
|
|
67
|
+
s.push({ path: d, message: "网格单元格应为对象或 null" });
|
|
68
68
|
return;
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
r(p, `${i}.grid.cells.${o}.${
|
|
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 字符串" }) :
|
|
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,
|
|
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) {
|
package/dist/vue/async.d.cts
CHANGED
|
@@ -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>;
|