@agile-team/mach-report 2.5.0 → 2.7.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 +126 -16
- package/dist/ReportPreview-BdvoqdOd.cjs +6 -0
- package/dist/ReportPreview-COFkbeEM.js +3719 -0
- package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
- package/dist/analytics.cjs +1 -0
- package/dist/analytics.d.cts +276 -0
- package/dist/analytics.d.ts +276 -0
- package/dist/analytics.js +223 -0
- package/dist/assets-B9qJku3V.js +160 -0
- package/dist/assets-RZan7EyL.cjs +1 -0
- package/dist/capabilities-joSutDF8.js +63 -0
- package/dist/capabilities-xGTpnPjJ.cjs +1 -0
- package/dist/designer.cjs +1 -0
- package/dist/designer.d.cts +869 -0
- package/dist/designer.d.ts +869 -0
- package/dist/designer.js +628 -0
- package/dist/index.cjs +8 -5
- package/dist/index.d.cts +497 -9
- package/dist/index.d.ts +497 -9
- package/dist/index.js +1088 -1499
- package/dist/param-validation-BWNjLcN0.js +116 -0
- package/dist/param-validation-CiTxFeZ8.cjs +1 -0
- package/dist/pdf.cjs +48 -48
- package/dist/pdf.d.cts +119 -1
- package/dist/pdf.d.ts +119 -1
- package/dist/pdf.js +3932 -3868
- package/dist/{plugin-DMPLDpBY.cjs → plugin-9t_ZFwhz.cjs} +1 -1
- package/dist/{plugin-DDLcFWlk.js → plugin-s8Ay8kKk.js} +2 -2
- package/dist/progress-DD964VAB.js +102 -0
- package/dist/progress-KvhwXZ1Q.cjs +1 -0
- package/dist/render-plan-CckPEQyf.cjs +1 -0
- package/dist/{render-plan-CXBWRog4.js → render-plan-uzZYYSy1.js} +11 -10
- package/dist/report-params-B_VCihAh.js +12 -0
- package/dist/report-params-CjWrjPl6.cjs +1 -0
- package/dist/report-source-BXHNy_AD.js +755 -0
- package/dist/report-source-CCAvFE3t.cjs +1 -0
- package/dist/server/node.d.cts +320 -0
- package/dist/server/node.d.ts +320 -0
- package/dist/server-node.cjs +1 -0
- package/dist/server-node.js +303 -0
- package/dist/server.cjs +1 -0
- package/dist/server.d.cts +668 -0
- package/dist/server.d.ts +668 -0
- package/dist/server.js +245 -0
- package/dist/style-CpwiOPyB.cjs +1 -0
- package/dist/style-Dv5o_x6b.js +67 -0
- package/dist/style.css +1 -1
- package/dist/task-events-DQ276fn2.cjs +1 -0
- package/dist/task-events-Dpsvf_t2.js +47 -0
- package/dist/template-registry-DWExx0gU.cjs +1 -0
- package/dist/template-registry-NpOakidD.js +354 -0
- package/dist/textwrap-CnGsEum6.cjs +4 -0
- package/dist/textwrap-DOl04hCQ.js +110 -0
- package/dist/validate-DfHPD8wX.cjs +1 -0
- package/dist/validate-S6CgIm5d.js +148 -0
- package/dist/vue/async.d.cts +1507 -1538
- package/dist/vue/async.d.ts +1507 -1538
- package/dist/vue/index.d.cts +2376 -2347
- package/dist/vue/index.d.ts +2376 -2347
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +184 -75
- package/dist/worker.cjs +1 -0
- package/dist/worker.d.cts +325 -0
- package/dist/worker.d.ts +325 -0
- package/dist/worker.js +158 -0
- package/dist/xlsx/node.d.cts +47 -0
- package/dist/xlsx/node.d.ts +47 -0
- package/dist/xlsx-node.cjs +221 -0
- package/dist/xlsx-node.js +36409 -0
- package/dist/xlsx.cjs +20 -20
- package/dist/xlsx.d.cts +87 -2
- package/dist/xlsx.d.ts +87 -2
- package/dist/xlsx.js +5987 -5840
- package/package.json +63 -3
- package/dist/ReportPreview-CBKLI--k.js +0 -2188
- package/dist/ReportPreview-ClM8h0pM.cjs +0 -6
- package/dist/grid-geometry-BNIvw52m.cjs +0 -1
- package/dist/grid-geometry-C8hGoe9o.js +0 -130
- package/dist/render-plan-CCTL4F9v.cjs +0 -1
- package/dist/report-params-B3Fia6JO.js +0 -10
- package/dist/report-params-D1gZ1DME.cjs +0 -1
- package/dist/textwrap-nH0UYU6D.js +0 -108
- package/dist/textwrap-oD-t4b4B.cjs +0 -4
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("./render-plan-CCTL4F9v.cjs"),u=require("./grid-geometry-BNIvw52m.cjs"),N=require("./textwrap-oD-t4b4B.cjs"),Ke=require("./page-window-index-DEjnM6IB.cjs"),qe=require("./report-params-D1gZ1DME.cjs"),Se=require("./number-format-CZ2T_5kF.cjs");function se(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 n=t??2;return`0${n?`.${"0".repeat(n)}`:""}%`}return t===void 0?e.thousands?"#,##0.###############":void 0:`${e.thousands?"#,##0":"0"}${t?`.${"0".repeat(t)}`:""}`}}function $e(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const r=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(r.getTime())?null:r}const n=new Date(e);return Number.isNaN(n.getTime())?null:n}function ie(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function Ye(e,t){const n=r=>String(r).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,n(e.getMonth()+1)).replace(/DD/g,n(e.getDate())).replace(/hh/g,n(e.getHours())).replace(/mm/g,n(e.getMinutes())).replace(/ss/g,n(e.getSeconds()))}function Xe(e,t,n){return n!=null?t?ie(e,n):e.toFixed(n):t?ie(e):String(e)}function Y(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function le(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const n=Y(e);return n==null?String(e):Xe(n,t.thousands===!0,t.digits)}case"percent":{const n=Y(e);return n==null?String(e):`${ie(n*100,t.digits??2)}%`}case"date":{const n=t.pattern??"YYYY-MM-DD",r=e instanceof Date?e:$e(String(e));return r?Ye(r,n):String(e)}default:return String(e)}}function Te(e,t){const n=e[t.field];if(n==null||n==="")return!1;if(typeof t.value=="number"){const i=Y(n);if(i==null)return!1;switch(t.op){case">":return i>t.value;case">=":return i>=t.value;case"<":return i<t.value;case"<=":return i<=t.value;case"==":return i===t.value;case"!=":return i!==t.value}}const r=String(n),o=String(t.value);switch(t.op){case"==":return r===o;case"!=":return r!==o;case">":return r>o;case">=":return r>=o;case"<":return r<o;case"<=":return r<=o}return!1}function Ee(e,t,n){e.editable!==void 0&&typeof e.editable!="boolean"&&n.push({path:`${t}.editable`,message:"编辑控制应为布尔值"}),e.valueType!==void 0&&!["text","number","boolean"].includes(e.valueType)&&n.push({path:`${t}.valueType`,message:"编辑类型应为 text、number 或 boolean"})}function Ze(e,t,n){Ee(e,t,n),e.formula!==void 0&&typeof e.formula!="string"&&n.push({path:`${t}.formula`,message:"单元格公式应为字符串"})}const Qe=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function j(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function et(e,t,n,r){const o=e[t];(typeof o!="number"||!Number.isFinite(o))&&r.push({path:`${n}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function tt(e,t,n){if(e!==void 0){const r=`${t}.table`;if(!j(e))n.push({path:r,message:"逻辑表来源应为对象"});else{(typeof e.id!="string"||!e.id.trim())&&n.push({path:`${r}.id`,message:"逻辑表 ID 应为非空字符串"});const o=e.role;["header","body","group-header","subtotal","grand-total"].includes(o)||n.push({path:`${r}.role`,message:"未知逻辑表行角色"});const i=e.rowIndex;(typeof i!="number"||!Number.isInteger(i)||(o==="header"?i!==-1:i<0))&&n.push({path:`${r}.rowIndex`,message:"表头索引应为 -1,内容行索引应为非负整数"}),(!Array.isArray(e.columnKeys)||e.columnKeys.some(a=>typeof a!="string"))&&n.push({path:`${r}.columnKeys`,message:"逻辑列字段应为字符串数组"}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&n.push({path:`${r}.layout`,message:"布局应为 page 或 wide"}),e.title!==void 0&&typeof e.title!="string"&&n.push({path:`${r}.title`,message:"逻辑表名称应为字符串"})}}}function nt(e,t,n,r){if(e!==void 0)if(!j(e)||!Array.isArray(e.cells))n.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"});else{const o=e.paddingMm;o!==void 0&&(typeof o!="number"||!Number.isFinite(o)||o<0)&&n.push({path:`${t}.grid.paddingMm`,message:"单元格内距应为有限非负数"}),e.cells.forEach((i,a)=>{if(!Array.isArray(i)){n.push({path:`${t}.grid.cells.${a}`,message:"行应为数组"});return}i.forEach((s,l)=>{if(s==null)return;const d=`${t}.grid.cells.${a}.${l}`;if(!j(s)){n.push({path:d,message:"网格单元格应为对象或 null"});return}Ze(s,d,n),Array.isArray(s.children)&&s.children.forEach((c,m)=>{Q(c,`${t}.grid.cells.${a}.${l}.children.${m}`,n,r)})})})}}function rt(e,t,n){e!==void 0&&(Array.isArray(e)?e.forEach((r,o)=>{(!j(r)||!Array.isArray(r.segments))&&n.push({path:`${t}.richParagraphs.${o}`,message:"段落缺少 segments 数组"})}):n.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function Q(e,t,n,r=[]){if(!j(e)){n.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?n.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):Qe.has(o)||r.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])et(e,i,t,n);typeof e.leftMm=="number"&&e.leftMm<-100&&n.push({path:`${t}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const i of["widthMm","heightMm"])typeof e[i]=="number"&&e[i]<0&&n.push({path:`${t}.${i}`,message:"组件尺寸不能为负数"});tt(e.table,t,n),nt(e.grid,t,n,r),rt(e.richParagraphs,t,n)}function xe(e,t,n,r=[]){if(!j(e)){n.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,i=e.pageHeightMm;(typeof o!="number"||!Number.isFinite(o)||o<=0)&&n.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof i!="number"||!(i>0&&i<5e3))&&n.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(i)}`}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&n.push({path:`${t}.layout`,message:"布局应为 page 或 wide"});const a=e.components;Array.isArray(a)?Array.isArray(a)&&a.forEach((s,l)=>Q(s,`${t}.components.${l}`,n,r)):n.push({path:`${t}.components`,message:"components 应为数组"})}function de(e){const t=[],n=[],r=j(e)?e.pages:void 0;if(!Array.isArray(r))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{r.forEach((i,a)=>xe(i,`$.pages.${a}`,t,n)),r.length>2e3&&n.push({path:"$.pages",message:`页数异常大(${r.length} 页),渲染与打印耗时可能显著增加`});const o=r.reduce((i,a)=>i+(j(a)&&Array.isArray(a.components)?a.components.length:0),0);o>5e4&&n.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:n}}function ot(e){const t=de(e);if(!t.ok){const n=t.errors.slice(0,3).map(r=>`${r.path}: ${r.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${n}`)}return e.pages}function it(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 at(e,t){return t.heightMm-(e.layout==="wide"?t.marginBottomMm:e.marginBottomMm??t.marginBottomMm)}function Pe(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 ke(e,t){let n=e.textMetrics.get(t);if(!n){const r=u.resolveFontSize(t).fontSizePt;n={measureOptions:{fontSizePt:r,bold:t.bold,letterSpacingPt:t.letterSpacing},lineMm:r*(t.lineHeight??$.LINE_HEIGHT)*25.4/72},e.textMetrics.set(t,n)}return n}function Ae(e,t){return 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 st(e){if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e}function lt(e,t){const n=e.fontSizePt??$.DEFAULT_FONT_PT,r=e.paddingMm??1,o=e.columns.map(f=>f.align??f.style?.align??e.align??"left"),i=e.columns.map((f,h)=>({...u.mergeComponentStyles({fontSize:n,verticalAlign:"middle"},f.style),align:o[h]==="auto"?"left":o[h]})),a=i.map((f,h)=>o[h]==="auto"?{left:f,center:{...f,align:"center"},right:{...f,align:"right"}}:void 0),s=e.columns.map((f,h)=>f.rules?.map(y=>{const M=a[h];if(M)return{left:u.mergeComponentStyles(M.left,y.style),center:u.mergeComponentStyles(M.center,y.style),right:u.mergeComponentStyles(M.right,y.style)};const w=u.mergeComponentStyles(i[h],y.style);return{left:w,center:w,right:w}})),l=e.columns.map(f=>{let h=u.mergeComponentStyles({fontSize:n,bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor},f.style);return e.headerAlign!==void 0&&(h.align=e.headerAlign),h=u.mergeComponentStyles(h,e.headerStyle),f.headerAlign!==void 0&&(h.align=f.headerAlign),u.mergeComponentStyles(h,f.headerStyle)}),d=e.columns.map(f=>f.header);let c=e.rowHeightMm??0;for(let f=0;f<d.length;f++){const h=l[f],y=u.resolveFontSize(h).fontSizePt,M=N.wrapText(d[f],e.columns[f].widthMm-r*2,{fontSizePt:y,bold:h.bold,letterSpacingPt:h.letterSpacing},t),w=y*(h.lineHeight??$.LINE_HEIGHT)*25.4/72;c=Math.max(c,Math.max(M.length,1)*w+r*2)}const m=d.map((f,h)=>({text:f,style:l[h]})),p=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0},g=e.columns.map(f=>f.widthMm);return{fontSizePt:n,paddingMm:r,cellStyles:i,autoStyles:a,ruleStyles:s,textMetrics:new WeakMap,numberFormats:e.columns.map(f=>se(f.format)),borderStyle:p,headerHeightMm:c,headerGrid:{cells:[m],colWidthsMm:g,rowHeightsMm:[c],paddingMm:r},colWidthsMm:g,columns:e.columns}}function dt(e,t,n){const r=t.format?.kind==="number"||t.format?.kind==="percent";t.valueType!==void 0?e.valueType=t.valueType:r&&(e.valueType="number"),t.editable!==void 0&&(e.editable=t.editable),(typeof e.value=="number"||e.value==null)&&n!==void 0&&(e.numberFormat=n)}function Me(e,t,n){const r=e.columns;let o=e.rowHeightFloorMm;const i=new Array(r.length);for(let a=0;a<r.length;a++){const s=r[a],l=t[s.field],d=e.autoStyles[a]?Ae(l,s.format):"left";let c=e.autoStyles[a]?.[d]??e.cellStyles[a];if(s.rules)for(let y=0;y<s.rules.length;y++){const M=s.rules[y];if(Te(t,M.when)){c=e.ruleStyles[a][y][d];break}}const m=s.format?le(l,s.format):Pe(l),p=ke(e,c),g=N.wrapText(m,s.widthMm-e.paddingMm*2,p.measureOptions,n);o=Math.max(o,g.length*p.lineMm+e.paddingMm*2);const f=st(l),h={text:m,style:c};f!==void 0&&(h.value=f),dt(h,s,e.numberFormats[a]),i[a]=h}return{grid:{cells:[i],colWidthsMm:e.colWidthsMm,rowHeightsMm:[o],paddingMm:e.paddingMm},heightMm:o}}function*ct(e,t){if(!t){for(const r of e)yield{kind:"row",row:r};return}const n=new Map;for(const r of e){const o=Pe(r[t.field]),i=n.get(o);i?i.push(r):n.set(o,[r])}for(const[r,o]of n){yield{kind:"groupHeader",label:(t.headerTemplate??"{value}").replace(/\{value\}/g,r),firstRow:o[0]};for(const i of o)yield{kind:"row",row:i};t.subtotal?.length&&(yield{kind:"subtotal",label:t.subtotalLabel??"小计",rows:o})}}function mt(e,t){let n=0;for(const r of e){const o=typeof r[t]=="number"?r[t]:Number(r[t]);Number.isFinite(o)&&(n+=o)}return n}function Ce(e,t,n){return new Map(n.map(r=>{const o=e.find(a=>a.field===r)?.format??{kind:"number",thousands:!0},i=mt(t,r);return[r,{text:le(i,o),value:i,numberFormat:se(o)}]}))}function Re(e,t){const n=e.findIndex(r=>t.includes(r.field));return n>0?n:1}function ae(e,t,n,r,o,i){const a=[],s=Math.max(1,Math.min(i,e.columns.length)),l=u.mergeComponentStyles({fontSize:e.fontSizePt},o);a.push({text:n,colSpan:s,style:{bold:!0,...l}});for(let m=s;m<e.columns.length;m++){const p=e.columns[m],g=r.get(p.field),f=e.autoStyles[m]?.[Ae(g?.value,p.format)]??e.cellStyles[m];a.push({...g,text:g?.text??"",style:u.mergeComponentStyles(f,o)})}let d=e.rowHeightFloorMm,c=0;for(const m of a){let p=0;const g=c+(m.colSpan??1);for(;c<g;c++)p+=e.colWidthsMm[c]??0;const f=ke(e,m.style),h=N.wrapText(m.text??"",p-e.paddingMm*2,f.measureOptions,t);d=Math.max(d,h.length*f.lineMm+e.paddingMm*2)}return{grid:{cells:[a],colWidthsMm:e.colWidthsMm,rowHeightsMm:[d],paddingMm:e.paddingMm},heightMm:d}}function ft(e,t,n){const{templatePage:r,current:o,warnings:i,nextId:a,pushCurrent:s}=n,l=()=>at(r,o),d=o.marginTopMm,c={id:n.tableId,columnKeys:e.columns.map(v=>v.field),...e.layout===void 0?{}:{layout:e.layout},...e.title===void 0?{}:{title:e.title}};let m=0;const p={kind:"rect",leftMm:e.leftMm,topMm:0,widthMm:e.widthMm,heightMm:t.headerHeightMm,grid:t.headerGrid,nid:a("listh"),table:{...c,role:"header",rowIndex:-1},style:t.borderStyle},g=v=>o.components.push({...p,topMm:v});let f=e.topMm;g(f),f+=t.headerHeightMm+n.mmPerRow;function h(){const v=r.layout==="wide"?0:e.topMm;return e.headerEveryPage!==!1?v+t.headerHeightMm:r.layout==="wide"?0:d}function y(){const v=r.layout==="wide"?0:o.marginBottomMm;return r.heightMm-v-h()}function M(v){if(f+v<=l())return;s(),o.components=[],o.heightMm=r.heightMm,r.layout==="wide"&&(o.marginTopMm=0,o.marginBottomMm=0);const D=r.layout==="wide"?0:e.topMm;e.headerEveryPage!==!1?(g(D),f=D+t.headerHeightMm):f=r.layout==="wide"?0:d}function w(v,D,V){const z=y();v.heightMm>z&&i.push(`列表 ${e.id??e.dataset} 行高 ${v.heightMm.toFixed(2)}mm 超出单页可用高度 ${z.toFixed(2)}mm,预览与打印可能截断内容`),M(v.heightMm),o.components.push({kind:"rect",leftMm:e.leftMm,topMm:f,widthMm:e.widthMm,heightMm:v.heightMm,grid:v.grid,nid:a(D),table:{...c,role:V,rowIndex:m++},style:t.borderStyle}),f+=v.heightMm}function k(v){v<=y()&&M(v)}return{keepTogether:k,placeGridRow:w}}function ut(e,t,n,r,o){if(!e.grandTotal)return;const i=typeof e.grandTotal=="object"?e.grandTotal:void 0,a=i?.fields??e.groupBy?.subtotal??[];if(a.length===0){r.warnings.push(`列表 ${e.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`);return}const s=ae(n,r.measurer,i?.label??"合计",Ce(e.columns,t,a),i?.style??{},Re(e.columns,a));o.placeGridRow(s,"listgt","grand-total")}function ht(e,t,n){const r=e.columns.reduce((d,c)=>d+c.widthMm,0),o=r>e.widthMm?e.widthMm/r:1,i=o===1?e:{...e,columns:e.columns.map(d=>({...d,widthMm:d.widthMm*o}))},a={...lt(i,n.measurer),rowHeightFloorMm:i.rowHeightMm??0},s=ft(i,a,n);let l;for(const d of ct(t,i.groupBy))if(d.kind==="row")s.placeGridRow(l??Me(a,d.row,n.measurer),"listr","body"),l=void 0;else if(d.kind==="groupHeader"){const c=ae(a,n.measurer,d.label,new Map,i.groupBy?.headerStyle??{},i.columns.length);l=Me(a,d.firstRow,n.measurer),i.groupBy?.keepWithNext!==!1&&s.keepTogether(c.heightMm+l.heightMm),s.placeGridRow(c,"listg","group-header")}else{const c=i.groupBy?.subtotal??[],m=ae(a,n.measurer,d.label,Ce(i.columns,d.rows,c),i.groupBy?.subtotalStyle??{},Re(i.columns,c));s.placeGridRow(m,"listst","subtotal")}ut(i,t,a,n,s)}function we(e){return e.kind==="text"&&typeof e.text=="string"&&(e.text.includes("{page}")||e.text.includes("{totalPages}"))}function gt(e,t,n,r,o,i){const a={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};r.push(a);for(const s of n){const l={...s,text:String(s.text??"").replace(/\{page\}/g,String(r.length))};a.components.push(l),l.text.includes("{totalPages}")&&o.push(l)}if(e.layout==="wide"){const s=a.components.reduce((l,d)=>Math.max(l,d.topMm+d.heightMm),0);a.marginBottomMm=i?e.marginBottomMm??0:0,a.pageHeightMm=Math.max(1,s+a.marginBottomMm)}}function Ne(e,t,n={}){const r=typeof n=="number"?{mmPerRow:n}:n,o=[],i=[],a=[];let s=0;const l=d=>`${d}_${(++s).toString(36)}`;for(const[d,c]of e.pages.entries()){const m=it(c),p=c.components.filter(we),g=(f=!1)=>gt(c,m,p,i,a,f);for(const[f,h]of c.components.entries()){if(we(h))continue;if(h.kind!=="list"){m.components.push(h);continue}const y=t[h.dataset];Array.isArray(y)||o.push(`数据集 ${h.dataset} 未提供数据,列表 ${h.id??""} 输出为空`),ht(h,Array.isArray(y)?y:[],{templatePage:c,current:m,warnings:o,nextId:l,pushCurrent:g,measurer:r.measurer??N.heuristicMeasurer,mmPerRow:r.mmPerRow??0,tableId:`table:${d}:${f}`})}g(!0)}for(const d of a)d.text=d.text.replace(/\{totalPages\}/g,String(i.length));return{plan:{schemaVersion:$.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:o}}const pt={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function P(e,t){return t?.classNames?.[e]??pt[e]}class yt{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,o=2){return this.add(t,`${u.round(u.mmToPx(n,r),o)}px`)}toString(){let t="";for(const[n,r]of this.props)t+=`${n}:${r};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function E(e,t="unset"){return new yt().add("all",t).add("display",e).add("box-sizing","border-box")}function Ie(e,t,n){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(u.resolveLineHeight(t))).add("text-align",t.align);const r=u.resolveFontSize(t,n);e.add("font-size",`${u.round(r.fontSizePx,2)}px`)}function bt(e,t,n){const r=t.style??{};Ie(e,r,n),e.add("background-color",r.backgroundColor).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0)}function Mt(e,t,n,r,o,i){const a=e.cell,s=i.createElement("td");s.className=P("cell",o),s.dataset.mrRowIndex=String(e.ri),s.dataset.mrColumnIndex=String(e.ci),s.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),a.colSpan&&(s.colSpan=a.colSpan),a.rowSpan&&(s.rowSpan=a.rowSpan);const l=u.mergeComponentStyles(t.style,a.style),d=E("block").add("position","absolute").mm("left",e.xMm,r).mm("top",e.yMm,r).mm("width",e.widthMm,r).mm("height",e.heightMm,r).add("background-color",l.backgroundColor).add("vertical-align",l.verticalAlign??"middle");Ie(d,l,r),d.applyTo(s);const c=i.createElement("div");c.className="mr-cell-content",E("flex").add("position","absolute").mm("left",n,r).mm("right",n,r).mm("top",n,r).mm("bottom",n,r).add("flex-direction","column").add("justify-content",l.verticalAlign==="top"?"flex-start":l.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(c),a.text!=null&&c.append(a.text);for(const m of a.children??[])c.appendChild(ce(m,r,o,i));return s.appendChild(c),s}function wt(e,t,n,r){const o=u.resolveBoxBorders(t.style),i=o.inner?[...e.edges]:[];o.top&&i.push({kind:"h",pos:0,from:0,to:t.widthMm}),o.bottom&&i.push({kind:"h",pos:t.heightMm,from:0,to:t.widthMm}),o.left&&i.push({kind:"v",pos:0,from:0,to:t.heightMm}),o.right&&i.push({kind:"v",pos:t.widthMm,from:0,to:t.heightMm});const a=u.resolveStroke(t.style),s=`${u.round(a.widthPt*n/72,2)}px solid ${a.color}`;return i.map(l=>{const d=r.createElement("div");d.className="mr-grid-edge",d.setAttribute("aria-hidden","true");const c=l.kind==="h";return E("block").add("position","absolute").add("pointer-events","none").mm("left",c?l.from:l.pos,n).mm("top",c?l.pos:l.from,n).mm("width",c?l.to-l.from:0,n).mm("height",c?0:l.to-l.from,n).add(c?"border-top":"border-left",s).applyTo(d),d})}function vt(e,t,n,r,o){const i=o.createElement("table");i.className=P("grid",r),i.setAttribute("role","table"),E("block").add("position","relative").add("width","100%").add("height","100%").applyTo(i);const a=u.resolveGridLayout(e,t.widthMm,t.heightMm),s=o.createElement("tbody");E("contents").applyTo(s),i.appendChild(s);const l=e.cells.map(()=>{const c=o.createElement("tr");return c.className=P("row",r),c.setAttribute("role","row"),E("contents").applyTo(c),s.appendChild(c),c});for(const c of a.cells)l[c.ri].appendChild(Mt(c,t,e.paddingMm??.5,n,r,o));const d=o.createElement("div");return E("block").add("position","relative").add("width","100%").add("height","100%").applyTo(d),d.append(i,...wt(a,t,n,o)),d}function St(e,t,n,r){const o=r.createElement("div");o.className=P("paragraph",n),E("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(o);for(const i of e.segments||[]){const a=r.createElement("span");a.className=P("segment",n),a.textContent=i.kind==="field"?i.field??"":i.text??"";const s=E("inline");if(i.style){const l=i.style;s.add("color",l.color).add("font-family",l.fontFamily).add("font-weight",l.bold!=null?l.bold?"700":"400":void 0).add("font-style",l.italic!=null?l.italic?"italic":"normal":void 0).add("text-decoration",l.underline!=null?l.underline?"underline":"none":void 0),(l.fontSize!=null||l.fontSizePx!=null)&&s.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}s.applyTo(a),o.appendChild(a)}return o}function $t(e,t,n,r){if($.isRichText(e)){const o=r.createElement("div");o.className=P("rich",n),E("block").applyTo(o);for(const i of e.richParagraphs)o.appendChild(St(i,t,n,r));return o}if(Array.isArray(e.lines)&&e.lines.length>0){const o=r.createElement("div");o.className=P("lines",n),E("block").applyTo(o);for(const i of e.lines){const a=r.createElement("div");a.className=P("line",n),a.textContent=i,E("block").add("white-space","pre").add("min-height","1lh").applyTo(a),o.appendChild(a)}return o}return e.text??""}function Tt(e,t,n,r){const o=r.createElement("div");o.className=P("text",n);const i=e.style||{};return E("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",i.verticalAlign==="middle"?"center":i.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(o),o.append($t(e,t,n,r)),o}function Et(e,t,n){const r=n.createElement("img");return r.className=P("image",t),r.src=e.imageData,E("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function ve(e,t,n,r){const o=r.createElement("div");o.className=P("shape",n);const i=e.style||{},a=u.resolveStroke(i),s=u.resolveBoxBorders(i),l=`${u.round(a.widthPt*t/72,2)}px solid ${a.color}`,d=E("block");return e.grid?d.add("position","relative"):e.kind==="rect"?(s.top&&d.add("border-top",l),s.right&&d.add("border-right",l),s.bottom&&d.add("border-bottom",l),s.left&&d.add("border-left",l)):e.kind==="ellipse"?(s.inner&&d.add("border",l).add("border-radius","50%"),i.backgroundColor&&d.add("background-color",i.backgroundColor)):e.kind==="line"&&d.add("height","0").add("border-top",l),d.add("box-sizing","border-box").add("width","100%").add("height","100%"),d.applyTo(o),o}function ce(e,t,n,r){const o=r.createElement("div");o.className=`${P("comp",n)} mr-kind-${e.kind}`;const i=E("block").add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(bt(i,e,t),i.applyTo(o),$.isImageBackedComponent(e))return o.appendChild(Et(e,n,r)),o;if(e.kind==="text")return o.appendChild(Tt(e,t,n,r)),o;if(e.grid){const s=ve(e,t,n,r);return s.appendChild(vt(e.grid,e,t,n,r)),o.appendChild(s),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(ve(e,t,n,r)),o;const a=r.createElement("div");return a.className=P("unknown",n),E("block").applyTo(a),a.textContent=e.fallbackText??"",o.appendChild(a),o}function Le(e,t,n,r){const o=r.createElement("div");return o.className=P("page",n),E("block","initial").add("position","relative").add("font-family",'"Microsoft YaHei", sans-serif').add("font-size",`${u.round(u.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(u.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",$.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(o),e.components.forEach((i,a)=>{const s=ce(i,t,n,r);s.dataset.mrComponentIndex=String(a),o.appendChild(s)}),o}function xt(e,t,n={}){const r=n.dpi??96,o=t.createElement("div");return o.className=P("root",n),E("block").applyTo(o),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(i=>{o.appendChild(Le(i,r,n,t))}),o}function Oe(e){return Ke.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const me=96/25.4;function fe(e,t=96){const n=t/96*me;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Pt(e,t,n){const r=document.createElement("canvas"),{widthPx:o,heightPx:i}=fe(e,n);r.width=Math.round(o*t),r.height=Math.round(i*t),r.style.width=`${o}px`,r.style.height=`${i}px`;const a=r.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(t,t),a.fillStyle="#ffffff",a.fillRect(0,0,o,i),{canvas:r,ctx:a}}function kt(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Fe(e,t,n,r,o,i,a,s="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${a}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,d=t.text===""?[""]:t.text.split(`
|
|
2
|
-
`),c
|
|
3
|
-
`);
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("./render-plan-CckPEQyf.cjs"),A=require("./report-source-CCAvFE3t.cjs"),f=require("./style-CpwiOPyB.cjs"),Z=require("./validate-DfHPD8wX.cjs"),$=require("./textwrap-CnGsEum6.cjs"),H=require("./progress-KvhwXZ1Q.cjs"),j=require("./assets-RZan7EyL.cjs"),D=require("./capabilities-xGTpnPjJ.cjs"),je=require("./page-window-index-DEjnM6IB.cjs"),N=require("./template-registry-DWExx0gU.cjs"),q=require("./param-validation-CiTxFeZ8.cjs"),be=require("./number-format-CZ2T_5kF.cjs"),We={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function P(e,t){return t?.classNames?.[e]??We[e]}class qe{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,o=2){return this.add(t,`${f.round(f.mmToPx(n,r),o)}px`)}toString(){let t="";for(const[n,r]of this.props)t+=`${n}:${r};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function x(e,t="unset"){return new qe().add("all",t).add("display",e).add("box-sizing","border-box")}function ye(e,t,n){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(f.resolveLineHeight(t))).add("text-align",t.align);const r=f.resolveFontSize(t,n);e.add("font-size",`${f.round(r.fontSizePx,2)}px`)}function Ke(e,t,n){const r=t.style??{};ye(e,r,n),e.add("background-color",r.backgroundColor).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0)}function Ve(e,t,n,r,o,l){const i=e.cell,a=l.createElement("td");a.className=P("cell",o),a.dataset.mrRowIndex=String(e.ri),a.dataset.mrColumnIndex=String(e.ci),a.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),i.colSpan&&(a.colSpan=i.colSpan),i.rowSpan&&(a.rowSpan=i.rowSpan);const s=f.mergeComponentStyles(t.style,i.style),c=x("block").add("position","absolute").mm("left",e.xMm,r).mm("top",e.yMm,r).mm("width",e.widthMm,r).mm("height",e.heightMm,r).add("background-color",s.backgroundColor).add("vertical-align",s.verticalAlign??"middle");ye(c,s,r),c.applyTo(a);const d=l.createElement("div");d.className="mr-cell-content",x("flex").add("position","absolute").mm("left",n,r).mm("right",n,r).mm("top",n,r).mm("bottom",n,r).add("flex-direction","column").add("justify-content",s.verticalAlign==="top"?"flex-start":s.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(d),i.text!=null&&d.append(i.text);for(const u of i.children??[])d.appendChild(se(u,r,o,l));return a.appendChild(d),a}function Ue(e,t,n,r){return j.resolveGridStrokes(e,t).map(o=>{const l=`${f.round(o.widthPt*n/72,2)}px solid ${o.color}`,i=r.createElement("div");i.className="mr-grid-edge",i.setAttribute("aria-hidden","true");const a=o.kind==="h";return x("block").add("position","absolute").add("pointer-events","none").mm("left",a?o.from:o.pos,n).mm("top",a?o.pos:o.from,n).mm("width",a?o.to-o.from:0,n).mm("height",a?0:o.to-o.from,n).add(a?"border-top":"border-left",l).applyTo(i),i})}function Ge(e,t,n,r,o){const l=o.createElement("table");l.className=P("grid",r),l.setAttribute("role","table"),x("block").add("position","relative").add("width","100%").add("height","100%").applyTo(l);const i=H.resolveGridLayout(e,t.widthMm,t.heightMm),a=o.createElement("tbody");x("contents").applyTo(a),l.appendChild(a);const s=e.cells.map(()=>{const d=o.createElement("tr");return d.className=P("row",r),d.setAttribute("role","row"),x("contents").applyTo(d),a.appendChild(d),d});for(const d of i.cells)s[d.ri].appendChild(Ve(d,t,e.paddingMm??.5,n,r,o));const c=o.createElement("div");return x("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(l,...Ue(i,t,n,o)),c}function Ye(e,t,n,r){const o=r.createElement("div");o.className=P("paragraph",n),x("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(o);for(const l of e.segments||[]){const i=r.createElement("span");i.className=P("segment",n),i.textContent=l.kind==="field"?l.field??"":l.text??"";const a=x("inline");if(l.style){const s=l.style;a.add("color",s.color).add("font-family",s.fontFamily).add("font-weight",s.bold!=null?s.bold?"700":"400":void 0).add("font-style",s.italic!=null?s.italic?"italic":"normal":void 0).add("text-decoration",s.underline!=null?s.underline?"underline":"none":void 0),(s.fontSize!=null||s.fontSizePx!=null)&&a.add("font-size",`${f.round(f.resolveFontSize(s,t).fontSizePx,2)}px`)}a.applyTo(i),o.appendChild(i)}return o}function Je(e,t,n,r){if(y.isRichText(e)){const o=r.createElement("div");o.className=P("rich",n),x("block").applyTo(o);for(const l of e.richParagraphs)o.appendChild(Ye(l,t,n,r));return o}if(Array.isArray(e.lines)&&e.lines.length>0){const o=r.createElement("div");o.className=P("lines",n),x("block").applyTo(o);for(const l of e.lines){const i=r.createElement("div");i.className=P("line",n),i.textContent=l,x("block").add("white-space","pre").add("min-height","1lh").applyTo(i),o.appendChild(i)}return o}return e.text??""}function Xe(e,t,n,r){const o=r.createElement("div");o.className=P("text",n);const l=e.style||{};return x("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",l.verticalAlign==="middle"?"center":l.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(o),o.append(Je(e,t,n,r)),o}function Ze(e,t,n){const r=n.createElement("img");return r.className=P("image",t),r.src=e.imageData,x("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function ge(e,t,n,r){const o=r.createElement("div");o.className=P("shape",n);const l=e.style||{},i=f.resolveStroke(l),a=f.resolveBoxBorders(l),s=`${f.round(i.widthPt*t/72,2)}px solid ${i.color}`,c=x("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(a.top&&c.add("border-top",s),a.right&&c.add("border-right",s),a.bottom&&c.add("border-bottom",s),a.left&&c.add("border-left",s)):e.kind==="ellipse"?(a.inner&&c.add("border",s).add("border-radius","50%"),l.backgroundColor&&c.add("background-color",l.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",s),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(o),o}function Qe(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),o=f.mmToPx(e.widthMm,t),l=f.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,o))),r.setAttribute("height",String(Math.max(1,l))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const i=n.createElementNS("http://www.w3.org/2000/svg","line");i.setAttribute("x1","0"),i.setAttribute("x2",String(o)),i.setAttribute("y1",e.lineDirection==="up"?String(l):"0"),i.setAttribute("y2",e.lineDirection==="up"?"0":String(l));const a=f.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return i.setAttribute("stroke",a.color),i.setAttribute("stroke-width",String(a.widthPt*t/72)),r.appendChild(i),r}function se(e,t,n,r){const o=r.createElement("div");o.className=`${P("comp",n)} mr-kind-${e.kind}`;const l=x("block").add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(Ke(l,e,t),l.applyTo(o),y.isImageBackedComponent(e))return o.appendChild(Ze(e,n,r)),o;if(e.kind==="text")return o.appendChild(Xe(e,t,n,r)),o;if(e.grid){const a=ge(e,t,n,r);return a.appendChild(Ge(e.grid,e,t,n,r)),o.appendChild(a),o}if(e.kind==="line"&&e.lineDirection)return o.appendChild(Qe(e,t,r)),o;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return o.appendChild(ge(e,t,n,r)),o;const i=r.createElement("div");return i.className=P("unknown",n),x("block").applyTo(i),i.textContent=e.fallbackText??`[${e.kind}]`,i.dataset.mrUnsupported=e.kind,i.setAttribute("role","note"),o.appendChild(i),o}function Me(e,t,n,r){const o=r.createElement("div");return o.className=P("page",n),x("block","initial").add("position","relative").add("font-family",y.DEFAULT_FONT_FAMILY).add("font-size",`${f.round(f.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(f.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",y.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(o),e.components.forEach((l,i)=>{const a=se(l,t,n,r);a.dataset.mrComponentIndex=String(i),o.appendChild(a)}),o}function et(e,t,n={}){const r=n.dpi??96;D.reportOutputDiagnostics(e,"dom",n);const o=t.createElement("div");return o.className=P("root",n),x("block").applyTo(o),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(l=>{o.appendChild(Me(l,r,n,t))}),o}function F(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const tt=(e,t)=>(F(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const o=new Image,l=()=>{o.onload=null,o.onerror=null,t?.removeEventListener("abort",i)},i=()=>{l(),o.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};o.onload=()=>{l(),n(o)},o.onerror=()=>{l(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",i,{once:!0}),o.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function nt(e,t,n){return F(n),n?new Promise((r,o)=>{const l=()=>o(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",l,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,o).finally(()=>n.removeEventListener("abort",l))}):e(t)}async function rt(e,t,n){const r=new Map;for(const o of e.components)!y.isImageBackedComponent(o)||r.has(o.imageData)||r.set(o.imageData,await nt(t,o.imageData,n));return F(n),r}function ot(e,t,n,r,o,l){const i=t,a=i.naturalWidth??i.width??o,s=i.naturalHeight??i.height??l;if(a<=0||s<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(o/a,l/s),d=a*c,u=s*c;e.drawImage(t,n+(o-d)/2,r+(l-u)/2,d,u)}function Te(e){return je.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const le=96/25.4;function Q(e,t=96){const n=t/96*le;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function xe(e,t,n,r=64e6){if(!Number.isFinite(t)||t<=0||!Number.isFinite(n)||n<=0)throw new RangeError("Canvas dpr and dpi must be positive finite numbers.");if(!Number.isFinite(r)||r<=0)throw new RangeError("maxCanvasPixels must be positive and finite.");const o=Q(e,n),l=Math.round(o.widthPx*t),i=Math.round(o.heightPx*t);if(!Number.isSafeInteger(l)||!Number.isSafeInteger(i)||l*i>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:l,height:i}}function Ee(e,t,n,r){const o=document.createElement("canvas"),{widthPx:l,heightPx:i}=Q(e,n),a=xe(e,t,n,r);o.width=a.width,o.height=a.height,o.style.width=`${l}px`,o.style.height=`${i}px`;const s=o.getContext("2d");if(!s)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return s.scale(t,t),s.fillStyle="#ffffff",s.fillRect(0,0,l,i),{canvas:o,ctx:s}}function it(e,t=96){return f.resolveFontSize(e,t).fontSizePx}function Se(e,t,n,r,o,l,i,a="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${i}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const s=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
|
|
2
|
+
`),d=c.length*s;let u=r;a==="middle"?u=r+(l-d)/2:a==="bottom"&&(u=r+l-d),c.forEach((m,h)=>{at(e,m,t,n,u+h*s+t.fontSizePx*.8,o)}),e.textAlign="left"}function at(e,t,n,r,o,l){const i=Array.from(t),a=n.letterSpacingPx??0;if(!a){e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const u=n.align==="center"?r+l/2:n.align==="right"?r+l:r;e.fillText(t,u,o);return}const s=e.measureText(t).width+Math.max(0,i.length-1)*a,c=n.align==="center"?r+(l-s)/2:n.align==="right"?r+l-s:r;e.textAlign="left";let d="";i.forEach((u,m)=>{e.fillText(u,c+e.measureText(d).width+m*a,o),d+=u})}function st(e,t,n,r,o,l,i){for(const a of j.resolveGridStrokes(t,n))e.strokeStyle=a.color,e.lineWidth=f.ptToPx(a.widthPt,i),e.beginPath(),a.kind==="v"?(e.moveTo(r+a.pos*l,o+a.from*l),e.lineTo(r+a.pos*l,o+a.to*l)):(e.moveTo(r+a.from*l,o+a.pos*l),e.lineTo(r+a.to*l,o+a.pos*l)),e.stroke()}function lt(e,t,n,r,o,l){e.beginPath(),t.top&&(e.moveTo(n,r),e.lineTo(n+o,r)),t.right&&(e.moveTo(n+o,r),e.lineTo(n+o,r+l)),t.bottom&&(e.moveTo(n+o,r+l),e.lineTo(n,r+l)),t.left&&(e.moveTo(n,r+l),e.lineTo(n,r)),e.stroke()}function ct(e,t,n,r,o,l,i,a,s,c,d){const u=H.resolveGridLayout(t,l/a,i/a);for(const h of u.cells){const g=h.cell.style?.backgroundColor??n.style?.backgroundColor;g&&(e.fillStyle=g,e.fillRect(r+h.xMm*a,o+h.yMm*a,h.widthMm*a,h.heightMm*a))}st(e,u,n,r,o,a,s);const m=t.paddingMm??.5;for(const h of u.cells){const g=h.cell.text??"";if(!g)continue;const p=f.mergeComponentStyles(n.style,h.cell.style),b=f.resolveFontSize(p,s),E=Math.max(0,h.widthMm-2*m),S=$.wrapText(g,E,{fontSizePt:b.fontSizePt,bold:p.bold,italic:p.italic,fontFamily:p.fontFamily??c,letterSpacingPt:p.letterSpacing},d).join(`
|
|
3
|
+
`);Se(e,{text:S,fontSizePx:b.fontSizePx,bold:p.bold??!1,italic:p.italic,color:f.resolveTextColor(p,y.DEFAULT_TEXT_COLOR),align:p.align??"left",lineHeight:f.resolveLineHeight(p),letterSpacingPx:f.ptToPx(p.letterSpacing??0,s)},r+(h.xMm+m)*a,o+(h.yMm+m)*a,E*a,Math.max(0,h.heightMm-2*m)*a,p.fontFamily??c,p.verticalAlign??"middle")}}function dt(e,t,n,r,o,l,i,a,s){const c=t.style??{},d=f.resolveFontSize(c,i),u=y.isRichText(t)?t.richParagraphs.map(m=>m.segments.map(h=>h.text??h.field??"").join("")).join(`
|
|
4
4
|
`):t.lines?.length?t.lines.join(`
|
|
5
|
-
`)
|
|
6
|
-
`);Fe(e,{text:m,fontSizePx:c.fontSizePx,bold:d.bold??!1,italic:d.italic,color:u.resolveTextColor(d),align:d.align??"left",lineHeight:u.resolveLineHeight(d)},n,r,o,i,d.fontFamily??s,d.verticalAlign)}function He(e,t,n,r,o,i){const a=t.leftMm*n,s=t.topMm*n,l=t.widthMm*n,d=t.heightMm*n,c=t.style??{};if(t.grid){Ct(e,t.grid,t,a,s,l,d,n,r,o,i);return}switch(t.kind){case"text":{Rt(e,t,a,s,l,d,r,o,i);break}case"rect":{const m=u.resolveStroke(c),p=u.resolveBoxBorders(c);c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.fillRect(a,s,l,d)),p.inner&&(e.strokeStyle=m.color,e.lineWidth=u.ptToPx(m.widthPt,r),_e(e,p,a,s,l,d));break}case"line":{const m=u.resolveStroke({...c,borderColor:c.lineColor??c.borderColor});e.strokeStyle=m.color,e.lineWidth=u.ptToPx(m.widthPt,r),e.beginPath(),e.moveTo(a,s+d/2),e.lineTo(a+l,s+d/2),e.stroke();break}case"ellipse":{const m=u.resolveStroke(c);e.strokeStyle=m.color,e.lineWidth=u.ptToPx(m.widthPt,r),c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.beginPath(),e.ellipse(a+l/2,s+d/2,l/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+l/2,s+d/2,l/2,d/2,0,0,Math.PI*2),e.stroke();break}}}async function Nt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...o}=t,{canvases:i}=Be(e,o),a=n==="jpeg"?"image/jpeg":"image/png",s=[];for(const l of i)s.push(await new Promise(d=>l.toBlob(c=>d(c),a,r))??new Blob([],{type:a}));return{blobs:s}}function Be(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*me,i=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??N.heuristicMeasurer,s=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),d=[];for(let c=s;c<=l;c++){const m=e.pages[c],{canvas:p,ctx:g}=Pt(m,n,r);for(const f of m.components)He(g,f,o,r,i,a);d.push(p)}return{canvases:d}}function It(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*me,i=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??N.heuristicMeasurer,s=t.overscan??1,l=t.gapPx??18,d=t.pagesPerFrame??1,c=e.pages.map(b=>b.pageHeightMm*o),m=Math.max(1,...e.pages.map(b=>b.pageWidthMm*o)),p={start:0,end:-1};let g=null,f=null,h=null,y=null,M=[],w=0,k=[];function v(){const b=g;b.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${m}px;margin:0 auto;`,h=document.createElement("div"),y=document.createElement("div"),f.appendChild(h),M=[];const I=Math.min(e.pages.length,3+s*2);for(let F=0;F<I;F++){const S=document.createElement("div");S.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(S),M.push(S)}f.appendChild(y),b.appendChild(f)}function D(b,I){const F=e.pages[I],{widthPx:S,heightPx:A}=fe(F,r);let L=b.firstElementChild;(!L||L.tagName!=="CANVAS")&&(L=document.createElement("canvas"),b.innerHTML="",b.appendChild(L)),L.width=Math.round(S*n),L.height=Math.round(A*n),L.style.width=`${S}px`,L.style.height=`${A}px`;const G=L.getContext("2d");if(G){G.setTransform(1,0,0,1,0,0),G.scale(n,n),G.fillStyle="#ffffff",G.fillRect(0,0,S,A);for(const Ue of F.components)He(G,Ue,o,r,i,a);L.dataset.canvasPage=String(I),b.style.height=`${A}px`,b.style.width=`${S}px`}}function V(b){p.start=b.start,p.end=b.end,h.style.height=`${b.start*l+c.slice(0,b.start).reduce((S,A)=>S+A,0)}px`;const I=e.pages.length-1-b.end;y.style.height=`${I*l+c.slice(b.end+1).reduce((S,A)=>S+A,0)}px`;const F=b.end-b.start+1;M.forEach((S,A)=>{if(A<F){S.style.display="";const L=b.start+A;S.style.height=`${c[L]??0}px`}else S.style.display="none"}),k=[];for(let S=b.start;S<=b.end;S++){const A=M[S-b.start];if(!A)continue;A.firstElementChild?.dataset?.canvasPage!==String(S)&&k.push(S)}z()}function z(){w||k.length===0||(w=requestAnimationFrame(()=>{w=0;let b=Math.max(1,d);for(;k.length>0&&b-- >0;){const I=k.shift(),F=M[I-p.start];F&&D(F,I)}k.length>0&&z()}))}function K(){w||(w=requestAnimationFrame(()=>{w=0;const b=g,I=Oe({pageHeightsPx:c,viewportHeightPx:b.clientHeight,scrollTopPx:b.scrollTop,overscan:s,gapPx:l});I.start!==p.start||I.end!==p.end?V(I):z()}))}let q=null;return{attach(b){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");g=b,v(),b.addEventListener("scroll",K,{passive:!0}),typeof ResizeObserver<"u"&&(q=new ResizeObserver(()=>K()),q.observe(b)),K()},destroy(){w&&cancelAnimationFrame(w),w=0,q?.disconnect(),q=null,g?.removeEventListener("scroll",K),k=[],f?.remove(),g=null},window(){return{...p}}}}function ue(e,t,n){let r,o;if(typeof e=="string"){const i=u.PAPER_SIZES[e];if(!i)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);r=i.widthMm,o=i.heightMm}else typeof e=="number"?(r=e,o=t??297):(r=e.widthMm,o=e.heightMm);return n?{widthMm:o,heightMm:r}:{widthMm:r,heightMm:o}}class De{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const i=r!=null&&!("margins"in r)&&!("landscape"in r)&&("marginTopMm"in r||"marginBottomMm"in r||"marginLeftMm"in r||"marginRightMm"in r)?{margins:r}:typeof n=="number"?r??{}:n,{widthMm:a,heightMm:s}=ue(t,typeof n=="number"?n:void 0,i.landscape),l=i.margins??{};return this.pending=new ze(this,{widthMm:a,heightMm:s,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class ze{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},r={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:r}),this}list(t,n,r,o={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...o}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,o={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:o}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,r,o){return this.components.push({kind:"qrcode",leftMm:r,topMm:o,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function Lt(){return new De}function O(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function X(e,t,n){if(e!==void 0&&!["left","center","right","justify",...n?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${n?"/auto":""}`)}function Ot(e){const t=e.layout??"page";if(t!=="page"&&t!=="wide")throw new Error("layout 必须是 page 或 wide");if(t==="wide"&&(e.paper!==void 0||e.landscape!==void 0))throw new Error('宽表布局不能同时指定 paper 或 landscape;标准纸型请使用 layout: "page"');if(t!=="wide"&&e.columnWidthMm!==void 0)throw new Error('columnWidthMm 仅适用于 layout: "wide"');const n=e.columnWidthMm??30;return O(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function Ft(e){const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(u.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);const n=ue(t,void 0,e.landscape),r=n.widthMm,o=n.heightMm;return O(r,"纸张 widthMm"),O(o,"纸张 heightMm"),{widthMm:r,heightMm:o}}function _t(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},n={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[r,o]of Object.entries(n))O(o,r,!0);return n}function Ht(e,t){const n=e.dataset===void 0?"detail":e.dataset;if(typeof n!="string"||!n.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const r=e.titleHeightMm===void 0?10:e.titleHeightMm,o=e.titleGapMm===void 0?4:e.titleGapMm;O(r,"titleHeightMm"),O(o,"titleGapMm",!0);const i=e.title!==void 0&&e.title.length>0,a=i?r+o:0;if(a>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:i,titleSpaceMm:a}}function Bt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};X(t.align,"listOptions.align",!0),X(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&O(r,`listOptions.${n}`,n==="paddingMm")}return t}function Dt(e){let t=0,n=0;for(const[r,o]of e.entries()){if(!o||typeof o.header!="string"||typeof o.field!="string"||!o.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);X(o.align,`columns[${r}].align`,!0),X(o.headerAlign,`columns[${r}].headerAlign`,!1),o.flex!==void 0&&O(o.flex,`columns[${r}].flex`),o.widthMm!==void 0?(O(o.widthMm,`columns[${r}].widthMm`),t+=o.widthMm):n=Math.max(n,o.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function zt(e,t,n,r){const{fixedWidthMm:o,maxFlex:i}=Dt(e.columns);if(t==="page"&&o>r)throw new Error(`固定列宽 ${o}mm 超出页面可用宽度 ${r}mm`);const a=r-o;if(t==="page"&&i>0&&a<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const s=i>0?e.columns.reduce((d,c)=>d+(c.widthMm===void 0?(c.flex??1)/i:0),0):0;return{columns:e.columns.map(({widthMm:d,flex:c,...m},p)=>{const g=d??(t==="wide"?n*(c??1):a*((c??1)/i)/s);return O(g,`columns[${p}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:o,maxFlex:i}}function jt(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:n}=Ot(e),r=Ft(e);let o=r.widthMm;const i=r.heightMm,a=_t(e);let s=o-a.marginLeftMm-a.marginRightMm;const l=i-a.marginTopMm-a.marginBottomMm;if(t==="page"&&s<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:d,titleHeightMm:c,hasTitle:m,titleSpaceMm:p}=Ht(e,l),g=Bt(e),{columns:f,fixedWidthMm:h,maxFlex:y}=zt(e,t,n,s);t==="wide"&&(s=f.reduce((w,k)=>w+k.widthMm,0),O(s,"宽表总列宽"),o=s+a.marginLeftMm+a.marginRightMm,O(o,"宽表总宽度"));const M={widthMm:o,heightMm:i,...a,components:[],...t==="wide"?{layout:t}:{}};return m&&M.components.push({kind:"text",text:e.title,leftMm:a.marginLeftMm,topMm:a.marginTopMm,widthMm:s,heightMm:c,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),M.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:d,columns:f,leftMm:a.marginLeftMm,topMm:a.marginTopMm+p,widthMm:t==="wide"||y>0?s:h}),e.params===void 0?{pages:[M]}:{params:e.params,pages:[M]}}const he="1.0";class W extends Error{constructor(t){super(`模板校验失败:${t.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ")}`),this.errors=t,this.name="ReportTemplateError"}}const Wt=new Set(["__proto__","prototype","constructor"]),Vt=new Set(["schemaVersion","id","name","revision","description","template"]),Gt=new Set(["left","center","right","justify"]),oe=2e5,Jt=64,ge=1e7;function T(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Ut(e,t,n){const r=Object.getPrototypeOf(e),o=Array.isArray(e);if(o?r!==Array.prototype:r!==Object.prototype&&r!==null)return n.push({path:t,message:"模板对象必须使用普通 JSON 对象原型"}),!1;if(o){const i=Object.keys(e);if(i.length!==e.length||i.some(a=>!/^(0|[1-9]\d*)$/.test(a)||Number(a)>=e.length))return n.push({path:t,message:"模板数组不能包含空位或额外属性"}),!1}return Object.getOwnPropertySymbols(e).length>0?(n.push({path:t,message:"模板不能包含 Symbol 键"}),!1):!0}function Kt(e,t,n,r){return Wt.has(e)?(r.push({path:n,message:"模板不能包含可能污染原型的键"}),!1):t.get||t.set||!t.enumerable?(r.push({path:n,message:"模板不能包含访问器或不可枚举字段"}),!1):!0}function qt(e){return e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)}function pe(e,t){const n=new Set;let r=0,o=0,i=!1;const a=(s,l,d)=>{if(!i){if(++r>oe){r===oe+1&&t.push({path:l,message:"模板超过 JSON 节点安全上限"});return}if(d>Jt){t.push({path:l,message:"模板嵌套层级过深"});return}if(typeof s=="string"){o+=s.length,o>ge&&(i=!0,t.push({path:l,message:"模板文本超过 1000 万字符的安全上限"}));return}if(!qt(s)){if(!s||typeof s!="object"){t.push({path:l,message:"模板只允许 JSON 值,不允许函数、undefined 或非有限数字"});return}if(n.has(s)){t.push({path:l,message:"模板不能包含循环引用"});return}if(Ut(s,l,t)){n.add(s);for(const[c,m]of Object.entries(Object.getOwnPropertyDescriptors(s))){if(Array.isArray(s)&&c==="length")continue;const p=`${l}.${c}`;if(Kt(c,m,p,t)&&a(m.value,p,d+1),r>oe||i)break}n.delete(s)}}}};a(e,"$",0)}function x(e,t,n,r,o=!1){const i=e[t];i===void 0&&!o||(typeof i!="string"||o&&!i.trim())&&r.push({path:`${n}.${t}`,message:o?"应为非空字符串":"应为字符串"})}function C(e,t,n,r,o=0,i=!1){const a=e[t];a===void 0&&!i||(typeof a!="number"||!Number.isFinite(a)||a<o)&&r.push({path:`${n}.${t}`,message:`应为大于等于 ${o} 的有限数字`})}function U(e,t,n,r){e[t]!==void 0&&typeof e[t]!="boolean"&&r.push({path:`${n}.${t}`,message:"应为布尔值"})}function J(e,t,n,r=!1){e!==void 0&&!Gt.has(e)&&!(r&&e==="auto")&&n.push({path:t,message:`未知对齐方式${r?"(支持 auto)":""}`})}function B(e,t,n){if(e!==void 0){if(!T(e)){n.push({path:t,message:"样式应为对象"});return}J(e.align,`${t}.align`,n),e.verticalAlign!==void 0&&!["top","middle","bottom"].includes(e.verticalAlign)&&n.push({path:`${t}.verticalAlign`,message:"未知垂直对齐方式"});for(const r of["fontSize","fontSizePx","lineWidthPt","lineHeight"])C(e,r,t,n);for(const r of["letterSpacing","rotateDeg"])C(e,r,t,n,-1/0);C(e,"opacity",t,n),typeof e.opacity=="number"&&e.opacity>1&&n.push({path:`${t}.opacity`,message:"透明度不能大于 1"});for(const r of["bold","italic","underline","borderTop","borderRight","borderBottom","borderLeft"])U(e,r,t,n);for(const r of["fontFamily","color","backgroundColor","lineColor","borderColor"])x(e,r,t,n)}}function Yt(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){n.push({path:t,message:"参数定义应为数组"});return}const r=new Set;e.forEach((o,i)=>{const a=`${t}.${i}`;if(!T(o)){n.push({path:a,message:"参数定义应为对象"});return}x(o,"field",a,n,!0),typeof o.field=="string"&&(r.has(o.field)&&n.push({path:`${a}.field`,message:"参数名重复"}),r.add(o.field)),o.type!==void 0&&!["text","number","date","select"].includes(o.type)&&n.push({path:`${a}.type`,message:"未知参数类型"});for(const s of["label","defaultValue","placeholder"])x(o,s,a,n);U(o,"required",a,n),o.options!==void 0&&(Array.isArray(o.options)?o.options.forEach((s,l)=>{const d=`${a}.options.${l}`;if(!T(s))n.push({path:d,message:"选项应为对象"});else for(const c of["label","value"])typeof s[c]!="string"&&n.push({path:`${d}.${c}`,message:"选项标签与值应为字符串(允许空白选项)"})}):n.push({path:`${a}.options`,message:"选项应为数组"}))})}function Xt(e,t,n){if(!Array.isArray(e)||e.length===0){n.push({path:t,message:"列表至少需要一列"});return}e.forEach((r,o)=>{const i=`${t}.${o}`;if(!T(r)){n.push({path:i,message:"列应为对象"});return}if(Ee(r,i,n),typeof r.header!="string"&&n.push({path:`${i}.header`,message:"表头应为字符串(允许空白表头)"}),x(r,"field",i,n,!0),C(r,"widthMm",i,n,Number.MIN_VALUE,!0),B(r.style,`${i}.style`,n),B(r.headerStyle,`${i}.headerStyle`,n),J(r.align,`${i}.align`,n,!0),J(r.headerAlign,`${i}.headerAlign`,n),r.format!==void 0)if(!T(r.format)||!["number","percent","date"].includes(r.format.kind))n.push({path:`${i}.format`,message:"未知列格式"});else{const a=r.format.digits;a!==void 0&&(typeof a!="number"||!Number.isInteger(a)||a<0||a>100)&&n.push({path:`${i}.format.digits`,message:"小数位应为 0–100 的整数"}),U(r.format,"thousands",`${i}.format`,n),x(r.format,"pattern",`${i}.format`,n)}r.rules!==void 0&&(Array.isArray(r.rules)?r.rules.forEach((a,s)=>{const l=`${i}.rules.${s}`;if(!T(a)||!T(a.when)){n.push({path:l,message:"条件格式缺少 when 对象"});return}x(a.when,"field",`${l}.when`,n,!0),[">",">=","<","<=","==","!="].includes(a.when.op)||n.push({path:`${l}.when.op`,message:"未知条件运算符"}),typeof a.when.value!="number"&&typeof a.when.value!="string"&&n.push({path:`${l}.when.value`,message:"条件值应为数字或字符串"}),B(a.style,`${l}.style`,n)}):n.push({path:`${i}.rules`,message:"条件格式应为数组"}))})}function Zt(e,t,n){if(e!==void 0){if(!T(e)){n.push({path:t,message:"分组应为对象"});return}x(e,"field",t,n,!0);for(const r of["headerTemplate","subtotalLabel"])x(e,r,t,n);for(const r of["headerStyle","subtotalStyle"])B(e[r],`${t}.${r}`,n);U(e,"keepWithNext",t,n),e.subtotal!==void 0&&(!Array.isArray(e.subtotal)||e.subtotal.some(r=>typeof r!="string"))&&n.push({path:`${t}.subtotal`,message:"小计字段应为字符串数组"})}}function Qt(e,t,n){if(!(e===void 0||typeof e=="boolean")){if(!T(e)){n.push({path:t,message:"合计应为布尔值或对象"});return}x(e,"label",t,n),B(e.style,`${t}.style`,n),e.fields!==void 0&&(!Array.isArray(e.fields)||e.fields.some(r=>typeof r!="string"))&&n.push({path:`${t}.fields`,message:"合计字段应为字符串数组"})}}function en(e,t,n){for(const r of["leftMm","topMm"])C(e,r,t,n,-1/0,!0);C(e,"widthMm",t,n,Number.MIN_VALUE,!0),x(e,"dataset",t,n,!0),x(e,"title",t,n),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&n.push({path:`${t}.layout`,message:"布局应为 page 或 wide"}),Xt(e.columns,`${t}.columns`,n);for(const r of["fontSizePt","rowHeightMm"])C(e,r,t,n,Number.MIN_VALUE);C(e,"paddingMm",t,n);for(const r of["headerBold","headerEveryPage","border"])U(e,r,t,n);x(e,"headerBackgroundColor",t,n),J(e.align,`${t}.align`,n,!0),J(e.headerAlign,`${t}.headerAlign`,n),B(e.headerStyle,`${t}.headerStyle`,n),Zt(e.groupBy,`${t}.groupBy`,n),Qt(e.grandTotal,`${t}.grandTotal`,n)}function je(e,t,n){B(e.style,`${t}.style`,n);for(const o of["text","rawText","imageData","fallbackText","nid","rkey"])x(e,o,t,n);if(e.lines!==void 0&&(!Array.isArray(e.lines)||e.lines.some(o=>typeof o!="string"))&&n.push({path:`${t}.lines`,message:"文本行应为字符串数组"}),Array.isArray(e.richParagraphs)&&e.richParagraphs.forEach((o,i)=>{if(!T(o))return;const a=`${t}.richParagraphs.${i}`;J(o.align,`${a}.align`,n);for(const s of["lineHeight","spaceBeforeMm","spaceAfterMm","indentMm"])C(o,s,a,n);Array.isArray(o.segments)&&o.segments.forEach((s,l)=>{const d=`${a}.segments.${l}`;if(!T(s)){n.push({path:d,message:"富文本片段应为对象"});return}s.kind!==void 0&&s.kind!=="text"&&s.kind!=="field"&&n.push({path:`${d}.kind`,message:"未知富文本片段类型"});for(const c of["text","field"])x(s,c,d,n);B(s.style,`${d}.style`,n)})}),!T(e.grid))return;const r=e.grid;C(r,"gapMm",`${t}.grid`,n),C(r,"paddingMm",`${t}.grid`,n);for(const o of["colWidthsMm","rowHeightsMm"]){const i=r[o];i!==void 0&&(!Array.isArray(i)||i.some(a=>typeof a!="number"||!Number.isFinite(a)||a<0))&&n.push({path:`${t}.grid.${o}`,message:"网格尺寸应为有限非负数字数组"})}Array.isArray(r.cells)&&r.cells.forEach((o,i)=>{Array.isArray(o)&&o.forEach((a,s)=>{const l=`${t}.grid.cells.${i}.${s}`;if(a!==null){if(!T(a)){n.push({path:l,message:"网格单元格应为对象或 null"});return}for(const d of["text","rawText","numberFormat"])x(a,d,l,n);for(const d of["colSpan","rowSpan"]){const c=a[d];c!==void 0&&(typeof c!="number"||!Number.isInteger(c)||c<=0)&&n.push({path:`${l}.${d}`,message:"跨度应为正整数"})}a.value!==void 0&&a.value!==null&&!["string","number","boolean"].includes(typeof a.value)&&n.push({path:`${l}.value`,message:"Excel 原始值应为字符串、数字、布尔值或 null"}),B(a.style,`${l}.style`,n),a.children!==void 0&&(Array.isArray(a.children)?a.children.forEach((d,c)=>{T(d)&&je(d,`${l}.children.${c}`,n)}):n.push({path:`${l}.children`,message:"嵌套组件应为数组"}))}})})}function ye(e){const t=[],n=[];return pe(e,t),t.length?{ok:!1,errors:t,warnings:n}:(T(e)?(e.schemaVersion!==void 0&&e.schemaVersion!==$.RENDER_PLAN_SCHEMA_VERSION&&t.push({path:"$.schemaVersion",message:"不支持的模板 schemaVersion"}),Yt(e.params,"$.params",t),!Array.isArray(e.pages)||e.pages.length===0?t.push({path:"$.pages",message:"模板至少需要一页"}):e.pages.forEach((r,o)=>{const i=`$.pages.${o}`;if(!T(r)){t.push({path:i,message:"页应为对象"});return}C(r,"widthMm",i,t,Number.MIN_VALUE,!0),C(r,"heightMm",i,t,Number.MIN_VALUE,!0),r.layout!==void 0&&r.layout!=="page"&&r.layout!=="wide"&&t.push({path:`${i}.layout`,message:"布局应为 page 或 wide"}),typeof r.heightMm=="number"&&r.heightMm>=5e3&&t.push({path:`${i}.heightMm`,message:"页高应小于 5000mm"});for(const a of["marginTopMm","marginBottomMm","marginLeftMm","marginRightMm"])C(r,a,i,t);typeof r.widthMm=="number"&&Number(r.marginLeftMm??0)+Number(r.marginRightMm??0)>=r.widthMm&&t.push({path:i,message:"横向页边距占满页面"}),typeof r.heightMm=="number"&&Number(r.marginTopMm??0)+Number(r.marginBottomMm??0)>=r.heightMm&&t.push({path:i,message:"纵向页边距占满页面"}),Array.isArray(r.components)?r.components.forEach((a,s)=>{const l=`${i}.components.${s}`;T(a)&&a.kind==="list"?en(a,l,t):(Q(a,l,t,n),T(a)&&je(a,l,t))}):t.push({path:`${i}.components`,message:"组件应为数组"})})):t.push({path:"$",message:"模板应为对象"}),{ok:t.length===0,errors:t,warnings:n})}function We(e){const t=[],n=[];if(pe(e,t),t.length)return{ok:!1,errors:t,warnings:n};if(!T(e))t.push({path:"$",message:"模板文档应为对象"});else{for(const o of Object.keys(e))Vt.has(o)||t.push({path:`$.${o}`,message:"模板文档存在未知字段;只保存模板与描述,不保存取数或业务数据"});e.schemaVersion!==he&&t.push({path:"$.schemaVersion",message:"不支持的模板文档版本"});for(const o of["id","name"])x(e,o,"$",t,!0);for(const o of["revision","description"])x(e,o,"$",t);const r=ye(e.template);t.push(...r.errors.map(o=>({...o,path:`$.template${o.path.slice(1)}`}))),n.push(...r.warnings.map(o=>({...o,path:`$.template${o.path.slice(1)}`})))}return{ok:t.length===0,errors:t,warnings:n}}function ee(e){const t=We(e);if(!t.ok)throw new W(t.errors)}function tn(e){const t=[];if(pe(e,t),t.length)throw new W(t);const n={...e,schemaVersion:e.schemaVersion??he};return ee(n),Z(n)}function nn(e){let t=e;if(typeof e=="string"){if(e.length>ge)throw new W([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);try{t=JSON.parse(e)}catch{throw new W([{path:"$",message:"模板 JSON 语法无效"}])}}return ee(t),Z(t)}function rn(e){ee(e);const t=JSON.stringify(e,null,2);if(t.length>ge)throw new W([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);return t}function Z(e){return JSON.parse(JSON.stringify(e))}function on(e=[]){const t=new Map,n={get:r=>{const o=t.get(r);return o?Z(o):void 0},list:()=>Array.from(t.values(),({template:r,...o})=>({...o})),register:(r,o={})=>{if(ee(r),t.has(r.id)&&!o.replace)throw new W([{path:"$.id",message:`模板 ID ${r.id} 已注册;更新需显式 replace:true`}]);t.set(r.id,Z(r))},remove:r=>t.delete(r)};for(const r of e)n.register(r);return n}function an(e){if(!("mapData"in e))return e;const{load:t,mapData:n,...r}=e;return{...r,load:async o=>{const i=await t(o);H(o.signal);try{return n(i,o)}catch(a){throw new R("validate",`报表 ${o.reportId} 数据映射失败`,a)}}}}class R extends Error{constructor(t,n,r){super(n),this.name="ReportSourceError",this.code=t,this.cause=r}}function te(e){const t=new Error("报表加载已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e.reason}),t}function H(e){if(e?.aborted)throw te(e)}function Ve(e,t){return t?new Promise((n,r)=>{const o=()=>t.removeEventListener("abort",i),i=()=>{o(),r(te(t))};t.addEventListener("abort",i,{once:!0}),t.aborted&&i(),Promise.resolve(e).then(a=>{o(),n(a)},a=>{o(),r(a)})}):Promise.resolve(e)}function sn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new R("validate",`报表 ${t} 的数据集应为对象`);for(const[n,r]of Object.entries(e))if(!Array.isArray(r)||r.some(o=>!o||typeof o!="object"||Array.isArray(o)))throw new R("validate",`报表 ${t} 的数据集 ${n} 应为对象数组`)}async function ln(e,t,n){const{reportId:r,signal:o}=t;try{const i=await Ve(e(t),o);H(o);const a=ye(i);if(!a.ok)throw new R("validate",`报表 ${r} 模板校验失败:${a.errors.slice(0,3).map(s=>`${s.path}: ${s.message}`).join("; ")}`);return n.push(...a.warnings.map(s=>`${r}: ${s.path}: ${s.message}`)),i}catch(i){throw o?.aborted?te(o):i instanceof R?i:i instanceof W?new R("validate",`报表 ${r} 模板校验失败:${i.message}`,i):new R("fetch",`报表 ${r} 模板加载失败:${i instanceof Error?i.message:String(i)}`,i)}}async function dn(e,t,n,r){let o;try{o=await Ve(e.load?e.load(t):e.datasets??{},r)}catch(i){throw r?.aborted?te(r):i instanceof R?i:new R("fetch",`报表 ${n} 取数失败:${i instanceof Error?i.message:String(i)}`,i)}return H(r),sn(o,n),o}function cn(e,t,n,r){try{return Ne(e,t,n.pagination)}catch(o){throw new R("validate",`报表 ${r} 排版失败:${o instanceof Error?o.message:String(o)}`,o)}}function mn(e,t,n,r){const o=new Map,i=a=>{let s=o.get(a);return s===void 0&&(s=JSON.stringify([n,r,a]),o.set(a,s)),s};for(const a of t.pages)e.push({...a,components:a.components.map(s=>s.table?{...s,table:{...s.table,id:i(s.table.id)}}:s)})}function fn(e,t={}){function n(o){const i=Object.prototype.hasOwnProperty.call(e,o)?e[o]:void 0;if(!i)throw new R("config",`未注册报表 ${o}`);return i}return Object.assign(async({reportIds:o,params:i,signal:a,onWarning:s})=>{H(a);const l=[...o],d={...i};if(l.length===0)throw new R("config","缺少报表 ID");const c=l.map(n),m=[],p=[];for(const[y,M]of c.entries()){H(a);const w=l[y],k={reportId:w,params:{...d},signal:a},v=typeof M.template=="function"?await ln(M.template,k,p):M.template,D=await dn(M,k,w,a);H(a);const V=cn(v,D,M,w);mn(m,V.plan,y,w),p.push(...V.warnings.map(z=>`${w}: ${z}`))}H(a);const g={schemaVersion:$.RENDER_PLAN_SCHEMA_VERSION,pages:m},f=de(g);if(!f.ok)throw new R("validate",`渲染计划校验失败:${f.errors.slice(0,3).map(y=>`${y.path}: ${y.message}`).join("; ")}`);p.push(...f.warnings.map(y=>`${y.path}: ${y.message}`));const h=s??t.onWarning??(y=>console.warn("[mach-report]",y));for(const y of p)H(a),h(y);return H(a),g},{getParamDefs:o=>qe.getReportParamDefs(e,o)})}function un(e){return[e.pageIndex,e.componentIndex,e.rowIndex,e.columnIndex].every(t=>Number.isInteger(t)&&t>=0)}function Ge(e,t,n){const r=e.grid;if(!r)return null;const o=r.cells[t];if(!o)return null;const a=u.resolveGridLayout(r,e.widthMm,e.heightMm).cells.filter(l=>l.ri===t).findIndex(l=>l.ci===n),s=o[a];return s?{cell:s,sourceColumnIndex:a}:null}function hn(e){return e.value!==void 0?e.value:e.rawText??e.text??null}function gn(e,t){return e.valueType?e.valueType:typeof t=="number"?"number":typeof t=="boolean"?"boolean":t===null&&e.numberFormat&&/[0#?]/.test(e.numberFormat)?"number":"text"}function pn(e,t){if(e.editable===!1)return"cell";if(e.formula!==void 0)return"formula";if(e.children?.length)return"complex";if(t.table&&t.table.role!=="body"&&e.editable!==!0)return"structure"}function yn(e,t){const n=e.table;if(n)return{id:n.id,rowIndex:n.rowIndex+t.rowIndex,role:n.role,columnKey:n.columnKeys[t.columnIndex]}}function ne(e,t){if(!un(t))return null;const n=e.pages[t.pageIndex]?.components[t.componentIndex];if(!n)return null;const r=Ge(n,t.rowIndex,t.columnIndex);if(!r)return null;const{cell:o}=r,i=hn(o),a=pn(o,n);return{address:{...t},cell:o,component:n,value:i,valueType:gn(o,i),table:yn(n,t),editable:a===void 0,readOnlyReason:a}}class _ extends Error{constructor(t){super(`Invalid report cell edit: ${t}`),this.code=t,this.name="ReportCellEditError"}}function bn(e,t){let n=e.trim();const r=t&&n.endsWith("%");if(r&&(n=n.slice(0,-1).trim()),/^[+-]?\d{1,3}(?:,\d{3})+(?:\.\d*)?(?:[eE][+-]?\d+)?$/.test(n)&&(n=n.replace(/,/g,"")),!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(n))throw new _("number");return Number(n)/(r?100:1)}function Mn(e,t){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e!="string"&&typeof e!="number")throw new _("number");const n=typeof e=="number"?e:bn(e,Se.isExcelPercentageFormat(t.cell.numberFormat));if(!Number.isFinite(n)||Number.isInteger(n)&&!Number.isSafeInteger(n))throw new _("number");return n}function wn(e){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e=="boolean")return e;const t=String(e).trim().toLowerCase();if(["true","yes","是","1"].includes(t))return!0;if(["false","no","否","0"].includes(t))return!1;throw new _("boolean")}function be(e,t){return e.valueType==="number"?Mn(t,e):e.valueType==="boolean"?wn(t):t===null?null:String(t)}function vn(e,t){const n=t.cell.text,o=[["是","否"],["TRUE","FALSE"],["True","False"],["true","false"],["1","0"]].find(i=>i.includes(n??""));return o?o[e?0:1]:String(e)}function re(e,t){return t===null?"":typeof t=="boolean"?vn(t,e):typeof t=="number"?Se.formatExcelNumber(t,e.cell.numberFormat):String(t)}function Sn(e,t,n){const r=ne(e,t);if(!r)throw new _("missing");if(!r.editable)throw new _("readonly");const o=be(r,n);return{address:{...t},table:r.table,previousValue:r.value,previousText:r.cell.text??"",value:o,text:re(r,o)}}function $n(e,t){const n=e.table,r=t.table;return!n||!r||n.columnKey===void 0?!1:n.id===r.id&&n.rowIndex===r.rowIndex&&n.role===r.role&&n.columnKey===r.columnKey}function Je(e,t,n){const r=e.grid,{rowIndex:o,columnIndex:i}=t.address,a=Ge(e,o,i),s=[...r.cells],l=[...s[o]],d=re(t,n.value),c={...a.cell,value:n.value,text:d,rawText:d};return l[a.sourceColumnIndex]=c,s[o]=l,{...e,grid:{...r,cells:s}}}function Tn(e,t){const n=e.table?.columnKeys,r=t.table?.columnKey;return n&&r!==void 0?n.flatMap((o,i)=>o===r?[i]:[]):[]}function En(e,t,n,r,o,i){const a=t.table,s=o.table;if(!a||!s||a.id!==s.id||a.role!==s.role||!t.grid)return t;const l=s.rowIndex-a.rowIndex;if(l<0||l>=t.grid.cells.length)return t;let d=t;for(const c of Tn(t,o)){const m=ne(e,{pageIndex:n,componentIndex:r,rowIndex:l,columnIndex:c});m?.editable&&$n(o,m)&&(d=Je(d,m,i))}return d}function xn(e,t,n,r,o,i){const a=o.address;return o.table?.columnKey!==void 0?En(e,t,n,r,o,i):a.pageIndex===n&&a.componentIndex===r?Je(t,o,i):t}function Pn(e,t){const n=ne(e,t.address);if(!n)throw new _("missing");if(!n.editable)throw new _("readonly");if(!Object.is(n.value,t.previousValue)||(n.cell.text??"")!==t.previousText)throw new _("conflict");const r=be(n,t.value),o={...t,value:r,text:re(n,r)};if(Object.is(r,n.value)&&o.text===n.cell.text)return e;const i=e.pages.map((a,s)=>{const l=a.components.map((d,c)=>xn(e,d,s,c,n,o));return l.every((d,c)=>d===a.components[c])?a:{...a,components:l}});return{...e,pages:i}}exports.DEFAULT_BORDER_PT=$.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=$.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=$.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=$.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=$.LINE_HEIGHT;exports.RENDER_PLAN_SCHEMA_VERSION=$.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_MACH=$.SCHEMA_VERSION_MACH;exports.isImageBackedComponent=$.isImageBackedComponent;exports.isRichText=$.isRichText;exports.CSS_DPI=u.CSS_DPI;exports.MM_PER_INCH=u.MM_PER_INCH;exports.PAPER_SIZES=u.PAPER_SIZES;exports.mergeComponentStyles=u.mergeComponentStyles;exports.mmToPx=u.mmToPx;exports.mmToPxFactor=u.mmToPxFactor;exports.ptToPx=u.ptToPx;exports.pxToMm=u.pxToMm;exports.resolveBoxBorders=u.resolveBoxBorders;exports.resolveFontSize=u.resolveFontSize;exports.resolveGridLayout=u.resolveGridLayout;exports.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.charWidthEm=N.charWidthEm;exports.createCanvasMeasurer=N.createCanvasMeasurer;exports.createHeuristicMeasurer=N.createHeuristicMeasurer;exports.heuristicMeasurer=N.heuristicMeasurer;exports.measureTextMm=N.measureTextMm;exports.wrapText=N.wrapText;exports.PageBuilder=ze;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=he;exports.ReportCellEditError=_;exports.ReportSourceError=R;exports.ReportTemplateError=W;exports.TemplateBuilder=De;exports.applyReportCellEdit=Pn;exports.assertRenderPlan=ot;exports.classOf=P;exports.computePageWindow=Oe;exports.createCanvasPager=It;exports.createReportCellEdit=Sn;exports.createReportSource=fn;exports.createTableTemplate=jt;exports.createTemplate=Lt;exports.createTemplateRegistry=on;exports.defineReport=an;exports.defineReportTemplate=tn;exports.evalStyleRule=Te;exports.formatReportCellEdit=re;exports.formatValue=le;exports.getReportCellContext=ne;exports.measurePageSizePx=fe;exports.paginateTemplate=Ne;exports.parseDateLocal=$e;exports.parseReportCellInput=be;exports.parseReportTemplate=nn;exports.planFontSizePx=kt;exports.renderComponent=ce;exports.renderPage=Le;exports.renderPlan=xt;exports.renderPlanToCanvas=Be;exports.renderPlanToImages=Nt;exports.resolvePaper=ue;exports.serializeReportTemplate=rn;exports.toExcelNumberFormat=se;exports.toNumber=Y;exports.validateComponent=Q;exports.validatePage=xe;exports.validateRenderPlan=de;exports.validateReportTemplate=ye;exports.validateReportTemplateDocument=We;
|
|
5
|
+
`):$.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??a,letterSpacingPt:c.letterSpacing},s).join(`
|
|
6
|
+
`);Se(e,{text:u,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:f.resolveTextColor(c),align:c.align??"left",lineHeight:f.resolveLineHeight(c),letterSpacingPx:f.ptToPx(c.letterSpacing??0,i)},n,r,o,l,c.fontFamily??a,c.verticalAlign)}function ce(e,t,n,r,o,l,i){const a=t.leftMm*n,s=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,u=t.style??{};if(y.isImageBackedComponent(t)){const m=i?.get(t.imageData);m?ot(e,m,a,s,c,d):pe(e,t,a,s,c,d);return}if(t.grid){ct(e,t.grid,t,a,s,c,d,n,r,o,l);return}switch(t.kind){case"text":{dt(e,t,a,s,c,d,r,o,l);break}case"rect":{const m=f.resolveStroke(u),h=f.resolveBoxBorders(u);u.backgroundColor&&(e.fillStyle=u.backgroundColor,e.fillRect(a,s,c,d)),h.inner&&(e.strokeStyle=m.color,e.lineWidth=f.ptToPx(m.widthPt,r),lt(e,h,a,s,c,d));break}case"line":{const m=f.resolveStroke({...u,borderColor:u.lineColor??u.borderColor});e.strokeStyle=m.color,e.lineWidth=f.ptToPx(m.widthPt,r),e.beginPath();const h=t.lineDirection==="up"?s+d:t.lineDirection==="down"?s:s+d/2,g=t.lineDirection==="up"?s:t.lineDirection==="down"?s+d:s+d/2;e.moveTo(a,h),e.lineTo(a+c,g),e.stroke();break}case"ellipse":{const m=f.resolveStroke(u);e.strokeStyle=m.color,e.lineWidth=f.ptToPx(m.widthPt,r),u.backgroundColor&&(e.fillStyle=u.backgroundColor,e.beginPath(),e.ellipse(a+c/2,s+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,s+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:pe(e,t,a,s,c,d);break}}function pe(e,t,n,r,o,l){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,o,l),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function ut(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...o}=t;if(n!=="png"&&n!=="jpeg")throw new TypeError("Image format must be png or jpeg.");if(!Number.isFinite(r)||r<0||r>1)throw new RangeError("Image quality must be between 0 and 1.");F(t.signal);const l=await j.resolvePlanAssets(e,{...t,format:"canvas"});e=l.plan;const i=[...l.diagnostics,...D.reportOutputDiagnostics(e,"canvas",t)],a=n==="jpeg"?"image/jpeg":"image/png",s=[],c=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let d=Math.max(0,t.start??0);d<=c;d++){F(t.signal);const u=await Ce(e.pages[d],d,o,i);try{s.push(await mt(u,a,r,t.signal))}finally{u.width=0,u.height=0}await H.outputCheckpoint(t,s.length,c-Math.max(0,t.start??0)+1)}return F(t.signal),{blobs:s,diagnostics:i}}function mt(e,t,n,r){return F(r),new Promise((o,l)=>{const i=()=>l(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",i,{once:!0});try{e.toBlob(a=>{r?.removeEventListener("abort",i),a?o(a):l(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(a){r?.removeEventListener("abort",i),l(a)}})}function ft(e,t={}){if(F(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*le,l=t.fontFamily??y.DEFAULT_FONT_FAMILY,i=t.measurer??$.heuristicMeasurer,a=Math.max(0,t.start??0),s=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=D.reportOutputDiagnostics(e,"canvas",t),u=ht(e,a,s);for(const m of u)D.notifyOutputDiagnostic(m,t),d.push(m);if(t.fidelity==="strict"&&u.length)throw new D.OutputFidelityError(d);for(let m=a;m<=s;m++){F(t.signal);const h=e.pages[m],{canvas:g,ctx:p}=Ee(h,n,r,t.maxCanvasPixels);for(const b of h.components)ce(p,b,o,r,l,i);c.push(g)}return{canvases:c,diagnostics:d}}function ht(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,o)=>r.components.flatMap((l,i)=>y.isImageBackedComponent(l)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+o,componentIndex:i,kind:l.kind,nid:l.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function gt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");F(t.signal);const n=await j.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...D.reportOutputDiagnostics(e,"canvas",t)],o=[],l=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let i=Math.max(0,t.start??0);i<=l;i++)o.push(await Ce(e.pages[i],i,t,r));return{canvases:o,diagnostics:r}}async function Ce(e,t,n,r){const o=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),l=n.dpi??96,i=n.fontFamily??y.DEFAULT_FONT_FAMILY,a=await Pe(e,t,n,r);F(n.signal);const{canvas:s,ctx:c}=Ee(e,o,l,n.maxCanvasPixels);for(const d of e.components)ce(c,d,l/25.4,l,i,n.measurer??$.heuristicMeasurer,a);return s}async function Pe(e,t,n,r){const o=n.imageLoader??tt;return rt(e,async(l,i)=>{try{return await o(l,i)}catch(a){if(i?.aborted)throw a;const s=e.components.findIndex(u=>u.imageData===l),c=e.components[s],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:s,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw r.push(d),D.notifyOutputDiagnostic(d,n),a}},n.signal)}function pt(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*le,l=t.fontFamily??y.DEFAULT_FONT_FAMILY,i=t.measurer??$.heuristicMeasurer,a=t.overscan??1,s=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(w=>w.pageHeightMm*o),u=Math.max(1,...e.pages.map(w=>w.pageWidthMm*o)),m={start:0,end:-1};let h=null,g=null,p=null,b=null,E=[],S=0,k=[],U=0,K=new AbortController;const me=[];function _e(){const w=h;w.innerHTML="",g=document.createElement("div"),g.style.cssText=`width:${u}px;margin:0 auto;`,p=document.createElement("div"),b=document.createElement("div"),g.appendChild(p),E=[];const C=Math.min(e.pages.length,3+a*2);for(let B=0;B<C;B++){const M=document.createElement("div");M.style.cssText=`margin:0 auto ${s}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,g.appendChild(M),E.push(M)}g.appendChild(b),w.appendChild(g)}async function ze(w,C){const B=U,M=await j.resolvePlanAssets(e,{...t,signal:K.signal,format:"canvas",start:C,end:C});me.push(...M.diagnostics);const R=M.plan.pages[C],J=await Pe(R,C,{...t,signal:K.signal},me);if(B!==U||!h)return;const{widthPx:ie,heightPx:ae}=Q(R,r);let _=w.firstElementChild;(!_||_.tagName!=="CANVAS")&&(_=document.createElement("canvas"),w.innerHTML="",w.appendChild(_));const he=xe(R,n,r,t.maxCanvasPixels);_.width=he.width,_.height=he.height,_.style.width=`${ie}px`,_.style.height=`${ae}px`;const W=_.getContext("2d");if(W){W.setTransform(1,0,0,1,0,0),W.scale(n,n),W.fillStyle="#ffffff",W.fillRect(0,0,ie,ae);for(const He of R.components)ce(W,He,o,r,l,i,J);_.dataset.canvasPage=String(C),w.style.height=`${ae}px`,w.style.width=`${ie}px`}}function Be(w){U++,m.start=w.start,m.end=w.end,p.style.height=`${w.start*s+d.slice(0,w.start).reduce((M,R)=>M+R,0)}px`;const C=e.pages.length-1-w.end;b.style.height=`${C*s+d.slice(w.end+1).reduce((M,R)=>M+R,0)}px`;const B=w.end-w.start+1;E.forEach((M,R)=>{if(R<B){M.style.display="";const J=w.start+R;M.style.height=`${d[J]??0}px`}else M.style.display="none"}),k=[];for(let M=w.start;M<=w.end;M++){const R=E[M-w.start];if(!R)continue;R.firstElementChild?.dataset?.canvasPage!==String(M)&&k.push(M)}oe()}function oe(){S||k.length===0||(S=requestAnimationFrame(()=>{S=0;let w=Math.max(1,c);for(;k.length>0&&w-- >0;){const C=k.shift(),B=E[C-m.start];B&&ze(B,C).catch(()=>{})}k.length>0&&oe()}))}function G(){S||(S=requestAnimationFrame(()=>{S=0;const w=h,C=Te({pageHeightsPx:d,viewportHeightPx:w.clientHeight,scrollTopPx:w.scrollTop,overscan:a,gapPx:s});C.start!==m.start||C.end!==m.end?Be(C):oe()}))}let Y=null;return{attach(w){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");F(t.signal),K=new AbortController,t.signal?.addEventListener("abort",fe,{once:!0}),D.reportOutputDiagnostics(e,"canvas",t),h=w,_e(),w.addEventListener("scroll",G,{passive:!0}),typeof ResizeObserver<"u"&&(Y=new ResizeObserver(()=>G()),Y.observe(w)),G()},destroy(){U++,K.abort(),t.signal?.removeEventListener("abort",fe),S&&cancelAnimationFrame(S),S=0,Y?.disconnect(),Y=null,h?.removeEventListener("scroll",G),k=[],g?.remove(),h=null},window(){return{...m}}};function fe(){K.abort(t.signal?.reason)}}function de(e,t,n){let r,o;if(typeof e=="string"){const l=f.PAPER_SIZES[e];if(!l)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(f.PAPER_SIZES).join("/")})`);r=l.widthMm,o=l.heightMm}else typeof e=="number"?(r=e,o=t??297):(r=e.widthMm,o=e.heightMm);return n?{widthMm:o,heightMm:r}:{widthMm:r,heightMm:o}}class Re{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const l=r!=null&&!("margins"in r)&&!("landscape"in r)&&("marginTopMm"in r||"marginBottomMm"in r||"marginLeftMm"in r||"marginRightMm"in r)?{margins:r}:typeof n=="number"?r??{}:n,{widthMm:i,heightMm:a}=de(t,typeof n=="number"?n:void 0,l.landscape),s=l.margins??{};return this.pending=new Ie(this,{widthMm:i,heightMm:a,marginTopMm:s.marginTopMm??10,marginBottomMm:s.marginBottomMm??10,marginLeftMm:s.marginLeftMm??10,marginRightMm:s.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class Ie{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},r={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:r}),this}list(t,n,r,o={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...o}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,o={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:o}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,r,o){return this.components.push({kind:"qrcode",leftMm:r,topMm:o,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function wt(){return new Re}function vt(e,t={}){return A.validateDatasetRows([],e),e.fields.map(n=>({field:n.field,header:`${n.label??n.field}${n.unit?` (${n.unit})`:""}`,semanticRole:n.semanticRole??(n.type==="number"||n.type==="decimal"?"measure":n.type==="date"?"date":n.enum?"dimension":"text"),...t[n.field]}))}function L(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function X(e,t,n){if(e!==void 0&&!["left","center","right","justify",...n?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${n?"/auto":""}`)}function bt(e){const t=e.layout??"page";if(t!=="page"&&t!=="wide")throw new Error("layout 必须是 page 或 wide");if(t==="wide"&&(e.paper!==void 0||e.landscape!==void 0))throw new Error('宽表布局不能同时指定 paper 或 landscape;标准纸型请使用 layout: "page"');if(t!=="wide"&&e.columnWidthMm!==void 0)throw new Error('columnWidthMm 仅适用于 layout: "wide"');const n=e.columnWidthMm??30;return L(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function yt(e){const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(f.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(f.PAPER_SIZES).join("/")})`);const n=de(t,void 0,e.landscape),r=n.widthMm,o=n.heightMm;return L(r,"纸张 widthMm"),L(o,"纸张 heightMm"),{widthMm:r,heightMm:o}}function Mt(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},n={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[r,o]of Object.entries(n))L(o,r,!0);return n}function Tt(e,t){const n=e.dataset===void 0?"detail":e.dataset;if(typeof n!="string"||!n.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const r=e.titleHeightMm===void 0?10:e.titleHeightMm,o=e.titleGapMm===void 0?4:e.titleGapMm;L(r,"titleHeightMm"),L(o,"titleGapMm",!0);const l=e.title!==void 0&&e.title.length>0,i=l?r+o:0;if(i>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:l,titleSpaceMm:i}}function xt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};X(t.align,"listOptions.align",!0),X(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&L(r,`listOptions.${n}`,n==="paddingMm")}return t}function Et(e){let t=0,n=0;for(const[r,o]of e.entries()){if(!o||typeof o.header!="string"||typeof o.field!="string"||!o.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);X(o.align,`columns[${r}].align`,!0),X(o.headerAlign,`columns[${r}].headerAlign`,!1),o.flex!==void 0&&L(o.flex,`columns[${r}].flex`),o.widthMm!==void 0?(L(o.widthMm,`columns[${r}].widthMm`),t+=o.widthMm):n=Math.max(n,o.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function St(e,t,n,r){const{fixedWidthMm:o,maxFlex:l}=Et(e.columns);if(t==="page"&&o>r)throw new Error(`固定列宽 ${o}mm 超出页面可用宽度 ${r}mm`);const i=r-o;if(t==="page"&&l>0&&i<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const a=l>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/l:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...u},m)=>{const h=c??(t==="wide"?n*(d??1):i*((d??1)/l)/a);return L(h,`columns[${m}] 分配后的 widthMm`),{...u,widthMm:h}}),fixedWidthMm:o,maxFlex:l}}function Ct(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:n}=bt(e),r=yt(e);let o=r.widthMm;const l=r.heightMm,i=Mt(e);let a=o-i.marginLeftMm-i.marginRightMm;const s=l-i.marginTopMm-i.marginBottomMm;if(t==="page"&&a<=0||s<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:u,titleSpaceMm:m}=Tt(e,s),h=xt(e),{columns:g,fixedWidthMm:p,maxFlex:b}=St(e,t,n,a);t==="wide"&&(a=g.reduce((S,k)=>S+k.widthMm,0),L(a,"宽表总列宽"),o=a+i.marginLeftMm+i.marginRightMm,L(o,"宽表总宽度"));const E={widthMm:o,heightMm:l,...i,components:[],...t==="wide"?{layout:t}:{}};return u&&E.components.push({kind:"text",text:e.title,leftMm:i.marginLeftMm,topMm:i.marginTopMm,widthMm:a,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),E.components.push({align:"auto",headerAlign:"center",...h,kind:"list",...t==="wide"?{layout:t}:{},...u?{title:e.title}:{},dataset:c,columns:g,leftMm:i.marginLeftMm,topMm:i.marginTopMm+m,widthMm:t==="wide"||b>0?a:p}),e.params===void 0?{pages:[E]}:{params:e.params,pages:[E]}}function Pt(e){return e}class z extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function O(e){return JSON.parse(JSON.stringify(e))}function I(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function we(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new z("history","修订号无效或已达上限");return String(t+1)}function Rt(e,t={}){const n=async(i,a)=>{I(a);const s=await e.read(i,a);return I(a),s?O(s):void 0},r=async(i,a)=>{const s=await n(i,a.signal);if((s?.revision??null)!==a.expectedRevision)throw new z("conflict","模板已变化,请重新读取后提交");return s},o=async(i,a,s)=>{if(I(a.signal),!await e.compareAndSwap(i.id,a.expectedRevision,O(i),{signal:a.signal,...s?{publication:O(s)}:{}}))throw new z("conflict","模板已被其他请求更新");return O(i)},l=(i,a,s,c)=>{const d=we(i),u=N.parseReportTemplate({...a,revision:d}),m={revision:d,document:u,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(m.restoredFrom=c),o({id:i.id,revision:d,publishedRevision:d,published:u},s,m)};return{list:async i=>{I(i);const a=await e.list(i);return I(i),O(a)},get:async(i,a={})=>{const s=await n(i,a.signal),c=a.draft?s?.draft:s?.published;return c?N.parseReportTemplate(c):void 0},history:async(i,a)=>{I(a);const s=await e.history(i,a);return I(a),O(s)},saveDraft:async(i,a)=>{I(a.signal);const s=N.parseReportTemplate(t.migrate?await t.migrate(i):i),c=await r(s.id,a),d=we(c);return o({id:s.id,revision:d,draft:{...s,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},a)},publish:async(i,a)=>{const s=await r(i,a);if(!s)throw new z("missing","模板不存在");if(!s.draft)throw new z("draft","没有可发布的草稿");return l(s,s.draft,a)},rollback:async(i,a,s)=>{const c=await r(i,s);if(!c)throw new z("missing","模板不存在");I(s.signal);const d=await e.getVersion(i,a,s.signal);if(!d)throw new z("history","历史修订不存在");return l(c,d.document,s,a)}}}function It(){const e=new Map,t=new Map;return{read:async(n,r)=>{I(r);const o=e.get(n);return o?O(o):void 0},list:async n=>(I(n),Array.from(e.values(),({id:r,revision:o,publishedRevision:l})=>({id:r,revision:o,...l?{publishedRevision:l}:{}}))),history:async(n,r)=>(I(r),Array.from(t.get(n)?.values()??[],o=>O(o))),getVersion:async(n,r,o)=>{I(o);const l=t.get(n)?.get(r);return l?O(l):void 0},compareAndSwap:async(n,r,o,l)=>{if(I(l.signal),(e.get(n)?.revision??null)!==r)return!1;if(o.id!==n)throw new z("history","状态 ID 与存储 ID 不一致");const i=O(o),a=l.publication;if(a){const s=t.get(n)??new Map;if(s.has(a.revision)||a.revision!==o.revision||a.document.id!==n)throw new z("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");s.set(a.revision,O(a)),t.set(n,s)}return e.set(n,i),!0}}}function ke(e){return!e||typeof e!="object"?!1:[e.pageIndex,e.componentIndex,e.rowIndex,e.columnIndex].every(t=>Number.isInteger(t)&&t>=0)}function Ae(e,t,n){const r=e.grid;if(!r)return null;const o=r.cells[t];if(!o)return null;const i=H.resolveGridLayout(r,e.widthMm,e.heightMm).cells.filter(s=>s.ri===t).findIndex(s=>s.ci===n),a=o[i];return a?{cell:a,sourceColumnIndex:i}:null}function kt(e){return e.value!==void 0?e.value:e.rawText??e.text??null}function At(e,t){return e.valueType?e.valueType:typeof t=="number"?"number":typeof t=="boolean"?"boolean":t===null&&e.numberFormat&&/[0#?]/.test(e.numberFormat)?"number":"text"}function Ft(e,t){if(e.editable===!1)return"cell";if(e.formula!==void 0)return"formula";if(e.children?.length)return"complex";if(t.table&&t.table.role!=="body"&&e.editable!==!0)return"structure"}function Lt(e,t){const n=e.table;if(n)return{id:n.id,rowIndex:n.rowIndex+t.rowIndex,role:n.role,columnKey:n.columnKeys[t.columnIndex]}}function Ot(e,t,n){if(e.source)return{...e.source};const r=t.table?.source,o=t.table?.columnKeys[n.columnIndex];if(!(!r||r.rowKey===void 0||o===void 0))return{...r,rowKey:r.rowKey,field:o}}function Fe(e,t,n){const r=kt(n),o=Ft(n,e);return{address:{...t},cell:n,component:e,value:r,valueType:At(n,r),table:Lt(e,t),source:Ot(n,e,t),editable:o===void 0,readOnlyReason:o}}function ee(e,t){if(!ke(t))return null;const n=e.pages[t.pageIndex]?.components[t.componentIndex];if(!n)return null;const r=Ae(n,t.rowIndex,t.columnIndex);return r?Fe(n,t,r.cell):null}function te(e){const t=new Map;return n=>{if(!ke(n))return null;const r=e.pages[n.pageIndex]?.components[n.componentIndex];if(!r?.grid)return null;let o=t.get(r);if(!o){const i=new Map;o=new Map;for(const a of H.resolveGridLayout(r.grid,r.widthMm,r.heightMm).cells){const s=i.get(a.ri)??0;i.set(a.ri,s+1);const c=r.grid.cells[a.ri]?.[s];c&&o.set(`${a.ri}:${a.ci}`,c)}t.set(r,o)}const l=o.get(`${n.rowIndex}:${n.columnIndex}`);return l?Fe(r,n,l):null}}class T extends Error{constructor(t){super(`Invalid report cell edit: ${t}`),this.code=t,this.name="ReportCellEditError"}}function Dt(e,t){let n=e.trim();const r=t&&n.endsWith("%");if(r&&(n=n.slice(0,-1).trim()),/^[+-]?\d{1,3}(?:,\d{3})+(?:\.\d*)?(?:[eE][+-]?\d+)?$/.test(n)&&(n=n.replace(/,/g,"")),!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(n))throw new T("number");return Number(n)/(r?100:1)}function Nt(e,t){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e!="string"&&typeof e!="number")throw new T("number");const n=typeof e=="number"?e:Dt(e,be.isExcelPercentageFormat(t.cell.numberFormat));if(!Number.isFinite(n)||Number.isInteger(n)&&!Number.isSafeInteger(n))throw new T("number");return n}function $t(e){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e=="boolean")return e;const t=String(e).trim().toLowerCase();if(["true","yes","是","1"].includes(t))return!0;if(["false","no","否","0"].includes(t))return!1;throw new T("boolean")}function ne(e,t){return e.valueType==="number"?Nt(t,e):e.valueType==="boolean"?$t(t):t===null?null:String(t)}function _t(e,t){const n=t.cell.text,o=[["是","否"],["TRUE","FALSE"],["True","False"],["true","false"],["1","0"]].find(l=>l.includes(n??""));return o?o[e?0:1]:String(e)}function V(e,t){return t===null?"":typeof t=="boolean"?_t(t,e):typeof t=="number"?be.formatExcelNumber(t,e.cell.numberFormat):String(t)}function zt(e,t,n){const r=ee(e,t);if(!r)throw new T("missing");return ue(r,n)}function ue(e,t){if(!e.editable)throw new T("readonly");const n=ne(e,t);return{address:{...e.address},table:e.table,source:e.source,previousValue:e.value,previousText:e.cell.text??"",value:n,text:V(e,n)}}function Bt(e,t){const n=e.table,r=t.table;return!n||!r||n.columnKey===void 0?!1:n.id===r.id&&n.rowIndex===r.rowIndex&&n.role===r.role&&n.columnKey===r.columnKey}function Le(e,t,n){const r=e.grid,{rowIndex:o,columnIndex:l}=t.address,i=Ae(e,o,l),a=[...r.cells],s=[...a[o]],c=V(t,n.value),d={...i.cell,value:n.value,text:c,rawText:c};return s[i.sourceColumnIndex]=d,a[o]=s,{...e,grid:{...r,cells:a}}}function Ht(e,t){const n=e.table?.columnKeys,r=t.table?.columnKey;return n&&r!==void 0?n.flatMap((o,l)=>o===r?[l]:[]):[]}function jt(e,t,n,r,o,l){const i=t.table,a=o.table;if(!i||!a||i.id!==a.id||i.role!==a.role||!t.grid)return t;const s=a.rowIndex-i.rowIndex;if(s<0||s>=t.grid.cells.length)return t;let c=t;for(const d of Ht(t,o)){const u=ee(e,{pageIndex:n,componentIndex:r,rowIndex:s,columnIndex:d});u?.editable&&Bt(o,u)&&(c=Le(c,u,l))}return c}function Wt(e,t,n,r,o,l){const i=o.address;return o.table?.columnKey!==void 0?jt(e,t,n,r,o,l):i.pageIndex===n&&i.componentIndex===r?Le(t,o,l):t}function Oe(e,t){const n=t.source;if(!n)return!1;const r=e.source;return!r||["datasetId","rowKey","field","revision","sourceToken"].some(o=>!Object.is(r[o],n[o]))}function qt(e,t){const n=ee(e,t.address);if(!n)throw new T("missing");if(!n.editable)throw new T("readonly");if(Oe(n,t))throw new T("conflict");if(!Object.is(n.value,t.previousValue)||(n.cell.text??"")!==t.previousText)throw new T("conflict");const r=ne(n,t.value),o={...t,value:r,text:V(n,r)};if(Object.is(r,n.value)&&o.text===n.cell.text)return e;const l=e.pages.map((i,a)=>{const s=i.components.map((c,d)=>Wt(e,c,a,d,n,o));return s.every((c,d)=>c===i.components[d])?i:{...i,components:s}});return{...e,pages:l}}function Kt(e){return JSON.stringify([e.pageIndex,e.componentIndex,e.rowIndex,e.columnIndex])}function ve(e){const t=e.table;return t?.columnKey!==void 0?JSON.stringify([t.id,t.role,t.rowIndex,t.columnKey]):Kt(e.address)}function Vt(e,t){if(!t.length)return e;const n=new Map(t.map(s=>[ve(s),s])),r=new Set(t.flatMap(s=>s.table?[s.table.id]:[])),o=new Set(t.map(s=>`${s.address.pageIndex}:${s.address.componentIndex}`)),l=te(e);function i(s,c,d){const u=s.grid;if(!u||!o.has(`${c}:${d}`)&&!r.has(s.table?.id??""))return s;const m=new Map,h=new Map;for(const g of H.resolveGridLayout(u,s.widthMm,s.heightMm).cells){const p=h.get(g.ri)??0;h.set(g.ri,p+1);const b=l({pageIndex:c,componentIndex:d,rowIndex:g.ri,columnIndex:g.ci}),E=b&&n.get(ve(b));if(!E||!b.editable)continue;const S=m.get(g.ri)??[...u.cells[g.ri]],k=V(b,E.value);Object.is(b.value,E.value)&&k===b.cell.text||(S[p]={...g.cell,value:E.value,text:k,rawText:k},m.set(g.ri,S))}return m.size?{...s,grid:{...u,cells:u.cells.map((g,p)=>m.get(p)??g)}}:s}const a=e.pages.map((s,c)=>{const d=s.components.map((u,m)=>i(u,c,m));return d.every((u,m)=>u===s.components[m])?s:{...s,components:d}});return a.every((s,c)=>s===e.pages[c])?e:{...e,pages:a}}function re(e){const t=e.source;if(t)return JSON.stringify([t.datasetId,t.rowKey,t.field]);const n=e.table;if(n?.columnKey!==void 0)return JSON.stringify([n.id,n.role,n.rowIndex,n.columnKey]);const r=e.address;return JSON.stringify([r.pageIndex,r.componentIndex,r.rowIndex,r.columnIndex])}function Ut(e,t,n){if(typeof n!="string"||!n.trim()||!Array.isArray(t))throw new T("missing");if(t.length>1e4)throw new T("limit");const r=new Set,o=te(e),l=t.map(({address:i,value:a})=>{const s=o(i);if(!s)throw new T("missing");const c=ue(s,a),d=re(c);if(r.has(d))throw new T("duplicate");return r.add(d),c});return{requestId:n,edits:l}}function Gt(e,t){if(t.edits.length>1e4)throw new T("limit");const n=te(e),r=new Set,o=t.edits.map(l=>{const i=n(l.address);if(!i)throw new T("missing");const a=re(l);if(r.has(a))throw new T("duplicate");if(r.add(a),Oe(i,l)||!Object.is(i.value,l.previousValue)||(i.cell.text??"")!==l.previousText)throw new T("conflict");return ue(i,l.value)});return Vt(e,o)}function Yt(e){const t=new Map;for(const n of e){const r=re(n),o=t.get(r),l=o?{...n,previousValue:o.previousValue,previousText:o.previousText}:{...n};Object.is(l.previousValue,l.value)?t.delete(r):t.set(r,l)}return[...t.values()]}function Jt(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
7
|
+
`)}function Xt(e,t){const n=e[e.length-1];e.length>1&&n?.length===1&&n[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Zt(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const n=[[]];let r="",o=!1,l=!1,i=0;function a(){if(++i>t)throw new Error("Clipboard cell limit exceeded");n[n.length-1].push(r),r="",l=!1}for(let s=0;s<e.length;s++){const c=e[s];if(o){if(c!=='"'){r+=c;continue}if(e[s+1]==='"'){r+='"',s++;continue}o=!1,l=!0;continue}if(c==='"'&&!r&&!l){o=!0;continue}if(c===" "){a();continue}if(c==="\r"||c===`
|
|
8
|
+
`){a(),n.push([]),c==="\r"&&e[s+1]===`
|
|
9
|
+
`&&s++;continue}if(l)throw new Error("Invalid quoted clipboard value");r+=c}if(o)throw new Error("Unclosed clipboard quote");return a(),Xt(n,e),n}function Qt(e,t,n){if(!n||n.revision===void 0&&n.sourceToken===void 0)return e;const r=new Set(t.edits.flatMap(i=>i.source?[i.source.datasetId]:[]));if(!r.size)return e;function o(i){return!i.datasetId||!r.has(i.datasetId)||(n.revision===void 0||Object.is(n.revision,i.revision))&&(n.sourceToken===void 0||n.sourceToken===i.sourceToken)?i:{...i,...n.revision!==void 0?{revision:n.revision}:{},...n.sourceToken!==void 0?{sourceToken:n.sourceToken}:{}}}const l=e.pages.map(i=>{const a=i.components.map(s=>{const c=s.table?.source?o(s.table.source):void 0,d=s.table&&c!==s.table.source?{...s.table,source:c}:s.table,u=s.grid?.cells.map(h=>{const g=h.map(p=>{if(!p?.source)return p;const b=o(p.source);return b===p.source?p:{...p,source:b}});return g.some((p,b)=>p!==h[b])?g:h}),m=s.grid&&u?.some((h,g)=>h!==s.grid.cells[g])?{...s.grid,cells:u}:s.grid;return d!==s.table||m!==s.grid?{...s,table:d,grid:m}:s});return a.some((s,c)=>s!==i.components[c])?{...i,components:a}:i});return l.some((i,a)=>i!==e.pages[a])?{...e,pages:l}:e}class De extends Error{constructor(t,n,r){const o=typeof n.label=="string"?n.label:"单元格",l={definition:`${o}的编辑器配置无效`,type:`${o}的编辑器与数据类型不一致`,required:`${o}不能为空`,min:`${o}不能小于 ${r}`,max:`${o}不能大于 ${r}`,precision:`${o}最多保留 ${r} 位小数`,length:`${o}最多允许 ${r} 个字符`,choice:`${o}请选择有效选项`,date:`${o}请输入有效日期(YYYY-MM-DD)`};super(l[t]),this.code=t,this.field=n,this.expected=r,this.name="ReportCellFieldError"}}function v(e,t,n){throw new De(t,e,n)}function Ne(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e)||e.startsWith("0000-"))return!1;const t=new Date(`${e}T00:00:00.000Z`);return Number.isFinite(t.getTime())&&t.toISOString().slice(0,10)===e}function en(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function tn(e,t){e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max),e.precision!==void 0&&en(t)>e.precision&&v(e,"precision",e.precision)}function nn(e,t){Ne(t)||v(e,"date"),e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max)}function rn(e){[e.min,e.max].some(t=>t!==void 0&&!Number.isFinite(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition"),e.precision!==void 0&&(!Number.isInteger(e.precision)||e.precision<0||e.precision>15)&&v(e,"definition")}function on(e){[e.min,e.max].some(t=>t!==void 0&&!Ne(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function an(e,t){(!Array.isArray(t.options)||!t.options.length)&&v(t,"definition");const n=e.valueType==="text"?"string":e.valueType,r=new Set;for(const o of t.options)(!o||typeof o.value!==n||typeof o.value=="number"&&!Number.isFinite(o.value))&&v(t,"definition"),o.label!==void 0&&typeof o.label!="string"&&v(t,"definition"),r.has(o.value)&&v(t,"definition"),r.add(o.value)}function sn(e){e.required!==void 0&&typeof e.required!="boolean"&&v(e,"definition"),[e.label,e.hint,e.unit].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition"),e.type==="boolean"&&[e.trueLabel,e.falseLabel].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition")}function $e(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),sn(t),(t.type==="number"||t.type==="boolean")&&e.valueType!==t.type&&v(t,"type"),(t.type==="text"||t.type==="date")&&e.valueType!=="text"&&v(t,"type"),t.type==="number"&&rn(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&on(t),t.type==="enum"&&an(e,t)}function ln(e,t,n){if(!e.editable)throw new T("readonly");n&&$e(e,n);const r=ne(e,t);return n?(n.required&&typeof r=="string"&&!r.trim()&&v(n,"required"),r===null||r===""?(n.required&&v(n,"required"),r):(n.type==="number"&&tn(n,r),n.type==="date"&&nn(n,r),n.type==="text"&&n.maxLength!==void 0&&[...String(r)].length>n.maxLength&&v(n,"length",n.maxLength),n.type==="enum"&&!n.options.some(o=>Object.is(o.value,r))&&v(n,"choice"),r)):r}exports.DEFAULT_BORDER_PT=y.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=y.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=y.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=y.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=y.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=y.LINE_HEIGHT;exports.RENDER_PLAN_SCHEMA_VERSION=y.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_MACH=y.SCHEMA_VERSION_MACH;exports.isImageBackedComponent=y.isImageBackedComponent;exports.isRichText=y.isRichText;exports.PaginatePageLimitError=A.PaginatePageLimitError;exports.ReportSourceError=A.ReportSourceError;exports.createReportSource=A.createReportSource;exports.datasetJsonSchema=A.datasetJsonSchema;exports.defineReport=A.defineReport;exports.evalStyleRule=A.evalStyleRule;exports.formatValue=A.formatValue;exports.paginateTemplate=A.paginateTemplate;exports.parseDateLocal=A.parseDateLocal;exports.toExcelNumberFormat=A.toExcelNumberFormat;exports.toNumber=A.toNumber;exports.validateDatasetRows=A.validateDatasetRows;exports.CSS_DPI=f.CSS_DPI;exports.MM_PER_INCH=f.MM_PER_INCH;exports.PAPER_SIZES=f.PAPER_SIZES;exports.mergeComponentStyles=f.mergeComponentStyles;exports.mmToPx=f.mmToPx;exports.mmToPxFactor=f.mmToPxFactor;exports.ptToPx=f.ptToPx;exports.pxToMm=f.pxToMm;exports.resolveBoxBorders=f.resolveBoxBorders;exports.resolveFontSize=f.resolveFontSize;exports.resolveLineHeight=f.resolveLineHeight;exports.resolveStroke=f.resolveStroke;exports.resolveTextColor=f.resolveTextColor;exports.round=f.round;exports.assertRenderPlan=Z.assertRenderPlan;exports.validateComponent=Z.validateComponent;exports.validatePage=Z.validatePage;exports.validateRenderPlan=Z.validateRenderPlan;exports.charWidthEm=$.charWidthEm;exports.createCanvasMeasurer=$.createCanvasMeasurer;exports.createHeuristicMeasurer=$.createHeuristicMeasurer;exports.heuristicMeasurer=$.heuristicMeasurer;exports.measureTextMm=$.measureTextMm;exports.wrapText=$.wrapText;exports.resolveGridLayout=H.resolveGridLayout;exports.OutputAssetError=j.OutputAssetError;exports.resolvePlanAssets=j.resolvePlanAssets;exports.OutputFidelityError=D.OutputFidelityError;exports.inspectOutputCapabilities=D.inspectOutputCapabilities;exports.reportOutputDiagnostics=D.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=N.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=N.ReportTemplateError;exports.createTemplateRegistry=N.createTemplateRegistry;exports.defineReportTemplate=N.defineReportTemplate;exports.parseReportTemplate=N.parseReportTemplate;exports.serializeReportTemplate=N.serializeReportTemplate;exports.validateReportTemplate=N.validateReportTemplate;exports.validateReportTemplateDocument=N.validateReportTemplateDocument;exports.ReportParamValidationError=q.ReportParamValidationError;exports.assertReportParams=q.assertReportParams;exports.isReportDate=q.isReportDate;exports.reportParamsJsonSchema=q.reportParamsJsonSchema;exports.validateReportParamDefinitions=q.validateReportParamDefinitions;exports.validateReportParams=q.validateReportParams;exports.PageBuilder=Ie;exports.ReportCellEditError=T;exports.ReportCellFieldError=De;exports.ReportTemplateStoreError=z;exports.TemplateBuilder=Re;exports.applyReportCellEdit=qt;exports.applyReportCellEditBatch=Gt;exports.applyReportEditResult=Qt;exports.classOf=P;exports.columnsFromContract=vt;exports.computePageWindow=Te;exports.createCanvasPager=pt;exports.createMemoryTemplateStore=It;exports.createProviderReport=Pt;exports.createReportCellEdit=zt;exports.createReportCellEditBatch=Ut;exports.createReportCellResolver=te;exports.createTableTemplate=Ct;exports.createTemplate=wt;exports.createTemplateManager=Rt;exports.formatReportCellEdit=V;exports.formatReportClipboard=Jt;exports.getReportCellContext=ee;exports.measurePageSizePx=Q;exports.parseReportCellFieldInput=ln;exports.parseReportCellInput=ne;exports.parseReportClipboard=Zt;exports.planFontSizePx=it;exports.renderComponent=se;exports.renderPage=Me;exports.renderPlan=et;exports.renderPlanToCanvas=ft;exports.renderPlanToCanvasAsync=gt;exports.renderPlanToImages=ut;exports.reportCellEditKey=re;exports.resolvePaper=de;exports.summarizeReportCellEdits=Yt;exports.validateReportCellFieldDefinition=$e;
|