@paperjsx/json-to-xlsx-pro 0.0.1

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 (175) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +61 -0
  3. package/dist/assembly/xlsx-assembler.d.ts +53 -0
  4. package/dist/assembly/xlsx-assembler.d.ts.map +1 -0
  5. package/dist/benchmarks/phase2.d.ts +72 -0
  6. package/dist/benchmarks/phase2.d.ts.map +1 -0
  7. package/dist/benchmarks/phase2.js +14 -0
  8. package/dist/benchmarks/phase2.js.map +7 -0
  9. package/dist/benchmarks/report.d.ts +21 -0
  10. package/dist/benchmarks/report.d.ts.map +1 -0
  11. package/dist/benchmarks/report.js +13 -0
  12. package/dist/benchmarks/report.js.map +7 -0
  13. package/dist/benchmarks/rigorous.d.ts +85 -0
  14. package/dist/benchmarks/rigorous.d.ts.map +1 -0
  15. package/dist/benchmarks/rigorous.js +534 -0
  16. package/dist/benchmarks/rigorous.js.map +7 -0
  17. package/dist/chaos-lab/index.d.ts +69 -0
  18. package/dist/chaos-lab/index.d.ts.map +1 -0
  19. package/dist/chaos-lab/index.js +1696 -0
  20. package/dist/chaos-lab/index.js.map +7 -0
  21. package/dist/chunk-2IVXCH6I.js +1002 -0
  22. package/dist/chunk-2IVXCH6I.js.map +7 -0
  23. package/dist/chunk-IYMS2CLX.js +478 -0
  24. package/dist/chunk-IYMS2CLX.js.map +7 -0
  25. package/dist/chunk-PQSLPEN5.js +290 -0
  26. package/dist/chunk-PQSLPEN5.js.map +7 -0
  27. package/dist/chunk-QDWDSM74.js +142 -0
  28. package/dist/chunk-QDWDSM74.js.map +7 -0
  29. package/dist/chunk-S5RMAWLC.js +25347 -0
  30. package/dist/chunk-S5RMAWLC.js.map +7 -0
  31. package/dist/chunk-Z2JSZFNG.js +308 -0
  32. package/dist/chunk-Z2JSZFNG.js.map +7 -0
  33. package/dist/diagnostics/corruption.d.ts +9 -0
  34. package/dist/diagnostics/corruption.d.ts.map +1 -0
  35. package/dist/diagnostics/workloads.d.ts +6 -0
  36. package/dist/diagnostics/workloads.d.ts.map +1 -0
  37. package/dist/diff/document-diff.d.ts +5 -0
  38. package/dist/diff/document-diff.d.ts.map +1 -0
  39. package/dist/document-diff/src/index.d.ts +50 -0
  40. package/dist/document-diff/src/index.d.ts.map +1 -0
  41. package/dist/errors.d.ts +35 -0
  42. package/dist/errors.d.ts.map +1 -0
  43. package/dist/fixtures/phase1.d.ts +14 -0
  44. package/dist/fixtures/phase1.d.ts.map +1 -0
  45. package/dist/fixtures/phase2.d.ts +9 -0
  46. package/dist/fixtures/phase2.d.ts.map +1 -0
  47. package/dist/fixtures/phase3.d.ts +9 -0
  48. package/dist/fixtures/phase3.d.ts.map +1 -0
  49. package/dist/fixtures/phase4.d.ts +10 -0
  50. package/dist/fixtures/phase4.d.ts.map +1 -0
  51. package/dist/fixtures/phase5.d.ts +9 -0
  52. package/dist/fixtures/phase5.d.ts.map +1 -0
  53. package/dist/formulas/builder.d.ts +91 -0
  54. package/dist/formulas/builder.d.ts.map +1 -0
  55. package/dist/formulas/evaluator.d.ts +25 -0
  56. package/dist/formulas/evaluator.d.ts.map +1 -0
  57. package/dist/formulas/shift.d.ts +14 -0
  58. package/dist/formulas/shift.d.ts.map +1 -0
  59. package/dist/index-pro.d.ts +12 -0
  60. package/dist/index-pro.d.ts.map +1 -0
  61. package/dist/index.d.ts +41 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +2167 -0
  64. package/dist/index.js.map +7 -0
  65. package/dist/layout/column-width.d.ts +32 -0
  66. package/dist/layout/column-width.d.ts.map +1 -0
  67. package/dist/layout/row-height.d.ts +3 -0
  68. package/dist/layout/row-height.d.ts.map +1 -0
  69. package/dist/preflight.d.ts +31 -0
  70. package/dist/preflight.d.ts.map +1 -0
  71. package/dist/public-quality-types.d.ts +44 -0
  72. package/dist/public-quality-types.d.ts.map +1 -0
  73. package/dist/quality/accessibility-contract.d.ts +38 -0
  74. package/dist/quality/accessibility-contract.d.ts.map +1 -0
  75. package/dist/quality/accessibility.d.ts +33 -0
  76. package/dist/quality/accessibility.d.ts.map +1 -0
  77. package/dist/quality/shared-quality.d.ts +4 -0
  78. package/dist/quality/shared-quality.d.ts.map +1 -0
  79. package/dist/quality/structural-validation.d.ts +11 -0
  80. package/dist/quality/structural-validation.d.ts.map +1 -0
  81. package/dist/quality/workbook-quality.d.ts +63 -0
  82. package/dist/quality/workbook-quality.d.ts.map +1 -0
  83. package/dist/render-metrics.d.ts +67 -0
  84. package/dist/render-metrics.d.ts.map +1 -0
  85. package/dist/render-plan.d.ts +40 -0
  86. package/dist/render-plan.d.ts.map +1 -0
  87. package/dist/serializers/chart-serializer.d.ts +3 -0
  88. package/dist/serializers/chart-serializer.d.ts.map +1 -0
  89. package/dist/serializers/comment-serializer.d.ts +12 -0
  90. package/dist/serializers/comment-serializer.d.ts.map +1 -0
  91. package/dist/serializers/doc-props-serializer.d.ts +5 -0
  92. package/dist/serializers/doc-props-serializer.d.ts.map +1 -0
  93. package/dist/serializers/drawing-serializer.d.ts +24 -0
  94. package/dist/serializers/drawing-serializer.d.ts.map +1 -0
  95. package/dist/serializers/package-serializer.d.ts +13 -0
  96. package/dist/serializers/package-serializer.d.ts.map +1 -0
  97. package/dist/serializers/pivot-serializer.d.ts +37 -0
  98. package/dist/serializers/pivot-serializer.d.ts.map +1 -0
  99. package/dist/serializers/shared-strings.d.ts +11 -0
  100. package/dist/serializers/shared-strings.d.ts.map +1 -0
  101. package/dist/serializers/sheet-serializer.d.ts +58 -0
  102. package/dist/serializers/sheet-serializer.d.ts.map +1 -0
  103. package/dist/serializers/sheet-xml-builder.d.ts +33 -0
  104. package/dist/serializers/sheet-xml-builder.d.ts.map +1 -0
  105. package/dist/serializers/style-registry.d.ts +2 -0
  106. package/dist/serializers/style-registry.d.ts.map +1 -0
  107. package/dist/serializers/table-serializer.d.ts +20 -0
  108. package/dist/serializers/table-serializer.d.ts.map +1 -0
  109. package/dist/serializers/theme-serializer.d.ts +3 -0
  110. package/dist/serializers/theme-serializer.d.ts.map +1 -0
  111. package/dist/serializers/workbook-serializer.d.ts +16 -0
  112. package/dist/serializers/workbook-serializer.d.ts.map +1 -0
  113. package/dist/serializers/worksheet-rels-serializer.d.ts +7 -0
  114. package/dist/serializers/worksheet-rels-serializer.d.ts.map +1 -0
  115. package/dist/source-js-extension-loader.mjs +44 -0
  116. package/dist/spreadsheet-engine.d.ts +50 -0
  117. package/dist/spreadsheet-engine.d.ts.map +1 -0
  118. package/dist/styles/border-serializer.d.ts +6 -0
  119. package/dist/styles/border-serializer.d.ts.map +1 -0
  120. package/dist/styles/color.d.ts +5 -0
  121. package/dist/styles/color.d.ts.map +1 -0
  122. package/dist/styles/component-registry.d.ts +13 -0
  123. package/dist/styles/component-registry.d.ts.map +1 -0
  124. package/dist/styles/conditional-formatting.d.ts +8 -0
  125. package/dist/styles/conditional-formatting.d.ts.map +1 -0
  126. package/dist/styles/fill-serializer.d.ts +9 -0
  127. package/dist/styles/fill-serializer.d.ts.map +1 -0
  128. package/dist/styles/font-serializer.d.ts +11 -0
  129. package/dist/styles/font-serializer.d.ts.map +1 -0
  130. package/dist/styles/numfmt-registry.d.ts +7 -0
  131. package/dist/styles/numfmt-registry.d.ts.map +1 -0
  132. package/dist/styles/presets.d.ts +190 -0
  133. package/dist/styles/presets.d.ts.map +1 -0
  134. package/dist/styles/style-registry.d.ts +24 -0
  135. package/dist/styles/style-registry.d.ts.map +1 -0
  136. package/dist/styles/style-utils.d.ts +11 -0
  137. package/dist/styles/style-utils.d.ts.map +1 -0
  138. package/dist/template-assembler.d.ts +26 -0
  139. package/dist/template-assembler.d.ts.map +1 -0
  140. package/dist/template-parser.d.ts +96 -0
  141. package/dist/template-parser.d.ts.map +1 -0
  142. package/dist/types/spreadsheet-ast.d.ts +470 -0
  143. package/dist/types/spreadsheet-ast.d.ts.map +1 -0
  144. package/dist/utils/cell-ref.d.ts +21 -0
  145. package/dist/utils/cell-ref.d.ts.map +1 -0
  146. package/dist/utils/date.d.ts +32 -0
  147. package/dist/utils/date.d.ts.map +1 -0
  148. package/dist/utils/hyperlinks.d.ts +16 -0
  149. package/dist/utils/hyperlinks.d.ts.map +1 -0
  150. package/dist/utils/xml.d.ts +7 -0
  151. package/dist/utils/xml.d.ts.map +1 -0
  152. package/dist/validation/spreadsheet-schema.d.ts +1513 -0
  153. package/dist/validation/spreadsheet-schema.d.ts.map +1 -0
  154. package/dist/workers/sheet-serialization-worker-pool.d.ts +32 -0
  155. package/dist/workers/sheet-serialization-worker-pool.d.ts.map +1 -0
  156. package/dist/workers/sheet-serializer-worker.d.ts +2 -0
  157. package/dist/workers/sheet-serializer-worker.d.ts.map +1 -0
  158. package/dist/workers/sheet-serializer-worker.js +2565 -0
  159. package/dist/workers/sheet-serializer-worker.js.map +7 -0
  160. package/dist/worksheet/structure.d.ts +33 -0
  161. package/dist/worksheet/structure.d.ts.map +1 -0
  162. package/dist-pro/benchmarks/phase2.js +1 -0
  163. package/dist-pro/benchmarks/report.js +1 -0
  164. package/dist-pro/benchmarks/rigorous.js +2 -0
  165. package/dist-pro/chaos-lab/index.js +2 -0
  166. package/dist-pro/chunk-FFIHITWB.js +1 -0
  167. package/dist-pro/chunk-INDNGGXB.js +2 -0
  168. package/dist-pro/chunk-K2MQYNU6.js +1 -0
  169. package/dist-pro/chunk-MEZHQFH3.js +2 -0
  170. package/dist-pro/chunk-RB42Q36L.js +1 -0
  171. package/dist-pro/chunk-WYTH4W4N.js +48 -0
  172. package/dist-pro/index.js +3 -0
  173. package/dist-pro/source-js-extension-loader.mjs +44 -0
  174. package/dist-pro/workers/sheet-serializer-worker.js +3 -0
  175. package/package.json +62 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/workers/sheet-serializer-worker.ts", "../../src/types/spreadsheet-ast.ts", "../../src/styles/presets.ts", "../../src/styles/style-utils.ts", "../../src/worksheet/structure.ts", "../../src/utils/cell-ref.ts", "../../src/utils/hyperlinks.ts", "../../src/utils/xml.ts", "../../src/styles/color.ts", "../../src/styles/font-serializer.ts", "../../src/styles/conditional-formatting.ts", "../../src/layout/column-width.ts", "../../src/serializers/sheet-xml-builder.ts", "../../src/serializers/worksheet-rels-serializer.ts", "../../src/serializers/table-serializer.ts", "../../src/utils/date.ts", "../../src/serializers/sheet-serializer.ts", "../../src/styles/component-registry.ts", "../../src/styles/fill-serializer.ts", "../../src/styles/border-serializer.ts", "../../src/styles/numfmt-registry.ts", "../../src/styles/style-registry.ts"],
