@agile-team/mach-report 2.15.0 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +21 -12
  2. package/dist/{ExcelBindingWizard-Bs43BGNp.cjs → ExcelBindingWizard-Bq6FYME6.cjs} +1 -1
  3. package/dist/{ExcelBindingWizard-BKH1nGNS.js → ExcelBindingWizard-Co1svTsw.js} +3 -3
  4. package/dist/{ParamEditor-Da4akw6V.cjs → ParamEditor-B5UZRgxv.cjs} +1 -1
  5. package/dist/{ParamEditor-DoAhzJsm.js → ParamEditor-DNNARyeB.js} +1 -1
  6. package/dist/{ReportBatchPanel-wP9m9Pj1.cjs → ReportBatchPanel-Ctvs2t_9.cjs} +1 -1
  7. package/dist/{ReportBatchPanel-BMf6boMA.js → ReportBatchPanel-uQh06usx.js} +3 -3
  8. package/dist/ReportPreview-BdQawRh0.js +4879 -0
  9. package/dist/ReportPreview-CJC_-j2I.cjs +6 -0
  10. package/dist/{ReportTemplateLibrary-Sxr3eD0J.cjs → ReportTemplateLibrary-CnP7_1pH.cjs} +1 -1
  11. package/dist/{ReportTemplateLibrary-C9wutIiT.js → ReportTemplateLibrary-TIL_Oj2l.js} +1 -1
  12. package/dist/RuleEditor-DkRjOLlr.js +2141 -0
  13. package/dist/RuleEditor-h5anGsDB.cjs +1 -0
  14. package/dist/{TemplateOutlinePanel-JTSR53vJ.cjs → TemplateOutlinePanel-BlLxRrfu.cjs} +1 -1
  15. package/dist/{TemplateOutlinePanel-D6Bkny59.js → TemplateOutlinePanel-BouxsuqQ.js} +1 -1
  16. package/dist/{TemplateReusePanel-rVuK1kTz.js → TemplateReusePanel-BEACLPaN.js} +2 -2
  17. package/dist/{TemplateReusePanel-Kx35S0Ql.cjs → TemplateReusePanel-yxsHSO40.cjs} +1 -1
  18. package/dist/{TemplateReviewPanel-B0ar9_zf.js → TemplateReviewPanel-B1OGRY2i.js} +1 -1
  19. package/dist/{TemplateReviewPanel-Dn6X9UmY.cjs → TemplateReviewPanel-D9Cx0m2N.cjs} +1 -1
  20. package/dist/analytics.cjs +1 -1
  21. package/dist/analytics.d.cts +65 -1
  22. package/dist/analytics.d.ts +65 -1
  23. package/dist/analytics.js +4 -4
  24. package/dist/artifact-integrity.json +105 -101
  25. package/dist/assets-BIMVwjQe.js +231 -0
  26. package/dist/assets-Dfs2ElxI.cjs +1 -0
  27. package/dist/auto-BIOmtVhk.js +240 -0
  28. package/dist/auto-DDHflI9v.cjs +1 -0
  29. package/dist/{batch-BfZHN1do.js → batch-WzDIXJAt.js} +1 -1
  30. package/dist/{batch-CLpELXBl.cjs → batch-z6Aw5GEY.cjs} +1 -1
  31. package/dist/codes.d.cts +2 -0
  32. package/dist/codes.d.ts +2 -0
  33. package/dist/component-tree-Ca6YYfHq.js +61 -0
  34. package/dist/component-tree-DkGLEfZC.cjs +1 -0
  35. package/dist/computed-BW5a8QFk.js +612 -0
  36. package/dist/computed-C2GD3XcE.cjs +1 -0
  37. package/dist/config-Dg_o8e7m.cjs +1 -0
  38. package/dist/{config-BVsJXSqS.js → config-XQ4qrQ7Q.js} +66 -64
  39. package/dist/dataset-DL83majE.js +161 -0
  40. package/dist/dataset-IrlXbUvh.cjs +1 -0
  41. package/dist/designer-D9XAxqSc.js +5178 -0
  42. package/dist/designer-uCDo5XSK.cjs +2 -0
  43. package/dist/designer.cjs +1 -1
  44. package/dist/designer.d.cts +178 -3
  45. package/dist/designer.d.ts +178 -3
  46. package/dist/designer.js +1 -1
  47. package/dist/drill-ByN8COs_.cjs +1 -0
  48. package/dist/{drill-ByJviLXS.js → drill-CKW3Xtfa.js} +5 -5
  49. package/dist/encoding-BFMFIc4r.cjs +1 -0
  50. package/dist/encoding-DP_Eaf0A.js +21 -0
  51. package/dist/{font-loader-B_UkxpzC.cjs → font-loader-7FWVlykp.cjs} +1 -1
  52. package/dist/{font-loader-Q3bQjmrI.js → font-loader-CQZowp0I.js} +1 -1
  53. package/dist/index.cjs +8 -9
  54. package/dist/index.d.cts +175 -1
  55. package/dist/index.d.ts +175 -1
  56. package/dist/index.js +1343 -915
  57. package/dist/json-snapshot-D7PE1NsU.cjs +2 -0
  58. package/dist/json-snapshot-DYmEe3sO.js +1779 -0
  59. package/dist/matrix-JLAXlux-.js +302 -0
  60. package/dist/matrix-gTHpDTGm.cjs +1 -0
  61. package/dist/{pdf-CvvrjPQg.cjs → pdf-B8JouyYv.cjs} +48 -50
  62. package/dist/{pdf-BwNyeGpt.js → pdf-l3ea86di.js} +2734 -2748
  63. package/dist/pdf.cjs +1 -1
  64. package/dist/pdf.d.cts +14 -0
  65. package/dist/pdf.d.ts +14 -0
  66. package/dist/pdf.js +2 -2
  67. package/dist/{plugin-Ca_XZG3l.js → plugin-BBp74CQZ.js} +1 -1
  68. package/dist/{plugin-DHO7X8z2.cjs → plugin-CtFX9PFG.cjs} +1 -1
  69. package/dist/prepared-CARicKYh.js +87 -0
  70. package/dist/prepared-Ch1x_Gog.cjs +1 -0
  71. package/dist/progress-BXzlVbIp.js +29 -0
  72. package/dist/progress-DJBd9Rb9.cjs +1 -0
  73. package/dist/{progress-D-OTpEav.js → progress-Hc2vxoCs.js} +2 -2
  74. package/dist/protocol-B5A2uom4.cjs +1 -0
  75. package/dist/protocol-BaiWjq5w.js +90 -0
  76. package/dist/record-bindings-B86Sur_y.cjs +1 -0
  77. package/dist/{record-bindings-Do_b3h4V.js → record-bindings-D4TuMzHs.js} +10 -11
  78. package/dist/{region-binding-workflow-BMhK_TjP.js → region-binding-workflow-BNasF5kz.js} +2 -2
  79. package/dist/{region-binding-workflow-DIYJdCUr.cjs → region-binding-workflow-O2Cni3mF.cjs} +1 -1
  80. package/dist/report-encoding-worker.cjs +1 -0
  81. package/dist/report-encoding-worker.d.ts +1 -0
  82. package/dist/report-encoding-worker.js +2 -0
  83. package/dist/rich-text-layout-ALlMoYOG.cjs +3 -0
  84. package/dist/rich-text-layout-Ct5WrY1g.js +102 -0
  85. package/dist/runtime-DakRXui3.js +170 -0
  86. package/dist/runtime-dL5ygIfa.cjs +1 -0
  87. package/dist/sbom.cdx.json +2 -2
  88. package/dist/server/node.d.cts +132 -1
  89. package/dist/server/node.d.ts +132 -1
  90. package/dist/server-node.cjs +5 -1
  91. package/dist/server-node.js +5177 -463
  92. package/dist/server.cjs +1 -1
  93. package/dist/server.d.cts +182 -2
  94. package/dist/server.d.ts +182 -2
  95. package/dist/server.js +918 -833
  96. package/dist/sha256-BshdOkCC.cjs +1 -0
  97. package/dist/sha256-DTG-Gq8i.js +157 -0
  98. package/dist/style-67OqfNed.js +73 -0
  99. package/dist/style-C22Pbv3T.cjs +1 -0
  100. package/dist/style.css +1 -1
  101. package/dist/template-catalog-Dua8h9ZA.cjs +1 -0
  102. package/dist/{template-catalog-j2B1MJlL.js → template-catalog-wT1fNeAP.js} +10 -10
  103. package/dist/{template-fragments-DcKeiylI.cjs → template-fragments-BajTajb4.cjs} +1 -1
  104. package/dist/{template-fragments-BGbQLGlV.js → template-fragments-DmX5XK4N.js} +2 -2
  105. package/dist/template-registry-CpysHAxy.cjs +1 -0
  106. package/dist/{template-registry-BtaKPELV.js → template-registry-u11fPd8D.js} +389 -321
  107. package/dist/{textwrap-DE1kgcJB.js → textwrap-BEIg2w8y.js} +1 -1
  108. package/dist/textwrap-BI-yJ6Wt.cjs +4 -0
  109. package/dist/{tree-BX380Rr7.cjs → tree-CLpxYbKa.cjs} +1 -1
  110. package/dist/{tree-CjVZLRw7.js → tree-DNJorJUf.js} +1 -1
  111. package/dist/vue/async.d.cts +174 -2
  112. package/dist/vue/async.d.ts +174 -2
  113. package/dist/vue/index.d.cts +218 -3
  114. package/dist/vue/index.d.ts +218 -3
  115. package/dist/vue-async.cjs +1 -1
  116. package/dist/vue-async.js +3 -3
  117. package/dist/vue.cjs +1 -1
  118. package/dist/vue.js +7 -7
  119. package/dist/{workbook-session-BvToI-Fd.js → workbook-session-B8pNW24X.js} +153 -140
  120. package/dist/{workbook-session-Bjv1YCRK.cjs → workbook-session-DN5LSA5C.cjs} +12 -12
  121. package/dist/worker.cjs +1 -1
  122. package/dist/worker.d.cts +84 -1
  123. package/dist/worker.d.ts +84 -1
  124. package/dist/worker.js +12 -157
  125. package/dist/xlsx-node.cjs +33 -33
  126. package/dist/xlsx-node.js +1282 -1289
  127. package/dist/xlsx.cjs +4 -3
  128. package/dist/xlsx.d.cts +90 -2
  129. package/dist/xlsx.d.ts +90 -2
  130. package/dist/xlsx.js +279 -259
  131. package/package.json +6 -3
  132. package/dist/ReportPreview-ChV19HBp.js +0 -4619
  133. package/dist/ReportPreview-DbLvvOUT.cjs +0 -6
  134. package/dist/RuleEditor-C_Clasvd.js +0 -2037
  135. package/dist/RuleEditor-XhGHK8DE.cjs +0 -1
  136. package/dist/assets-B9ImAi6_.cjs +0 -1
  137. package/dist/assets-DEaz4qsp.js +0 -124
  138. package/dist/batch-BaP6pWDE.cjs +0 -1
  139. package/dist/batch-CGyt-b2W.js +0 -273
  140. package/dist/capabilities-CAh2Nrue.cjs +0 -1
  141. package/dist/capabilities-DskCHs3V.js +0 -69
  142. package/dist/computed-C-4C2S5h.js +0 -521
  143. package/dist/computed-CGV2a809.cjs +0 -1
  144. package/dist/config-D10us76d.cjs +0 -1
  145. package/dist/data-explanation-B8MZRYVS.js +0 -16
  146. package/dist/data-explanation-DE55G30w.cjs +0 -1
  147. package/dist/dataset-BkRmwgeJ.cjs +0 -1
  148. package/dist/dataset-H5pFuQGU.js +0 -121
  149. package/dist/defaults-DXhiM1ZD.js +0 -10
  150. package/dist/defaults-xhmcLLrf.cjs +0 -1
  151. package/dist/designer-2bDlcNXQ.js +0 -5136
  152. package/dist/designer-BT7XCdbW.cjs +0 -2
  153. package/dist/drill-DYTxuL3A.cjs +0 -1
  154. package/dist/grid-strokes-Cr7DwUux.cjs +0 -1
  155. package/dist/grid-strokes-DyyG1q_o.js +0 -53
  156. package/dist/json-snapshot-DFb2eWkf.js +0 -1416
  157. package/dist/json-snapshot-WWSGlaHG.cjs +0 -2
  158. package/dist/matrix-CGRGkn5s.js +0 -112
  159. package/dist/matrix-gEO7ZM_u.cjs +0 -1
  160. package/dist/prepared-CFy9B75C.cjs +0 -1
  161. package/dist/prepared-ajM-H-9B.js +0 -69
  162. package/dist/record-bindings-By_UKZ2g.cjs +0 -1
  163. package/dist/render-plan-7xpGrCEl.cjs +0 -1
  164. package/dist/render-plan-Ck6koX9L.js +0 -13
  165. package/dist/sha256-ArEYjaTI.cjs +0 -1
  166. package/dist/sha256-DPEuJ3nh.js +0 -155
  167. package/dist/style-CQ1PK8ZB.js +0 -67
  168. package/dist/style-UgIJSA1F.cjs +0 -1
  169. package/dist/template-catalog-FJE_c9Qe.cjs +0 -1
  170. package/dist/template-registry-Co1zPq5e.cjs +0 -1
  171. package/dist/textwrap-CWHyzkBH.cjs +0 -4
