@agile-team/mach-report 2.11.2 → 2.12.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 +14 -5
- package/THIRD_PARTY_NOTICES.md +270 -0
- package/dist/{ExcelBindingWizard-LWX6G1A2.js → ExcelBindingWizard-CeAf4QSE.js} +2 -2
- package/dist/{ExcelBindingWizard-a4kslPHF.cjs → ExcelBindingWizard-y0mT-AHR.cjs} +1 -1
- package/dist/{RuleEditor-C2QsOHOs.cjs → RuleEditor-ChRzNQuF.cjs} +1 -1
- package/dist/{RuleEditor-D9wQHrkf.js → RuleEditor-DzAmW5YH.js} +1 -1
- package/dist/analytics.d.cts +28 -0
- package/dist/analytics.d.ts +28 -0
- package/dist/assets-C2U-e-Sz.cjs +4 -0
- package/dist/assets-Q0wUwNrV.js +217 -0
- package/dist/code-options-BKXXY7NI.js +18 -0
- package/dist/code-options-BUTChiZZ.cjs +1 -0
- package/dist/codes.cjs +9 -0
- package/dist/codes.d.cts +223 -0
- package/dist/codes.d.ts +223 -0
- package/dist/codes.js +26917 -0
- package/dist/designer.cjs +2 -2
- package/dist/designer.d.cts +267 -0
- package/dist/designer.d.ts +267 -0
- package/dist/designer.js +2737 -1941
- package/dist/grid-strokes-Cr7DwUux.cjs +1 -0
- package/dist/grid-strokes-DyyG1q_o.js +53 -0
- package/dist/index.cjs +7 -7
- package/dist/index.d.cts +80 -1
- package/dist/index.d.ts +80 -1
- package/dist/index.js +404 -374
- package/dist/pdf.cjs +76 -59
- package/dist/pdf.d.cts +51 -0
- package/dist/pdf.d.ts +51 -0
- package/dist/pdf.js +32128 -32048
- package/dist/record-bindings-By_UKZ2g.cjs +1 -0
- package/dist/{list-cell-ClFra1zS.js → record-bindings-D-5jQlTj.js} +67 -44
- package/dist/{region-binding-workflow-DhQvu1co.cjs → region-binding-workflow-BzfbxRiR.cjs} +1 -1
- package/dist/{region-binding-workflow-CXDmt9Bs.js → region-binding-workflow-CcUq8W2Q.js} +1 -1
- package/dist/server/node.d.cts +52 -1
- package/dist/server/node.d.ts +52 -1
- package/dist/server-node.cjs +1 -1
- package/dist/server-node.js +239 -210
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +95 -3
- package/dist/server.d.ts +95 -3
- package/dist/server.js +456 -433
- package/dist/style.css +1 -1
- package/dist/{template-registry-WNXdkiET.js → template-registry-BjE1VS6g.js} +221 -157
- package/dist/template-registry-D3SjENi6.cjs +1 -0
- package/dist/template-review-BfCC8Ng9.cjs +2 -0
- package/dist/{template-review-BdcXSYbx.js → template-review-BzpcI-tR.js} +772 -666
- package/dist/validate-BJ5HIWY8.cjs +1 -0
- package/dist/validate-DbgEM1Hh.js +163 -0
- package/dist/vue/async.d.cts +121 -2
- package/dist/vue/async.d.ts +121 -2
- package/dist/vue/index.d.cts +114 -6
- package/dist/vue/index.d.ts +114 -6
- package/dist/{workbook-session-BKOTwcoq.js → workbook-session-BPb3TMnT.js} +1 -1
- package/dist/{workbook-session-CLYLhZWu.cjs → workbook-session-DNa2RHNG.cjs} +1 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +52 -1
- package/dist/worker.d.ts +52 -1
- package/dist/worker.js +2 -2
- package/dist/xlsx.cjs +1 -1
- package/dist/xlsx.d.cts +40 -0
- package/dist/xlsx.d.ts +40 -0
- package/dist/xlsx.js +3 -3
- package/package.json +16 -3
- package/dist/assets-Bu6UohJx.cjs +0 -1
- package/dist/assets-DegqDNqY.js +0 -160
- package/dist/list-cell-BuYn4tGF.cjs +0 -1
- package/dist/template-registry-ukBGlm8N.cjs +0 -1
- package/dist/template-review-BXp2oyqg.cjs +0 -1
- package/dist/textwrap-CWHyzkBH.cjs +0 -4
- package/dist/textwrap-DE1kgcJB.js +0 -110
- package/dist/validate-7s0yn6ii.js +0 -148
- package/dist/validate-DsRiNw8h.cjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const h=require("./style-UgIJSA1F.cjs"),w=["borderTop","borderRight","borderBottom","borderLeft","borderColor","lineColor","lineWidthPt"];function k(r,o){const s=h.resolveBoxBorders(o.style),e=s.inner?[...r.edges]:[];s.top&&e.push({kind:"h",pos:0,from:0,to:o.widthMm}),s.bottom&&e.push({kind:"h",pos:o.heightMm,from:0,to:o.widthMm}),s.left&&e.push({kind:"v",pos:0,from:0,to:o.heightMm}),s.right&&e.push({kind:"v",pos:o.widthMm,from:0,to:o.heightMm});const t=h.resolveStroke(o.style);return e.map(n=>({...n,...t}))}function g(r,o,s){const e=r.get(o);(!e||s.widthPt>e.widthPt)&&r.set(o,s)}function d(r,o,s,e,t,n){const l=s<o.rows.length?o.rows[s].pos:o.rows[o.rows.length-1].pos+o.rows[o.rows.length-1].size;for(let i=e;i<t;i++){const c=o.columns[i];g(r,`h:${s}:${i}`,{kind:"h",pos:l,from:c.pos,to:c.pos+c.size,...n})}}function m(r,o,s,e,t,n){const l=s<o.columns.length?o.columns[s].pos:o.columns[o.columns.length-1].pos+o.columns[o.columns.length-1].size;for(let i=e;i<t;i++){const c=o.rows[i];g(r,`v:${s}:${i}`,{kind:"v",pos:l,from:c.pos,to:c.pos+c.size,...n})}}function p(r,o,s,e){const t=Math.min(o.columns.length,s.ci+(s.cell.colSpan??1)),n=Math.min(o.rows.length,s.ri+(s.cell.rowSpan??1)),l=h.mergeComponentStyles(e,s.cell.style),i=h.resolveBoxBorders(l),c=h.resolveStroke(l);i.top&&d(r,o,s.ri,s.ci,t,c),i.bottom&&d(r,o,n,s.ci,t,c),i.left&&m(r,o,s.ci,s.ri,n,c),i.right&&m(r,o,t,s.ri,n,c)}function v(r){const o=[...r.values()].sort((e,t)=>e.kind.localeCompare(t.kind)||e.pos-t.pos||e.from-t.from),s=[];for(const e of o){const t=s[s.length-1];t&&t.kind===e.kind&&t.pos===e.pos&&Math.abs(t.to-e.from)<1e-6&&t.color===e.color&&t.widthPt===e.widthPt?t.to=e.to:s.push({...e})}return s}function S(r,o){if(!r.cells.some(({cell:n})=>w.some(l=>n.style?.[l]!==void 0)))return k(r,o);const s=new Map,e=new Set,t=r.columns.length;for(const n of r.cells){p(s,r,n,o.style);const l=Math.min(r.rows.length,n.ri+(n.cell.rowSpan??1)),i=Math.min(t,n.ci+(n.cell.colSpan??1));for(let c=n.ri;c<l;c++)for(let f=n.ci;f<i;f++)e.add(c*t+f)}for(let n=0;n<r.rows.length;n++)for(let l=0;l<t;l++)e.has(n*t+l)||p(s,r,{ri:n,ci:l,cell:{}},o.style);return v(s)}exports.resolveGridStrokes=S;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { d as p, c as g, e as k } from "./style-CQ1PK8ZB.js";
|
|
2
|
+
const S = ["borderTop", "borderRight", "borderBottom", "borderLeft", "borderColor", "lineColor", "lineWidthPt"];
|
|
3
|
+
function v(r, o) {
|
|
4
|
+
const s = p(o.style), t = s.inner ? [...r.edges] : [];
|
|
5
|
+
s.top && t.push({ kind: "h", pos: 0, from: 0, to: o.widthMm }), s.bottom && t.push({ kind: "h", pos: o.heightMm, from: 0, to: o.widthMm }), s.left && t.push({ kind: "v", pos: 0, from: 0, to: o.heightMm }), s.right && t.push({ kind: "v", pos: o.widthMm, from: 0, to: o.heightMm });
|
|
6
|
+
const e = g(o.style);
|
|
7
|
+
return t.map((n) => ({ ...n, ...e }));
|
|
8
|
+
}
|
|
9
|
+
function w(r, o, s) {
|
|
10
|
+
const t = r.get(o);
|
|
11
|
+
(!t || s.widthPt > t.widthPt) && r.set(o, s);
|
|
12
|
+
}
|
|
13
|
+
function f(r, o, s, t, e, n) {
|
|
14
|
+
const l = s < o.rows.length ? o.rows[s].pos : o.rows[o.rows.length - 1].pos + o.rows[o.rows.length - 1].size;
|
|
15
|
+
for (let i = t; i < e; i++) {
|
|
16
|
+
const c = o.columns[i];
|
|
17
|
+
w(r, `h:${s}:${i}`, { kind: "h", pos: l, from: c.pos, to: c.pos + c.size, ...n });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function m(r, o, s, t, e, n) {
|
|
21
|
+
const l = s < o.columns.length ? o.columns[s].pos : o.columns[o.columns.length - 1].pos + o.columns[o.columns.length - 1].size;
|
|
22
|
+
for (let i = t; i < e; i++) {
|
|
23
|
+
const c = o.rows[i];
|
|
24
|
+
w(r, `v:${s}:${i}`, { kind: "v", pos: l, from: c.pos, to: c.pos + c.size, ...n });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function d(r, o, s, t) {
|
|
28
|
+
const e = Math.min(o.columns.length, s.ci + (s.cell.colSpan ?? 1)), n = Math.min(o.rows.length, s.ri + (s.cell.rowSpan ?? 1)), l = k(t, s.cell.style), i = p(l), c = g(l);
|
|
29
|
+
i.top && f(r, o, s.ri, s.ci, e, c), i.bottom && f(r, o, n, s.ci, e, c), i.left && m(r, o, s.ci, s.ri, n, c), i.right && m(r, o, e, s.ri, n, c);
|
|
30
|
+
}
|
|
31
|
+
function M(r) {
|
|
32
|
+
const o = [...r.values()].sort((t, e) => t.kind.localeCompare(e.kind) || t.pos - e.pos || t.from - e.from), s = [];
|
|
33
|
+
for (const t of o) {
|
|
34
|
+
const e = s[s.length - 1];
|
|
35
|
+
e && e.kind === t.kind && e.pos === t.pos && Math.abs(e.to - t.from) < 1e-6 && e.color === t.color && e.widthPt === t.widthPt ? e.to = t.to : s.push({ ...t });
|
|
36
|
+
}
|
|
37
|
+
return s;
|
|
38
|
+
}
|
|
39
|
+
function z(r, o) {
|
|
40
|
+
if (!r.cells.some(({ cell: n }) => S.some((l) => n.style?.[l] !== void 0))) return v(r, o);
|
|
41
|
+
const s = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Set(), e = r.columns.length;
|
|
42
|
+
for (const n of r.cells) {
|
|
43
|
+
d(s, r, n, o.style);
|
|
44
|
+
const l = Math.min(r.rows.length, n.ri + (n.cell.rowSpan ?? 1)), i = Math.min(e, n.ci + (n.cell.colSpan ?? 1));
|
|
45
|
+
for (let c = n.ri; c < l; c++) for (let h = n.ci; h < i; h++) t.add(c * e + h);
|
|
46
|
+
}
|
|
47
|
+
for (let n = 0; n < r.rows.length; n++) for (let l = 0; l < e; l++)
|
|
48
|
+
t.has(n * e + l) || d(s, r, { ri: n, ci: l, cell: {} }, o.style);
|
|
49
|
+
return M(s);
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
z as r
|
|
53
|
+
};
|
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("./defaults-xhmcLLrf.cjs"),Y=require("./list-cell-BuYn4tGF.cjs"),u=require("./style-UgIJSA1F.cjs"),W=require("./render-plan-7xpGrCEl.cjs"),te=require("./validate-DsRiNw8h.cjs"),ae=require("./dataset-BkRmwgeJ.cjs"),$=require("./textwrap-CWHyzkBH.cjs"),f=require("./template-review-BXp2oyqg.cjs"),se=require("./grid-geometry-CZ_cYB6O.cjs"),j=require("./assets-Bu6UohJx.cjs"),O=require("./capabilities-CsZ-pNHR.cjs"),Be=require("./progress-BnLiS5eH.cjs"),We=require("./page-window-index-DEjnM6IB.cjs"),E=require("./template-registry-ukBGlm8N.cjs"),z=require("./param-validation-DCK039V1.cjs"),le=require("./tree-BX380Rr7.cjs"),je={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 S(e,t){return t?.classNames?.[e]??je[e]}class Ue{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,i=2){return this.add(t,`${u.round(u.mmToPx(n,r),i)}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 T(e,t="unset"){return new Ue().add("all",t).add("display",e).add("box-sizing","border-box")}function Te(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 qe(e,t,n){const r=t.style??{};Te(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 Ge(e,t,n,r,i,o){const s=e.cell,a=o.createElement("td");a.className=S("cell",i),a.dataset.mrRowIndex=String(e.ri),a.dataset.mrColumnIndex=String(e.ci),a.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(a.colSpan=s.colSpan),s.rowSpan&&(a.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=T("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");Te(c,l,r),c.applyTo(a);const d=o.createElement("div");d.className="mr-cell-content",T("flex").add("position","absolute").mm("left",n+(s.indentMm??0),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(d),s.text!=null&&d.append(s.text);for(const m of s.children??[])d.appendChild(ce(m,r,i,o));return a.appendChild(d),a}function Ve(e,t,n,r){return j.resolveGridStrokes(e,t).map(i=>{const o=`${u.round(i.widthPt*n/72,2)}px solid ${i.color}`,s=r.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const a=i.kind==="h";return T("block").add("position","absolute").add("pointer-events","none").mm("left",a?i.from:i.pos,n).mm("top",a?i.pos:i.from,n).mm("width",a?i.to-i.from:0,n).mm("height",a?0:i.to-i.from,n).add(a?"border-top":"border-left",o).applyTo(s),s})}function Ye(e,t,n,r,i){const o=i.createElement("table");o.className=S("grid",r),o.setAttribute("role","table"),T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(o);const s=se.resolveGridLayout(e,t.widthMm,t.heightMm),a=i.createElement("tbody");T("contents").applyTo(a),o.appendChild(a);const l=e.cells.map(()=>{const d=i.createElement("tr");return d.className=S("row",r),d.setAttribute("role","row"),T("contents").applyTo(d),a.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(Ge(d,t,e.paddingMm??.5,n,r,i));const c=i.createElement("div");return T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(o,...Ve(s,t,n,i)),c}function Xe(e,t,n,r){const i=r.createElement("div");i.className=S("paragraph",n),T("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(i);for(const o of e.segments||[]){const s=r.createElement("span");s.className=S("segment",n),s.textContent=o.kind==="field"?o.field??"":o.text??"";const a=T("inline");if(o.style){const l=o.style;a.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)&&a.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}a.applyTo(s),i.appendChild(s)}return i}function Ke(e,t,n,r){if(W.isRichText(e)){const i=r.createElement("div");i.className=S("rich",n),T("block").applyTo(i);for(const o of e.richParagraphs)i.appendChild(Xe(o,t,n,r));return i}if(Array.isArray(e.lines)&&e.lines.length>0){const i=r.createElement("div");i.className=S("lines",n),T("block").applyTo(i);for(const o of e.lines){const s=r.createElement("div");s.className=S("line",n),s.textContent=o,T("block").add("white-space","pre").add("min-height","1lh").applyTo(s),i.appendChild(s)}return i}return e.text??""}function Je(e,t,n,r){const i=r.createElement("div");i.className=S("text",n);const o=e.style||{};return T("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",o.verticalAlign==="middle"?"center":o.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(i),i.append(Ke(e,t,n,r)),i}function Ze(e,t,n){const r=n.createElement("img");return r.className=S("image",t),r.src=e.imageData,T("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function we(e,t,n,r){const i=r.createElement("div");i.className=S("shape",n);const o=e.style||{},s=u.resolveStroke(o),a=u.resolveBoxBorders(o),l=`${u.round(s.widthPt*t/72,2)}px solid ${s.color}`,c=T("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(a.top&&c.add("border-top",l),a.right&&c.add("border-right",l),a.bottom&&c.add("border-bottom",l),a.left&&c.add("border-left",l)):e.kind==="ellipse"?(a.inner&&c.add("border",l).add("border-radius","50%"),o.backgroundColor&&c.add("background-color",o.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",l),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(i),i}function Qe(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),i=u.mmToPx(e.widthMm,t),o=u.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,i))),r.setAttribute("height",String(Math.max(1,o))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const s=n.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(i)),s.setAttribute("y1",e.lineDirection==="up"?String(o):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(o));const a=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",a.color),s.setAttribute("stroke-width",String(a.widthPt*t/72)),r.appendChild(s),r}function ce(e,t,n,r){const i=r.createElement("div");i.className=`${S("comp",n)} mr-kind-${e.kind}`;const o=T("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(qe(o,e,t),o.applyTo(i),W.isImageBackedComponent(e))return i.appendChild(Ze(e,n,r)),i;if(e.kind==="text")return i.appendChild(Je(e,t,n,r)),i;if(e.grid){const a=we(e,t,n,r);return a.appendChild(Ye(e.grid,e,t,n,r)),i.appendChild(a),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(Qe(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(we(e,t,n,r)),i;const s=r.createElement("div");return s.className=S("unknown",n),T("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),i.appendChild(s),i}function xe(e,t,n,r){const i=r.createElement("div");return i.className=S("page",n),T("block","initial").add("position","relative").add("font-family",I.DEFAULT_FONT_FAMILY).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",I.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((o,s)=>{const a=ce(o,t,n,r);a.dataset.mrComponentIndex=String(s),i.appendChild(a)}),i}function et(e,t,n={}){const r=n.dpi??96;O.reportOutputDiagnostics(e,"dom",n);const i=t.createElement("div");return i.className=S("root",n),T("block").applyTo(i),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(o=>{i.appendChild(xe(o,r,n,t))}),i}function L(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const tt=(e,t)=>(L(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const i=new Image,o=()=>{i.onload=null,i.onerror=null,t?.removeEventListener("abort",s)},s=()=>{o(),i.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};i.onload=()=>{o(),n(i)},i.onerror=()=>{o(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),i.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 L(n),n?new Promise((r,i)=>{const o=()=>i(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",o,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,i).finally(()=>n.removeEventListener("abort",o))}):e(t)}async function rt(e,t,n){const r=new Map;for(const i of e.components)!W.isImageBackedComponent(i)||r.has(i.imageData)||r.set(i.imageData,await nt(t,i.imageData,n));return L(n),r}function it(e,t,n,r,i,o){const s=t,a=s.naturalWidth??s.width??i,l=s.naturalHeight??s.height??o;if(a<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(i/a,o/l),d=a*c,m=l*c;e.drawImage(t,n+(i-d)/2,r+(o-m)/2,d,m)}function Re(e){return We.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const de=96/25.4;function ne(e,t=96){const n=t/96*de;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Se(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 i=ne(e,n),o=Math.round(i.widthPx*t),s=Math.round(i.heightPx*t);if(!Number.isSafeInteger(o)||!Number.isSafeInteger(s)||o*s>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:o,height:s}}function Ce(e,t,n,r){const i=document.createElement("canvas"),{widthPx:o,heightPx:s}=ne(e,n),a=Se(e,t,n,r);i.width=a.width,i.height=a.height,i.style.width=`${o}px`,i.style.height=`${s}px`;const l=i.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,o,s),{canvas:i,ctx:l}}function ot(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Pe(e,t,n,r,i,o,s,a="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
|
|
2
|
-
`),d=c.length*l;let m=r;a==="middle"?m=r+(o-d)/2:a==="bottom"&&(m=r+o-d),c.forEach((h,g)=>{at(e,h,t,n,m+g*l+t.fontSizePx*.8,i)}),e.textAlign="left"}function at(e,t,n,r,i,o){const s=Array.from(t),a=n.letterSpacingPx??0;if(!a){e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const m=n.align==="center"?r+o/2:n.align==="right"?r+o:r;e.fillText(t,m,i);return}const l=e.measureText(t).width+Math.max(0,s.length-1)*a,c=n.align==="center"?r+(o-l)/2:n.align==="right"?r+o-l:r;e.textAlign="left";let d="";s.forEach((m,h)=>{e.fillText(m,c+e.measureText(d).width+h*a,i),d+=m})}function st(e,t,n,r,i,o,s){for(const a of
|
|
3
|
-
`);Pe(e,{text:
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=require("./defaults-xhmcLLrf.cjs"),U=require("./record-bindings-By_UKZ2g.cjs"),u=require("./style-UgIJSA1F.cjs"),W=require("./render-plan-7xpGrCEl.cjs"),ee=require("./validate-BJ5HIWY8.cjs"),oe=require("./dataset-BkRmwgeJ.cjs"),C=require("./assets-C2U-e-Sz.cjs"),f=require("./template-review-BfCC8Ng9.cjs"),ae=require("./grid-geometry-CZ_cYB6O.cjs"),Ee=require("./grid-strokes-Cr7DwUux.cjs"),$=require("./capabilities-CsZ-pNHR.cjs"),ze=require("./progress-BnLiS5eH.cjs"),We=require("./page-window-index-DEjnM6IB.cjs"),M=require("./template-registry-D3SjENi6.cjs"),H=require("./param-validation-DCK039V1.cjs"),se=require("./tree-BX380Rr7.cjs"),Ue={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 S(e,t){return t?.classNames?.[e]??Ue[e]}class je{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,i=2){return this.add(t,`${u.round(u.mmToPx(n,r),i)}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 T(e,t="unset"){return new je().add("all",t).add("display",e).add("box-sizing","border-box")}function Te(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 qe(e,t,n){const r=t.style??{};Te(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 Ge(e,t,n,r,i,o){const s=e.cell,a=o.createElement("td");a.className=S("cell",i),a.dataset.mrRowIndex=String(e.ri),a.dataset.mrColumnIndex=String(e.ci),a.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(a.colSpan=s.colSpan),s.rowSpan&&(a.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=T("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");Te(c,l,r),c.applyTo(a);const d=o.createElement("div");d.className="mr-cell-content",T("flex").add("position","absolute").mm("left",n+(s.indentMm??0),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(d),s.text!=null&&d.append(s.text);for(const m of s.children??[])d.appendChild(le(m,r,i,o));return a.appendChild(d),a}function Ve(e,t,n,r){return Ee.resolveGridStrokes(e,t).map(i=>{const o=`${u.round(i.widthPt*n/72,2)}px solid ${i.color}`,s=r.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const a=i.kind==="h";return T("block").add("position","absolute").add("pointer-events","none").mm("left",a?i.from:i.pos,n).mm("top",a?i.pos:i.from,n).mm("width",a?i.to-i.from:0,n).mm("height",a?0:i.to-i.from,n).add(a?"border-top":"border-left",o).applyTo(s),s})}function Ye(e,t,n,r,i){const o=i.createElement("table");o.className=S("grid",r),o.setAttribute("role","table"),T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(o);const s=ae.resolveGridLayout(e,t.widthMm,t.heightMm),a=i.createElement("tbody");T("contents").applyTo(a),o.appendChild(a);const l=e.cells.map(()=>{const d=i.createElement("tr");return d.className=S("row",r),d.setAttribute("role","row"),T("contents").applyTo(d),a.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(Ge(d,t,e.paddingMm??.5,n,r,i));const c=i.createElement("div");return T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(o,...Ve(s,t,n,i)),c}function Je(e,t,n,r){const i=r.createElement("div");i.className=S("paragraph",n),T("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(i);for(const o of e.segments||[]){const s=r.createElement("span");s.className=S("segment",n),s.textContent=o.kind==="field"?o.field??"":o.text??"";const a=T("inline");if(o.style){const l=o.style;a.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)&&a.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}a.applyTo(s),i.appendChild(s)}return i}function Ke(e,t,n,r){if(W.isRichText(e)){const i=r.createElement("div");i.className=S("rich",n),T("block").applyTo(i);for(const o of e.richParagraphs)i.appendChild(Je(o,t,n,r));return i}if(Array.isArray(e.lines)&&e.lines.length>0){const i=r.createElement("div");i.className=S("lines",n),T("block").applyTo(i);for(const o of e.lines){const s=r.createElement("div");s.className=S("line",n),s.textContent=o,T("block").add("white-space","pre").add("min-height","1lh").applyTo(s),i.appendChild(s)}return i}return e.text??""}function Xe(e,t,n,r){const i=r.createElement("div");i.className=S("text",n);const o=e.style||{};return T("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",o.verticalAlign==="middle"?"center":o.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(i),i.append(Ke(e,t,n,r)),i}function Ze(e,t,n){const r=n.createElement("img");return r.className=S("image",t),r.src=e.imageData,T("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function fe(e,t,n,r){const i=r.createElement("div");i.className=S("shape",n);const o=e.style||{},s=u.resolveStroke(o),a=u.resolveBoxBorders(o),l=`${u.round(s.widthPt*t/72,2)}px solid ${s.color}`,c=T("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(a.top&&c.add("border-top",l),a.right&&c.add("border-right",l),a.bottom&&c.add("border-bottom",l),a.left&&c.add("border-left",l)):e.kind==="ellipse"?(a.inner&&c.add("border",l).add("border-radius","50%"),o.backgroundColor&&c.add("background-color",o.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",l),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(i),i}function Qe(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),i=u.mmToPx(e.widthMm,t),o=u.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,i))),r.setAttribute("height",String(Math.max(1,o))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const s=n.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(i)),s.setAttribute("y1",e.lineDirection==="up"?String(o):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(o));const a=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",a.color),s.setAttribute("stroke-width",String(a.widthPt*t/72)),r.appendChild(s),r}function le(e,t,n,r){const i=r.createElement("div");i.className=`${S("comp",n)} mr-kind-${e.kind}`;const o=T("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(qe(o,e,t),o.applyTo(i),W.isImageBackedComponent(e))return i.appendChild(Ze(e,n,r)),i;if(e.kind==="text")return i.appendChild(Xe(e,t,n,r)),i;if(e.grid){const a=fe(e,t,n,r);return a.appendChild(Ye(e.grid,e,t,n,r)),i.appendChild(a),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(Qe(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(fe(e,t,n,r)),i;const s=r.createElement("div");return s.className=S("unknown",n),T("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),i.appendChild(s),i}function Re(e,t,n,r){const i=r.createElement("div");return i.className=S("page",n),T("block","initial").add("position","relative").add("font-family",L.DEFAULT_FONT_FAMILY).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",L.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((o,s)=>{const a=le(o,t,n,r);a.dataset.mrComponentIndex=String(s),i.appendChild(a)}),i}function et(e,t,n={}){const r=n.dpi??96;$.reportOutputDiagnostics(e,"dom",n);const i=t.createElement("div");return i.className=S("root",n),T("block").applyTo(i),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(o=>{i.appendChild(Re(o,r,n,t))}),i}function k(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const tt=(e,t)=>(k(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const i=new Image,o=()=>{i.onload=null,i.onerror=null,t?.removeEventListener("abort",s)},s=()=>{o(),i.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};i.onload=()=>{o(),n(i)},i.onerror=()=>{o(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),i.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 k(n),n?new Promise((r,i)=>{const o=()=>i(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",o,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,i).finally(()=>n.removeEventListener("abort",o))}):e(t)}async function rt(e,t,n){const r=new Map;for(const i of e.components)!W.isImageBackedComponent(i)||r.has(i.imageData)||r.set(i.imageData,await nt(t,i.imageData,n));return k(n),r}function it(e,t,n,r,i,o){const s=t,a=s.naturalWidth??s.width??i,l=s.naturalHeight??s.height??o;if(a<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(i/a,o/l),d=a*c,m=l*c;e.drawImage(t,n+(i-d)/2,r+(o-m)/2,d,m)}function xe(e){return We.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const ce=96/25.4;function te(e,t=96){const n=t/96*ce;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Se(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 i=te(e,n),o=Math.round(i.widthPx*t),s=Math.round(i.heightPx*t);if(!Number.isSafeInteger(o)||!Number.isSafeInteger(s)||o*s>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:o,height:s}}function Ce(e,t,n,r){const i=document.createElement("canvas"),{widthPx:o,heightPx:s}=te(e,n),a=Se(e,t,n,r);i.width=a.width,i.height=a.height,i.style.width=`${o}px`,i.style.height=`${s}px`;const l=i.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,o,s),{canvas:i,ctx:l}}function ot(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Pe(e,t,n,r,i,o,s,a="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
|
|
2
|
+
`),d=c.length*l;let m=r;a==="middle"?m=r+(o-d)/2:a==="bottom"&&(m=r+o-d),c.forEach((h,g)=>{at(e,h,t,n,m+g*l+t.fontSizePx*.8,i)}),e.textAlign="left"}function at(e,t,n,r,i,o){const s=Array.from(t),a=n.letterSpacingPx??0;if(!a){e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const m=n.align==="center"?r+o/2:n.align==="right"?r+o:r;e.fillText(t,m,i);return}const l=e.measureText(t).width+Math.max(0,s.length-1)*a,c=n.align==="center"?r+(o-l)/2:n.align==="right"?r+o-l:r;e.textAlign="left";let d="";s.forEach((m,h)=>{e.fillText(m,c+e.measureText(d).width+h*a,i),d+=m})}function st(e,t,n,r,i,o,s){for(const a of Ee.resolveGridStrokes(t,n))e.strokeStyle=a.color,e.lineWidth=u.ptToPx(a.widthPt,s),e.beginPath(),a.kind==="v"?(e.moveTo(r+a.pos*o,i+a.from*o),e.lineTo(r+a.pos*o,i+a.to*o)):(e.moveTo(r+a.from*o,i+a.pos*o),e.lineTo(r+a.to*o,i+a.pos*o)),e.stroke()}function lt(e,t,n,r,i,o){e.beginPath(),t.top&&(e.moveTo(n,r),e.lineTo(n+i,r)),t.right&&(e.moveTo(n+i,r),e.lineTo(n+i,r+o)),t.bottom&&(e.moveTo(n+i,r+o),e.lineTo(n,r+o)),t.left&&(e.moveTo(n,r+o),e.lineTo(n,r)),e.stroke()}function ct(e,t,n,r,i,o,s,a,l,c,d){const m=ae.resolveGridLayout(t,o/a,s/a);for(const g of m.cells){const w=g.cell.style?.backgroundColor??n.style?.backgroundColor;w&&(e.fillStyle=w,e.fillRect(r+g.xMm*a,i+g.yMm*a,g.widthMm*a,g.heightMm*a))}st(e,m,n,r,i,a,l);const h=t.paddingMm??.5;for(const g of m.cells){const w=g.cell.text??"";if(!w)continue;const b=u.mergeComponentStyles(n.style,g.cell.style),_=u.resolveFontSize(b,l),I=g.cell.indentMm??0,P=Math.max(0,g.widthMm-2*h-I),F=C.wrapText(w,P,{fontSizePt:_.fontSizePt,bold:b.bold,italic:b.italic,fontFamily:b.fontFamily??c,letterSpacingPt:b.letterSpacing},d).join(`
|
|
3
|
+
`);Pe(e,{text:F,fontSizePx:_.fontSizePx,bold:b.bold??!1,italic:b.italic,color:u.resolveTextColor(b,L.DEFAULT_TEXT_COLOR),align:b.align??"left",lineHeight:u.resolveLineHeight(b),letterSpacingPx:u.ptToPx(b.letterSpacing??0,l)},r+(g.xMm+h+I)*a,i+(g.yMm+h)*a,P*a,Math.max(0,g.heightMm-2*h)*a,b.fontFamily??c,b.verticalAlign??"middle")}}function dt(e,t,n,r,i,o,s,a,l){const c=t.style??{},d=u.resolveFontSize(c,s),m=W.isRichText(t)?t.richParagraphs.map(h=>h.segments.map(g=>g.text??g.field??"").join("")).join(`
|
|
4
4
|
`):t.lines?.length?t.lines.join(`
|
|
5
|
-
`)
|
|
6
|
-
`);Pe(e,{text:m,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:u.resolveTextColor(c),align:c.align??"left",lineHeight:u.resolveLineHeight(c),letterSpacingPx:u.ptToPx(c.letterSpacing??0,s)},n,r,i,o,c.fontFamily??a,c.verticalAlign)}function me(e,t,n,r,i,o,s){const a=t.leftMm*n,l=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,m=t.style??{};if(W.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?it(e,h,a,l,c,d):ve(e,t,a,l,c,d);return}if(t.grid){ct(e,t.grid,t,a,l,c,d,n,r,i,o);return}switch(t.kind){case"text":{dt(e,t,a,l,c,d,r,i,o);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),lt(e,g,a,l,c,d));break}case"line":{const h=u.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,w=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(a,g),e.lineTo(a+c,w),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:ve(e,t,a,l,c,d);break}}function ve(e,t,n,r,i,o){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,i,o),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function mt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...i}=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.");L(t.signal);const o=await j.resolvePlanAssets(e,{...t,format:"canvas"});e=o.plan;const s=[...o.diagnostics,...O.reportOutputDiagnostics(e,"canvas",t)],a=n==="jpeg"?"image/jpeg":"image/png",l=[],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++){L(t.signal);const m=await Ae(e.pages[d],d,i,s);try{l.push(await ut(m,a,r,t.signal))}finally{m.width=0,m.height=0}await Be.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return L(t.signal),{blobs:l,diagnostics:s}}function ut(e,t,n,r){return L(r),new Promise((i,o)=>{const s=()=>o(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",s,{once:!0});try{e.toBlob(a=>{r?.removeEventListener("abort",s),a?i(a):o(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(a){r?.removeEventListener("abort",s),o(a)}})}function ht(e,t={}){if(L(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*de,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??$.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=O.reportOutputDiagnostics(e,"canvas",t),m=gt(e,a,l);for(const h of m)O.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new O.OutputFidelityError(d);for(let h=a;h<=l;h++){L(t.signal);const g=e.pages[h],{canvas:w,ctx:b}=Ce(g,n,r,t.maxCanvasPixels);for(const _ of g.components)me(b,_,i,r,o,s);c.push(w)}return{canvases:c,diagnostics:d}}function gt(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,i)=>r.components.flatMap((o,s)=>W.isImageBackedComponent(o)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+i,componentIndex:s,kind:o.kind,nid:o.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function pt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");L(t.signal);const n=await j.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...O.reportOutputDiagnostics(e,"canvas",t)],i=[],o=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=o;s++)i.push(await Ae(e.pages[s],s,t,r));return{canvases:i,diagnostics:r}}async function Ae(e,t,n,r){const i=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),o=n.dpi??96,s=n.fontFamily??I.DEFAULT_FONT_FAMILY,a=await Ie(e,t,n,r);L(n.signal);const{canvas:l,ctx:c}=Ce(e,i,o,n.maxCanvasPixels);for(const d of e.components)me(c,d,o/25.4,o,s,n.measurer??$.heuristicMeasurer,a);return l}async function Ie(e,t,n,r){const i=n.imageLoader??tt;return rt(e,async(o,s)=>{try{return await i(o,s)}catch(a){if(s?.aborted)throw a;const l=e.components.findIndex(m=>m.imageData===o),c=e.components[l],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:l,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw r.push(d),O.notifyOutputDiagnostic(d,n),a}},n.signal)}function ft(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*de,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??$.heuristicMeasurer,a=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(p=>p.pageHeightMm*i),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*i)),h={start:0,end:-1};let g=null,w=null,b=null,_=null,A=[],C=0,D=[],X=0,G=new AbortController;const ge=[];function $e(){const p=g;p.innerHTML="",w=document.createElement("div"),w.style.cssText=`width:${m}px;margin:0 auto;`,b=document.createElement("div"),_=document.createElement("div"),w.appendChild(b),A=[];const x=Math.min(e.pages.length,3+a*2);for(let B=0;B<x;B++){const M=document.createElement("div");M.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,w.appendChild(M),A.push(M)}w.appendChild(_),p.appendChild(w)}async function _e(p,x){const B=X,M=await j.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:x,end:x});ge.push(...M.diagnostics);const P=M.plan.pages[x],Z=await Ie(P,x,{...t,signal:G.signal},ge);if(B!==X||!g)return;const{widthPx:ie,heightPx:oe}=ne(P,r);let H=p.firstElementChild;(!H||H.tagName!=="CANVAS")&&(H=document.createElement("canvas"),p.innerHTML="",p.appendChild(H));const fe=Se(P,n,r,t.maxCanvasPixels);H.width=fe.width,H.height=fe.height,H.style.width=`${ie}px`,H.style.height=`${oe}px`;const U=H.getContext("2d");if(U){U.setTransform(1,0,0,1,0,0),U.scale(n,n),U.fillStyle="#ffffff",U.fillRect(0,0,ie,oe);for(const ze of P.components)me(U,ze,i,r,o,s,Z);H.dataset.canvasPage=String(x),p.style.height=`${oe}px`,p.style.width=`${ie}px`}}function He(p){X++,h.start=p.start,h.end=p.end,b.style.height=`${p.start*l+d.slice(0,p.start).reduce((M,P)=>M+P,0)}px`;const x=e.pages.length-1-p.end;_.style.height=`${x*l+d.slice(p.end+1).reduce((M,P)=>M+P,0)}px`;const B=p.end-p.start+1;A.forEach((M,P)=>{if(P<B){M.style.display="";const Z=p.start+P;M.style.height=`${d[Z]??0}px`}else M.style.display="none"}),D=[];for(let M=p.start;M<=p.end;M++){const P=A[M-p.start];if(!P)continue;P.firstElementChild?.dataset?.canvasPage!==String(M)&&D.push(M)}re()}function re(){C||D.length===0||(C=requestAnimationFrame(()=>{C=0;let p=Math.max(1,c);for(;D.length>0&&p-- >0;){const x=D.shift(),B=A[x-h.start];B&&_e(B,x).catch(()=>{})}D.length>0&&re()}))}function K(){C||(C=requestAnimationFrame(()=>{C=0;const p=g,x=Re({pageHeightsPx:d,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:a,gapPx:l});x.start!==h.start||x.end!==h.end?He(x):re()}))}let J=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");L(t.signal),G=new AbortController,t.signal?.addEventListener("abort",pe,{once:!0}),O.reportOutputDiagnostics(e,"canvas",t),g=p,$e(),p.addEventListener("scroll",K,{passive:!0}),typeof ResizeObserver<"u"&&(J=new ResizeObserver(()=>K()),J.observe(p)),K()},destroy(){X++,G.abort(),t.signal?.removeEventListener("abort",pe),C&&cancelAnimationFrame(C),C=0,J?.disconnect(),J=null,g?.removeEventListener("scroll",K),D=[],w?.remove(),g=null},window(){return{...h}}};function pe(){G.abort(t.signal?.reason)}}function ue(e,t,n){let r,i;if(typeof e=="string"){const o=u.PAPER_SIZES[e];if(!o)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);r=o.widthMm,i=o.heightMm}else typeof e=="number"?(r=e,i=t??297):(r=e.widthMm,i=e.heightMm);return n?{widthMm:i,heightMm:r}:{widthMm:r,heightMm:i}}class Le{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 o=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:s,heightMm:a}=ue(t,typeof n=="number"?n:void 0,o.landscape),l=o.margins??{};return this.pending=new ke(this,{widthMm:s,heightMm:a,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 ke{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,i={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...i}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,i={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:i}),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,i){return this.components.push({kind:"qrcode",leftMm:r,topMm:i,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 Le}function vt(e,t={}){return ae.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 k(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Q(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 yt(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 k(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function bt(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,i=n.heightMm;return k(r,"纸张 widthMm"),k(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}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,i]of Object.entries(n))k(i,r,!0);return n}function Et(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,i=e.titleGapMm===void 0?4:e.titleGapMm;k(r,"titleHeightMm"),k(i,"titleGapMm",!0);const o=e.title!==void 0&&e.title.length>0,s=o?r+i:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:o,titleSpaceMm:s}}function Tt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};Q(t.align,"listOptions.align",!0),Q(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&k(r,`listOptions.${n}`,n==="paddingMm")}return t}function xt(e){let t=0,n=0;for(const[r,i]of e.entries()){if(!i||typeof i.header!="string"||typeof i.field!="string"||!i.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);Q(i.align,`columns[${r}].align`,!0),Q(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&k(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(k(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function Rt(e,t,n,r){const{fixedWidthMm:i,maxFlex:o}=xt(e.columns);if(t==="page"&&i>r)throw new Error(`固定列宽 ${i}mm 超出页面可用宽度 ${r}mm`);const s=r-i;if(t==="page"&&o>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const a=o>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/o:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?n*(d??1):s*((d??1)/o)/a);return k(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:i,maxFlex:o}}function St(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}=yt(e),r=bt(e);let i=r.widthMm;const o=r.heightMm,s=Mt(e);let a=i-s.marginLeftMm-s.marginRightMm;const l=o-s.marginTopMm-s.marginBottomMm;if(t==="page"&&a<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=Et(e,l),g=Tt(e),{columns:w,fixedWidthMm:b,maxFlex:_}=Rt(e,t,n,a);t==="wide"&&(a=w.reduce((C,D)=>C+D.widthMm,0),k(a,"宽表总列宽"),i=a+s.marginLeftMm+s.marginRightMm,k(i,"宽表总宽度"));const A={widthMm:i,heightMm:o,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&A.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:a,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),A.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:w,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||_>0?a:b}),e.params===void 0?{pages:[A]}:{params:e.params,pages:[A]}}function Ct(e){return e}class F extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function N(e){return JSON.parse(JSON.stringify(e))}function R(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function ye(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new F("history","修订号无效或已达上限");return String(t+1)}function Pt(e,t={}){const n=async(s,a)=>{R(a);const l=await e.read(s,a);return R(a),l?N(l):void 0},r=async(s,a)=>{const l=await n(s,a.signal);if((l?.revision??null)!==a.expectedRevision)throw new F("conflict","模板已变化,请重新读取后提交");return l},i=async(s,a,l)=>{if(R(a.signal),!await e.compareAndSwap(s.id,a.expectedRevision,N(s),{signal:a.signal,...l?{publication:N(l)}:{}}))throw new F("conflict","模板已被其他请求更新");return N(s)},o=async(s,a,l,c)=>{if(t.beforePublish){R(l.signal);const g=await t.beforePublish({document:E.parseReportTemplate(a),previous:s.published?E.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new F("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");R(l.signal)}const d=ye(s),m=E.parseReportTemplate({...a,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),i({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{R(s);const a=await e.list(s);return R(s),N(a)},get:async(s,a={})=>{const l=await n(s,a.signal),c=a.draft?l?.draft:l?.published;return c?E.parseReportTemplate(c):void 0},history:async(s,a)=>{R(a);const l=await e.history(s,a);return R(a),N(l)},saveDraft:async(s,a)=>{a={...a},R(a.signal);const l=E.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await r(l.id,a),d=ye(c);return i({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},a)},publish:async(s,a)=>{a={...a};const l=await r(s,a);if(!l)throw new F("missing","模板不存在");if(!l.draft)throw new F("draft","没有可发布的草稿");return o(l,l.draft,a)},rollback:async(s,a,l)=>{l={...l};const c=await r(s,l);if(!c)throw new F("missing","模板不存在");R(l.signal);const d=await e.getVersion(s,a,l.signal);if(!d)throw new F("history","历史修订不存在");return o(c,d.document,l,a)}}}function At(){const e=new Map,t=new Map;return{read:async(n,r)=>{R(r);const i=e.get(n);return i?N(i):void 0},list:async n=>(R(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:o})=>({id:r,revision:i,...o?{publishedRevision:o}:{}}))),history:async(n,r)=>(R(r),Array.from(t.get(n)?.values()??[],i=>N(i))),getVersion:async(n,r,i)=>{R(i);const o=t.get(n)?.get(r);return o?N(o):void 0},compareAndSwap:async(n,r,i,o)=>{if(R(o.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new F("history","状态 ID 与存储 ID 不一致");const s=N(i),a=o.publication;if(a){const l=t.get(n)??new Map;if(l.has(a.revision)||a.revision!==i.revision||a.document.id!==n)throw new F("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(a.revision,N(a)),t.set(n,l)}return e.set(n,s),!0}}}function It(e,t){const n=e.publishedRevision??e.published?.revision;for(const r of[e.draftRevision,n])if(r!==void 0&&(typeof r!="string"||!r.trim()))throw new TypeError("模板生命周期修订应为非空字符串");if(e.draftRevision!==void 0&&e.draftRevision!==t.revision)throw new TypeError("可编辑文档应与草稿修订一致");if(e.published&&(e.published.id!==t.id||e.published.revision!==n))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&n!==void 0&&n!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...n===void 0?{}:{publishedRevision:n}}}function Lt(e,t){const n=E.parseReportTemplate(e);if(t.id===n.id)throw new Error("复制模板应使用新的 ID");const{revision:r,...i}=n;return E.parseReportTemplate({...i,id:t.id,name:t.name})}function kt(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,n=new Map,r=[];for(const i of e){const o=E.parseReportTemplate(i.document);if(t.has(o.id))throw new Error(`模板 ID 重复:${o.id}`);if(i.category!==void 0&&(typeof i.category!="string"||i.category.length>128)||i.tags!==void 0&&(!Array.isArray(i.tags)||i.tags.length>20||i.tags.some(c=>typeof c!="string"||c.length>128)))throw new TypeError("模板分类和标签无效");const s=It(i,o),{template:a,...l}=o;t.set(o.id,o),i.published?n.set(o.id,E.parseReportTemplate(i.published)):s.publishedRevision&&n.set(o.id,E.parseReportTemplate(o)),r.push({...l,...s,...i.category?{category:i.category}:{},...i.tags?{tags:[...i.tags]}:{}})}return r.sort((i,o)=>i.id<o.id?-1:1),{search:async i=>{be(i.signal);const o=i.limit??30;if(!Number.isSafeInteger(o)||o<1||o>100)throw new RangeError("模板每页数量应为 1–100");const s=i.query?.trim().toLocaleLowerCase()??"",a=r.filter(c=>(!i.category||c.category===i.category)&&(!i.cursor||c.id>i.cursor)&&(!s||[c.id,c.name,c.description,...c.tags??[]].some(d=>d?.toLocaleLowerCase().includes(s)))),l=new Map;for(const c of r)c.category&&l.set(c.category,(l.get(c.category)??0)+1);return JSON.parse(JSON.stringify({items:a.slice(0,o),...a.length>o?{next:a[o-1].id}:{},categories:Array.from(l,([c,d])=>({id:c,label:c,count:d}))}))},get:async(i,o)=>{be(o.signal);const s=o.mode==="published"?n.get(i):t.get(i);return s?E.parseReportTemplate(s):void 0}}}function be(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function Dt(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
7
|
-
`)}function
|
|
5
|
+
`):C.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??a,letterSpacingPt:c.letterSpacing},l).join(`
|
|
6
|
+
`);Pe(e,{text:m,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:u.resolveTextColor(c),align:c.align??"left",lineHeight:u.resolveLineHeight(c),letterSpacingPx:u.ptToPx(c.letterSpacing??0,s)},n,r,i,o,c.fontFamily??a,c.verticalAlign)}function de(e,t,n,r,i,o,s){const a=t.leftMm*n,l=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,m=t.style??{};if(W.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?it(e,h,a,l,c,d):we(e,t,a,l,c,d);return}if(t.grid){ct(e,t.grid,t,a,l,c,d,n,r,i,o);return}switch(t.kind){case"text":{dt(e,t,a,l,c,d,r,i,o);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),lt(e,g,a,l,c,d));break}case"line":{const h=u.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,w=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(a,g),e.lineTo(a+c,w),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:we(e,t,a,l,c,d);break}}function we(e,t,n,r,i,o){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,i,o),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function mt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...i}=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.");k(t.signal);const o=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=o.plan;const s=[...o.diagnostics,...$.reportOutputDiagnostics(e,"canvas",t)],a=n==="jpeg"?"image/jpeg":"image/png",l=[],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++){k(t.signal);const m=await Ae(e.pages[d],d,i,s);try{l.push(await ut(m,a,r,t.signal))}finally{m.width=0,m.height=0}await ze.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return k(t.signal),{blobs:l,diagnostics:s}}function ut(e,t,n,r){return k(r),new Promise((i,o)=>{const s=()=>o(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",s,{once:!0});try{e.toBlob(a=>{r?.removeEventListener("abort",s),a?i(a):o(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(a){r?.removeEventListener("abort",s),o(a)}})}function ht(e,t={}){if(k(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,o=t.fontFamily??L.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=$.reportOutputDiagnostics(e,"canvas",t),m=gt(e,a,l);for(const h of m)$.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new $.OutputFidelityError(d);for(let h=a;h<=l;h++){k(t.signal);const g=e.pages[h],{canvas:w,ctx:b}=Ce(g,n,r,t.maxCanvasPixels);for(const _ of g.components)de(b,_,i,r,o,s);c.push(w)}return{canvases:c,diagnostics:d}}function gt(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,i)=>r.components.flatMap((o,s)=>W.isImageBackedComponent(o)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+i,componentIndex:s,kind:o.kind,nid:o.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function pt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");k(t.signal);const n=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...$.reportOutputDiagnostics(e,"canvas",t)],i=[],o=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=o;s++)i.push(await Ae(e.pages[s],s,t,r));return{canvases:i,diagnostics:r}}async function Ae(e,t,n,r){const i=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),o=n.dpi??96,s=n.fontFamily??L.DEFAULT_FONT_FAMILY,a=await Ie(e,t,n,r);k(n.signal);const{canvas:l,ctx:c}=Ce(e,i,o,n.maxCanvasPixels);for(const d of e.components)de(c,d,o/25.4,o,s,n.measurer??C.heuristicMeasurer,a);return l}async function Ie(e,t,n,r){const i=n.imageLoader??tt;return rt(e,async(o,s)=>{try{return await i(o,s)}catch(a){if(s?.aborted)throw a;const l=e.components.findIndex(m=>m.imageData===o),c=e.components[l],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:l,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw r.push(d),$.notifyOutputDiagnostic(d,n),a}},n.signal)}function ft(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,o=t.fontFamily??L.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(p=>p.pageHeightMm*i),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*i)),h={start:0,end:-1};let g=null,w=null,b=null,_=null,I=[],P=0,F=[],Y=0,G=new AbortController;const he=[];function $e(){const p=g;p.innerHTML="",w=document.createElement("div"),w.style.cssText=`width:${m}px;margin:0 auto;`,b=document.createElement("div"),_=document.createElement("div"),w.appendChild(b),I=[];const R=Math.min(e.pages.length,3+a*2);for(let z=0;z<R;z++){const E=document.createElement("div");E.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,w.appendChild(E),I.push(E)}w.appendChild(_),p.appendChild(w)}async function _e(p,R){const z=Y,E=await C.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:R,end:R});he.push(...E.diagnostics);const A=E.plan.pages[R],X=await Ie(A,R,{...t,signal:G.signal},he);if(z!==Y||!g)return;const{widthPx:re,heightPx:ie}=te(A,r);let B=p.firstElementChild;(!B||B.tagName!=="CANVAS")&&(B=document.createElement("canvas"),p.innerHTML="",p.appendChild(B));const pe=Se(A,n,r,t.maxCanvasPixels);B.width=pe.width,B.height=pe.height,B.style.width=`${re}px`,B.style.height=`${ie}px`;const j=B.getContext("2d");if(j){j.setTransform(1,0,0,1,0,0),j.scale(n,n),j.fillStyle="#ffffff",j.fillRect(0,0,re,ie);for(const He of A.components)de(j,He,i,r,o,s,X);B.dataset.canvasPage=String(R),p.style.height=`${ie}px`,p.style.width=`${re}px`}}function Be(p){Y++,h.start=p.start,h.end=p.end,b.style.height=`${p.start*l+d.slice(0,p.start).reduce((E,A)=>E+A,0)}px`;const R=e.pages.length-1-p.end;_.style.height=`${R*l+d.slice(p.end+1).reduce((E,A)=>E+A,0)}px`;const z=p.end-p.start+1;I.forEach((E,A)=>{if(A<z){E.style.display="";const X=p.start+A;E.style.height=`${d[X]??0}px`}else E.style.display="none"}),F=[];for(let E=p.start;E<=p.end;E++){const A=I[E-p.start];if(!A)continue;A.firstElementChild?.dataset?.canvasPage!==String(E)&&F.push(E)}ne()}function ne(){P||F.length===0||(P=requestAnimationFrame(()=>{P=0;let p=Math.max(1,c);for(;F.length>0&&p-- >0;){const R=F.shift(),z=I[R-h.start];z&&_e(z,R).catch(()=>{})}F.length>0&&ne()}))}function J(){P||(P=requestAnimationFrame(()=>{P=0;const p=g,R=xe({pageHeightsPx:d,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:a,gapPx:l});R.start!==h.start||R.end!==h.end?Be(R):ne()}))}let K=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");k(t.signal),G=new AbortController,t.signal?.addEventListener("abort",ge,{once:!0}),$.reportOutputDiagnostics(e,"canvas",t),g=p,$e(),p.addEventListener("scroll",J,{passive:!0}),typeof ResizeObserver<"u"&&(K=new ResizeObserver(()=>J()),K.observe(p)),J()},destroy(){Y++,G.abort(),t.signal?.removeEventListener("abort",ge),P&&cancelAnimationFrame(P),P=0,K?.disconnect(),K=null,g?.removeEventListener("scroll",J),F=[],w?.remove(),g=null},window(){return{...h}}};function ge(){G.abort(t.signal?.reason)}}function me(e,t,n){let r,i;if(typeof e=="string"){const o=u.PAPER_SIZES[e];if(!o)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);r=o.widthMm,i=o.heightMm}else typeof e=="number"?(r=e,i=t??297):(r=e.widthMm,i=e.heightMm);return n?{widthMm:i,heightMm:r}:{widthMm:r,heightMm:i}}class Le{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}repeat(t){return this.templateRepeat=t,this}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const o=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:s,heightMm:a}=me(t,typeof n=="number"?n:void 0,o.landscape),l=o.margins??{};return this.pending=new ke(this,{widthMm:s,heightMm:a,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}:{},...this.templateRepeat?{repeat:this.templateRepeat}:{},pages:this.pages}}}class ke{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,i={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...i}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,i={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:i}),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,i){return this.components.push({kind:"qrcode",leftMm:r,topMm:i,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 Le}function vt(e,t={}){return oe.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 D(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Z(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 yt(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 D(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function bt(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=me(t,void 0,e.landscape),r=n.widthMm,i=n.heightMm;return D(r,"纸张 widthMm"),D(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}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,i]of Object.entries(n))D(i,r,!0);return n}function Et(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,i=e.titleGapMm===void 0?4:e.titleGapMm;D(r,"titleHeightMm"),D(i,"titleGapMm",!0);const o=e.title!==void 0&&e.title.length>0,s=o?r+i:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:o,titleSpaceMm:s}}function Tt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};Z(t.align,"listOptions.align",!0),Z(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&D(r,`listOptions.${n}`,n==="paddingMm")}return t}function Rt(e){let t=0,n=0;for(const[r,i]of e.entries()){if(!i||typeof i.header!="string"||typeof i.field!="string"||!i.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);Z(i.align,`columns[${r}].align`,!0),Z(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&D(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(D(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function xt(e,t,n,r){const{fixedWidthMm:i,maxFlex:o}=Rt(e.columns);if(t==="page"&&i>r)throw new Error(`固定列宽 ${i}mm 超出页面可用宽度 ${r}mm`);const s=r-i;if(t==="page"&&o>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const a=o>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/o:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?n*(d??1):s*((d??1)/o)/a);return D(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:i,maxFlex:o}}function St(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}=yt(e),r=bt(e);let i=r.widthMm;const o=r.heightMm,s=Mt(e);let a=i-s.marginLeftMm-s.marginRightMm;const l=o-s.marginTopMm-s.marginBottomMm;if(t==="page"&&a<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=Et(e,l),g=Tt(e),{columns:w,fixedWidthMm:b,maxFlex:_}=xt(e,t,n,a);t==="wide"&&(a=w.reduce((P,F)=>P+F.widthMm,0),D(a,"宽表总列宽"),i=a+s.marginLeftMm+s.marginRightMm,D(i,"宽表总宽度"));const I={widthMm:i,heightMm:o,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&I.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:a,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),I.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:w,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||_>0?a:b}),e.params===void 0?{pages:[I]}:{params:e.params,pages:[I]}}function Ct(e){if(e.components!==void 0&&e.pages!==void 0)throw new TypeError("标签 components 与 pages 只能选择一种");const{dataset:t,rowKey:n,copies:r,params:i}=e,o=e.pages??[{components:e.components??[]}],s={repeat:{dataset:t,...n===void 0?{}:{rowKey:n},...r===void 0?{}:{copies:r}},...i===void 0?{}:{params:i},pages:o.map(l=>({widthMm:l.widthMm??e.widthMm??80,heightMm:l.heightMm??e.heightMm??55,marginTopMm:0,marginRightMm:0,marginBottomMm:0,marginLeftMm:0,components:l.components,...l.meta===void 0?{}:{meta:l.meta}}))},a=M.validateReportTemplate(s);if(!a.ok)throw new M.ReportTemplateError(a.errors);return JSON.parse(JSON.stringify(s))}function Pt(e){return e}class N extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function O(e){return JSON.parse(JSON.stringify(e))}function x(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function ve(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new N("history","修订号无效或已达上限");return String(t+1)}function At(e,t={}){const n=async(s,a)=>{x(a);const l=await e.read(s,a);return x(a),l?O(l):void 0},r=async(s,a)=>{const l=await n(s,a.signal);if((l?.revision??null)!==a.expectedRevision)throw new N("conflict","模板已变化,请重新读取后提交");return l},i=async(s,a,l)=>{if(x(a.signal),!await e.compareAndSwap(s.id,a.expectedRevision,O(s),{signal:a.signal,...l?{publication:O(l)}:{}}))throw new N("conflict","模板已被其他请求更新");return O(s)},o=async(s,a,l,c)=>{if(t.beforePublish){x(l.signal);const g=await t.beforePublish({document:M.parseReportTemplate(a),previous:s.published?M.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new N("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");x(l.signal)}const d=ve(s),m=M.parseReportTemplate({...a,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),i({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{x(s);const a=await e.list(s);return x(s),O(a)},get:async(s,a={})=>{const l=await n(s,a.signal),c=a.draft?l?.draft:l?.published;return c?M.parseReportTemplate(c):void 0},history:async(s,a)=>{x(a);const l=await e.history(s,a);return x(a),O(l)},saveDraft:async(s,a)=>{a={...a},x(a.signal);const l=M.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await r(l.id,a),d=ve(c);return i({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},a)},publish:async(s,a)=>{a={...a};const l=await r(s,a);if(!l)throw new N("missing","模板不存在");if(!l.draft)throw new N("draft","没有可发布的草稿");return o(l,l.draft,a)},rollback:async(s,a,l)=>{l={...l};const c=await r(s,l);if(!c)throw new N("missing","模板不存在");x(l.signal);const d=await e.getVersion(s,a,l.signal);if(!d)throw new N("history","历史修订不存在");return o(c,d.document,l,a)}}}function It(){const e=new Map,t=new Map;return{read:async(n,r)=>{x(r);const i=e.get(n);return i?O(i):void 0},list:async n=>(x(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:o})=>({id:r,revision:i,...o?{publishedRevision:o}:{}}))),history:async(n,r)=>(x(r),Array.from(t.get(n)?.values()??[],i=>O(i))),getVersion:async(n,r,i)=>{x(i);const o=t.get(n)?.get(r);return o?O(o):void 0},compareAndSwap:async(n,r,i,o)=>{if(x(o.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new N("history","状态 ID 与存储 ID 不一致");const s=O(i),a=o.publication;if(a){const l=t.get(n)??new Map;if(l.has(a.revision)||a.revision!==i.revision||a.document.id!==n)throw new N("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(a.revision,O(a)),t.set(n,l)}return e.set(n,s),!0}}}function Lt(e,t){const n=e.publishedRevision??e.published?.revision;for(const r of[e.draftRevision,n])if(r!==void 0&&(typeof r!="string"||!r.trim()))throw new TypeError("模板生命周期修订应为非空字符串");if(e.draftRevision!==void 0&&e.draftRevision!==t.revision)throw new TypeError("可编辑文档应与草稿修订一致");if(e.published&&(e.published.id!==t.id||e.published.revision!==n))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&n!==void 0&&n!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...n===void 0?{}:{publishedRevision:n}}}function kt(e,t){const n=M.parseReportTemplate(e);if(t.id===n.id)throw new Error("复制模板应使用新的 ID");const{revision:r,...i}=n;return M.parseReportTemplate({...i,id:t.id,name:t.name})}function Dt(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,n=new Map,r=[];for(const i of e){const o=M.parseReportTemplate(i.document);if(t.has(o.id))throw new Error(`模板 ID 重复:${o.id}`);if(i.category!==void 0&&(typeof i.category!="string"||i.category.length>128)||i.tags!==void 0&&(!Array.isArray(i.tags)||i.tags.length>20||i.tags.some(c=>typeof c!="string"||c.length>128)))throw new TypeError("模板分类和标签无效");const s=Lt(i,o),{template:a,...l}=o;t.set(o.id,o),i.published?n.set(o.id,M.parseReportTemplate(i.published)):s.publishedRevision&&n.set(o.id,M.parseReportTemplate(o)),r.push({...l,...s,...i.category?{category:i.category}:{},...i.tags?{tags:[...i.tags]}:{}})}return r.sort((i,o)=>i.id<o.id?-1:1),{search:async i=>{ye(i.signal);const o=i.limit??30;if(!Number.isSafeInteger(o)||o<1||o>100)throw new RangeError("模板每页数量应为 1–100");const s=i.query?.trim().toLocaleLowerCase()??"",a=r.filter(c=>(!i.category||c.category===i.category)&&(!i.cursor||c.id>i.cursor)&&(!s||[c.id,c.name,c.description,...c.tags??[]].some(d=>d?.toLocaleLowerCase().includes(s)))),l=new Map;for(const c of r)c.category&&l.set(c.category,(l.get(c.category)??0)+1);return JSON.parse(JSON.stringify({items:a.slice(0,o),...a.length>o?{next:a[o-1].id}:{},categories:Array.from(l,([c,d])=>({id:c,label:c,count:d}))}))},get:async(i,o)=>{ye(o.signal);const s=o.mode==="published"?n.get(i):t.get(i);return s?M.parseReportTemplate(s):void 0}}}function ye(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function Ft(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
7
|
+
`)}function Nt(e,t){const n=e[e.length-1];e.length>1&&n?.length===1&&n[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Ot(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const n=[[]];let r="",i=!1,o=!1,s=0;function a(){if(++s>t)throw new Error("Clipboard cell limit exceeded");n[n.length-1].push(r),r="",o=!1}for(let l=0;l<e.length;l++){const c=e[l];if(i){if(c!=='"'){r+=c;continue}if(e[l+1]==='"'){r+='"',l++;continue}i=!1,o=!0;continue}if(c==='"'&&!r&&!o){i=!0;continue}if(c===" "){a();continue}if(c==="\r"||c===`
|
|
8
8
|
`){a(),n.push([]),c==="\r"&&e[l+1]===`
|
|
9
|
-
`&&l++;continue}if(o)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return a(),Ft(n,e),n}class De extends Error{constructor(t,n,r){const i=typeof n.label=="string"?n.label:"单元格",o={definition:`${i}的编辑器配置无效`,type:`${i}的编辑器与数据类型不一致`,required:`${i}不能为空`,min:`${i}不能小于 ${r}`,max:`${i}不能大于 ${r}`,precision:`${i}最多保留 ${r} 位小数`,length:`${i}最多允许 ${r} 个字符`,choice:`${i}请选择有效选项`,date:`${i}请输入有效日期(YYYY-MM-DD)`};super(o[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 Fe(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 Ot(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function $t(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&&Ot(t)>e.precision&&v(e,"precision",e.precision)}function _t(e,t){Fe(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 Ht(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 zt(e){[e.min,e.max].some(t=>t!==void 0&&!Fe(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function Bt(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 i of t.options)(!i||typeof i.value!==n||typeof i.value=="number"&&!Number.isFinite(i.value))&&v(t,"definition"),i.label!==void 0&&typeof i.label!="string"&&v(t,"definition"),r.has(i.value)&&v(t,"definition"),r.add(i.value)}function Wt(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 Ne(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),Wt(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"&&Ht(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&zt(t),t.type==="enum"&&Bt(e,t)}function jt(e,t,n){if(!e.editable)throw new f.ReportCellEditError("readonly");n&&Ne(e,n);const r=f.parseReportCellInput(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"&&$t(n,r),n.type==="date"&&_t(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(i=>Object.is(i.value,r))&&v(n,"choice"),r)):r}class y extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function q(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function ee(e,t=1){const n=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new y("limit");q(e.signal),Math.floor(e.scanned/2048)>n&&(await e.yieldToHost(),q(e.signal))}function he(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function Me(e,t,n){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(a=>Number.isSafeInteger(a)&&a>=0))throw new y("selection");const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r?.grid||t.rowIndex>=r.grid.cells.length)throw new y("selection");const i=r.grid.colWidthsMm?.length??r.grid.cells.reduce((a,l)=>Math.max(a,l.length),1);if(t.columnIndex>=i)throw new y("selection");const o=r.table,s=e.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(o&&s&&o.id===s.id){const a=s.columnKeys.indexOf(o.columnKeys[t.columnIndex]??"");if(a<0)throw new y("selection");return{grid:o.id,row:he(r)+t.rowIndex,column:a}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function Ut(e,t,n){const r=Me(e,t.anchor,t.anchor),i=Me(e,t.focus,t.anchor);if(r.grid!==i.grid)throw new y("selection");const o=(Math.abs(r.row-i.row)+1)*(Math.abs(r.column-i.column)+1);if(!Number.isSafeInteger(o)||o>n)throw new y("limit");return{grid:r.grid,rowStart:Math.min(r.row,i.row),rowEnd:Math.max(r.row,i.row),columnStart:Math.min(r.column,i.column),columnEnd:Math.max(r.column,i.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function qt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Gt(e){if(e.valueType==="text"||e.valueType==="boolean"||qt(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new y("precision");return t}function Vt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Gt(t):null;r===null?e.excluded++:e.values.push(r)}function Yt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function Xt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function Kt(e,t,n,r){const i=r.origin?he(e)+t:t,o=Xt(e,n,r);return i<r.rowStart||i>r.rowEnd||o<r.columnStart||o>r.columnEnd?null:`${r.grid}:${i}:${o}`}function Jt(e,t){const n=t.origin?he(e):0,r=Math.max(0,t.rowStart-n),i=Math.min(e.grid.cells.length,t.rowEnd-n+1);return i>r?i:0}async function Zt(e,t,n,r,i){const o=e.grid;if(t>r.maxScanned)throw new y("limit");const s=o.colWidthsMm?.length??o.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>r.maxScanned)throw new y("limit");const a=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await r.yieldToHost(),q(r.signal));let c=0;for(const d of o.cells[l]){for(await ee(r);c<s&&(a.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(o.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await ee(r,m-1);for(let w=c;w<c+m;w++)a.set(w,h);const g=Kt(e,l,c,n);g&&Vt(i,d,g),c+=m}}}async function Qt(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await ee(n);const o=e.pages[i];for(let s=0;s<o.components.length;s++){await ee(n);const a=o.components[s];if(!a.grid||!Yt(a,i,s,t)||a.table&&a.table.role!=="body")continue;const l=Jt(a,t);l&&await Zt(a,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new y("overflow");return e}function en(e){let t=0,n=0;for(const r of e){const i=r-n,o=V(t+i);n=o-t-i,t=o}return t}async function Ee(e,t){let n=[...e],r=new Array(e.length);for(let o=1;o<e.length;o*=2){for(let s=0;s<e.length;s+=o*2){const a=Math.min(s+o,e.length),l=Math.min(s+o*2,e.length);let c=s,d=a;for(let m=s;m<l;m++)r[m]=d>=l||c<a&&n[c]<=n[d]?n[c++]:n[d++],m%2048===0&&(await t.yieldToHost(),q(t.signal))}[n,r]=[r,n]}const i=Math.floor(n.length/2);return n.length%2?n[i]:V(n[i-1]/2+n[i]/2)}function tn(e){const t=en(e);let n=1/0,r=-1/0;for(const i of e)n=Math.min(n,i),r=Math.max(r,i);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:n,MAX:r,COUNT:e.length}}function Oe(e,t){if(typeof e!="string"||e.length>256)throw new y("expression");const n=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!n.length||n.length>64)throw new y("expression");let r=0;function i(a){if(a>16)throw new y("expression");const l=n[r++];if(l==="+"||l==="-")return(l==="-"?-1:1)*i(a+1);if(l==="("){const c=o(0,a+1);if(n[r++]!==")")throw new y("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return V(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return V(Number(l));throw new y("expression")}function o(a,l){let c=i(l);for(;r<n.length;){const d=n[r],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<a)break;r++;const h=o(m+1,l+1);if(d==="/"&&h===0)throw new y("division");c=V(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=o(1,0);if(r!==n.length)throw new y("expression");return s}function nn(e){const t=e.maxCells??1e5,n=e.maxScannedCells??2e5,r=e.precision??2;if(![t,n].every(i=>Number.isSafeInteger(i)&&i>=1&&i<=2e6))throw new y("limit");if(!Number.isInteger(r)||r<0||r>12)throw new y("precision");return{maxCells:t,maxScanned:n,precision:r}}async function rn(e,t,n={}){const r=nn(n),i={scanned:0,maxScanned:r.maxScanned,signal:n.signal,yieldToHost:n.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};q(i.signal);const o=await Qt(e,Ut(e,t,r.maxCells),i),s=n.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new y("expression");let a=null;if(s==="count")a=o.values.length;else if(o.values.length)if(s==="median")a=await Ee(o.values,i);else{const l=tn(o.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await Ee(o.values,i)),a=Oe(n.expression??"",l)):a=l[s.toUpperCase()]}if(q(i.signal),a!==null&&Number.isInteger(a)&&!Number.isSafeInteger(a))throw new y("precision");return{value:a,formatted:a===null?"—":a.toFixed(r.precision),numericCells:o.values.length,excludedCells:o.excluded,selectedCells:o.selected,precision:r.precision}}exports.DEFAULT_BORDER_PT=I.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=I.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=I.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=I.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=I.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=I.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=I.SCHEMA_VERSION_MACH;exports.evalStyleRule=Y.evalStyleRule;exports.formatValue=Y.formatValue;exports.parseDateLocal=Y.parseDateLocal;exports.toExcelNumberFormat=Y.toExcelNumberFormat;exports.toNumber=Y.toNumber;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.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.RENDER_PLAN_SCHEMA_VERSION=W.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=W.isImageBackedComponent;exports.isRichText=W.isRichText;exports.assertRenderPlan=te.assertRenderPlan;exports.validateComponent=te.validateComponent;exports.validatePage=te.validatePage;exports.validateRenderPlan=te.validateRenderPlan;exports.datasetJsonSchema=ae.datasetJsonSchema;exports.validateDatasetRows=ae.validateDatasetRows;exports.charWidthEm=$.charWidthEm;exports.createCanvasMeasurer=$.createCanvasMeasurer;exports.createHeuristicMeasurer=$.createHeuristicMeasurer;exports.heuristicMeasurer=$.heuristicMeasurer;exports.measureTextMm=$.measureTextMm;exports.wrapText=$.wrapText;exports.PaginateCellLimitError=f.PaginateCellLimitError;exports.PaginatePageLimitError=f.PaginatePageLimitError;exports.ReportCellEditError=f.ReportCellEditError;exports.ReportSourceError=f.ReportSourceError;exports.applyReportCellEdit=f.applyReportCellEdit;exports.applyReportCellEditBatch=f.applyReportCellEditBatch;exports.applyReportEditResult=f.applyReportEditResult;exports.countTemplatePages=f.countTemplatePages;exports.createReportCellEdit=f.createReportCellEdit;exports.createReportCellEditBatch=f.createReportCellEditBatch;exports.createReportCellResolver=f.createReportCellResolver;exports.createReportEditSession=f.createReportEditSession;exports.createReportSource=f.createReportSource;exports.defineReport=f.defineReport;exports.diffReportTemplates=f.diffReportTemplates;exports.estimateListLayoutCells=f.estimateListLayoutCells;exports.formatReportCellEdit=f.formatReportCellEdit;exports.getReportCellContext=f.getReportCellContext;exports.getReportEditSession=f.getReportEditSession;exports.paginateTemplate=f.paginateTemplate;exports.paginateTemplatePages=f.paginateTemplatePages;exports.parseReportCellInput=f.parseReportCellInput;exports.projectListColumns=f.projectListColumns;exports.registerReportEditSession=f.registerReportEditSession;exports.relocateReportCellEdits=f.relocateReportCellEdits;exports.reportCellEditKey=f.reportCellEditKey;exports.reviewReportTemplate=f.reviewReportTemplate;exports.summarizeReportCellEdits=f.summarizeReportCellEdits;exports.resolveGridLayout=se.resolveGridLayout;exports.OutputAssetError=j.OutputAssetError;exports.resolvePlanAssets=j.resolvePlanAssets;exports.OutputFidelityError=O.OutputFidelityError;exports.inspectOutputCapabilities=O.inspectOutputCapabilities;exports.reportOutputDiagnostics=O.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=E.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=E.ReportTemplateError;exports.createTemplateRegistry=E.createTemplateRegistry;exports.defineReportTemplate=E.defineReportTemplate;exports.parseReportTemplate=E.parseReportTemplate;exports.serializeReportTemplate=E.serializeReportTemplate;exports.validateReportTemplate=E.validateReportTemplate;exports.validateReportTemplateDocument=E.validateReportTemplateDocument;exports.ReportParamValidationError=z.ReportParamValidationError;exports.assertReportParams=z.assertReportParams;exports.formatReportDateRange=z.formatReportDateRange;exports.isReportDate=z.isReportDate;exports.isReportMonth=z.isReportMonth;exports.isReportYear=z.isReportYear;exports.parseReportDateRange=z.parseReportDateRange;exports.reportParamsJsonSchema=z.reportParamsJsonSchema;exports.validateReportParamDefinitions=z.validateReportParamDefinitions;exports.validateReportParams=z.validateReportParams;exports.TreeRowLimitError=le.TreeRowLimitError;exports.createTreeTable=le.createTreeTable;exports.validateTreeOptions=le.validateTreeOptions;exports.PageBuilder=ke;exports.ReportCalculationError=y;exports.ReportCellFieldError=De;exports.ReportTemplateStoreError=F;exports.TemplateBuilder=Le;exports.calculateReportSelection=rn;exports.classOf=S;exports.cloneReportTemplate=Lt;exports.columnsFromContract=vt;exports.computePageWindow=Re;exports.createCanvasPager=ft;exports.createLocalTemplateCatalog=kt;exports.createMemoryTemplateStore=At;exports.createProviderReport=Ct;exports.createTableTemplate=St;exports.createTemplate=wt;exports.createTemplateManager=Pt;exports.evaluateReportAggregateExpression=Oe;exports.formatReportClipboard=Dt;exports.measurePageSizePx=ne;exports.parseReportCellFieldInput=jt;exports.parseReportClipboard=Nt;exports.planFontSizePx=ot;exports.renderComponent=ce;exports.renderPage=xe;exports.renderPlan=et;exports.renderPlanToCanvas=ht;exports.renderPlanToCanvasAsync=pt;exports.renderPlanToImages=mt;exports.resolvePaper=ue;exports.validateReportCellFieldDefinition=Ne;
|
|
9
|
+
`&&l++;continue}if(o)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return a(),Nt(n,e),n}class De extends Error{constructor(t,n,r){const i=typeof n.label=="string"?n.label:"单元格",o={definition:`${i}的编辑器配置无效`,type:`${i}的编辑器与数据类型不一致`,required:`${i}不能为空`,min:`${i}不能小于 ${r}`,max:`${i}不能大于 ${r}`,precision:`${i}最多保留 ${r} 位小数`,length:`${i}最多允许 ${r} 个字符`,choice:`${i}请选择有效选项`,date:`${i}请输入有效日期(YYYY-MM-DD)`};super(o[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 Fe(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 $t(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function _t(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&&$t(t)>e.precision&&v(e,"precision",e.precision)}function Bt(e,t){Fe(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 Ht(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 zt(e){[e.min,e.max].some(t=>t!==void 0&&!Fe(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function Wt(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 i of t.options)(!i||typeof i.value!==n||typeof i.value=="number"&&!Number.isFinite(i.value))&&v(t,"definition"),i.label!==void 0&&typeof i.label!="string"&&v(t,"definition"),r.has(i.value)&&v(t,"definition"),r.add(i.value)}function Ut(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 Ne(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),Ut(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"&&Ht(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&zt(t),t.type==="enum"&&Wt(e,t)}function jt(e,t,n){if(!e.editable)throw new f.ReportCellEditError("readonly");n&&Ne(e,n);const r=f.parseReportCellInput(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"&&_t(n,r),n.type==="date"&&Bt(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(i=>Object.is(i.value,r))&&v(n,"choice"),r)):r}class y extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function q(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function Q(e,t=1){const n=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new y("limit");q(e.signal),Math.floor(e.scanned/2048)>n&&(await e.yieldToHost(),q(e.signal))}function ue(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function be(e,t,n){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(a=>Number.isSafeInteger(a)&&a>=0))throw new y("selection");const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r?.grid||t.rowIndex>=r.grid.cells.length)throw new y("selection");const i=r.grid.colWidthsMm?.length??r.grid.cells.reduce((a,l)=>Math.max(a,l.length),1);if(t.columnIndex>=i)throw new y("selection");const o=r.table,s=e.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(o&&s&&o.id===s.id){const a=s.columnKeys.indexOf(o.columnKeys[t.columnIndex]??"");if(a<0)throw new y("selection");return{grid:o.id,row:ue(r)+t.rowIndex,column:a}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function qt(e,t,n){const r=be(e,t.anchor,t.anchor),i=be(e,t.focus,t.anchor);if(r.grid!==i.grid)throw new y("selection");const o=(Math.abs(r.row-i.row)+1)*(Math.abs(r.column-i.column)+1);if(!Number.isSafeInteger(o)||o>n)throw new y("limit");return{grid:r.grid,rowStart:Math.min(r.row,i.row),rowEnd:Math.max(r.row,i.row),columnStart:Math.min(r.column,i.column),columnEnd:Math.max(r.column,i.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function Gt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Vt(e){if(e.valueType==="text"||e.valueType==="boolean"||Gt(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new y("precision");return t}function Yt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Vt(t):null;r===null?e.excluded++:e.values.push(r)}function Jt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function Kt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function Xt(e,t,n,r){const i=r.origin?ue(e)+t:t,o=Kt(e,n,r);return i<r.rowStart||i>r.rowEnd||o<r.columnStart||o>r.columnEnd?null:`${r.grid}:${i}:${o}`}function Zt(e,t){const n=t.origin?ue(e):0,r=Math.max(0,t.rowStart-n),i=Math.min(e.grid.cells.length,t.rowEnd-n+1);return i>r?i:0}async function Qt(e,t,n,r,i){const o=e.grid;if(t>r.maxScanned)throw new y("limit");const s=o.colWidthsMm?.length??o.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>r.maxScanned)throw new y("limit");const a=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await r.yieldToHost(),q(r.signal));let c=0;for(const d of o.cells[l]){for(await Q(r);c<s&&(a.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(o.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await Q(r,m-1);for(let w=c;w<c+m;w++)a.set(w,h);const g=Xt(e,l,c,n);g&&Yt(i,d,g),c+=m}}}async function en(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await Q(n);const o=e.pages[i];for(let s=0;s<o.components.length;s++){await Q(n);const a=o.components[s];if(!a.grid||!Jt(a,i,s,t)||a.table&&a.table.role!=="body")continue;const l=Zt(a,t);l&&await Qt(a,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new y("overflow");return e}function tn(e){let t=0,n=0;for(const r of e){const i=r-n,o=V(t+i);n=o-t-i,t=o}return t}async function Me(e,t){let n=[...e],r=new Array(e.length);for(let o=1;o<e.length;o*=2){for(let s=0;s<e.length;s+=o*2){const a=Math.min(s+o,e.length),l=Math.min(s+o*2,e.length);let c=s,d=a;for(let m=s;m<l;m++)r[m]=d>=l||c<a&&n[c]<=n[d]?n[c++]:n[d++],m%2048===0&&(await t.yieldToHost(),q(t.signal))}[n,r]=[r,n]}const i=Math.floor(n.length/2);return n.length%2?n[i]:V(n[i-1]/2+n[i]/2)}function nn(e){const t=tn(e);let n=1/0,r=-1/0;for(const i of e)n=Math.min(n,i),r=Math.max(r,i);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:n,MAX:r,COUNT:e.length}}function Oe(e,t){if(typeof e!="string"||e.length>256)throw new y("expression");const n=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!n.length||n.length>64)throw new y("expression");let r=0;function i(a){if(a>16)throw new y("expression");const l=n[r++];if(l==="+"||l==="-")return(l==="-"?-1:1)*i(a+1);if(l==="("){const c=o(0,a+1);if(n[r++]!==")")throw new y("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return V(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return V(Number(l));throw new y("expression")}function o(a,l){let c=i(l);for(;r<n.length;){const d=n[r],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<a)break;r++;const h=o(m+1,l+1);if(d==="/"&&h===0)throw new y("division");c=V(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=o(1,0);if(r!==n.length)throw new y("expression");return s}function rn(e){const t=e.maxCells??1e5,n=e.maxScannedCells??2e5,r=e.precision??2;if(![t,n].every(i=>Number.isSafeInteger(i)&&i>=1&&i<=2e6))throw new y("limit");if(!Number.isInteger(r)||r<0||r>12)throw new y("precision");return{maxCells:t,maxScanned:n,precision:r}}async function on(e,t,n={}){const r=rn(n),i={scanned:0,maxScanned:r.maxScanned,signal:n.signal,yieldToHost:n.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};q(i.signal);const o=await en(e,qt(e,t,r.maxCells),i),s=n.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new y("expression");let a=null;if(s==="count")a=o.values.length;else if(o.values.length)if(s==="median")a=await Me(o.values,i);else{const l=nn(o.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await Me(o.values,i)),a=Oe(n.expression??"",l)):a=l[s.toUpperCase()]}if(q(i.signal),a!==null&&Number.isInteger(a)&&!Number.isSafeInteger(a))throw new y("precision");return{value:a,formatted:a===null?"—":a.toFixed(r.precision),numericCells:o.values.length,excludedCells:o.excluded,selectedCells:o.selected,precision:r.precision}}exports.DEFAULT_BORDER_PT=L.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=L.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=L.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=L.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=L.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=L.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=L.SCHEMA_VERSION_MACH;exports.ReportBindingError=U.ReportBindingError;exports.evalStyleRule=U.evalStyleRule;exports.formatValue=U.formatValue;exports.parseDateLocal=U.parseDateLocal;exports.resolveComponentBinding=U.resolveComponentBinding;exports.toExcelNumberFormat=U.toExcelNumberFormat;exports.toNumber=U.toNumber;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.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.RENDER_PLAN_SCHEMA_VERSION=W.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=W.isImageBackedComponent;exports.isRichText=W.isRichText;exports.assertRenderPlan=ee.assertRenderPlan;exports.validateComponent=ee.validateComponent;exports.validatePage=ee.validatePage;exports.validateRenderPlan=ee.validateRenderPlan;exports.datasetJsonSchema=oe.datasetJsonSchema;exports.validateDatasetRows=oe.validateDatasetRows;exports.OutputAssetError=C.OutputAssetError;exports.charWidthEm=C.charWidthEm;exports.createCanvasMeasurer=C.createCanvasMeasurer;exports.createHeuristicMeasurer=C.createHeuristicMeasurer;exports.heuristicMeasurer=C.heuristicMeasurer;exports.measureTextMm=C.measureTextMm;exports.resolvePlanAssets=C.resolvePlanAssets;exports.wrapText=C.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=f.DEFAULT_LABEL_PAGE_LIMIT;exports.PaginateCellLimitError=f.PaginateCellLimitError;exports.PaginatePageLimitError=f.PaginatePageLimitError;exports.ReportCellEditError=f.ReportCellEditError;exports.ReportSourceError=f.ReportSourceError;exports.applyReportCellEdit=f.applyReportCellEdit;exports.applyReportCellEditBatch=f.applyReportCellEditBatch;exports.applyReportEditResult=f.applyReportEditResult;exports.countTemplatePages=f.countTemplatePages;exports.createReportCellEdit=f.createReportCellEdit;exports.createReportCellEditBatch=f.createReportCellEditBatch;exports.createReportCellResolver=f.createReportCellResolver;exports.createReportEditSession=f.createReportEditSession;exports.createReportSource=f.createReportSource;exports.defineReport=f.defineReport;exports.diffReportTemplates=f.diffReportTemplates;exports.estimateListLayoutCells=f.estimateListLayoutCells;exports.formatReportCellEdit=f.formatReportCellEdit;exports.getReportCellContext=f.getReportCellContext;exports.getReportEditSession=f.getReportEditSession;exports.paginateTemplate=f.paginateTemplate;exports.paginateTemplatePages=f.paginateTemplatePages;exports.parseReportCellInput=f.parseReportCellInput;exports.projectListColumns=f.projectListColumns;exports.registerReportEditSession=f.registerReportEditSession;exports.relocateReportCellEdits=f.relocateReportCellEdits;exports.reportCellEditKey=f.reportCellEditKey;exports.reviewReportTemplate=f.reviewReportTemplate;exports.summarizeReportCellEdits=f.summarizeReportCellEdits;exports.resolveGridLayout=ae.resolveGridLayout;exports.OutputFidelityError=$.OutputFidelityError;exports.inspectOutputCapabilities=$.inspectOutputCapabilities;exports.reportOutputDiagnostics=$.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=M.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=M.ReportTemplateError;exports.createTemplateRegistry=M.createTemplateRegistry;exports.defineReportTemplate=M.defineReportTemplate;exports.parseReportTemplate=M.parseReportTemplate;exports.serializeReportTemplate=M.serializeReportTemplate;exports.validateReportTemplate=M.validateReportTemplate;exports.validateReportTemplateDocument=M.validateReportTemplateDocument;exports.ReportParamValidationError=H.ReportParamValidationError;exports.assertReportParams=H.assertReportParams;exports.formatReportDateRange=H.formatReportDateRange;exports.isReportDate=H.isReportDate;exports.isReportMonth=H.isReportMonth;exports.isReportYear=H.isReportYear;exports.parseReportDateRange=H.parseReportDateRange;exports.reportParamsJsonSchema=H.reportParamsJsonSchema;exports.validateReportParamDefinitions=H.validateReportParamDefinitions;exports.validateReportParams=H.validateReportParams;exports.TreeRowLimitError=se.TreeRowLimitError;exports.createTreeTable=se.createTreeTable;exports.validateTreeOptions=se.validateTreeOptions;exports.PageBuilder=ke;exports.ReportCalculationError=y;exports.ReportCellFieldError=De;exports.ReportTemplateStoreError=N;exports.TemplateBuilder=Le;exports.calculateReportSelection=on;exports.classOf=S;exports.cloneReportTemplate=kt;exports.columnsFromContract=vt;exports.computePageWindow=xe;exports.createCanvasPager=ft;exports.createLabelTemplate=Ct;exports.createLocalTemplateCatalog=Dt;exports.createMemoryTemplateStore=It;exports.createProviderReport=Pt;exports.createTableTemplate=St;exports.createTemplate=wt;exports.createTemplateManager=At;exports.evaluateReportAggregateExpression=Oe;exports.formatReportClipboard=Ft;exports.measurePageSizePx=te;exports.parseReportCellFieldInput=jt;exports.parseReportClipboard=Ot;exports.planFontSizePx=ot;exports.renderComponent=le;exports.renderPage=Re;exports.renderPlan=et;exports.renderPlanToCanvas=ht;exports.renderPlanToCanvasAsync=pt;exports.renderPlanToImages=mt;exports.resolvePaper=me;exports.validateReportCellFieldDefinition=Ne;
|
package/dist/index.d.cts
CHANGED
|
@@ -113,6 +113,18 @@ export declare function cloneReportTemplate(document: ReportTemplateDocument, id
|
|
|
113
113
|
name: string;
|
|
114
114
|
}): ReportTemplateDocument;
|
|
115
115
|
|
|
116
|
+
/** Serializable symbol settings. Encoders remain in the optional /codes entry. */
|
|
117
|
+
export declare interface CodeOptions {
|
|
118
|
+
/** Explicit content, including an empty value, takes precedence over legacy fallbackText. */
|
|
119
|
+
value?: string;
|
|
120
|
+
symbology?: "code128" | "code39" | "ean13" | "ean8";
|
|
121
|
+
errorCorrection?: "L" | "M" | "Q" | "H";
|
|
122
|
+
/** White modules around a symbol: QR >=4, linear >=10, EAN >=11. */
|
|
123
|
+
quietZoneModules?: number;
|
|
124
|
+
/** Human-readable content below a linear barcode. */
|
|
125
|
+
showText?: boolean;
|
|
126
|
+
}
|
|
127
|
+
|
|
116
128
|
/**
|
|
117
129
|
* 列值格式化(声明式、JSON 可序列化)。
|
|
118
130
|
* 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
|
|
@@ -139,6 +151,20 @@ export declare type ColumnFormat = {
|
|
|
139
151
|
/** 同一字段契约生成列语义和表头,业务侧无需复制另一份字段清单。 */
|
|
140
152
|
export declare function columnsFromContract(contract: DatasetContract, overrides?: Record<string, Partial<TableTemplateColumn>>): TableTemplateColumn[];
|
|
141
153
|
|
|
154
|
+
/** A literal own field of the current label record; expressions and paths are not evaluated. */
|
|
155
|
+
export declare interface ComponentBinding {
|
|
156
|
+
field: string;
|
|
157
|
+
format?: ValueFormat;
|
|
158
|
+
prefix?: string;
|
|
159
|
+
suffix?: string;
|
|
160
|
+
emptyText?: string;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export declare interface ComponentBindingContext {
|
|
164
|
+
dataset?: string;
|
|
165
|
+
rowIndex?: number;
|
|
166
|
+
}
|
|
167
|
+
|
|
142
168
|
export declare interface ComponentImageContext {
|
|
143
169
|
readonly component: Readonly<PlanComponent>;
|
|
144
170
|
readonly pageIndex: number;
|
|
@@ -219,6 +245,9 @@ export declare function createCanvasPager(plan: RenderPlan, options?: CanvasPage
|
|
|
219
245
|
/** 兼容旧 API:默认启发式测量 */
|
|
220
246
|
export declare function createHeuristicMeasurer(): TextMeasurer;
|
|
221
247
|
|
|
248
|
+
/** One declaration covers record binding, fixed paper size, copies and ordered multi-face labels. */
|
|
249
|
+
export declare function createLabelTemplate(options: LabelTemplateOptions): ReportTemplate;
|
|
250
|
+
|
|
222
251
|
/** Local catalog reference; an enterprise host supplies the same search/get contract with server filtering. */
|
|
223
252
|
export declare function createLocalTemplateCatalog(input: LocalTemplateCatalogItem[]): ReportTemplateCatalogProvider;
|
|
224
253
|
|
|
@@ -323,6 +352,9 @@ export declare const DEFAULT_FONT_FAMILY = "\"Microsoft YaHei\", sans-serif";
|
|
|
323
352
|
/** 默认字号(pt) */
|
|
324
353
|
export declare const DEFAULT_FONT_PT = 10.5;
|
|
325
354
|
|
|
355
|
+
/** Labels are bounded even when a host omits its normal report page budget. */
|
|
356
|
+
export declare const DEFAULT_LABEL_PAGE_LIMIT = 10000;
|
|
357
|
+
|
|
326
358
|
/** 默认描边色 */
|
|
327
359
|
export declare const DEFAULT_STROKE_COLOR = "#333333";
|
|
328
360
|
|
|
@@ -480,6 +512,18 @@ export declare function isReportYear(value: string): boolean;
|
|
|
480
512
|
|
|
481
513
|
export declare function isRichText(comp: PlanComponent): boolean;
|
|
482
514
|
|
|
515
|
+
export declare interface LabelTemplateOptions extends ReportTemplateRepeat {
|
|
516
|
+
widthMm?: number;
|
|
517
|
+
heightMm?: number;
|
|
518
|
+
params?: ReportParamDef[];
|
|
519
|
+
/** A single face. Mutually exclusive with pages. */
|
|
520
|
+
components?: TemplateComponent[];
|
|
521
|
+
pages?: LabelTemplatePage[];
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/** Each face inherits the label size; declare several faces for front/back or companion labels. */
|
|
525
|
+
export declare type LabelTemplatePage = Pick<TemplatePage, "components" | "meta"> & Partial<Pick<TemplatePage, "widthMm" | "heightMm">>;
|
|
526
|
+
|
|
483
527
|
/** 默认行高倍数(基线距 = 字号 × 该系数) */
|
|
484
528
|
export declare const LINE_HEIGHT = 1.35;
|
|
485
529
|
|
|
@@ -798,6 +842,10 @@ export declare function parseReportDateRange(value: string): ReportDateRange | u
|
|
|
798
842
|
export declare function parseReportTemplate(input: unknown): ReportTemplateDocument;
|
|
799
843
|
|
|
800
844
|
export declare interface PlanComponent {
|
|
845
|
+
/** Optional QR/barcode encoding configuration; no encoder is loaded by the core. */
|
|
846
|
+
code?: CodeOptions;
|
|
847
|
+
/** Template-only binding; resolved and removed before constructing the output plan. */
|
|
848
|
+
binding?: ComponentBinding;
|
|
801
849
|
/** Template page furniture repeats per page and reserves its vertical band. */
|
|
802
850
|
pageAnchor?: "header" | "footer";
|
|
803
851
|
kind: ComponentKind;
|
|
@@ -923,6 +971,14 @@ export declare function renderPlanToImages(plan: RenderPlan, options?: ImageRend
|
|
|
923
971
|
/** 模板存储文档版本;与渲染计划版本独立演进。 */
|
|
924
972
|
export declare const REPORT_TEMPLATE_DOCUMENT_VERSION = "1.0";
|
|
925
973
|
|
|
974
|
+
export declare class ReportBindingError extends Error {
|
|
975
|
+
readonly path: string;
|
|
976
|
+
readonly rowIndex?: number | undefined;
|
|
977
|
+
readonly field?: string | undefined;
|
|
978
|
+
readonly code = "report-binding";
|
|
979
|
+
constructor(path: string, message: string, rowIndex?: number | undefined, field?: string | undefined);
|
|
980
|
+
}
|
|
981
|
+
|
|
926
982
|
export declare class ReportCalculationError extends Error {
|
|
927
983
|
readonly code: ReportCalculationErrorCode;
|
|
928
984
|
constructor(code: ReportCalculationErrorCode);
|
|
@@ -1334,7 +1390,7 @@ export declare class ReportSourceError extends Error {
|
|
|
1334
1390
|
export declare interface ReportTaskEvent {
|
|
1335
1391
|
taskId: string;
|
|
1336
1392
|
correlationId?: string;
|
|
1337
|
-
stage: "query" | "validate" | "layout" | "encode";
|
|
1393
|
+
stage: "query" | "validate" | "layout" | "assets" | "encode";
|
|
1338
1394
|
status: "started" | "completed" | "failed";
|
|
1339
1395
|
reportId?: string;
|
|
1340
1396
|
completed?: number;
|
|
@@ -1353,6 +1409,8 @@ export declare interface ReportTemplate {
|
|
|
1353
1409
|
schemaVersion?: string;
|
|
1354
1410
|
/** 参数定义(可选;宿主也可经 ReportPreview 的 paramDefs prop 提供,prop 优先) */
|
|
1355
1411
|
params?: ReportParamDef[];
|
|
1412
|
+
/** Fixed label pages repeat in record → copy → template-page order. */
|
|
1413
|
+
repeat?: ReportTemplateRepeat;
|
|
1356
1414
|
pages: TemplatePage[];
|
|
1357
1415
|
}
|
|
1358
1416
|
|
|
@@ -1476,6 +1534,16 @@ export declare interface ReportTemplateRegistry {
|
|
|
1476
1534
|
remove(id: string): boolean;
|
|
1477
1535
|
}
|
|
1478
1536
|
|
|
1537
|
+
/** Every record emits its copies, each containing all template pages in their original order. */
|
|
1538
|
+
export declare interface ReportTemplateRepeat {
|
|
1539
|
+
dataset: string;
|
|
1540
|
+
rowKey?: string;
|
|
1541
|
+
/** Whole copies per record, 1..1000. The field value must be a number, never a numeric string. */
|
|
1542
|
+
copies?: number | {
|
|
1543
|
+
field: string;
|
|
1544
|
+
};
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1479
1547
|
export declare interface ReportTemplateReview {
|
|
1480
1548
|
ok: boolean;
|
|
1481
1549
|
changes?: ReportTemplateDiff;
|
|
@@ -1497,6 +1565,8 @@ export declare interface ReportTemplateReviewIssue {
|
|
|
1497
1565
|
pageIndex?: number;
|
|
1498
1566
|
componentIndex?: number;
|
|
1499
1567
|
field?: string;
|
|
1568
|
+
/** Original structured output finding, retained for trusted publication resource handling. */
|
|
1569
|
+
diagnostic?: OutputDiagnostic;
|
|
1500
1570
|
}
|
|
1501
1571
|
|
|
1502
1572
|
export declare interface ReportTemplateReviewOptions {
|
|
@@ -1547,6 +1617,9 @@ export declare interface ReportTemplateVersion {
|
|
|
1547
1617
|
*/
|
|
1548
1618
|
export declare function resolveBoxBorders(style: Pick<ComponentStyle, "borderTop" | "borderRight" | "borderBottom" | "borderLeft"> | undefined): BoxBorders;
|
|
1549
1619
|
|
|
1620
|
+
/** The shared binding semantics for actual pagination and designer samples; never evaluates code. */
|
|
1621
|
+
export declare function resolveComponentBinding(binding: ComponentBinding, row: Record<string, unknown>, context?: ComponentBindingContext): string;
|
|
1622
|
+
|
|
1550
1623
|
/** 解析后的字号(px 值已按 dpi 换算;pt 值供 PDF 使用) */
|
|
1551
1624
|
export declare interface ResolvedFontSize {
|
|
1552
1625
|
fontSizePt: number;
|
|
@@ -1680,6 +1753,9 @@ export declare class TemplateBuilder {
|
|
|
1680
1753
|
readonly pages: TemplatePage[];
|
|
1681
1754
|
private pending;
|
|
1682
1755
|
private templateParams;
|
|
1756
|
+
private templateRepeat;
|
|
1757
|
+
/** Fixed label pages repeat in record → copy → template-page order. */
|
|
1758
|
+
repeat(options: ReportTemplateRepeat): this;
|
|
1683
1759
|
/**
|
|
1684
1760
|
* 声明报表参数(链式,可放在 .page() 前后任意位置):
|
|
1685
1761
|
* 渲染组件据此自动生成查询面板(也可由 paramDefs prop 提供,prop 优先)。
|
|
@@ -1841,6 +1917,9 @@ export declare interface ValidationResult {
|
|
|
1841
1917
|
warnings: ValidationError[];
|
|
1842
1918
|
}
|
|
1843
1919
|
|
|
1920
|
+
/** The same declarative formatting used by list columns, before any output backend. */
|
|
1921
|
+
export declare type ValueFormat = ColumnFormat;
|
|
1922
|
+
|
|
1844
1923
|
/**
|
|
1845
1924
|
* 文本折行:
|
|
1846
1925
|
* - CJK 字符任意位置可断(与既有行为一致)
|