@opengeni/artifact-tool 0.2.2

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 (203) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +104 -0
  3. package/dist/bounded-zip.d.ts +28 -0
  4. package/dist/chunk-4BSENMAE.js +39 -0
  5. package/dist/chunk-4BSENMAE.js.map +1 -0
  6. package/dist/chunk-4FRFNNBM.js +276 -0
  7. package/dist/chunk-4FRFNNBM.js.map +1 -0
  8. package/dist/chunk-5XIA6KHZ.js +49 -0
  9. package/dist/chunk-5XIA6KHZ.js.map +1 -0
  10. package/dist/chunk-66CT2ZRP.js +2229 -0
  11. package/dist/chunk-66CT2ZRP.js.map +1 -0
  12. package/dist/chunk-72SYDU4O.js +319 -0
  13. package/dist/chunk-72SYDU4O.js.map +1 -0
  14. package/dist/chunk-B2ZJRZDA.js +279 -0
  15. package/dist/chunk-B2ZJRZDA.js.map +1 -0
  16. package/dist/chunk-DCTLTNPW.js +2458 -0
  17. package/dist/chunk-DCTLTNPW.js.map +1 -0
  18. package/dist/chunk-FGZM4FQ6.js +473 -0
  19. package/dist/chunk-FGZM4FQ6.js.map +1 -0
  20. package/dist/chunk-HTJBLBDE.js +591 -0
  21. package/dist/chunk-HTJBLBDE.js.map +1 -0
  22. package/dist/chunk-IYFXZQ34.js +5306 -0
  23. package/dist/chunk-IYFXZQ34.js.map +1 -0
  24. package/dist/chunk-J6N7IR44.js +172 -0
  25. package/dist/chunk-J6N7IR44.js.map +1 -0
  26. package/dist/chunk-N2IHNWBS.js +1002 -0
  27. package/dist/chunk-N2IHNWBS.js.map +1 -0
  28. package/dist/chunk-NAG44K67.js +549 -0
  29. package/dist/chunk-NAG44K67.js.map +1 -0
  30. package/dist/chunk-O24KTEGP.js +33 -0
  31. package/dist/chunk-O24KTEGP.js.map +1 -0
  32. package/dist/chunk-PI2AZVGK.js +2074 -0
  33. package/dist/chunk-PI2AZVGK.js.map +1 -0
  34. package/dist/chunk-Q2FFHEY7.js +40 -0
  35. package/dist/chunk-Q2FFHEY7.js.map +1 -0
  36. package/dist/chunk-RBGQADXA.js +57 -0
  37. package/dist/chunk-RBGQADXA.js.map +1 -0
  38. package/dist/chunk-U5G2BKM2.js +613 -0
  39. package/dist/chunk-U5G2BKM2.js.map +1 -0
  40. package/dist/chunk-VOJHMSM3.js +39 -0
  41. package/dist/chunk-VOJHMSM3.js.map +1 -0
  42. package/dist/chunk-VUNV25KB.js +16 -0
  43. package/dist/chunk-VUNV25KB.js.map +1 -0
  44. package/dist/chunk-XIFUNVBO.js +101 -0
  45. package/dist/chunk-XIFUNVBO.js.map +1 -0
  46. package/dist/chunk-ZCJYRJGB.js +489 -0
  47. package/dist/chunk-ZCJYRJGB.js.map +1 -0
  48. package/dist/chunk-ZZXPEE4S.js +2260 -0
  49. package/dist/chunk-ZZXPEE4S.js.map +1 -0
  50. package/dist/document-docx-api.d.ts +49 -0
  51. package/dist/document-docx-codec.d.ts +9 -0
  52. package/dist/document-docx-codec.js +4765 -0
  53. package/dist/document-docx-codec.js.map +1 -0
  54. package/dist/document-docx-import.d.ts +261 -0
  55. package/dist/document-docx-packer.d.ts +18 -0
  56. package/dist/document-docx-state.d.ts +12 -0
  57. package/dist/document-render.d.ts +3 -0
  58. package/dist/document-render.js +492 -0
  59. package/dist/document-render.js.map +1 -0
  60. package/dist/document.d.ts +432 -0
  61. package/dist/document.js +37 -0
  62. package/dist/document.js.map +1 -0
  63. package/dist/errors.d.ts +23 -0
  64. package/dist/file-blob.d.ts +11 -0
  65. package/dist/index.d.ts +4 -0
  66. package/dist/index.js +186 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/inspection.d.ts +12 -0
  69. package/dist/kernel.d.ts +101 -0
  70. package/dist/lib-GQLPACFK.js +9746 -0
  71. package/dist/lib-GQLPACFK.js.map +1 -0
  72. package/dist/materializer-cli-entry.d.ts +2 -0
  73. package/dist/materializer-cli-entry.js +29 -0
  74. package/dist/materializer-cli-entry.js.map +1 -0
  75. package/dist/materializer-cli.d.ts +24 -0
  76. package/dist/materializer-cli.js +24 -0
  77. package/dist/materializer-cli.js.map +1 -0
  78. package/dist/native-raster.d.ts +10 -0
  79. package/dist/native.d.ts +129 -0
  80. package/dist/native.js +31 -0
  81. package/dist/native.js.map +1 -0
  82. package/dist/office-import.d.ts +48 -0
  83. package/dist/office-import.js +154 -0
  84. package/dist/office-import.js.map +1 -0
  85. package/dist/presentation-pptx-api.d.ts +60 -0
  86. package/dist/presentation-pptx-import.d.ts +5 -0
  87. package/dist/presentation-pptx-state-digest-765CZZED.js +10 -0
  88. package/dist/presentation-pptx-state-digest-765CZZED.js.map +1 -0
  89. package/dist/presentation-pptx-state-digest.d.ts +3 -0
  90. package/dist/presentation-pptx-state.d.ts +4 -0
  91. package/dist/presentation-pptx-xml.d.ts +29 -0
  92. package/dist/presentation-pptx.d.ts +5 -0
  93. package/dist/presentation-pptx.js +2365 -0
  94. package/dist/presentation-pptx.js.map +1 -0
  95. package/dist/presentation-render.d.ts +29 -0
  96. package/dist/presentation-render.js +375 -0
  97. package/dist/presentation-render.js.map +1 -0
  98. package/dist/presentation.d.ts +565 -0
  99. package/dist/presentation.js +71 -0
  100. package/dist/presentation.js.map +1 -0
  101. package/dist/production-composite.d.ts +68 -0
  102. package/dist/production-document.d.ts +2 -0
  103. package/dist/production-document.js +176 -0
  104. package/dist/production-document.js.map +1 -0
  105. package/dist/production-native-codecs.d.ts +94 -0
  106. package/dist/production-presentation.d.ts +2 -0
  107. package/dist/production-presentation.js +176 -0
  108. package/dist/production-presentation.js.map +1 -0
  109. package/dist/production-sha256.d.ts +2 -0
  110. package/dist/production-spreadsheet-native.d.ts +12 -0
  111. package/dist/production-spreadsheet.d.ts +2 -0
  112. package/dist/production-spreadsheet.js +176 -0
  113. package/dist/production-spreadsheet.js.map +1 -0
  114. package/dist/production.d.ts +96 -0
  115. package/dist/raster-image.d.ts +34 -0
  116. package/dist/reference.d.ts +17 -0
  117. package/dist/reference.js +574 -0
  118. package/dist/reference.js.map +1 -0
  119. package/dist/runtime-cli-entry.d.ts +2 -0
  120. package/dist/runtime-cli-entry.js +21 -0
  121. package/dist/runtime-cli-entry.js.map +1 -0
  122. package/dist/runtime-cli.d.ts +76 -0
  123. package/dist/runtime-cli.js +26 -0
  124. package/dist/runtime-cli.js.map +1 -0
  125. package/dist/runtime-development.d.ts +73 -0
  126. package/dist/runtime-development.js +30 -0
  127. package/dist/runtime-development.js.map +1 -0
  128. package/dist/runtime-receipt.d.ts +19 -0
  129. package/dist/runtime.d.ts +355 -0
  130. package/dist/runtime.js +42 -0
  131. package/dist/runtime.js.map +1 -0
  132. package/dist/snapshot.d.ts +26 -0
  133. package/dist/snapshot.js +61 -0
  134. package/dist/snapshot.js.map +1 -0
  135. package/dist/spreadsheet-address.d.ts +18 -0
  136. package/dist/spreadsheet-file.d.ts +17 -0
  137. package/dist/spreadsheet-formula.d.ts +67 -0
  138. package/dist/spreadsheet-image.d.ts +17 -0
  139. package/dist/spreadsheet-render.d.ts +5 -0
  140. package/dist/spreadsheet-render.js +752 -0
  141. package/dist/spreadsheet-render.js.map +1 -0
  142. package/dist/spreadsheet-types.d.ts +155 -0
  143. package/dist/spreadsheet-xlsx-api.d.ts +88 -0
  144. package/dist/spreadsheet-xlsx-codec.d.ts +16 -0
  145. package/dist/spreadsheet-xlsx-codec.js +16 -0
  146. package/dist/spreadsheet-xlsx-codec.js.map +1 -0
  147. package/dist/spreadsheet-xlsx-state.d.ts +16 -0
  148. package/dist/spreadsheet.d.ts +724 -0
  149. package/dist/spreadsheet.js +67 -0
  150. package/dist/spreadsheet.js.map +1 -0
  151. package/package.json +129 -0
  152. package/src/bounded-zip.ts +450 -0
  153. package/src/document-docx-api.ts +64 -0
  154. package/src/document-docx-codec.ts +2253 -0
  155. package/src/document-docx-import.ts +3814 -0
  156. package/src/document-docx-packer.ts +72 -0
  157. package/src/document-docx-state.ts +59 -0
  158. package/src/document-render.ts +615 -0
  159. package/src/document.ts +2800 -0
  160. package/src/errors.ts +45 -0
  161. package/src/file-blob.ts +43 -0
  162. package/src/index.ts +4 -0
  163. package/src/inspection.ts +50 -0
  164. package/src/kernel.ts +525 -0
  165. package/src/materializer-cli-entry.ts +11 -0
  166. package/src/materializer-cli.ts +743 -0
  167. package/src/native-raster.ts +141 -0
  168. package/src/native.ts +390 -0
  169. package/src/office-import.ts +243 -0
  170. package/src/presentation-pptx-api.ts +107 -0
  171. package/src/presentation-pptx-import.ts +2065 -0
  172. package/src/presentation-pptx-state-digest.ts +46 -0
  173. package/src/presentation-pptx-state.ts +18 -0
  174. package/src/presentation-pptx-xml.ts +473 -0
  175. package/src/presentation-pptx.ts +447 -0
  176. package/src/presentation-render.ts +532 -0
  177. package/src/presentation.ts +2599 -0
  178. package/src/production-composite.ts +805 -0
  179. package/src/production-document.ts +2 -0
  180. package/src/production-native-codecs.ts +1141 -0
  181. package/src/production-presentation.ts +2 -0
  182. package/src/production-sha256.ts +150 -0
  183. package/src/production-spreadsheet-native.ts +686 -0
  184. package/src/production-spreadsheet.ts +2 -0
  185. package/src/production.ts +1022 -0
  186. package/src/raster-image.ts +586 -0
  187. package/src/reference.ts +17 -0
  188. package/src/runtime-cli-entry.ts +13 -0
  189. package/src/runtime-cli.ts +670 -0
  190. package/src/runtime-development.ts +689 -0
  191. package/src/runtime-receipt.ts +169 -0
  192. package/src/runtime.ts +1463 -0
  193. package/src/snapshot.ts +88 -0
  194. package/src/spreadsheet-address.ts +90 -0
  195. package/src/spreadsheet-file.ts +71 -0
  196. package/src/spreadsheet-formula.ts +1212 -0
  197. package/src/spreadsheet-image.ts +242 -0
  198. package/src/spreadsheet-render.ts +985 -0
  199. package/src/spreadsheet-types.ts +171 -0
  200. package/src/spreadsheet-xlsx-api.ts +123 -0
  201. package/src/spreadsheet-xlsx-codec.ts +3063 -0
  202. package/src/spreadsheet-xlsx-state.ts +191 -0
  203. package/src/spreadsheet.ts +5195 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spreadsheet-render.ts"],"sourcesContent":["import { FileBlob } from \"./file-blob\";\nimport { ArtifactLimitError, UnsupportedArtifactFeatureError } from \"./errors\";\nimport { formatCellAddress, parseRangeAddress, type RangeAddress } from \"./spreadsheet-address\";\nimport { spreadsheetImageSource } from \"./spreadsheet-image\";\nimport { rasterizeSvgToPng } from \"./native-raster\";\nimport type { Workbook, Worksheet } from \"./spreadsheet\";\nimport type { CellFormat, FormulaResult, RenderSpreadsheetOptions } from \"./spreadsheet-types\";\n\nconst MAX_RENDER_CELLS = 250_000;\nconst MAX_RENDER_DIMENSION = 16_384;\nconst MAX_RENDER_SPARKLINE_POINTS = 250_000;\nconst DEFAULT_BACKGROUND = \"#ffffff\";\nconst MAX_NUMBER_FORMAT_DECIMALS = 100;\nconst numberFormatters = new Map<string, Intl.NumberFormat>();\n\n/** Render the canonical workbook model without requiring Excel or LibreOffice. */\nexport async function renderWorkbook(\n workbook: Workbook,\n options: RenderSpreadsheetOptions = {},\n): Promise<FileBlob> {\n const format = options.format ?? \"png\";\n if (format !== \"png\" && format !== \"svg\") {\n throw new Error(\"Spreadsheet render format must be png or svg\");\n }\n if (format === \"png\" && (typeof process === \"undefined\" || !process.versions?.node)) {\n throw new UnsupportedArtifactFeatureError(\"render\", \"Spreadsheet PNG rasterization\", \"browser\");\n }\n const worksheet = options.sheetName\n ? workbook.worksheets.getItem(options.sheetName)\n : workbook.worksheets.getActiveWorksheet();\n const address = renderAddress(worksheet, options);\n const scale = options.scale ?? 1;\n if (!Number.isFinite(scale) || scale <= 0 || scale > 8) {\n throw new Error(\"Spreadsheet render scale must be greater than 0 and at most 8\");\n }\n\n const svg = renderSvg(workbook, worksheet, address, {\n background: options.background ?? DEFAULT_BACKGROUND,\n scale,\n });\n if (format === \"svg\") {\n return new FileBlob([svg], {\n type: \"image/svg+xml\",\n name: `${safeFileStem(worksheet.name)}.svg`,\n });\n }\n\n const rendered = await rasterizeSvgToPng(svg, {\n background: options.background ?? DEFAULT_BACKGROUND,\n });\n return FileBlob.fromBytes(rendered, {\n type: \"image/png\",\n name: `${safeFileStem(worksheet.name)}.png`,\n });\n}\n\nfunction renderAddress(worksheet: Worksheet, options: RenderSpreadsheetOptions): RangeAddress {\n if (options.range) return parseRangeAddress(options.range);\n let used = worksheet.usedRangeAddress();\n for (const chart of worksheet.charts.items) {\n if (chart.position)\n used = unionRanges(used, drawingRange(chart.position.from, chart.position.to));\n }\n for (const sparkline of worksheet.sparklineGroups.items) {\n used = unionRanges(used, sparkline.targetRange.address);\n }\n for (const image of worksheet.images.items) {\n const { from, extent } = image.config.anchor;\n const approximate = {\n row: from.row,\n col: from.col,\n rowCount: Math.max(1, Math.ceil(extent.heightPx / worksheet.rowHeight(from.row))),\n colCount: Math.max(1, Math.ceil(extent.widthPx / worksheet.columnWidth(from.col))),\n };\n used = unionRanges(used, approximate);\n }\n return used ?? { row: 0, col: 0, rowCount: 1, colCount: 1 };\n}\n\nfunction renderSvg(\n workbook: Workbook,\n worksheet: Worksheet,\n address: RangeAddress,\n options: { background: string; scale: number },\n): string {\n const cellCount = address.rowCount * address.colCount;\n if (cellCount > MAX_RENDER_CELLS) {\n throw new Error(\n `Spreadsheet render range has ${cellCount.toLocaleString()} cells; maximum is ${MAX_RENDER_CELLS.toLocaleString()}`,\n );\n }\n\n const columns = cumulativeSizes(address.colCount, (index) =>\n worksheet.columnWidth(address.col + index),\n );\n const rows = cumulativeSizes(address.rowCount, (index) =>\n worksheet.rowHeight(address.row + index),\n );\n const logicalWidth = columns.at(-1) ?? 0;\n const logicalHeight = rows.at(-1) ?? 0;\n const width = logicalWidth * options.scale;\n const height = logicalHeight * options.scale;\n if (width > MAX_RENDER_DIMENSION || height > MAX_RENDER_DIMENSION) {\n throw new Error(\n `Spreadsheet render is ${Math.ceil(width)}x${Math.ceil(height)}px; each dimension must be at most ${MAX_RENDER_DIMENSION}px`,\n );\n }\n\n const definitions: string[] = [];\n const elements: string[] = [];\n elements.push(\n `<rect x=\"0\" y=\"0\" width=\"${number(width)}\" height=\"${number(height)}\" fill=\"${escapeAttribute(normalizeColor(options.background, DEFAULT_BACKGROUND))}\"/>`,\n );\n elements.push(`<g transform=\"scale(${number(options.scale)})\">`);\n\n if (worksheet.showGridLines) {\n const grid = gridPath(columns, rows);\n if (grid) {\n elements.push(\n `<path d=\"${grid}\" fill=\"none\" stroke=\"#d9dde3\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\" shape-rendering=\"crispEdges\"/>`,\n );\n }\n }\n\n const merges = worksheet.mergeRegions().filter((merge) => rangesOverlap(merge, address));\n const entries = [...worksheet.cellEntries()]\n .filter(({ row, col }) => contains(address, row, col))\n .sort((a, b) => a.row - b.row || a.col - b.col);\n const mergeIndexByCell = indexMerges(merges, address);\n const storedCellIndexes = new Set(\n entries.map(({ row, col }) => cellIndexInRange(address, row, col)),\n );\n\n for (const { row, col, data } of entries) {\n const mergeIndex = mergeIndexByCell[cellIndexInRange(address, row, col)] ?? -1;\n const merge = mergeIndex < 0 ? undefined : merges[mergeIndex];\n if (merge && (merge.row !== row || merge.col !== col)) continue;\n const bounds = cellBounds(\n merge ? intersect(merge, address) : { row, col, rowCount: 1, colCount: 1 },\n address,\n columns,\n rows,\n );\n if (!bounds) continue;\n renderCell(\n elements,\n definitions,\n bounds,\n data.format,\n workbook.valueAt(worksheet, { row, col }),\n `cell-${row}-${col}`,\n options.background,\n );\n }\n\n // A merge can exist without a stored top-left cell. Paint it over internal gridlines.\n for (const merge of merges) {\n const topLeftIndex = cellIndexInRange(address, merge.row, merge.col);\n if (topLeftIndex >= 0 && storedCellIndexes.has(topLeftIndex)) continue;\n const bounds = cellBounds(intersect(merge, address), address, columns, rows);\n if (!bounds) continue;\n elements.push(\n `<rect x=\"${number(bounds.x)}\" y=\"${number(bounds.y)}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" fill=\"${escapeAttribute(normalizeColor(options.background, DEFAULT_BACKGROUND))}\" stroke=\"#d9dde3\"/>`,\n );\n }\n\n renderSparklines(elements, worksheet, address, columns, rows);\n renderDrawings(elements, worksheet, address, columns, rows);\n\n elements.push(\"</g>\");\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${number(width)}\" height=\"${number(height)}\" viewBox=\"0 0 ${number(width)} ${number(height)}\">`,\n definitions.length > 0 ? `<defs>${definitions.join(\"\")}</defs>` : \"\",\n ...elements,\n \"</svg>\",\n ].join(\"\");\n}\n\n/**\n * Merges are non-overlapping canonical model objects. Index only their visible\n * intersections, whose aggregate area cannot exceed the already-bounded render\n * range. This keeps lookup linear in visible cells instead of cells × merges.\n */\nfunction indexMerges(merges: readonly RangeAddress[], viewport: RangeAddress): Int32Array {\n const indexes = new Int32Array(viewport.rowCount * viewport.colCount);\n indexes.fill(-1);\n for (let mergeIndex = 0; mergeIndex < merges.length; mergeIndex += 1) {\n const visible = intersect(merges[mergeIndex]!, viewport);\n const firstColumn = visible.col - viewport.col;\n for (let row = visible.row; row < visible.row + visible.rowCount; row += 1) {\n const start = (row - viewport.row) * viewport.colCount + firstColumn;\n indexes.fill(mergeIndex, start, start + visible.colCount);\n }\n }\n return indexes;\n}\n\nfunction cellIndexInRange(range: RangeAddress, row: number, col: number): number {\n if (!contains(range, row, col)) return -1;\n return (row - range.row) * range.colCount + col - range.col;\n}\n\ntype Bounds = { x: number; y: number; width: number; height: number };\n\nfunction renderCell(\n elements: string[],\n definitions: string[],\n bounds: Bounds,\n format: CellFormat,\n value: FormulaResult,\n id: string,\n background: string,\n): void {\n const fill = normalizeColor(format.fill, background);\n const border = borderMarkup(bounds, format);\n if (format.fill || border) {\n elements.push(\n `<rect x=\"${number(bounds.x)}\" y=\"${number(bounds.y)}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" fill=\"${escapeAttribute(fill)}\"/>`,\n );\n }\n if (border) elements.push(border);\n\n const text = displayValue(value, format.numberFormat);\n if (!text) return;\n const fontSize = clamp(format.font?.size ?? 12, 6, 72);\n const padding = 6;\n const contentWidth = Math.max(1, bounds.width - padding * 2);\n const lines = format.wrapText\n ? wrapLines(text, contentWidth, fontSize)\n : [text.replaceAll(/\\r?\\n/g, \" \")];\n const lineHeight = fontSize * 1.25;\n const textHeight = lines.length * lineHeight;\n const vertical = format.verticalAlignment ?? \"center\";\n const startY =\n vertical === \"top\"\n ? bounds.y + padding + fontSize\n : vertical === \"bottom\"\n ? bounds.y + bounds.height - padding - textHeight + fontSize\n : bounds.y + (bounds.height - textHeight) / 2 + fontSize;\n const horizontal = format.horizontalAlignment ?? inferredAlignment(value);\n const anchor = horizontal === \"center\" ? \"middle\" : horizontal === \"right\" ? \"end\" : \"start\";\n const x =\n horizontal === \"center\"\n ? bounds.x + bounds.width / 2\n : horizontal === \"right\"\n ? bounds.x + bounds.width - padding\n : bounds.x + padding;\n const clipId = `clip-${id}`;\n definitions.push(\n `<clipPath id=\"${clipId}\"><rect x=\"${number(bounds.x + 1)}\" y=\"${number(bounds.y + 1)}\" width=\"${number(Math.max(0, bounds.width - 2))}\" height=\"${number(Math.max(0, bounds.height - 2))}\"/></clipPath>`,\n );\n const decoration = format.font?.underline ? ' text-decoration=\"underline\"' : \"\";\n const tspans = lines\n .map(\n (line, index) =>\n `<tspan x=\"${number(x)}\" y=\"${number(startY + index * lineHeight)}\">${escapeText(line)}</tspan>`,\n )\n .join(\"\");\n elements.push(\n `<text clip-path=\"url(#${clipId})\" text-anchor=\"${anchor}\" font-family=\"${escapeAttribute(format.font?.name ?? \"Arial, sans-serif\")}\" font-size=\"${number(fontSize)}\" font-weight=\"${format.font?.bold ? \"700\" : \"400\"}\" font-style=\"${format.font?.italic ? \"italic\" : \"normal\"}\" fill=\"${escapeAttribute(normalizeColor(format.font?.color, \"#111827\"))}\"${decoration}>${tspans}</text>`,\n );\n}\n\nfunction borderMarkup(bounds: Bounds, format: CellFormat): string {\n const borders = format.borders;\n if (!borders || borders.preset === \"none\") return \"\";\n const fallback: import(\"./spreadsheet-types\").BorderConfig | undefined =\n borders.style || borders.preset\n ? {\n ...(borders.style ? { style: borders.style } : {}),\n ...(borders.color ? { color: borders.color } : {}),\n }\n : undefined;\n const sides = {\n top:\n borders.top ??\n (borders.preset === \"all\" || borders.preset === \"outside\" ? fallback : undefined),\n right:\n borders.right ??\n (borders.preset === \"all\" || borders.preset === \"outside\" ? fallback : undefined),\n bottom:\n borders.bottom ??\n (borders.preset === \"all\" || borders.preset === \"outside\" || borders.preset === \"doubleBottom\"\n ? fallback\n : undefined),\n left:\n borders.left ??\n (borders.preset === \"all\" || borders.preset === \"outside\" ? fallback : undefined),\n };\n const commands: string[] = [];\n const lines: string[] = [];\n const append = (\n side: keyof typeof sides,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n ): void => {\n const config = sides[side];\n if (!config) return;\n const weight = clamp(config.weight ?? (config.style === \"thick\" ? 3 : 1), 0.5, 8);\n commands.push(`M${number(x1)} ${number(y1)}L${number(x2)} ${number(y2)}`);\n lines.push(\n `<path d=\"${commands.pop()}\" fill=\"none\" stroke=\"${escapeAttribute(normalizeColor(config.color, borders.color ?? \"#4b5563\"))}\" stroke-width=\"${number(weight)}\" vector-effect=\"non-scaling-stroke\"/>`,\n );\n if (config.style === \"double\" || (side === \"bottom\" && borders.preset === \"doubleBottom\")) {\n const offset = 3;\n const vertical = x1 === x2;\n lines.push(\n `<path d=\"M${number(x1 + (vertical ? offset : 0))} ${number(y1 + (vertical ? 0 : -offset))}L${number(x2 + (vertical ? offset : 0))} ${number(y2 + (vertical ? 0 : -offset))}\" fill=\"none\" stroke=\"${escapeAttribute(normalizeColor(config.color, borders.color ?? \"#4b5563\"))}\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`,\n );\n }\n };\n append(\"top\", bounds.x, bounds.y, bounds.x + bounds.width, bounds.y);\n append(\n \"right\",\n bounds.x + bounds.width,\n bounds.y,\n bounds.x + bounds.width,\n bounds.y + bounds.height,\n );\n append(\n \"bottom\",\n bounds.x,\n bounds.y + bounds.height,\n bounds.x + bounds.width,\n bounds.y + bounds.height,\n );\n append(\"left\", bounds.x, bounds.y, bounds.x, bounds.y + bounds.height);\n return lines.join(\"\");\n}\n\nfunction gridPath(columns: readonly number[], rows: readonly number[]): string {\n const width = columns.at(-1) ?? 0;\n const height = rows.at(-1) ?? 0;\n const commands: string[] = [];\n for (const x of columns) commands.push(`M${number(x)} 0V${number(height)}`);\n for (const y of rows) commands.push(`M0 ${number(y)}H${number(width)}`);\n return commands.join(\"\");\n}\n\nfunction cumulativeSizes(count: number, sizeAt: (index: number) => number): number[] {\n const values = new Array<number>(count + 1);\n values[0] = 0;\n for (let index = 0; index < count; index += 1) {\n values[index + 1] = values[index]! + clamp(sizeAt(index), 1, MAX_RENDER_DIMENSION);\n }\n return values;\n}\n\nfunction cellBounds(\n cell: RangeAddress,\n viewport: RangeAddress,\n columns: readonly number[],\n rows: readonly number[],\n): Bounds | null {\n const relativeCol = cell.col - viewport.col;\n const relativeRow = cell.row - viewport.row;\n const endCol = relativeCol + cell.colCount;\n const endRow = relativeRow + cell.rowCount;\n const x = columns[relativeCol];\n const y = rows[relativeRow];\n const endX = columns[endCol];\n const endY = rows[endRow];\n if (x === undefined || y === undefined || endX === undefined || endY === undefined) return null;\n return { x, y, width: endX - x, height: endY - y };\n}\n\nfunction displayValue(value: FormulaResult, numberFormat?: string): string {\n if (value === null) return \"\";\n if (value instanceof Date) {\n if (numberFormat?.includes(\"h\") || numberFormat?.includes(\"s\")) return value.toISOString();\n return value.toISOString().slice(0, 10);\n }\n if (typeof value === \"number\") {\n const decimals = decimalPlaces(numberFormat);\n const useGrouping = numberFormat?.includes(\",\") ?? false;\n const formatted = (numericValue: number): string =>\n formatNumber(numericValue, decimals, useGrouping);\n if (numberFormat?.includes(\"%\")) return `${formatted(value * 100)}%`;\n if (numberFormat?.includes(\"$\")) return `$${formatted(value)}`;\n if (numberFormat?.includes(\"€\")) return `€${formatted(value)}`;\n if (numberFormat?.includes(\"£\")) return `£${formatted(value)}`;\n return formatted(value);\n }\n return String(value);\n}\n\nfunction formatNumber(value: number, decimals?: number, useGrouping = false): string {\n if (!Number.isFinite(value)) return String(value);\n const normalizedDecimals =\n decimals === undefined\n ? undefined\n : Math.max(0, Math.min(MAX_NUMBER_FORMAT_DECIMALS, Math.floor(decimals)));\n const key = `${normalizedDecimals ?? \"auto\"}:${useGrouping ? 1 : 0}`;\n let formatter = numberFormatters.get(key);\n if (!formatter) {\n formatter = new Intl.NumberFormat(\"en-US\", {\n ...(normalizedDecimals === undefined\n ? { maximumFractionDigits: 12 }\n : {\n minimumFractionDigits: normalizedDecimals,\n maximumFractionDigits: normalizedDecimals,\n }),\n useGrouping,\n });\n numberFormatters.set(key, formatter);\n }\n return formatter.format(value);\n}\n\nfunction decimalPlaces(numberFormat: string | undefined): number | undefined {\n if (!numberFormat) return undefined;\n const decimal = /\\.([0#]+)/.exec(numberFormat);\n if (!decimal) return 0;\n return decimal[1]?.length ?? 0;\n}\n\nfunction renderDrawings(\n elements: string[],\n worksheet: Worksheet,\n viewport: RangeAddress,\n columns: readonly number[],\n rows: readonly number[],\n): void {\n for (const image of worksheet.images.items) {\n const { from, extent } = image.config.anchor;\n if (!contains(viewport, from.row, from.col)) continue;\n const x = columns[from.col - viewport.col];\n const y = rows[from.row - viewport.row];\n if (x === undefined || y === undefined) continue;\n const source = spreadsheetImageSource(image.config);\n elements.push(\n `<image x=\"${number(x)}\" y=\"${number(y)}\" width=\"${number(extent.widthPx)}\" height=\"${number(extent.heightPx)}\" href=\"${escapeAttribute(source)}\" preserveAspectRatio=\"xMidYMid meet\">${image.config.alt ? `<title>${escapeText(image.config.alt)}</title>` : \"\"}</image>`,\n );\n }\n\n for (const chart of worksheet.charts.items) {\n if (!chart.position) continue;\n const range = drawingRange(chart.position.from, chart.position.to);\n if (!rangesOverlap(range, viewport)) continue;\n const visible = intersect(range, viewport);\n const bounds = cellBounds(visible, viewport, columns, rows);\n if (!bounds || bounds.width < 40 || bounds.height < 40) continue;\n renderChart(elements, bounds, chart);\n }\n}\n\nfunction renderSparklines(\n elements: string[],\n worksheet: Worksheet,\n viewport: RangeAddress,\n columns: readonly number[],\n rows: readonly number[],\n): void {\n let renderedPoints = 0;\n for (const group of worksheet.sparklineGroups.items) {\n const visible = intersect(group.targetRange.address, viewport);\n if (visible.rowCount <= 0 || visible.colCount <= 0) continue;\n const groupPoints =\n visible.rowCount * visible.colCount * group.resourceUsage.pointsPerSparkline;\n renderedPoints += groupPoints;\n if (renderedPoints > MAX_RENDER_SPARKLINE_POINTS) {\n throw new ArtifactLimitError(\n \"spreadsheet rendered sparkline points\",\n renderedPoints,\n MAX_RENDER_SPARKLINE_POINTS,\n );\n }\n const dateAxis = group.dateAxisValues();\n const axis = group.axis;\n const markers = group.markers;\n const colors = {\n series: normalizeColor(group.seriesColor, \"#2563eb\"),\n negative: normalizeColor(group.negativeColor, \"#dc2626\"),\n axis: normalizeColor(group.axisColor, \"#64748b\"),\n markers: normalizeColor(group.markersColor, group.seriesColor ?? \"#2563eb\"),\n first: normalizeColor(group.firstMarkerColor, group.seriesColor ?? \"#2563eb\"),\n last: normalizeColor(group.lastMarkerColor, group.seriesColor ?? \"#2563eb\"),\n high: normalizeColor(group.highMarkerColor, \"#16a34a\"),\n low: normalizeColor(group.lowMarkerColor, \"#dc2626\"),\n };\n for (let row = visible.row; row < visible.row + visible.rowCount; row += 1) {\n for (let col = visible.col; col < visible.col + visible.colCount; col += 1) {\n const bounds = cellBounds({ row, col, rowCount: 1, colCount: 1 }, viewport, columns, rows);\n if (!bounds || bounds.width < 8 || bounds.height < 8) continue;\n const values = group.valuesForTargetCell(row, col);\n if (!values.some((value) => value !== null)) continue;\n const plot = {\n x: bounds.x + 4,\n y: bounds.y + 4,\n width: Math.max(1, bounds.width - 8),\n height: Math.max(1, bounds.height - 8),\n };\n elements.push(\n `<g data-opengeni-sparkline=\"${escapeAttribute(group.id)}\" data-target=\"${escapeAttribute(formatCellAddress({ row, col }))}\">`,\n );\n renderSparkline(elements, plot, values, dateAxis, group.type, {\n axis,\n markers,\n colors,\n lineWeight: group.lineWeight,\n connectEmpty: group.displayEmptyCellsAs === 2,\n });\n elements.push(\"</g>\");\n }\n }\n }\n}\n\nfunction renderSparkline(\n elements: string[],\n plot: Bounds,\n inputValues: readonly (number | null)[],\n dateAxis: readonly (number | null)[] | null,\n type: \"line\" | \"column\" | \"stacked\",\n options: {\n axis: Readonly<{\n showAxis?: boolean;\n manualMin?: number;\n manualMax?: number;\n rightToLeft?: boolean;\n }>;\n markers: Readonly<{\n show: boolean;\n high: boolean;\n low: boolean;\n first: boolean;\n last: boolean;\n negative: boolean;\n }>;\n colors: {\n series: string;\n negative: string;\n axis: string;\n markers: string;\n first: string;\n last: string;\n high: string;\n low: string;\n };\n lineWeight: number;\n connectEmpty: boolean;\n },\n): void {\n const values = options.axis.rightToLeft ? [...inputValues].reverse() : [...inputValues];\n const dates = options.axis.rightToLeft && dateAxis ? [...dateAxis].reverse() : dateAxis;\n const numeric = numericSparklineExtent(values);\n if (numeric.count === 0) return;\n\n if (type === \"stacked\") {\n renderStackedSparkline(elements, plot, values, options);\n return;\n }\n\n const includeZero = type === \"column\" || options.axis.showAxis;\n let minimum = options.axis.manualMin ?? (includeZero ? Math.min(0, numeric.min) : numeric.min);\n let maximum = options.axis.manualMax ?? (includeZero ? Math.max(0, numeric.max) : numeric.max);\n if (minimum >= maximum) {\n const padding = Math.max(1, Math.abs(minimum) * 0.05);\n minimum -= padding;\n maximum += padding;\n }\n const span = maximum - minimum;\n const baseline = plot.y + ((maximum - clamp(0, minimum, maximum)) / span) * plot.height;\n if (options.axis.showAxis && minimum <= 0 && maximum >= 0) {\n elements.push(\n `<path d=\"M${number(plot.x)} ${number(baseline)}H${number(plot.x + plot.width)}\" fill=\"none\" stroke=\"${escapeAttribute(options.colors.axis)}\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`,\n );\n }\n\n if (type === \"column\") {\n const slot = plot.width / Math.max(1, values.length);\n const width = Math.max(1, slot * 0.62);\n values.forEach((value, index) => {\n if (value === null) return;\n const y = plot.y + ((maximum - clamp(value, minimum, maximum)) / span) * plot.height;\n const top = Math.min(y, baseline);\n const height = Math.max(0.75, Math.abs(baseline - y));\n elements.push(\n `<rect x=\"${number(plot.x + index * slot + (slot - width) / 2)}\" y=\"${number(top)}\" width=\"${number(width)}\" height=\"${number(height)}\" fill=\"${escapeAttribute(value < 0 ? options.colors.negative : options.colors.series)}\"/>`,\n );\n });\n return;\n }\n\n const xPositions = sparklineXPositions(values.length, dates, plot);\n const points = values.map((value, index) =>\n value === null\n ? null\n : {\n x: xPositions[index]!,\n y: plot.y + ((maximum - clamp(value, minimum, maximum)) / span) * plot.height,\n value,\n index,\n },\n );\n const segments: Array<Array<NonNullable<(typeof points)[number]>>> = [];\n let segment: Array<NonNullable<(typeof points)[number]>> = [];\n for (const point of points) {\n if (point) {\n segment.push(point);\n continue;\n }\n if (!options.connectEmpty && segment.length > 0) {\n segments.push(segment);\n segment = [];\n }\n }\n if (segment.length > 0) segments.push(segment);\n for (const line of segments) {\n if (line.length === 1) {\n elements.push(\n `<circle cx=\"${number(line[0]!.x)}\" cy=\"${number(line[0]!.y)}\" r=\"${number(Math.max(1, options.lineWeight))}\" fill=\"${escapeAttribute(options.colors.series)}\"/>`,\n );\n } else {\n elements.push(\n `<polyline points=\"${line.map((point) => `${number(point.x)},${number(point.y)}`).join(\" \")}\" fill=\"none\" stroke=\"${escapeAttribute(options.colors.series)}\" stroke-width=\"${number(options.lineWeight)}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>`,\n );\n }\n }\n\n const firstIndex = points.findIndex((point) => point !== null);\n let lastIndex = -1;\n for (let index = points.length - 1; index >= 0; index -= 1) {\n if (points[index] !== null) {\n lastIndex = index;\n break;\n }\n }\n const high = numeric.max;\n const low = numeric.min;\n for (const point of points) {\n if (!point) continue;\n const special =\n options.markers.show ||\n (options.markers.first && point.index === firstIndex) ||\n (options.markers.last && point.index === lastIndex) ||\n (options.markers.high && point.value === high) ||\n (options.markers.low && point.value === low) ||\n (options.markers.negative && point.value < 0);\n if (!special) continue;\n const color =\n options.markers.negative && point.value < 0\n ? options.colors.negative\n : options.markers.high && point.value === high\n ? options.colors.high\n : options.markers.low && point.value === low\n ? options.colors.low\n : options.markers.first && point.index === firstIndex\n ? options.colors.first\n : options.markers.last && point.index === lastIndex\n ? options.colors.last\n : options.colors.markers;\n elements.push(\n `<circle cx=\"${number(point.x)}\" cy=\"${number(point.y)}\" r=\"${number(Math.max(1.5, options.lineWeight + 0.5))}\" fill=\"${escapeAttribute(color)}\"/>`,\n );\n }\n}\n\nfunction renderStackedSparkline(\n elements: string[],\n plot: Bounds,\n values: readonly (number | null)[],\n options: {\n colors: { series: string; negative: string; axis: string };\n axis: Readonly<{ showAxis?: boolean }>;\n },\n): void {\n const baseline = plot.y + plot.height / 2;\n if (options.axis.showAxis) {\n elements.push(\n `<path d=\"M${number(plot.x)} ${number(baseline)}H${number(plot.x + plot.width)}\" fill=\"none\" stroke=\"${escapeAttribute(options.colors.axis)}\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`,\n );\n }\n const slot = plot.width / Math.max(1, values.length);\n const width = Math.max(1, slot * 0.62);\n const height = Math.max(1, plot.height * 0.42);\n values.forEach((value, index) => {\n if (value === null || value === 0) return;\n elements.push(\n `<rect x=\"${number(plot.x + index * slot + (slot - width) / 2)}\" y=\"${number(value > 0 ? baseline - height : baseline)}\" width=\"${number(width)}\" height=\"${number(height)}\" fill=\"${escapeAttribute(value < 0 ? options.colors.negative : options.colors.series)}\"/>`,\n );\n });\n}\n\nfunction sparklineXPositions(\n count: number,\n dateAxis: readonly (number | null)[] | null,\n plot: Bounds,\n): number[] {\n if (count === 1) return [plot.x + plot.width / 2];\n if (\n dateAxis &&\n dateAxis.length === count &&\n dateAxis.every((value): value is number => value !== null)\n ) {\n const extent = numericSparklineExtent(dateAxis);\n const minimum = extent.min;\n const maximum = extent.max;\n if (minimum < maximum) {\n return dateAxis.map(\n (value) => plot.x + ((value - minimum) / (maximum - minimum)) * plot.width,\n );\n }\n }\n return Array.from(\n { length: count },\n (_, index) => plot.x + (index / Math.max(1, count - 1)) * plot.width,\n );\n}\n\nfunction numericSparklineExtent(values: readonly (number | null)[]): {\n min: number;\n max: number;\n count: number;\n} {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let count = 0;\n for (const value of values) {\n if (value === null) continue;\n min = Math.min(min, value);\n max = Math.max(max, value);\n count += 1;\n }\n return { min, max, count };\n}\n\nfunction renderChart(\n elements: string[],\n bounds: Bounds,\n chart: Worksheet[\"charts\"][\"items\"][number],\n): void {\n const titleHeight = chart.title ? 30 : 12;\n const plot = {\n x: bounds.x + 40,\n y: bounds.y + titleHeight + 8,\n width: Math.max(1, bounds.width - 56),\n height: Math.max(1, bounds.height - titleHeight - 34),\n };\n elements.push(\n `<g data-opengeni-chart=\"${escapeAttribute(chart.id)}\"><rect x=\"${number(bounds.x)}\" y=\"${number(bounds.y)}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" rx=\"6\" fill=\"#ffffff\" stroke=\"#cbd5e1\"/>`,\n );\n if (chart.title) {\n elements.push(\n `<text x=\"${number(bounds.x + bounds.width / 2)}\" y=\"${number(bounds.y + 20)}\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"13\" font-weight=\"700\" fill=\"#0f172a\">${escapeText(chart.title)}</text>`,\n );\n }\n\n const series = chart.series.items.filter((item) => item.values && item.values.length > 0);\n const values = series.flatMap((item) => item.values ?? []);\n if (series.length === 0 || values.length === 0) {\n elements.push(\n `<text x=\"${number(bounds.x + bounds.width / 2)}\" y=\"${number(bounds.y + bounds.height / 2)}\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"12\" fill=\"#64748b\">${escapeText(chart.type)} chart</text></g>`,\n );\n return;\n }\n\n if (chart.type === \"pie\" || chart.type === \"doughnut\") {\n renderPie(elements, plot, series[0]!.values ?? [], chart.type === \"doughnut\");\n } else if (\n chart.type === \"bar\" ||\n chart.type === \"histogram\" ||\n chart.type === \"waterfall\" ||\n chart.type === \"funnel\"\n ) {\n renderBars(elements, plot, series);\n } else {\n renderLines(elements, plot, series, chart.type === \"area\");\n }\n elements.push(\"</g>\");\n}\n\nfunction renderBars(\n elements: string[],\n plot: Bounds,\n series: Worksheet[\"charts\"][\"items\"][number][\"series\"][\"items\"],\n): void {\n const values = series.flatMap((item) => item.values ?? []);\n const maximum = Math.max(0, ...values);\n const minimum = Math.min(0, ...values);\n const span = maximum - minimum || 1;\n const categories = Math.max(...series.map((item) => item.values?.length ?? 0));\n const groupWidth = plot.width / Math.max(1, categories);\n const barWidth = Math.max(1, (groupWidth * 0.72) / series.length);\n const baseline = plot.y + (maximum / span) * plot.height;\n elements.push(\n `<path d=\"M${number(plot.x)} ${number(baseline)}H${number(plot.x + plot.width)}\" stroke=\"#94a3b8\" fill=\"none\"/>`,\n );\n series.forEach((item, seriesIndex) => {\n (item.values ?? []).forEach((value, categoryIndex) => {\n const height = Math.abs(value / span) * plot.height;\n const x = plot.x + categoryIndex * groupWidth + groupWidth * 0.14 + seriesIndex * barWidth;\n const y = value >= 0 ? baseline - height : baseline;\n elements.push(\n `<rect x=\"${number(x)}\" y=\"${number(y)}\" width=\"${number(Math.max(1, barWidth - 1))}\" height=\"${number(height)}\" fill=\"${escapeAttribute(chartColor(item.fill, seriesIndex))}\"/>`,\n );\n });\n });\n}\n\nfunction renderLines(\n elements: string[],\n plot: Bounds,\n series: Worksheet[\"charts\"][\"items\"][number][\"series\"][\"items\"],\n area: boolean,\n): void {\n const all = series.flatMap((item) => item.values ?? []);\n const maximum = Math.max(...all);\n const minimum = Math.min(...all);\n const span = maximum - minimum || 1;\n series.forEach((item, seriesIndex) => {\n const values = item.values ?? [];\n const points = values.map((value, index) => {\n const x = plot.x + (index / Math.max(1, values.length - 1)) * plot.width;\n const y = plot.y + ((maximum - value) / span) * plot.height;\n return { x, y };\n });\n if (points.length === 0) return;\n const color = chartColor(item.fill, seriesIndex);\n const pointText = points.map((point) => `${number(point.x)},${number(point.y)}`).join(\" \");\n if (area) {\n elements.push(\n `<polygon points=\"${number(points[0]!.x)},${number(plot.y + plot.height)} ${pointText} ${number(points.at(-1)!.x)},${number(plot.y + plot.height)}\" fill=\"${escapeAttribute(color)}\" fill-opacity=\"0.22\"/>`,\n );\n }\n elements.push(\n `<polyline points=\"${pointText}\" fill=\"none\" stroke=\"${escapeAttribute(color)}\" stroke-width=\"2\"/>`,\n );\n for (const point of points) {\n elements.push(\n `<circle cx=\"${number(point.x)}\" cy=\"${number(point.y)}\" r=\"2.5\" fill=\"${escapeAttribute(color)}\"/>`,\n );\n }\n });\n}\n\nfunction renderPie(\n elements: string[],\n plot: Bounds,\n values: readonly number[],\n doughnut: boolean,\n): void {\n const positive = values.map((value) => Math.max(0, value));\n const total = positive.reduce((sum, value) => sum + value, 0);\n if (total <= 0) return;\n const radius = Math.max(1, Math.min(plot.width, plot.height) / 2);\n const centerX = plot.x + plot.width / 2;\n const centerY = plot.y + plot.height / 2;\n let angle = -Math.PI / 2;\n positive.forEach((value, index) => {\n if (value <= 0) return;\n const next = angle + (value / total) * Math.PI * 2;\n const start = polar(centerX, centerY, radius, angle);\n const end = polar(centerX, centerY, radius, next);\n const large = next - angle > Math.PI ? 1 : 0;\n elements.push(\n `<path d=\"M${number(centerX)} ${number(centerY)}L${number(start.x)} ${number(start.y)}A${number(radius)} ${number(radius)} 0 ${large} 1 ${number(end.x)} ${number(end.y)}Z\" fill=\"${chartColor(undefined, index)}\"/>`,\n );\n angle = next;\n });\n if (doughnut) {\n elements.push(\n `<circle cx=\"${number(centerX)}\" cy=\"${number(centerY)}\" r=\"${number(radius * 0.52)}\" fill=\"#ffffff\"/>`,\n );\n }\n}\n\nfunction polar(x: number, y: number, radius: number, angle: number): { x: number; y: number } {\n return { x: x + Math.cos(angle) * radius, y: y + Math.sin(angle) * radius };\n}\n\nfunction chartColor(value: string | undefined, index: number): string {\n if (value) return normalizeColor(value, \"#2563eb\");\n return [\"#2563eb\", \"#0d9488\", \"#f59e0b\", \"#dc2626\", \"#7c3aed\", \"#0891b2\"][index % 6]!;\n}\n\nfunction drawingRange(from: RangeAddress, to: RangeAddress): RangeAddress {\n return {\n row: from.row,\n col: from.col,\n rowCount: Math.max(1, to.row + to.rowCount - from.row),\n colCount: Math.max(1, to.col + to.colCount - from.col),\n };\n}\n\nfunction unionRanges(a: RangeAddress | null, b: RangeAddress): RangeAddress {\n if (!a) return { ...b };\n const row = Math.min(a.row, b.row);\n const col = Math.min(a.col, b.col);\n const endRow = Math.max(a.row + a.rowCount, b.row + b.rowCount);\n const endCol = Math.max(a.col + a.colCount, b.col + b.colCount);\n return { row, col, rowCount: endRow - row, colCount: endCol - col };\n}\n\nfunction wrapLines(value: string, width: number, fontSize: number): string[] {\n const maxCharacters = Math.max(1, Math.floor(width / Math.max(1, fontSize * 0.56)));\n const lines: string[] = [];\n for (const explicitLine of value.split(/\\r?\\n/)) {\n const words = explicitLine.split(/\\s+/).filter(Boolean);\n if (words.length === 0) {\n lines.push(\"\");\n continue;\n }\n let line = \"\";\n for (const word of words) {\n if (word.length > maxCharacters) {\n if (line) lines.push(line);\n for (let index = 0; index < word.length; index += maxCharacters) {\n lines.push(word.slice(index, index + maxCharacters));\n }\n line = \"\";\n } else if (!line) {\n line = word;\n } else if (line.length + word.length + 1 <= maxCharacters) {\n line += ` ${word}`;\n } else {\n lines.push(line);\n line = word;\n }\n }\n if (line) lines.push(line);\n }\n return lines.slice(0, 512);\n}\n\nfunction intersect(a: RangeAddress, b: RangeAddress): RangeAddress {\n const row = Math.max(a.row, b.row);\n const col = Math.max(a.col, b.col);\n const endRow = Math.min(a.row + a.rowCount, b.row + b.rowCount);\n const endCol = Math.min(a.col + a.colCount, b.col + b.colCount);\n return { row, col, rowCount: endRow - row, colCount: endCol - col };\n}\n\nfunction rangesOverlap(a: RangeAddress, b: RangeAddress): boolean {\n return (\n a.row < b.row + b.rowCount &&\n b.row < a.row + a.rowCount &&\n a.col < b.col + b.colCount &&\n b.col < a.col + a.colCount\n );\n}\n\nfunction contains(address: RangeAddress, row: number, col: number): boolean {\n return (\n row >= address.row &&\n col >= address.col &&\n row < address.row + address.rowCount &&\n col < address.col + address.colCount\n );\n}\n\nfunction inferredAlignment(value: FormulaResult): \"left\" | \"right\" {\n return typeof value === \"number\" || value instanceof Date ? \"right\" : \"left\";\n}\n\nfunction normalizeColor(color: string | undefined, fallback: string): string {\n if (!color) return fallback;\n if (/^#[0-9a-f]{6}$/i.test(color) || /^#[0-9a-f]{3}$/i.test(color)) return color;\n if (/^[0-9a-f]{6}$/i.test(color)) return `#${color}`;\n if (/^[0-9a-f]{8}$/i.test(color)) return `#${color.slice(2)}`;\n if (/^(?:rgb|hsl)a?\\(/i.test(color) || /^[a-z]+$/i.test(color)) return color;\n return fallback;\n}\n\nfunction safeFileStem(name: string): string {\n return name.replaceAll(/[^A-Za-z0-9._-]+/g, \"-\").replaceAll(/^-+|-+$/g, \"\") || \"sheet\";\n}\n\nfunction escapeText(value: string): string {\n return value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replaceAll('\"', \"&quot;\");\n}\n\nfunction number(value: number): string {\n return Number(value.toFixed(3)).toString();\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,155 @@