package/dist/pdf.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./font-loader-B_UkxpzC.cjs"),t=require("./pdf-CvvrjPQg.cjs");exports.clearFontCache=e.clearFontCache;exports.configureFontCache=e.configureFontCache;exports.getFontCacheStats=e.getFontCacheStats;exports.invalidateFontCache=e.invalidateFontCache;exports.loadFontWithCache=e.loadFontWithCache;exports.createFontBytesMeasurer=t.createFontBytesMeasurer;exports.renderPlanToPdf=t.renderPlanToPdf;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./font-loader-7FWVlykp.cjs"),t=require("./pdf-B8JouyYv.cjs");exports.clearFontCache=e.clearFontCache;exports.configureFontCache=e.configureFontCache;exports.getFontCacheStats=e.getFontCacheStats;exports.invalidateFontCache=e.invalidateFontCache;exports.loadFontWithCache=e.loadFontWithCache;exports.createFontBytesMeasurer=t.createFontBytesMeasurer;exports.renderPlanToPdf=t.renderPlanToPdf;
package/dist/pdf.d.cts CHANGED
@@ -11,6 +11,8 @@ declare interface AssetRenderBudget {
11
11
 
12
12
  declare interface AssetRenderOptions extends OutputDiagnosticOptions, ImageMediaOptions {
13
13
  assetRenderers?: Partial<Record<ImageComponentKind, ComponentImageRenderer>>;
14
+ /** Explicit id/version registry; unbound components continue using assetRenderers by kind. */
15
+ assetRegistry?: ComponentAssetRegistry;
14
16
  assetBudget?: AssetRenderBudget;
15
17
  /** Default throw prevents an incomplete export; placeholder retains the component and emits diagnostics. */
16
18
  assetFailure?: "throw" | "placeholder";
@@ -54,6 +56,11 @@ declare type ColumnFormat = {
54
56
  pattern?: string;
55
57
  };
56
58
 
59
+ declare interface ComponentAssetRegistry {
60
+ rendererFor(component: Readonly<PlanComponent>): ComponentImageRenderer | undefined;
61
+ hasExtension(id: string, version: string, kind: string): boolean;
62
+ }
63
+
57
64
  /** A literal own field of the current label record; expressions and paths are not evaluated. */
58
65
  declare interface ComponentBinding {
59
66
  field: string;
@@ -139,6 +146,8 @@ export declare interface FontLoadOptions {
139
146
  export declare function getFontCacheStats(): FontCacheStats;
140
147
 
141
148
  declare interface GridCell {
149
+ /** Styled cell content; text remains a plain-text fallback. Imported rich cells are read-only. */
150
+ richParagraphs?: RichParagraph[];
142
151
  text?: string;
143
152
  rawText?: string;
144
153
  /** 原始值,仅供 Excel raw 模式消费;不参与预览、分页与 PDF 绘制。 */
@@ -197,6 +206,11 @@ declare interface OutputDiagnostic {
197
206
  componentPath?: readonly number[];
198
207
  kind: string;
199
208
  nid?: string;
209
+ /** Declarative extension identity only; no property values or business binding data enter diagnostics. */
210
+ extension?: {
211
+ id: string;
212
+ version: string;
213
+ };
200
214
  message: string;
201
215
  }
202
216
 
package/dist/pdf.d.ts CHANGED
@@ -11,6 +11,8 @@ declare interface AssetRenderBudget {
11
11
 
12
12
  declare interface AssetRenderOptions extends OutputDiagnosticOptions, ImageMediaOptions {
13
13
  assetRenderers?: Partial<Record<ImageComponentKind, ComponentImageRenderer>>;
14
+ /** Explicit id/version registry; unbound components continue using assetRenderers by kind. */
15
+ assetRegistry?: ComponentAssetRegistry;
14
16
  assetBudget?: AssetRenderBudget;
15
17
  /** Default throw prevents an incomplete export; placeholder retains the component and emits diagnostics. */
16
18
  assetFailure?: "throw" | "placeholder";
@@ -54,6 +56,11 @@ declare type ColumnFormat = {
54
56
  pattern?: string;
55
57
  };
56
58
 
59
+ declare interface ComponentAssetRegistry {
60
+ rendererFor(component: Readonly<PlanComponent>): ComponentImageRenderer | undefined;
61
+ hasExtension(id: string, version: string, kind: string): boolean;
62
+ }
63
+
57
64
  /** A literal own field of the current label record; expressions and paths are not evaluated. */
58
65
  declare interface ComponentBinding {
59
66
  field: string;
@@ -139,6 +146,8 @@ export declare interface FontLoadOptions {
139
146
  export declare function getFontCacheStats(): FontCacheStats;
140
147
 
141
148
  declare interface GridCell {
149
+ /** Styled cell content; text remains a plain-text fallback. Imported rich cells are read-only. */
150
+ richParagraphs?: RichParagraph[];
142
151
  text?: string;
143
152
  rawText?: string;
144
153
  /** 原始值,仅供 Excel raw 模式消费;不参与预览、分页与 PDF 绘制。 */
@@ -197,6 +206,11 @@ declare interface OutputDiagnostic {
197
206
  componentPath?: readonly number[];
198
207
  kind: string;
199
208
  nid?: string;
209
+ /** Declarative extension identity only; no property values or business binding data enter diagnostics. */
210
+ extension?: {
211
+ id: string;
212
+ version: string;
213
+ };
200
214
  message: string;
201
215
  }
202
216
 
package/dist/pdf.js CHANGED
@@ -1,5 +1,5 @@
1
- import { clearFontCache as t, configureFontCache as o, getFontCacheStats as r, invalidateFontCache as n, loadFontWithCache as c } from "./font-loader-Q3bQjmrI.js";
2
- import { c as F, r as s } from "./pdf-BwNyeGpt.js";
1
+ import { clearFontCache as t, configureFontCache as o, getFontCacheStats as r, invalidateFontCache as n, loadFontWithCache as c } from "./font-loader-CQZowp0I.js";
2
+ import { c as F, r as s } from "./pdf-l3ea86di.js";
3
3
  export {
4
4
  t as clearFontCache,
5
5
  o as configureFontCache,
@@ -1,7 +1,7 @@
1
1
  import { defineAsyncComponent as c, computed as m } from "vue";
2
2
  import { b as i, c as l, a as s } from "./injection-keys-e85udZCp.js";
3
3
  import { g as d } from "./report-params-B1RzkhJj.js";
4
- const p = c(() => import("./ReportPreview-ChV19HBp.js").then((r) => r.s)), _ = {
4
+ const p = c(() => import("./ReportPreview-BdQawRh0.js").then((r) => r.s)), _ = {
5
5
  install(r, e = {}) {
6
6
  let t = e.fetcher;
7
7
  if (!t && e.reports) {
@@ -1 +1 @@
1
- "use strict";var R=Object.create;var f=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty;var m=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of P(e))!p.call(r,o)&&o!==t&&f(r,o,{get:()=>e[o],enumerable:!(n=u(e,o))||n.enumerable});return r};var E=(r,e,t)=>(t=r!=null?R(d(r)):{},m(e||!r||!r.__esModule?f(t,"default",{value:r,enumerable:!0}):t,r));const l=require("vue"),i=require("./injection-keys-Db_DyLkm.cjs"),h=require("./report-params-WDGrA4oP.cjs"),s=l.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-DbLvvOUT.cjs")).then(r=>r.ReportPreview$1)),v={install(r,e={}){let t=e.fetcher;if(!t&&e.reports){const n=e.reports;let o;t=async c=>(o??=import("@agile-team/mach-report").then(({createReportSource:a})=>a(n)),(await o)(c)),t.getParamDefs=c=>h.getReportParamDefs(n,c)}t&&r.provide(i.MACH_REPORT_FETCHER_KEY,t),e.pdfExporter&&r.provide(i.MACH_REPORT_PDF_EXPORTER_KEY,e.pdfExporter),r.provide(i.MACH_REPORT_CONFIG_KEY,l.computed(()=>{if(e.pdfFontUrl===void 0)return e.config??null;const n=e.config??{defaults:{},presets:{}};return{...n,defaults:{...n.defaults,pdfFontUrl:e.pdfFontUrl}}})),e.globalComponent!==!1&&!r.component("MachReportPreview")&&r.component("MachReportPreview",s)}};exports.MachReportPreview=s;exports.machReportPlugin=v;
1
+ "use strict";var R=Object.create;var f=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty;var m=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of P(e))!p.call(r,o)&&o!==t&&f(r,o,{get:()=>e[o],enumerable:!(n=u(e,o))||n.enumerable});return r};var E=(r,e,t)=>(t=r!=null?R(d(r)):{},m(e||!r||!r.__esModule?f(t,"default",{value:r,enumerable:!0}):t,r));const l=require("vue"),i=require("./injection-keys-Db_DyLkm.cjs"),h=require("./report-params-WDGrA4oP.cjs"),s=l.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-CJC_-j2I.cjs")).then(r=>r.ReportPreview$1)),v={install(r,e={}){let t=e.fetcher;if(!t&&e.reports){const n=e.reports;let o;t=async c=>(o??=import("@agile-team/mach-report").then(({createReportSource:a})=>a(n)),(await o)(c)),t.getParamDefs=c=>h.getReportParamDefs(n,c)}t&&r.provide(i.MACH_REPORT_FETCHER_KEY,t),e.pdfExporter&&r.provide(i.MACH_REPORT_PDF_EXPORTER_KEY,e.pdfExporter),r.provide(i.MACH_REPORT_CONFIG_KEY,l.computed(()=>{if(e.pdfFontUrl===void 0)return e.config??null;const n=e.config??{defaults:{},presets:{}};return{...n,defaults:{...n.defaults,pdfFontUrl:e.pdfFontUrl}}})),e.globalComponent!==!1&&!r.component("MachReportPreview")&&r.component("MachReportPreview",s)}};exports.MachReportPreview=s;exports.machReportPlugin=v;
@@ -0,0 +1,87 @@
1
+ import { R as n, u, s as y } from "./json-snapshot-DYmEe3sO.js";
2
+ import { R as s, t as c, p as l } from "./sha256-DTG-Gq8i.js";
3
+ function F(e) {
4
+ return e && { ...e };
5
+ }
6
+ function A(e) {
7
+ if (!e) return;
8
+ const t = (r) => {
9
+ if (!(r instanceof Uint8Array) && !(r instanceof ArrayBuffer)) throw new n("validate", "字体应为 Uint8Array 或 ArrayBuffer");
10
+ if (r.byteLength > 32e6) throw new s("budget", "单份字体超过 32 MB", "$.pdf");
11
+ return new Uint8Array(r instanceof Uint8Array ? r : new Uint8Array(r));
12
+ };
13
+ if (e.customFontFaces) {
14
+ const r = e.customFontFaces;
15
+ return { customFontName: e.customFontName, customFontFaces: { regular: t(r.regular), ...r.bold ? { bold: t(r.bold) } : {}, ...r.italic ? { italic: t(r.italic) } : {}, ...r.boldItalic ? { boldItalic: t(r.boldItalic) } : {} } };
16
+ }
17
+ return { customFontName: e.customFontName, ...e.customFontBytes ? { customFontBytes: t(e.customFontBytes) } : {} };
18
+ }
19
+ function p(e) {
20
+ const t = e?.customFontFaces ?? (e?.customFontBytes ? { regular: e.customFontBytes } : void 0);
21
+ if (!t) return;
22
+ const r = ["regular", "bold", "italic", "boldItalic"].map((o) => {
23
+ const i = t[o];
24
+ if (!i) return [o, null];
25
+ const a = i instanceof Uint8Array ? i : new Uint8Array(i);
26
+ if (a.byteLength > 32e6) throw new s("budget", "单份字体超过 32 MB", "$.pdf");
27
+ return [o, l(a)];
28
+ });
29
+ return l(new TextEncoder().encode(JSON.stringify(r)));
30
+ }
31
+ const d = /* @__PURE__ */ new WeakMap();
32
+ function h(e, t, r) {
33
+ const o = g(e, t, r);
34
+ let i = !0;
35
+ return { prepared: o, forward() {
36
+ if (!i) throw new Error("报表快照只能交接一次");
37
+ return i = !1, d.set(o, t), o;
38
+ } };
39
+ }
40
+ function g(e, t, r) {
41
+ if (c(r), !Number.isSafeInteger(t) || t <= 0) throw new s("budget", "快照预算应为正安全整数", "$.budget.maxPreparedBytes");
42
+ const o = d.get(e);
43
+ if (d.delete(e), o !== void 0 && o <= t) return e;
44
+ const i = y(e, {
45
+ maxBytes: t,
46
+ maxNodes: t,
47
+ check: () => c(r),
48
+ error: (a, f) => a === "budget" ? new s("budget", f, "$.budget.maxPreparedBytes") : new n("validate", f)
49
+ });
50
+ return v(i), i;
51
+ }
52
+ function w(e) {
53
+ if (e === void 0) return !0;
54
+ if (!Array.isArray(e)) return !1;
55
+ const t = /* @__PURE__ */ new Set();
56
+ return e.every((r) => !r || typeof r != "object" || Array.isArray(r) || typeof r.reportId != "string" || !r.reportId.trim() || !Number.isSafeInteger(r.reportIndex) || r.reportIndex < 0 || t.has(r.reportIndex) || typeof r.reportScope != "string" || !r.reportScope.trim() || r.reportScope.length > 4096 || r.revision !== void 0 && typeof r.revision != "string" || r.sourceToken !== void 0 && typeof r.sourceToken != "string" ? !1 : (t.add(r.reportIndex), !0));
57
+ }
58
+ function v(e) {
59
+ if (!w(e.sources)) throw new n("validate", "准备结果来源清单无效");
60
+ if (!e?.stats || ["rows", "pages", "cells"].some((t) => !Number.isSafeInteger(e.stats[t]) || e.stats[t] < 0) || !Number.isFinite(e.stats.durationMs) || e.stats.durationMs < 0) throw new n("validate", "准备结果统计无效");
61
+ if (!Array.isArray(e.diagnostics) || e.diagnostics.some((t) => !t || typeof t.code != "string" || typeof t.message != "string" || !["info", "warning", "error"].includes(t.severity) || !u(t))) throw new n("validate", "准备结果诊断无效");
62
+ if (!e.revisions || typeof e.revisions != "object" || Array.isArray(e.revisions) || Object.values(e.revisions).some((t) => !t || typeof t != "object" || t.revision !== void 0 && typeof t.revision != "string" || t.sourceToken !== void 0 && typeof t.sourceToken != "string")) throw new n("validate", "准备结果修订无效");
63
+ if (e.layout && (!["heuristic", "provided", "font-bytes"].includes(e.layout.textMetrics) || e.layout.fontFingerprint !== void 0 && !/^[a-f0-9]{64}$/.test(e.layout.fontFingerprint))) throw new n("validate", "准备结果字体度量标识无效");
64
+ }
65
+ function P(e) {
66
+ if (e.layoutPolicy !== void 0 && !["verify", "preserve"].includes(e.layoutPolicy)) throw new n("validate", "无效的 layoutPolicy");
67
+ if (e.format !== "pdf") return;
68
+ if (e.layoutPolicy === "preserve" && !e.prepared.layout?.fontFingerprint) {
69
+ e.prepared.diagnostics.push({ code: "prepared-layout-preserved", severity: "info", message: "显式保持现有分页与几何;未验证排版字体身份,实际 PDF 输出仍遵循 fidelity 校验。" });
70
+ return;
71
+ }
72
+ const t = e.prepared.layout?.fontFingerprint, r = p(e.pdf);
73
+ if (t === r && (t !== void 0 || e.prepared.layout?.textMetrics === "heuristic" && !r)) return;
74
+ const o = "已准备计划的字体度量无法与本次 PDF 字体确认一致;保持现有分页,未重新查询或排版。请在 prepare 和 exportPrepared 提供相同字体字节。";
75
+ if (e.fidelity === "strict") throw new n("validate", o);
76
+ e.prepared.diagnostics.push({ code: "prepared-font-metrics", severity: "warning", message: o });
77
+ }
78
+ export {
79
+ F as a,
80
+ w as b,
81
+ h as c,
82
+ g as d,
83
+ P as e,
84
+ p as r,
85
+ A as s,
86
+ v
87
+ };
@@ -0,0 +1 @@
1
+ "use strict";const i=require("./json-snapshot-D7PE1NsU.cjs"),a=require("./sha256-BshdOkCC.cjs");function y(r){return r&&{...r}}function g(r){if(!r)return;const t=e=>{if(!(e instanceof Uint8Array)&&!(e instanceof ArrayBuffer))throw new i.ReportSourceError("validate","字体应为 Uint8Array 或 ArrayBuffer");if(e.byteLength>32e6)throw new a.ReportRuntimeError("budget","单份字体超过 32 MB","$.pdf");return new Uint8Array(e instanceof Uint8Array?e:new Uint8Array(e))};if(r.customFontFaces){const e=r.customFontFaces;return{customFontName:r.customFontName,customFontFaces:{regular:t(e.regular),...e.bold?{bold:t(e.bold)}:{},...e.italic?{italic:t(e.italic)}:{},...e.boldItalic?{boldItalic:t(e.boldItalic)}:{}}}}return{customFontName:r.customFontName,...r.customFontBytes?{customFontBytes:t(r.customFontBytes)}:{}}}function f(r){const t=r?.customFontFaces??(r?.customFontBytes?{regular:r.customFontBytes}:void 0);if(!t)return;const e=["regular","bold","italic","boldItalic"].map(o=>{const n=t[o];if(!n)return[o,null];const s=n instanceof Uint8Array?n:new Uint8Array(n);if(s.byteLength>32e6)throw new a.ReportRuntimeError("budget","单份字体超过 32 MB","$.pdf");return[o,a.portableSha256Hex(s)]});return a.portableSha256Hex(new TextEncoder().encode(JSON.stringify(e)))}const d=new WeakMap;function w(r,t,e){const o=u(r,t,e);let n=!0;return{prepared:o,forward(){if(!n)throw new Error("报表快照只能交接一次");return n=!1,d.set(o,t),o}}}function u(r,t,e){if(a.throwIfAborted(e),!Number.isSafeInteger(t)||t<=0)throw new a.ReportRuntimeError("budget","快照预算应为正安全整数","$.budget.maxPreparedBytes");const o=d.get(r);if(d.delete(r),o!==void 0&&o<=t)return r;const n=i.snapshotReportJson(r,{maxBytes:t,maxNodes:t,check:()=>a.throwIfAborted(e),error:(s,c)=>s==="budget"?new a.ReportRuntimeError("budget",c,"$.budget.maxPreparedBytes"):new i.ReportSourceError("validate",c)});return l(n),n}function p(r){if(r===void 0)return!0;if(!Array.isArray(r))return!1;const t=new Set;return r.every(e=>!e||typeof e!="object"||Array.isArray(e)||typeof e.reportId!="string"||!e.reportId.trim()||!Number.isSafeInteger(e.reportIndex)||e.reportIndex<0||t.has(e.reportIndex)||typeof e.reportScope!="string"||!e.reportScope.trim()||e.reportScope.length>4096||e.revision!==void 0&&typeof e.revision!="string"||e.sourceToken!==void 0&&typeof e.sourceToken!="string"?!1:(t.add(e.reportIndex),!0))}function l(r){if(!p(r.sources))throw new i.ReportSourceError("validate","准备结果来源清单无效");if(!r?.stats||["rows","pages","cells"].some(t=>!Number.isSafeInteger(r.stats[t])||r.stats[t]<0)||!Number.isFinite(r.stats.durationMs)||r.stats.durationMs<0)throw new i.ReportSourceError("validate","准备结果统计无效");if(!Array.isArray(r.diagnostics)||r.diagnostics.some(t=>!t||typeof t.code!="string"||typeof t.message!="string"||!["info","warning","error"].includes(t.severity)||!i.hasValidDataExplanation(t)))throw new i.ReportSourceError("validate","准备结果诊断无效");if(!r.revisions||typeof r.revisions!="object"||Array.isArray(r.revisions)||Object.values(r.revisions).some(t=>!t||typeof t!="object"||t.revision!==void 0&&typeof t.revision!="string"||t.sourceToken!==void 0&&typeof t.sourceToken!="string"))throw new i.ReportSourceError("validate","准备结果修订无效");if(r.layout&&(!["heuristic","provided","font-bytes"].includes(r.layout.textMetrics)||r.layout.fontFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(r.layout.fontFingerprint)))throw new i.ReportSourceError("validate","准备结果字体度量标识无效")}function v(r){if(r.layoutPolicy!==void 0&&!["verify","preserve"].includes(r.layoutPolicy))throw new i.ReportSourceError("validate","无效的 layoutPolicy");if(r.format!=="pdf")return;if(r.layoutPolicy==="preserve"&&!r.prepared.layout?.fontFingerprint){r.prepared.diagnostics.push({code:"prepared-layout-preserved",severity:"info",message:"显式保持现有分页与几何;未验证排版字体身份,实际 PDF 输出仍遵循 fidelity 校验。"});return}const t=r.prepared.layout?.fontFingerprint,e=f(r.pdf);if(t===e&&(t!==void 0||r.prepared.layout?.textMetrics==="heuristic"&&!e))return;const o="已准备计划的字体度量无法与本次 PDF 字体确认一致;保持现有分页,未重新查询或排版。请在 prepare 和 exportPrepared 提供相同字体字节。";if(r.fidelity==="strict")throw new i.ReportSourceError("validate",o);r.prepared.diagnostics.push({code:"prepared-font-metrics",severity:"warning",message:o})}exports.capturePreparedHandoff=w;exports.checkPreparedFont=v;exports.reportFontFingerprint=f;exports.snapshotPdfFonts=g;exports.snapshotPreparedReport=u;exports.snapshotXlsxOptions=y;exports.validPreparedSources=p;exports.validatePreparedMetadata=l;
@@ -0,0 +1,29 @@
1
+ function s(o) {
2
+ if (o?.aborted) throw o.reason ?? new DOMException("The operation was aborted.", "AbortError");
3
+ }
4
+ function u(o) {
5
+ try {
6
+ Promise.resolve(o()).catch(() => {
7
+ });
8
+ } catch {
9
+ }
10
+ }
11
+ function b(o, e) {
12
+ const r = Promise.resolve(o);
13
+ return e?.aborted ? (r.catch(() => {
14
+ }), Promise.reject(e.reason ?? new DOMException("The operation was aborted.", "AbortError"))) : e ? new Promise((i, c) => {
15
+ const t = () => e.removeEventListener("abort", n), n = () => {
16
+ t(), c(e.reason ?? new DOMException("The operation was aborted.", "AbortError"));
17
+ };
18
+ e.addEventListener("abort", n, { once: !0 }), r.then((a) => {
19
+ t(), i(a);
20
+ }, (a) => {
21
+ t(), c(a);
22
+ }), e.aborted && n();
23
+ }) : r;
24
+ }
25
+ export {
26
+ s as a,
27
+ u as o,
28
+ b as w
29
+ };
@@ -0,0 +1 @@
1
+ "use strict";function i(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}function s(e){try{Promise.resolve(e()).catch(()=>{})}catch{}}function b(e,t){const r=Promise.resolve(e);return t?.aborted?(r.catch(()=>{}),Promise.reject(t.reason??new DOMException("The operation was aborted.","AbortError"))):t?new Promise((a,c)=>{const o=()=>t.removeEventListener("abort",n),n=()=>{o(),c(t.reason??new DOMException("The operation was aborted.","AbortError"))};t.addEventListener("abort",n,{once:!0}),r.then(u=>{o(),a(u)},u=>{o(),c(u)}),t.aborted&&n()}):r}exports.assertOutputActive=i;exports.observeOutput=s;exports.waitForOutput=b;
@@ -42,8 +42,8 @@ function v(e) {
42
42
  };
43
43
  }
44
44
  export {
45
- n as a,
46
- c as b,
45
+ c as a,
46
+ n as b,
47
47
  v as c,
48
48
  f,
49
49
  b as n,
@@ -0,0 +1 @@
1
+ "use strict";const f=require("./prepared-Ch1x_Gog.cjs"),c=require("./json-snapshot-D7PE1NsU.cjs"),a=require("./template-registry-CpysHAxy.cjs"),i="mach-report-worker/1";class d extends Error{constructor(t){super(t.message),this.name=t.name,this.code=t.code,this.path=t.path,this.issues=t.issues,this.diagnostics=t.diagnostics}}function o(r){return!!r&&typeof r=="object"&&!Array.isArray(r)}function y(r){return o(r)?["rows","pages","cells"].every(t=>typeof r[t]=="number"&&Number.isSafeInteger(r[t])&&r[t]>=0)&&typeof r.durationMs=="number"&&Number.isFinite(r.durationMs)&&r.durationMs>=0:!1}function g(r){return Array.isArray(r)&&r.every(t=>o(t)&&typeof t.code=="string"&&typeof t.message=="string"&&["info","warning","error"].includes(t.severity)&&c.hasValidDataExplanation(t))}function m(r){return o(r)&&Object.values(r).every(t=>o(t)&&(t.revision===void 0||typeof t.revision=="string")&&(t.sourceToken===void 0||typeof t.sourceToken=="string"))}function u(r){return r===void 0?!0:o(r)&&["heuristic","provided","font-bytes"].includes(r.textMetrics)&&(r.fontFingerprint===void 0||typeof r.fontFingerprint=="string"&&/^[a-f0-9]{64}$/.test(r.fontFingerprint))}function R(r,t){if(!o(r)||!y(r.stats)||!g(r.diagnostics)||!m(r.revisions)||!u(r.layout)||!f.validPreparedSources(r.sources))return!1;if(t==="prepare")return a.validateRenderPlan(r.plan).ok;const e=r.format==="pdf"?"application/pdf":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";return r.bytes instanceof Uint8Array&&(r.format==="pdf"||r.format==="xlsx")&&r.contentType===e}function n(r){if(!r||typeof r!="object")return{message:String(r)};const t={};for(const e of["code","path","field","message"]){const s=r[e];typeof s=="string"&&(t[e]=s)}return t}function k(r){const t=n(r);if(!o(r))return t;for(const e of["format","severity","kind","nid"])typeof r[e]=="string"&&(t[e]=r[e]);for(const e of["pageIndex","componentIndex"])Number.isSafeInteger(r[e])&&r[e]>=0&&(t[e]=r[e]);return Array.isArray(r.componentPath)&&r.componentPath.every(e=>Number.isSafeInteger(e)&&e>=0)&&(t.componentPath=r.componentPath),t}function p(r){if(!(r instanceof Error))return{name:"Error",message:String(r)};const t=r;return{name:r.name,message:r.message,...typeof t.code=="string"?{code:t.code}:{},...typeof t.path=="string"?{path:t.path}:{},...Array.isArray(t.issues)?{issues:t.issues.map(n)}:{},...Array.isArray(t.diagnostics)?{diagnostics:t.diagnostics.map(k)}:{}}}function h(r){if(!r||typeof r!="object")return!1;const t=r;return t.protocol===i&&typeof t.id=="string"&&(t.operation==="prepare"||t.operation==="export"||t.operation==="exportPrepared")&&!!t.input&&typeof t.input=="object"}async function b(r,t,e){try{const s=t.operation==="prepare"?await r.prepare({...t.input,onEvent:e}):t.operation==="exportPrepared"?await r.exportPrepared({...t.input,onEvent:e}):await r.export({...t.input,onEvent:e});return{protocol:i,id:t.id,result:s}}catch(s){return{protocol:i,id:t.id,error:p(s)}}}function I(r){const t=r.result;return!t||!("bytes"in t)||!(t.bytes.buffer instanceof ArrayBuffer)?[]:[t.bytes.buffer]}function W(r,t){if(!o(r)||typeof r.taskId!="string"||!r.taskId||t.taskId!==void 0&&r.taskId!==t.taskId||r.correlationId!==t.correlationId||r.reportId!==void 0&&(typeof r.reportId!="string"||!("reportIds"in t&&t.reportIds.includes(r.reportId)))||!["query","validate","layout","assets","encode"].includes(r.stage)||!["started","completed","failed"].includes(r.status))return!1;for(const e of["completed","total"])if(r[e]!==void 0&&(typeof r[e]!="number"||!Number.isFinite(r[e])||r[e]<0))return!1;return r.completed===void 0||r.total===void 0||r.completed<=r.total}exports.REPORT_WORKER_PROTOCOL=i;exports.ReportWorkerError=d;exports.isReportWorkerRequest=h;exports.reportWorkerTransferList=I;exports.runReportWorkerRequest=b;exports.serializeError=p;exports.validReportWorkerEvent=W;exports.validReportWorkerResult=R;
@@ -0,0 +1,90 @@
1
+ import { b as f } from "./prepared-CARicKYh.js";
2
+ import { u as a } from "./json-snapshot-DYmEe3sO.js";
3
+ import { b as p } from "./template-registry-u11fPd8D.js";
4
+ const i = "mach-report-worker/1";
5
+ class I extends Error {
6
+ constructor(r) {
7
+ super(r.message), this.name = r.name, this.code = r.code, this.path = r.path, this.issues = r.issues, this.diagnostics = r.diagnostics;
8
+ }
9
+ }
10
+ function e(t) {
11
+ return !!t && typeof t == "object" && !Array.isArray(t);
12
+ }
13
+ function c(t) {
14
+ return e(t) ? ["rows", "pages", "cells"].every((r) => typeof t[r] == "number" && Number.isSafeInteger(t[r]) && t[r] >= 0) && typeof t.durationMs == "number" && Number.isFinite(t.durationMs) && t.durationMs >= 0 : !1;
15
+ }
16
+ function d(t) {
17
+ return Array.isArray(t) && t.every((r) => e(r) && typeof r.code == "string" && typeof r.message == "string" && ["info", "warning", "error"].includes(r.severity) && a(r));
18
+ }
19
+ function m(t) {
20
+ return e(t) && Object.values(t).every((r) => e(r) && (r.revision === void 0 || typeof r.revision == "string") && (r.sourceToken === void 0 || typeof r.sourceToken == "string"));
21
+ }
22
+ function y(t) {
23
+ return t === void 0 ? !0 : e(t) && ["heuristic", "provided", "font-bytes"].includes(t.textMetrics) && (t.fontFingerprint === void 0 || typeof t.fontFingerprint == "string" && /^[a-f0-9]{64}$/.test(t.fontFingerprint));
24
+ }
25
+ function R(t, r) {
26
+ if (!e(t) || !c(t.stats) || !d(t.diagnostics) || !m(t.revisions) || !y(t.layout) || !f(t.sources)) return !1;
27
+ if (r === "prepare") return p(t.plan).ok;
28
+ const o = t.format === "pdf" ? "application/pdf" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
29
+ return t.bytes instanceof Uint8Array && (t.format === "pdf" || t.format === "xlsx") && t.contentType === o;
30
+ }
31
+ function n(t) {
32
+ if (!t || typeof t != "object") return { message: String(t) };
33
+ const r = {};
34
+ for (const o of ["code", "path", "field", "message"]) {
35
+ const s = t[o];
36
+ typeof s == "string" && (r[o] = s);
37
+ }
38
+ return r;
39
+ }
40
+ function g(t) {
41
+ const r = n(t);
42
+ if (!e(t)) return r;
43
+ for (const o of ["format", "severity", "kind", "nid"]) typeof t[o] == "string" && (r[o] = t[o]);
44
+ for (const o of ["pageIndex", "componentIndex"]) Number.isSafeInteger(t[o]) && t[o] >= 0 && (r[o] = t[o]);
45
+ return Array.isArray(t.componentPath) && t.componentPath.every((o) => Number.isSafeInteger(o) && o >= 0) && (r.componentPath = t.componentPath), r;
46
+ }
47
+ function u(t) {
48
+ if (!(t instanceof Error)) return { name: "Error", message: String(t) };
49
+ const r = t;
50
+ return {
51
+ name: t.name,
52
+ message: t.message,
53
+ ...typeof r.code == "string" ? { code: r.code } : {},
54
+ ...typeof r.path == "string" ? { path: r.path } : {},
55
+ ...Array.isArray(r.issues) ? { issues: r.issues.map(n) } : {},
56
+ ...Array.isArray(r.diagnostics) ? { diagnostics: r.diagnostics.map(g) } : {}
57
+ };
58
+ }
59
+ function x(t) {
60
+ if (!t || typeof t != "object") return !1;
61
+ const r = t;
62
+ return r.protocol === i && typeof r.id == "string" && (r.operation === "prepare" || r.operation === "export" || r.operation === "exportPrepared") && !!r.input && typeof r.input == "object";
63
+ }
64
+ async function A(t, r, o) {
65
+ try {
66
+ const s = r.operation === "prepare" ? await t.prepare({ ...r.input, onEvent: o }) : r.operation === "exportPrepared" ? await t.exportPrepared({ ...r.input, onEvent: o }) : await t.export({ ...r.input, onEvent: o });
67
+ return { protocol: i, id: r.id, result: s };
68
+ } catch (s) {
69
+ return { protocol: i, id: r.id, error: u(s) };
70
+ }
71
+ }
72
+ function P(t) {
73
+ const r = t.result;
74
+ return !r || !("bytes" in r) || !(r.bytes.buffer instanceof ArrayBuffer) ? [] : [r.bytes.buffer];
75
+ }
76
+ function E(t, r) {
77
+ if (!e(t) || typeof t.taskId != "string" || !t.taskId || r.taskId !== void 0 && t.taskId !== r.taskId || t.correlationId !== r.correlationId || t.reportId !== void 0 && (typeof t.reportId != "string" || !("reportIds" in r && r.reportIds.includes(t.reportId))) || !["query", "validate", "layout", "assets", "encode"].includes(t.stage) || !["started", "completed", "failed"].includes(t.status)) return !1;
78
+ for (const o of ["completed", "total"]) if (t[o] !== void 0 && (typeof t[o] != "number" || !Number.isFinite(t[o]) || t[o] < 0)) return !1;
79
+ return t.completed === void 0 || t.total === void 0 || t.completed <= t.total;
80
+ }
81
+ export {
82
+ i as R,
83
+ P as a,
84
+ I as b,
85
+ R as c,
86
+ x as i,
87
+ A as r,
88
+ u as s,
89
+ E as v
90
+ };
@@ -0,0 +1 @@
1
+ "use strict";const l=require("./style-C22Pbv3T.cjs"),u=require("./computed-C2GD3XcE.cjs");function y(e){if(!e||e.kind==="date")return;const t=e.digits;if(!(t!==void 0&&(!Number.isInteger(t)||t<0||t>100))){if(e.kind==="percent"){const r=t??2;return`0${r?`.${"0".repeat(r)}`:""}%`}return t===void 0?e.thousands?"#,##0.###############":void 0:`${e.thousands?"#,##0":"0"}${t?`.${"0".repeat(t)}`:""}`}}function S(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const r=new Date(e);return Number.isNaN(r.getTime())?null:r}function c(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function L(e,t){const r=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,r(e.getMonth()+1)).replace(/DD/g,r(e.getDate())).replace(/hh/g,r(e.getHours())).replace(/mm/g,r(e.getMinutes())).replace(/ss/g,r(e.getSeconds()))}function x(e,t,r){return r!=null?t?c(e,r):e.toFixed(r):t?c(e):String(e)}function g(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function b(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{if(typeof e=="string")try{return u.formatDecimal(e,t.digits,t.thousands===!0)}catch{return e}const r=g(e);return r==null?String(e):x(r,t.thousands===!0,t.digits)}case"percent":{if(typeof e=="string")try{return u.formatDecimal(e,t.digits??2,!0,!0)}catch{return e}const r=g(e);return r==null?String(e):`${c(r*100,t.digits??2)}%`}case"date":{const r=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:S(String(e));return n?L(n,r):String(e)}default:return String(e)}}function p(e,t){const r=e[t.field];if(r==null||r==="")return!1;if(typeof t.value=="number"||t.numeric!==void 0){let a;try{a=u.compareDecimal(u.parseDecimal(r),u.parseDecimal(t.value))}catch{return!1}if(!Number.isFinite(a))return!1;switch(t.op){case">":return a>0;case">=":return a>=0;case"<":return a<0;case"<=":return a<=0;case"==":return a===0;case"!=":return a!==0}}const n=String(r),i=String(t.value);switch(t.op){case"==":return n===i;case"!=":return n!==i;case">":return n>i;case">=":return n>=i;case"<":return n<i;case"<=":return n<=i}return!1}function h(e,t,r,n=e.paddingMm??1){return t.field!==e.tree.labelField?0:Math.min(r.depth*(e.tree.indentMm??3),Math.max(0,t.widthMm-n*2-4))}function D(e,t,r,n){const i=n.tree;(i.input==="nested"||[i.idField,i.parentField].includes(t.field))&&(e.editable=!1),r.hasChildren&&i.parentValues==="leaf-aggregate"&&i.aggregates?.some(a=>a.field===t.field)&&(e.derived=!0,e.editable=!1)}function N(e,t,r){return r==="identifier"||r==="dimension"||r==="date"?"center":r==="measure"?"right":r==="text"?"left":t?.kind==="number"||t?.kind==="percent"?"right":t?.kind==="date"||e instanceof Date||typeof e=="boolean"?"center":typeof e=="number"&&Number.isFinite(e)?"right":"left"}function T(e){if(e==null)return"";if(typeof e=="string"||typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function C(e,t){let r=l.mergeComponentStyles({fontSize:e.fontSizePt??l.DEFAULT_FONT_PT,bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor},t.style);return e.headerAlign!==void 0&&(r.align=e.headerAlign),r=l.mergeComponentStyles(r,e.headerStyle),t.headerAlign!==void 0&&(r.align=t.headerAlign),l.mergeComponentStyles(r,t.headerStyle)}function M(e,t,r){(r===null||typeof r=="string"||typeof r=="boolean"||typeof r=="number"&&Number.isFinite(r))&&(e.value=r);const n=t.format?.kind==="number"||t.format?.kind==="percent";t.valueType!==void 0?e.valueType=t.valueType:n&&(e.valueType="number"),t.editable!==void 0&&(e.editable=t.editable);const i=y(t.format);(typeof e.value=="number"||e.value==null)&&i!==void 0&&(e.numberFormat=i)}function F(e,t,r){const n=!!t.visibleWhen&&!p(r,t.visibleWhen),i=n?null:r[t.field],a=t.align??t.style?.align??e.align??"left";let s=l.mergeComponentStyles({fontSize:e.fontSizePt??l.DEFAULT_FONT_PT,verticalAlign:"middle"},t.style);s.align=a==="auto"?N(i,t.format,t.semanticRole):a;const o=t.rules?.find(f=>p(r,f.when));o&&(s=l.mergeComponentStyles(s,o.style));const d={text:t.format?b(i,t.format):T(i),style:s};return M(d,t,i),e.computed?.some(f=>f.field===t.field)&&(d.derived=!0,d.editable=!1),n&&(d.editable=!1),d}function A(e,t,r){const n=F(e,t,r.row),i=h(e,t,r);return t.field===e.tree.labelField&&(n.style={...n.style,align:"left"}),i&&(n.indentMm=i),D(n,t,r,e),n}function k(e){return typeof e=="string"&&/^data:image\/(png|jpe?g);base64,[A-Za-z0-9+/\r\n]+=*$/.test(e)}class m extends Error{constructor(t,r,n,i){super(`${t}: ${r}`),this.path=t,this.rowIndex=n,this.field=i,this.code="report-binding",this.name="ReportBindingError"}}function $(e,t,r={}){const n=r.rowIndex??0,a=`$.datasets.${r.dataset??"label"}[${n}].${t}`,s=Object.getOwnPropertyDescriptor(e,t);if(!s||s.get||s.set)throw new m(a,"字段必须是记录的自有数据字段,不能缺失、使用访问器或从原型继承",n,t);const o=s.value;if(o==null||typeof o=="string"||typeof o=="boolean"||typeof o=="number"&&Number.isFinite(o))return o;throw new m(a,"绑定值应为字符串、有限数字、布尔值或空值",n,t)}function w(e,t,r={}){const n=$(t,e.field,r);return n==null||n===""?e.emptyText??"":`${e.prefix??""}${b(n,e.format)}${e.suffix??""}`}exports.ReportBindingError=m;exports.applyListTreeMetadata=D;exports.evalStyleRule=p;exports.formatValue=b;exports.isLabelImageData=k;exports.listCellText=T;exports.listTreeIndent=h;exports.parseDateLocal=S;exports.readRecordScalar=$;exports.resolveComponentBinding=w;exports.resolveListAutoAlignment=N;exports.resolveListHeaderStyle=C;exports.resolveListSampleCell=F;exports.resolveTreeListSampleCell=A;exports.toExcelNumberFormat=y;exports.toNumber=g;
@@ -1,6 +1,5 @@
1
- import { c as h } from "./defaults-DXhiM1ZD.js";
2
- import { e as d } from "./style-CQ1PK8ZB.js";
3
- import { d as S, p as l, h as g } from "./computed-C-4C2S5h.js";
1
+ import { f as d, i as h } from "./style-67OqfNed.js";
2
+ import { d as S, p as l, h as g } from "./computed-BW5a8QFk.js";
4
3
  function N(e) {
5
4
  if (!e || e.kind === "date") return;
6
5
  const t = e.digits;
@@ -133,7 +132,7 @@ function k(e) {
133
132
  return String(e);
134
133
  }
135
134
  }
136
- function R(e, t) {
135
+ function I(e, t) {
137
136
  let r = d({ fontSize: e.fontSizePt ?? h, bold: e.headerBold ?? !0, align: "center", verticalAlign: "middle", backgroundColor: e.headerBackgroundColor }, t.style);
138
137
  return e.headerAlign !== void 0 && (r.align = e.headerAlign), r = d(r, e.headerStyle), t.headerAlign !== void 0 && (r.align = t.headerAlign), d(r, t.headerStyle);
139
138
  }
@@ -153,11 +152,11 @@ function A(e, t, r) {
153
152
  const f = { text: t.format ? y(i, t.format) : k(i), style: s };
154
153
  return w(f, t, i), e.computed?.some((u) => u.field === t.field) && (f.derived = !0, f.editable = !1), n && (f.editable = !1), f;
155
154
  }
156
- function z(e, t, r) {
155
+ function R(e, t, r) {
157
156
  const n = A(e, t, r.row), i = x(e, t, r);
158
157
  return t.field === e.tree.labelField && (n.style = { ...n.style, align: "left" }), i && (n.indentMm = i), M(n, t, r, e), n;
159
158
  }
160
- function B(e) {
159
+ function z(e) {
161
160
  return typeof e == "string" && /^data:image\/(png|jpe?g);base64,[A-Za-z0-9+/\r\n]+=*$/.test(e);
162
161
  }
163
162
  class b extends Error {
@@ -172,21 +171,21 @@ function L(e, t, r = {}) {
172
171
  if (o == null || typeof o == "string" || typeof o == "boolean" || typeof o == "number" && Number.isFinite(o)) return o;
173
172
  throw new b(a, "绑定值应为字符串、有限数字、布尔值或空值", n, t);
174
173
  }
175
- function E(e, t, r = {}) {
174
+ function B(e, t, r = {}) {
176
175
  const n = L(t, e.field, r);
177
176
  return n == null || n === "" ? e.emptyText ?? "" : `${e.prefix ?? ""}${y(n, e.format)}${e.suffix ?? ""}`;
178
177
  }
179
178
  export {
180
179
  b as R,
181
- z as a,
182
- E as b,
183
- R as c,
180
+ R as a,
181
+ B as b,
182
+ I as c,
184
183
  p as d,
185
184
  m as e,
186
185
  y as f,
187
186
  L as g,
188
187
  T as h,
189
- B as i,
188
+ z as i,
190
189
  x as j,
191
190
  M as k,
192
191
  k as l,
@@ -1,5 +1,5 @@
1
- import { v as F } from "./dataset-H5pFuQGU.js";
2
- import { v as D, e as z, p as Z } from "./template-registry-BtaKPELV.js";
1
+ import { v as F } from "./dataset-DL83majE.js";
2
+ import { v as D, e as z, p as Z } from "./template-registry-u11fPd8D.js";
3
3
  import { r as N } from "./grid-geometry-BNptEcMm.js";
4
4
  function v(t) {
5
5
  let e = "";
@@ -1,3 +1,3 @@
1
- "use strict";const F=require("./dataset-BkRmwgeJ.cjs"),R=require("./template-registry-Co1zPq5e.cjs"),N=require("./grid-geometry-CZ_cYB6O.cjs");function S(t){let e="";for(let o=t;o>0;o=Math.floor((o-1)/26))e=String.fromCharCode(65+(o-1)%26)+e;return e}function M(t){return`${S(t.left)}${t.top}:${S(t.right)}${t.bottom}`}function _(t){let e=0;for(const o of t.toUpperCase())e=e*26+o.charCodeAt(0)-64;return e}function d(t){if(typeof t!="string")throw new Error("Excel 范围应为 A1:B20 格式的字符串");const e=/^\$?([A-Z]{1,3})\$?([1-9]\d{0,6})(?::\$?([A-Z]{1,3})\$?([1-9]\d{0,6}))?$/i.exec(t.trim());if(!e)throw new Error(`Excel 范围无效:${t}`);const o={left:_(e[1]),top:Number(e[2]),right:_(e[3]??e[1]),bottom:Number(e[4]??e[2])};if(o.right<o.left||o.bottom<o.top||o.right>16384||o.bottom>1048576)throw new Error(`Excel 范围超出边界或顺序无效:${t}`);return o}function mt(t,e){if(e!==void 0)return d(e);const o=t.model.rows??[];if(!o.length)return{top:1,left:1,bottom:1,right:1};const r={top:1/0,left:1/0,bottom:1,right:1};for(const n of o)r.top=Math.min(r.top,n.number),r.bottom=Math.max(r.bottom,n.number),r.left=Math.min(r.left,n.min||1),r.right=Math.max(r.right,n.max||1);return r}function dt(t,e,o){const r=t.bottom-t.top+1,n=t.right-t.left+1;if(r>e.limits.maxRows||n>e.limits.maxColumns||r*n>o)throw new Error(`Excel 范围 ${M(t)} 超过导入行、列或单元格上限;请用 sheets/range 缩小范围`);return r*n}function pt(t,e){return t.top<=e.bottom&&t.bottom>=e.top&&t.left<=e.right&&t.right>=e.left}function ut(t,e){const o=[];for(const r of t.model.merges){const n=d(r);if(pt(e,n)){if(n.left<e.left||n.right>e.right||n.top<e.top||n.bottom>e.bottom)throw new Error(`${t.name}: 范围 ${M(e)} 截断合并单元格 ${r},请包含完整合并区域`);o.push(n)}}return o}function wt(t,e){const o=new Map;for(const n of e)o.set(n.top,Math.max(o.get(n.top)??n.top,n.bottom));const r=[];for(let n=t.top;n<=t.bottom;){let s=o.get(n)??n;for(let a=n;a<=s;a++)s=Math.max(s,o.get(a)??a);r.push({top:n,bottom:s}),n=s+1}return r}function yt(t,e,o,r){const n=[];let s,a=0;for(const i of t){const c=i.bottom-i.top+1;if(c>200)throw new Error("合并单元格跨越超过 200 行,无法安全分段;请先缩小或拆分该合并区域");let l=0;for(let h=i.top;h<=i.bottom;h++)l+=r(h);if(l>o&&Number.isFinite(o))throw new Error("合并区域或单行高度超过标准纸张可用高度;请使用 wide 或调整原模板行高");const f=s?i.bottom-s.top+1:c;s&&(f>e||a+l>o)&&(n.push(s),s=void 0,a=0),s?s.bottom=i.bottom:s={...i},a+=l}return s&&n.push(s),n}function Et(t){const e=new Map,o=new Set;for(const r of t){e.set(`${r.top}:${r.left}`,r);for(let n=r.top;n<=r.bottom;n++)for(let s=r.left;s<=r.right;s++)(n!==r.top||s!==r.left)&&o.add(`${n}:${s}`)}return{masters:e,covered:o}}function O(t){return JSON.parse(JSON.stringify(t))}function Mt(t,e){const o=t.template.pages.slice(e.pageStart,e.pageStart+e.pageCount),r=o[0];if(!r)throw new Error(`工作表 ${e.name} 没有可绑定页面`);const n=new Map;let s=[];for(const a of o)for(const i of a.components){if(i.kind==="list"||!i.grid||i.meta?.xlsxSheet!==e.name)continue;const c=d(String(i.meta.xlsxRange)),l=i.grid;s=l.colWidthsMm??[],l.cells.forEach((f,h)=>n.set(c.top+h,{cells:O(f),height:l.rowHeightsMm?.[h]??6}))}if(!s.length||!n.size)throw new Error(`工作表 ${e.name} 缺少导入几何元数据`);return{rows:n,widths:[...s],page:r,range:d(e.range)}}function G(t,e,o){const r=[],n=[];for(let s=e;s<=o;s++){const a=t.rows.get(s);if(!a)throw new Error(`导入模板缺少第 ${s} 行`);for(const i of a.cells)if(i&&s+(i.rowSpan??1)-1>o)throw new Error(`第 ${s} 行合并区域跨越绑定边界,请调整 header/detail 范围`);r.push(O(a.cells)),n.push(a.height)}return{cells:r,rowHeightsMm:n,colWidthsMm:t.widths,paddingMm:.25}}function xt(t,e){const o=d(t.header),r=t.detail?d(t.detail):{...e.range,top:o.bottom+1};for(const n of[o,r])if(n.left!==e.range.left||n.right!==e.range.right||n.top<e.range.top||n.bottom>e.range.bottom||n.top>n.bottom)throw new Error("绑定区域必须位于导入选区内并覆盖其完整列宽");if(r.top!==o.bottom+1)throw new Error("detail 应紧接 header,避免静态内容被隐式删除");if(t.columns.length!==e.widths.length)throw new Error("columns 应逐列映射整个选区;不能自动猜测业务字段");return bt(e,[o.top,o.bottom+1,r.bottom+1]),{header:o,detail:r}}function bt(t,e){for(const[o,r]of t.rows)for(const n of r.cells){const s=o+(n?.rowSpan??1);if(e.some(a=>o<a&&s>a))throw new Error(`第 ${o} 行合并区域跨越绑定边界,请调整 header/detail 范围`)}}function $t(t,e){const o=[];for(const r of N.resolveGridLayout(t,e.reduce((n,s)=>n+s,0),100).cells)for(let n=r.ci;n<Math.min(e.length,r.ci+(r.cell.colSpan??1));n++)o[n]=r.cell;return o}function St(t,e,o,r){if(e)return e;const n=t?.numberFormat;if(!n||n==="General")return;const s=/^(#,##)?0(?:\.(0+))?(%)?$/.exec(n);if(s){const a=s[2]?.length??0;if(a<=100)return s[3]?{kind:"percent",digits:a}:{kind:"number",digits:a,...s[1]?{thousands:!0}:{}}}r.push(`${o}: Excel 数字格式 ${n} 未自动套用到动态数据,请在 columns 中显式声明 format`)}function Rt(t,e,o,r,n){const s=$t(e,r),a=N.resolveGridLayout(o,r.reduce((f,h)=>f+h,0),20).cells;if(a.some(({cell:f})=>(f.colSpan??1)!==1||(f.rowSpan??1)!==1))throw new Error("动态明细样例行不能包含合并格;合并表头可以保留");const i=new Map(a.map(f=>[f.ci,f.cell])),c=new Set,l=t.columns.map((f,h)=>{const g=typeof f=="string"?{field:f}:f;if(!g||typeof g.field!="string"||!g.field.trim()||c.has(g.field))throw new Error(`columns[${h}] 需要唯一的非空 field`);c.add(g.field);const m=s[h]?.text??g.field,p=i.get(h),w=t.inferSampleFormats===!1?g.format:St(p,g.format,g.field,n);return{...g,...w?{format:w}:{},header:g.header??m,widthMm:r[h],style:{...p?.style,...g.style},...g.semanticRole&&!g.align?{align:"auto"}:{},...g.editable===void 0&&p?.editable===!1?{editable:!1}:{}}});return vt(t,s,l),l}function vt(t,e,o){const r=new Map;t.columns.forEach((n,s)=>{const a=e[s];if(!a||typeof n=="string")return;const i=r.get(a)??{style:{}};if(n.header!==void 0){if(i.text!==void 0&&i.text!==n.header)throw new Error("同一合并表头不能配置不同 header");i.text=n.header}kt(i.style,{...n.headerAlign?{align:n.headerAlign}:{},...n.headerStyle}),r.set(a,i)});for(const[n,s]of r)s.text!==void 0&&Object.assign(n,{text:s.text,rawText:s.text,value:s.text}),n.style={...n.style,...s.style},e.forEach((a,i)=>{a===n&&(s.text!==void 0&&(o[i].header=s.text),s.style.align!==void 0&&(o[i].headerAlign=s.style.align))})}function kt(t,e){for(const o of Object.keys(e))if(e[o]!==void 0){if(t[o]!==void 0&&t[o]!==e[o])throw new Error(`同一合并表头不能配置不同 ${o}`);Object.assign(t,{[o]:e[o]})}}function Bt(t,e){const o=t.page,r=e.rowHeightsMm.reduce((n,s)=>n+s,0);return{...o,heightMm:Math.max(o.heightMm,r+(o.marginTopMm??0)+(o.marginBottomMm??0)),components:[{kind:"rect",leftMm:o.marginLeftMm??0,topMm:o.marginTopMm??0,widthMm:t.widths.reduce((n,s)=>n+s,0),heightMm:r,grid:e}]}}function At(t,e,o,r){const n=Mt(t,e),{header:s,detail:a}=xt(o,n),i=G(n,n.range.top,s.bottom),c=G(n,a.top,a.top),l={...n.page,components:[]},f={kind:"list",id:`bound:${e.name}`,dataset:o.dataset??"detail",title:e.name,leftMm:l.marginLeftMm??0,topMm:l.marginTopMm??0,widthMm:n.widths.reduce((h,g)=>h+g,0),layout:l.layout??"page",headerGrid:i,columns:Rt(o,i,c,n.widths,r),rowHeightMm:c.rowHeightsMm[0],headerEveryPage:!0,align:"auto",paddingMm:.25,...o.rowKey?{rowKey:o.rowKey}:{},...o.revisionField?{revisionField:o.revisionField}:{},...o.sourceTokenField?{sourceTokenField:o.sourceTokenField}:{},...o.groupBy?{groupBy:o.groupBy}:{},...o.grandTotal===void 0?{}:{grandTotal:o.grandTotal}};return l.components.push(f),a.bottom===n.range.bottom?[l]:(r.push(`${e.name}: 明细区域后的静态内容保留为后续独立页面,不推断动态页脚定位`),[l,Bt(n,G(n,a.bottom+1,n.range.bottom))])}function V(t,e){const o=R.validateReportTemplate(t.template);if(!o.ok)throw new Error(`导入模板无效:${o.errors[0]?.message}`);if(!e.length)throw new Error("至少需要一个 Excel 业务绑定");const r=new Map;for(const c of e){if(!t.sheets.some(l=>l.name===c.sheet)||r.has(c.sheet))throw new Error(`绑定工作表不存在或重复:${c.sheet}`);r.set(c.sheet,c)}const n=[...t.warnings],s=t.sheets.flatMap(c=>{const l=r.get(c.name);return l?At(t,c,l,n):O(t.template.pages.slice(c.pageStart,c.pageStart+c.pageCount))}),a={...O(t.template),pages:s},i=R.validateReportTemplate(a);if(!i.ok)throw new Error(`业务模板无效:${i.errors[0]?.path} ${i.errors[0]?.message}`);return{template:a,warnings:n}}function z(t){const e=t.semanticRole??(t.type==="number"||t.type==="decimal"?"measure":t.type==="date"?"date":"text");return{field:t.field,semanticRole:e,editable:!1,...t.type==="number"&&t.digits!==void 0?{format:{kind:"number",digits:t.digits}}:{},...t.type==="date"?{format:{kind:"date",pattern:"YYYY-MM-DD"}}:{}}}function Ct(t){return t===null||typeof t=="string"||typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t)}function H(t,e=0){if(Ct(t))return;if(!t||typeof t!="object"||e>16)throw new Error("绑定会话元数据只允许有限深度的普通 JSON 值");const o=Object.getPrototypeOf(t);if(Array.isArray(t)?o!==Array.prototype:o!==Object.prototype&&o!==null)throw new Error("绑定会话不能包含特殊对象原型");if(Object.getOwnPropertySymbols(t).length)throw new Error("绑定会话不能包含 Symbol");if(Array.isArray(t)&&Object.keys(t).length!==t.length)throw new Error("绑定会话数组不能包含空位或额外属性");for(const[r,n]of Object.entries(Object.getOwnPropertyDescriptors(t)))if(!(Array.isArray(t)&&r==="length")){if(["__proto__","prototype","constructor"].includes(r)||n.get||n.set||!n.enumerable)throw new Error("绑定会话包含不安全元数据");H(n.value,e+1)}}function Ot(t,e){return Tt(t,e)}function Tt(t,e){const o=t.sheets.find(c=>c.name===e.sheet);if(!o)return[];const r=d(e.regions.header),n=d(e.regions.detail),s=[r.top,r.bottom+1,n.bottom+1],a=[],i=new Set;for(const c of t.template.pages.slice(o.pageStart,o.pageStart+o.pageCount))for(const l of c.components){if(l.kind==="list"||!l.grid||l.meta?.xlsxSheet!==e.sheet)continue;const f=d(String(l.meta.xlsxRange));l.grid.cells.forEach((h,g)=>{const m=f.top+g;for(const p of h){const w=s.some(b=>m<b&&m+(p?.rowSpan??1)>b),x=m===n.top&&((p?.rowSpan??1)>1||(p?.colSpan??1)>1);if(!w&&!x)continue;const E=w?"$.recipe.regions":"$.recipe.regions.detail";i.has(E)||(i.add(E),a.push({path:E,code:"region",message:w?`第 ${m} 行合并区域跨越绑定边界,请选择完整合并区域`:"动态明细原型行不能包含合并格"}))}})}return a}function Z(t){return JSON.parse(JSON.stringify(t))}function T(t){return t instanceof Error?t.message:String(t)}function u(t,e,o,r){t.push({path:e,code:o,message:r})}function U(t,e){return{fields:t.fields,...e?{rowKey:e}:{}}}function Ft(t,e){const o=new Set;for(const[r,n]of t.entries()){const s=`$.datasets[${r}]`;if(!n||typeof n.id!="string"||!n.id.trim()||o.has(n.id)){u(e,s,"schema","数据集标识应非空且唯一");continue}o.add(n.id);try{F.validateDatasetRows([],U(n,n.rowKey));for(const[a,i]of n.fields.entries())i.digits!==void 0&&(!Number.isInteger(i.digits)||i.digits<0||i.digits>100)&&u(e,`${s}.fields[${a}].digits`,"schema","显示精度应为 0–100 的整数")}catch(a){u(e,s,"schema",T(a))}}}function Nt(t,e,o){const r=t.sheets.find(i=>i.name===e.sheet);if(!r){u(o,"$.recipe.sheet","source","指定的工作表不存在");return}let n;try{n=d(r.range)}catch(i){u(o,"$.source.sheets","source",T(i));return}const s=new Map;for(const i of["title","header","detail","footer"]){const c=e.regions?.[i];if(!(!c&&(i==="title"||i==="footer")))try{const l=d(c??"");if(l.left!==n.left||l.right!==n.right||l.top<n.top||l.bottom>n.bottom)throw new Error("区域必须覆盖选区完整列宽,并位于原始工作表内");s.set(i,l)}catch(l){u(o,`$.recipe.regions.${i}`,"region",T(l))}}const a=[...s.values()];a.length&&(a[0].top!==n.top||a[a.length-1].bottom!==n.bottom)&&u(o,"$.recipe.regions","region","标题、表头、明细、页脚应完整覆盖来源,不能隐式删除静态内容");for(let i=1;i<a.length;i++)a[i].top!==a[i-1].bottom+1&&u(o,"$.recipe.regions","region","各区域应顺序相邻且不重叠")}function It(t,e,o,r){if(!Array.isArray(t.fields)||t.fields.length!==o)return u(r,"$.recipe.fields","mapping","每个物理 Excel 列必须显式绑定一个业务字段"),0;const n=new Set(e.fields.map(i=>i.field)),s=new Set;let a=0;t.fields.forEach((i,c)=>{typeof i!="string"||!n.has(i)?u(r,`$.recipe.fields[${c}]`,"mapping","请选择契约中已声明的字段"):s.has(i)?u(r,`$.recipe.fields[${c}]`,"mapping","同一业务字段不能重复绑定物理列"):(a++,s.add(i))});try{if(!t.rowKey)throw new Error("请明确选择稳定业务主键,不能使用展示行号");const i=U(e,t.rowKey),c=F.validateDatasetRows(e.samples??[],i,{path:`$.datasets.${e.id}.samples`,maxRows:100,maxCells:2e5,maxIssues:30});for(const l of c.issues)u(r,l.path,l.code==="row-key"?"row-key":"schema",l.message)}catch(i){u(r,"$.recipe.rowKey","row-key",T(i))}return a}function Q(t,e){const o=[];return!e||e.version!=="1.0"?[{path:"$.recipe.version",code:"schema",message:"不支持的 Excel 绑定配置版本"}]:(Nt(t,e,o),o.length||o.push(...Ot(t,e)),o)}function X(t,e,o){const r=[];if(!e||e.version!=="1.0")return{ok:!1,issues:[{path:"$.recipe.version",code:"schema",message:"不支持的 Excel 绑定配置版本"}],mapped:0,total:0};Ft(o,r);const n=t.sheets.find(i=>i.name===e.sheet)?.columnCount??0,s=o.find(i=>i.id===e.dataset);let a=0;return s?r.some(i=>i.code==="schema")||(a=It(e,s,n,r)):u(r,"$.recipe.dataset","schema","请明确选择宿主提供的数据集契约"),{ok:r.length===0,issues:r,mapped:a,total:n}}function tt(t,e,o){const r=X(t,e,o);if(!e||e.version!=="1.0")return r;const n=[...Q(t,e),...r.issues];return{...r,ok:n.length===0,issues:n}}function Kt(t,e,o,r){const n=tt(t,e,o);if(!n.ok)throw new Error(n.issues.map(f=>`${f.path}: ${f.message}`).join(`
1
+ "use strict";const F=require("./dataset-IrlXbUvh.cjs"),R=require("./template-registry-CpysHAxy.cjs"),N=require("./grid-geometry-CZ_cYB6O.cjs");function S(t){let e="";for(let o=t;o>0;o=Math.floor((o-1)/26))e=String.fromCharCode(65+(o-1)%26)+e;return e}function M(t){return`${S(t.left)}${t.top}:${S(t.right)}${t.bottom}`}function _(t){let e=0;for(const o of t.toUpperCase())e=e*26+o.charCodeAt(0)-64;return e}function d(t){if(typeof t!="string")throw new Error("Excel 范围应为 A1:B20 格式的字符串");const e=/^\$?([A-Z]{1,3})\$?([1-9]\d{0,6})(?::\$?([A-Z]{1,3})\$?([1-9]\d{0,6}))?$/i.exec(t.trim());if(!e)throw new Error(`Excel 范围无效:${t}`);const o={left:_(e[1]),top:Number(e[2]),right:_(e[3]??e[1]),bottom:Number(e[4]??e[2])};if(o.right<o.left||o.bottom<o.top||o.right>16384||o.bottom>1048576)throw new Error(`Excel 范围超出边界或顺序无效:${t}`);return o}function mt(t,e){if(e!==void 0)return d(e);const o=t.model.rows??[];if(!o.length)return{top:1,left:1,bottom:1,right:1};const r={top:1/0,left:1/0,bottom:1,right:1};for(const n of o)r.top=Math.min(r.top,n.number),r.bottom=Math.max(r.bottom,n.number),r.left=Math.min(r.left,n.min||1),r.right=Math.max(r.right,n.max||1);return r}function dt(t,e,o){const r=t.bottom-t.top+1,n=t.right-t.left+1;if(r>e.limits.maxRows||n>e.limits.maxColumns||r*n>o)throw new Error(`Excel 范围 ${M(t)} 超过导入行、列或单元格上限;请用 sheets/range 缩小范围`);return r*n}function pt(t,e){return t.top<=e.bottom&&t.bottom>=e.top&&t.left<=e.right&&t.right>=e.left}function ut(t,e){const o=[];for(const r of t.model.merges){const n=d(r);if(pt(e,n)){if(n.left<e.left||n.right>e.right||n.top<e.top||n.bottom>e.bottom)throw new Error(`${t.name}: 范围 ${M(e)} 截断合并单元格 ${r},请包含完整合并区域`);o.push(n)}}return o}function wt(t,e){const o=new Map;for(const n of e)o.set(n.top,Math.max(o.get(n.top)??n.top,n.bottom));const r=[];for(let n=t.top;n<=t.bottom;){let s=o.get(n)??n;for(let a=n;a<=s;a++)s=Math.max(s,o.get(a)??a);r.push({top:n,bottom:s}),n=s+1}return r}function yt(t,e,o,r){const n=[];let s,a=0;for(const i of t){const c=i.bottom-i.top+1;if(c>200)throw new Error("合并单元格跨越超过 200 行,无法安全分段;请先缩小或拆分该合并区域");let l=0;for(let h=i.top;h<=i.bottom;h++)l+=r(h);if(l>o&&Number.isFinite(o))throw new Error("合并区域或单行高度超过标准纸张可用高度;请使用 wide 或调整原模板行高");const f=s?i.bottom-s.top+1:c;s&&(f>e||a+l>o)&&(n.push(s),s=void 0,a=0),s?s.bottom=i.bottom:s={...i},a+=l}return s&&n.push(s),n}function Et(t){const e=new Map,o=new Set;for(const r of t){e.set(`${r.top}:${r.left}`,r);for(let n=r.top;n<=r.bottom;n++)for(let s=r.left;s<=r.right;s++)(n!==r.top||s!==r.left)&&o.add(`${n}:${s}`)}return{masters:e,covered:o}}function O(t){return JSON.parse(JSON.stringify(t))}function Mt(t,e){const o=t.template.pages.slice(e.pageStart,e.pageStart+e.pageCount),r=o[0];if(!r)throw new Error(`工作表 ${e.name} 没有可绑定页面`);const n=new Map;let s=[];for(const a of o)for(const i of a.components){if(i.kind==="list"||!i.grid||i.meta?.xlsxSheet!==e.name)continue;const c=d(String(i.meta.xlsxRange)),l=i.grid;s=l.colWidthsMm??[],l.cells.forEach((f,h)=>n.set(c.top+h,{cells:O(f),height:l.rowHeightsMm?.[h]??6}))}if(!s.length||!n.size)throw new Error(`工作表 ${e.name} 缺少导入几何元数据`);return{rows:n,widths:[...s],page:r,range:d(e.range)}}function G(t,e,o){const r=[],n=[];for(let s=e;s<=o;s++){const a=t.rows.get(s);if(!a)throw new Error(`导入模板缺少第 ${s} 行`);for(const i of a.cells)if(i&&s+(i.rowSpan??1)-1>o)throw new Error(`第 ${s} 行合并区域跨越绑定边界,请调整 header/detail 范围`);r.push(O(a.cells)),n.push(a.height)}return{cells:r,rowHeightsMm:n,colWidthsMm:t.widths,paddingMm:.25}}function xt(t,e){const o=d(t.header),r=t.detail?d(t.detail):{...e.range,top:o.bottom+1};for(const n of[o,r])if(n.left!==e.range.left||n.right!==e.range.right||n.top<e.range.top||n.bottom>e.range.bottom||n.top>n.bottom)throw new Error("绑定区域必须位于导入选区内并覆盖其完整列宽");if(r.top!==o.bottom+1)throw new Error("detail 应紧接 header,避免静态内容被隐式删除");if(t.columns.length!==e.widths.length)throw new Error("columns 应逐列映射整个选区;不能自动猜测业务字段");return bt(e,[o.top,o.bottom+1,r.bottom+1]),{header:o,detail:r}}function bt(t,e){for(const[o,r]of t.rows)for(const n of r.cells){const s=o+(n?.rowSpan??1);if(e.some(a=>o<a&&s>a))throw new Error(`第 ${o} 行合并区域跨越绑定边界,请调整 header/detail 范围`)}}function $t(t,e){const o=[];for(const r of N.resolveGridLayout(t,e.reduce((n,s)=>n+s,0),100).cells)for(let n=r.ci;n<Math.min(e.length,r.ci+(r.cell.colSpan??1));n++)o[n]=r.cell;return o}function St(t,e,o,r){if(e)return e;const n=t?.numberFormat;if(!n||n==="General")return;const s=/^(#,##)?0(?:\.(0+))?(%)?$/.exec(n);if(s){const a=s[2]?.length??0;if(a<=100)return s[3]?{kind:"percent",digits:a}:{kind:"number",digits:a,...s[1]?{thousands:!0}:{}}}r.push(`${o}: Excel 数字格式 ${n} 未自动套用到动态数据,请在 columns 中显式声明 format`)}function Rt(t,e,o,r,n){const s=$t(e,r),a=N.resolveGridLayout(o,r.reduce((f,h)=>f+h,0),20).cells;if(a.some(({cell:f})=>(f.colSpan??1)!==1||(f.rowSpan??1)!==1))throw new Error("动态明细样例行不能包含合并格;合并表头可以保留");const i=new Map(a.map(f=>[f.ci,f.cell])),c=new Set,l=t.columns.map((f,h)=>{const g=typeof f=="string"?{field:f}:f;if(!g||typeof g.field!="string"||!g.field.trim()||c.has(g.field))throw new Error(`columns[${h}] 需要唯一的非空 field`);c.add(g.field);const m=s[h]?.text??g.field,p=i.get(h),w=t.inferSampleFormats===!1?g.format:St(p,g.format,g.field,n);return{...g,...w?{format:w}:{},header:g.header??m,widthMm:r[h],style:{...p?.style,...g.style},...g.semanticRole&&!g.align?{align:"auto"}:{},...g.editable===void 0&&p?.editable===!1?{editable:!1}:{}}});return vt(t,s,l),l}function vt(t,e,o){const r=new Map;t.columns.forEach((n,s)=>{const a=e[s];if(!a||typeof n=="string")return;const i=r.get(a)??{style:{}};if(n.header!==void 0){if(i.text!==void 0&&i.text!==n.header)throw new Error("同一合并表头不能配置不同 header");i.text=n.header}kt(i.style,{...n.headerAlign?{align:n.headerAlign}:{},...n.headerStyle}),r.set(a,i)});for(const[n,s]of r)s.text!==void 0&&Object.assign(n,{text:s.text,rawText:s.text,value:s.text}),n.style={...n.style,...s.style},e.forEach((a,i)=>{a===n&&(s.text!==void 0&&(o[i].header=s.text),s.style.align!==void 0&&(o[i].headerAlign=s.style.align))})}function kt(t,e){for(const o of Object.keys(e))if(e[o]!==void 0){if(t[o]!==void 0&&t[o]!==e[o])throw new Error(`同一合并表头不能配置不同 ${o}`);Object.assign(t,{[o]:e[o]})}}function Bt(t,e){const o=t.page,r=e.rowHeightsMm.reduce((n,s)=>n+s,0);return{...o,heightMm:Math.max(o.heightMm,r+(o.marginTopMm??0)+(o.marginBottomMm??0)),components:[{kind:"rect",leftMm:o.marginLeftMm??0,topMm:o.marginTopMm??0,widthMm:t.widths.reduce((n,s)=>n+s,0),heightMm:r,grid:e}]}}function At(t,e,o,r){const n=Mt(t,e),{header:s,detail:a}=xt(o,n),i=G(n,n.range.top,s.bottom),c=G(n,a.top,a.top),l={...n.page,components:[]},f={kind:"list",id:`bound:${e.name}`,dataset:o.dataset??"detail",title:e.name,leftMm:l.marginLeftMm??0,topMm:l.marginTopMm??0,widthMm:n.widths.reduce((h,g)=>h+g,0),layout:l.layout??"page",headerGrid:i,columns:Rt(o,i,c,n.widths,r),rowHeightMm:c.rowHeightsMm[0],headerEveryPage:!0,align:"auto",paddingMm:.25,...o.rowKey?{rowKey:o.rowKey}:{},...o.revisionField?{revisionField:o.revisionField}:{},...o.sourceTokenField?{sourceTokenField:o.sourceTokenField}:{},...o.groupBy?{groupBy:o.groupBy}:{},...o.grandTotal===void 0?{}:{grandTotal:o.grandTotal}};return l.components.push(f),a.bottom===n.range.bottom?[l]:(r.push(`${e.name}: 明细区域后的静态内容保留为后续独立页面,不推断动态页脚定位`),[l,Bt(n,G(n,a.bottom+1,n.range.bottom))])}function V(t,e){const o=R.validateReportTemplate(t.template);if(!o.ok)throw new Error(`导入模板无效:${o.errors[0]?.message}`);if(!e.length)throw new Error("至少需要一个 Excel 业务绑定");const r=new Map;for(const c of e){if(!t.sheets.some(l=>l.name===c.sheet)||r.has(c.sheet))throw new Error(`绑定工作表不存在或重复:${c.sheet}`);r.set(c.sheet,c)}const n=[...t.warnings],s=t.sheets.flatMap(c=>{const l=r.get(c.name);return l?At(t,c,l,n):O(t.template.pages.slice(c.pageStart,c.pageStart+c.pageCount))}),a={...O(t.template),pages:s},i=R.validateReportTemplate(a);if(!i.ok)throw new Error(`业务模板无效:${i.errors[0]?.path} ${i.errors[0]?.message}`);return{template:a,warnings:n}}function z(t){const e=t.semanticRole??(t.type==="number"||t.type==="decimal"?"measure":t.type==="date"?"date":"text");return{field:t.field,semanticRole:e,editable:!1,...t.type==="number"&&t.digits!==void 0?{format:{kind:"number",digits:t.digits}}:{},...t.type==="date"?{format:{kind:"date",pattern:"YYYY-MM-DD"}}:{}}}function Ct(t){return t===null||typeof t=="string"||typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t)}function H(t,e=0){if(Ct(t))return;if(!t||typeof t!="object"||e>16)throw new Error("绑定会话元数据只允许有限深度的普通 JSON 值");const o=Object.getPrototypeOf(t);if(Array.isArray(t)?o!==Array.prototype:o!==Object.prototype&&o!==null)throw new Error("绑定会话不能包含特殊对象原型");if(Object.getOwnPropertySymbols(t).length)throw new Error("绑定会话不能包含 Symbol");if(Array.isArray(t)&&Object.keys(t).length!==t.length)throw new Error("绑定会话数组不能包含空位或额外属性");for(const[r,n]of Object.entries(Object.getOwnPropertyDescriptors(t)))if(!(Array.isArray(t)&&r==="length")){if(["__proto__","prototype","constructor"].includes(r)||n.get||n.set||!n.enumerable)throw new Error("绑定会话包含不安全元数据");H(n.value,e+1)}}function Ot(t,e){return Tt(t,e)}function Tt(t,e){const o=t.sheets.find(c=>c.name===e.sheet);if(!o)return[];const r=d(e.regions.header),n=d(e.regions.detail),s=[r.top,r.bottom+1,n.bottom+1],a=[],i=new Set;for(const c of t.template.pages.slice(o.pageStart,o.pageStart+o.pageCount))for(const l of c.components){if(l.kind==="list"||!l.grid||l.meta?.xlsxSheet!==e.sheet)continue;const f=d(String(l.meta.xlsxRange));l.grid.cells.forEach((h,g)=>{const m=f.top+g;for(const p of h){const w=s.some(b=>m<b&&m+(p?.rowSpan??1)>b),x=m===n.top&&((p?.rowSpan??1)>1||(p?.colSpan??1)>1);if(!w&&!x)continue;const E=w?"$.recipe.regions":"$.recipe.regions.detail";i.has(E)||(i.add(E),a.push({path:E,code:"region",message:w?`第 ${m} 行合并区域跨越绑定边界,请选择完整合并区域`:"动态明细原型行不能包含合并格"}))}})}return a}function Z(t){return JSON.parse(JSON.stringify(t))}function T(t){return t instanceof Error?t.message:String(t)}function u(t,e,o,r){t.push({path:e,code:o,message:r})}function U(t,e){return{fields:t.fields,...e?{rowKey:e}:{}}}function Ft(t,e){const o=new Set;for(const[r,n]of t.entries()){const s=`$.datasets[${r}]`;if(!n||typeof n.id!="string"||!n.id.trim()||o.has(n.id)){u(e,s,"schema","数据集标识应非空且唯一");continue}o.add(n.id);try{F.validateDatasetRows([],U(n,n.rowKey));for(const[a,i]of n.fields.entries())i.digits!==void 0&&(!Number.isInteger(i.digits)||i.digits<0||i.digits>100)&&u(e,`${s}.fields[${a}].digits`,"schema","显示精度应为 0–100 的整数")}catch(a){u(e,s,"schema",T(a))}}}function Nt(t,e,o){const r=t.sheets.find(i=>i.name===e.sheet);if(!r){u(o,"$.recipe.sheet","source","指定的工作表不存在");return}let n;try{n=d(r.range)}catch(i){u(o,"$.source.sheets","source",T(i));return}const s=new Map;for(const i of["title","header","detail","footer"]){const c=e.regions?.[i];if(!(!c&&(i==="title"||i==="footer")))try{const l=d(c??"");if(l.left!==n.left||l.right!==n.right||l.top<n.top||l.bottom>n.bottom)throw new Error("区域必须覆盖选区完整列宽,并位于原始工作表内");s.set(i,l)}catch(l){u(o,`$.recipe.regions.${i}`,"region",T(l))}}const a=[...s.values()];a.length&&(a[0].top!==n.top||a[a.length-1].bottom!==n.bottom)&&u(o,"$.recipe.regions","region","标题、表头、明细、页脚应完整覆盖来源,不能隐式删除静态内容");for(let i=1;i<a.length;i++)a[i].top!==a[i-1].bottom+1&&u(o,"$.recipe.regions","region","各区域应顺序相邻且不重叠")}function It(t,e,o,r){if(!Array.isArray(t.fields)||t.fields.length!==o)return u(r,"$.recipe.fields","mapping","每个物理 Excel 列必须显式绑定一个业务字段"),0;const n=new Set(e.fields.map(i=>i.field)),s=new Set;let a=0;t.fields.forEach((i,c)=>{typeof i!="string"||!n.has(i)?u(r,`$.recipe.fields[${c}]`,"mapping","请选择契约中已声明的字段"):s.has(i)?u(r,`$.recipe.fields[${c}]`,"mapping","同一业务字段不能重复绑定物理列"):(a++,s.add(i))});try{if(!t.rowKey)throw new Error("请明确选择稳定业务主键,不能使用展示行号");const i=U(e,t.rowKey),c=F.validateDatasetRows(e.samples??[],i,{path:`$.datasets.${e.id}.samples`,maxRows:100,maxCells:2e5,maxIssues:30});for(const l of c.issues)u(r,l.path,l.code==="row-key"?"row-key":"schema",l.message)}catch(i){u(r,"$.recipe.rowKey","row-key",T(i))}return a}function Q(t,e){const o=[];return!e||e.version!=="1.0"?[{path:"$.recipe.version",code:"schema",message:"不支持的 Excel 绑定配置版本"}]:(Nt(t,e,o),o.length||o.push(...Ot(t,e)),o)}function X(t,e,o){const r=[];if(!e||e.version!=="1.0")return{ok:!1,issues:[{path:"$.recipe.version",code:"schema",message:"不支持的 Excel 绑定配置版本"}],mapped:0,total:0};Ft(o,r);const n=t.sheets.find(i=>i.name===e.sheet)?.columnCount??0,s=o.find(i=>i.id===e.dataset);let a=0;return s?r.some(i=>i.code==="schema")||(a=It(e,s,n,r)):u(r,"$.recipe.dataset","schema","请明确选择宿主提供的数据集契约"),{ok:r.length===0,issues:r,mapped:a,total:n}}function tt(t,e,o){const r=X(t,e,o);if(!e||e.version!=="1.0")return r;const n=[...Q(t,e),...r.issues];return{...r,ok:n.length===0,issues:n}}function Kt(t,e,o,r){const n=tt(t,e,o);if(!n.ok)throw new Error(n.issues.map(f=>`${f.path}: ${f.message}`).join(`
2
2
  `));const s=t.sheets.find(f=>f.name===e.sheet),a={...t,sheets:[{...s,pageStart:0}],template:{...t.template,pages:t.template.pages.slice(s.pageStart,s.pageStart+s.pageCount)}},i=new Map(o.find(f=>f.id===e.dataset).fields.map(f=>[f.field,f])),c={sheet:e.sheet,dataset:e.dataset,header:e.regions.header,detail:e.regions.detail,rowKey:e.rowKey,inferSampleFormats:!1,columns:e.fields.map(f=>z(i.get(f)))},l=V(a,[c]);return{document:R.defineReportTemplate({...r,template:l.template}),recipe:Z(e),warnings:l.warnings}}function Gt(t,e){if(t?.version!=="1.0"||!Array.isArray(t.fields)||t.fields.length>16384||t.fields.some(o=>typeof o!="string"))throw new Error("Excel 绑定配置无效");if(typeof t.dataset!="string"||typeof t.rowKey!="string"||!t.regions||typeof e?.id!="string"||typeof e.name!="string")throw new Error("Excel 绑定参数或标识无效");for(const o of Object.values(t.regions))o!==""&&d(o)}function jt(t){for(const e of t.sheets)if(d(e.range),typeof e.name!="string"||![e.index,e.rowCount,e.columnCount,e.pageCount].every(o=>Number.isInteger(o)&&o>0)||!Number.isInteger(e.pageStart)||e.pageStart<0||e.pageStart+e.pageCount>t.template.pages.length)throw new Error("Excel 绑定工作表几何元数据无效")}function Ht(t,e,o){if(H({sheets:t.sheets,warnings:t.warnings,recipe:e,identity:o}),!Array.isArray(t.sheets)||!t.sheets.length||t.sheets.length>32||!Array.isArray(t.warnings)||t.warnings.some(r=>typeof r!="string"))throw new Error("Excel 绑定来源元数据无效");if(Gt(e,o),!t.sheets.some(r=>r.name===e.sheet))throw new Error("Excel 绑定工作表不存在");jt(t)}function et(t,e,o){return Ht(t,e,o),R.parseReportTemplate({schemaVersion:"1.0",id:o.id,name:o.name,template:t.template}),Z({version:"1.0",source:t,recipe:e,identity:o})}function Dt(t){if(typeof t=="string"&&t.length>1e7)throw new Error("Excel 绑定会话超过 1000 万字符上限");const e=typeof t=="string"?JSON.parse(t):t;if(!e||e.version!=="1.0"||e.recipe?.version!=="1.0"||!Array.isArray(e.source?.sheets))throw new Error("Excel 绑定会话结构或版本无效");return et(e.source,e.recipe,e.identity)}function Lt(t,e,o,r){const n=t.sheets.find(c=>c.name===e);if(!n)throw new Error("工作表不存在");const s=d(n.range),a=Math.min(o,r),i=Math.max(o,r);if(!Number.isInteger(a)||!Number.isInteger(i)||a<s.top||i>s.bottom)throw new Error("选中行超出来源区域");return M({...s,top:a,bottom:i})}function P(t,e,o){const r=t??e;if(!Number.isInteger(r)||r<1||r>o)throw new Error(`预览窗口大小应为 1–${o} 的整数`);return r}function Y(t,e,o){const r=t??e;if(!Number.isInteger(r))throw new Error("预览起点应为整数");return Math.max(e,Math.min(o,r))}function Jt(t,e,o={}){const r=t.sheets.find(g=>g.name===e);if(!r)throw new Error("指定的工作表不存在");const n=d(r.range),s=Y(o.row,n.top,n.bottom),a=Y(o.column,n.left,n.right),i=Math.min(n.bottom,s+P(o.rows,24,100)-1),c=Math.min(n.right,a+P(o.columns,12,32)-1),l=Array.from({length:i-s+1},(g,m)=>({row:s+m,cells:[]})),f=new Set;for(const g of t.template.pages.slice(r.pageStart,r.pageStart+r.pageCount))for(const m of g.components){if(m.kind==="list"||!m.grid||m.meta?.xlsxSheet!==e)continue;const p=d(String(m.meta.xlsxRange));if(p.bottom<s||p.top>i)continue;const w=N.resolveGridLayout(m.grid,m.widthMm,m.heightMm);for(const x of w.cells)h(x.cell,p.top+x.ri,p.left+x.ci)}for(const g of l){for(let m=a;m<=c;m++)f.has(`${g.row}:${m}`)||g.cells.push({address:`${S(m)}${g.row}`,row:g.row,column:m,text:"",rowSpan:1,colSpan:1,continued:!1});g.cells.sort((m,p)=>m.column-p.column)}return{top:s,bottom:i,left:a,right:c,source:n,rows:l,columns:Array.from({length:c-a+1},(g,m)=>({column:a+m,name:S(a+m)}))};function h(g,m,p){const w=m+(g.rowSpan??1)-1,x=p+(g.colSpan??1)-1;if(w<s||m>i||x<a||p>c)return;const E=Math.max(s,m),b=Math.max(a,p),J=Math.min(i,w)-E+1,W=Math.min(c,x)-b+1;l[E-s].cells.push({address:`${S(p)}${m}`,row:E,column:b,text:g.text??g.rawText??String(g.value??""),rowSpan:J,colSpan:W,continued:E!==m||b!==p,style:g.style});for(let I=E;I<E+J;I++)for(let K=b;K<b+W;K++)f.add(`${I}:${K}`)}}function v(t){return JSON.parse(JSON.stringify(t))}function ot(t,e){const o=t.sheets.find(i=>i.name===e);if(!o)throw new Error("指定的工作表不存在");const r=t.template.pages.slice(o.pageStart,o.pageStart+o.pageCount),n=r[0];if(!n)throw new Error("工作表没有可绑定的页面");const s={page:n,range:d(o.range),widths:[],heights:new Map,cells:[],cellsByRow:new Map,topOffsets:new Map};for(const i of r)for(const c of i.components){if(c.kind==="list"||!c.grid||c.meta?.xlsxSheet!==e)continue;const l=d(String(c.meta.xlsxRange));s.widths.length||(s.widths=[...c.grid.colWidthsMm??[]]),c.grid.cells.forEach((f,h)=>s.heights.set(l.top+h,c.grid.rowHeightsMm?.[h]??6));for(const f of N.resolveGridLayout(c.grid,c.widthMm,c.heightMm).cells){const h=l.top+f.ri,g=l.left+f.ci;s.cells.push({top:h,left:g,bottom:h+(f.cell.rowSpan??1)-1,right:g+(f.cell.colSpan??1)-1,cell:f.cell})}}if(s.widths.length!==s.range.right-s.range.left+1||s.heights.size!==s.range.bottom-s.range.top+1)throw new Error("来源工作表几何元数据不完整");let a=0;for(let i=s.range.top;i<=s.range.bottom;i++)s.topOffsets.set(i,a),a+=s.heights.get(i);s.topOffsets.set(s.range.bottom+1,a);for(const i of s.cells)for(let c=i.top;c<=i.bottom;c++){const l=s.cellsByRow.get(c)??[];l.push(i),s.cellsByRow.set(c,l)}return s}function rt(t,e){return t.left<=e.right&&e.left<=t.right&&t.top<=e.bottom&&e.top<=t.bottom}function k(t,e){return t.top<=e.top&&t.bottom>=e.bottom&&t.left<=e.left&&t.right>=e.right}function nt(t,e){return t.widths.slice(e.left-t.range.left,e.right-t.range.left+1).reduce((o,r)=>o+r,0)}function C(t,e){return(t.topOffsets.get(e.bottom+1)??0)-(t.topOffsets.get(e.top)??0)}function A(t,e){const o=new Set;for(let r=e.top;r<=e.bottom;r++)for(const n of t.cellsByRow.get(r)??[])rt(n,e)&&o.add(n);return[...o]}function st(t,e){for(const o of A(t,e))if(!k(e,o))throw new Error(`合并区域 ${M(o)} 跨越选区 ${M(e)}`)}function j(t,e,o=[]){const r=A(t,e);for(const i of r)if(!k(e,i))throw new Error(`合并区域 ${M(i)} 跨越选区 ${M(e)}`);const n=[],s=new Map,a=new Set;for(const i of r)if(!o.some(c=>k(c,i))){s.set(`${i.top}:${i.left}`,i);for(let c=i.top;c<=i.bottom;c++)for(let l=i.left;l<=i.right;l++)a.add(`${c}:${l}`)}for(let i=e.top;i<=e.bottom;i++){const c=[];for(let l=e.left;l<=e.right;l++){const f=s.get(`${i}:${l}`);f?(c.push(v(f.cell)),l=f.right):a.has(`${i}:${l}`)||c.push(null)}n.push(c)}return{cells:n,colWidthsMm:t.widths.slice(e.left-t.range.left,e.right-t.range.left+1),rowHeightsMm:Array.from({length:e.bottom-e.top+1},(i,c)=>t.heights.get(e.top+c)),paddingMm:.25}}function B(t){const e=d(t.range);return t.headerRange?{...e,top:d(t.headerRange).top}:e}function D(t,e){return(t.page.marginTopMm??0)+(t.topOffsets.get(e)??0)}function it(t,e){return{xlsxFlow:{version:"1.0",columnStart:e.left-t.range.left}}}function at(t,e,o,r,n=[]){const s=j(t,o,n);for(const a of s.cells)for(const i of a)i&&(i.editable=!1,delete i.source);return{kind:"rect",nid:r,leftMm:t.page.marginLeftMm??0,topMm:D(t,o.top),widthMm:nt(t,o),heightMm:C(t,o),grid:s,meta:it(t,o)}}function Wt(t,e,o,r){const n=d(o.range),s=B(o),a=j(t,n),i=new Map(r.fields.map(f=>[f.field,f])),c=a.colWidthsMm,l=o.fields.map((f,h)=>({...z(i.get(f)),header:i.get(f).label??f,widthMm:c[h],style:v(a.cells[0]?.[h]?.style??{}),align:"auto"}));return{kind:"list",id:`xlsx-region:${o.id}`,dataset:o.dataset,rowKey:o.rowKey,...o.revisionField?{revisionField:o.revisionField}:{},...o.sourceTokenField?{sourceTokenField:o.sourceTokenField}:{},title:`${e.sheet} · ${o.id}`,layout:t.page.layout??"wide",leftMm:(t.page.marginLeftMm??0)+t.widths.slice(0,n.left-t.range.left).reduce((f,h)=>f+h,0),topMm:D(t,s.top),widthMm:nt(t,n),rowHeightMm:a.rowHeightsMm[0],header:!!o.headerRange,headerEveryPage:o.mode==="repeat",...o.mode==="record"?{cardinality:"record"}:{},...o.headerRange?{headerGrid:j(t,d(o.headerRange))}:{},columns:l,paddingMm:a.paddingMm,meta:it(t,n)}}function q(t,e,o,r=0){const n=[],s=t.page.heightMm-(t.page.marginTopMm??0)-(t.page.marginBottomMm??0)-r,a=Math.max(1,Math.min(100,Math.floor(1e4/t.widths.length)));for(let i=e;i<=o;){const c=i;let l=i,f=0;for(;i<=o;){let h=i;for(let m=i;m<=h;m++)for(const p of t.cellsByRow.get(m)??[])h=Math.max(h,p.bottom);if(h>o)throw new Error("静态合并区域跨越动态绑定边界,请调整区域");const g=C(t,{...t.range,top:i,bottom:h});if(i>c&&(h-c+1>a||f+g>s))break;if(g>s)throw new Error("静态合并区域高度超过单页可用高度,请调整原始模板");f+=g,l=h,i=h+1}n.push({range:{...t.range,top:c,bottom:l},bindings:[]})}return n}function _t(t,e){const o=[...e.regions].sort((i,c)=>B(i).top-B(c).top),r=[];let n=t.range.top;const s=e.footerRange?C(t,d(e.footerRange)):0;for(const i of o){const c=B(i),l=r[r.length-1];if(l?.bindings.length&&l.range.top===c.top&&l.range.bottom===c.bottom){l.bindings.push(i);continue}n<c.top&&r.push(...q(t,n,c.top-1,s)),r.push({range:{...t.range,top:c.top,bottom:c.bottom},bindings:[i]}),n=c.bottom+1}const a=e.footerRange?d(e.footerRange).top-1:t.range.bottom;return n<=a&&r.push(...q(t,n,a,s)),r}function Pt(t,e,o,r,n){const s=[],a=o.bindings.map(B),i=o.bindings.some(l=>l.mode==="repeat"),c=A(t,o.range).some(l=>!a.some(f=>k(f,l)));!i&&(!o.bindings.length||c)&&s.push(at(t,e,o.range,`xlsx-static:${r}`,a));for(const l of o.bindings)s.push(Wt(t,e,l,n.find(f=>f.id===l.dataset)));return{components:s,flow:{componentIds:s.map(l=>l.kind==="list"?l.id:l.nid),topMm:D(t,o.range.top),heightMm:C(t,o.range)}}}function Yt(t,e,o,r){const n=ot(t,e.sheet),s={...v(n.page),components:[]},a=_t(n,e).map((i,c)=>Pt(n,e,i,c,o));if(s.components=a.flatMap(i=>i.components),s.flow={bands:a.map(i=>i.flow)},s.meta={xlsxFlow:{version:"1.0",templateId:r,sheet:e.sheet,fullWidthsMm:n.widths}},e.footerRange){const i=d(e.footerRange),c=at(n,e,i,"xlsx-footer");c.pageAnchor="footer",c.topMm=s.heightMm-(s.marginBottomMm??0)-c.heightMm,s.components.push(c)}return{...v(t.template),pages:[s]}}function $(t){return t instanceof Error?t.message:String(t)}function y(t,e,o,r){t.push({path:e,code:o,message:r})}function L(t,e,o=!1){const r=d(t);if(!k(e.range,r))throw new Error("绑定范围应完整位于来源工作表内");if(o&&r.top!==r.bottom)throw new Error("每个动态区域应选择一行原型;多个数据行由 repeat 自动扩展");return st(e,r),r}function qt(t){const e=t.cell;return!!e.formula||!!e.children?.length||e.value!==null&&e.value!==void 0&&e.value!==""||!!e.text||!!e.rawText}function Vt(t,e,o){if(!t.headerRange)return;const r=L(t.headerRange,e);if(r.left!==o.left||r.right!==o.right||r.bottom+1!==o.top)throw new Error("区域表头应与原型等列宽,并紧接原型上方");return r}function zt(t,e){const o=L(t.range,e,!0),r=Vt(t,e,o);if(st(e,{...e.range,top:r?.top??o.top,bottom:o.bottom}),A(e,o).some(s=>s.bottom!==s.top||s.left!==s.right))throw new Error("动态原型行不能包含合并格;请保留合并表头并选择其下方数据行");if(t.mode==="repeat"){const s={...e.range,top:r?.top??o.top,bottom:o.bottom};if(A(e,s).some(a=>!k({...o,top:s.top},a)&&qt(a)))throw new Error("纵向重复区域的旁列存在静态内容,无法安全拉伸;请扩大区域或将静态内容移至独立行")}return{...o,top:r?.top??o.top}}function lt(t){if(!t||t.version!=="2.0"||typeof t.sheet!="string"||!Array.isArray(t.regions)||!t.regions.length||t.regions.length>128)throw new Error("多区域绑定应为 version 2.0,并包含 1–128 个区域")}function ct(t,e){const o=[];try{lt(e)}catch(a){return[{path:"$.recipe",code:"schema",message:$(a)}]}let r;try{r=ot(t,e.sheet)}catch(a){return[{path:"$.recipe.sheet",code:"source",message:$(a)}]}const n=new Set,s=[];if(e.regions.forEach((a,i)=>{const c=`$.recipe.regions[${i}]`;try{if(!a||typeof a.id!="string"||!a.id.trim()||n.has(a.id))throw new Error("区域标识应非空且唯一");if(n.add(a.id),!["record","repeat"].includes(a.mode))throw new Error("区域模式应为 record 或 repeat");const l=zt(a,r);for(const f of s){if(rt(l,f.range))throw new Error(`区域与 ${f.path} 重叠(含表头)`);if(l.top<=f.range.bottom&&f.range.top<=l.bottom&&(a.mode==="repeat"||f.mode==="repeat"))throw new Error("同一行不能并排放置重复区域;请按纵向顺序排列");if(l.top<=f.range.bottom&&f.range.top<=l.bottom&&(l.top!==f.range.top||l.bottom!==f.range.bottom))throw new Error("并排单记录区域应使用相同的起止行(包括表头),避免不明确的位移")}s.push({range:l,mode:a.mode,path:c})}catch(l){y(o,c,"region",$(l))}}),e.footerRange)try{const a=L(e.footerRange,r);if(a.left!==r.range.left||a.right!==r.range.right||a.bottom!==r.range.bottom)throw new Error("重复页尾应覆盖完整列宽并位于来源最后几行");if(s.some(i=>i.range.bottom>=a.top))throw new Error("页尾与动态区域或区域表头相交");if(C(r,a)>=r.page.heightMm-(r.page.marginTopMm??0)-(r.page.marginBottomMm??0))throw new Error("页尾高度占满单页,不能为报表明细预留空间")}catch(a){y(o,"$.recipe.footerRange","region",$(a))}return o}function Zt(t,e){const o=new Map;for(const[r,n]of t.entries())try{if(!n||typeof n.id!="string"||!n.id.trim()||o.has(n.id))throw new Error("数据集标识应非空且唯一");F.validateDatasetRows([],{fields:n.fields,...n.rowKey?{rowKey:n.rowKey}:{}});for(const s of n.fields)if(s.digits!==void 0&&(!Number.isInteger(s.digits)||s.digits<0||s.digits>100))throw new Error("显示精度应为 0–100 的整数");o.set(n.id,n)}catch(s){y(e,`$.datasets[${r}]`,"schema",$(s))}return o}function Ut(t,e,o,r){const n=d(t.range),s=n.right-n.left+1;if(!Array.isArray(t.fields)||t.fields.length!==s)return y(r,`${o}.fields`,"mapping","区域每个物理列应显式绑定一个字段"),0;const a=new Set(e.fields.map(l=>l.field)),i=new Set;let c=0;if(t.fields.forEach((l,f)=>{!a.has(l)||i.has(l)?y(r,`${o}.fields[${f}]`,"mapping","请选择契约内已声明且不重复的字段"):(i.add(l),c++)}),!t.rowKey)y(r,`${o}.rowKey`,"row-key","每个区域应声明稳定业务主键");else{const l=F.validateDatasetRows(e.samples??[],{fields:e.fields,rowKey:t.rowKey},{path:`$.datasets.${e.id}.samples`,maxRows:100,maxIssues:30});for(const f of l.issues)y(r,f.path,f.code==="row-key"?"row-key":"schema",f.message)}for(const l of["revisionField","sourceTokenField"])t[l]!==void 0&&!a.has(t[l])&&y(r,`${o}.${l}`,"source","并发字段应引用同一区域数据集契约内的字段");return t.mode==="record"&&(e.samples?.length??0)>1&&y(r,o,"schema","record 区域数据集最多一行;多行请使用 repeat"),c}function ft(t,e){const o=[];try{lt(t)}catch(a){return{ok:!1,issues:[{path:"$.recipe",code:"schema",message:$(a)}],mapped:0,total:0}}const r=Zt(e,o);let n=0,s=0;for(const[a,i]of t.regions.entries()){const c=`$.recipe.regions[${a}]`;try{const l=d(i.range);s+=l.right-l.left+1;const f=r.get(i.dataset);f?n+=Ut(i,f,c,o):y(o,`${c}.dataset`,"source","请选择宿主提供的数据集契约")}catch(l){y(o,c,"schema",$(l))}}return{ok:o.length===0,issues:o,mapped:n,total:s}}function gt(t,e,o){const r=ft(e,o),n=[...ct(t,e),...r.issues];return{...r,ok:!n.length,issues:n}}function Qt(t,e,o,r){const n=gt(t,e,o);if(!n.ok)throw new Error(n.issues.map(s=>`${s.path}: ${s.message}`).join(`
3
3
  `));return{document:R.defineReportTemplate({...r,template:Yt(t,e,o,r.id)}),recipe:v(e),warnings:[...t.warnings]}}function Xt(t){if(!t||t.version!=="2.0"||typeof t.sheet!="string"||!Array.isArray(t.regions)||!t.regions.length||t.regions.length>128)throw new Error("多区域绑定会话配置或版本无效");for(const e of t.regions){if(!e||typeof e.id!="string"||typeof e.dataset!="string"||typeof e.rowKey!="string"||!["record","repeat"].includes(e.mode)||!Array.isArray(e.fields)||e.fields.length>2048||e.fields.some(o=>typeof o!="string"))throw new Error("多区域绑定会话的区域结构无效");e.range&&d(e.range),e.headerRange&&d(e.headerRange)}t.footerRange&&d(t.footerRange)}function ht(t,e,o){if(H({sheets:t.sheets,warnings:t.warnings,recipe:e,identity:o}),Xt(e),!Array.isArray(t.sheets)||!t.sheets.length||!Array.isArray(t.warnings)||t.warnings.some(r=>typeof r!="string")||!t.sheets.some(r=>r.name===e.sheet))throw new Error("多区域绑定会话的来源无效");for(const r of t.sheets)if(d(r.range),![r.index,r.rowCount,r.columnCount,r.pageCount].every(n=>Number.isInteger(n)&&n>0)||!Number.isInteger(r.pageStart)||r.pageStart<0||r.pageStart+r.pageCount>t.template.pages.length)throw new Error("多区域绑定会话的工作表几何无效");return R.parseReportTemplate({schemaVersion:"1.0",...o,template:t.template}),v({version:"2.0",source:t,recipe:e,identity:o})}function te(t){if(typeof t=="string"&&t.length>1e7)throw new Error("绑定会话超过 1000 万字符上限");const e=typeof t=="string"?JSON.parse(t):t;if(!e||e.version!=="2.0"||!e.source||!e.recipe||!e.identity)throw new Error("多区域绑定会话结构或版本无效");return ht(e.source,e.recipe,e.identity)}function ee(t,e,o,r=o){const n=t.sheets.find(i=>i.name===e);if(!n)throw new Error("工作表不存在");const s=d(n.range);if(![o.row,o.column,r.row,r.column].every(Number.isInteger))throw new Error("单元格坐标应为整数");const a={top:Math.min(o.row,r.row),bottom:Math.max(o.row,r.row),left:Math.min(o.column,r.column),right:Math.max(o.column,r.column)};if(a.top<s.top||a.bottom>s.bottom||a.left<s.left||a.right>s.right)throw new Error("选区超出来源工作表");return M(a)}exports.bindExcelTemplate=V;exports.checkedRange=dt;exports.columnName=S;exports.createExcelBindingDocument=Kt;exports.createExcelBindingSession=et;exports.createExcelRegionBindingDocument=Qt;exports.createExcelRegionBindingSession=ht;exports.excelBindingCellRange=ee;exports.excelBindingRowRange=Lt;exports.getExcelSheetWindow=Jt;exports.mergeLookup=Et;exports.mergeRowGroups=wt;exports.parseExcelBindingSession=Dt;exports.parseExcelRegionBindingSession=te;exports.parseImportRange=d;exports.rangeName=M;exports.rowSegments=yt;exports.selectedMerges=ut;exports.selectedRange=mt;exports.validateExcelBindingFields=X;exports.validateExcelBindingRecipe=tt;exports.validateExcelBindingRegions=Q;exports.validateExcelRegionBindings=gt;exports.validateExcelRegionFields=ft;exports.validateExcelRegionGeometry=ct;
@@ -0,0 +1 @@
1
+ "use strict";const e=require("./encoding-BFMFIc4r.cjs");e.serveReportEncodingWorker();
@@ -0,0 +1 @@
1
+ export { }
@@ -0,0 +1,2 @@
1
+ import { s as r } from "./encoding-DP_Eaf0A.js";
2
+ r();
@@ -0,0 +1,3 @@
1
+ "use strict";const d=require("./style-C22Pbv3T.cjs"),B=["borderTop","borderRight","borderBottom","borderLeft","borderColor","lineColor","lineWidthPt"];function C(n,e){const t=d.resolveBoxBorders(e.style),s=t.inner?[...n.edges]:[];t.top&&s.push({kind:"h",pos:0,from:0,to:e.widthMm}),t.bottom&&s.push({kind:"h",pos:e.heightMm,from:0,to:e.widthMm}),t.left&&s.push({kind:"v",pos:0,from:0,to:e.heightMm}),t.right&&s.push({kind:"v",pos:e.widthMm,from:0,to:e.heightMm});const o=d.resolveStroke(e.style);return s.map(i=>({...i,...o}))}function z(n,e,t){const s=n.get(e);(!s||t.widthPt>s.widthPt)&&n.set(e,t)}function v(n,e,t,s,o,i){const c=t<e.rows.length?e.rows[t].pos:e.rows[e.rows.length-1].pos+e.rows[e.rows.length-1].size;for(let r=s;r<o;r++){const h=e.columns[r];z(n,`h:${t}:${r}`,{kind:"h",pos:c,from:h.pos,to:h.pos+h.size,...i})}}function k(n,e,t,s,o,i){const c=t<e.columns.length?e.columns[t].pos:e.columns[e.columns.length-1].pos+e.columns[e.columns.length-1].size;for(let r=s;r<o;r++){const h=e.rows[r];z(n,`v:${t}:${r}`,{kind:"v",pos:c,from:h.pos,to:h.pos+h.size,...i})}}function M(n,e,t,s){const o=Math.min(e.columns.length,t.ci+(t.cell.colSpan??1)),i=Math.min(e.rows.length,t.ri+(t.cell.rowSpan??1)),c=d.mergeComponentStyles(s,t.cell.style),r=d.resolveBoxBorders(c),h=d.resolveStroke(c);r.top&&v(n,e,t.ri,t.ci,o,h),r.bottom&&v(n,e,i,t.ci,o,h),r.left&&k(n,e,t.ci,t.ri,i,h),r.right&&k(n,e,o,t.ri,i,h)}function H(n){const e=[...n.values()].sort((s,o)=>s.kind.localeCompare(o.kind)||s.pos-o.pos||s.from-o.from),t=[];for(const s of e){const o=t[t.length-1];o&&o.kind===s.kind&&o.pos===s.pos&&Math.abs(o.to-s.from)<1e-6&&o.color===s.color&&o.widthPt===s.widthPt?o.to=s.to:t.push({...s})}return t}function L(n,e){if(!n.cells.some(({cell:i})=>B.some(c=>i.style?.[c]!==void 0)))return C(n,e);const t=new Map,s=new Set,o=n.columns.length;for(const i of n.cells){M(t,n,i,e.style);const c=Math.min(n.rows.length,i.ri+(i.cell.rowSpan??1)),r=Math.min(o,i.ci+(i.cell.colSpan??1));for(let h=i.ri;h<c;h++)for(let l=i.ci;l<r;l++)s.add(h*o+l)}for(let i=0;i<n.rows.length;i++)for(let c=0;c<o;c++)s.has(i*o+c)||M(t,n,{ri:i,ci:c,cell:{}},e.style);return H(t)}function u(n){const e=d.resolveFontSize(n).fontSizePt;return{runs:[],width:0,height:e*d.resolveLineHeight(n),fontSize:e}}function R(n,e,t,s){const o=n.runs[n.runs.length-1];o?.style===t?(o.text+=e,o.width+=s):n.runs.push({text:e,style:t,width:s});const i=d.resolveFontSize(t).fontSizePt;n.width+=s,n.fontSize=Math.max(n.fontSize,i),n.height=Math.max(n.height,i*d.resolveLineHeight(t))}function T(n,e,t,s,o){const i=n.richParagraphs[e],c=d.mergeComponentStyles(n.style,{...i.lineHeight===void 0?{}:{lineHeight:i.lineHeight}}),r=[u(c)];for(const h of i.segments){const l=d.mergeComponentStyles(c,h.style),p=h.kind==="field"?h.field??"":h.text??"";for(const g of p.replace(/\r\n|\r/g,`
2
+ `)){let f=r[r.length-1];if(g===`
3
+ `){r.push(u(l));continue}const m=o.measure(g,l);f.runs.length&&f.width+m>t-(r.length===1?s:0)&&(f=u(l),r.push(f)),R(f,g,l,m)}}return r}function A(n,e,t){const s=n.richParagraphs.map((r,h)=>{const l=(r.indentMm??0)*72/25.4,p=T(n,h,e.width,l,t),g=p.reduce((f,m)=>f+m.height,0)+((r.spaceBeforeMm??0)+(r.spaceAfterMm??0))*72/25.4;return{paragraph:r,indent:l,lines:p,height:g}}),o=s.reduce((r,h)=>r+h.height,0),i=n.style?.verticalAlign;let c=e.yTop-(i==="middle"?(e.height-o)/2:i==="bottom"?e.height-o:0);for(const{paragraph:r,indent:h,lines:l}of s){c-=(r.spaceBeforeMm??0)*72/25.4;const p=Math.max(0,e.width-h);for(const[g,f]of l.entries()){const m=r.align??n.style?.align,P=g===0?h:0,a=g===0?p:e.width;let S=e.x+P+(m==="center"?(a-f.width)/2:m==="right"?a-f.width:0);for(const w of f.runs)t.draw(w.text,{...w.style,align:"left"},S,c-f.fontSize,w.width),S+=w.width;c-=f.height}c-=(r.spaceAfterMm??0)*72/25.4}return o>e.height+.01}exports.drawRichText=A;exports.resolveGridStrokes=L;