{"version":3,"file":"generate-qrZS3qhj.mjs","names":["buildWorksheetXml"],"sources":["../src/compiler.ts","../src/generate.ts"],"sourcesContent":["/**\n * XLSX Compiler — compiles WorkbookOptions into a Zippable structure.\n *\n * Accepts pure JSON WorkbookOptions — no intermediate File class needed.\n * Uses XlsxWriteContext for shared state (strings, styles, media, charts).\n *\n * @module\n */\n\nimport {\n  Relationships,\n  TargetModeType,\n  appPropertiesDesc,\n  buildCorePropertiesXmlString,\n  compileMapping,\n  customPropertiesDesc,\n  toUint8Array,\n  type XmlifyedFile,\n  type Zippable,\n} from \"@office-open/core\";\nimport { chartSpaceDesc } from \"@office-open/core/chart\";\nimport type { CalcCell } from \"@parts/calc-chain\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc } from \"@parts/chartsheet\";\nimport { commentsDesc, vmlNotesDesc } from \"@parts/comments\";\nimport type { ImageOptions, ChartAnchorOptions } from \"@parts/drawing\";\nimport { drawingDesc } from \"@parts/drawing\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { WorkbookOptions } from \"@parts/file\";\nimport { aggregate, collectUniqueValues } from \"@parts/pivot\";\nimport type { PivotSourceData, PivotTableOptions } from \"@parts/pivot\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport { pivotTableDesc } from \"@parts/pivot-table\";\nimport { revisionHeadersDesc, revisionLogDesc, usersDesc } from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport type { SharedStrings } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport { createThemeXml } from \"@parts/theme\";\nimport type { TablePartReference, SheetDefinition } from \"@parts/workbook\";\nimport { workbookDesc, buildTablePartsXml, buildExternalReferencesXml } from \"@parts/workbook\";\nimport { buildWorksheetXml, type WorksheetContext } from \"@parts/worksheet\";\nimport type { RowOptions, WorksheetOptions } from \"@parts/worksheet\";\n\nimport { XlsxWriteContext } from \"./context\";\n\nconst XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n\n/**\n * Compile workbook options into a Zippable structure.\n */\nexport function compileWorkbook(\n  options: WorkbookOptions,\n  overrides: XmlifyedFile[] = [],\n  mediaLevel: number = 0,\n): Zippable {\n  const ctx = new XlsxWriteContext();\n  const mapping: Record<string, { data: string; path: string }> = {};\n\n  const worksheetConfigs = options.worksheets ?? [];\n  const chartsheetConfigs = options.chartsheets ?? [];\n  const hasCustomProperties = !!options.customProperties && options.customProperties.length > 0;\n\n  // Core properties\n  mapping[\"Properties\"] = {\n    data: XML_DECL + buildCorePropertiesXmlString(options),\n    path: \"docProps/core.xml\",\n  };\n\n  // App properties\n  mapping[\"AppProperties\"] = {\n    data: XML_DECL + (appPropertiesDesc.stringify(options.appProperties ?? {}, ctx) ?? \"\"),\n    path: \"docProps/app.xml\",\n  };\n\n  // Custom properties (optional part; only emitted when present)\n  if (hasCustomProperties) {\n    mapping[\"CustomProperties\"] = {\n      data:\n        XML_DECL +\n        (customPropertiesDesc.stringify({ properties: options.customProperties ?? [] }, ctx) ?? \"\"),\n      path: \"docProps/custom.xml\",\n    };\n  }\n\n  // File-level relationships (_rels/.rels)\n  const fileRels = buildFileRelationships(hasCustomProperties);\n  mapping[\"FileRelationships\"] = {\n    data: XML_DECL + fileRels.serialize(),\n    path: \"_rels/.rels\",\n  };\n\n  // Register base content types\n  for (let i = 0; i < worksheetConfigs.length; i++) {\n    ctx.contentTypes.addWorksheet(i + 1);\n  }\n  ctx.contentTypes.addStyles();\n  ctx.contentTypes.addSharedStrings();\n  ctx.contentTypes.addTheme();\n  if (hasCustomProperties) ctx.contentTypes.addCustomProperties();\n\n  // Register predefined DXFs before worksheets use styles\n  for (const dxf of options.dxfs ?? []) {\n    ctx.registerDxf(dxf);\n  }\n\n  // Re-apply parsed style sections so a declarative round-trip preserves\n  // them (colors, table/cell styles, extensions) alongside DXFs.\n  if (options.colors) ctx.styles.setColors(options.colors);\n  if (options.tableStyles) ctx.styles.setTableStyles(options.tableStyles);\n  if (options.cellStyles) ctx.styles.setCustomCellStyles(options.cellStyles);\n  if (options.styleExtensions) ctx.styles.setExtensions(options.styleExtensions);\n\n  // Build workbook relationships\n  buildWorkbookRelationships(ctx.workbookRels, worksheetConfigs.length, chartsheetConfigs.length);\n\n  // Build sheet definitions for workbook XML\n  const sheets: SheetDefinition[] = [];\n  let sheetId = 1;\n  let rId = 1;\n  for (const ws of worksheetConfigs) {\n    sheets.push({\n      name: ws.name ?? `Sheet${sheetId}`,\n      sheetId: sheetId++,\n      rId: `rId${rId++}`,\n    });\n  }\n  for (const cs of chartsheetConfigs) {\n    sheets.push({\n      name: cs.name ?? `Chart${sheetId}`,\n      sheetId: sheetId++,\n      rId: `rId${rId++}`,\n    });\n  }\n\n  // Worksheets — formatted BEFORE SharedStrings so strings are registered\n  let globalMediaIdx = 0;\n  let globalChartIdx = 0;\n  let globalPivotIdx = 0;\n  let globalPivotCacheIdx = 0;\n  let globalTableIdx = 0;\n  const pivotCacheDataMap = new Map<string, { cacheId: number; cacheIdx: number }>();\n  const calcCells: CalcCell[] = [];\n  const allTableParts: TablePartReference[] = [];\n\n  const wsContext: WorksheetContext = { sharedStrings: ctx.sharedStrings, styles: ctx.styles };\n\n  for (const [i, wsOpts] of worksheetConfigs.entries()) {\n    const imgOpts = wsOpts.images ?? [];\n    const chartOpts = wsOpts.charts ?? [];\n    const hlOpts = wsOpts.hyperlinks ?? [];\n    const sheetName = wsOpts.name ?? `Sheet${i + 1}`;\n\n    // Worksheet uses buildWorksheetXml fast path (zero-allocation string concat)\n    let sheetXml = buildWorksheetXml(wsOpts, wsContext);\n\n    // Collect formula cells for calcChain\n    const sheetIdx = i + 1;\n    const wsRows = wsOpts.rows ?? [];\n    for (const [ri, rowOpts] of wsRows.entries()) {\n      const rowNumber = rowOpts.rowNumber ?? ri + 1;\n      if (!rowOpts.cells) continue;\n      for (const [ci, cell] of rowOpts.cells.entries()) {\n        if (!cell.formula) continue;\n        const ref = cell.reference ?? columnToLetter(ci + 1) + rowNumber;\n        calcCells.push({\n          reference: ref,\n          sheetIndex: sheetIdx,\n          array: cell.formula.type === \"array\",\n        });\n      }\n    }\n\n    const hasMedia = imgOpts.length > 0 || chartOpts.length > 0;\n    const hasExternalHyperlinks = hlOpts.some((h) => h.target.type === \"external\");\n    const commentOpts = wsOpts.comments ?? [];\n    const hasComments = commentOpts.length > 0;\n    const pivotOpts = wsOpts.pivotTables ?? [];\n    const hasPivots = pivotOpts.length > 0;\n    const tableOpts = wsOpts.tables ?? [];\n    const hasTables = tableOpts.length > 0;\n    const bgImg = wsOpts.backgroundImage;\n\n    // Worksheet-level relationships\n    let wsRels: Relationships | undefined;\n    let nextRid = 0;\n\n    if (hasMedia || hasExternalHyperlinks || hasComments || hasPivots || hasTables || bgImg) {\n      wsRels = new Relationships();\n    }\n\n    if (hasExternalHyperlinks) {\n      for (const hl of hlOpts) {\n        if (hl.target.type !== \"external\") continue;\n        const rid = ++nextRid;\n        wsRels!.addRelationship(\n          rid,\n          \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n          hl.target.url,\n          \"External\",\n        );\n      }\n    }\n\n    if (hasMedia) {\n      const drawingImages: ImageOptions[] = [];\n      const drawingCharts: ChartAnchorOptions[] = [];\n      const drawingRels = new Relationships();\n      let rid = 1;\n\n      // Process images\n      for (const img of imgOpts) {\n        const ext = img.type === \"jpg\" ? \"jpeg\" : \"png\";\n        const rawBytes = toUint8Array(img.data, { encoding: \"base64\" });\n        const entry = ctx.media.addMedia(rawBytes, ext, (fileName) => ({\n          fileName,\n          type: ext,\n          data: rawBytes,\n          width: 0,\n          height: 0,\n        }));\n\n        drawingRels.addRelationship(\n          rid,\n          \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n          `../media/${entry.fileName}`,\n        );\n\n        drawingImages.push({\n          col: img.col,\n          row: img.row,\n          rId: `rId${rid}`,\n        });\n        rid++;\n        globalMediaIdx++;\n      }\n\n      // Process charts\n      for (const chart of chartOpts) {\n        const chartKey = `chart_${globalChartIdx}`;\n        ctx.charts.addChart(chartKey, {\n          key: chartKey,\n          chartSpaceXml: chartSpaceDesc.stringify(chart, ctx) ?? \"\",\n        });\n\n        drawingRels.addRelationship(\n          rid,\n          \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n          `../charts/chart${globalChartIdx + 1}.xml`,\n        );\n\n        drawingCharts.push({\n          col: chart.col,\n          row: chart.row,\n          rId: `rId${rid}`,\n        });\n        rid++;\n        globalChartIdx++;\n      }\n\n      // Generate drawing XML (via descriptor)\n      const drawingXml = drawingDesc.stringify(\n        { images: drawingImages, charts: drawingCharts },\n        ctx,\n      );\n      const drawingIdx = i + 1;\n      mapping[`Drawing${i}`] = {\n        data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${drawingXml}`,\n        path: `xl/drawings/drawing${drawingIdx}.xml`,\n      };\n\n      // Drawing relationships\n      mapping[`DrawingRels${i}`] = {\n        data: XML_DECL + drawingRels.serialize(),\n        path: `xl/drawings/_rels/drawing${drawingIdx}.xml.rels`,\n      };\n\n      // Insert drawing reference before the closing </worksheet> tag.\n      const drawingRid = ++nextRid;\n      const closingTag = \"</worksheet>\";\n      sheetXml =\n        sheetXml.slice(0, -closingTag.length) + `<drawing r:id=\"rId${drawingRid}\"/>` + closingTag;\n\n      // Add drawing relationship to worksheet rels\n      wsRels!.addRelationship(\n        drawingRid,\n        \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n        `../drawings/drawing${drawingIdx}.xml`,\n      );\n\n      ctx.contentTypes.addDrawing(drawingIdx);\n    }\n\n    // Comments\n    if (hasComments) {\n      const commentsIdx = i + 1;\n\n      // Comments XML (via descriptor)\n      const commentsXml = commentsDesc.stringify({ comments: commentOpts }, ctx);\n      mapping[`Comments${i}`] = {\n        data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${commentsXml}`,\n        path: `xl/comments${commentsIdx}.xml`,\n      };\n\n      // VML drawing (via descriptor)\n      const vmlXml = vmlNotesDesc.stringify({ comments: commentOpts }, ctx);\n      mapping[`VmlDrawing${i}`] = {\n        data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${vmlXml}`,\n        path: `xl/drawings/vmlDrawing${commentsIdx}.vml`,\n      };\n\n      // Worksheet rels: comments → comments XML, legacyDrawing → VML file\n      const commentsRid = ++nextRid;\n      wsRels!.addRelationship(\n        commentsRid,\n        \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n        `../comments${commentsIdx}.xml`,\n      );\n\n      const vmlRid = ++nextRid;\n      wsRels!.addRelationship(\n        vmlRid,\n        \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n        `../drawings/vmlDrawing${commentsIdx}.vml`,\n      );\n\n      // Insert legacyDrawing reference before closing </worksheet>\n      const closingTag = \"</worksheet>\";\n      sheetXml =\n        sheetXml.slice(0, -closingTag.length) + `<legacyDrawing r:id=\"rId${vmlRid}\"/>` + closingTag;\n\n      // Register content types\n      ctx.contentTypes.addComments(commentsIdx);\n      ctx.contentTypes.addVmlDrawing();\n    }\n\n    // Background picture\n    if (bgImg) {\n      const ext = bgImg.type === \"jpg\" ? \"jpeg\" : bgImg.type;\n      const rawBytes = toUint8Array(bgImg.data, { encoding: \"base64\" });\n      const entry = ctx.media.addMedia(rawBytes, ext, (fileName) => ({\n        fileName,\n        type: ext,\n        data: rawBytes,\n        width: 0,\n        height: 0,\n      }));\n      globalMediaIdx++;\n      const bgRid = ++nextRid;\n      wsRels!.addRelationship(\n        bgRid,\n        \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n        `../media/${entry.fileName}`,\n      );\n      sheetXml = sheetXml.replace(\"<!--BACKGROUND_PICTURE-->\", `<picture r:id=\"rId${bgRid}\"/>`);\n    }\n\n    // Pivot tables\n    if (hasPivots) {\n      for (const pt of pivotOpts) {\n        globalPivotIdx++;\n        const pivotIdx = globalPivotIdx;\n\n        // Extract source data from source sheet\n        const sourceSheet = pt.sourceSheet ?? sheetName;\n        const sourceWsIdx = worksheetConfigs.findIndex(\n          (ws) => (ws.name ?? `Sheet${worksheetConfigs.indexOf(ws) + 1}`) === sourceSheet,\n        );\n        if (sourceWsIdx === -1) continue;\n        const sourceWs = worksheetConfigs[sourceWsIdx];\n        if (!sourceWs) continue;\n\n        const sourceRows = sourceWs.rows ?? [];\n        const sourceData = extractPivotSourceData(sourceRows, pt.source);\n\n        // Deduplicate pivot caches by source reference\n        const cacheKey = `${sourceSheet}:${pt.source}`;\n        let cacheId: number;\n        let cacheIdx: number;\n        const existing = pivotCacheDataMap.get(cacheKey);\n        if (existing) {\n          cacheId = existing.cacheId;\n          cacheIdx = existing.cacheIdx;\n        } else {\n          globalPivotCacheIdx++;\n          cacheIdx = globalPivotCacheIdx;\n          cacheId = cacheIdx;\n          pivotCacheDataMap.set(cacheKey, { cacheId, cacheIdx });\n\n          // Generate pivotCacheDefinition\n          const cacheDefRels = new Relationships();\n          cacheDefRels.addRelationship(\n            1,\n            \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords\",\n            \"pivotCacheRecords1.xml\",\n          );\n\n          const cacheDefXml =\n            '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n            pivotCacheDefDesc.stringify(\n              {\n                sourceRef: pt.source.split(\":\")[0] ? pt.source : \"A1\",\n                sourceSheet,\n                sourceData,\n                recordsRid: \"rId1\",\n              },\n              ctx,\n            );\n\n          mapping[`PivotCacheDef${cacheIdx}`] = {\n            data: cacheDefXml,\n            path: `xl/pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n          };\n          mapping[`PivotCacheDefRels${cacheIdx}`] = {\n            data: XML_DECL + cacheDefRels.serialize(),\n            path: `xl/pivotCache/_rels/pivotCacheDefinition${cacheIdx}.xml.rels`,\n          };\n\n          // Generate pivotCacheRecords\n          const cacheRecordsXml =\n            '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n            pivotCacheRecordsDesc.stringify({ sourceData }, ctx);\n          mapping[`PivotCacheRecords${cacheIdx}`] = {\n            data: cacheRecordsXml,\n            path: `xl/pivotCache/pivotCacheRecords${cacheIdx}.xml`,\n          };\n\n          // Content types\n          ctx.contentTypes.addPivotCacheDefinition(cacheIdx);\n          ctx.contentTypes.addPivotCacheRecords(cacheIdx);\n\n          // Register in workbook\n          const wbPivotRid = ctx.workbookRels.relationshipCount + 1;\n          ctx.workbookRels.addRelationship(\n            wbPivotRid,\n            \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n            `pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n          );\n          ctx.pivotCacheRefs.push({ cacheId, rId: `rId${wbPivotRid}` });\n        }\n\n        // Generate pivotTable\n        const pivotTableXml =\n          XML_DECL + pivotTableDesc.stringify({ options: pt, sourceData, cacheId }, ctx);\n        mapping[`PivotTable${pivotIdx}`] = {\n          data: pivotTableXml,\n          path: `xl/pivotTables/pivotTable${pivotIdx}.xml`,\n        };\n\n        // pivotTable rels → cacheDefinition\n        const ptRels = new Relationships();\n        ptRels.addRelationship(\n          1,\n          \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n          `../pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n        );\n        mapping[`PivotTableRels${pivotIdx}`] = {\n          data: XML_DECL + ptRels.serialize(),\n          path: `xl/pivotTables/_rels/pivotTable${pivotIdx}.xml.rels`,\n        };\n\n        // Worksheet rels → pivotTable\n        const ptRid = ++nextRid;\n        wsRels!.addRelationship(\n          ptRid,\n          \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable\",\n          `../pivotTables/pivotTable${pivotIdx}.xml`,\n        );\n\n        ctx.contentTypes.addPivotTable(pivotIdx);\n      }\n    }\n\n    // Tables (list objects)\n    const wsTableParts: TablePartReference[] = [];\n    if (hasTables) {\n      for (const tbl of tableOpts) {\n        globalTableIdx++;\n        const tableIdx = globalTableIdx;\n\n        // Generate table XML\n        const tableXmlStr =\n          '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n          tableDesc.stringify({ ...tbl, id: tbl.id ?? tableIdx }, ctx);\n        mapping[`Table${tableIdx}`] = {\n          data: tableXmlStr,\n          path: `xl/tables/table${tableIdx}.xml`,\n        };\n\n        // Worksheet rels → table\n        const tblRid = ++nextRid;\n        wsRels!.addRelationship(\n          tblRid,\n          \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table\",\n          `../tables/table${tableIdx}.xml`,\n        );\n\n        wsTableParts.push({ rId: `rId${tblRid}` });\n        allTableParts.push({ rId: `rId${tblRid}` });\n\n        ctx.contentTypes.addTable(tableIdx);\n      }\n    }\n\n    // Pre-render pivot table data into sheetData\n    if (hasPivots) {\n      const rendered = renderPivotSheetData(\n        pivotOpts,\n        worksheetConfigs,\n        ctx.sharedStrings,\n        sheetName,\n      );\n      if (rendered.sheetData.length > 0) {\n        // Replace empty <sheetData/> or <sheetData></sheetData> with rendered data\n        sheetXml = sheetXml.replace(/<sheetData\\/>|<sheetData><\\/sheetData>/, rendered.sheetData);\n        // Inject <dimension> before <sheetViews> (XSD sequence order: dimension before sheetViews)\n        if (!sheetXml.includes(\"<dimension\")) {\n          sheetXml = sheetXml.replace(\n            \"<sheetViews\",\n            `<dimension ref=\"${rendered.dimensionRef}\"/><sheetViews`,\n          );\n        }\n      }\n    }\n\n    // Insert tableParts before closing </worksheet> tag\n    if (wsTableParts.length > 0) {\n      const tablePartsXml = buildTablePartsXml(wsTableParts);\n      const closingTag = \"</worksheet>\";\n      sheetXml = sheetXml.slice(0, -closingTag.length) + tablePartsXml + closingTag;\n    }\n\n    // Write worksheet rels if needed\n    if (wsRels) {\n      mapping[`WorksheetRels${i}`] = {\n        data: XML_DECL + wsRels.serialize(),\n        path: `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\n      };\n    }\n\n    mapping[`Worksheet${i}`] = {\n      data: sheetXml,\n      path: `xl/worksheets/sheet${i + 1}.xml`,\n    };\n  }\n\n  // Chartsheets — chart-only sheets\n  for (const [i, csOpts] of chartsheetConfigs.entries()) {\n    // Register chart in the charts collection\n    const chartDef = csOpts.chart;\n    const csChartGlobalIdx = ctx.charts.array.length;\n    const csChartKey = `cs_chart_${csChartGlobalIdx}`;\n    ctx.charts.addChart(csChartKey, {\n      key: csChartKey,\n      chartSpaceXml:\n        chartSpaceDesc.stringify(\n          {\n            type: chartDef.type as\n              | \"column\"\n              | \"bar\"\n              | \"line\"\n              | \"pie\"\n              | \"doughnut\"\n              | \"area\"\n              | \"scatter\"\n              | \"bubble\",\n            title: chartDef.title,\n            categories: chartDef.categories,\n            series: chartDef.series,\n          },\n          ctx,\n        ) ?? \"\",\n    });\n\n    // Chartsheet relationships: drawing (required)\n    const csRels = new Relationships();\n    const csDrawingIdx = i + 1;\n    csRels.addRelationship(\n      1,\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n      `../drawings/drawing${csDrawingIdx}.xml`,\n    );\n\n    // Drawing rels: chart reference\n    const csDrawingRels = new Relationships();\n    csDrawingRels.addRelationship(\n      1,\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n      `../charts/chart${csChartGlobalIdx + 1}.xml`,\n    );\n\n    // Minimal drawing XML with chart anchor\n    const csDrawingXml =\n      `<xdr:wsDr xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">` +\n      `<xdr:absoluteAnchor>` +\n      `<xdr:pos x=\"0\" y=\"0\"/>` +\n      `<xdr:ext cx=\"9308969\" cy=\"6096000\"/>` +\n      `<xdr:graphicFrame>` +\n      `<xdr:nvGraphicFramePr><xdr:cNvPr id=\"1\" name=\"Chart ${i + 1}\"/><xdr:cNvGraphicFramePr><a:graphicFrameLocks noGrp=\"1\"/></xdr:cNvGraphicFramePr></xdr:nvGraphicFramePr>` +\n      `<xdr:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"9308969\" cy=\"6096000\"/></xdr:xfrm>` +\n      `<a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/chart\"><c:chart xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\" r:id=\"rId1\"/></a:graphicData></a:graphic>` +\n      `</xdr:graphicFrame>` +\n      `<xdr:clientData/>` +\n      `</xdr:absoluteAnchor>` +\n      `</xdr:wsDr>`;\n\n    mapping[`ChartsheetDrawing${i}`] = {\n      data: csDrawingXml,\n      path: `xl/drawings/drawing${csDrawingIdx}.xml`,\n    };\n    mapping[`ChartsheetDrawingRels${i}`] = {\n      data: XML_DECL + csDrawingRels.serialize(),\n      path: `xl/drawings/_rels/drawing${csDrawingIdx}.xml.rels`,\n    };\n    ctx.contentTypes.addDrawing(csDrawingIdx);\n\n    mapping[`ChartsheetRels${i}`] = {\n      data: XML_DECL + csRels.serialize(),\n      path: `xl/chartsheets/_rels/sheet${i + 1}.xml.rels`,\n    };\n    mapping[`Chartsheet${i}`] = {\n      data: XML_DECL + chartsheetDesc.stringify({ ...csOpts, drawingRId: \"rId1\" }, ctx),\n      path: `xl/chartsheets/sheet${i + 1}.xml`,\n    };\n    ctx.contentTypes.addChartsheet(i + 1);\n  }\n\n  // Workbook XML (via descriptor)\n  let wbXml =\n    workbookDesc.stringify(\n      {\n        sheets,\n        pivotCaches: ctx.pivotCacheRefs,\n        protection: options.workbookProtection,\n        customViews: options.customWorkbookViews,\n        fileRecoveryPr: options.fileRecoveryPr,\n        functionGroups: options.functionGroups,\n        webPublishing: options.webPublishing,\n        fileSharing: options.fileSharing,\n        volTypes: options.volTypes,\n        webPublishObjects: options.webPublishObjects,\n      },\n      ctx,\n    ) ?? \"\";\n\n  // External links — generate XML files and inject externalReferences into workbook\n  const extLinks = options.externalLinks ?? [];\n  if (extLinks.length > 0) {\n    const extRefs: { rId: string }[] = [];\n    for (let ei = 0; ei < extLinks.length; ei++) {\n      const elIdx = ei + 1;\n      const elRid = ctx.workbookRels.relationshipCount + 1;\n      ctx.workbookRels.addRelationship(\n        elRid,\n        \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink\",\n        `externalLinks/externalLink${elIdx}.xml`,\n      );\n\n      // Create the rels file for this external link\n      const elOpts = extLinks[ei];\n      if (!elOpts) continue;\n      let bookRId: string | undefined;\n      if (elOpts.externalBook?.target) {\n        const elRels = new Relationships();\n        elRels.addRelationship(\n          1,\n          \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath\",\n          elOpts.externalBook.target,\n          TargetModeType.EXTERNAL,\n        );\n        bookRId = \"rId1\";\n        mapping[`ExternalLinkRels${elIdx}`] = {\n          data: XML_DECL + elRels.serialize(),\n          path: `xl/externalLinks/_rels/externalLink${elIdx}.xml.rels`,\n        };\n      }\n\n      // Generate the external link XML\n      mapping[`ExternalLink${elIdx}`] = {\n        data: XML_DECL + externalLinkDesc.stringify({ ...elOpts, bookRId }, ctx),\n        path: `xl/externalLinks/externalLink${elIdx}.xml`,\n      };\n\n      extRefs.push({ rId: `rId${elRid}` });\n      ctx.contentTypes.addExternalLink(elIdx);\n    }\n\n    // Inject externalReferences into workbook XML\n    const extRefsXml = buildExternalReferencesXml(extRefs);\n    wbXml = wbXml.replace(\"<!--EXTERNAL_REFS-->\", extRefsXml);\n  } else {\n    wbXml = wbXml.replace(\"<!--EXTERNAL_REFS-->\", \"\");\n  }\n\n  mapping[\"Workbook\"] = {\n    data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${wbXml}`,\n    path: \"xl/workbook.xml\",\n  };\n\n  // Shared Strings — AFTER worksheets so all strings are collected\n  if (ctx.sharedStrings.count > 0) {\n    const ssXml = sharedStringsDesc.stringify(ctx.sharedStrings.toDescriptorOptions(), ctx);\n    mapping[\"SharedStrings\"] = {\n      data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${ssXml}`,\n      path: \"xl/sharedStrings.xml\",\n    };\n  }\n\n  // Styles (via descriptor — delegates to Styles.toXml internally)\n  const stylesXml = stylesDesc.stringify({ styles: ctx.styles }, ctx);\n  mapping[\"Styles\"] = {\n    data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${stylesXml}`,\n    path: \"xl/styles.xml\",\n  };\n\n  // Theme\n  mapping[\"Theme\"] = {\n    data: XML_DECL + createThemeXml(),\n    path: \"xl/theme/theme1.xml\",\n  };\n\n  // Charts — AFTER worksheets so charts are registered\n  for (const [i, chartData] of ctx.charts.array.entries()) {\n    mapping[`Chart${i}`] = {\n      data: XML_DECL + chartData.chartSpaceXml,\n      path: `xl/charts/chart${i + 1}.xml`,\n    };\n    ctx.contentTypes.addChart(i + 1);\n  }\n\n  // Calculation chain — auto-generated from formula cells\n  if (calcCells.length > 0) {\n    mapping[\"CalcChain\"] = {\n      data: calcChainDesc.stringify({ cells: calcCells }, ctx) ?? \"\",\n      path: \"xl/calcChain.xml\",\n    };\n    ctx.contentTypes.addCalcChain();\n    const calcChainRid = ctx.workbookRels.relationshipCount + 1;\n    ctx.workbookRels.addRelationship(\n      calcChainRid,\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\",\n      \"calcChain.xml\",\n    );\n  }\n\n  // Shared-workbook revisions (xl/revisionHeaders.xml + xl/revisions/revisionN.xml + xl/users.xml).\n  // CT_Workbook has no revision element — parts are discovered via workbook.xml.rels + [Content_Types].\n  if (options.revisionLog) {\n    const rl = options.revisionLog;\n    const REV_HEADERS_REL =\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionHeaders\";\n    const REV_LOG_REL =\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionLog\";\n    const USERS_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/users\";\n\n    // xl/revisionHeaders.xml — target of an implicit relationship from the workbook.\n    mapping[\"RevisionHeaders\"] = {\n      data: XML_DECL + (revisionHeadersDesc.stringify(rl.headers, ctx) ?? \"\"),\n      path: \"xl/revisionHeaders.xml\",\n    };\n    ctx.contentTypes.addRevisionHeaders();\n    ctx.workbookRels.addRelationship(\n      ctx.workbookRels.relationshipCount + 1,\n      REV_HEADERS_REL,\n      \"revisionHeaders.xml\",\n    );\n\n    // One revision log per header entry, plus revisionHeaders.xml.rels pointing to each.\n    const revHeadersRels = new Relationships();\n    for (const [i, log] of rl.logs.entries()) {\n      mapping[`RevisionLog${i}`] = {\n        data: XML_DECL + (revisionLogDesc.stringify(log, ctx) ?? \"\"),\n        path: `xl/revisions/revision${i + 1}.xml`,\n      };\n      ctx.contentTypes.addRevisionLog(i + 1);\n      revHeadersRels.addRelationship(i + 1, REV_LOG_REL, `revisions/revision${i + 1}.xml`);\n    }\n    mapping[\"RevisionHeadersRels\"] = {\n      data: XML_DECL + revHeadersRels.serialize(),\n      path: \"xl/_rels/revisionHeaders.xml.rels\",\n    };\n\n    // xl/users.xml (optional)\n    if (rl.users) {\n      const usersXml = usersDesc.stringify(rl.users, ctx);\n      if (usersXml) {\n        mapping[\"Users\"] = { data: XML_DECL + usersXml, path: \"xl/users.xml\" };\n        ctx.contentTypes.addUsers();\n        ctx.workbookRels.addRelationship(\n          ctx.workbookRels.relationshipCount + 1,\n          USERS_REL,\n          \"users.xml\",\n        );\n      }\n    }\n  }\n\n  // Workbook relationships — serialized after calcChain/revision register their\n  // targets, so every workbook-level relationship lands in workbook.xml.rels.\n  mapping[\"WorkbookRelationships\"] = {\n    data: XML_DECL + ctx.workbookRels.serialize(),\n    path: \"xl/_rels/workbook.xml.rels\",\n  };\n\n  // Register image content types\n  const imageExts = new Set<string>();\n  for (const img of ctx.media.array) {\n    const ext = img.fileName.endsWith(\".png\") ? \"png\" : \"jpeg\";\n    if (!imageExts.has(ext)) {\n      imageExts.add(ext);\n      ctx.contentTypes.addImageType(ext as \"png\" | \"jpeg\");\n    }\n  }\n\n  // Content Types — must be last\n  mapping[\"ContentTypes\"] = {\n    data: XML_DECL + ctx.contentTypes.serialize(),\n    path: \"[Content_Types].xml\",\n  };\n\n  // Convert mapping to Zippable\n  const mediaFiles: Array<{ data: Uint8Array; path: string }> = [];\n  for (const img of ctx.media.array) {\n    mediaFiles.push({ data: img.data, path: `xl/media/${img.fileName}` });\n  }\n\n  return compileMapping(mapping, overrides, mediaFiles, mediaLevel);\n}\n\n// ── Pure helper functions ──\n\nfunction buildFileRelationships(hasCustomProperties: boolean): Relationships {\n  const rels = new Relationships();\n  rels.addRelationship(\n    1,\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n    \"xl/workbook.xml\",\n  );\n  rels.addRelationship(\n    2,\n    \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n    \"docProps/core.xml\",\n  );\n  rels.addRelationship(\n    3,\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n    \"docProps/app.xml\",\n  );\n  if (hasCustomProperties) {\n    rels.addRelationship(\n      4,\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties\",\n      \"docProps/custom.xml\",\n    );\n  }\n  return rels;\n}\n\nfunction buildWorkbookRelationships(rels: Relationships, wsCount: number, csCount: number): void {\n  let rid = 1;\n  for (let i = 0; i < wsCount; i++) {\n    rels.addRelationship(\n      rid++,\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n      `worksheets/sheet${i + 1}.xml`,\n    );\n  }\n  for (let i = 0; i < csCount; i++) {\n    rels.addRelationship(\n      rid++,\n      \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet\",\n      `chartsheets/sheet${i + 1}.xml`,\n    );\n  }\n  rels.addRelationship(\n    rid++,\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n    \"styles.xml\",\n  );\n  rels.addRelationship(\n    rid++,\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n    \"theme/theme1.xml\",\n  );\n  rels.addRelationship(\n    rid++,\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n    \"sharedStrings.xml\",\n  );\n}\n\nfunction extractPivotSourceData(rows: RowOptions[], sourceRef: string): PivotSourceData {\n  const parts = sourceRef.split(\":\");\n  const startMatch = parts[0]?.match(/^([A-Z]+)(\\d+)$/);\n  const endMatch = parts[1]?.match(/^([A-Z]+)(\\d+)$/);\n  if (!startMatch) {\n    return { fieldNames: [], records: [] };\n  }\n\n  const startRow = parseInt(startMatch[2] ?? \"1\", 10) - 1;\n  const endRow = endMatch ? parseInt(endMatch[2] ?? \"1\", 10) - 1 : startRow;\n  const startCol = colLetterToIndex(startMatch[1] ?? \"A\");\n  const endCol = endMatch ? colLetterToIndex(endMatch[1] ?? \"A\") : startCol;\n  const colCount = endCol - startCol + 1;\n\n  // First row is headers\n  const headerRow = rows[startRow];\n  const fieldNames: string[] = [];\n  if (headerRow?.cells) {\n    for (let c = startCol; c <= endCol && c < headerRow.cells.length; c++) {\n      const hv = headerRow.cells[c]?.value;\n      fieldNames.push(\n        typeof hv === \"string\"\n          ? hv\n          : typeof hv === \"number\" || typeof hv === \"boolean\"\n            ? String(hv)\n            : `Col${c}`,\n      );\n    }\n  }\n\n  // Remaining rows are data\n  const records: (string | number)[][] = [];\n  for (let r = startRow + 1; r <= endRow; r++) {\n    const row = rows[r];\n    if (!row?.cells) continue;\n    const record: (string | number)[] = [];\n    for (let c = startCol; c <= endCol; c++) {\n      const val = row.cells[c]?.value;\n      if (typeof val === \"number\") {\n        record.push(val);\n      } else if (val instanceof Date) {\n        record.push(val.getTime());\n      } else {\n        record.push(typeof val === \"string\" ? val : typeof val === \"boolean\" ? String(val) : \"\");\n      }\n    }\n    if (record.length === colCount) {\n      records.push(record);\n    }\n  }\n\n  return { fieldNames, records };\n}\n\nfunction colLetterToIndex(letters: string): number {\n  let col = 0;\n  for (let i = 0; i < letters.length; i++) {\n    col = col * 26 + (letters.charCodeAt(i) - 64);\n  }\n  return col - 1;\n}\n\nfunction renderPivotSheetData(\n  pivotOpts: PivotTableOptions[],\n  worksheetConfigs: WorksheetOptions[],\n  sharedStrings: SharedStrings,\n  currentSheetName: string,\n): { sheetData: string; dimensionRef: string } {\n  const rowCells = new Map<number, string[]>();\n  let maxRow = 0;\n  let maxCol = 0;\n  let minRow = Infinity;\n  let minCol = Infinity;\n\n  for (const pt of pivotOpts) {\n    const location = pt.location ?? \"A3\";\n    const locMatch = location.match(/^([A-Z]+)(\\d+)$/);\n    if (!locMatch) continue;\n\n    const startCol = colLetterToIndex(locMatch[1] ?? \"A\");\n    const startRow = parseInt(locMatch[2] ?? \"1\", 10);\n    const rowFieldNames = pt.rows;\n    const dataFields = pt.data;\n\n    const sourceSheetName = pt.sourceSheet ?? currentSheetName;\n    const sourceWsIdx = worksheetConfigs.findIndex(\n      (ws) => (ws.name ?? `Sheet${worksheetConfigs.indexOf(ws) + 1}`) === sourceSheetName,\n    );\n    if (sourceWsIdx === -1) continue;\n\n    const sourceRows = worksheetConfigs[sourceWsIdx]?.rows ?? [];\n    const sourceData = extractPivotSourceData(sourceRows, pt.source);\n    if (sourceData.fieldNames.length === 0) continue;\n\n    const fields = sourceData.fieldNames;\n    const rowFieldIndices = rowFieldNames.map((n) => fields.indexOf(n));\n    const dataFieldIndices = dataFields.map((df) => fields.indexOf(df.field));\n\n    if (rowFieldIndices.some((idx) => idx === -1)) continue;\n    if (dataFieldIndices.some((idx) => idx === -1)) continue;\n\n    // Group records by row field values\n    const groupMap = new Map<string, { keys: (string | number)[]; values: number[][] }>();\n    for (const record of sourceData.records) {\n      const groupKey = rowFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n      let group = groupMap.get(groupKey);\n      if (!group) {\n        group = {\n          keys: rowFieldIndices.map((fi) => {\n            const v = record[fi];\n            return typeof v === \"string\" || typeof v === \"number\" ? v : String(v ?? \"\");\n          }),\n          values: dataFieldIndices.map(() => []),\n        };\n        groupMap.set(groupKey, group);\n      }\n      for (const [di, fi] of dataFieldIndices.entries()) {\n        const val = record[fi];\n        if (typeof val === \"number\") {\n          group.values[di]?.push(val);\n        }\n      }\n    }\n\n    // Column field info for cross-tab layout\n    const colFieldNames = pt.columns ?? [];\n    const colFieldIndices = colFieldNames.map((n) => fields.indexOf(n));\n\n    const addCells = (rowIdx: number, cells: string[]) => {\n      let arr = rowCells.get(rowIdx);\n      if (!arr) {\n        arr = [];\n        rowCells.set(rowIdx, arr);\n      }\n      for (const c of cells) arr.push(c);\n      minRow = Math.min(minRow, rowIdx);\n      maxRow = Math.max(maxRow, rowIdx);\n    };\n\n    if (colFieldIndices.length > 0 && !colFieldIndices.some((idx) => idx === -1)) {\n      // --- Cross-tab layout (with column fields) ---\n      // Unique column values for the first column field\n      const colUniqueVals = collectUniqueValues(sourceData.records, colFieldIndices[0] ?? 0).map(\n        (v) => (typeof v === \"string\" || typeof v === \"number\" ? String(v) : String(v ?? \"\")),\n      );\n\n      // Build cross-tab map: rowKey → colKey → aggregated values per data field\n      const crossTabMap = new Map<\n        string,\n        { rowKeys: (string | number)[]; colData: Map<string, number[][]>; rowTotals: number[][] }\n      >();\n      for (const record of sourceData.records) {\n        const rowKey = rowFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n        const colKey = colFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n        let entry = crossTabMap.get(rowKey);\n        if (!entry) {\n          entry = {\n            rowKeys: rowFieldIndices.map((fi) => {\n              const v = record[fi];\n              return typeof v === \"string\" || typeof v === \"number\" ? v : String(v ?? \"\");\n            }),\n            colData: new Map(),\n            rowTotals: dataFieldIndices.map(() => []),\n          };\n          crossTabMap.set(rowKey, entry);\n        }\n        let colValues = entry.colData.get(colKey);\n        if (!colValues) {\n          colValues = dataFieldIndices.map(() => []);\n          entry.colData.set(colKey, colValues);\n        }\n        for (const [di, fi] of dataFieldIndices.entries()) {\n          const val = record[fi];\n          if (typeof val === \"number\") {\n            colValues[di]?.push(val);\n            entry.rowTotals[di]?.push(val);\n          }\n        }\n      }\n\n      // Column count: row fields + column unique values + 1 (grand total column)\n      const numColVals = colUniqueVals.length;\n      const totalCols = rowFieldNames.length + numColVals + 1;\n      const endCol = startCol + totalCols - 1;\n      minCol = Math.min(minCol, startCol);\n      maxCol = Math.max(maxCol, endCol);\n\n      // Header row: [rowFieldName(s), ...colUniqueVals, dataFieldName or \"Grand Total\"]\n      const headerCells: string[] = [];\n      for (const rfName of rowFieldNames) {\n        const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n        const strIdx = sharedStrings.register(rfName);\n        headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n      }\n      for (const cv of colUniqueVals) {\n        const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n        const strIdx = sharedStrings.register(cv);\n        headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n      }\n      // Last header cell: data field name (e.g., \"Total Revenue\")\n      {\n        const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n        // Pivot layout requires at least one data field, so index 0 always exists.\n        const df0 = dataFields[0]!;\n        const subtotal = df0.summarize ?? \"sum\";\n        const dfName = df0.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df0.field}`;\n        const strIdx = sharedStrings.register(dfName);\n        headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n      }\n      addCells(startRow, headerCells);\n\n      // Data rows\n      let currentRow = startRow + 1;\n      for (const [, entry] of crossTabMap) {\n        const cells: string[] = [];\n        // Row label\n        for (const [ri, rowKey] of entry.rowKeys.entries()) {\n          const cellRef = colIndexToLetter(startCol + ri) + currentRow;\n          const strIdx = sharedStrings.register(String(rowKey));\n          cells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n        }\n        // Column values for each unique column value\n        for (const [ci, colKey] of colUniqueVals.entries()) {\n          const colValues = entry.colData.get(colKey);\n          const colOffset = rowFieldNames.length + ci;\n          const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n          const subtotal = dataFields[0]!.summarize ?? \"sum\";\n          const result = colValues ? aggregate(colValues[0] ?? [], subtotal) : 0;\n          cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n        }\n        // Row total (last column)\n        {\n          const colOffset = rowFieldNames.length + numColVals;\n          const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n          const subtotal = dataFields[0]!.summarize ?? \"sum\";\n          const result = aggregate(entry.rowTotals[0] ?? [], subtotal);\n          cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n        }\n        addCells(currentRow, cells);\n        currentRow++;\n      }\n\n      // Grand total row\n      const gtCells: string[] = [];\n      const gtStrIdx = sharedStrings.register(\"Grand Total\");\n      gtCells.push(\n        `<c r=\"${colIndexToLetter(startCol)}${currentRow}\" t=\"s\"><v>${gtStrIdx}</v></c>`,\n      );\n      for (const [ci, colKey] of colUniqueVals.entries()) {\n        const subtotal = dataFields[0]!.summarize ?? \"sum\";\n        const colAllValues: number[] = [];\n        const dfIdx0 = dataFieldIndices[0];\n        for (const record of sourceData.records) {\n          const recColKey = colFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n          if (recColKey === colKey && dfIdx0 !== undefined) {\n            const val = record[dfIdx0];\n            if (typeof val === \"number\") colAllValues.push(val);\n          }\n        }\n        const colOffset = rowFieldNames.length + ci;\n        const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n        const result = aggregate(colAllValues, subtotal);\n        gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n      }\n      // Grand total (bottom-right)\n      {\n        const subtotal = dataFields[0]!.summarize ?? \"sum\";\n        const dfIdx0 = dataFieldIndices[0];\n        const allValues = sourceData.records\n          .map((r) => (dfIdx0 !== undefined ? r[dfIdx0] : undefined))\n          .filter((v): v is number => typeof v === \"number\");\n        const colOffset = rowFieldNames.length + numColVals;\n        const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n        const result = aggregate(allValues, subtotal);\n        gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n      }\n      addCells(currentRow, gtCells);\n    } else {\n      // --- Simple layout (no column fields) ---\n      const endCol = startCol + rowFieldNames.length + dataFields.length - 1;\n      minCol = Math.min(minCol, startCol);\n      maxCol = Math.max(maxCol, endCol);\n\n      // Header row\n      const headerCells: string[] = [];\n      for (const rfName of rowFieldNames) {\n        const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n        const strIdx = sharedStrings.register(rfName);\n        headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n      }\n      for (const df of dataFields) {\n        const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n        const subtotal = df.summarize ?? \"sum\";\n        const dfName = df.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df.field}`;\n        const strIdx = sharedStrings.register(dfName);\n        headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n      }\n      addCells(startRow, headerCells);\n\n      // Data rows\n      let currentRow = startRow + 1;\n      for (const [, group] of groupMap) {\n        const cells: string[] = [];\n        for (const [ri, key] of group.keys.entries()) {\n          const cellRef = colIndexToLetter(startCol + ri) + currentRow;\n          const strIdx = sharedStrings.register(String(key));\n          cells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n        }\n        for (const [di, df] of dataFields.entries()) {\n          const colOffset = rowFieldNames.length + di;\n          const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n          const subtotal = df.summarize ?? \"sum\";\n          const result = aggregate(group.values[di] ?? [], subtotal);\n          cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n        }\n        addCells(currentRow, cells);\n        currentRow++;\n      }\n\n      // Grand total row\n      const gtCells: string[] = [];\n      const gtStrIdx = sharedStrings.register(\"Grand Total\");\n      gtCells.push(\n        `<c r=\"${colIndexToLetter(startCol)}${currentRow}\" t=\"s\"><v>${gtStrIdx}</v></c>`,\n      );\n      for (const [di, df] of dataFields.entries()) {\n        const colOffset = rowFieldNames.length + di;\n        const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n        const subtotal = df.summarize ?? \"sum\";\n        const dfIdx = dataFieldIndices[di];\n        const allValues = sourceData.records\n          .map((r) => (dfIdx !== undefined ? r[dfIdx] : undefined))\n          .filter((v): v is number => typeof v === \"number\");\n        const result = aggregate(allValues, subtotal);\n        gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n      }\n      addCells(currentRow, gtCells);\n    }\n  }\n\n  if (rowCells.size === 0) return { sheetData: \"\", dimensionRef: \"\" };\n\n  // Build sheetData\n  const parts: string[] = [\"<sheetData>\"];\n  const sortedRows = [...rowCells.entries()].sort((a, b) => a[0] - b[0]);\n  for (const [rowIdx, cells] of sortedRows) {\n    parts.push(`<row r=\"${rowIdx}\" x14ac:dyDescent=\"0.25\">`);\n    for (const c of cells) parts.push(c);\n    parts.push(\"</row>\");\n  }\n  parts.push(\"</sheetData>\");\n\n  const dimStartCol = colIndexToLetter(minCol === Infinity ? 0 : minCol);\n  const dimStartRow = minRow === Infinity ? 1 : minRow;\n  const dimensionRef = `${dimStartCol}${dimStartRow}:${colIndexToLetter(maxCol)}${maxRow}`;\n  return { sheetData: parts.join(\"\"), dimensionRef };\n}\n\nfunction colIndexToLetter(col: number): string {\n  let result = \"\";\n  let n = col + 1;\n  while (n > 0) {\n    n--;\n    result = String.fromCharCode(65 + (n % 26)) + result;\n    n = Math.floor(n / 26);\n  }\n  return result;\n}\n\nfunction columnToLetter(col: number): string {\n  let result = \"\";\n  let n = col;\n  while (n > 0) {\n    const remainder = (n - 1) % 26;\n    result = String.fromCharCode(65 + remainder) + result;\n    n = Math.floor((n - 1) / 26);\n  }\n  return result;\n}\n","/**\n * Pure function API for generating XLSX files.\n *\n * @module\n */\n\nimport { createPacker, OoxmlMimeType } from \"@office-open/core\";\nimport type { OutputByType, OutputType, PackerOptions } from \"@office-open/core\";\nimport type { WorkbookOptions } from \"@parts/file\";\n\nimport { compileWorkbook } from \"./compiler\";\n\n/** @internal Packer instance for XLSX generation. */\nconst Packer = createPacker<WorkbookOptions>({\n  compile: (options, overrides, mediaLevel) => compileWorkbook(options, overrides, mediaLevel),\n  mimeType: OoxmlMimeType.XLSX,\n});\n\n/**\n * Generate an XLSX file from pure JSON options.\n *\n * The output format is controlled by `packerOptions.type` (default: `\"nodebuffer\"` → Buffer).\n * For synchronous generation, use {@link generateWorkbookSync}. For streaming, use {@link generateWorkbookStream}.\n *\n * @param options - Workbook options (worksheets, styles, etc.)\n * @param packerOptions - Optional packer configuration (type, compression, overrides, etc.)\n *\n * @example\n * ```typescript\n * import { generateWorkbook } from \"@office-open/xlsx\";\n *\n * const buffer = await generateWorkbook({ worksheets: [...] });\n * const bytes = await generateWorkbook({ worksheets: [...] }, { type: \"uint8array\" });\n * const blob = await generateWorkbook({ worksheets: [...] }, { type: \"blob\" });\n * ```\n */\nexport function generateWorkbook<T extends OutputType = \"nodebuffer\">(\n  options: WorkbookOptions,\n  packerOptions?: PackerOptions<T>,\n): Promise<OutputByType[T]> {\n  return Packer.pack(options, packerOptions) as Promise<OutputByType[T]>;\n}\n\n/**\n * Synchronously generate an XLSX file from pure JSON options.\n */\nexport function generateWorkbookSync<T extends OutputType = \"nodebuffer\">(\n  options: WorkbookOptions,\n  packerOptions?: PackerOptions<T>,\n): OutputByType[T] {\n  return Packer.packSync(options, packerOptions) as OutputByType[T];\n}\n\n/**\n * Generate an XLSX file as a `ReadableStream<Uint8Array>`.\n */\nexport function generateWorkbookStream(\n  options: WorkbookOptions,\n  packerOptions?: PackerOptions,\n): ReadableStream<Uint8Array> {\n  return Packer.toStream(options, packerOptions);\n}\n"],"mappings":"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"}