1
+ import type { RangeAddress } from "./spreadsheet-address.js";
2
+ export type CellValue = string | number | boolean | Date | null;
3
+ export type FormulaResult = CellValue | FormulaErrorValue;
4
+ export type FormulaErrorValue = "#DIV/0!" | "#N/A" | "#NAME?" | "#NUM!" | "#REF!" | "#VALUE!" | "#CYCLE!";
5
+ export type Color = string;
6
+ export type FontConfig = {
7
+ name?: string;
8
+ size?: number;
9
+ bold?: boolean;
10
+ italic?: boolean;
11
+ underline?: boolean;
12
+ color?: Color;
13
+ };
14
+ export type BorderConfig = {
15
+ style?: string;
16
+ color?: Color;
17
+ weight?: number;
18
+ };
19
+ export type RangeBordersConfig = {
20
+ preset?: "none" | "outside" | "inside" | "all" | "doubleBottom";
21
+ style?: string;
22
+ color?: Color;
23
+ top?: BorderConfig;
24
+ bottom?: BorderConfig;
25
+ left?: BorderConfig;
26
+ right?: BorderConfig;
27
+ insideHorizontal?: BorderConfig;
28
+ insideVertical?: BorderConfig;
29
+ };
30
+ export type CellFormat = {
31
+ fill?: Color;
32
+ font?: FontConfig;
33
+ numberFormat?: string;
34
+ borders?: RangeBordersConfig;
35
+ horizontalAlignment?: "left" | "center" | "right" | "justify";
36
+ verticalAlignment?: "top" | "center" | "bottom";
37
+ wrapText?: boolean;
38
+ };
39
+ export type CellData = {
40
+ value: CellValue;
41
+ formula: string | null;
42
+ format: CellFormat;
43
+ };
44
+ export type FreezePaneState = {
45
+ rows: number;
46
+ columns: number;
47
+ };
48
+ export type MergeRegion = RangeAddress;
49
+ export type DataValidationConfig = {
50
+ rule: Record<string, unknown>;
51
+ };
52
+ export type ConditionalFormatConfig = Record<string, unknown>;
53
+ export type SpreadsheetImageConfig = {
54
+ dataUrl?: string;
55
+ blob?: ArrayBuffer;
56
+ contentType?: string;
57
+ alt?: string;
58
+ anchor: {
59
+ from: {
60
+ row: number;
61
+ col: number;
62
+ rowOffsetPx?: number;
63
+ colOffsetPx?: number;
64
+ };
65
+ extent: {
66
+ widthPx: number;
67
+ heightPx: number;
68
+ };
69
+ };
70
+ };
71
+ export type SpreadsheetChartType = "bar" | "line" | "area" | "pie" | "doughnut" | "scatter" | "bubble" | "radar" | "stock" | "treemap" | "sunburst" | "histogram" | "boxWhisker" | "waterfall" | "funnel" | "map";
72
+ export type SpreadsheetChartSeriesConfig = {
73
+ name: string;
74
+ formula?: string;
75
+ categoryFormula?: string;
76
+ values?: number[];
77
+ categories?: Array<string | number>;
78
+ fill?: Color;
79
+ };
80
+ export type SpreadsheetChartConfig = {
81
+ chartType?: SpreadsheetChartType;
82
+ title?: string;
83
+ hasLegend?: boolean;
84
+ series?: SpreadsheetChartSeriesConfig[];
85
+ };
86
+ export type SpreadsheetSparklineType = "line" | "column" | "stacked";
87
+ export type SpreadsheetSparklineMarkersOptions = {
88
+ show?: boolean;
89
+ high?: boolean;
90
+ low?: boolean;
91
+ first?: boolean;
92
+ last?: boolean;
93
+ negative?: boolean;
94
+ };
95
+ export type SpreadsheetSparklineAxisOptions = {
96
+ showAxis?: boolean;
97
+ manualMin?: number;
98
+ manualMax?: number;
99
+ rightToLeft?: boolean;
100
+ };
101
+ /** Style and display configuration shared by worksheet and range sparkline APIs. */
102
+ export type SpreadsheetSparklineOptions = {
103
+ lineWeight?: number;
104
+ displayHidden?: boolean;
105
+ /** Skill-compatible proto enum: 0 = gaps, 1 = zero, 2 = connect. */
106
+ displayEmptyCellsAs?: 0 | 1 | 2;
107
+ seriesColor?: Color;
108
+ negativeColor?: Color;
109
+ axisColor?: Color;
110
+ markersColor?: Color;
111
+ firstMarkerColor?: Color;
112
+ lastMarkerColor?: Color;
113
+ highMarkerColor?: Color;
114
+ lowMarkerColor?: Color;
115
+ markers?: SpreadsheetSparklineMarkersOptions;
116
+ axis?: SpreadsheetSparklineAxisOptions;
117
+ };
118
+ export type InspectOptions = {
119
+ kind: string;
120
+ include?: string;
121
+ sheetId?: string;
122
+ range?: string;
123
+ search?: string;
124
+ maxChars?: number;
125
+ tableMaxRows?: number;
126
+ tableMaxCols?: number;
127
+ tableMaxCellChars?: number;
128
+ maxResults?: number;
129
+ options?: {
130
+ maxResults?: number;
131
+ };
132
+ target?: {
133
+ id: string;
134
+ beforeLines?: number;
135
+ afterLines?: number;
136
+ };
137
+ };
138
+ export type InspectResult = {
139
+ ndjson: string;
140
+ records: readonly Record<string, unknown>[];
141
+ truncated: boolean;
142
+ };
143
+ export type HelpOptions = {
144
+ search?: string;
145
+ include?: string;
146
+ maxChars?: number;
147
+ };
148
+ export type RenderSpreadsheetOptions = {
149
+ sheetName?: string;
150
+ range?: string;
151
+ autoCrop?: "all" | "content" | false;
152
+ scale?: number;
153
+ format?: "png" | "svg";
154
+ background?: string;
155
+ };
@@ -0,0 +1,88 @@
1
+ export declare const XLSX_MEDIA_TYPE: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
2
+ export type SpreadsheetOpaqueRelationship = {
3
+ sourcePart: string;
4
+ type: string;
5
+ targetPart: string;
6
+ };
7
+ export type SpreadsheetOpaqueContentType = {
8
+ partName: string;
9
+ contentType: string;
10
+ };
11
+ /** Bounded, inert OOXML which is retained only in the original source package. */
12
+ export type SpreadsheetOpaqueContent = {
13
+ parts: readonly string[];
14
+ relationships: readonly SpreadsheetOpaqueRelationship[];
15
+ contentTypes: readonly SpreadsheetOpaqueContentType[];
16
+ features: readonly string[];
17
+ };
18
+ export type SpreadsheetFidelityIssue = {
19
+ code: "content-preserved-in-source" | "content-will-be-discarded" | "editable-chart-preserved" | "editable-chart-not-exportable" | "sparkline-preserved" | "sparkline-not-exportable" | "image-metadata-not-exportable" | "comment-thread-not-exportable";
20
+ severity: "warning" | "error";
21
+ feature: "opaque-ooxml" | "chart" | "sparkline" | "image" | "comment";
22
+ message: string;
23
+ parts?: readonly string[];
24
+ relationships?: readonly SpreadsheetOpaqueRelationship[];
25
+ contentTypes?: readonly SpreadsheetOpaqueContentType[];
26
+ features?: readonly string[];
27
+ };
28
+ export type SpreadsheetXlsxImportOptions = {
29
+ /** Reject unsupported editable OOXML instead of retaining its original package. */
30
+ unsupportedContent?: "preserve" | "error";
31
+ /** Bounded before ExcelJS allocates or parses any OOXML. */
32
+ limits?: Partial<SpreadsheetXlsxImportLimits>;
33
+ };
34
+ export type SpreadsheetXlsxImportLimits = {
35
+ compressedBytes: number;
36
+ expandedBytes: number;
37
+ entryBytes: number;
38
+ entries: number;
39
+ compressionRatio: number;
40
+ inspectedXmlBytes: number;
41
+ xmlDepth: number;
42
+ xmlAttributesPerElement: number;
43
+ xmlAttributesPerPart: number;
44
+ xmlAttributes: number;
45
+ xmlElementsPerPart: number;
46
+ xmlElements: number;
47
+ xmlTextCharactersPerPart: number;
48
+ xmlTextCharacters: number;
49
+ worksheetCellsPerPart: number;
50
+ worksheetCells: number;
51
+ formulasPerPart: number;
52
+ formulas: number;
53
+ formulaBytesPerPart: number;
54
+ formulaBytes: number;
55
+ sharedStrings: number;
56
+ cellStyles: number;
57
+ styleRecords: number;
58
+ commentsPerPart: number;
59
+ comments: number;
60
+ relationshipsPerPart: number;
61
+ relationships: number;
62
+ mediaEntries: number;
63
+ mediaEntryBytes: number;
64
+ mediaBytes: number;
65
+ imagePixels: number;
66
+ };
67
+ export type SpreadsheetLossPreservationEnvelope = {
68
+ version: 1;
69
+ mediaType: typeof XLSX_MEDIA_TYPE;
70
+ sourceBytes: Uint8Array;
71
+ sourceDigest: string;
72
+ opaqueContent: SpreadsheetOpaqueContent;
73
+ modelDigest: string;
74
+ };
75
+ export type SpreadsheetXlsxExportOptions = {
76
+ fileName?: string;
77
+ /** Must be explicit because ExcelJS cannot author every retained editable OOXML feature. */
78
+ unsupportedContent?: "error" | "discard";
79
+ };
80
+ export declare class SpreadsheetFidelityError extends Error {
81
+ readonly issues: readonly SpreadsheetFidelityIssue[];
82
+ constructor(message: string, issues: readonly SpreadsheetFidelityIssue[]);
83
+ }
84
+ export declare class SpreadsheetSecurityError extends Error {
85
+ readonly code: "invalid-package" | "limit-exceeded" | "encrypted-content" | "active-content" | "unsafe-xml" | "external-relationship";
86
+ readonly entryName?: string | undefined;
87
+ constructor(message: string, code: "invalid-package" | "limit-exceeded" | "encrypted-content" | "active-content" | "unsafe-xml" | "external-relationship", entryName?: string | undefined);
88
+ }
@@ -0,0 +1,16 @@
1
+ import { FileBlob } from "./file-blob.js";
2
+ import { Workbook } from "./spreadsheet.js";
3
+ import { type SpreadsheetFidelityIssue, type SpreadsheetLossPreservationEnvelope, type SpreadsheetXlsxExportOptions, type SpreadsheetXlsxImportOptions } from "./spreadsheet-xlsx-api.js";
4
+ /** XLSX codec around the canonical Workbook model. */
5
+ export declare class SpreadsheetXlsxCodec {
6
+ static importXlsx(input: FileBlob | Blob | ArrayBuffer | Uint8Array, options?: SpreadsheetXlsxImportOptions): Promise<Workbook>;
7
+ static exportXlsx(workbook: Workbook, options?: SpreadsheetXlsxExportOptions): Promise<FileBlob>;
8
+ static fidelityReport(workbook: Workbook): readonly SpreadsheetFidelityIssue[];
9
+ /**
10
+ * Returns a portable copy of the opaque original-package envelope.
11
+ * Persist it beside Workbook.toJSON(); the Workbook JSON intentionally does not contain Office bytes.
12
+ */
13
+ static lossPreservationEnvelope(workbook: Workbook): SpreadsheetLossPreservationEnvelope | null;
14
+ /** Reattaches a separately persisted envelope to a restored canonical workbook snapshot. */
15
+ static attachLossPreservationEnvelope(workbook: Workbook, envelope: SpreadsheetLossPreservationEnvelope, options?: Pick<SpreadsheetXlsxImportOptions, "limits">): Promise<void>;
16
+ }
@@ -0,0 +1,16 @@
1
+ import {
2
+ SpreadsheetXlsxCodec
3
+ } from "./chunk-DCTLTNPW.js";
4
+ import "./chunk-J6N7IR44.js";
5
+ import "./chunk-IYFXZQ34.js";
6
+ import "./chunk-4FRFNNBM.js";
7
+ import "./chunk-O24KTEGP.js";
8
+ import "./chunk-72SYDU4O.js";
9
+ import "./chunk-FGZM4FQ6.js";
10
+ import "./chunk-4BSENMAE.js";
11
+ import "./chunk-Q2FFHEY7.js";
12
+ import "./chunk-VUNV25KB.js";
13
+ export {
14
+ SpreadsheetXlsxCodec
15
+ };
16
+ //# sourceMappingURL=spreadsheet-xlsx-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,16 @@
1
+ import type { Workbook } from "./spreadsheet.js";
2
+ import { type SpreadsheetFidelityIssue, type SpreadsheetLossPreservationEnvelope, type SpreadsheetOpaqueContent } from "./spreadsheet-xlsx-api.js";
3
+ export type SpreadsheetLossPreservationState = {
4
+ sourceBytes: Uint8Array;
5
+ sourceDigest: string;
6
+ importedRevision: number;
7
+ opaqueContent: SpreadsheetOpaqueContent;
8
+ modelDigest: string;
9
+ };
10
+ export declare const LOSS_PRESERVATION: WeakMap<Workbook, SpreadsheetLossPreservationState>;
11
+ export declare function spreadsheetFidelityReport(workbook: Workbook): readonly SpreadsheetFidelityIssue[];
12
+ export declare function opaqueContentIssues(content: SpreadsheetOpaqueContent, severity: SpreadsheetFidelityIssue["severity"]): SpreadsheetFidelityIssue[];
13
+ export declare function spreadsheetLossPreservationEnvelope(workbook: Workbook): SpreadsheetLossPreservationEnvelope | null;
14
+ export declare function opaqueContentIssue(content: SpreadsheetOpaqueContent, severity: SpreadsheetFidelityIssue["severity"]): SpreadsheetFidelityIssue;
15
+ export declare function hasOpaqueContent(content: SpreadsheetOpaqueContent): boolean;
16
+ export declare function cloneOpaqueContent(content: SpreadsheetOpaqueContent): SpreadsheetOpaqueContent;