@agile-team/mach-report 2.9.1 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -7
- package/dist/ExcelBindingWizard-CjIiVox-.cjs +1 -0
- package/dist/ExcelBindingWizard-Dxm-K5HL.js +1240 -0
- package/dist/ParamEditor-D-Hf5xfO.cjs +1 -0
- package/dist/ParamEditor-DRGxzxeO.js +381 -0
- package/dist/ReportBatchPanel-BYgg0EDB.cjs +1 -0
- package/dist/ReportBatchPanel-Bby5yLzU.js +287 -0
- package/dist/ReportPreview-DWXROHBP.cjs +6 -0
- package/dist/ReportPreview-DiNXhQI0.js +4138 -0
- package/dist/ReportTemplateLibrary-C6CO7YCT.cjs +1 -0
- package/dist/ReportTemplateLibrary-DfzDXRvr.js +260 -0
- package/dist/RuleEditor-C2QsOHOs.cjs +1 -0
- package/dist/RuleEditor-D9wQHrkf.js +2024 -0
- package/dist/TemplateReviewPanel-BKofGrV9.js +222 -0
- package/dist/TemplateReviewPanel-DwtOcLue.cjs +1 -0
- package/dist/analytics.cjs +1 -1
- package/dist/analytics.d.cts +4 -0
- package/dist/analytics.d.ts +4 -0
- package/dist/analytics.js +40 -39
- package/dist/{assets-ahTRUXRk.cjs → assets-Bu6UohJx.cjs} +1 -1
- package/dist/{assets-DDsfEi8R.js → assets-DegqDNqY.js} +1 -1
- package/dist/batch-Bt3Fd27Z.cjs +1 -0
- package/dist/batch-mRqhhhjt.js +364 -0
- package/dist/{capabilities-Cm9hZ3uV.js → capabilities-CK_7hizc.js} +16 -16
- package/dist/capabilities-CsZ-pNHR.cjs +1 -0
- package/dist/computed-Bvk0W15F.js +521 -0
- package/dist/computed-CGV2a809.cjs +1 -0
- package/dist/config-B612mw0x.js +525 -0
- package/dist/config-BRoLo2oj.cjs +1 -0
- package/dist/designer.cjs +2 -2
- package/dist/designer.d.cts +695 -50
- package/dist/designer.d.ts +695 -50
- package/dist/designer.js +2213 -1748
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +205 -6
- package/dist/index.d.ts +205 -6
- package/dist/index.js +808 -1033
- package/dist/injection-keys-Db_DyLkm.cjs +1 -0
- package/dist/injection-keys-e85udZCp.js +7 -0
- package/dist/list-cell-BuYn4tGF.cjs +1 -0
- package/dist/list-cell-ClFra1zS.js +173 -0
- package/dist/matrix-DVyWiYsd.cjs +1 -0
- package/dist/matrix-yZsGnldA.js +227 -0
- package/dist/param-validation-BlHHXs6u.js +153 -0
- package/dist/param-validation-DCK039V1.cjs +1 -0
- package/dist/pdf.cjs +49 -49
- package/dist/pdf.d.cts +31 -1
- package/dist/pdf.d.ts +31 -1
- package/dist/pdf.js +4797 -4650
- package/dist/plugin-BDTU4D94.cjs +1 -0
- package/dist/plugin-Cd5G2QQn.js +22 -0
- package/dist/region-binding-workflow-CXDmt9Bs.js +977 -0
- package/dist/region-binding-workflow-DhQvu1co.cjs +3 -0
- package/dist/{report-params-B_VCihAh.js → report-params-B44imUd4.js} +1 -1
- package/dist/{report-params-CjWrjPl6.cjs → report-params-SJfhKgaX.cjs} +1 -1
- package/dist/server/node.d.cts +48 -5
- package/dist/server/node.d.ts +48 -5
- package/dist/server-node.cjs +1 -1
- package/dist/server-node.js +503 -317
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +252 -4
- package/dist/server.d.ts +252 -4
- package/dist/server.js +567 -469
- package/dist/style.css +1 -1
- package/dist/template-registry-WNXdkiET.js +506 -0
- package/dist/template-registry-ukBGlm8N.cjs +1 -0
- package/dist/template-review-BXp2oyqg.cjs +1 -0
- package/dist/template-review-BdcXSYbx.js +1616 -0
- package/dist/tree-BX380Rr7.cjs +1 -0
- package/dist/tree-CqcQ99NM.js +172 -0
- package/dist/useLocalDraft-C07SYRnC.js +11 -0
- package/dist/useLocalDraft-Yiw1wFgI.cjs +1 -0
- package/dist/{validate-DWPF7icl.js → validate-7s0yn6ii.js} +26 -26
- package/dist/validate-DsRiNw8h.cjs +1 -0
- package/dist/vue/async.d.cts +118 -6
- package/dist/vue/async.d.ts +118 -6
- package/dist/vue/index.d.cts +177 -11
- package/dist/vue/index.d.ts +177 -11
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +5 -5
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +116 -113
- package/dist/{import-template-CNMLJSQw.js → workbook-session-BKOTwcoq.js} +4290 -4227
- package/dist/{import-template-CpxunKVp.cjs → workbook-session-CLYLhZWu.cjs} +17 -17
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +9 -2
- package/dist/worker.d.ts +9 -2
- package/dist/worker.js +1 -1
- package/dist/xlsx.cjs +4 -2
- package/dist/xlsx.d.cts +159 -3
- package/dist/xlsx.d.ts +159 -3
- package/dist/xlsx.js +354 -192
- package/package.json +1 -1
- package/dist/ExcelBindingWizard-DiaxvWpQ.cjs +0 -1
- package/dist/ExcelBindingWizard-RLJIXKKG.js +0 -816
- package/dist/ReportPreview-B5ZNEasW.js +0 -4439
- package/dist/ReportPreview-DRtVPUYo.cjs +0 -6
- package/dist/RuleEditor-CskN5Fr3.cjs +0 -1
- package/dist/RuleEditor-CtJFzKuY.js +0 -1578
- package/dist/TemplateReviewPanel-C_Lmzis6.cjs +0 -1
- package/dist/TemplateReviewPanel-Cn32OY4_.js +0 -173
- package/dist/binding-preview-B5834rml.cjs +0 -2
- package/dist/binding-preview-ChXjN5L5.js +0 -649
- package/dist/capabilities-DYzWL7KS.cjs +0 -1
- package/dist/matrix-CNPDJxED.js +0 -745
- package/dist/matrix-Div9Ilh3.cjs +0 -1
- package/dist/param-validation-BWNjLcN0.js +0 -116
- package/dist/param-validation-CiTxFeZ8.cjs +0 -1
- package/dist/plugin-BWwIgZXV.js +0 -25
- package/dist/plugin-Dg-J1Rbm.cjs +0 -1
- package/dist/template-registry-CHMYZ7SD.cjs +0 -1
- package/dist/template-registry-R61AMCr0.js +0 -433
- package/dist/template-review-hvWWQFsi.js +0 -1027
- package/dist/template-review-jEcOfmGr.cjs +0 -1
- package/dist/validate-BDiMqkJC.cjs +0 -1
|
@@ -1 +0,0 @@
|
|
|
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;
|
|
@@ -1 +0,0 @@
|
|
|
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;
|