4
+ "sourcesContent": ["import { parentPort } from \"node:worker_threads\";\n\nimport { serializeSheetChunks } from \"../serializers/sheet-serializer.js\";\nimport { StyleRegistry } from \"../serializers/style-registry.js\";\nimport type {\n WorkerSheetSerializationTask,\n} from \"./sheet-serialization-worker-pool.js\";\n\ninterface WorkerSheetSerializationRequest {\n id: number;\n tasks: WorkerSheetSerializationTask[];\n}\n\nif (!parentPort) {\n throw new Error(\"XLSX sheet serializer worker requires parentPort\");\n}\n\nparentPort.on(\"message\", (request: WorkerSheetSerializationRequest) => {\n try {\n const artifacts = request.tasks.map((task) => serializeSheetChunks(task.sheet, {\n dateSystem: task.dateSystem,\n defaults: task.defaults,\n formulaEvaluator: null,\n rowChunkSize: task.rowChunkSize,\n selected: task.selected,\n sheetIndex: task.sheetIndex,\n stringStrategy: task.stringStrategy,\n styleRegistry: new StyleRegistry(task.defaults),\n }));\n parentPort!.postMessage({\n id: request.id,\n ok: true,\n artifacts,\n });\n } catch (error) {\n parentPort!.postMessage({\n id: request.id,\n ok: false,\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n }\n});\n", "export interface SpreadsheetMeta {\n title?: string;\n language?: string;\n creator?: string;\n company?: string;\n created?: Date;\n modified?: Date;\n description?: string;\n category?: string;\n keywords?: string[];\n}\n\nexport interface ThemeColorScheme {\n dk1?: string;\n lt1?: string;\n dk2?: string;\n lt2?: string;\n accent1?: string;\n accent2?: string;\n accent3?: string;\n accent4?: string;\n accent5?: string;\n accent6?: string;\n hlink?: string;\n folHlink?: string;\n}\n\nexport interface ThemeFontScheme {\n majorLatin?: string;\n minorLatin?: string;\n majorEa?: string;\n minorEa?: string;\n}\n\nexport interface ThemeConfig {\n name?: string;\n colorScheme?: ThemeColorScheme;\n fontScheme?: ThemeFontScheme;\n}\n\nexport type AccessibilityLevel = \"A\" | \"AA\" | \"AAA\";\n\nexport interface AccessibilityConfigBase {\n title?: string;\n language?: string;\n}\n\nexport interface AccessibilityConfig extends AccessibilityConfigBase {\n level: AccessibilityLevel;\n autoAltText?: boolean;\n enforceHeadingHierarchy?: boolean;\n enforceTableHeaders?: boolean;\n}\n\nexport interface SpreadsheetDefaults {\n font?: {\n family: string;\n size: number;\n };\n columnWidth?: number;\n rowHeight?: number;\n}\n\nexport interface SpreadsheetFontStyle {\n family?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean | \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\";\n strikethrough?: boolean;\n color?: string;\n vertAlign?: \"superscript\" | \"subscript\";\n charset?: number;\n}\n\nexport type SpreadsheetPatternType =\n | \"none\"\n | \"solid\"\n | \"darkGray\"\n | \"mediumGray\"\n | \"lightGray\"\n | \"gray125\"\n | \"gray0625\"\n | \"darkHorizontal\"\n | \"darkVertical\"\n | \"darkDown\"\n | \"darkUp\"\n | \"darkGrid\"\n | \"darkTrellis\"\n | \"lightHorizontal\"\n | \"lightVertical\"\n | \"lightDown\"\n | \"lightUp\"\n | \"lightGrid\"\n | \"lightTrellis\";\n\nexport interface SpreadsheetFillStyle {\n color?: string;\n type?: \"solid\" | \"pattern\";\n fgColor?: string;\n bgColor?: string;\n patternType?: SpreadsheetPatternType;\n}\n\nexport type SpreadsheetBorderLineStyle =\n | \"thin\"\n | \"medium\"\n | \"thick\"\n | \"double\"\n | \"dotted\"\n | \"dashed\"\n | \"dashDot\"\n | \"dashDotDot\"\n | \"hair\"\n | \"mediumDashed\"\n | \"mediumDashDot\"\n | \"mediumDashDotDot\"\n | \"slantDashDot\";\n\nexport interface SpreadsheetBorderEdge {\n style: SpreadsheetBorderLineStyle;\n color?: string;\n}\n\nexport interface SpreadsheetBorderDiagonal extends SpreadsheetBorderEdge {\n direction?: \"up\" | \"down\" | \"both\";\n}\n\nexport interface SpreadsheetBorderStyle {\n top?: SpreadsheetBorderEdge;\n bottom?: SpreadsheetBorderEdge;\n left?: SpreadsheetBorderEdge;\n right?: SpreadsheetBorderEdge;\n diagonal?: SpreadsheetBorderDiagonal;\n}\n\nexport interface SpreadsheetAlignmentStyle {\n horizontal?:\n | \"left\"\n | \"center\"\n | \"right\"\n | \"fill\"\n | \"justify\"\n | \"centerContinuous\"\n | \"distributed\"\n | \"general\";\n vertical?: \"top\" | \"center\" | \"bottom\" | \"justify\" | \"distributed\";\n wrapText?: boolean;\n textRotation?: number;\n indent?: number;\n shrinkToFit?: boolean;\n readingOrder?: 0 | 1 | 2;\n}\n\nexport interface SpreadsheetProtectionStyle {\n locked?: boolean;\n hidden?: boolean;\n}\n\nexport interface SpreadsheetCellStyle {\n preset?: string;\n numberFormat?: string;\n font?: SpreadsheetFontStyle;\n fill?: SpreadsheetFillStyle;\n border?: SpreadsheetBorderStyle;\n alignment?: SpreadsheetAlignmentStyle;\n protection?: SpreadsheetProtectionStyle;\n}\n\nexport type SpreadsheetCellStyleInput = string | SpreadsheetCellStyle;\n\nexport interface SpreadsheetRichTextRun {\n text: string;\n font?: SpreadsheetFontStyle;\n}\n\nexport type SpreadsheetRichTextValue = SpreadsheetRichTextRun[];\nexport type SpreadsheetErrorCode =\n | \"#NULL!\"\n | \"#DIV/0!\"\n | \"#VALUE!\"\n | \"#REF!\"\n | \"#NAME?\"\n | \"#NUM!\"\n | \"#N/A\"\n | \"#GETTING_DATA\"\n | \"#SPILL!\"\n | \"#CALC!\"\n | \"#FIELD!\"\n | \"#BLOCKED!\"\n | \"#UNKNOWN!\"\n | \"#CONNECT!\";\n\nexport interface SpreadsheetErrorValue {\n error: SpreadsheetErrorCode;\n}\n\nexport type CellValue = string | number | boolean | Date | null | SpreadsheetRichTextValue | SpreadsheetErrorValue;\n\nexport interface SpreadsheetCellComment {\n author?: string;\n text: string;\n}\n\nexport interface SpreadsheetCellFormula {\n expression: string;\n cachedValue?: CellValue;\n arrayRange?: string;\n dynamic?: boolean;\n}\n\nexport type SpreadsheetCellFormulaInput = string | SpreadsheetCellFormula;\n\nexport interface SpreadsheetExternalHyperlink {\n target: string;\n display?: string;\n tooltip?: string;\n}\n\nexport interface SpreadsheetInternalHyperlink {\n location: string;\n display?: string;\n tooltip?: string;\n}\n\nexport type SpreadsheetHyperlink = string | SpreadsheetExternalHyperlink | SpreadsheetInternalHyperlink;\n\nexport interface SpreadsheetCell {\n value?: CellValue;\n style?: SpreadsheetCellStyleInput;\n formula?: SpreadsheetCellFormulaInput;\n hyperlink?: SpreadsheetHyperlink;\n comment?: SpreadsheetCellComment;\n colSpan?: number;\n rowSpan?: number;\n}\n\nexport interface SpreadsheetColumn {\n width?: number;\n hidden?: boolean;\n bestFit?: boolean;\n}\n\nexport interface SpreadsheetRow {\n height?: number;\n hidden?: boolean;\n cells: SpreadsheetCell[];\n}\n\nexport interface SpreadsheetFreezePane {\n row: number;\n col: number;\n}\n\nexport interface SpreadsheetAutoFilterConfig {\n ref: string;\n}\n\nexport interface SpreadsheetNamedRange {\n name: string;\n ref: string;\n scope?: string;\n}\n\nexport interface SpreadsheetPrintRange {\n start: number;\n end: number;\n}\n\nexport interface SpreadsheetPrintTitles {\n rows?: SpreadsheetPrintRange;\n columns?: SpreadsheetPrintRange;\n}\n\nexport interface SpreadsheetPrintOptions {\n gridLines?: boolean;\n headings?: boolean;\n}\n\nexport interface SpreadsheetPageMargins {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n header?: number;\n footer?: number;\n}\n\nexport interface SpreadsheetPageSetup {\n paperSize?: number;\n orientation?: \"portrait\" | \"landscape\";\n scale?: number;\n fitToWidth?: number;\n fitToHeight?: number;\n printArea?: string;\n printTitles?: SpreadsheetPrintTitles;\n options?: SpreadsheetPrintOptions;\n margins?: SpreadsheetPageMargins;\n}\n\nexport type SpreadsheetDataValidationType =\n | \"whole\"\n | \"decimal\"\n | \"list\"\n | \"date\"\n | \"time\"\n | \"textLength\"\n | \"custom\";\n\nexport type SpreadsheetDataValidationOperator =\n | \"between\"\n | \"notBetween\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\";\n\nexport type SpreadsheetDataValidationErrorStyle = \"stop\" | \"warning\" | \"information\";\n\nexport interface SpreadsheetDataValidation {\n ref: string;\n type: SpreadsheetDataValidationType;\n operator?: SpreadsheetDataValidationOperator;\n formula1: string | number | string[];\n formula2?: string | number;\n allowBlank?: boolean;\n showDropDown?: boolean;\n showInputMessage?: boolean;\n promptTitle?: string;\n prompt?: string;\n showErrorMessage?: boolean;\n errorTitle?: string;\n error?: string;\n errorStyle?: SpreadsheetDataValidationErrorStyle;\n}\n\nexport interface SpreadsheetSheetStyling {\n headerRow?: SpreadsheetCellStyleInput;\n alternateRows?: {\n odd?: SpreadsheetCellStyleInput;\n even?: SpreadsheetCellStyleInput;\n };\n}\n\nexport interface SpreadsheetCfvo {\n type: \"min\" | \"max\" | \"num\" | \"percent\" | \"percentile\" | \"formula\";\n value?: number | string;\n color?: string;\n}\n\nexport type SpreadsheetIconSetType =\n | \"3Arrows\" | \"3ArrowsGray\" | \"3Flags\"\n | \"3TrafficLights1\" | \"3TrafficLights2\" | \"3Signs\"\n | \"3Symbols\" | \"3Symbols2\" | \"3Stars\" | \"3Triangles\" | \"3Smilies\"\n | \"4Arrows\" | \"4ArrowsGray\" | \"4RedToBlack\" | \"4Rating\" | \"4TrafficLights\"\n | \"5Arrows\" | \"5ArrowsGray\" | \"5Rating\" | \"5Quarters\";\n\nexport interface SpreadsheetConditionalFormattingCellIsRule {\n type: \"cellIs\";\n operator:\n | \"between\"\n | \"equal\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"notBetween\"\n | \"notEqual\";\n formula: string;\n style: SpreadsheetCellStyleInput;\n}\n\nexport interface SpreadsheetConditionalFormattingColorScaleRule {\n type: \"colorScale\";\n scale: {\n min: SpreadsheetCfvo & { color: string };\n mid?: SpreadsheetCfvo & { color: string };\n max: SpreadsheetCfvo & { color: string };\n };\n}\n\nexport interface SpreadsheetConditionalFormattingDataBarRule {\n type: \"dataBar\";\n color: string;\n min: SpreadsheetCfvo;\n max: SpreadsheetCfvo;\n gradient?: boolean;\n showValue?: boolean;\n negativeColor?: string;\n axisPosition?: \"automatic\" | \"middle\" | \"none\";\n direction?: \"leftToRight\" | \"rightToLeft\";\n}\n\nexport interface SpreadsheetConditionalFormattingIconSetRule {\n type: \"iconSet\";\n iconSet: SpreadsheetIconSetType;\n showValue?: boolean;\n reverse?: boolean;\n thresholds?: SpreadsheetCfvo[];\n}\n\nexport interface SpreadsheetConditionalFormattingTop10Rule {\n type: \"top10\";\n rank: number;\n percent?: boolean;\n bottom?: boolean;\n style: SpreadsheetCellStyleInput;\n}\n\nexport interface SpreadsheetConditionalFormattingDuplicateRule {\n type: \"duplicateValues\" | \"uniqueValues\";\n style: SpreadsheetCellStyleInput;\n}\n\nexport type SpreadsheetConditionalFormattingRule =\n | SpreadsheetConditionalFormattingCellIsRule\n | SpreadsheetConditionalFormattingColorScaleRule\n | SpreadsheetConditionalFormattingDataBarRule\n | SpreadsheetConditionalFormattingIconSetRule\n | SpreadsheetConditionalFormattingTop10Rule\n | SpreadsheetConditionalFormattingDuplicateRule;\n\nexport interface SpreadsheetConditionalFormatting {\n ref: string;\n rules: SpreadsheetConditionalFormattingRule[];\n}\n\nexport type SpreadsheetTableTotalsRowFunction =\n | \"sum\"\n | \"min\"\n | \"max\"\n | \"average\"\n | \"count\"\n | \"countNums\"\n | \"stdDev\"\n | \"var\";\n\nexport interface SpreadsheetTableColumn {\n name?: string;\n totalsRowLabel?: string;\n totalsRowFunction?: SpreadsheetTableTotalsRowFunction;\n totalsRowFormula?: string;\n}\n\nexport interface SpreadsheetTableStyle {\n name?: string;\n showFirstColumn?: boolean;\n showLastColumn?: boolean;\n showRowStripes?: boolean;\n showColumnStripes?: boolean;\n}\n\nexport interface SpreadsheetTable {\n name: string;\n displayName?: string;\n ref: string;\n totalsRow?: boolean;\n columns?: SpreadsheetTableColumn[];\n style?: SpreadsheetTableStyle;\n}\n\nexport interface SpreadsheetSheetProtection {\n password?: string;\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n selectLockedCells?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n selectUnlockedCells?: boolean;\n}\n\nexport interface SpreadsheetImageAnchor {\n from: { col: number; row: number; colOffset?: number; rowOffset?: number };\n to?: { col: number; row: number; colOffset?: number; rowOffset?: number };\n}\n\nexport interface SpreadsheetImage {\n data: Buffer;\n type: \"png\" | \"jpeg\";\n anchor: SpreadsheetImageAnchor;\n name?: string;\n description?: string;\n width?: number; // pixels (converted to EMU internally: 1px = 9525 EMU)\n height?: number; // pixels\n}\n\n/**\n * Free tier chart types (must beat ExcelJS): bar, col, line, pie, scatter.\n * Pro tier adds: area, doughnut, radar, bubble, stock, surface.\n */\nexport const FREE_XLSX_CHART_TYPES = [\"bar\", \"col\", \"line\", \"pie\", \"scatter\"] as const;\nexport type FreeXlsxChartType = (typeof FREE_XLSX_CHART_TYPES)[number];\nexport type ProXlsxChartType = \"area\" | \"doughnut\" | \"radar\" | \"bubble\" | \"stock\" | \"surface\";\nexport type SpreadsheetChartType = FreeXlsxChartType | ProXlsxChartType;\n\nexport interface SpreadsheetChartSeries {\n name?: string; // Series label\n categories?: string; // Cell range for X-axis labels, e.g., \"Sheet1!$A$2:$A$10\"\n values: string; // Cell range for Y-axis values, e.g., \"Sheet1!$B$2:$B$10\"\n}\n\nexport interface SpreadsheetChart {\n type: SpreadsheetChartType;\n title?: string;\n series: SpreadsheetChartSeries[];\n anchor: SpreadsheetImageAnchor; // Reuse existing anchor type\n width?: number; // pixels, default 480\n height?: number; // pixels, default 300\n style?: {\n showLegend?: boolean;\n showDataLabels?: boolean;\n };\n}\n\nexport type SpreadsheetPivotSubtotal =\n | \"sum\"\n | \"count\"\n | \"average\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"countNums\"\n | \"stdDev\"\n | \"stdDevP\"\n | \"var\"\n | \"varP\";\n\nexport interface SpreadsheetPivotDimension {\n name: string;\n subtotals?: false | SpreadsheetPivotSubtotal[];\n}\n\nexport interface SpreadsheetPivotValueField {\n name: string;\n summarizeBy?: SpreadsheetPivotSubtotal;\n title?: string;\n}\n\nexport interface SpreadsheetPivotCalculatedField {\n name: string;\n formula: string;\n}\n\nexport interface SpreadsheetPivotTableStyle {\n name?: string;\n showRowHeaders?: boolean;\n showColumnHeaders?: boolean;\n showRowStripes?: boolean;\n showColumnStripes?: boolean;\n showLastColumn?: boolean;\n}\n\nexport interface SpreadsheetPivotTable {\n name: string;\n sourceSheet: string;\n sourceRef: string;\n targetCell: string;\n rowFields?: Array<string | SpreadsheetPivotDimension>;\n columnFields?: Array<string | SpreadsheetPivotDimension>;\n filterFields?: string[];\n valueFields: SpreadsheetPivotValueField[];\n calculatedFields?: SpreadsheetPivotCalculatedField[];\n valuesAxis?: \"row\" | \"column\";\n showRowGrandTotals?: boolean;\n showColumnGrandTotals?: boolean;\n style?: SpreadsheetPivotTableStyle;\n}\n\nexport interface SpreadsheetPivotChart {\n pivotTable: string;\n type: SpreadsheetChartType;\n title?: string;\n anchor: SpreadsheetImageAnchor;\n width?: number;\n height?: number;\n style?: {\n showLegend?: boolean;\n showDataLabels?: boolean;\n };\n}\n\nexport interface SpreadsheetSheet {\n name: string;\n columns?: SpreadsheetColumn[];\n rows: SpreadsheetRow[];\n mergedCells?: string[];\n freezePane?: SpreadsheetFreezePane;\n autoFilter?: boolean | SpreadsheetAutoFilterConfig;\n dataValidations?: SpreadsheetDataValidation[];\n pageSetup?: SpreadsheetPageSetup;\n state?: \"visible\" | \"hidden\" | \"veryHidden\";\n tabColor?: string;\n rightToLeft?: boolean;\n styling?: SpreadsheetSheetStyling;\n conditionalFormatting?: SpreadsheetConditionalFormatting[];\n tables?: SpreadsheetTable[];\n protection?: SpreadsheetSheetProtection;\n images?: SpreadsheetImage[];\n charts?: SpreadsheetChart[];\n pivotTables?: SpreadsheetPivotTable[];\n pivotCharts?: SpreadsheetPivotChart[];\n}\n\nexport interface SpreadsheetDocument {\n meta?: SpreadsheetMeta;\n accessible?: boolean | AccessibilityConfig;\n theme?: ThemeConfig;\n defaults?: SpreadsheetDefaults;\n date1904?: boolean;\n namedRanges?: SpreadsheetNamedRange[];\n sheets: SpreadsheetSheet[];\n}\n\nexport interface SpreadsheetRenderOptions {\n deterministic?: boolean;\n largeDataset?: boolean;\n rowChunkSize?: number;\n stringStrategy?: \"auto\" | \"sharedStrings\" | \"inlineStrings\";\n warmPath?: boolean;\n}\n\nexport function isRichTextValue(value: CellValue | undefined): value is SpreadsheetRichTextValue {\n return Array.isArray(value);\n}\n\nexport function isErrorValue(value: CellValue | undefined): value is SpreadsheetErrorValue {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && \"error\" in value;\n}\n", "import type { SpreadsheetCellStyle } from \"../types/spreadsheet-ast.js\";\n\nexport const PRESETS = {\n header: {\n font: { bold: true, color: \"#FFFFFF\", size: 11, family: \"Calibri\" },\n fill: { color: \"#4472C4\" },\n border: { bottom: { style: \"medium\", color: \"#2F5597\" } },\n alignment: { horizontal: \"center\", vertical: \"center\" },\n },\n headerDark: {\n font: { bold: true, color: \"#FFFFFF\", size: 11 },\n fill: { color: \"#1F3864\" },\n border: { bottom: { style: \"medium\", color: \"#0D2240\" } },\n alignment: { horizontal: \"center\", vertical: \"center\" },\n },\n headerGreen: {\n font: { bold: true, color: \"#FFFFFF\", size: 11 },\n fill: { color: \"#548235\" },\n border: { bottom: { style: \"medium\", color: \"#375623\" } },\n alignment: { horizontal: \"center\", vertical: \"center\" },\n },\n subheader: {\n font: { bold: true, size: 10, color: \"#1F3864\" },\n fill: { color: \"#D6E4F0\" },\n border: { bottom: { style: \"thin\", color: \"#9DC3E6\" } },\n },\n total: {\n font: { bold: true },\n border: {\n top: { style: \"thin\", color: \"#333333\" },\n bottom: { style: \"double\", color: \"#333333\" },\n },\n numberFormat: \"#,##0.00\",\n },\n subtotal: {\n font: { bold: true, color: \"#44546A\" },\n border: { top: { style: \"thin\", color: \"#D9D9D9\" } },\n numberFormat: \"#,##0.00\",\n },\n currency: { alignment: { horizontal: \"right\" }, numberFormat: \"$#,##0.00\" },\n currencyKRW: { alignment: { horizontal: \"right\" }, numberFormat: \"\u20A9#,##0\" },\n currencyEUR: { alignment: { horizontal: \"right\" }, numberFormat: \"\u20AC#,##0.00\" },\n percentage: { alignment: { horizontal: \"right\" }, numberFormat: \"0.0%\" },\n percentageChange: {\n alignment: { horizontal: \"right\" },\n numberFormat: \"+0.0%;-0.0%;0.0%\",\n },\n integer: { alignment: { horizontal: \"right\" }, numberFormat: \"#,##0\" },\n decimal2: { alignment: { horizontal: \"right\" }, numberFormat: \"#,##0.00\" },\n date: { numberFormat: \"yyyy-mm-dd\" },\n datetime: { numberFormat: \"yyyy-mm-dd hh:mm\" },\n warning: { font: { color: \"#9C5700\" }, fill: { color: \"#FFEB9C\" } },\n error: { font: { color: \"#9C0006\" }, fill: { color: \"#FFC7CE\" } },\n success: { font: { color: \"#006100\" }, fill: { color: \"#C6EFCE\" } },\n neutral: { font: { color: \"#44546A\" }, fill: { color: \"#F2F2F2\" } },\n} as const satisfies Record<string, SpreadsheetCellStyle>;\n\nexport const PRESET_NAMES = Object.keys(PRESETS);\n", "import type {\n CellValue,\n SpreadsheetBorderDiagonal,\n SpreadsheetBorderEdge,\n SpreadsheetCellStyle,\n SpreadsheetCellStyleInput,\n SpreadsheetFillStyle,\n SpreadsheetFontStyle,\n} from \"../types/spreadsheet-ast.js\";\nimport { PRESETS } from \"./presets.js\";\n\nconst resolvedInlineStyleCache = new WeakMap<SpreadsheetCellStyle, SpreadsheetCellStyle>();\nconst resolvedInlineStyleValueCache = new Map<string, SpreadsheetCellStyle>();\n\nfunction fontStyleKey(font: SpreadsheetFontStyle | undefined): string {\n if (!font) {\n return \"\";\n }\n return [\n font.family ?? \"\",\n font.size ?? \"\",\n font.bold ? 1 : 0,\n font.italic ? 1 : 0,\n font.underline === true ? \"single\" : (font.underline ?? \"\"),\n font.strikethrough ? 1 : 0,\n font.color ?? \"\",\n font.vertAlign ?? \"\",\n font.charset ?? \"\",\n ].join(\"|\");\n}\n\nfunction fillStyleKey(fill: SpreadsheetFillStyle | undefined): string {\n if (!fill) {\n return \"\";\n }\n return [\n fill.type ?? \"\",\n fill.patternType ?? \"\",\n fill.color ?? \"\",\n fill.fgColor ?? \"\",\n fill.bgColor ?? \"\",\n ].join(\"|\");\n}\n\nfunction borderEdgeKey(edge: SpreadsheetBorderEdge | undefined): string {\n if (!edge) {\n return \"\";\n }\n return `${edge.style ?? \"\"}:${edge.color ?? \"\"}`;\n}\n\nfunction borderDiagonalKey(diagonal: SpreadsheetBorderDiagonal | undefined): string {\n if (!diagonal) {\n return \"\";\n }\n return `${diagonal.style ?? \"\"}:${diagonal.color ?? \"\"}:${diagonal.direction ?? \"\"}`;\n}\n\nfunction borderStyleKey(border: SpreadsheetCellStyle[\"border\"] | undefined): string {\n if (!border) {\n return \"\";\n }\n return [\n borderEdgeKey(border.left),\n borderEdgeKey(border.right),\n borderEdgeKey(border.top),\n borderEdgeKey(border.bottom),\n borderDiagonalKey(border.diagonal),\n ].join(\"|\");\n}\n\nfunction alignmentStyleKey(alignment: SpreadsheetCellStyle[\"alignment\"] | undefined): string {\n if (!alignment) {\n return \"\";\n }\n return [\n alignment.horizontal ?? \"\",\n alignment.vertical ?? \"\",\n alignment.wrapText ? 1 : 0,\n alignment.textRotation ?? \"\",\n alignment.indent ?? \"\",\n alignment.shrinkToFit ? 1 : 0,\n alignment.readingOrder ?? \"\",\n ].join(\"|\");\n}\n\nfunction protectionStyleKey(protection: SpreadsheetCellStyle[\"protection\"] | undefined): string {\n if (!protection) {\n return \"\";\n }\n return [\n protection.locked === undefined ? \"\" : (protection.locked ? 1 : 0),\n protection.hidden === undefined ? \"\" : (protection.hidden ? 1 : 0),\n ].join(\"|\");\n}\n\nfunction inlineStyleKey(style: SpreadsheetCellStyle): string {\n return [\n style.numberFormat ?? \"\",\n fontStyleKey(style.font),\n fillStyleKey(style.fill),\n borderStyleKey(style.border),\n alignmentStyleKey(style.alignment),\n protectionStyleKey(style.protection),\n ].join(\"||\");\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function deepMerge<T>(base: T | undefined, override: T | undefined): T | undefined {\n if (base === undefined) return override;\n if (override === undefined) return base;\n if (!isObject(base) || !isObject(override)) {\n return override;\n }\n\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) {\n continue;\n }\n result[key] = key in result ? deepMerge(result[key], value) : value;\n }\n return result as T;\n}\n\nexport function resolveStyleInput(style: SpreadsheetCellStyleInput | undefined): SpreadsheetCellStyle | undefined {\n if (!style) {\n return undefined;\n }\n\n if (typeof style === \"string\") {\n return PRESETS[style as keyof typeof PRESETS] as SpreadsheetCellStyle | undefined;\n }\n\n const presetStyle = style.preset ? PRESETS[style.preset as keyof typeof PRESETS] as SpreadsheetCellStyle | undefined : undefined;\n const { preset: _preset, ...rest } = style;\n void _preset;\n return deepMerge(presetStyle, rest);\n}\n\nexport function resolveNumberFormatAlias(numberFormat: string | undefined): string | undefined {\n if (!numberFormat) {\n return undefined;\n }\n\n const aliasMap: Record<string, string> = {\n currency: \"$#,##0.00\",\n \"currency:EUR\": \"\u20AC#,##0.00\",\n \"currency:GBP\": \"\u00A3#,##0.00\",\n \"currency:KRW\": \"\u20A9#,##0\",\n \"currency:JPY\": \"\u00A5#,##0\",\n percentage: \"0.0%\",\n \"percentage:0\": \"0%\",\n \"percentage:2\": \"0.00%\",\n date: \"yyyy-mm-dd\",\n \"date:us\": \"m/d/yyyy\",\n \"date:eu\": \"d/m/yyyy\",\n \"date:kr\": \"yyyy\uB144 m\uC6D4 d\uC77C\",\n datetime: \"yyyy-mm-dd hh:mm\",\n time: \"h:mm:ss\",\n accounting: \"_($* #,##0.00_);_($* (#,##0.00);_($* \\\"-\\\"??_);_(@_)\",\n \"number:0\": \"#,##0\",\n \"number:2\": \"#,##0.00\",\n scientific: \"0.00E+00\",\n text: \"@\",\n };\n\n return aliasMap[numberFormat] ?? numberFormat;\n}\n\nexport function resolveCellStyle(\n style: SpreadsheetCellStyleInput | undefined,\n value: CellValue | undefined,\n sheetBaseStyle?: SpreadsheetCellStyleInput,\n): SpreadsheetCellStyle | undefined {\n if (\n sheetBaseStyle === undefined &&\n style !== undefined &&\n typeof style !== \"string\" &&\n !style.preset &&\n !(value instanceof Date && !style.numberFormat)\n ) {\n if (!style.numberFormat) {\n return style;\n }\n\n const cached = resolvedInlineStyleCache.get(style);\n if (cached) {\n return cached;\n }\n const valueKey = inlineStyleKey(style);\n const cachedByValue = resolvedInlineStyleValueCache.get(valueKey);\n if (cachedByValue) {\n resolvedInlineStyleCache.set(style, cachedByValue);\n return cachedByValue;\n }\n\n const resolvedInline = {\n ...style,\n numberFormat: resolveNumberFormatAlias(style.numberFormat),\n };\n resolvedInlineStyleCache.set(style, resolvedInline);\n resolvedInlineStyleValueCache.set(valueKey, resolvedInline);\n return resolvedInline;\n }\n\n const baseStyle = resolveStyleInput(sheetBaseStyle);\n let resolved = deepMerge(baseStyle, resolveStyleInput(style));\n\n if (value instanceof Date && !resolved?.numberFormat) {\n resolved = deepMerge(resolved, { numberFormat: \"date\" });\n }\n\n if (resolved?.numberFormat) {\n resolved = {\n ...resolved,\n numberFormat: resolveNumberFormatAlias(resolved.numberFormat),\n };\n }\n\n return resolved;\n}\n\nexport function normalizeFont(font: SpreadsheetFontStyle | undefined, defaults: { family: string; size: number }): Required<Pick<SpreadsheetFontStyle, \"family\" | \"size\">> & SpreadsheetFontStyle {\n return {\n family: font?.family ?? defaults.family,\n size: font?.size ?? defaults.size,\n bold: font?.bold,\n italic: font?.italic,\n underline: font?.underline,\n strikethrough: font?.strikethrough,\n color: font?.color,\n vertAlign: font?.vertAlign,\n charset: font?.charset,\n };\n}\n\nexport function normalizeFill(fill: SpreadsheetFillStyle | undefined): SpreadsheetFillStyle | undefined {\n if (!fill) {\n return undefined;\n }\n\n if (fill.color) {\n return {\n type: \"solid\",\n fgColor: fill.color,\n bgColor: fill.bgColor,\n patternType: \"solid\",\n };\n }\n\n return {\n type: fill.type ?? \"solid\",\n fgColor: fill.fgColor,\n bgColor: fill.bgColor,\n patternType: fill.patternType ?? (fill.type === \"pattern\" ? \"darkGray\" : \"solid\"),\n };\n}\n", "import type {\n SpreadsheetAutoFilterConfig,\n SpreadsheetCell,\n SpreadsheetCellStyle,\n SpreadsheetSheet,\n} from \"../types/spreadsheet-ast.js\";\nimport { absRangeRef, parseRangeRef, type ParsedRangeRef } from \"../utils/cell-ref.js\";\nimport { deepMerge, resolveStyleInput } from \"../styles/style-utils.js\";\n\nfunction cellKey(row: number, col: number): string {\n return `${row}:${col}`;\n}\n\nfunction cloneCell(cell: SpreadsheetCell): SpreadsheetCell {\n return {\n ...cell,\n value: cell.value,\n style: cell.style,\n };\n}\n\nfunction rangesOverlap(left: ParsedRangeRef, right: ParsedRangeRef): boolean {\n return !(\n left.endRow < right.startRow ||\n right.endRow < left.startRow ||\n left.endCol < right.startCol ||\n right.endCol < left.startCol\n );\n}\n\nfunction isNonEmptyCell(cell: SpreadsheetCell | undefined): boolean {\n return Boolean(\n cell &&\n cell.value !== undefined &&\n cell.value !== null &&\n (!Array.isArray(cell.value) || cell.value.length > 0),\n );\n}\n\nfunction mergeStylePatch(\n cell: SpreadsheetCell | undefined,\n patch: SpreadsheetCellStyle,\n): SpreadsheetCell {\n const baseStyle = resolveStyleInput(cell?.style);\n return {\n ...(cell ?? { value: null }),\n style: deepMerge(baseStyle, patch),\n };\n}\n\nexport interface MergeRangeDescriptor {\n ref: string;\n bounds: ParsedRangeRef;\n source: \"explicit\" | \"span\";\n}\n\nexport interface PositionedCell {\n row: number;\n col: number;\n cell: SpreadsheetCell;\n}\n\nexport interface PositionedRow {\n row: number;\n cells: PositionedCell[];\n}\n\nexport interface SheetStructureIssue {\n code: \"MERGE_RANGE_OVERLAP\" | \"MERGE_RANGE_OUT_OF_BOUNDS\" | \"MERGE_RANGE_CONSUMED_CELL\";\n message: string;\n path: Array<string | number>;\n}\n\nexport interface CompiledSheetStructure {\n rows: PositionedRow[];\n originCells: PositionedRow[];\n mergeRanges: MergeRangeDescriptor[];\n autoFilterRef?: string;\n maxRow: number;\n maxCol: number;\n}\n\nexport function quoteSheetName(sheetName: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_.]*$/.test(sheetName)) {\n return sheetName;\n }\n return `'${sheetName.replaceAll(\"'\", \"''\")}'`;\n}\n\nfunction resolveAutoFilterRef(\n sheet: SpreadsheetSheet,\n maxRow: number,\n maxCol: number,\n): string | undefined {\n if (!sheet.autoFilter) {\n return undefined;\n }\n\n if (sheet.autoFilter === true) {\n if (maxRow < 0 || maxCol < 0) {\n return \"A1:A1\";\n }\n return absRangeRef(0, 0, maxRow, maxCol).replaceAll(\"$\", \"\");\n }\n\n return (sheet.autoFilter as SpreadsheetAutoFilterConfig).ref;\n}\n\nexport function compileSheetStructure(sheet: SpreadsheetSheet): CompiledSheetStructure {\n const occupied = new Set<string>();\n const originCellMap = new Map<string, SpreadsheetCell>();\n const spanMerges: MergeRangeDescriptor[] = [];\n let maxRow = sheet.rows.length - 1;\n let maxCol = Math.max(-1, (sheet.columns?.length ?? 0) - 1);\n\n sheet.rows.forEach((row, rowIndex) => {\n let cursor = 0;\n row.cells.forEach((cellInput) => {\n while (occupied.has(cellKey(rowIndex, cursor))) {\n cursor += 1;\n }\n\n const cell = cloneCell(cellInput);\n const colSpan = cell.colSpan ?? 1;\n const rowSpan = cell.rowSpan ?? 1;\n originCellMap.set(cellKey(rowIndex, cursor), cell);\n maxRow = Math.max(maxRow, rowIndex + rowSpan - 1);\n maxCol = Math.max(maxCol, cursor + colSpan - 1);\n\n if (colSpan > 1 || rowSpan > 1) {\n spanMerges.push({\n ref: `${absRangeRef(rowIndex, cursor, rowIndex + rowSpan - 1, cursor + colSpan - 1).replaceAll(\"$\", \"\")}`,\n bounds: {\n startRow: rowIndex,\n startCol: cursor,\n endRow: rowIndex + rowSpan - 1,\n endCol: cursor + colSpan - 1,\n },\n source: \"span\",\n });\n }\n\n for (let occupiedRow = rowIndex; occupiedRow < rowIndex + rowSpan; occupiedRow += 1) {\n for (let occupiedCol = cursor; occupiedCol < cursor + colSpan; occupiedCol += 1) {\n if (occupiedRow === rowIndex && occupiedCol === cursor) {\n continue;\n }\n occupied.add(cellKey(occupiedRow, occupiedCol));\n }\n }\n\n cursor += colSpan;\n });\n });\n\n const explicitMerges = (sheet.mergedCells ?? []).map((ref) => ({\n ref,\n bounds: parseRangeRef(ref),\n source: \"explicit\" as const,\n }));\n const mergeRanges = [...spanMerges, ...explicitMerges];\n\n const propagatedCellMap = new Map(originCellMap);\n for (const merge of mergeRanges) {\n const topLeftKey = cellKey(merge.bounds.startRow, merge.bounds.startCol);\n const topLeftCell = propagatedCellMap.get(topLeftKey);\n const border = resolveStyleInput(topLeftCell?.style)?.border;\n if (!border) {\n continue;\n }\n\n const applyEdge = (\n row: number,\n col: number,\n patch: SpreadsheetCellStyle,\n ) => {\n const key = cellKey(row, col);\n propagatedCellMap.set(key, mergeStylePatch(propagatedCellMap.get(key), patch));\n };\n\n if (border.top) {\n for (let col = merge.bounds.startCol; col <= merge.bounds.endCol; col += 1) {\n applyEdge(merge.bounds.startRow, col, { border: { top: border.top } });\n }\n }\n if (border.bottom) {\n for (let col = merge.bounds.startCol; col <= merge.bounds.endCol; col += 1) {\n applyEdge(merge.bounds.endRow, col, { border: { bottom: border.bottom } });\n }\n }\n if (border.left) {\n for (let row = merge.bounds.startRow; row <= merge.bounds.endRow; row += 1) {\n applyEdge(row, merge.bounds.startCol, { border: { left: border.left } });\n }\n }\n if (border.right) {\n for (let row = merge.bounds.startRow; row <= merge.bounds.endRow; row += 1) {\n applyEdge(row, merge.bounds.endCol, { border: { right: border.right } });\n }\n }\n }\n\n const buildRows = (cellMap: Map<string, SpreadsheetCell>): PositionedRow[] => {\n const rowMap = new Map<number, PositionedCell[]>();\n for (const [key, cell] of cellMap) {\n const [row, col] = key.split(\":\").map(Number);\n const rowCells = rowMap.get(row) ?? [];\n rowCells.push({ row, col, cell });\n rowMap.set(row, rowCells);\n }\n\n return [...rowMap.entries()]\n .sort((left, right) => left[0] - right[0])\n .map(([row, cells]) => ({\n row,\n cells: cells.sort((left, right) => left.col - right.col),\n }));\n };\n\n return {\n rows: buildRows(propagatedCellMap),\n originCells: buildRows(originCellMap),\n mergeRanges,\n autoFilterRef: resolveAutoFilterRef(sheet, maxRow, maxCol),\n maxRow,\n maxCol,\n };\n}\n\nexport function validateSheetStructure(sheet: SpreadsheetSheet): SheetStructureIssue[] {\n const compiled = compileSheetStructure(sheet);\n const issues: SheetStructureIssue[] = [];\n const maxDefinedRow = sheet.rows.length - 1;\n const maxDefinedCol = Math.max(\n (sheet.columns?.length ?? 0) - 1,\n compiled.originCells.reduce((max, row) => Math.max(max, ...(row.cells.map((cell) => cell.col))), -1),\n );\n\n compiled.mergeRanges.forEach((merge, index) => {\n if (\n merge.bounds.startRow < 0 ||\n merge.bounds.startCol < 0 ||\n merge.bounds.endRow > maxDefinedRow ||\n merge.bounds.endCol > maxDefinedCol\n ) {\n issues.push({\n code: \"MERGE_RANGE_OUT_OF_BOUNDS\",\n message: `Merge range ${merge.ref} exceeds the defined sheet bounds`,\n path: [\"mergedCells\", index],\n });\n }\n\n for (let otherIndex = index + 1; otherIndex < compiled.mergeRanges.length; otherIndex += 1) {\n const other = compiled.mergeRanges[otherIndex];\n if (rangesOverlap(merge.bounds, other.bounds)) {\n issues.push({\n code: \"MERGE_RANGE_OVERLAP\",\n message: `Merge ranges ${merge.ref} and ${other.ref} overlap`,\n path: [\"mergedCells\", index],\n });\n }\n }\n\n if (merge.source === \"explicit\") {\n for (const row of compiled.originCells) {\n for (const cell of row.cells) {\n if (\n (cell.row !== merge.bounds.startRow || cell.col !== merge.bounds.startCol) &&\n cell.row >= merge.bounds.startRow &&\n cell.row <= merge.bounds.endRow &&\n cell.col >= merge.bounds.startCol &&\n cell.col <= merge.bounds.endCol &&\n isNonEmptyCell(cell.cell)\n ) {\n issues.push({\n code: \"MERGE_RANGE_CONSUMED_CELL\",\n message: `Merge range ${merge.ref} consumes populated cell ${absRangeRef(cell.row, cell.col, cell.row, cell.col).replaceAll(\"$\", \"\")}`,\n path: [\"mergedCells\"],\n });\n }\n }\n }\n }\n });\n\n return issues;\n}\n", "import { quoteSheetName } from \"../worksheet/structure.js\";\n\nconst EXCEL_MAX_COLUMNS = 16_384;\nconst COLUMN_LETTERS = Array.from({ length: EXCEL_MAX_COLUMNS }, (_unused, index) => {\n let current = index + 1;\n let letters = \"\";\n\n while (current > 0) {\n current -= 1;\n letters = String.fromCharCode(65 + (current % 26)) + letters;\n current = Math.floor(current / 26);\n }\n\n return letters;\n});\n\nexport function colIndexToLetter(index: number): string {\n if (!Number.isInteger(index) || index < 0 || index >= EXCEL_MAX_COLUMNS) {\n throw new RangeError(`Column index ${index} is outside Excel's supported range`);\n }\n\n return COLUMN_LETTERS[index];\n}\n\nexport function rowIndexToRowNum(index: number): string {\n if (!Number.isInteger(index) || index < 0) {\n throw new RangeError(`Row index ${index} must be a non-negative integer`);\n }\n\n return String(index + 1);\n}\n\nexport function cellRef(row: number, col: number): string {\n return `${colIndexToLetter(col)}${rowIndexToRowNum(row)}`;\n}\n\nexport function absCellRef(row: number, col: number): string {\n return `$${colIndexToLetter(col)}$${rowIndexToRowNum(row)}`;\n}\n\nexport function parseCellRef(ref: string): { row: number; col: number } {\n const match = /^\\$?([A-Z]+)\\$?([1-9]\\d*)$/.exec(ref);\n\n if (!match) {\n throw new Error(`Invalid cell reference: ${ref}`);\n }\n\n const [, letters, rowString] = match;\n let col = 0;\n\n for (const character of letters) {\n col = (col * 26) + (character.charCodeAt(0) - 64);\n }\n\n return {\n row: Number(rowString) - 1,\n col: col - 1,\n };\n}\n\nexport interface ParsedRangeRef {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n}\n\nexport function parseRangeRef(ref: string): ParsedRangeRef {\n const [startRef, endRef] = ref.split(\":\");\n if (!startRef || !endRef) {\n const parsed = parseCellRef(ref);\n return {\n startRow: parsed.row,\n startCol: parsed.col,\n endRow: parsed.row,\n endCol: parsed.col,\n };\n }\n\n const start = parseCellRef(startRef);\n const end = parseCellRef(endRef);\n return {\n startRow: Math.min(start.row, end.row),\n startCol: Math.min(start.col, end.col),\n endRow: Math.max(start.row, end.row),\n endCol: Math.max(start.col, end.col),\n };\n}\n\nexport function rangeRef(\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n): string {\n return `${cellRef(startRow, startCol)}:${cellRef(endRow, endCol)}`;\n}\n\nexport function absRangeRef(\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n): string {\n return `${absCellRef(startRow, startCol)}:${absCellRef(endRow, endCol)}`;\n}\n\nexport function formatSheetRef(sheetName: string, cellRef: string): string {\n return `${quoteSheetName(sheetName)}!${cellRef}`;\n}\n\nexport function formatSheetRange(sheetName: string, startCell: string, endCell: string): string {\n return `${quoteSheetName(sheetName)}!${startCell}:${endCell}`;\n}\n\nexport function extractSheetReferences(formula: string): string[] {\n const refs = new Set<string>();\n // Match quoted sheet names: 'anything'!\n const quotedPattern = /'((?:[^']|'')+)'!/g;\n let match: RegExpExecArray | null;\n while ((match = quotedPattern.exec(formula)) !== null) {\n refs.add(match[1].replaceAll(\"''\", \"'\"));\n }\n // Match unquoted sheet names: word chars followed by !\n // Must start with letter/underscore (digit-starting names are always quoted)\n const unquotedPattern = /(?<![A-Za-z0-9_.'\"])([A-Za-z_][A-Za-z0-9_.]*)\\s*!/g;\n while ((match = unquotedPattern.exec(formula)) !== null) {\n refs.add(match[1]);\n }\n return [...refs];\n}\n", "import type { SpreadsheetHyperlink } from \"../types/spreadsheet-ast.js\";\nimport { parseRangeRef } from \"./cell-ref.js\";\nimport { quoteSheetName } from \"../worksheet/structure.js\";\n\nexport type NormalizedHyperlink =\n | {\n mode: \"external\";\n target: string;\n display?: string;\n tooltip?: string;\n }\n | {\n mode: \"internal\";\n location: string;\n display?: string;\n tooltip?: string;\n };\n\nfunction unquoteSheetName(value: string): string {\n if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n return value.slice(1, -1).replaceAll(\"''\", \"'\");\n }\n\n return value;\n}\n\nfunction splitHyperlinkLocation(value: string): { sheetName?: string; ref: string } {\n const normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n const separatorIndex = normalized.lastIndexOf(\"!\");\n if (separatorIndex === -1) {\n return { ref: normalized };\n }\n\n return {\n sheetName: unquoteSheetName(normalized.slice(0, separatorIndex)),\n ref: normalized.slice(separatorIndex + 1),\n };\n}\n\nfunction isCellOrRangeRef(value: string): boolean {\n try {\n parseRangeRef(value);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isInternalLocation(value: string): boolean {\n const { ref } = splitHyperlinkLocation(value.trim());\n return isCellOrRangeRef(ref);\n}\n\nexport function normalizeHyperlinkLocation(value: string): string {\n const { sheetName, ref } = splitHyperlinkLocation(value.trim());\n if (!sheetName) {\n return ref;\n }\n\n return `${quoteSheetName(sheetName)}!${ref}`;\n}\n\nexport function getExplicitHyperlinkSheetName(value: string): string | undefined {\n return splitHyperlinkLocation(value.trim()).sheetName;\n}\n\nexport function normalizeHyperlink(hyperlink: SpreadsheetHyperlink): NormalizedHyperlink {\n if (typeof hyperlink === \"string\") {\n const normalized = hyperlink.trim();\n if (isInternalLocation(normalized)) {\n return {\n mode: \"internal\",\n location: normalizeHyperlinkLocation(normalized),\n };\n }\n\n return {\n mode: \"external\",\n target: normalized,\n };\n }\n\n if (\"location\" in hyperlink) {\n return {\n mode: \"internal\",\n location: normalizeHyperlinkLocation(hyperlink.location),\n display: hyperlink.display,\n tooltip: hyperlink.tooltip,\n };\n }\n\n return {\n mode: \"external\",\n target: hyperlink.target,\n display: hyperlink.display,\n tooltip: hyperlink.tooltip,\n };\n}\n", "const XML_ESCAPE_PATTERN = /[&<>\"']/g;\nconst XML_ESCAPE_NEEDS_WORK = /[&<>\"']/;\n// eslint-disable-next-line no-control-regex\nconst FORBIDDEN_CONTROL_PATTERN = new RegExp(\"[\\\\x00-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F]\");\n// eslint-disable-next-line no-control-regex\nconst FORBIDDEN_CONTROL_PATTERN_GLOBAL = new RegExp(\"[\\\\x00-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F]\", \"g\");\n\nconst XML_ESCAPE_MAP: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n \"\\\"\": \"&quot;\",\n \"'\": \"&apos;\",\n};\n\nexport const XML_DECLARATION = \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"yes\\\"?>\";\n\nexport function escapeXml(value: string): string {\n if (!XML_ESCAPE_NEEDS_WORK.test(value)) {\n return value;\n }\n return value.replace(XML_ESCAPE_PATTERN, (character) => XML_ESCAPE_MAP[character] ?? character);\n}\n\nexport function sanitizeSharedString(value: string): string {\n if (!FORBIDDEN_CONTROL_PATTERN.test(value)) {\n return value;\n }\n\n return value.replace(FORBIDDEN_CONTROL_PATTERN_GLOBAL, \"\");\n}\n\nexport function needsXmlSpacePreserve(value: string): boolean {\n return /^\\s/.test(value) || /\\s$/.test(value) || /[\\t\\r\\n]/.test(value);\n}\n\nexport function formatNumberForCell(value: number): string {\n if (Object.is(value, -0)) {\n return \"-0\";\n }\n\n return String(value);\n}\n\nexport function toW3CDateTime(value: Date): string {\n return value.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n", "import { escapeXml } from \"../utils/xml.js\";\n\nexport interface SerializedColor {\n xmlAttributes: string;\n}\n\nfunction normalizeHex(color: string): string {\n const raw = color.startsWith(\"#\") ? color.slice(1) : color;\n if (raw.length === 6) {\n return `FF${raw.toUpperCase()}`;\n }\n if (raw.length === 8) {\n return raw.toUpperCase();\n }\n return raw.toUpperCase();\n}\n\nexport function serializeColorAttributes(color: string): string {\n if (color.startsWith(\"theme:\")) {\n const [, themeIndex, tint] = color.split(\":\");\n const attributes = [`theme=\"${escapeXml(themeIndex)}\"`];\n if (tint !== undefined) {\n attributes.push(`tint=\"${escapeXml(tint)}\"`);\n }\n return attributes.join(\" \");\n }\n\n return `rgb=\"${normalizeHex(color)}\"`;\n}\n", "import type { SpreadsheetFontStyle } from \"../types/spreadsheet-ast.js\";\nimport { escapeXml } from \"../utils/xml.js\";\nimport { serializeColorAttributes } from \"./color.js\";\n\nexport interface FontDef extends SpreadsheetFontStyle {\n family: string;\n size: number;\n familyClassification?: number;\n scheme?: \"minor\" | \"major\";\n color?: string;\n}\n\nfunction serializeUnderline(underline: FontDef[\"underline\"]): string {\n if (!underline) {\n return \"\";\n }\n if (underline === true) {\n return \"<u val=\\\"single\\\"/>\";\n }\n return `<u val=\"${escapeXml(underline)}\"/>`;\n}\n\nexport function serializeFont(font: FontDef): string {\n const parts: string[] = [\"<font>\"];\n if (font.bold) parts.push(\"<b/>\");\n if (font.italic) parts.push(\"<i/>\");\n if (font.strikethrough) parts.push(\"<strike/>\");\n const underline = serializeUnderline(font.underline);\n if (underline) parts.push(underline);\n if (font.vertAlign) parts.push(`<vertAlign val=\"${font.vertAlign}\"/>`);\n parts.push(`<sz val=\"${font.size}\"/>`);\n if (font.color) {\n parts.push(`<color ${serializeColorAttributes(font.color)}/>`);\n }\n parts.push(`<name val=\"${escapeXml(font.family)}\"/>`);\n if (font.familyClassification !== undefined) {\n parts.push(`<family val=\"${font.familyClassification}\"/>`);\n }\n if (font.charset !== undefined) {\n parts.push(`<charset val=\"${font.charset}\"/>`);\n }\n if (font.scheme) {\n parts.push(`<scheme val=\"${font.scheme}\"/>`);\n }\n parts.push(\"</font>\");\n return parts.join(\"\");\n}\n\nexport function serializeRichTextRunFont(font: FontDef): string {\n const parts: string[] = [\"<rPr>\"];\n if (font.bold) parts.push(\"<b/>\");\n if (font.italic) parts.push(\"<i/>\");\n if (font.strikethrough) parts.push(\"<strike/>\");\n const underline = serializeUnderline(font.underline);\n if (underline) parts.push(underline);\n if (font.vertAlign) parts.push(`<vertAlign val=\"${font.vertAlign}\"/>`);\n parts.push(`<sz val=\"${font.size}\"/>`);\n if (font.color) {\n parts.push(`<color ${serializeColorAttributes(font.color)}/>`);\n }\n parts.push(`<rFont val=\"${escapeXml(font.family)}\"/>`);\n if (font.charset !== undefined) {\n parts.push(`<charset val=\"${font.charset}\"/>`);\n }\n parts.push(\"</rPr>\");\n return parts.join(\"\");\n}\n", "import type {\n SpreadsheetConditionalFormatting,\n SpreadsheetConditionalFormattingRule,\n SpreadsheetConditionalFormattingCellIsRule,\n SpreadsheetConditionalFormattingTop10Rule,\n SpreadsheetConditionalFormattingDuplicateRule,\n SpreadsheetConditionalFormattingColorScaleRule,\n SpreadsheetConditionalFormattingDataBarRule,\n SpreadsheetConditionalFormattingIconSetRule,\n SpreadsheetCfvo,\n} from \"../types/spreadsheet-ast.js\";\nimport type { StyleRegistry } from \"./style-registry.js\";\nimport { serializeColorAttributes } from \"./color.js\";\n\nexport interface ConditionalFormattingOutput {\n xml: string;\n extLst: string;\n}\n\nfunction serializeCfvo(rulePoint: { type: string; value?: number | string }): string {\n const valAttr = rulePoint.value !== undefined ? ` val=\"${rulePoint.value}\"` : \"\";\n return `<cfvo type=\"${rulePoint.type}\"${valAttr}/>`;\n}\n\nfunction serializeCellIs(rule: SpreadsheetConditionalFormattingCellIsRule, registry: StyleRegistry, priority: number): string {\n const dxfId = registry.registerDxf(rule.style);\n return `<cfRule type=\"cellIs\" dxfId=\"${dxfId}\" priority=\"${priority}\" operator=\"${rule.operator}\"><formula>${rule.formula}</formula></cfRule>`;\n}\n\nfunction serializeTop10(rule: SpreadsheetConditionalFormattingTop10Rule, registry: StyleRegistry, priority: number): string {\n const dxfId = registry.registerDxf(rule.style);\n return `<cfRule type=\"top10\" dxfId=\"${dxfId}\" priority=\"${priority}\" rank=\"${rule.rank}\" percent=\"${rule.percent ? 1 : 0}\" bottom=\"${rule.bottom ? 1 : 0}\"/>`;\n}\n\nfunction serializeDuplicate(rule: SpreadsheetConditionalFormattingDuplicateRule, registry: StyleRegistry, priority: number): string {\n const dxfId = registry.registerDxf(rule.style);\n return `<cfRule type=\"${rule.type}\" dxfId=\"${dxfId}\" priority=\"${priority}\"/>`;\n}\n\nfunction serializeColorScale(rule: SpreadsheetConditionalFormattingColorScaleRule, priority: number): string {\n const points = [rule.scale.min, rule.scale.mid, rule.scale.max].filter(\n (point): point is SpreadsheetConditionalFormattingColorScaleRule[\"scale\"][\"min\"] => point !== undefined,\n );\n const colors = points.map((point) => `<color ${serializeColorAttributes(point.color)}/>`).join(\"\");\n return `<cfRule type=\"colorScale\" priority=\"${priority}\"><colorScale>${points.map((point) => serializeCfvo(point)).join(\"\")}${colors}</colorScale></cfRule>`;\n}\n\nfunction needsExtendedDataBar(rule: SpreadsheetConditionalFormattingDataBarRule): boolean {\n return (\n rule.negativeColor !== undefined ||\n (rule.axisPosition !== undefined && rule.axisPosition !== \"automatic\") ||\n rule.gradient === false ||\n rule.direction !== undefined\n );\n}\n\nfunction serializeDataBar(rule: SpreadsheetConditionalFormattingDataBarRule, priority: number): { basic: string; extended: string } {\n const showValueAttr = rule.showValue === false ? ` showValue=\"0\"` : \"\";\n const basic = `<cfRule type=\"dataBar\" priority=\"${priority}\"><dataBar${showValueAttr}>${serializeCfvo(rule.min)}${serializeCfvo(rule.max)}<color ${serializeColorAttributes(rule.color)}/></dataBar></cfRule>`;\n\n if (!needsExtendedDataBar(rule)) {\n return { basic, extended: \"\" };\n }\n\n const guid = `{00000000-0000-0000-0000-${String(priority).padStart(12, \"0\")}}`;\n\n const extParts: string[] = [];\n extParts.push(`<x14:cfRule type=\"dataBar\" id=\"${guid}\">`);\n extParts.push(`<x14:dataBar`);\n\n const extAttrs: string[] = [];\n if (rule.gradient === false) {\n extAttrs.push(` gradient=\"0\"`);\n }\n if (rule.direction !== undefined) {\n extAttrs.push(` direction=\"${rule.direction}\"`);\n }\n if (rule.axisPosition !== undefined && rule.axisPosition !== \"automatic\") {\n extAttrs.push(` axisPosition=\"${rule.axisPosition}\"`);\n }\n extParts.push(extAttrs.join(\"\"));\n extParts.push(\">\");\n\n extParts.push(serializeX14Cfvo(rule.min));\n extParts.push(serializeX14Cfvo(rule.max));\n\n if (rule.negativeColor !== undefined) {\n extParts.push(`<x14:negativeFillColor ${serializeColorAttributes(rule.negativeColor)}/>`);\n }\n\n if (rule.axisPosition !== \"none\") {\n extParts.push(`<x14:axisColor rgb=\"FF000000\"/>`);\n }\n\n extParts.push(\"</x14:dataBar>\");\n extParts.push(\"</x14:cfRule>\");\n\n return { basic, extended: extParts.join(\"\") };\n}\n\nfunction serializeX14Cfvo(cfvo: SpreadsheetCfvo): string {\n const valAttr = cfvo.value !== undefined ? `<xm:f>${cfvo.value}</xm:f>` : \"\";\n return `<x14:cfvo type=\"${cfvo.type}\">${valAttr}</x14:cfvo>`;\n}\n\nconst DEFAULT_THRESHOLDS: Record<number, number[]> = {\n 3: [0, 33, 67],\n 4: [0, 25, 50, 75],\n 5: [0, 20, 40, 60, 80],\n};\n\nfunction serializeIconSet(rule: SpreadsheetConditionalFormattingIconSetRule, priority: number): string {\n const iconCount = parseInt(rule.iconSet[0], 10);\n\n const attrs: string[] = [`iconSet=\"${rule.iconSet}\"`];\n if (rule.showValue === false) {\n attrs.push(`showValue=\"0\"`);\n }\n if (rule.reverse === true) {\n attrs.push(`reverse=\"1\"`);\n }\n\n let cfvos: string;\n if (rule.thresholds) {\n cfvos = rule.thresholds.map((t) => serializeCfvo(t)).join(\"\");\n } else {\n const defaults = DEFAULT_THRESHOLDS[iconCount];\n cfvos = defaults.map((val) => `<cfvo type=\"percent\" val=\"${val}\"/>`).join(\"\");\n }\n\n return `<cfRule type=\"iconSet\" priority=\"${priority}\"><iconSet ${attrs.join(\" \")}>${cfvos}</iconSet></cfRule>`;\n}\n\nfunction serializeRule(\n rule: SpreadsheetConditionalFormattingRule,\n registry: StyleRegistry,\n priority: number,\n): { basic: string; extended: string } {\n switch (rule.type) {\n case \"cellIs\":\n return { basic: serializeCellIs(rule, registry, priority), extended: \"\" };\n case \"top10\":\n return { basic: serializeTop10(rule, registry, priority), extended: \"\" };\n case \"duplicateValues\":\n case \"uniqueValues\":\n return { basic: serializeDuplicate(rule, registry, priority), extended: \"\" };\n case \"colorScale\":\n return { basic: serializeColorScale(rule, priority), extended: \"\" };\n case \"dataBar\":\n return serializeDataBar(rule, priority);\n case \"iconSet\":\n return { basic: serializeIconSet(rule, priority), extended: \"\" };\n default: {\n const _exhaustive: never = rule;\n void _exhaustive;\n return { basic: \"\", extended: \"\" };\n }\n }\n}\n\nexport function serializeConditionalFormatting(\n rules: SpreadsheetConditionalFormatting[] | undefined,\n registry: StyleRegistry,\n): ConditionalFormattingOutput {\n if (!rules || rules.length === 0) {\n return { xml: \"\", extLst: \"\" };\n }\n\n let priority = 1;\n const xmlParts: string[] = [];\n const extEntries: string[] = [];\n\n for (const entry of rules) {\n const ruleParts: string[] = [];\n for (const rule of entry.rules) {\n const result = serializeRule(rule, registry, priority);\n ruleParts.push(result.basic);\n if (result.extended) {\n extEntries.push(\n `<x14:conditionalFormatting xmlns:xm=\"http://schemas.microsoft.com/office/excel/2006/main\">${result.extended}<xm:sqref>${entry.ref}</xm:sqref></x14:conditionalFormatting>`,\n );\n }\n priority += 1;\n }\n xmlParts.push(`<conditionalFormatting sqref=\"${entry.ref}\">${ruleParts.join(\"\")}</conditionalFormatting>`);\n }\n\n let extLst = \"\";\n if (extEntries.length > 0) {\n extLst = `<extLst><ext uri=\"{78C0D931-6437-407d-A8EE-F0AAD7539E65}\" xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"><x14:conditionalFormattings>${extEntries.join(\"\")}</x14:conditionalFormattings></ext></extLst>`;\n }\n\n return { xml: xmlParts.join(\"\"), extLst };\n}\n", "import type {\n CellValue,\n SpreadsheetCellStyle,\n SpreadsheetColumn,\n SpreadsheetDefaults,\n SpreadsheetSheet,\n} from \"../types/spreadsheet-ast.js\";\nimport { isErrorValue } from \"../types/spreadsheet-ast.js\";\nimport { resolveCellStyle, resolveNumberFormatAlias } from \"../styles/style-utils.js\";\nimport { formatNumberForCell } from \"../utils/xml.js\";\n\nexport interface ComputedColumnWidth {\n width: number;\n bestFit: boolean;\n}\n\nexport interface ColumnSegment {\n start: number;\n end: number;\n width: number;\n hidden?: boolean;\n bestFit?: boolean;\n customWidth?: boolean;\n}\n\nfunction columnNeedsHeuristicWidth(column: SpreadsheetColumn | undefined): boolean {\n return column?.width === undefined && column?.bestFit === true;\n}\n\nfunction resolveSheetStyleInput(sheet: SpreadsheetSheet, rowIndex: number) {\n if (rowIndex === 0) {\n return sheet.styling?.headerRow;\n }\n\n return (rowIndex + 1) % 2 === 0\n ? sheet.styling?.alternateRows?.even\n : sheet.styling?.alternateRows?.odd;\n}\n\nexport function resolveSheetRowStyle(\n sheet: SpreadsheetSheet,\n rowIndex: number,\n cellValue?: CellValue,\n): SpreadsheetCellStyle | undefined {\n return resolveCellStyle(resolveSheetStyleInput(sheet, rowIndex), cellValue);\n}\n\nexport function stringifyDisplayValue(\n value: CellValue | undefined,\n style: SpreadsheetCellStyle | undefined,\n): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return value.map((run) => run.text).join(\"\");\n }\n if (isErrorValue(value)) {\n return value.error;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"boolean\") {\n return value ? \"TRUE\" : \"FALSE\";\n }\n if (value instanceof Date) {\n const numberFormat = resolveNumberFormatAlias(style?.numberFormat);\n if (numberFormat === \"m/d/yyyy\") return \"1/1/2026\";\n if (numberFormat === \"d/m/yyyy\") return \"1/1/2026\";\n return \"2026-01-01\";\n }\n\n const numberFormat = resolveNumberFormatAlias(style?.numberFormat);\n if (!numberFormat) {\n return formatNumberForCell(value);\n }\n if (numberFormat.includes(\"%\")) {\n const decimals = (numberFormat.split(\".\")[1]?.match(/0/g) ?? []).length;\n return `${(value * 100).toFixed(decimals)}%`;\n }\n if (numberFormat.includes(\"\u20A9\")) return `\u20A9${Math.round(value).toLocaleString(\"en-US\")}`;\n if (numberFormat.includes(\"$\")) return `$${value.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n if (numberFormat.includes(\"\u20AC\")) return `\u20AC${value.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n if (numberFormat.includes(\"#,##0.00\")) return value.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n if (numberFormat.includes(\"#,##0\")) return Math.round(value).toLocaleString(\"en-US\");\n return formatNumberForCell(value);\n}\n\nfunction isCJKCharacter(codePoint: number): boolean {\n return (\n (codePoint >= 0x2E80 && codePoint <= 0x9FFF) ||\n (codePoint >= 0xF900 && codePoint <= 0xFAFF) ||\n (codePoint >= 0xFE30 && codePoint <= 0xFE4F)\n );\n}\n\nfunction estimateCharacterBaseWidth(char: string): number {\n const codePoint = char.codePointAt(0) ?? 0;\n return isCJKCharacter(codePoint) ? 1.8 : 1.0;\n}\n\nexport function estimateCharacterWidth(char: string, bold: boolean): number {\n const base = estimateCharacterBaseWidth(char);\n return bold ? base * 1.05 : base;\n}\n\nfunction estimateStringWidth(value: string): number {\n let maxLineWidth = 0;\n let currentLineWidth = 0;\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!;\n if (ch === \"\\n\" || ch === \"\\r\") {\n maxLineWidth = Math.max(maxLineWidth, currentLineWidth);\n currentLineWidth = 0;\n // Skip \\n after \\r\n if (ch === \"\\r\" && value[i + 1] === \"\\n\") {\n i++;\n }\n continue;\n }\n currentLineWidth += estimateCharacterBaseWidth(ch);\n }\n return Math.max(maxLineWidth, currentLineWidth);\n}\n\nfunction longestLineLength(value: string): number {\n return value.split(/\\r\\n|\\r|\\n/).reduce(\n (max, line) => Math.max(max, line.length),\n 0,\n );\n}\n\nfunction countIntegerDigits(value: number): number {\n if (!Number.isFinite(value) || value === 0) {\n return 1;\n }\n return Math.floor(Math.log10(Math.abs(value))) + 1;\n}\n\nfunction countGroupedDigits(value: number): number {\n const digits = countIntegerDigits(value);\n return digits + Math.max(0, Math.floor((digits - 1) / 3));\n}\n\nfunction countDecimalPlaces(format: string): number {\n const decimalSection = format.split(\".\")[1] ?? \"\";\n const match = decimalSection.match(/0/g);\n return match?.length ?? 0;\n}\n\nfunction estimateNumberDisplayLength(value: number, numberFormat: string | undefined): number {\n if (!numberFormat) {\n return formatNumberForCell(value).length;\n }\n\n const absValue = Math.abs(value);\n const sign = value < 0 ? 1 : 0;\n\n if (numberFormat.includes(\"E+\")) {\n return sign + 8;\n }\n\n if (numberFormat.includes(\"%\")) {\n const decimals = countDecimalPlaces(numberFormat);\n const scaled = absValue * 100;\n return sign + countIntegerDigits(scaled) + (decimals > 0 ? decimals + 1 : 0) + 1;\n }\n\n if (numberFormat.includes(\"\u20A9\")) {\n return sign + 1 + countGroupedDigits(absValue);\n }\n\n if (numberFormat.includes(\"$\") || numberFormat.includes(\"\u20AC\") || numberFormat.includes(\"\u00A3\") || numberFormat.includes(\"\u00A5\")) {\n const decimals = countDecimalPlaces(numberFormat);\n return sign + 1 + countGroupedDigits(absValue) + (decimals > 0 ? decimals + 1 : 0);\n }\n\n if (numberFormat.includes(\"#,##0\")) {\n const decimals = countDecimalPlaces(numberFormat);\n return sign + countGroupedDigits(absValue) + (decimals > 0 ? decimals + 1 : 0);\n }\n\n if (numberFormat === \"@\") {\n return String(value).length;\n }\n\n return formatNumberForCell(value).length;\n}\n\nfunction resolveWidthCoefficient(\n style: SpreadsheetCellStyle | undefined,\n defaults: SpreadsheetDefaults | undefined,\n): number {\n const fontFamily = style?.font?.family ?? defaults?.font?.family ?? \"Calibri\";\n return fontFamily === \"Courier New\" ? 1.0 : 1.15;\n}\n\nfunction estimateDisplayCharWidth(\n value: CellValue | undefined,\n style: SpreadsheetCellStyle | undefined,\n): number | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n const boldMultiplier = style?.font?.bold === true ? 1.05 : 1;\n\n if (Array.isArray(value)) {\n return estimateStringWidth(value.map((run) => run.text).join(\"\")) * boldMultiplier;\n }\n if (isErrorValue(value)) {\n return estimateStringWidth(value.error) * boldMultiplier;\n }\n if (typeof value === \"string\") {\n return estimateStringWidth(value) * boldMultiplier;\n }\n\n return estimateDisplayLength(value, style) * boldMultiplier;\n}\n\nfunction estimateDisplayWidth(\n value: CellValue | undefined,\n style: SpreadsheetCellStyle | undefined,\n defaults: SpreadsheetDefaults | undefined,\n): number | undefined {\n const charWidth = estimateDisplayCharWidth(value, style);\n if (charWidth === undefined || charWidth === 0) {\n return undefined;\n }\n\n const coefficient = resolveWidthCoefficient(style, defaults);\n return Math.min(Math.max((charWidth * coefficient) + 2, 8.43), 255);\n}\n\nexport function estimateDisplayLength(\n value: CellValue | undefined,\n style: SpreadsheetCellStyle | undefined,\n): number {\n if (value === null || value === undefined) {\n return 0;\n }\n if (Array.isArray(value)) {\n return longestLineLength(value.map((run) => run.text).join(\"\"));\n }\n if (isErrorValue(value)) {\n return value.error.length;\n }\n if (typeof value === \"string\") {\n return longestLineLength(value);\n }\n if (typeof value === \"boolean\") {\n return value ? 4 : 5;\n }\n if (value instanceof Date) {\n const numberFormat = resolveNumberFormatAlias(style?.numberFormat);\n if (numberFormat === \"yyyy-mm-dd hh:mm\") return 16;\n if (numberFormat === \"h:mm:ss\") return 8;\n if (numberFormat === \"m/d/yyyy\") return 10;\n if (numberFormat === \"d/m/yyyy\") return 10;\n return 10;\n }\n\n return estimateNumberDisplayLength(value, resolveNumberFormatAlias(style?.numberFormat));\n}\n\nexport function estimateColumnWidth(\n sheet: SpreadsheetSheet,\n columnIndex: number,\n defaults?: SpreadsheetDefaults,\n): ComputedColumnWidth | undefined {\n const explicit = sheet.columns?.[columnIndex];\n if (explicit?.width !== undefined) {\n return { width: explicit.width, bestFit: explicit.bestFit ?? false };\n }\n if (!columnNeedsHeuristicWidth(explicit)) {\n return undefined;\n }\n\n let maxWidth = 0;\n for (let rowIndex = 0; rowIndex < sheet.rows.length; rowIndex += 1) {\n const cell = sheet.rows[rowIndex]?.cells[columnIndex];\n if (!cell) continue;\n const style = resolveCellStyle(cell.style, cell.value, resolveSheetStyleInput(sheet, rowIndex));\n const width = estimateDisplayWidth(cell.value, style, defaults);\n if (width !== undefined) {\n maxWidth = Math.max(maxWidth, width);\n }\n }\n\n if (maxWidth === 0) {\n return undefined;\n }\n\n return {\n width: Math.min(Math.max(maxWidth, 8.43), 255),\n bestFit: true,\n };\n}\n\nexport function estimateHeuristicColumnWidth(\n value: CellValue | undefined,\n style: SpreadsheetCellStyle | undefined,\n defaults?: SpreadsheetDefaults,\n): number | undefined {\n return estimateDisplayWidth(value, style, defaults);\n}\n\nexport function getSheetColumnCount(sheet: SpreadsheetSheet): number {\n let maxColumnCount = sheet.columns?.length ?? 0;\n for (const row of sheet.rows) {\n if (row.cells.length > maxColumnCount) {\n maxColumnCount = row.cells.length;\n }\n }\n return maxColumnCount;\n}\n\nexport function buildColumnLayout(\n sheet: SpreadsheetSheet,\n computedColumns: Array<ComputedColumnWidth | undefined>,\n defaults?: SpreadsheetDefaults,\n): {\n columnCount: number;\n columnWidths: number[];\n segments: ColumnSegment[];\n} {\n const columnCount = computedColumns.length;\n const columnWidths = computedColumns.map(\n (column) => column?.width ?? (defaults?.columnWidth ?? 8.43),\n );\n\n const segments: ColumnSegment[] = [];\n for (let index = 0; index < columnCount; index += 1) {\n const explicit: SpreadsheetColumn | undefined = sheet.columns?.[index];\n const computed = computedColumns[index];\n const descriptor = {\n width: explicit?.width ?? computed?.width ?? (defaults?.columnWidth ?? 8.43),\n hidden: explicit?.hidden,\n bestFit: explicit?.bestFit ?? computed?.bestFit,\n customWidth: explicit?.width !== undefined || computed?.width !== undefined,\n };\n const shouldEmitSegment = descriptor.customWidth || descriptor.hidden || descriptor.bestFit;\n if (!shouldEmitSegment) {\n continue;\n }\n\n const previous = segments[segments.length - 1];\n if (\n previous &&\n previous.end === index &&\n previous.width === descriptor.width &&\n previous.hidden === descriptor.hidden &&\n previous.bestFit === descriptor.bestFit &&\n previous.customWidth === descriptor.customWidth\n ) {\n previous.end = index + 1;\n continue;\n }\n\n segments.push({\n start: index + 1,\n end: index + 1,\n ...descriptor,\n });\n }\n\n return {\n columnCount,\n columnWidths,\n segments,\n };\n}\n\nexport function computeColumnLayout(\n sheet: SpreadsheetSheet,\n defaults?: SpreadsheetDefaults,\n): {\n columnCount: number;\n computedColumns: Array<ComputedColumnWidth | undefined>;\n columnWidths: number[];\n segments: ColumnSegment[];\n} {\n const columnCount = getSheetColumnCount(sheet);\n const computedColumns: Array<ComputedColumnWidth | undefined> = Array.from({ length: columnCount }, () => undefined);\n const explicitColumns = sheet.columns ?? [];\n const headerRowStyle = resolveCellStyle(sheet.styling?.headerRow, undefined);\n const alternateOddStyle = resolveCellStyle(sheet.styling?.alternateRows?.odd, undefined);\n const alternateEvenStyle = resolveCellStyle(sheet.styling?.alternateRows?.even, undefined);\n\n for (let rowIndex = 0; rowIndex < sheet.rows.length; rowIndex += 1) {\n const row = sheet.rows[rowIndex];\n if (!row) {\n continue;\n }\n\n const rowStyle = rowIndex === 0\n ? headerRowStyle\n : (((rowIndex + 1) % 2 === 0) ? alternateEvenStyle : alternateOddStyle);\n\n for (let columnIndex = 0; columnIndex < row.cells.length; columnIndex += 1) {\n const explicitColumn = explicitColumns[columnIndex];\n if (!columnNeedsHeuristicWidth(explicitColumn)) {\n continue;\n }\n\n const cell = row.cells[columnIndex];\n if (!cell) {\n continue;\n }\n\n const style = resolveCellStyle(cell.style, cell.value, rowStyle);\n const width = estimateDisplayWidth(cell.value, style, defaults);\n if (width === undefined) {\n continue;\n }\n\n const existing = computedColumns[columnIndex];\n if (!existing || width > existing.width) {\n computedColumns[columnIndex] = {\n width,\n bestFit: true,\n };\n }\n }\n }\n\n const layout = buildColumnLayout(sheet, computedColumns, defaults);\n\n return {\n columnCount: layout.columnCount,\n computedColumns,\n columnWidths: layout.columnWidths,\n segments: layout.segments,\n };\n}\n", "import { XML_DECLARATION } from \"../utils/xml.js\";\n\nconst WORKSHEET_SECTION_ORDER = {\n sheetPr: 1,\n dimension: 2,\n sheetViews: 3,\n sheetFormatPr: 4,\n cols: 5,\n sheetData: 6,\n autoFilter: 11,\n sheetProtection: 13,\n mergeCells: 15,\n conditionalFormatting: 17,\n dataValidations: 18,\n hyperlinks: 19,\n printOptions: 20,\n pageMargins: 21,\n pageSetup: 22,\n drawing: 23,\n legacyDrawing: 24,\n tableParts: 25,\n pivotTableParts: 26,\n extLst: 27,\n} as const;\n\nconst SHEET_DATA_POSITION = WORKSHEET_SECTION_ORDER.sheetData;\n\nexport class SheetXmlBuilder {\n private readonly sections = new Map<number, string[]>();\n\n constructor(private readonly rootAttributes: string[]) {}\n\n setSheetPr(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.sheetPr, xml);\n }\n\n setDimension(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.dimension, xml);\n }\n\n setSheetViews(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.sheetViews, xml);\n }\n\n setSheetFormatPr(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.sheetFormatPr, xml);\n }\n\n setCols(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.cols, xml);\n }\n\n setSheetData(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.sheetData, xml);\n }\n\n setAutoFilter(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.autoFilter, xml);\n }\n\n setSheetProtection(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.sheetProtection, xml);\n }\n\n setMergeCells(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.mergeCells, xml);\n }\n\n addConditionalFormatting(xml: string): void {\n this.add(WORKSHEET_SECTION_ORDER.conditionalFormatting, xml);\n }\n\n setDataValidations(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.dataValidations, xml);\n }\n\n setHyperlinks(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.hyperlinks, xml);\n }\n\n setPrintOptions(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.printOptions, xml);\n }\n\n setPageMargins(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.pageMargins, xml);\n }\n\n setPageSetup(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.pageSetup, xml);\n }\n\n setTableParts(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.tableParts, xml);\n }\n\n setPivotTableParts(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.pivotTableParts, xml);\n }\n\n setExtLst(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.extLst, xml);\n }\n\n setLegacyDrawing(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.legacyDrawing, xml);\n }\n\n setDrawing(xml: string): void {\n this.set(WORKSHEET_SECTION_ORDER.drawing, xml);\n }\n\n build(): string {\n const parts = [\n XML_DECLARATION,\n `<worksheet ${this.rootAttributes.join(\" \")}>`,\n ];\n\n for (const [, sectionParts] of [...this.sections.entries()].sort((left, right) => left[0] - right[0])) {\n parts.push(...sectionParts);\n }\n\n parts.push(\"</worksheet>\");\n return parts.join(\"\");\n }\n\n buildSheetDataEnvelope(): { prefix: string; suffix: string } {\n const prefix = [\n XML_DECLARATION,\n `<worksheet ${this.rootAttributes.join(\" \")}>`,\n ];\n const suffix: string[] = [];\n\n for (const [position, sectionParts] of [...this.sections.entries()].sort((left, right) => left[0] - right[0])) {\n if (position < SHEET_DATA_POSITION) {\n prefix.push(...sectionParts);\n continue;\n }\n if (position > SHEET_DATA_POSITION) {\n suffix.push(...sectionParts);\n }\n }\n\n prefix.push(\"<sheetData>\");\n suffix.unshift(\"</sheetData>\");\n suffix.push(\"</worksheet>\");\n\n return {\n prefix: prefix.join(\"\"),\n suffix: suffix.join(\"\"),\n };\n }\n\n private set(position: number, xml: string): void {\n if (!xml) {\n return;\n }\n this.sections.set(position, [xml]);\n }\n\n private add(position: number, xml: string): void {\n if (!xml) {\n return;\n }\n const section = this.sections.get(position) ?? [];\n section.push(xml);\n this.sections.set(position, section);\n }\n}\n", "import { escapeXml, XML_DECLARATION } from \"../utils/xml.js\";\n\nexport interface WorksheetRelationship {\n id: string;\n target: string;\n type: \"hyperlink\" | \"table\" | \"vmlDrawing\" | \"comment\" | \"drawing\" | \"pivotTable\";\n}\n\nconst RELATIONSHIP_TYPE_URIS: Record<WorksheetRelationship[\"type\"], string> = {\n hyperlink: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n table: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table\",\n vmlDrawing: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n comment: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n drawing: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n pivotTable: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable\",\n};\n\nexport function serializeWorksheetRelationships(relationships: WorksheetRelationship[]): string {\n return [\n XML_DECLARATION,\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`,\n ...relationships.map((relationship) => {\n const typeUri = RELATIONSHIP_TYPE_URIS[relationship.type];\n const targetMode = relationship.type === \"hyperlink\" ? ` TargetMode=\"External\"` : \"\";\n return `<Relationship Id=\"${relationship.id}\" Type=\"${typeUri}\" Target=\"${escapeXml(relationship.target)}\"${targetMode}/>`;\n }),\n `</Relationships>`,\n ].join(\"\");\n}\n", "import { FormulaEvaluator } from \"../formulas/evaluator.js\";\nimport type { CellValue, SpreadsheetCell, SpreadsheetDocument, SpreadsheetSheet, SpreadsheetTable, SpreadsheetTableColumn } from \"../types/spreadsheet-ast.js\";\nimport { isErrorValue, isRichTextValue } from \"../types/spreadsheet-ast.js\";\nimport { cellRef, parseRangeRef, rangeRef } from \"../utils/cell-ref.js\";\nimport { escapeXml, XML_DECLARATION } from \"../utils/xml.js\";\n\nexport interface WorksheetTableBinding {\n tableId: number;\n partName: string;\n definition: SpreadsheetTable;\n}\n\nexport interface SerializedTablePart {\n path: string;\n xml: string;\n}\n\nexport interface WorksheetSyntheticCell {\n row: number;\n col: number;\n cell: SpreadsheetCell;\n}\n\nfunction cellValueToDisplayString(value: CellValue | undefined): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (isRichTextValue(value)) {\n return value.map((run) => run.text).join(\"\");\n }\n if (isErrorValue(value)) {\n return value.error;\n }\n if (typeof value === \"boolean\") {\n return value ? \"TRUE\" : \"FALSE\";\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\n\nfunction makeUniqueTableColumnNames(names: string[]): string[] {\n const seen = new Map<string, number>();\n return names.map((rawName, index) => {\n const baseName = rawName.trim() || `Column${index + 1}`;\n const normalized = baseName.toLowerCase();\n const count = (seen.get(normalized) ?? 0) + 1;\n seen.set(normalized, count);\n return count === 1 ? baseName : `${baseName}_${count}`;\n });\n}\n\nfunction resolveTableColumnNames(\n sheet: SpreadsheetSheet,\n table: SpreadsheetTable,\n formulaEvaluator: FormulaEvaluator | null,\n): string[] {\n const range = parseRangeRef(table.ref);\n const headerRowIndex = range.startRow;\n const headerRow = sheet.rows[headerRowIndex];\n const explicitColumns = table.columns ?? [];\n const names: string[] = [];\n\n for (let offset = 0; offset <= (range.endCol - range.startCol); offset += 1) {\n const explicitName = explicitColumns[offset]?.name;\n if (explicitName) {\n names.push(explicitName);\n continue;\n }\n\n const columnIndex = range.startCol + offset;\n const cell = headerRow?.cells[columnIndex];\n const displayValue = cell?.formula\n ? (typeof cell.formula === \"string\"\n ? (formulaEvaluator?.evaluateCell(cell, sheet.name, cellRef(headerRowIndex, columnIndex)) ?? cell?.value)\n : (cell.formula.cachedValue ?? formulaEvaluator?.evaluateCell(cell, sheet.name, cellRef(headerRowIndex, columnIndex)) ?? cell?.value))\n : cell?.value;\n\n names.push(cellValueToDisplayString(displayValue));\n }\n\n return makeUniqueTableColumnNames(names);\n}\n\nfunction serializeTableColumn(column: SpreadsheetTableColumn | undefined, id: number, name: string): string {\n const attributes = [\n `id=\"${id}\"`,\n `name=\"${escapeXml(name)}\"`,\n ];\n if (column?.totalsRowLabel) {\n attributes.push(`totalsRowLabel=\"${escapeXml(column.totalsRowLabel)}\"`);\n }\n if (column?.totalsRowFunction) {\n attributes.push(`totalsRowFunction=\"${column.totalsRowFunction}\"`);\n }\n\n if (column?.totalsRowFormula) {\n return `<tableColumn ${attributes.join(\" \")}><totalsRowFormula>${escapeXml(column.totalsRowFormula)}</totalsRowFormula></tableColumn>`;\n }\n\n return `<tableColumn ${attributes.join(\" \")}/>`;\n}\n\nfunction totalsRowFunctionCode(value: SpreadsheetTableColumn[\"totalsRowFunction\"]): number | null {\n switch (value) {\n case \"average\":\n return 101;\n case \"countNums\":\n return 102;\n case \"count\":\n return 103;\n case \"max\":\n return 104;\n case \"min\":\n return 105;\n case \"stdDev\":\n return 107;\n case \"sum\":\n return 109;\n case \"var\":\n return 110;\n default:\n return null;\n }\n}\n\nfunction createTotalsRowCell(\n table: SpreadsheetTable,\n range: ReturnType<typeof parseRangeRef>,\n column: SpreadsheetTableColumn | undefined,\n columnIndex: number,\n): SpreadsheetCell {\n if (column?.totalsRowLabel) {\n return { value: column.totalsRowLabel };\n }\n\n if (column?.totalsRowFormula) {\n return {\n formula: column.totalsRowFormula.startsWith(\"=\")\n ? column.totalsRowFormula.slice(1)\n : column.totalsRowFormula,\n };\n }\n\n if (column?.totalsRowFunction) {\n const functionCode = totalsRowFunctionCode(column.totalsRowFunction);\n const dataStartRow = range.startRow + 1;\n const dataEndRow = Math.max(range.startRow + 1, range.endRow - 1);\n\n if (functionCode !== null && dataEndRow >= dataStartRow) {\n return {\n formula: `SUBTOTAL(${functionCode},${cellRef(dataStartRow, columnIndex)}:${cellRef(dataEndRow, columnIndex)})`,\n };\n }\n }\n\n if (table.totalsRow) {\n return { value: \"\" };\n }\n\n return { value: \"\" };\n}\n\nexport function buildWorksheetSyntheticTableCells(\n bindings: WorksheetTableBinding[] | undefined,\n): Map<number, WorksheetSyntheticCell[]> {\n const cellsByRow = new Map<number, WorksheetSyntheticCell[]>();\n\n for (const binding of bindings ?? []) {\n const table = binding.definition;\n if (table.totalsRow !== true) {\n continue;\n }\n\n const range = parseRangeRef(table.ref);\n const totalsRowIndex = range.endRow;\n const columns = table.columns ?? [];\n const rowCells = cellsByRow.get(totalsRowIndex) ?? [];\n\n for (let offset = 0; offset <= (range.endCol - range.startCol); offset += 1) {\n const columnIndex = range.startCol + offset;\n rowCells.push({\n row: totalsRowIndex,\n col: columnIndex,\n cell: createTotalsRowCell(table, range, columns[offset], columnIndex),\n });\n }\n\n cellsByRow.set(totalsRowIndex, rowCells);\n }\n\n return cellsByRow;\n}\n\nexport function buildWorksheetTableBindings(document: SpreadsheetDocument): WorksheetTableBinding[][] {\n let nextTableId = 1;\n return document.sheets.map((sheet) => (\n (sheet.tables ?? []).map((table) => {\n const binding = {\n tableId: nextTableId,\n partName: `table${nextTableId}.xml`,\n definition: table,\n };\n nextTableId += 1;\n return binding;\n })\n ));\n}\n\nexport function serializeTableParts(\n document: SpreadsheetDocument,\n bindingsBySheet: WorksheetTableBinding[][],\n formulaEvaluator: FormulaEvaluator | null,\n): SerializedTablePart[] {\n const parts: SerializedTablePart[] = [];\n\n document.sheets.forEach((sheet, sheetIndex) => {\n const bindings = bindingsBySheet[sheetIndex] ?? [];\n bindings.forEach((binding) => {\n const table = binding.definition;\n const range = parseRangeRef(table.ref);\n const columnNames = resolveTableColumnNames(sheet, table, formulaEvaluator);\n const columnDefinitions = table.columns ?? [];\n const totalsRow = table.totalsRow === true;\n const tableRef = rangeRef(range.startRow, range.startCol, range.endRow, range.endCol);\n const autoFilterEndRow = totalsRow && range.endRow > range.startRow\n ? range.endRow - 1\n : range.endRow;\n const autoFilterRef = rangeRef(range.startRow, range.startCol, autoFilterEndRow, range.endCol);\n const styleName = table.style?.name ?? \"TableStyleMedium2\";\n\n const xml = [\n XML_DECLARATION,\n `<table xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" id=\"${binding.tableId}\" name=\"${escapeXml(table.name)}\" displayName=\"${escapeXml(table.displayName ?? table.name)}\" ref=\"${tableRef}\" headerRowCount=\"1\"${totalsRow ? ` totalsRowCount=\"1\"` : \"\"}>`,\n `<autoFilter ref=\"${autoFilterRef}\"/>`,\n `<tableColumns count=\"${columnNames.length}\">`,\n ...columnNames.map((name, index) => serializeTableColumn(columnDefinitions[index], index + 1, name)),\n `</tableColumns>`,\n `<tableStyleInfo name=\"${escapeXml(styleName)}\" showFirstColumn=\"${table.style?.showFirstColumn ? 1 : 0}\" showLastColumn=\"${table.style?.showLastColumn ? 1 : 0}\" showRowStripes=\"${table.style?.showRowStripes ?? true ? 1 : 0}\" showColumnStripes=\"${table.style?.showColumnStripes ? 1 : 0}\"/>`,\n `</table>`,\n ].join(\"\");\n\n parts.push({\n path: `xl/tables/${binding.partName}`,\n xml,\n });\n });\n });\n\n return parts;\n}\n", "import { formatNumberForCell } from \"./xml.js\";\n\n/**\n * Excel epoch: Dec 30, 1899 in UTC.\n * This is the traditional epoch used by Excel serialization libraries.\n * With this epoch, raw = (date - epoch) / ms_per_day gives correct serials\n * for dates on or after Mar 1, 1900 (because the Lotus bug +1 is baked in).\n * For dates Jan 1 - Feb 28, 1900, the raw is off by +1 and must be corrected.\n */\nexport const EXCEL_EPOCH_UTC = Date.UTC(1899, 11, 30);\nexport const EXCEL_1904_EPOCH_UTC = Date.UTC(1904, 0, 1);\nexport const MIN_EXCEL_SUPPORTED_DATE_UTC = Date.UTC(1899, 11, 31);\nexport type ExcelDateSystem = \"1900\" | \"1904\";\n\n/**\n * The serial number boundary for the Lotus 1-2-3 leap year bug.\n * Excel treats 1900 as a leap year (it isn't). Serial 60 = Feb 29, 1900\n * (a date that never existed). Using epoch Dec 30, 1899:\n *\n * - Raw serials 1..60 correspond to Dec 31, 1899 through Feb 28, 1900,\n * but Excel expects serials 0..59 for those dates, so we subtract 1.\n * - Raw serial 61+ corresponds to Mar 1, 1900 onward, and the Lotus +1 is\n * already baked in by the epoch choice, so no adjustment needed.\n * - Raw serial <= 0 (before Dec 31, 1899) needs no adjustment.\n */\nconst LOTUS_RAW_THRESHOLD = 61;\n\nexport function isSupportedExcelDate(value: Date): boolean {\n return !Number.isNaN(value.getTime()) && value.getTime() >= MIN_EXCEL_SUPPORTED_DATE_UTC;\n}\n\nexport function assertSupportedExcelDate(value: Date): void {\n if (!isSupportedExcelDate(value)) {\n const received = Number.isNaN(value.getTime()) ? String(value) : value.toISOString();\n throw new RangeError(\n `Spreadsheet dates must be on or after 1899-12-31T00:00:00.000Z. Received ${received}.`,\n );\n }\n}\n\n/**\n * Convert a JS Date to an Excel date serial number, accounting for the\n * Lotus 1-2-3 leap year bug.\n */\nexport function dateToSerial(value: Date, dateSystem: ExcelDateSystem = \"1900\"): number {\n assertSupportedExcelDate(value);\n if (dateSystem === \"1904\") {\n return (value.getTime() - EXCEL_1904_EPOCH_UTC) / 86_400_000;\n }\n const raw = (value.getTime() - EXCEL_EPOCH_UTC) / 86_400_000;\n // Raw values 1..60 map to Excel serials 0..59 (pre-Lotus-bug dates)\n // Raw values >= 61 are already correct (Lotus bug offset baked in by epoch)\n // Raw values <= 0 need no adjustment\n if (raw >= 1 && raw < LOTUS_RAW_THRESHOLD) {\n return raw - 1;\n }\n return raw;\n}\n\n/**\n * Convert a JS Date to a string suitable for an Excel cell value element,\n * accounting for the Lotus 1-2-3 leap year bug.\n */\nexport function dateToSerialString(value: Date, dateSystem: ExcelDateSystem = \"1900\"): string {\n return formatNumberForCell(dateToSerial(value, dateSystem));\n}\n\n/**\n * Convert an Excel date serial number back to a JS Date, accounting for\n * the Lotus 1-2-3 leap year bug.\n *\n * Serial 60 (the phantom Feb 29, 1900) maps to Mar 1, 1900 since the\n * date doesn't actually exist.\n */\nexport function serialToDate(serial: number, dateSystem: ExcelDateSystem = \"1900\"): Date {\n if (dateSystem === \"1904\") {\n return new Date(EXCEL_1904_EPOCH_UTC + serial * 86_400_000);\n }\n // Reverse the forward conversion:\n // - Serial 0..59: forward subtracted 1 from raw, so raw = serial + 1\n // - Serial 60: phantom day; treat as Mar 1, 1900 (raw = 61)\n // - Serial >= 61: no adjustment was made, raw = serial\n // - Serial < 0: no adjustment, raw = serial\n let raw: number;\n if (serial >= 0 && serial < 60) {\n raw = serial + 1;\n } else if (serial === 60) {\n // Phantom Feb 29, 1900 -> map to Mar 1, 1900\n raw = 61;\n } else {\n raw = serial;\n }\n return new Date(EXCEL_EPOCH_UTC + raw * 86_400_000);\n}\n", "import type {\n SpreadsheetCell,\n SpreadsheetCellComment,\n SpreadsheetCellStyle,\n SpreadsheetColumn,\n SpreadsheetDataValidation,\n SpreadsheetDataValidationType,\n SpreadsheetDefaults,\n SpreadsheetPrintTitles,\n SpreadsheetRichTextValue,\n SpreadsheetSheet,\n SpreadsheetSheetProtection,\n} from \"../types/spreadsheet-ast.js\";\nimport { FormulaEvaluator } from \"../formulas/evaluator.js\";\nimport { isErrorValue, isRichTextValue } from \"../types/spreadsheet-ast.js\";\nimport { absRangeRef, cellRef, colIndexToLetter } from \"../utils/cell-ref.js\";\nimport { normalizeHyperlink } from \"../utils/hyperlinks.js\";\nimport { escapeXml, formatNumberForCell, needsXmlSpacePreserve, sanitizeSharedString } from \"../utils/xml.js\";\nimport { SharedStringTable } from \"./shared-strings.js\";\nimport { StyleRegistry } from \"./style-registry.js\";\nimport { normalizeFont, resolveCellStyle } from \"../styles/style-utils.js\";\nimport { serializeRichTextRunFont } from \"../styles/font-serializer.js\";\nimport { serializeConditionalFormatting } from \"../styles/conditional-formatting.js\";\nimport {\n buildColumnLayout,\n estimateDisplayLength,\n estimateHeuristicColumnWidth,\n getSheetColumnCount,\n stringifyDisplayValue,\n} from \"../layout/column-width.js\";\nimport { SheetXmlBuilder } from \"./sheet-xml-builder.js\";\nimport { serializeWorksheetRelationships } from \"./worksheet-rels-serializer.js\";\nimport { buildWorksheetSyntheticTableCells, type WorksheetSyntheticCell, type WorksheetTableBinding } from \"./table-serializer.js\";\nimport type { WorksheetPivotTableBinding } from \"./pivot-serializer.js\";\nimport { compileSheetStructure } from \"../worksheet/structure.js\";\nimport { dateToSerialString, type ExcelDateSystem } from \"../utils/date.js\";\n\nexport interface SerializeSheetOptions {\n dateSystem?: ExcelDateSystem;\n defaults?: SpreadsheetDefaults;\n formulaEvaluator: FormulaEvaluator | null;\n rowChunkSize?: number;\n sharedStrings?: SharedStringTable;\n styleRegistry: StyleRegistry;\n selected: boolean;\n sheetIndex: number;\n stringStrategy: \"sharedStrings\" | \"inlineStrings\";\n tableBindings?: WorksheetTableBinding[];\n pivotTableBindings?: WorksheetPivotTableBinding[];\n}\n\nexport interface SerializedSheetRowChunk {\n startRowNumber: number;\n endRowNumber: number;\n sourceRowCount: number;\n serializedRowCount: number;\n cellCount: number;\n byteLength: number;\n xml: string;\n}\n\nexport interface SerializedSheetArtifact {\n xml: string;\n autoFilterRef?: string;\n printArea?: string;\n printTitles?: SpreadsheetPrintTitles;\n relationships?: string;\n}\n\nexport interface SerializedSheetComment {\n ref: string;\n row: number;\n col: number;\n author?: string;\n text: string;\n}\n\nexport interface SerializedSheetChunkArtifact extends Omit<SerializedSheetArtifact, \"xml\"> {\n prefix: string;\n suffix: string;\n rowChunks: SerializedSheetRowChunk[];\n comments: SerializedSheetComment[];\n metrics: {\n totalRowsWritten: number;\n totalSerializedRows: number;\n totalCellsWritten: number;\n chunkCount: number;\n };\n}\n\nconst noRefCellOpenTagCache = new Map<string, string>();\nconst noRefCellEmptyTagCache = new Map<string, string>();\nconst noRefInlineStringOpenTagCache = new Map<string, string>();\nconst LARGE_ROW_REF_OMISSION_THRESHOLD = 512;\nconst SIMPLE_ROW_OPEN_TAG = \"<row>\";\nconst SIMPLE_ROW_CLOSE_TAG = \"</row>\";\n\ninterface CachedCellStyleBundle {\n resolvedStyle: SpreadsheetCellStyle | undefined;\n styleAttr: string;\n}\n\nfunction getNoRefCellOpenTag(styleAttr: string, typeAttr: string): string {\n const key = `${typeAttr}|${styleAttr}`;\n const cached = noRefCellOpenTagCache.get(key);\n if (cached !== undefined) {\n return cached;\n }\n const tag = `<c${typeAttr}${styleAttr}><v>`;\n noRefCellOpenTagCache.set(key, tag);\n return tag;\n}\n\nfunction getNoRefCellEmptyTag(styleAttr: string): string {\n const cached = noRefCellEmptyTagCache.get(styleAttr);\n if (cached !== undefined) {\n return cached;\n }\n const tag = `<c${styleAttr}/>`;\n noRefCellEmptyTagCache.set(styleAttr, tag);\n return tag;\n}\n\nfunction getNoRefInlineStringOpenTag(styleAttr: string): string {\n const cached = noRefInlineStringOpenTagCache.get(styleAttr);\n if (cached !== undefined) {\n return cached;\n }\n const tag = `<c t=\"inlineStr\"${styleAttr}>`;\n noRefInlineStringOpenTagCache.set(styleAttr, tag);\n return tag;\n}\n\nfunction serializeSheetPr(sheet: SpreadsheetSheet): string {\n const parts: string[] = [];\n if (sheet.tabColor) {\n parts.push(`<tabColor rgb=\"FF${sheet.tabColor.replace(/^#/, \"\").toUpperCase()}\"/>`);\n }\n if (sheet.pageSetup && (sheet.pageSetup.fitToWidth !== undefined || sheet.pageSetup.fitToHeight !== undefined)) {\n parts.push(`<pageSetUpPr fitToPage=\"1\"/>`);\n }\n\n return parts.length > 0 ? `<sheetPr>${parts.join(\"\")}</sheetPr>` : \"\";\n}\n\nfunction serializePrintOptions(sheet: SpreadsheetSheet): string {\n const options = sheet.pageSetup?.options;\n if (!options) {\n return \"\";\n }\n\n const attributes: string[] = [];\n if (options.gridLines !== undefined) {\n attributes.push(`gridLines=\"${options.gridLines ? 1 : 0}\"`);\n }\n if (options.headings !== undefined) {\n attributes.push(`headings=\"${options.headings ? 1 : 0}\"`);\n }\n\n return attributes.length > 0 ? `<printOptions ${attributes.join(\" \")}/>` : \"\";\n}\n\nfunction serializePageMargins(sheet: SpreadsheetSheet): string {\n const margins = sheet.pageSetup?.margins;\n if (!margins) {\n return \"\";\n }\n\n const attributes: string[] = [];\n if (margins.left !== undefined) attributes.push(`left=\"${margins.left}\"`);\n if (margins.right !== undefined) attributes.push(`right=\"${margins.right}\"`);\n if (margins.top !== undefined) attributes.push(`top=\"${margins.top}\"`);\n if (margins.bottom !== undefined) attributes.push(`bottom=\"${margins.bottom}\"`);\n if (margins.header !== undefined) attributes.push(`header=\"${margins.header}\"`);\n if (margins.footer !== undefined) attributes.push(`footer=\"${margins.footer}\"`);\n\n return attributes.length > 0 ? `<pageMargins ${attributes.join(\" \")}/>` : \"\";\n}\n\nfunction serializePageSetup(sheet: SpreadsheetSheet): string {\n const pageSetup = sheet.pageSetup;\n if (!pageSetup) {\n return \"\";\n }\n\n const attributes: string[] = [];\n if (pageSetup.paperSize !== undefined) attributes.push(`paperSize=\"${pageSetup.paperSize}\"`);\n if (pageSetup.orientation) attributes.push(`orientation=\"${pageSetup.orientation}\"`);\n if (pageSetup.scale !== undefined) attributes.push(`scale=\"${pageSetup.scale}\"`);\n if (pageSetup.fitToWidth !== undefined) attributes.push(`fitToWidth=\"${pageSetup.fitToWidth}\"`);\n if (pageSetup.fitToHeight !== undefined) attributes.push(`fitToHeight=\"${pageSetup.fitToHeight}\"`);\n\n return attributes.length > 0 ? `<pageSetup ${attributes.join(\" \")}/>` : \"\";\n}\n\nfunction dateToSerial(value: Date, dateSystem: ExcelDateSystem): string {\n return dateToSerialString(value, dateSystem);\n}\n\nfunction serializeRichText(\n value: SpreadsheetRichTextValue,\n cellStyle: SpreadsheetCellStyle | undefined,\n defaults: { family: string; size: number },\n): string {\n const runs = value.map((run) => {\n const font = normalizeFont({\n ...cellStyle?.font,\n ...run.font,\n }, defaults);\n const textAttrs = needsXmlSpacePreserve(run.text) ? ` xml:space=\"preserve\"` : \"\";\n return `<r>${serializeRichTextRunFont(font)}<t${textAttrs}>${escapeXml(run.text)}</t></r>`;\n }).join(\"\");\n return `<is>${runs}</is>`;\n}\n\nfunction serializeInlineString(value: string): string {\n const sanitized = sanitizeSharedString(value);\n const textAttrs = needsXmlSpacePreserve(sanitized) ? ` xml:space=\"preserve\"` : \"\";\n return `<is><t${textAttrs}>${escapeXml(sanitized)}</t></is>`;\n}\n\nfunction serializeCell(\n ref: string | undefined,\n cell: SpreadsheetCell,\n styleAttr: string,\n resolvedStyle: SpreadsheetCellStyle | undefined,\n defaults: SpreadsheetDefaults | undefined,\n sheetName: string,\n formulaEvaluator: FormulaEvaluator | null,\n sharedStrings: SharedStringTable | undefined,\n dateSystem: ExcelDateSystem,\n): string {\n const refAttr = ref ? ` r=\"${ref}\"` : \"\";\n const rawFormula = cell.formula;\n\n if (!rawFormula) {\n if (cell.value === null || cell.value === undefined) {\n if (!styleAttr) {\n return \"\";\n }\n return refAttr ? `<c${refAttr}${styleAttr}/>` : getNoRefCellEmptyTag(styleAttr);\n }\n\n if (isRichTextValue(cell.value)) {\n const defaultFont = {\n family: defaults?.font?.family ?? \"Calibri\",\n size: defaults?.font?.size ?? 11,\n };\n return `<c${refAttr} t=\"inlineStr\"${styleAttr}>${serializeRichText(cell.value, resolvedStyle, defaultFont)}</c>`;\n }\n\n if (isErrorValue(cell.value)) {\n const openTag = refAttr ? `<c${refAttr} t=\"e\"${styleAttr}><v>` : getNoRefCellOpenTag(styleAttr, ` t=\"e\"`);\n return `${openTag}${cell.value.error}</v></c>`;\n }\n\n if (typeof cell.value === \"string\") {\n if (sharedStrings) {\n const sharedIndex = sharedStrings.register(cell.value);\n const openTag = refAttr ? `<c${refAttr} t=\"s\"${styleAttr}><v>` : getNoRefCellOpenTag(styleAttr, ` t=\"s\"`);\n return `${openTag}${sharedIndex}</v></c>`;\n }\n const openTag = refAttr ? `<c${refAttr} t=\"inlineStr\"${styleAttr}>` : getNoRefInlineStringOpenTag(styleAttr);\n return `${openTag}${serializeInlineString(cell.value)}</c>`;\n }\n\n if (typeof cell.value === \"boolean\") {\n const openTag = refAttr ? `<c${refAttr} t=\"b\"${styleAttr}><v>` : getNoRefCellOpenTag(styleAttr, ` t=\"b\"`);\n return `${openTag}${cell.value ? 1 : 0}</v></c>`;\n }\n\n if (cell.value instanceof Date) {\n const openTag = refAttr ? `<c${refAttr}${styleAttr}><v>` : getNoRefCellOpenTag(styleAttr, \"\");\n return `${openTag}${dateToSerial(cell.value, dateSystem)}</v></c>`;\n }\n\n const openTag = refAttr ? `<c${refAttr}${styleAttr}><v>` : getNoRefCellOpenTag(styleAttr, \"\");\n return `${openTag}${formatNumberForCell(cell.value)}</v></c>`;\n }\n\n const formula = formulaEvaluator?.getFormulaDefinition(cell) ?? null;\n\n // When formulaEvaluator is null (free tier), store the raw formula without evaluating\n if (!formula) {\n const rawExpression = typeof rawFormula === \"string\" ? rawFormula : rawFormula.expression;\n const formulaTag = `<f>${escapeXml(rawExpression)}</f>`;\n return `<c${refAttr}${styleAttr}>${formulaTag}</c>`;\n }\n\n const cachedValue = formula.cachedValue ?? formulaEvaluator?.evaluateCell(cell, sheetName, ref ?? \"\");\n const formulaAttributes = [];\n const dynamicAttr = formula.dynamic ? ` cm=\"1\"` : \"\";\n if (formula.arrayRange) {\n formulaAttributes.push(`t=\"array\"`, `ref=\"${formula.arrayRange}\"`);\n }\n const formulaTag = formulaAttributes.length > 0\n ? `<f ${formulaAttributes.join(\" \")}>${escapeXml(formula.expression)}</f>`\n : `<f>${escapeXml(formula.expression)}</f>`;\n\n if (cachedValue === undefined || cachedValue === null) {\n return `<c${refAttr}${styleAttr}${dynamicAttr}>${formulaTag}</c>`;\n }\n\n if (isRichTextValue(cachedValue)) {\n const text = cachedValue.map((run) => run.text).join(\"\");\n return `<c${refAttr} t=\"str\"${styleAttr}${dynamicAttr}>${formulaTag}<v>${escapeXml(text)}</v></c>`;\n }\n\n if (isErrorValue(cachedValue)) {\n return `<c${refAttr} t=\"e\"${styleAttr}${dynamicAttr}>${formulaTag}<v>${cachedValue.error}</v></c>`;\n }\n\n if (typeof cachedValue === \"string\") {\n return `<c${refAttr} t=\"str\"${styleAttr}${dynamicAttr}>${formulaTag}<v>${escapeXml(cachedValue)}</v></c>`;\n }\n\n if (typeof cachedValue === \"boolean\") {\n return `<c${refAttr} t=\"b\"${styleAttr}${dynamicAttr}>${formulaTag}<v>${cachedValue ? 1 : 0}</v></c>`;\n }\n\n if (cachedValue instanceof Date) {\n return `<c${refAttr}${styleAttr}${dynamicAttr}>${formulaTag}<v>${dateToSerial(cachedValue, dateSystem)}</v></c>`;\n }\n\n return `<c${refAttr}${styleAttr}${dynamicAttr}>${formulaTag}<v>${formatNumberForCell(cachedValue)}</v></c>`;\n}\n\nfunction resolveStyleAttr(\n styleRegistry: StyleRegistry,\n resolvedStyle: SpreadsheetCellStyle | undefined,\n cache: WeakMap<SpreadsheetCellStyle, string>,\n): string {\n if (!resolvedStyle) {\n return \"\";\n }\n\n const cached = cache.get(resolvedStyle);\n if (cached !== undefined) {\n return cached;\n }\n\n const styleIndex = styleRegistry.registerResolvedStyle(resolvedStyle);\n const styleAttr = styleIndex > 0 ? ` s=\"${styleIndex}\"` : \"\";\n cache.set(resolvedStyle, styleAttr);\n return styleAttr;\n}\n\nfunction canCacheRawCellStyle(\n style: SpreadsheetCell[\"style\"],\n value: SpreadsheetCell[\"value\"],\n rowStyle: SpreadsheetCellStyle | undefined,\n): style is Record<string, unknown> & { preset?: string; numberFormat?: string } {\n return rowStyle === undefined\n && typeof style === \"object\"\n && style !== null\n && style.preset === undefined\n && !(value instanceof Date && style.numberFormat === undefined);\n}\n\nfunction resolveCellStyleBundle(\n cell: SpreadsheetCell,\n rowStyle: SpreadsheetCellStyle | undefined,\n styleRegistry: StyleRegistry,\n styleAttrCache: WeakMap<SpreadsheetCellStyle, string>,\n rawStyleCache: WeakMap<object, CachedCellStyleBundle>,\n): CachedCellStyleBundle {\n if (canCacheRawCellStyle(cell.style, cell.value, rowStyle)) {\n const cached = rawStyleCache.get(cell.style);\n if (cached !== undefined) {\n return cached;\n }\n const resolvedStyle = resolveCellStyle(cell.style, cell.value, rowStyle);\n const bundle = {\n resolvedStyle,\n styleAttr: resolveStyleAttr(styleRegistry, resolvedStyle, styleAttrCache),\n };\n rawStyleCache.set(cell.style, bundle);\n return bundle;\n }\n\n const resolvedStyle = resolveCellStyle(cell.style, cell.value, rowStyle);\n return {\n resolvedStyle,\n styleAttr: resolveStyleAttr(styleRegistry, resolvedStyle, styleAttrCache),\n };\n}\n\nfunction getDisplayValueForMetrics(\n cell: SpreadsheetCell,\n formulaEvaluator: FormulaEvaluator | null,\n sheetName: string,\n ref: string,\n): SpreadsheetCell[\"value\"] {\n if (!cell.formula || !formulaEvaluator) {\n return cell.value;\n }\n const formula = formulaEvaluator.getFormulaDefinition(cell);\n if (!formula) {\n return cell.value;\n }\n\n return formula.cachedValue ?? formulaEvaluator?.evaluateCell(cell, sheetName, ref);\n}\n\nfunction estimateWrappedCellHeight(\n cell: SpreadsheetCell,\n resolvedStyle: SpreadsheetCellStyle | undefined,\n columnWidth: number,\n defaults: SpreadsheetDefaults | undefined,\n): number | undefined {\n if (!resolvedStyle?.alignment?.wrapText) {\n return undefined;\n }\n\n const displayLength = estimateDisplayLength(cell.value, resolvedStyle);\n if (displayLength === 0) {\n return undefined;\n }\n\n const charsPerLine = Math.max(1, Math.floor((columnWidth || (defaults?.columnWidth ?? 8.43)) * 1.6));\n const rawText = typeof cell.value === \"string\"\n ? cell.value\n : (Array.isArray(cell.value) ? cell.value.map((run) => run.text).join(\"\") : \"\");\n const explicitLineCount = rawText.length > 0 ? rawText.split(/\\r\\n|\\r|\\n/).length : 1;\n const lines = Math.max(explicitLineCount, Math.ceil(displayLength / charsPerLine));\n if (lines <= 1) {\n return undefined;\n }\n const fontSize = resolvedStyle.font?.size ?? defaults?.font?.size ?? 11;\n const estimatedHeight = Math.min(lines * fontSize * 1.4, 409);\n const defaultRowHeight = defaults?.rowHeight ?? 15;\n return estimatedHeight > defaultRowHeight ? estimatedHeight : undefined;\n}\n\nfunction formatFormula(value: string | number | string[], type: SpreadsheetDataValidationType, dateSystem: ExcelDateSystem): string {\n if (Array.isArray(value)) return `\"${value.join(\",\")}\"`;\n if (typeof value === \"number\") return String(value);\n if (type === \"date\" && /^\\d{4}-\\d{2}-\\d{2}(T|$)/.test(value)) {\n return dateToSerial(new Date(value), dateSystem);\n }\n return value;\n}\n\nfunction serializeDataValidations(dataValidations: SpreadsheetDataValidation[] | undefined, dateSystem: ExcelDateSystem): string {\n if (!dataValidations || dataValidations.length === 0) {\n return \"\";\n }\n\n return `<dataValidations count=\"${dataValidations.length}\">${dataValidations.map((validation) => {\n const attributes = [\n `sqref=\"${validation.ref}\"`,\n `type=\"${validation.type}\"`,\n ];\n if (validation.operator) attributes.push(`operator=\"${validation.operator}\"`);\n attributes.push(`allowBlank=\"${validation.allowBlank === false ? 0 : 1}\"`);\n if (validation.showInputMessage !== undefined) attributes.push(`showInputMessage=\"${validation.showInputMessage ? 1 : 0}\"`);\n attributes.push(`showErrorMessage=\"${validation.showErrorMessage === false ? 0 : 1}\"`);\n if (validation.showDropDown !== undefined) attributes.push(`showDropDown=\"${validation.showDropDown ? 0 : 1}\"`);\n if (validation.errorStyle) attributes.push(`errorStyle=\"${validation.errorStyle}\"`);\n if (validation.errorTitle) attributes.push(`errorTitle=\"${escapeXml(validation.errorTitle)}\"`);\n if (validation.error) attributes.push(`error=\"${escapeXml(validation.error)}\"`);\n if (validation.promptTitle) attributes.push(`promptTitle=\"${escapeXml(validation.promptTitle)}\"`);\n if (validation.prompt) attributes.push(`prompt=\"${escapeXml(validation.prompt)}\"`);\n\n const f1 = formatFormula(validation.formula1, validation.type, dateSystem);\n const formulas = [`<formula1>${escapeXml(f1)}</formula1>`];\n if (validation.formula2 !== undefined) {\n const f2 = formatFormula(validation.formula2, validation.type, dateSystem);\n formulas.push(`<formula2>${escapeXml(f2)}</formula2>`);\n }\n\n return `<dataValidation ${attributes.join(\" \")}>${formulas.join(\"\")}</dataValidation>`;\n }).join(\"\")}</dataValidations>`;\n}\n\nfunction hashPassword(password: string): string {\n let hash = 0;\n for (let i = password.length - 1; i >= 0; i--) {\n hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7FFF);\n hash ^= password.charCodeAt(i);\n }\n hash ^= password.length;\n hash ^= 0xCE4B;\n return hash.toString(16).toUpperCase().padStart(4, \"0\");\n}\n\nfunction serializeSheetProtection(protection: SpreadsheetSheetProtection | undefined): string {\n if (!protection) {\n return \"\";\n }\n\n const attributes: string[] = [];\n\n if (protection.password) {\n attributes.push(`password=\"${hashPassword(protection.password)}\"`);\n }\n\n const sheetEnabled = protection.sheet !== false;\n attributes.push(`sheet=\"${sheetEnabled ? \"1\" : \"0\"}\"`);\n\n if (protection.objects !== undefined) {\n attributes.push(`objects=\"${protection.objects ? \"1\" : \"0\"}\"`);\n }\n if (protection.scenarios !== undefined) {\n attributes.push(`scenarios=\"${protection.scenarios ? \"1\" : \"0\"}\"`);\n }\n\n const protectedByDefault: Array<[keyof SpreadsheetSheetProtection, string]> = [\n [\"formatCells\", \"formatCells\"],\n [\"formatColumns\", \"formatColumns\"],\n [\"formatRows\", \"formatRows\"],\n [\"insertColumns\", \"insertColumns\"],\n [\"insertRows\", \"insertRows\"],\n [\"insertHyperlinks\", \"insertHyperlinks\"],\n [\"deleteColumns\", \"deleteColumns\"],\n [\"deleteRows\", \"deleteRows\"],\n [\"sort\", \"sort\"],\n [\"autoFilter\", \"autoFilter\"],\n [\"pivotTables\", \"pivotTables\"],\n ];\n\n for (const [key, attr] of protectedByDefault) {\n const value = protection[key];\n if (value !== undefined) {\n attributes.push(`${attr}=\"${value ? \"1\" : \"0\"}\"`);\n }\n }\n\n if (protection.selectLockedCells !== undefined) {\n attributes.push(`selectLockedCells=\"${protection.selectLockedCells ? \"1\" : \"0\"}\"`);\n }\n if (protection.selectUnlockedCells !== undefined) {\n attributes.push(`selectUnlockedCells=\"${protection.selectUnlockedCells ? \"1\" : \"0\"}\"`);\n }\n\n return `<sheetProtection ${attributes.join(\" \")}/>`;\n}\n\nfunction isEmptyPlaceholderCell(cell: SpreadsheetCell): boolean {\n return cell.formula === undefined\n && (cell.value === null || cell.value === undefined);\n}\n\nfunction serializesCellWithoutGap(cell: SpreadsheetCell): boolean {\n return cell.formula !== undefined\n || (cell.value !== null && cell.value !== undefined)\n || cell.style !== undefined;\n}\n\nfunction canInferCellRefFromPosition(cell: SpreadsheetCell): boolean {\n return cell.formula === undefined\n && cell.hyperlink === undefined\n && cell.comment === undefined;\n}\n\nfunction columnNeedsHeuristicWidth(column: SpreadsheetColumn | undefined): boolean {\n return column?.width === undefined && column?.bestFit === true;\n}\n\nexport function serializeSheet(sheet: SpreadsheetSheet, options: SerializeSheetOptions): SerializedSheetArtifact {\n const chunked = serializeSheetChunks(sheet, options);\n\n return {\n xml: chunked.prefix + chunked.rowChunks.map((chunk) => chunk.xml).join(\"\") + chunked.suffix,\n autoFilterRef: chunked.autoFilterRef,\n printArea: chunked.printArea,\n printTitles: chunked.printTitles,\n relationships: chunked.relationships,\n };\n}\n\nexport function serializeSheetChunks(\n sheet: SpreadsheetSheet,\n options: SerializeSheetOptions,\n): SerializedSheetChunkArtifact {\n const defaultRowHeight = String(options.defaults?.rowHeight ?? 15);\n const defaultColWidth = String(options.defaults?.columnWidth ?? 8.43);\n const rowChunkSize = Math.min(10_000, Math.max(100, options.rowChunkSize ?? 1_000));\n const sheetColumnCount = getSheetColumnCount(sheet);\n const columnLetters = Array.from({ length: sheetColumnCount }, (_unused, index) => colIndexToLetter(index));\n const tableBindings = options.tableBindings ?? [];\n const pivotTableBindings = options.pivotTableBindings ?? [];\n const dateSystem = options.dateSystem ?? \"1900\";\n const builder = new SheetXmlBuilder([\n `xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"`,\n `xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"`,\n ]);\n const structure = compileSheetStructure(sheet);\n\n const sheetViewAttributes = [`workbookViewId=\"0\"`];\n if (options.selected) {\n sheetViewAttributes.push(`tabSelected=\"1\"`);\n }\n if (sheet.rightToLeft) {\n sheetViewAttributes.push(`rightToLeft=\"1\"`);\n }\n const freezePane = sheet.freezePane;\n if ((freezePane?.row ?? 0) > 0 || (freezePane?.col ?? 0) > 0) {\n const xSplit = freezePane && freezePane.col > 0 ? ` xSplit=\"${freezePane.col}\"` : \"\";\n const ySplit = freezePane && freezePane.row > 0 ? ` ySplit=\"${freezePane.row}\"` : \"\";\n const topLeftCell = cellRef(freezePane?.row ?? 0, freezePane?.col ?? 0);\n const activePane = freezePane && freezePane.row > 0 && freezePane.col > 0\n ? \"bottomRight\"\n : (freezePane && freezePane.row > 0 ? \"bottomLeft\" : \"topRight\");\n builder.setSheetViews(\n `<sheetViews><sheetView ${sheetViewAttributes.join(\" \")}><pane${xSplit}${ySplit} topLeftCell=\"${topLeftCell}\" activePane=\"${activePane}\" state=\"frozen\"/><selection pane=\"${activePane}\" activeCell=\"${topLeftCell}\" sqref=\"${topLeftCell}\"/></sheetView></sheetViews>`,\n );\n } else {\n builder.setSheetViews(`<sheetViews><sheetView ${sheetViewAttributes.join(\" \")}/></sheetViews>`);\n }\n const sheetPr = serializeSheetPr(sheet);\n if (sheetPr) {\n builder.setSheetPr(sheetPr);\n }\n const dimensionRef = structure.maxCol >= 0 && structure.maxRow >= 0\n ? (structure.maxCol === 0 && structure.maxRow === 0\n ? cellRef(0, 0)\n : absRangeRef(0, 0, structure.maxRow, structure.maxCol).replaceAll(\"$\", \"\"))\n : \"A1\";\n builder.setDimension(`<dimension ref=\"${dimensionRef}\"/>`);\n builder.setSheetFormatPr(`<sheetFormatPr defaultRowHeight=\"${defaultRowHeight}\" defaultColWidth=\"${defaultColWidth}\"/>`);\n\n const columnCount = getSheetColumnCount(sheet);\n const computedColumns = Array.from(\n { length: columnCount },\n (_unused, index) => {\n const explicit = sheet.columns?.[index];\n return explicit?.width !== undefined\n ? { width: explicit.width, bestFit: explicit.bestFit ?? false }\n : undefined;\n },\n );\n const hyperlinkParts: string[] = [];\n const collectedComments: SerializedSheetComment[] = [];\n const worksheetRelationships: Array<{ id: string; target: string; type: \"hyperlink\" | \"table\" | \"vmlDrawing\" | \"comment\" | \"drawing\" | \"pivotTable\" }> = [];\n const styleAttrCache = new WeakMap<SpreadsheetCellStyle, string>();\n const rawCellStyleCache = new WeakMap<object, CachedCellStyleBundle>();\n const syntheticTableCellsByRow = buildWorksheetSyntheticTableCells(tableBindings);\n const syntheticRowIndices = [...syntheticTableCellsByRow.keys()];\n const maxSyntheticRowIndex = syntheticRowIndices.length > 0 ? Math.max(...syntheticRowIndices) : -1;\n const totalSourceRows = Math.max(sheet.rows.length, maxSyntheticRowIndex + 1);\n const rowChunks: SerializedSheetRowChunk[] = [];\n let chunkStartRowNumber = 0;\n let chunkEndRowNumber = 0;\n let chunkSourceRowCount = 0;\n let chunkSerializedRowCount = 0;\n let chunkCellCount = 0;\n let chunkXml = \"\";\n let totalSerializedRows = 0;\n let totalCellsWritten = 0;\n const canUseSimpleRowPath = syntheticTableCellsByRow.size === 0\n && structure.mergeRanges.length === 0\n && structure.rows.length === sheet.rows.length\n && structure.rows.every((structuredRow, rowIndex) => (\n structuredRow.row === rowIndex\n && structuredRow.cells.length === (sheet.rows[rowIndex]?.cells.length ?? 0)\n && structuredRow.cells.every((entry, columnIndex) => entry.col === columnIndex)\n ));\n\n const flushChunk = () => {\n if (chunkSourceRowCount === 0) {\n return;\n }\n\n const xml = chunkXml;\n rowChunks.push({\n startRowNumber: chunkStartRowNumber,\n endRowNumber: chunkEndRowNumber,\n sourceRowCount: chunkSourceRowCount,\n serializedRowCount: chunkSerializedRowCount,\n cellCount: chunkCellCount,\n byteLength: Buffer.byteLength(xml, \"utf8\"),\n xml,\n });\n\n chunkStartRowNumber = 0;\n chunkEndRowNumber = 0;\n chunkSourceRowCount = 0;\n chunkSerializedRowCount = 0;\n chunkCellCount = 0;\n chunkXml = \"\";\n };\n\n const positionedRowMap = canUseSimpleRowPath ? undefined : new Map(structure.rows.map((row) => [row.row, row]));\n const originRowMap = canUseSimpleRowPath ? undefined : new Map(structure.originCells.map((row) => [row.row, row]));\n const headerRowStyle = resolveCellStyle(sheet.styling?.headerRow, undefined);\n const alternateOddStyle = resolveCellStyle(sheet.styling?.alternateRows?.odd, undefined);\n const alternateEvenStyle = resolveCellStyle(sheet.styling?.alternateRows?.even, undefined);\n for (let rowIndex = 0; rowIndex < totalSourceRows; rowIndex += 1) {\n const row = sheet.rows[rowIndex] ?? { cells: [] };\n const mergedCells = canUseSimpleRowPath\n ? []\n : (() => {\n const positionedRow = positionedRowMap?.get(rowIndex) ?? { row: rowIndex, cells: [] };\n const syntheticCells = syntheticTableCellsByRow.get(rowIndex) ?? [];\n const cellMap = new Map<number, { col: number; cell: SpreadsheetCell }>(\n positionedRow.cells.map((entry) => [entry.col, entry]),\n );\n syntheticCells.forEach((entry: WorksheetSyntheticCell) => {\n const existing = cellMap.get(entry.col);\n if (!existing || isEmptyPlaceholderCell(existing.cell)) {\n cellMap.set(entry.col, {\n col: entry.col,\n cell: entry.cell,\n });\n }\n });\n return [...cellMap.values()].sort((left, right) => left.col - right.col);\n })();\n const rowNumber = rowIndex + 1;\n if (chunkSourceRowCount === 0) {\n chunkStartRowNumber = rowNumber;\n }\n chunkEndRowNumber = rowNumber;\n chunkSourceRowCount += 1;\n const rowStyle = rowIndex === 0\n ? headerRowStyle\n : ((rowNumber % 2 === 0) ? alternateEvenStyle : alternateOddStyle);\n let cellXml = \"\";\n let cellCount = 0;\n let estimatedHeight = row.height;\n let adjustedHeight = row.height !== undefined;\n const originColumns = canUseSimpleRowPath\n ? undefined\n : new Set((originRowMap?.get(rowIndex)?.cells ?? []).map((cell) => cell.col));\n const canOmitCellRefs = canUseSimpleRowPath\n && row.cells.length >= 16\n && row.cells.every((cell) => (\n serializesCellWithoutGap(cell)\n && canInferCellRefFromPosition(cell)\n ));\n if (canUseSimpleRowPath) {\n for (let col = 0; col < row.cells.length; col += 1) {\n const cell = row.cells[col]!;\n const needsColumnWidth = columnNeedsHeuristicWidth(sheet.columns?.[col]);\n const needsWrappedHeight = row.height === undefined;\n const needsRef = !canOmitCellRefs\n || cell.hyperlink !== undefined\n || cell.comment !== undefined\n || (options.formulaEvaluator !== null && cell.formula !== undefined);\n const fallbackRef = `${columnLetters[col] ?? colIndexToLetter(col)}${rowNumber}`;\n const ref = needsRef ? fallbackRef : undefined;\n const { resolvedStyle, styleAttr } = resolveCellStyleBundle(\n cell,\n rowStyle,\n options.styleRegistry,\n styleAttrCache,\n rawCellStyleCache,\n );\n const serialized = serializeCell(\n ref,\n cell,\n styleAttr,\n resolvedStyle,\n options.defaults,\n sheet.name,\n options.formulaEvaluator,\n options.sharedStrings,\n dateSystem,\n );\n if (serialized) {\n cellXml += serialized;\n cellCount += 1;\n }\n\n let displayValue: SpreadsheetCell[\"value\"] | undefined;\n if (needsColumnWidth || (needsWrappedHeight && resolvedStyle?.alignment?.wrapText)) {\n displayValue = getDisplayValueForMetrics(\n cell,\n options.formulaEvaluator,\n sheet.name,\n ref ?? fallbackRef,\n );\n }\n\n if (needsColumnWidth) {\n const heuristicWidth = estimateHeuristicColumnWidth(\n displayValue,\n resolvedStyle,\n options.defaults,\n );\n if (heuristicWidth !== undefined) {\n const existing = computedColumns[col];\n if (!existing || heuristicWidth > existing.width) {\n computedColumns[col] = {\n width: heuristicWidth,\n bestFit: true,\n };\n }\n }\n }\n\n if (cell.hyperlink) {\n const hyperlink = normalizeHyperlink(cell.hyperlink);\n const attributes = [`ref=\"${ref}\"`];\n if (hyperlink.display) {\n attributes.push(`display=\"${escapeXml(hyperlink.display)}\"`);\n }\n if (hyperlink.tooltip) {\n attributes.push(`tooltip=\"${escapeXml(hyperlink.tooltip)}\"`);\n }\n\n if (hyperlink.mode === \"internal\") {\n attributes.push(`location=\"${escapeXml(hyperlink.location)}\"`);\n } else {\n const relationshipId = `rId${worksheetRelationships.length + 1}`;\n worksheetRelationships.push({\n id: relationshipId,\n target: hyperlink.target,\n type: \"hyperlink\",\n });\n attributes.push(`r:id=\"${relationshipId}\"`);\n }\n\n hyperlinkParts.push(`<hyperlink ${attributes.join(\" \")}/>`);\n }\n\n if (cell.comment) {\n collectedComments.push({\n ref: ref!,\n row: rowIndex,\n col,\n author: cell.comment.author,\n text: cell.comment.text,\n });\n }\n\n if (needsWrappedHeight && resolvedStyle?.alignment?.wrapText) {\n const wrappedHeight = estimateWrappedCellHeight(\n { ...cell, value: displayValue },\n resolvedStyle,\n computedColumns[col]?.width ?? (options.defaults?.columnWidth ?? 8.43),\n options.defaults,\n );\n if (wrappedHeight !== undefined) {\n estimatedHeight = Math.max(estimatedHeight ?? (options.defaults?.rowHeight ?? 15), wrappedHeight);\n adjustedHeight = true;\n }\n }\n }\n } else {\n for (const { cell, col } of mergedCells) {\n let ref: string | undefined;\n const isOriginCell = originColumns?.has(col) === true;\n const needsColumnWidth = isOriginCell && columnNeedsHeuristicWidth(sheet.columns?.[col]);\n const needsWrappedHeight = row.height === undefined;\n const needsRef = !canOmitCellRefs\n || (isOriginCell && (cell.hyperlink !== undefined || cell.comment !== undefined))\n || (options.formulaEvaluator !== null && cell.formula !== undefined);\n\n const ensureRef = () => {\n if (ref === undefined) {\n ref = `${columnLetters[col] ?? colIndexToLetter(col)}${rowNumber}`;\n }\n return ref;\n };\n const { resolvedStyle, styleAttr } = resolveCellStyleBundle(\n cell,\n rowStyle,\n options.styleRegistry,\n styleAttrCache,\n rawCellStyleCache,\n );\n const serialized = serializeCell(\n needsRef ? ensureRef() : undefined,\n cell,\n styleAttr,\n resolvedStyle,\n options.defaults,\n sheet.name,\n options.formulaEvaluator,\n options.sharedStrings,\n dateSystem,\n );\n if (serialized) {\n cellXml += serialized;\n cellCount += 1;\n }\n\n let displayValue: SpreadsheetCell[\"value\"] | undefined;\n const getDisplayValue = () => {\n if (displayValue === undefined) {\n displayValue = getDisplayValueForMetrics(\n cell,\n options.formulaEvaluator,\n sheet.name,\n needsRef ? ensureRef() : `${columnLetters[col] ?? colIndexToLetter(col)}${rowNumber}`,\n );\n }\n return displayValue;\n };\n\n if (needsColumnWidth) {\n const heuristicWidth = estimateHeuristicColumnWidth(\n getDisplayValue(),\n resolvedStyle,\n options.defaults,\n );\n if (heuristicWidth !== undefined) {\n const existing = computedColumns[col];\n if (!existing || heuristicWidth > existing.width) {\n computedColumns[col] = {\n width: heuristicWidth,\n bestFit: true,\n };\n }\n }\n }\n\n if (isOriginCell && cell.hyperlink) {\n const refValue = ensureRef();\n const hyperlink = normalizeHyperlink(cell.hyperlink);\n const attributes = [`ref=\"${refValue}\"`];\n if (hyperlink.display) {\n attributes.push(`display=\"${escapeXml(hyperlink.display)}\"`);\n }\n if (hyperlink.tooltip) {\n attributes.push(`tooltip=\"${escapeXml(hyperlink.tooltip)}\"`);\n }\n\n if (hyperlink.mode === \"internal\") {\n attributes.push(`location=\"${escapeXml(hyperlink.location)}\"`);\n } else {\n const relationshipId = `rId${worksheetRelationships.length + 1}`;\n worksheetRelationships.push({\n id: relationshipId,\n target: hyperlink.target,\n type: \"hyperlink\",\n });\n attributes.push(`r:id=\"${relationshipId}\"`);\n }\n\n hyperlinkParts.push(`<hyperlink ${attributes.join(\" \")}/>`);\n }\n\n if (isOriginCell && cell.comment) {\n collectedComments.push({\n ref: ensureRef(),\n row: rowIndex,\n col,\n author: cell.comment.author,\n text: cell.comment.text,\n });\n }\n\n if (needsWrappedHeight && resolvedStyle?.alignment?.wrapText) {\n const wrappedHeight = estimateWrappedCellHeight(\n { ...cell, value: getDisplayValue() },\n resolvedStyle,\n computedColumns[col]?.width ?? (options.defaults?.columnWidth ?? 8.43),\n options.defaults,\n );\n if (wrappedHeight !== undefined) {\n estimatedHeight = Math.max(estimatedHeight ?? (options.defaults?.rowHeight ?? 15), wrappedHeight);\n adjustedHeight = true;\n }\n }\n }\n }\n\n const shouldSerializeRow = cellCount > 0 || row.hidden || estimatedHeight !== undefined;\n if (!shouldSerializeRow) {\n continue;\n }\n\n const canOmitRowRef = canOmitCellRefs\n && totalSourceRows >= LARGE_ROW_REF_OMISSION_THRESHOLD\n && !adjustedHeight\n && !row.hidden;\n if (canOmitRowRef) {\n chunkXml += `${SIMPLE_ROW_OPEN_TAG}${cellXml}${SIMPLE_ROW_CLOSE_TAG}`;\n } else if (!adjustedHeight && !row.hidden) {\n chunkXml += `<row r=\"${rowNumber}\">${cellXml}</row>`;\n } else {\n const rowAttributes = [`r=\"${rowNumber}\"`];\n if (estimatedHeight !== undefined && adjustedHeight) {\n rowAttributes.push(`ht=\"${estimatedHeight}\"`, `customHeight=\"1\"`);\n }\n if (row.hidden) {\n rowAttributes.push(`hidden=\"1\"`);\n }\n chunkXml += `<row ${rowAttributes.join(\" \")}>${cellXml}</row>`;\n }\n chunkSerializedRowCount += 1;\n totalSerializedRows += 1;\n chunkCellCount += cellCount;\n totalCellsWritten += cellCount;\n\n if (chunkSourceRowCount >= rowChunkSize) {\n flushChunk();\n }\n }\n flushChunk();\n\n const columnLayout = buildColumnLayout(sheet, computedColumns, options.defaults);\n if (columnLayout.segments.length > 0) {\n builder.setCols(`<cols>${columnLayout.segments.map((segment) => {\n const attributes = [`min=\"${segment.start}\"`, `max=\"${segment.end}\"`, `width=\"${segment.width}\"`];\n if (segment.customWidth) attributes.push(`customWidth=\"1\"`);\n if (segment.hidden) attributes.push(`hidden=\"1\"`);\n if (segment.bestFit) attributes.push(`bestFit=\"1\"`);\n return `<col ${attributes.join(\" \")}/>`;\n }).join(\"\")}</cols>`);\n }\n\n if (structure.autoFilterRef) {\n builder.setAutoFilter(`<autoFilter ref=\"${structure.autoFilterRef}\"/>`);\n }\n const sheetProtectionXml = serializeSheetProtection(sheet.protection);\n if (sheetProtectionXml) {\n builder.setSheetProtection(sheetProtectionXml);\n }\n if (structure.mergeRanges.length > 0) {\n builder.setMergeCells(\n `<mergeCells count=\"${structure.mergeRanges.length}\">${structure.mergeRanges.map((merge) => `<mergeCell ref=\"${merge.ref}\"/>`).join(\"\")}</mergeCells>`,\n );\n }\n const conditionalFormatting = serializeConditionalFormatting(sheet.conditionalFormatting, options.styleRegistry);\n if (conditionalFormatting.xml) {\n builder.addConditionalFormatting(conditionalFormatting.xml);\n }\n if (conditionalFormatting.extLst) {\n builder.setExtLst(conditionalFormatting.extLst);\n }\n const dataValidations = serializeDataValidations(sheet.dataValidations, dateSystem);\n if (dataValidations) {\n builder.setDataValidations(dataValidations);\n }\n if (hyperlinkParts.length > 0) {\n builder.setHyperlinks(`<hyperlinks>${hyperlinkParts.join(\"\")}</hyperlinks>`);\n }\n const printOptions = serializePrintOptions(sheet);\n if (printOptions) {\n builder.setPrintOptions(printOptions);\n }\n const pageMargins = serializePageMargins(sheet);\n if (pageMargins) {\n builder.setPageMargins(pageMargins);\n }\n const pageSetup = serializePageSetup(sheet);\n if (pageSetup) {\n builder.setPageSetup(pageSetup);\n }\n if (tableBindings.length > 0) {\n const tableParts = tableBindings.map((binding) => {\n const relationshipId = `rId${worksheetRelationships.length + 1}`;\n worksheetRelationships.push({\n id: relationshipId,\n target: `../tables/${binding.partName}`,\n type: \"table\",\n });\n return `<tablePart r:id=\"${relationshipId}\"/>`;\n });\n builder.setTableParts(`<tableParts count=\"${tableParts.length}\">${tableParts.join(\"\")}</tableParts>`);\n }\n if (pivotTableBindings.length > 0) {\n pivotTableBindings.forEach((binding) => {\n const relationshipId = `rId${worksheetRelationships.length + 1}`;\n worksheetRelationships.push({\n id: relationshipId,\n target: `../pivotTables/${binding.partName}`,\n type: \"pivotTable\",\n });\n });\n }\n if (collectedComments.length > 0) {\n const sheetNumber = options.sheetIndex + 1;\n const commentRelId = `rId${worksheetRelationships.length + 1}`;\n worksheetRelationships.push({\n id: commentRelId,\n target: `../comments${sheetNumber}.xml`,\n type: \"comment\",\n });\n const vmlRelId = `rId${worksheetRelationships.length + 1}`;\n worksheetRelationships.push({\n id: vmlRelId,\n target: `../drawings/vmlDrawing${sheetNumber}.vml`,\n type: \"vmlDrawing\",\n });\n builder.setLegacyDrawing(`<legacyDrawing r:id=\"${vmlRelId}\"/>`);\n }\n const hasImages = sheet.images && sheet.images.length > 0;\n const hasCharts = sheet.charts && sheet.charts.length > 0;\n if (hasImages || hasCharts) {\n const drawingRelId = `rId${worksheetRelationships.length + 1}`;\n const sheetNumber = options.sheetIndex + 1;\n worksheetRelationships.push({\n id: drawingRelId,\n target: `../drawings/drawing${sheetNumber}.xml`,\n type: \"drawing\",\n });\n builder.setDrawing(`<drawing r:id=\"${drawingRelId}\"/>`);\n }\n const envelope = builder.buildSheetDataEnvelope();\n\n return {\n prefix: envelope.prefix,\n suffix: envelope.suffix,\n rowChunks,\n comments: collectedComments,\n metrics: {\n totalRowsWritten: totalSourceRows,\n totalSerializedRows,\n totalCellsWritten,\n chunkCount: rowChunks.length,\n },\n autoFilterRef: structure.autoFilterRef,\n printArea: sheet.pageSetup?.printArea,\n printTitles: sheet.pageSetup?.printTitles,\n relationships: worksheetRelationships.length > 0\n ? serializeWorksheetRelationships(worksheetRelationships)\n : undefined,\n };\n}\n", "function stableNormalize(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => stableNormalize(entry));\n }\n\n if (value && typeof value === \"object\" && !(value instanceof Date)) {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n return Object.fromEntries(entries.map(([key, entry]) => [key, stableNormalize(entry)]));\n }\n\n return value;\n}\n\nexport function stableStringify<T>(value: T): string {\n return JSON.stringify(stableNormalize(value));\n}\n\nexport type ComponentKeyFn<T> = (value: T) => string;\n\nexport class ComponentRegistry<T> {\n private readonly entries: T[] = [];\n private readonly keyMap = new Map<string, number>();\n private readonly refMap = new WeakMap<object, number>();\n\n constructor(\n seedEntries: T[] = [],\n private readonly keyFn: ComponentKeyFn<T> = stableStringify,\n ) {\n for (const entry of seedEntries) {\n this.register(entry);\n }\n }\n\n register(entry: T): number {\n if (entry && typeof entry === \"object\") {\n const cached = this.refMap.get(entry as object);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n const key = this.keyFn(entry);\n const existing = this.keyMap.get(key);\n if (existing !== undefined) {\n if (entry && typeof entry === \"object\") {\n this.refMap.set(entry as object, existing);\n }\n return existing;\n }\n const index = this.entries.length;\n this.entries.push(entry);\n this.keyMap.set(key, index);\n if (entry && typeof entry === \"object\") {\n this.refMap.set(entry as object, index);\n }\n return index;\n }\n\n get size(): number {\n return this.entries.length;\n }\n\n get values(): readonly T[] {\n return this.entries;\n }\n}\n", "import type { SpreadsheetFillStyle } from \"../types/spreadsheet-ast.js\";\nimport { serializeColorAttributes } from \"./color.js\";\n\nexport interface FillDef extends SpreadsheetFillStyle {\n type: \"solid\" | \"pattern\";\n}\n\nexport const NONE_FILL: FillDef = { type: \"pattern\", patternType: \"none\" };\nexport const GRAY125_FILL: FillDef = { type: \"pattern\", patternType: \"gray125\" };\n\nexport function serializeFill(fill: FillDef): string {\n if (fill.patternType === \"none\" || fill.patternType === \"gray125\") {\n return `<fill><patternFill patternType=\"${fill.patternType}\"/></fill>`;\n }\n\n const patternType = fill.patternType ?? (fill.type === \"pattern\" ? \"darkGray\" : \"solid\");\n const parts: string[] = [`<fill><patternFill patternType=\"${patternType}\">`];\n if (fill.fgColor) {\n parts.push(`<fgColor ${serializeColorAttributes(fill.fgColor)}/>`);\n }\n if (fill.type !== \"solid\" && fill.bgColor) {\n parts.push(`<bgColor ${serializeColorAttributes(fill.bgColor)}/>`);\n }\n parts.push(\"</patternFill></fill>\");\n return parts.join(\"\");\n}\n\nexport function serializeDxfFill(fill: FillDef | undefined): string {\n if (!fill?.fgColor && !fill?.bgColor) {\n return \"\";\n }\n\n const color = fill.bgColor ?? fill.fgColor;\n if (!color) {\n return \"\";\n }\n\n return `<fill><patternFill><bgColor ${serializeColorAttributes(color)}/></patternFill></fill>`;\n}\n", "import type { SpreadsheetBorderEdge, SpreadsheetBorderStyle } from \"../types/spreadsheet-ast.js\";\nimport { serializeColorAttributes } from \"./color.js\";\n\nexport type BorderDef = SpreadsheetBorderStyle;\n\nexport const EMPTY_BORDER: BorderDef = {};\n\nfunction serializeEdge(name: \"left\" | \"right\" | \"top\" | \"bottom\" | \"diagonal\", edge: SpreadsheetBorderEdge | undefined): string {\n if (!edge) {\n return \"\";\n }\n const parts = [`<${name} style=\"${edge.style}\">`];\n if (edge.color) {\n parts.push(`<color ${serializeColorAttributes(edge.color)}/>`);\n }\n parts.push(`</${name}>`);\n return parts.join(\"\");\n}\n\nexport function serializeBorder(border: BorderDef): string {\n const diagonalUp = border.diagonal?.direction === \"up\" || border.diagonal?.direction === \"both\" ? ` diagonalUp=\"1\"` : \"\";\n const diagonalDown = border.diagonal?.direction === \"down\" || border.diagonal?.direction === \"both\" ? ` diagonalDown=\"1\"` : \"\";\n const left = serializeEdge(\"left\", border.left);\n const right = serializeEdge(\"right\", border.right);\n const top = serializeEdge(\"top\", border.top);\n const bottom = serializeEdge(\"bottom\", border.bottom);\n const diagonal = serializeEdge(\"diagonal\", border.diagonal);\n if (!diagonalUp && !diagonalDown && !left && !right && !top && !bottom && !diagonal) {\n return \"<border/>\";\n }\n return [\n `<border${diagonalUp}${diagonalDown}>`,\n left,\n right,\n top,\n bottom,\n diagonal,\n `</border>`,\n ].join(\"\");\n}\n\nexport function serializeDxfBorder(border: BorderDef | undefined): string {\n if (!border) {\n return \"\";\n }\n return serializeBorder(border);\n}\n", "import { escapeXml } from \"../utils/xml.js\";\n\nconst BUILT_IN_FORMATS = new Map<string, number>([\n [\"General\", 0],\n [\"0\", 1],\n [\"0.00\", 2],\n [\"#,##0\", 3],\n [\"#,##0.00\", 4],\n [\"0%\", 9],\n [\"0.00%\", 10],\n [\"0.00E+00\", 11],\n [\"# ?/?\", 12],\n [\"# ??/??\", 13],\n [\"mm-dd-yy\", 14],\n [\"d-mmm-yy\", 15],\n [\"d-mmm\", 16],\n [\"mmm-yy\", 17],\n [\"h:mm AM/PM\", 18],\n [\"h:mm:ss AM/PM\", 19],\n [\"h:mm\", 20],\n [\"h:mm:ss\", 21],\n [\"m/d/yy h:mm\", 22],\n [\"#,##0 ;(#,##0)\", 37],\n [\"#,##0 ;[Red](#,##0)\", 38],\n [\"#,##0.00;(#,##0.00)\", 39],\n [\"#,##0.00;[Red](#,##0.00)\", 40],\n [\"mm:ss\", 45],\n [\"[h]:mm:ss\", 46],\n [\"mmss.0\", 47],\n [\"##0.0E+0\", 48],\n [\"@\", 49],\n]);\n\nexport class NumFmtRegistry {\n private readonly customFormats = new Map<string, number>();\n private nextCustomId = 164;\n\n register(formatCode: string | undefined): number {\n if (!formatCode) {\n return 0;\n }\n const builtIn = BUILT_IN_FORMATS.get(formatCode);\n if (builtIn !== undefined) {\n return builtIn;\n }\n const existing = this.customFormats.get(formatCode);\n if (existing !== undefined) {\n return existing;\n }\n const id = this.nextCustomId;\n this.customFormats.set(formatCode, id);\n this.nextCustomId += 1;\n return id;\n }\n\n toXml(): string {\n if (this.customFormats.size === 0) {\n return \"\";\n }\n const parts = [`<numFmts count=\"${this.customFormats.size}\">`];\n for (const [formatCode, id] of this.customFormats) {\n parts.push(`<numFmt numFmtId=\"${id}\" formatCode=\"${escapeXml(formatCode)}\"/>`);\n }\n parts.push(`</numFmts>`);\n return parts.join(\"\");\n }\n}\n", "import { XML_DECLARATION } from \"../utils/xml.js\";\nimport type {\n CellValue,\n SpreadsheetCellStyle,\n SpreadsheetCellStyleInput,\n SpreadsheetDefaults,\n} from \"../types/spreadsheet-ast.js\";\nimport { ComponentRegistry } from \"./component-registry.js\";\nimport type { FontDef } from \"./font-serializer.js\";\nimport { serializeFont } from \"./font-serializer.js\";\nimport type { FillDef } from \"./fill-serializer.js\";\nimport { GRAY125_FILL, NONE_FILL, serializeDxfFill, serializeFill } from \"./fill-serializer.js\";\nimport type { BorderDef } from \"./border-serializer.js\";\nimport { EMPTY_BORDER, serializeBorder, serializeDxfBorder } from \"./border-serializer.js\";\nimport { NumFmtRegistry } from \"./numfmt-registry.js\";\nimport { normalizeFill, resolveCellStyle } from \"./style-utils.js\";\nimport { escapeXml } from \"../utils/xml.js\";\n\ninterface CellXfDef {\n numFmtId: number;\n fontId: number;\n fillId: number;\n borderId: number;\n xfId: number;\n alignment?: SpreadsheetCellStyle[\"alignment\"];\n protection?: SpreadsheetCellStyle[\"protection\"];\n}\n\nfunction fontKey(font: FontDef): string {\n return [\n font.family,\n font.size,\n font.bold ? 1 : 0,\n font.italic ? 1 : 0,\n font.underline === true ? \"single\" : (font.underline ?? \"\"),\n font.strikethrough ? 1 : 0,\n font.color ?? \"\",\n font.vertAlign ?? \"\",\n font.charset ?? \"\",\n font.familyClassification ?? \"\",\n font.scheme ?? \"\",\n ].join(\"|\");\n}\n\nfunction fillKey(fill: FillDef): string {\n return [\n fill.type,\n fill.patternType ?? \"\",\n fill.fgColor ?? \"\",\n fill.bgColor ?? \"\",\n fill.color ?? \"\",\n ].join(\"|\");\n}\n\nfunction edgeKey(edge: BorderDef[\"top\"] | undefined): string {\n if (!edge) {\n return \"\";\n }\n return `${edge.style}:${edge.color ?? \"\"}`;\n}\n\nfunction borderKey(border: BorderDef): string {\n return [\n edgeKey(border.left),\n edgeKey(border.right),\n edgeKey(border.top),\n edgeKey(border.bottom),\n border.diagonal ? `${border.diagonal.style}:${border.diagonal.color ?? \"\"}:${border.diagonal.direction ?? \"\"}` : \"\",\n ].join(\"|\");\n}\n\nfunction alignmentKey(alignment: SpreadsheetCellStyle[\"alignment\"] | undefined): string {\n if (!alignment) {\n return \"\";\n }\n return [\n alignment.horizontal ?? \"\",\n alignment.vertical ?? \"\",\n alignment.wrapText ? 1 : 0,\n alignment.textRotation ?? \"\",\n alignment.indent ?? \"\",\n alignment.shrinkToFit ? 1 : 0,\n alignment.readingOrder ?? \"\",\n ].join(\"|\");\n}\n\nfunction protectionKey(protection: SpreadsheetCellStyle[\"protection\"] | undefined): string {\n if (!protection) {\n return \"\";\n }\n return [\n protection.locked === undefined ? \"\" : (protection.locked ? 1 : 0),\n protection.hidden === undefined ? \"\" : (protection.hidden ? 1 : 0),\n ].join(\"|\");\n}\n\nfunction cellXfKey(xf: CellXfDef): string {\n return [\n xf.numFmtId,\n xf.fontId,\n xf.fillId,\n xf.borderId,\n xf.xfId,\n alignmentKey(xf.alignment),\n protectionKey(xf.protection),\n ].join(\"|\");\n}\n\nfunction styleKey(style: SpreadsheetCellStyle): string {\n return [\n style.numberFormat ?? \"\",\n style.font ? fontKey({\n family: style.font.family ?? \"\",\n size: style.font.size ?? 0,\n bold: style.font.bold,\n italic: style.font.italic,\n underline: style.font.underline,\n strikethrough: style.font.strikethrough,\n color: style.font.color,\n vertAlign: style.font.vertAlign,\n charset: style.font.charset,\n }) : \"\",\n style.fill ? fillKey(style.fill as FillDef) : \"\",\n style.border ? borderKey(style.border) : \"\",\n alignmentKey(style.alignment),\n protectionKey(style.protection),\n ].join(\"||\");\n}\n\nconst DEFAULT_FONT_FAMILY = \"Calibri\";\nconst DEFAULT_FONT_SIZE = 11;\nconst DEFAULT_FONT: FontDef = {\n family: DEFAULT_FONT_FAMILY,\n size: DEFAULT_FONT_SIZE,\n color: \"theme:1\",\n familyClassification: 2,\n scheme: \"minor\",\n};\nconst DEFAULT_XF: CellXfDef = {\n numFmtId: 0,\n fontId: 0,\n fillId: 0,\n borderId: 0,\n xfId: 0,\n};\n\nfunction serializeAlignment(alignment: SpreadsheetCellStyle[\"alignment\"] | undefined): string {\n if (!alignment) {\n return \"\";\n }\n const attributes: string[] = [];\n if (alignment.horizontal) attributes.push(`horizontal=\"${alignment.horizontal}\"`);\n if (alignment.vertical) attributes.push(`vertical=\"${alignment.vertical}\"`);\n if (alignment.wrapText) attributes.push(`wrapText=\"1\"`);\n if (alignment.textRotation !== undefined) attributes.push(`textRotation=\"${alignment.textRotation}\"`);\n if (alignment.indent !== undefined) attributes.push(`indent=\"${alignment.indent}\"`);\n if (alignment.shrinkToFit) attributes.push(`shrinkToFit=\"1\"`);\n if (alignment.readingOrder !== undefined) attributes.push(`readingOrder=\"${alignment.readingOrder}\"`);\n return attributes.length > 0 ? `<alignment ${attributes.join(\" \")}/>` : \"\";\n}\n\nfunction serializeProtection(protection: SpreadsheetCellStyle[\"protection\"] | undefined): string {\n if (!protection) {\n return \"\";\n }\n const attributes: string[] = [];\n if (protection.locked !== undefined) attributes.push(`locked=\"${protection.locked ? 1 : 0}\"`);\n if (protection.hidden !== undefined) attributes.push(`hidden=\"${protection.hidden ? 1 : 0}\"`);\n return attributes.length > 0 ? `<protection ${attributes.join(\" \")}/>` : \"\";\n}\n\nfunction serializeCellXf(xf: CellXfDef): string {\n const attributes = [\n `numFmtId=\"${xf.numFmtId}\"`,\n `fontId=\"${xf.fontId}\"`,\n `fillId=\"${xf.fillId}\"`,\n `borderId=\"${xf.borderId}\"`,\n ];\n if (xf.xfId !== 0) {\n attributes.push(`xfId=\"${xf.xfId}\"`);\n }\n const alignment = serializeAlignment(xf.alignment);\n const protection = serializeProtection(xf.protection);\n if (!alignment && !protection) {\n return `<xf ${attributes.join(\" \")}/>`;\n }\n return `<xf ${attributes.join(\" \")}>${alignment}${protection}</xf>`;\n}\n\nfunction normalizeFont(font: SpreadsheetCellStyle[\"font\"] | undefined, defaults?: SpreadsheetDefaults): FontDef {\n return {\n family: font?.family ?? defaults?.font?.family ?? DEFAULT_FONT_FAMILY,\n size: font?.size ?? defaults?.font?.size ?? DEFAULT_FONT_SIZE,\n bold: font?.bold,\n italic: font?.italic,\n underline: font?.underline,\n strikethrough: font?.strikethrough,\n color: font?.color,\n vertAlign: font?.vertAlign,\n charset: font?.charset,\n };\n}\n\nexport class StyleRegistry {\n private readonly fontRegistry: ComponentRegistry<FontDef>;\n private readonly fillRegistry: ComponentRegistry<FillDef>;\n private readonly borderRegistry: ComponentRegistry<BorderDef>;\n private readonly numFmtRegistry = new NumFmtRegistry();\n private readonly cellXfRegistry: ComponentRegistry<CellXfDef>;\n private readonly dxfRegistry: ComponentRegistry<SpreadsheetCellStyle>;\n private readonly styleIndexCache = new WeakMap<SpreadsheetCellStyle, number>();\n private readonly dxfIndexCache = new WeakMap<SpreadsheetCellStyle, number>();\n private readonly defaultFontFamily: string;\n private readonly defaultFontSize: number;\n\n constructor(private readonly defaults?: SpreadsheetDefaults) {\n const seededDefaultFont: FontDef = {\n ...DEFAULT_FONT,\n family: defaults?.font?.family ?? DEFAULT_FONT.family,\n size: defaults?.font?.size ?? DEFAULT_FONT.size,\n };\n this.defaultFontFamily = seededDefaultFont.family;\n this.defaultFontSize = seededDefaultFont.size;\n this.fontRegistry = new ComponentRegistry([seededDefaultFont], fontKey);\n this.fillRegistry = new ComponentRegistry([NONE_FILL, GRAY125_FILL], fillKey);\n this.borderRegistry = new ComponentRegistry([EMPTY_BORDER], borderKey);\n this.cellXfRegistry = new ComponentRegistry([DEFAULT_XF], cellXfKey);\n this.dxfRegistry = new ComponentRegistry<SpreadsheetCellStyle>([], styleKey);\n }\n\n registerStyle(styleInput?: SpreadsheetCellStyleInput, cellValue?: CellValue): number {\n const style = resolveCellStyle(styleInput, cellValue);\n return this.registerResolvedStyle(style);\n }\n\n registerResolvedStyle(style: SpreadsheetCellStyle | undefined): number {\n if (!style) {\n return 0;\n }\n\n const cached = this.styleIndexCache.get(style);\n if (cached !== undefined) {\n return cached;\n }\n\n const numFmtId = this.numFmtRegistry.register(style.numberFormat);\n const fontDef = normalizeFont(style.font, this.defaults);\n const fontId = fontDef.family === this.defaultFontFamily\n && fontDef.size === this.defaultFontSize\n && !fontDef.bold\n && !fontDef.italic\n && !fontDef.underline\n && !fontDef.strikethrough\n && !fontDef.color\n && !fontDef.vertAlign\n && fontDef.charset === undefined\n ? 0\n : this.fontRegistry.register(fontDef);\n const fillDef = normalizeFill(style.fill);\n const fillId = fillDef ? this.fillRegistry.register(fillDef as FillDef) : 0;\n const borderId = style.border ? this.borderRegistry.register(style.border) : 0;\n\n const xf: CellXfDef = {\n numFmtId,\n fontId,\n fillId,\n borderId,\n xfId: 0,\n alignment: style.alignment,\n protection: style.protection,\n };\n\n const index = this.cellXfRegistry.register(xf);\n this.styleIndexCache.set(style, index);\n return index;\n }\n\n registerDxf(styleInput: SpreadsheetCellStyleInput): number {\n const style = resolveCellStyle(styleInput, undefined);\n if (!style) {\n return 0;\n }\n const cached = this.dxfIndexCache.get(style);\n if (cached !== undefined) {\n return cached;\n }\n const index = this.dxfRegistry.register(style);\n this.dxfIndexCache.set(style, index);\n return index;\n }\n\n getDefaultFont(): FontDef {\n return this.fontRegistry.values[0] ?? DEFAULT_FONT;\n }\n\n get cellStyleCount(): number {\n return this.cellXfRegistry.size;\n }\n\n get differentialStyleCount(): number {\n return this.dxfRegistry.values.length;\n }\n\n toXml(): string {\n const dxfs = this.dxfRegistry.values;\n return [\n XML_DECLARATION,\n `<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">`,\n this.numFmtRegistry.toXml(),\n `<fonts count=\"${this.fontRegistry.size}\">${this.fontRegistry.values.map((font) => serializeFont(font)).join(\"\")}</fonts>`,\n `<fills count=\"${this.fillRegistry.size}\">${this.fillRegistry.values.map((fill) => serializeFill(fill)).join(\"\")}</fills>`,\n `<borders count=\"${this.borderRegistry.size}\">${this.borderRegistry.values.map((border) => serializeBorder(border)).join(\"\")}</borders>`,\n `<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>`,\n `<cellXfs count=\"${this.cellXfRegistry.size}\">${this.cellXfRegistry.values.map((xf) => serializeCellXf(xf)).join(\"\")}</cellXfs>`,\n `<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>`,\n dxfs.length === 0\n ? `<dxfs count=\"0\"/>`\n : `<dxfs count=\"${dxfs.length}\">${dxfs.map((style) => {\n const font = style.font ? `<font>${serializeFont(normalizeFont(style.font, this.defaults)).replace(/^<font>|<\\/font>$/g, \"\")}</font>` : \"\";\n const fill = serializeDxfFill(normalizeFill(style.fill) as FillDef | undefined);\n const border = serializeDxfBorder(style.border);\n const numFmt = style.numberFormat ? `<numFmt numFmtId=\"0\" formatCode=\"${escapeXml(style.numberFormat)}\"/>` : \"\";\n const alignment = serializeAlignment(style.alignment);\n return `<dxf>${numFmt}${font}${fill}${border}${alignment}</dxf>`;\n }).join(\"\")}</dxfs>`,\n `<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>`,\n `</styleSheet>`,\n ].join(\"\");\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["dateToSerial", "openTag", "formulaTag", "resolvedStyle", "normalizeFont"]
7
+ }
@@ -0,0 +1,33 @@
1
+ import type { SpreadsheetCell, SpreadsheetSheet } from "../types/spreadsheet-ast.js";
2
+ import { type ParsedRangeRef } from "../utils/cell-ref.js";
3
+ export interface MergeRangeDescriptor {
4
+ ref: string;
5
+ bounds: ParsedRangeRef;
6
+ source: "explicit" | "span";
7
+ }
8
+ export interface PositionedCell {
9
+ row: number;
10
+ col: number;
11
+ cell: SpreadsheetCell;
12
+ }
13
+ export interface PositionedRow {
14
+ row: number;
15
+ cells: PositionedCell[];
16
+ }
17
+ export interface SheetStructureIssue {
18
+ code: "MERGE_RANGE_OVERLAP" | "MERGE_RANGE_OUT_OF_BOUNDS" | "MERGE_RANGE_CONSUMED_CELL";
19
+ message: string;
20
+ path: Array<string | number>;
21
+ }
22
+ export interface CompiledSheetStructure {
23
+ rows: PositionedRow[];
24
+ originCells: PositionedRow[];
25
+ mergeRanges: MergeRangeDescriptor[];
26
+ autoFilterRef?: string;
27
+ maxRow: number;
28
+ maxCol: number;
29
+ }
30
+ export declare function quoteSheetName(sheetName: string): string;
31
+ export declare function compileSheetStructure(sheet: SpreadsheetSheet): CompiledSheetStructure;
32
+ export declare function validateSheetStructure(sheet: SpreadsheetSheet): SheetStructureIssue[];
33
+ //# sourceMappingURL=structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../../src/worksheet/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEf,gBAAgB,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAA8B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA4CvF,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,qBAAqB,GAAG,2BAA2B,GAAG,2BAA2B,CAAC;IACxF,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKxD;AAqBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,sBAAsB,CAuHrF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAyDrF"}
@@ -0,0 +1 @@
1
+ import{a,b,c,d}from"../chunk-INDNGGXB.js";import"../chunk-WYTH4W4N.js";export{a as classifySizeEfficiencyStatus,b as loadExcelJsBenchmarkModule,d as renderPhase2BenchmarkReport,c as runPhase2BenchmarkSuite};
@@ -0,0 +1 @@
1
+ import{a,b,c}from"../chunk-MEZHQFH3.js";import"../chunk-FFIHITWB.js";import"../chunk-WYTH4W4N.js";export{c as renderPhase1BenchmarkReport,b as runCorrectnessSweep,a as runRenderBenchmark};