{"version":3,"sources":["../src/reader/index.ts","../src/core/zip-manager.ts","../src/core/date-utils.ts","../src/core/row-height.ts","../src/core/borders.ts","../src/core/constants.ts","../src/core/style-manager.ts","../src/core/rows.ts","../src/core/cells.ts","../src/core/column-width.ts","../src/core/sheet-layout.ts","../src/core/cell-ref.ts","../src/core/hyperlinks.ts","../src/core/xml-templates.ts","../src/core/sheet-name.ts","../src/writer/validation.ts","../src/writer/hyperlink.ts","../src/writer/index.ts","../src/workbook/index.ts","../src/writer/stream.ts","../src/index.ts"],"sourcesContent":["import { XMLParser } from 'fast-xml-parser';\nimport { extractParts, validateExcelStructure } from '../core/zip-manager';\nimport {\n  EXCEL_LIMITS,\n  excelSerialToDate,\n  isDate,\n  isDateNumFmtId,\n  validateColIndex,\n  validateRowIndex,\n} from '../core/date-utils';\nimport { isRowHeight } from '../core/row-height';\nimport { BORDER_SIDES, BORDER_STYLES } from '../core/borders';\nimport type { BorderLine, BorderLines, BorderStyleName, ParsedBorder } from '../core/borders';\nimport type {\n  AutoFilter,\n  ParsedCellStyle,\n  CellValidation,\n  ConditionalFormat,\n  ConditionalFormatStyle,\n  ConditionalFormatOperator,\n  DataValidationOperator,\n  DataValidationType,\n  Hyperlink,\n  SheetLayout,\n  SheetState,\n} from '../core/types';\n\nexport interface ParsedCell {\n  value: any;\n  type: 'string' | 'number' | 'boolean' | 'date' | 'error' | 'empty';\n  coordinate: string;\n  rowIndex: number;\n  columnIndex: number;\n  formula?: string;\n}\n\nexport interface ParsedSheet extends SheetLayout {\n  name: string;\n  data: ParsedCell[][];\n  validations: CellValidation[];\n  state?: Exclude<SheetState, 'visible'>;\n  styles?: Record<string, ParsedCellStyle>;\n  mergeCells?: string[];\n  freezePane?: { row?: number; col?: number };\n  columnWidths?: number[];\n  conditionalFormats?: ConditionalFormat[];\n  autoFilter?: AutoFilter;\n  hyperlinks?: Hyperlink[];\n}\n\nexport interface ParsedWorkbook {\n  sheets: ParsedSheet[];\n  metadata: {\n    created?: string;\n    modified?: string;\n    creator?: string;\n    title?: string;\n    subject?: string;\n  };\n}\n\nconst isBorderStyleName = (style: unknown): style is BorderStyleName =>\n  BORDER_STYLES.includes(style as BorderStyleName);\n\ntype RawBorder = Partial<Record<(typeof BORDER_SIDES)[number], RawBorderSide>> | undefined;\n\ninterface RawBorderSide {\n  style?: string;\n  color?: { rgb?: string };\n}\n\ninterface DecodedFont {\n  bold?: boolean;\n  italic?: boolean;\n  underline?: boolean;\n  color?: string;\n  size?: number;\n  name?: string;\n}\n\ninterface DecodedFill {\n  fgColor?: string;\n  patternType?: string;\n}\n\ninterface DecodedXf {\n  fontId: number;\n  fillId: number;\n  borderId: number;\n  numFmtId: number;\n  alignment?: {\n    horizontal?: 'left' | 'center' | 'right';\n    vertical?: 'top' | 'middle' | 'bottom';\n    wrapText?: boolean;\n  };\n}\n\ninterface StyleSheetData {\n  fonts: DecodedFont[];\n  fills: DecodedFill[];\n  borders: (ParsedBorder | undefined)[];\n  customFormats: Record<number, string>;\n  cellXfs: DecodedXf[];\n  dateStyles: Set<number>;\n  dxfs: ConditionalFormatStyle[];\n}\n\nconst VALIDATION_TYPES = new Set([\n  'list',\n  'whole',\n  'decimal',\n  'textLength',\n  'date',\n  'time',\n  'custom',\n]);\n\nconst VALIDATION_OPERATORS = new Set([\n  'between',\n  'notBetween',\n  'equal',\n  'notEqual',\n  'greaterThan',\n  'lessThan',\n  'greaterThanOrEqual',\n  'lessThanOrEqual',\n]);\n\nconst toArray = <T>(value: T | T[] | undefined): T[] => {\n  if (value === undefined || value === null) return [];\n  return Array.isArray(value) ? value : [value];\n};\n\nexport const MAX_PLACEHOLDER_CELLS = 5_000_000;\n\nconst isFlag = (value: unknown): boolean => value === '1' || value === 'true';\n\nconst BUILT_IN_DATE_FORMATS: Record<number, string> = {\n  15: 'd-mmm-yy',\n  16: 'd-mmm',\n  17: 'mmm-yy',\n  18: 'h:mm AM/PM',\n  19: 'h:mm:ss AM/PM',\n  20: 'h:mm',\n  21: 'h:mm:ss',\n  22: 'm/d/yy h:mm',\n  45: 'mm:ss',\n  46: '[h]:mm:ss',\n  47: 'mmss.0',\n};\n\nconst STRUCTURAL_PARTS = new Set([\n  '[Content_Types].xml',\n  '_rels/.rels',\n  'xl/workbook.xml',\n  'xl/_rels/workbook.xml.rels',\n  'xl/sharedStrings.xml',\n  'xl/styles.xml',\n  'docProps/app.xml',\n  'docProps/core.xml',\n]);\n\nconst relsPathFor = (partPath: string): string =>\n  partPath.replace(/[^/]+$/, name => `_rels/${name}.rels`);\n\nconst loadSheetParts = (\n  buffer: Uint8Array,\n  files: Record<string, string>,\n  sheetPaths: Array<string | undefined>\n): void => {\n  const wanted = new Set<string>();\n  for (const path of sheetPaths) {\n    if (path) {\n      wanted.add(path);\n      wanted.add(relsPathFor(path));\n    }\n  }\n  Object.assign(\n    files,\n    extractParts(buffer, path => wanted.has(path))\n  );\n};\n\nexport class ExcelReader {\n  private parser: XMLParser;\n\n  constructor() {\n    this.parser = new XMLParser({\n      ignoreAttributes: false,\n      attributeNamePrefix: '',\n      textNodeName: '#text',\n      parseAttributeValue: false,\n      parseTagValue: false,\n      trimValues: false,\n    });\n  }\n\n  async parseFromFile(file: File): Promise<ParsedWorkbook> {\n    const buffer = new Uint8Array(await file.arrayBuffer());\n    return this.parseFromBuffer(buffer);\n  }\n\n  parseFromBuffer(buffer: Uint8Array): ParsedWorkbook {\n    try {\n      const files = extractParts(buffer, path => STRUCTURAL_PARTS.has(path));\n\n      if (!files['xl/workbook.xml']) {\n        throw new Error('Invalid Excel file structure');\n      }\n\n      const workbook = this.parser.parse(files['xl/workbook.xml']);\n      const sharedStrings = this.parseSharedStrings(files);\n      const styleSheet = this.parseStyleSheet(files);\n      const relMap = this.parseWorkbookRels(files);\n\n      const sheets: ParsedSheet[] = [];\n      const sheetElements = toArray(workbook.workbook?.sheets?.sheet);\n      const sheetPaths = sheetElements.map((sheetElement, index) =>\n        this.resolveSheetPath(sheetElement, relMap, index)\n      );\n      loadSheetParts(buffer, files, sheetPaths);\n\n      if (!validateExcelStructure(files)) {\n        throw new Error('Invalid Excel file structure');\n      }\n\n      const cellBudget = { placeholders: 0 };\n\n      sheetElements.forEach((sheetElement, index) => {\n        const sheetName = sheetElement.name ?? `Sheet${index + 1}`;\n        const sheetPath = sheetPaths[index];\n\n        if (sheetPath && files[sheetPath]) {\n          const sheetData = this.parseSheet(\n            files[sheetPath],\n            sharedStrings,\n            styleSheet,\n            cellBudget,\n            files[relsPathFor(sheetPath)]\n          );\n          const state = sheetElement.state;\n          sheets.push({\n            name: String(sheetName),\n            ...(state === 'hidden' || state === 'veryHidden' ? { state } : {}),\n            ...sheetData,\n          });\n        }\n      });\n\n      return {\n        sheets,\n        metadata: this.extractMetadata(files),\n      };\n    } catch (error) {\n      throw new Error(\n        `Failed to parse Excel file: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  private parseRelationships(relsXml?: string): Record<string, string> {\n    const map: Record<string, string> = {};\n    if (!relsXml) return map;\n\n    try {\n      const parsed = this.parser.parse(relsXml);\n      const rels = toArray(parsed.Relationships?.Relationship);\n      for (const rel of rels) {\n        if (!rel.Id || !rel.Target) continue;\n        map[String(rel.Id)] = String(rel.Target);\n      }\n    } catch {}\n\n    return map;\n  }\n\n  private parseWorkbookRels(files: Record<string, string>): Record<string, string> {\n    const map = this.parseRelationships(files['xl/_rels/workbook.xml.rels']);\n\n    for (const [id, target] of Object.entries(map)) {\n      map[id] = target.startsWith('/') ? target.slice(1) : `xl/${target}`;\n    }\n\n    return map;\n  }\n\n  private resolveSheetPath(\n    sheetElement: any,\n    relMap: Record<string, string>,\n    index: number\n  ): string | undefined {\n    const rId = sheetElement['r:id'] ?? sheetElement.id;\n    if (rId && relMap[String(rId)]) {\n      return relMap[String(rId)];\n    }\n\n    const sheetId = sheetElement.sheetId ?? index + 1;\n    return `xl/worksheets/sheet${sheetId}.xml`;\n  }\n\n  private parseSharedStrings(files: Record<string, string>): string[] {\n    const sharedStringsXml = files['xl/sharedStrings.xml'];\n    if (!sharedStringsXml) {\n      return [];\n    }\n\n    try {\n      const parsed = this.parser.parse(sharedStringsXml);\n      const items = toArray(parsed.sst?.si);\n      return items.map((item: any) => this.extractStringItem(item));\n    } catch {\n      return [];\n    }\n  }\n\n  private extractStringItem(item: any): string {\n    if (item == null) return '';\n    if (typeof item === 'string') return item;\n\n    if (item.t !== undefined) {\n      return this.extractText(item.t);\n    }\n    if (item.r !== undefined) {\n      return toArray(item.r)\n        .map((run: any) => this.extractText(run?.t))\n        .join('');\n    }\n    return '';\n  }\n\n  private extractText(t: any): string {\n    if (t == null) return '';\n    if (typeof t === 'object') {\n      return t['#text'] !== undefined ? String(t['#text']) : '';\n    }\n    return String(t);\n  }\n\n  private parseStyleSheet(files: Record<string, string>): StyleSheetData {\n    const result: StyleSheetData = {\n      fonts: [],\n      fills: [],\n      borders: [],\n      customFormats: {},\n      cellXfs: [],\n      dateStyles: new Set(),\n      dxfs: [],\n    };\n\n    const stylesXml = files['xl/styles.xml'];\n    if (!stylesXml) return result;\n\n    try {\n      const parsed = this.parser.parse(stylesXml);\n      const styleSheet = parsed.styleSheet;\n      if (!styleSheet) return result;\n\n      for (const fmt of toArray(styleSheet.numFmts?.numFmt)) {\n        if (fmt.numFmtId !== undefined && fmt.formatCode !== undefined) {\n          result.customFormats[Number(fmt.numFmtId)] = String(fmt.formatCode);\n        }\n      }\n\n      result.fonts = toArray(styleSheet.fonts?.font).map((font: any) => ({\n        bold: font?.b !== undefined,\n        italic: font?.i !== undefined,\n        underline: font?.u !== undefined,\n        color: font?.color?.rgb !== undefined ? String(font.color.rgb) : undefined,\n        size: font?.sz?.val !== undefined ? Number(font.sz.val) : undefined,\n        name: font?.name?.val !== undefined ? String(font.name.val) : undefined,\n      }));\n\n      result.fills = toArray(styleSheet.fills?.fill).map((fill: any) => {\n        const patternFill = fill?.patternFill;\n        return {\n          patternType: patternFill?.patternType,\n          fgColor:\n            patternFill?.fgColor?.rgb !== undefined ? String(patternFill.fgColor.rgb) : undefined,\n        };\n      });\n\n      result.borders = toArray(styleSheet.borders?.border).map(border => this.decodeBorder(border));\n\n      const xfs = toArray(styleSheet.cellXfs?.xf);\n      result.cellXfs = xfs.map((xf: any) => {\n        const alignment = xf?.alignment;\n        return {\n          fontId: xf?.fontId !== undefined ? Number(xf.fontId) : 0,\n          fillId: xf?.fillId !== undefined ? Number(xf.fillId) : 0,\n          borderId: xf?.borderId !== undefined ? Number(xf.borderId) : 0,\n          numFmtId: xf?.numFmtId !== undefined ? Number(xf.numFmtId) : 0,\n          alignment: alignment\n            ? {\n                horizontal: alignment.horizontal,\n                vertical: alignment.vertical === 'center' ? 'middle' : alignment.vertical,\n                wrapText: isFlag(alignment.wrapText),\n              }\n            : undefined,\n        };\n      });\n\n      result.cellXfs.forEach((xf, index) => {\n        if (isDateNumFmtId(xf.numFmtId, result.customFormats)) {\n          result.dateStyles.add(index);\n        }\n      });\n\n      result.dxfs = toArray(styleSheet.dxfs?.dxf).map((dxf: any) => {\n        const style: ConditionalFormatStyle = {};\n        const font = dxf?.font;\n        if (font) {\n          if (font.b !== undefined) style.bold = true;\n          if (font.i !== undefined) style.italic = true;\n          if (font.color?.rgb !== undefined) style.color = this.argbToHex(String(font.color.rgb));\n        }\n        const bgColor = dxf?.fill?.patternFill?.bgColor?.rgb;\n        if (bgColor !== undefined) style.background = this.argbToHex(String(bgColor));\n        return style;\n      });\n    } catch {}\n\n    return result;\n  }\n\n  private decodeBorder(border: RawBorder): ParsedBorder | undefined {\n    const lines: BorderLines = {};\n    let plain = 0;\n    for (const side of BORDER_SIDES) {\n      const { style, color } = border?.[side] ?? {};\n      if (!isBorderStyleName(style)) continue;\n      const line: BorderLine = { style };\n      const hex = color?.rgb === undefined ? '#000000' : this.argbToHex(String(color.rgb));\n      if (hex.toUpperCase() !== '#000000') line.color = hex;\n      lines[side] = line;\n      if (style === 'thin' && !line.color) plain++;\n    }\n    return plain === 4 ? true : Object.keys(lines).length > 0 ? lines : undefined;\n  }\n\n  private argbToHex(argb: string): string {\n    const hex = argb.length === 8 ? argb.slice(2) : argb;\n    return `#${hex}`;\n  }\n\n  private decodeCellStyle(\n    styleIndex: number | undefined,\n    styleSheet: StyleSheetData\n  ): ParsedCellStyle | undefined {\n    if (styleIndex === undefined) return undefined;\n\n    const xf = styleSheet.cellXfs[styleIndex];\n    if (!xf) return undefined;\n\n    const numberFormat =\n      styleSheet.customFormats[xf.numFmtId] ?? BUILT_IN_DATE_FORMATS[xf.numFmtId];\n    const isPlainDate =\n      styleSheet.dateStyles.has(styleIndex) &&\n      !numberFormat &&\n      !xf.fontId &&\n      !xf.fillId &&\n      !xf.borderId &&\n      !xf.alignment;\n    if (isPlainDate) return undefined;\n\n    const font = styleSheet.fonts[xf.fontId];\n    const fill = styleSheet.fills[xf.fillId];\n    const border = structuredClone(styleSheet.borders[xf.borderId]);\n\n    const style: ParsedCellStyle = {};\n\n    if (font?.bold) style.bold = true;\n    if (font?.italic) style.italic = true;\n    if (font?.underline) style.underline = true;\n    if (font?.color) style.color = this.argbToHex(font.color);\n    if (font?.size) style.fontSize = font.size;\n    if (font?.name) style.fontName = font.name;\n\n    if (fill?.patternType === 'solid' && fill.fgColor) {\n      style.background = this.argbToHex(fill.fgColor);\n    }\n\n    if (border) style.border = border;\n\n    if (xf.alignment) {\n      if (xf.alignment.horizontal) style.align = xf.alignment.horizontal;\n      if (xf.alignment.vertical) style.verticalAlign = xf.alignment.vertical;\n      if (xf.alignment.wrapText) style.wrapText = true;\n    }\n\n    if (numberFormat) style.numberFormat = numberFormat;\n\n    return Object.keys(style).length > 0 ? style : undefined;\n  }\n\n  private parseSheet(\n    sheetXml: string,\n    sharedStrings: string[],\n    styleSheet: StyleSheetData,\n    cellBudget: { placeholders: number },\n    relsXml?: string\n  ): Omit<ParsedSheet, 'name'> {\n    const parsed = this.parser.parse(sheetXml);\n    const worksheet = parsed.worksheet;\n\n    const rows = toArray(worksheet?.sheetData?.row);\n    const validations = toArray(worksheet?.dataValidations?.dataValidation);\n\n    const parsedValidations = validations\n      .map((validation: any) => this.parseValidation(validation))\n      .filter((validation): validation is CellValidation => validation !== undefined);\n\n    const data: ParsedCell[][] = [];\n    const styles: Record<string, ParsedCellStyle> = {};\n    const rowHeights: Record<number, number> = {};\n    const hiddenRows: number[] = [];\n\n    for (const rowElement of rows) {\n      const rowIndex = parseInt(rowElement.r, 10) - 1;\n      if (rowIndex >= EXCEL_LIMITS.MAX_ROWS) validateRowIndex(rowIndex);\n      if (rowIndex >= 0) {\n        const height = Number(rowElement.ht);\n        if (isFlag(rowElement.customHeight) && isRowHeight(height)) rowHeights[rowIndex] = height;\n        if (isFlag(rowElement.hidden)) hiddenRows.push(rowIndex);\n      }\n      const cells = toArray(rowElement.c);\n\n      const rowData: ParsedCell[] = [];\n      let maxCol = -1;\n      let filled = 0;\n\n      for (const cell of cells) {\n        const parsedCell = this.parseCell(cell, rowIndex, sharedStrings, styleSheet);\n        if (parsedCell.columnIndex >= 0 && !rowData[parsedCell.columnIndex]) filled++;\n        rowData[parsedCell.columnIndex] = parsedCell;\n        maxCol = Math.max(maxCol, parsedCell.columnIndex);\n\n        const styleIndex = cell.s !== undefined ? Number(cell.s) : undefined;\n        const decodedStyle = this.decodeCellStyle(styleIndex, styleSheet);\n        if (decodedStyle) {\n          styles[`${rowIndex}-${parsedCell.columnIndex}`] = decodedStyle;\n        }\n      }\n\n      cellBudget.placeholders += maxCol + 1 - filled;\n      if (cellBudget.placeholders > MAX_PLACEHOLDER_CELLS) {\n        throw new Error(\n          `Workbook pads more than ${MAX_PLACEHOLDER_CELLS} empty cells to keep rows rectangular`\n        );\n      }\n\n      for (let c = 0; c <= maxCol; c++) {\n        if (!rowData[c]) {\n          rowData[c] = {\n            value: null,\n            type: 'empty',\n            coordinate: `${this.columnIndexToLetter(c)}${rowIndex + 1}`,\n            rowIndex,\n            columnIndex: c,\n          };\n        }\n      }\n\n      data.push(rowData);\n    }\n\n    const mergeCells = toArray(worksheet?.mergeCells?.mergeCell)\n      .map((m: any) => (m?.ref !== undefined ? String(m.ref) : undefined))\n      .filter((ref): ref is string => ref !== undefined);\n\n    const freezePane = this.parseFreezePane(worksheet);\n    const columns = this.parseColumns(worksheet);\n    const conditionalFormats = this.parseConditionalFormats(worksheet, styleSheet);\n    const autoFilterRef = worksheet?.autoFilter?.ref;\n    const hyperlinks = this.parseHyperlinks(worksheet, relsXml);\n\n    return {\n      data,\n      validations: parsedValidations,\n      ...(Object.keys(styles).length > 0 ? { styles } : {}),\n      ...(mergeCells.length > 0 ? { mergeCells } : {}),\n      ...(freezePane ? { freezePane } : {}),\n      ...columns,\n      ...(Object.keys(rowHeights).length > 0 ? { rowHeights } : {}),\n      ...(hiddenRows.length > 0 ? { hiddenRows } : {}),\n      ...(conditionalFormats.length > 0 ? { conditionalFormats } : {}),\n      ...(autoFilterRef !== undefined ? { autoFilter: { range: String(autoFilterRef) } } : {}),\n      ...(hyperlinks.length > 0 ? { hyperlinks } : {}),\n    };\n  }\n\n  private parseValidation(validation: any): CellValidation | undefined {\n    const type = validation?.type;\n    if (!VALIDATION_TYPES.has(type) || validation.sqref === undefined) return undefined;\n\n    const formula1 =\n      validation.formula1 !== undefined ? this.extractText(validation.formula1) : undefined;\n    const formula2 =\n      validation.formula2 !== undefined ? this.extractText(validation.formula2) : undefined;\n    const base = {\n      range: String(validation.sqref),\n      type: type as DataValidationType,\n      allowBlank: isFlag(validation.allowBlank),\n    };\n\n    if (type === 'list') {\n      const literal = /^\"([\\s\\S]*)\"$/.exec(formula1 ?? '');\n      if (literal) return { ...base, options: literal[1].replace(/\"\"/g, '\"') };\n      return { ...base, options: formula1 ?? '', ...(formula1 !== undefined ? { formula1 } : {}) };\n    }\n\n    return {\n      ...base,\n      options: formula1 ?? '',\n      ...(VALIDATION_OPERATORS.has(validation.operator)\n        ? { operator: validation.operator as DataValidationOperator }\n        : {}),\n      ...(formula1 !== undefined ? { formula1 } : {}),\n      ...(formula2 !== undefined ? { formula2 } : {}),\n    };\n  }\n\n  private parseHyperlinks(worksheet: any, relsXml?: string): Hyperlink[] {\n    const entries = toArray(worksheet?.hyperlinks?.hyperlink);\n    if (entries.length === 0) return [];\n\n    const relationshipId = (entry: any) => entry?.['r:id'] ?? entry?.id;\n    const targets = entries.some(entry => relationshipId(entry) !== undefined)\n      ? this.parseRelationships(relsXml)\n      : {};\n\n    const links: Hyperlink[] = [];\n    for (const entry of entries) {\n      if (entry?.ref === undefined) continue;\n\n      const range = String(entry.ref);\n      const location = entry.location !== undefined ? String(entry.location) : undefined;\n      const extras = {\n        ...(entry.tooltip !== undefined ? { tooltip: String(entry.tooltip) } : {}),\n        ...(entry.display !== undefined ? { display: String(entry.display) } : {}),\n      };\n      const rId = relationshipId(entry);\n\n      if (rId !== undefined) {\n        const target = targets[String(rId)];\n        if (target === undefined) continue;\n        links.push({ range, url: location ? `${target}#${location}` : target, ...extras });\n      } else if (location) {\n        links.push({ range, location, ...extras });\n      }\n    }\n\n    return links;\n  }\n\n  private parseConditionalFormats(worksheet: any, styleSheet: StyleSheetData): ConditionalFormat[] {\n    const formats: ConditionalFormat[] = [];\n\n    for (const block of toArray(worksheet?.conditionalFormatting)) {\n      const range = block?.sqref !== undefined ? String(block.sqref) : '';\n      if (!range) continue;\n\n      for (const rule of toArray(block?.cfRule)) {\n        const cf = this.parseCfRule(rule, range, styleSheet);\n        if (cf) formats.push(cf);\n      }\n    }\n\n    return formats;\n  }\n\n  private parseCfRule(\n    rule: any,\n    range: string,\n    styleSheet: StyleSheetData\n  ): ConditionalFormat | undefined {\n    const type = rule?.type;\n\n    if (type === 'colorScale') {\n      const colors = toArray(rule?.colorScale?.color)\n        .map((c: any) => (c?.rgb !== undefined ? this.argbToHex(String(c.rgb)) : undefined))\n        .filter((c): c is string => c !== undefined);\n      if (colors.length === 2 || colors.length === 3) {\n        return {\n          type: 'colorScale',\n          range,\n          colors: colors as [string, string] | [string, string, string],\n        };\n      }\n      return undefined;\n    }\n\n    const style = styleSheet.dxfs[Number(rule?.dxfId ?? -1)] ?? {};\n\n    if (type === 'expression') {\n      return { type: 'expression', range, formula: this.extractText(rule?.formula), style };\n    }\n\n    if (type === 'cellIs') {\n      const formulas = toArray(rule?.formula).map((f: any) => this.parseCfValue(f));\n      return {\n        type: 'cellValue',\n        range,\n        operator: rule?.operator as ConditionalFormatOperator,\n        value: formulas[0],\n        ...(formulas.length > 1 ? { value2: formulas[1] } : {}),\n        style,\n      };\n    }\n\n    return undefined;\n  }\n\n  private parseCfValue(raw: any): number | string {\n    const value = raw && typeof raw === 'object' && raw['#text'] !== undefined ? raw['#text'] : raw;\n    const text = String(value ?? '');\n    if (text.startsWith('\"') && text.endsWith('\"')) return text.slice(1, -1);\n    const num = Number(text);\n    return text !== '' && !Number.isNaN(num) ? num : text;\n  }\n\n  private parseFreezePane(worksheet: any): { row?: number; col?: number } | undefined {\n    const sheetViews = toArray(worksheet?.sheetViews?.sheetView);\n    const pane = sheetViews[0]?.pane;\n    if (!pane) return undefined;\n\n    const col = pane.xSplit !== undefined ? Number(pane.xSplit) : 0;\n    const row = pane.ySplit !== undefined ? Number(pane.ySplit) : 0;\n    if (!col && !row) return undefined;\n\n    return { ...(row ? { row } : {}), ...(col ? { col } : {}) };\n  }\n\n  private parseColumns(worksheet: any): Pick<ParsedSheet, 'columnWidths' | 'hiddenColumns'> {\n    const cols = toArray(worksheet?.cols?.col);\n    if (cols.length === 0) return {};\n\n    const widths: number[] = [];\n    const hidden = new Set<number>();\n    cols.forEach((col: any) => {\n      const min = Math.max(Number(col.min) - 1, 0);\n      const max = Math.min(Number(col.max) - 1, EXCEL_LIMITS.MAX_COLS - 1);\n      const width = Number(col.width);\n      for (let c = min; c <= max; c++) {\n        if (Number.isFinite(width)) widths[c] = width;\n        if (isFlag(col.hidden)) hidden.add(c);\n      }\n    });\n\n    return {\n      columnWidths: widths,\n      ...(hidden.size > 0 ? { hiddenColumns: [...hidden].sort((a, b) => a - b) } : {}),\n    };\n  }\n\n  private parseCell(\n    cell: any,\n    rowIndex: number,\n    sharedStrings: string[],\n    styleSheet: StyleSheetData\n  ): ParsedCell {\n    const coordinate = String(cell.r ?? '');\n    const columnIndex = this.columnLetterToIndex(coordinate.replace(/\\d+/g, ''));\n    if (columnIndex >= EXCEL_LIMITS.MAX_COLS) validateColIndex(columnIndex);\n    const styleIndex = cell.s !== undefined ? Number(cell.s) : undefined;\n\n    let value: any = null;\n    let type: ParsedCell['type'] = 'empty';\n    let formula: string | undefined;\n\n    if (cell.f !== undefined) {\n      formula = this.extractText(cell.f);\n    }\n\n    if (cell.t === 'inlineStr' || (cell.t === undefined && cell.is !== undefined)) {\n      value = this.extractStringItem(cell.is);\n      type = 'string';\n    } else if (cell.v !== undefined) {\n      const raw = cell.v;\n\n      if (cell.t === 'b') {\n        value = raw === '1';\n        type = 'boolean';\n      } else if (cell.t === 's') {\n        value = sharedStrings[parseInt(raw, 10)] ?? '';\n        type = 'string';\n      } else if (cell.t === 'str') {\n        value = String(raw);\n        type = 'string';\n      } else if (cell.t === 'e') {\n        value = String(raw);\n        type = 'error';\n      } else if (raw !== '') {\n        const num = parseFloat(raw);\n        const date =\n          styleIndex !== undefined && styleSheet.dateStyles.has(styleIndex) && Number.isFinite(num)\n            ? excelSerialToDate(num)\n            : undefined;\n        if (!Number.isFinite(num)) {\n          value = '#NUM!';\n          type = 'error';\n        } else if (date && isDate(date)) {\n          value = date;\n          type = 'date';\n        } else {\n          value = num;\n          type = 'number';\n        }\n      }\n    }\n\n    return {\n      value,\n      type,\n      coordinate,\n      rowIndex,\n      columnIndex,\n      ...(formula !== undefined ? { formula } : {}),\n    };\n  }\n\n  private columnLetterToIndex(letters: string): number {\n    let index = 0;\n    for (let i = 0; i < letters.length; i++) {\n      index = index * 26 + (letters.charCodeAt(i) - 64);\n    }\n    return index - 1;\n  }\n\n  private columnIndexToLetter(index: number): string {\n    let letter = '';\n    let num = index + 1;\n    while (num > 0) {\n      const remainder = (num - 1) % 26;\n      letter = String.fromCharCode(65 + remainder) + letter;\n      num = Math.floor((num - 1) / 26);\n    }\n    return letter;\n  }\n\n  private extractMetadata(files: Record<string, string>): ParsedWorkbook['metadata'] {\n    const metadata: ParsedWorkbook['metadata'] = {};\n\n    try {\n      const appXml = files['docProps/app.xml'];\n      if (appXml) {\n        const parsed = this.parser.parse(appXml);\n        const properties = parsed.Properties;\n\n        if (properties) {\n          metadata.creator = properties.Creator;\n          metadata.created = properties.Created;\n          metadata.modified = properties.Modified;\n        }\n      }\n\n      const coreXml = files['docProps/core.xml'];\n      if (coreXml) {\n        const parsed = this.parser.parse(coreXml);\n        const core = parsed['cp:coreProperties'];\n        if (core) {\n          metadata.creator = this.extractText(core['dc:creator']) || metadata.creator;\n          metadata.created = this.extractText(core['dcterms:created']) || metadata.created;\n          metadata.modified = this.extractText(core['dcterms:modified']) || metadata.modified;\n          metadata.title = this.extractText(core['dc:title']) || undefined;\n          metadata.subject = this.extractText(core['dc:subject']) || undefined;\n        }\n      }\n    } catch {}\n\n    return metadata;\n  }\n}\n\nexport const parseExcel = (buffer: Uint8Array): ParsedWorkbook => {\n  const reader = new ExcelReader();\n  return reader.parseFromBuffer(buffer);\n};\n","import { zipSync, strToU8, unzipSync, strFromU8 } from 'fflate';\n\nexport interface ExcelFiles {\n  [path: string]: string;\n}\n\nexport const createExcelBlob = (files: ExcelFiles): Blob => {\n  const zipConfig: Record<string, Uint8Array> = {};\n\n  for (const [path, content] of Object.entries(files)) {\n    const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n    zipConfig[cleanPath] = strToU8(content);\n  }\n\n  const zipped = zipSync(zipConfig, { level: 6 });\n  const zippedArray = new Uint8Array(zipped);\n\n  if (typeof Blob !== 'undefined') {\n    return new Blob([zippedArray], {\n      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n    });\n  }\n\n  throw new Error(\n    'Blob is not available in this environment. Use createExcelBuffer() for Node.js.'\n  );\n};\n\nexport const createExcelBuffer = (files: ExcelFiles): Uint8Array => {\n  const zipConfig: Record<string, Uint8Array> = {};\n\n  for (const [path, content] of Object.entries(files)) {\n    const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n    zipConfig[cleanPath] = strToU8(content);\n  }\n\n  const result = zipSync(zipConfig, { level: 6 });\n\n  return new Uint8Array(result);\n};\n\nexport const extractParts = (\n  buffer: Uint8Array,\n  select?: (path: string) => boolean\n): ExcelFiles => {\n  try {\n    const unzipped = unzipSync(buffer, select ? { filter: ({ name }) => select(name) } : undefined);\n    const files: ExcelFiles = {};\n\n    for (const [path, content] of Object.entries(unzipped)) {\n      files[path] = strFromU8(content);\n    }\n\n    return files;\n  } catch {\n    throw new Error('Invalid Excel file: Unable to extract ZIP contents');\n  }\n};\n\nexport const extractExcelFiles = (buffer: Uint8Array): ExcelFiles => extractParts(buffer);\n\nexport const validateExcelStructure = (files: ExcelFiles): boolean => {\n  const requiredFiles = ['[Content_Types].xml', '_rels/.rels', 'xl/workbook.xml'];\n\n  const hasRequired = requiredFiles.every(file => files[file]);\n  const hasWorksheet = Object.keys(files).some(path => /^xl\\/worksheets\\/.+\\.xml$/.test(path));\n\n  return hasRequired && hasWorksheet;\n};\n","const MS_PER_DAY = 24 * 60 * 60 * 1000;\nconst EXCEL_EPOCH_UTC = Date.UTC(1899, 11, 30);\n\nexport function dateToExcelSerial(date: Date): number {\n  const utc = Date.UTC(\n    date.getFullYear(),\n    date.getMonth(),\n    date.getDate(),\n    date.getHours(),\n    date.getMinutes(),\n    date.getSeconds(),\n    date.getMilliseconds()\n  );\n\n  return (utc - EXCEL_EPOCH_UTC) / MS_PER_DAY;\n}\n\nexport function excelSerialToDate(serial: number): Date {\n  const utc = new Date(EXCEL_EPOCH_UTC + serial * MS_PER_DAY);\n\n  return new Date(\n    utc.getUTCFullYear(),\n    utc.getUTCMonth(),\n    utc.getUTCDate(),\n    utc.getUTCHours(),\n    utc.getUTCMinutes(),\n    utc.getUTCSeconds(),\n    utc.getUTCMilliseconds()\n  );\n}\n\nexport function isDate(value: unknown): value is Date {\n  return value instanceof Date && !isNaN(value.getTime());\n}\n\nconst BUILTIN_DATE_NUMFMT_IDS = new Set([14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47]);\n\nexport function isDateNumFmtId(\n  numFmtId: number,\n  customFormats: Record<number, string> = {}\n): boolean {\n  if (BUILTIN_DATE_NUMFMT_IDS.has(numFmtId)) {\n    return true;\n  }\n  const code = customFormats[numFmtId];\n  return code ? isDateFormatCode(code) : false;\n}\n\nexport function isDateFormatCode(code: string): boolean {\n  const stripped = code\n    .replace(/\"[^\"]*\"/g, '')\n    .replace(/\\[[^\\]]*\\]/g, '')\n    .replace(/\\\\./g, '');\n  return /[ymdhs]/i.test(stripped);\n}\n\nexport const EXCEL_LIMITS = {\n  MAX_ROWS: 1048576,\n  MAX_COLS: 16384,\n  MAX_CELL_LENGTH: 32767,\n  MAX_HYPERLINKS: 65530,\n  MAX_HYPERLINK_LENGTH: 2079,\n} as const;\n\nexport function validateRowIndex(row: number): void {\n  if (row < 0 || row >= EXCEL_LIMITS.MAX_ROWS) {\n    throw new Error(`Row index ${row} exceeds Excel limit (0-${EXCEL_LIMITS.MAX_ROWS - 1})`);\n  }\n}\n\nexport function validateColIndex(col: number): void {\n  if (col < 0 || col >= EXCEL_LIMITS.MAX_COLS) {\n    throw new Error(`Column index ${col} exceeds Excel limit (0-${EXCEL_LIMITS.MAX_COLS - 1})`);\n  }\n}\n\nexport function validateCellValue(value: string): void {\n  if (value.length > EXCEL_LIMITS.MAX_CELL_LENGTH) {\n    throw new Error(\n      `Cell value length ${value.length} exceeds Excel limit (${EXCEL_LIMITS.MAX_CELL_LENGTH})`\n    );\n  }\n}\n","export const MAX_ROW_HEIGHT = 409.5;\n\nexport const isRowHeight = (height: unknown): height is number =>\n  typeof height === 'number' && height > 0 && height <= MAX_ROW_HEIGHT;\n","export const BORDER_STYLES = [\n  'thin',\n  'medium',\n  'thick',\n  'dashed',\n  'dotted',\n  'double',\n  'hair',\n  'mediumDashed',\n  'dashDot',\n  'mediumDashDot',\n  'dashDotDot',\n  'mediumDashDotDot',\n  'slantDashDot',\n] as const;\n\nexport const BORDER_SIDES = ['left', 'right', 'top', 'bottom'] as const;\n\nexport type BorderStyleName = (typeof BORDER_STYLES)[number];\n\nexport type BorderSideName = (typeof BORDER_SIDES)[number];\n\nexport interface BorderLine {\n  style: BorderStyleName;\n  color?: string;\n}\n\nexport type BorderSide = BorderStyleName | BorderLine;\n\nexport type BorderLines = { [side in BorderSideName]?: BorderLine };\n\nexport type BorderSides = { [side in BorderSideName]?: BorderSide } & {\n  style?: never;\n  color?: never;\n};\n\nexport type ParsedBorder = true | BorderLines;\n\nexport type CellBorder = boolean | BorderSide | BorderSides;\n","export const XML_NS = {\n  spreadsheetml: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n  relationships: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n  main_rel: 'http://schemas.openxmlformats.org/package/2006/relationships',\n  content_types: 'http://schemas.openxmlformats.org/package/2006/content-types',\n} as const;\n\nexport const CONTENT_TYPES = {\n  XML: 'application/xml',\n  RELATIONSHIPS: 'application/vnd.openxmlformats-package.relationships+xml',\n  SPREADSHEETML: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',\n  WORKSHEET: 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',\n  SHARED_STRINGS: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',\n  STYLES: 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',\n} as const;\n\nexport const RELATIONSHIP_TYPES = {\n  WORKSHEET: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',\n  SHARED_STRINGS:\n    'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',\n  STYLES: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',\n} as const;\n\nexport const CELL_TYPES = {\n  INLINE_STRING: 'inlineStr',\n  SHARED_STRING: 's',\n  NUMBER: 'n',\n  BOOLEAN: 'b',\n  ERROR: 'e',\n} as const;\n","import { BORDER_SIDES, BORDER_STYLES } from './borders';\nimport type { BorderLine, BorderSide, BorderSides } from './borders';\nimport { isDateFormatCode } from './date-utils';\nimport { CellStyle, ConditionalFormatStyle } from './types';\n\nexport function normalizeColor(color: string): string {\n  const match = /^#?([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(color);\n  if (!match) {\n    throw new Error(`Invalid colour \"${color}\": use #RGB, #RRGGBB or #AARRGGBB`);\n  }\n  let normalized = match[1];\n\n  if (normalized.length === 3) {\n    normalized = normalized\n      .split('')\n      .map(c => c + c)\n      .join('');\n  }\n\n  if (normalized.length === 6) {\n    normalized = 'FF' + normalized;\n  }\n\n  return normalized.toUpperCase();\n}\n\nexport interface CellAlignment {\n  horizontal?: 'left' | 'center' | 'right';\n  vertical?: 'top' | 'middle' | 'bottom';\n  wrapText?: boolean;\n}\n\nexport interface ExcelStyle {\n  fontId: number;\n  fillId: number;\n  borderId: number;\n  numFmtId: number;\n  applyFont?: boolean;\n  applyFill?: boolean;\n  applyBorder?: boolean;\n  applyNumberFormat?: boolean;\n  alignment?: CellAlignment;\n}\n\nexport interface Font {\n  bold?: boolean;\n  italic?: boolean;\n  underline?: boolean;\n  color?: string;\n  size?: number;\n  name?: string;\n}\n\nexport interface Fill {\n  fgColor?: string;\n  bgColor?: string;\n  patternType?: string;\n}\n\nexport interface Border {\n  left?: boolean;\n  right?: boolean;\n  top?: boolean;\n  bottom?: boolean;\n  color?: string;\n}\n\ntype Table = Map<string, number>;\n\nconst FIRST_CUSTOM_NUM_FMT_ID = 164;\nconst BUILT_IN_DATE_NUM_FMT_ID = 14;\n\ntype ApplyFlags = Partial<\n  Record<\n    'applyFont' | 'applyFill' | 'applyBorder' | 'applyNumberFormat' | 'applyAlignment',\n    unknown\n  >\n>;\n\nconst KEYED_STYLE_FIELDS: Record<keyof CellStyle, true> = {\n  background: true,\n  border: true,\n  bold: true,\n  italic: true,\n  underline: true,\n  color: true,\n  fontSize: true,\n  fontName: true,\n  align: true,\n  verticalAlign: true,\n  wrapText: true,\n  numberFormat: true,\n};\n\nconst STYLE_FIELDS = Object.keys(KEYED_STYLE_FIELDS) as (keyof CellStyle)[];\n\nconst intern = (table: Table, xml: string): number => {\n  let id = table.get(xml);\n  if (id === undefined) {\n    id = table.size;\n    table.set(xml, id);\n  }\n  return id;\n};\n\nconst joinEntries = (table: Table): string => Array.from(table.keys()).join('\\n');\n\nconst escapeAttr = (text: string): string =>\n  text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nconst indentedLines = (...lines: unknown[]): string =>\n  lines\n    .filter(Boolean)\n    .map(line => `\\n      ${line}`)\n    .join('');\n\nconst fontXml = ({ bold, italic, underline, color, fontSize, fontName }: CellStyle): string =>\n  '    <font>' +\n  indentedLines(\n    bold && '<b/>',\n    italic && '<i/>',\n    underline && '<u/>',\n    `<sz val=\"${fontSize || 11}\"/>`,\n    color && `<color rgb=\"${normalizeColor(color)}\"/>`,\n    `<name val=\"${escapeAttr(fontName || 'Calibri')}\"/>`\n  ) +\n  '\\n    </font>';\n\nconst fillXml = (background?: string): string =>\n  `    <fill>\\n      <patternFill patternType=\"${background ? 'solid' : 'none'}\"${\n    background\n      ? `>\\n        <fgColor rgb=\"${normalizeColor(background)}\"/>\\n      </patternFill>`\n      : '/>'\n  }\\n    </fill>`;\n\nconst OPAQUE_BLACK = 'FF000000';\n\nconst borderSideXml = (side: string, spec?: BorderSide): string => {\n  if (!spec) return `<${side}/>`;\n  const { style, color }: Partial<BorderLine> = typeof spec === 'string' ? { style: spec } : spec;\n  if (!style || !BORDER_STYLES.includes(style)) {\n    throw new Error(\n      `Invalid border style \"${style ?? JSON.stringify(spec)}\": use ${BORDER_STYLES.join(', ')}`\n    );\n  }\n  return `<${side} style=\"${style}\"><color rgb=\"${color ? normalizeColor(color) : OPAQUE_BLACK}\"/></${side}>`;\n};\n\nconst isPerSide = (border: BorderSide | BorderSides): border is BorderSides =>\n  typeof border === 'object' && border.style === undefined && border.color === undefined;\n\nconst borderXml = (border: CellStyle['border'] = false): string => {\n  const whole = border === true ? 'thin' : border;\n  const sides: BorderSides = !whole\n    ? {}\n    : isPerSide(whole)\n      ? whole\n      : { left: whole, right: whole, top: whole, bottom: whole };\n  return (\n    '    <border>' +\n    BORDER_SIDES.map(side => borderSideXml(side, sides[side])).join('') +\n    '\\n      <diagonal/>\\n    </border>'\n  );\n};\n\nconst alignmentXml = ({ align, verticalAlign, wrapText }: CellStyle): string =>\n  align || verticalAlign || wrapText\n    ? `<alignment${align ? ` horizontal=\"${escapeAttr(align)}\"` : ''}${\n        verticalAlign\n          ? ` vertical=\"${escapeAttr(verticalAlign === 'middle' ? 'center' : verticalAlign)}\"`\n          : ''\n      }${wrapText ? ' wrapText=\"1\"' : ''}/>`\n    : '';\n\nconst dxfXml = ({ bold, italic, color, background }: ConditionalFormatStyle): string => {\n  const font =\n    bold || italic || color\n      ? `<font>${bold ? '<b/>' : ''}${italic ? '<i/>' : ''}${color ? `<color rgb=\"${normalizeColor(color)}\"/>` : ''}</font>`\n      : '';\n  const fill = background\n    ? `<fill><patternFill><bgColor rgb=\"${normalizeColor(background)}\"/></patternFill></fill>`\n    : '';\n  return `    <dxf>${font}${fill}</dxf>`;\n};\n\nconst styleKey = (style: CellStyle): string =>\n  JSON.stringify(STYLE_FIELDS.map(field => style[field]));\n\nexport class StyleManager {\n  private fonts: Table = new Map();\n  private fills: Table = new Map();\n  private borders: Table = new Map();\n  private numFmts: Table = new Map();\n  private dxfs: Table = new Map();\n  private cellXfs: Table = new Map();\n  private styleIds: Map<string, number> = new Map();\n\n  constructor() {\n    intern(this.fonts, fontXml({}));\n    intern(this.fills, fillXml());\n    intern(this.fills, '    <fill>\\n      <patternFill patternType=\"gray125\"/>\\n    </fill>');\n    intern(this.borders, borderXml());\n    this.internXf(0, 0, 0, 0);\n  }\n\n  getStyleId(style: CellStyle): number {\n    const key = styleKey(style);\n    let id = this.styleIds.get(key);\n    if (id === undefined) {\n      id = this.registerStyle(style);\n      this.styleIds.set(key, id);\n    }\n    return id;\n  }\n\n  getDateStyleId(style?: CellStyle): number {\n    const key = style ? `date${styleKey(style)}` : 'date';\n    let id = this.styleIds.get(key);\n    if (id === undefined) {\n      id = this.registerStyle(style ?? {}, BUILT_IN_DATE_NUM_FMT_ID);\n      this.styleIds.set(key, id);\n    }\n    return id;\n  }\n\n  private registerStyle(style: CellStyle, defaultNumFmtId = 0): number {\n    const { background, bold, italic, underline, color, fontSize, fontName } = style;\n    const numberFormat =\n      defaultNumFmtId && style.numberFormat && !isDateFormatCode(style.numberFormat)\n        ? undefined\n        : style.numberFormat;\n    const alignment = alignmentXml(style);\n    const fontId = intern(this.fonts, fontXml(style));\n    const fillId = intern(this.fills, fillXml(background));\n    const borderId = intern(this.borders, borderXml(style.border));\n    const numFmtId = numberFormat\n      ? FIRST_CUSTOM_NUM_FMT_ID + intern(this.numFmts, numberFormat)\n      : defaultNumFmtId;\n    return this.internXf(\n      fontId,\n      fillId,\n      borderId,\n      numFmtId,\n      {\n        applyFont: bold || italic || underline || color || fontSize || fontName,\n        applyFill: background,\n        applyBorder: borderId,\n        applyNumberFormat: numFmtId,\n        applyAlignment: alignment,\n      },\n      alignment\n    );\n  }\n\n  private internXf(\n    fontId: number,\n    fillId: number,\n    borderId: number,\n    numFmtId: number,\n    applied: ApplyFlags = {},\n    alignment = ''\n  ): number {\n    const flags = Object.entries(applied)\n      .filter(([, enabled]) => enabled)\n      .map(([flag]) => ` ${flag}=\"1\"`)\n      .join('');\n    const open = `    <xf numFmtId=\"${numFmtId}\" fontId=\"${fontId}\" fillId=\"${fillId}\" borderId=\"${borderId}\" xfId=\"0\"${flags}`;\n    return intern(\n      this.cellXfs,\n      alignment ? `${open}>\\n      ${alignment}\\n    </xf>` : `${open}/>`\n    );\n  }\n\n  generateFontsXml(): string {\n    return joinEntries(this.fonts);\n  }\n\n  generateFillsXml(): string {\n    return joinEntries(this.fills);\n  }\n\n  generateBordersXml(): string {\n    return joinEntries(this.borders);\n  }\n\n  generateCellXfsXml(): string {\n    return joinEntries(this.cellXfs);\n  }\n\n  generateNumFmtsXml(): string {\n    return Array.from(\n      this.numFmts.keys(),\n      (code, index) =>\n        `    <numFmt numFmtId=\"${FIRST_CUSTOM_NUM_FMT_ID + index}\" formatCode=\"${escapeAttr(code)}\"/>`\n    ).join('\\n');\n  }\n\n  getNumFmtsCount(): number {\n    return this.numFmts.size;\n  }\n\n  getDxfId(style: ConditionalFormatStyle): number {\n    return intern(this.dxfs, dxfXml(style));\n  }\n\n  generateDxfsXml(): string {\n    return joinEntries(this.dxfs);\n  }\n\n  getDxfsCount(): number {\n    return this.dxfs.size;\n  }\n\n  getFontsCount(): number {\n    return this.fonts.size;\n  }\n\n  getFillsCount(): number {\n    return this.fills.size;\n  }\n\n  getBordersCount(): number {\n    return this.borders.size;\n  }\n\n  getCellXfsCount(): number {\n    return this.cellXfs.size;\n  }\n}\n","export const rowIndexes = (rows: object): number[] => Object.keys(rows).map(Number);\n","import { CellValue, ExcelErrorValue, FormulaResult } from './types';\n\nexport const EXCEL_ERRORS = [\n  '#NULL!',\n  '#DIV/0!',\n  '#VALUE!',\n  '#REF!',\n  '#NAME?',\n  '#NUM!',\n  '#N/A',\n] as const;\n\nexport const isExcelError = (value: unknown): value is ExcelErrorValue =>\n  EXCEL_ERRORS.includes(value as ExcelErrorValue);\n\nexport interface CellParts {\n  formula?: string;\n  value: FormulaResult | null | undefined;\n}\n\nexport const splitCell = (cell: CellValue): CellParts => {\n  if (typeof cell === 'string') {\n    return cell.startsWith('=')\n      ? { formula: cell.substring(1), value: undefined }\n      : { value: cell };\n  }\n  if (typeof cell === 'object' && cell !== null && !(cell instanceof Date)) {\n    if (typeof cell.formula === 'string') {\n      return { formula: cell.formula.replace(/^=/, ''), value: cell.result };\n    }\n    if (typeof cell.text === 'string') return { value: cell.text };\n  }\n  return { value: cell as FormulaResult | null | undefined };\n};\n","import { rowIndexes } from './rows';\nimport { splitCell } from './cells';\nimport { CellValue } from './types';\n\nconst displayedText = (cell: CellValue): string => {\n  const { formula, value } = splitCell(cell);\n  const shown = value ?? (formula === undefined ? undefined : `=${formula}`);\n  return (typeof shown === 'object' && 'error' in shown ? shown.error : shown)?.toString() || '';\n};\n\nexport function calculateColumnWidths(data: any[][]): number[] {\n  const widths: number[] = [];\n  let maxCols = 0;\n\n  rowIndexes(data).forEach(index => {\n    const row = data[index];\n    maxCols = Math.max(maxCols, row.length);\n    row.forEach((cell, colIndex) => {\n      const cellText = displayedText(cell);\n      widths[colIndex] = Math.max(widths[colIndex] ?? 0, estimateTextWidth(cellText));\n    });\n  });\n\n  return Array.from({ length: maxCols }, (_, colIndex) =>\n    Math.min(Math.max(widths[colIndex] ?? 0, 8), 50)\n  );\n}\n\nfunction estimateTextWidth(text: string): number {\n  if (!text) return 8;\n\n  let width = text.length * 1.2;\n\n  const wideChars = text.match(/[WMm@]/g);\n  if (wideChars) {\n    width += wideChars.length * 0.5;\n  }\n\n  width += 2;\n\n  return Math.ceil(width);\n}\n\nconst DEFAULT_COLUMN_WIDTH = 9.140625;\n\nexport function generateColsXml(\n  widths: number[],\n  { hiddenColumns = [] }: { hiddenColumns?: Iterable<number> } = {}\n): string {\n  const hidden = new Set(hiddenColumns);\n  const columns = widths.slice();\n  hidden.forEach(index => {\n    columns[index] ??= DEFAULT_COLUMN_WIDTH;\n  });\n\n  if (columns.length === 0) return '';\n\n  const colsXml = columns\n    .map((width, index) => {\n      const colNum = index + 1;\n      const hiddenAttr = hidden.has(index) ? ' hidden=\"1\"' : '';\n      return `    <col min=\"${colNum}\" max=\"${colNum}\" width=\"${width}\" customWidth=\"1\"${hiddenAttr}/>`;\n    })\n    .join('\\n');\n\n  return `  <cols>\\n${colsXml}\\n  </cols>`;\n}\n","import { EXCEL_LIMITS } from './date-utils';\nimport { MAX_ROW_HEIGHT, isRowHeight } from './row-height';\nimport { rowIndexes } from './rows';\nimport type { SheetLayout } from './types';\n\nexport interface PreparedLayout {\n  rows: number[];\n  hiddenColumns: Set<number>;\n  rowAttributes: (rowIndex: number) => string;\n}\n\nconst checkIndex = (kind: string, index: number, limit: number): void => {\n  if (!Number.isInteger(index) || index < 0 || index >= limit) {\n    throw new Error(`${kind} index ${index} must be a whole number from 0 to ${limit - 1}`);\n  }\n};\n\nexport const prepareLayout = ({\n  rowHeights = {},\n  hiddenRows = [],\n  hiddenColumns = [],\n}: SheetLayout): PreparedLayout => {\n  const heightRows = rowIndexes(rowHeights);\n  const hiddenRowSet = new Set(hiddenRows);\n  const hiddenColumnSet = new Set(hiddenColumns);\n\n  heightRows.forEach(row => {\n    checkIndex('Row', row, EXCEL_LIMITS.MAX_ROWS);\n    if (!isRowHeight(rowHeights[row])) {\n      throw new Error(\n        `Row ${row + 1} height ${rowHeights[row]} must be above 0 and at most ${MAX_ROW_HEIGHT} points`\n      );\n    }\n  });\n  hiddenRowSet.forEach(row => checkIndex('Row', row, EXCEL_LIMITS.MAX_ROWS));\n  hiddenColumnSet.forEach(column => checkIndex('Column', column, EXCEL_LIMITS.MAX_COLS));\n\n  return {\n    rows: [...new Set([...heightRows, ...hiddenRowSet])].sort((a, b) => a - b),\n    hiddenColumns: hiddenColumnSet,\n    rowAttributes: row =>\n      (rowHeights[row] ? ` ht=\"${rowHeights[row]}\" customHeight=\"1\"` : '') +\n      (hiddenRowSet.has(row) ? ' hidden=\"1\"' : ''),\n  };\n};\n","import { validateRowIndex, validateColIndex } from './date-utils';\n\nexport interface CellCoord {\n  row: number;\n  col: number;\n}\n\nexport interface CellRange {\n  start: CellCoord;\n  end: CellCoord;\n}\n\nconst CELL_REF = /^\\$?([A-Z]{1,3})\\$?([1-9]\\d*)$/i;\n\nexport const indexToColumnLetter = (index: number): string => {\n  let letter = '';\n  let num = index + 1;\n\n  while (num > 0) {\n    const remainder = (num - 1) % 26;\n    letter = String.fromCharCode(65 + remainder) + letter;\n    num = Math.floor((num - 1) / 26);\n  }\n\n  return letter;\n};\n\nexport const columnLetterToIndex = (letters: string): number => {\n  let index = 0;\n  for (let i = 0; i < letters.length; i++) {\n    index = index * 26 + (letters.charCodeAt(i) - 64);\n  }\n  return index - 1;\n};\n\nexport const coordinateToIndex = (coordinate: string): CellCoord => {\n  const match = coordinate.match(/^([A-Z]+)(\\d+)$/);\n  if (!match) {\n    throw new Error(`Invalid coordinate format: ${coordinate}`);\n  }\n\n  return { row: parseInt(match[2]) - 1, col: columnLetterToIndex(match[1]) };\n};\n\nexport const indexToCoordinate = (row: number, col: number): string =>\n  `${indexToColumnLetter(col)}${row + 1}`;\n\nconst parseCellRef = (ref: string, range: string): CellCoord => {\n  const match = CELL_REF.exec(ref);\n  if (!match) {\n    throw new Error(`Invalid range format: ${range}`);\n  }\n\n  const coord = { row: Number(match[2]) - 1, col: columnLetterToIndex(match[1].toUpperCase()) };\n  validateRowIndex(coord.row);\n  validateColIndex(coord.col);\n  return coord;\n};\n\nexport const parseRange = (range: string): CellRange => {\n  const refs = String(range).split(':');\n  if (refs.length > 2) {\n    throw new Error(`Invalid range format: ${range}`);\n  }\n\n  const first = parseCellRef(refs[0], range);\n  const second = refs.length === 2 ? parseCellRef(refs[1], range) : first;\n\n  return {\n    start: { row: Math.min(first.row, second.row), col: Math.min(first.col, second.col) },\n    end: { row: Math.max(first.row, second.row), col: Math.max(first.col, second.col) },\n  };\n};\n\nexport const formatRange = ({ start, end }: CellRange, absolute = false): string => {\n  const cell = ({ row, col }: CellCoord) =>\n    absolute ? `$${indexToColumnLetter(col)}$${row + 1}` : `${indexToColumnLetter(col)}${row + 1}`;\n\n  return start.row === end.row && start.col === end.col\n    ? cell(start)\n    : `${cell(start)}:${cell(end)}`;\n};\n\nexport const quoteSheetName = (name: string): string => `'${name.replace(/'/g, \"''\")}'`;\n","import { CellStyle, Hyperlink } from './types';\nimport { EXCEL_LIMITS } from './date-utils';\nimport { parseRange, formatRange } from './cell-ref';\n\nexport interface PreparedHyperlink {\n  ref: string;\n  anchor: string;\n  rId?: string;\n  target?: string;\n  location?: string;\n  tooltip?: string;\n  display?: string;\n}\n\nexport const HYPERLINK_STYLE: CellStyle = { color: '#0563C1', underline: true };\n\nconst ALLOWED_URL = /^(?:https?:\\/\\/|mailto:)[^\\s\"<>\\\\^`{|}\\x00-\\x1F\\x7F]+$/i;\nconst WEB_URL = /^https?:/i;\nconst CONTROL_CHARS = /[\\x00-\\x1F\\x7F]/;\n\nconst checkLength = (kind: 'url' | 'location', value: string): void => {\n  if (value.length > EXCEL_LIMITS.MAX_HYPERLINK_LENGTH) {\n    throw new Error(\n      `Hyperlink ${kind} length ${value.length} exceeds Excel limit (${EXCEL_LIMITS.MAX_HYPERLINK_LENGTH})`\n    );\n  }\n};\n\nexport const prepareHyperlink = (link: Hyperlink): PreparedHyperlink => {\n  const range = parseRange(link.range);\n  const ref = formatRange(range);\n  const url = typeof link.url === 'string' ? link.url : '';\n  const location = typeof link.location === 'string' ? link.location.replace(/^#/, '') : '';\n\n  if (Boolean(url) === Boolean(location)) {\n    throw new Error(`Hyperlink at ${ref} must set exactly one of url or location`);\n  }\n\n  const prepared: PreparedHyperlink = { ref, anchor: `${range.start.row}-${range.start.col}` };\n\n  if (url) {\n    checkLength('url', url);\n    if (!ALLOWED_URL.test(url)) {\n      throw new Error(\n        `Unsupported hyperlink url at ${ref}: ${url} (use http, https or mailto; percent-encode spaces and quotes)`\n      );\n    }\n\n    const hashIndex = url.indexOf('#');\n    if (WEB_URL.test(url) && hashIndex !== -1 && hashIndex < url.length - 1) {\n      prepared.target = url.slice(0, hashIndex);\n      prepared.location = url.slice(hashIndex + 1);\n    } else {\n      prepared.target = url;\n    }\n  } else {\n    checkLength('location', location);\n    if (CONTROL_CHARS.test(location)) {\n      throw new Error(`Invalid hyperlink location at ${ref}: ${location}`);\n    }\n    prepared.location = location;\n  }\n\n  if (link.tooltip !== undefined) prepared.tooltip = String(link.tooltip);\n  if (link.display !== undefined) prepared.display = String(link.display);\n\n  return prepared;\n};\n\nexport const prepareHyperlinks = (links: Hyperlink[] = []): PreparedHyperlink[] => {\n  if (links.length > EXCEL_LIMITS.MAX_HYPERLINKS) {\n    throw new Error(\n      `Hyperlink count ${links.length} exceeds Excel limit (${EXCEL_LIMITS.MAX_HYPERLINKS})`\n    );\n  }\n\n  const seen = new Set<string>();\n  let nextRelationshipId = 1;\n\n  return links.map(link => {\n    const prepared = prepareHyperlink(link);\n    if (seen.has(prepared.ref)) {\n      throw new Error(`Duplicate hyperlink at ${prepared.ref}`);\n    }\n    seen.add(prepared.ref);\n\n    if (prepared.target !== undefined) {\n      prepared.rId = `rId${nextRelationshipId++}`;\n    }\n    return prepared;\n  });\n};\n\nexport const withHyperlinkStyles = (\n  styles: Record<string, CellStyle> | undefined,\n  links: PreparedHyperlink[]\n): Record<string, CellStyle> | undefined => {\n  if (links.length === 0) return styles;\n\n  const merged = { ...styles };\n  for (const link of links) {\n    const style = merged[link.anchor];\n    merged[link.anchor] = {\n      ...style,\n      color: style?.color ?? HYPERLINK_STYLE.color,\n      underline: style?.underline ?? HYPERLINK_STYLE.underline,\n    };\n  }\n  return merged;\n};\n","import { XML_NS } from './constants';\nimport { StyleManager, normalizeColor } from './style-manager';\nimport {\n  dateToExcelSerial,\n  isDate,\n  validateRowIndex,\n  validateColIndex,\n  validateCellValue,\n} from './date-utils';\nimport { calculateColumnWidths, generateColsXml } from './column-width';\nimport { rowIndexes } from './rows';\nimport { prepareLayout } from './sheet-layout';\nimport { isExcelError, splitCell } from './cells';\nimport { indexToColumnLetter, parseRange, formatRange, quoteSheetName } from './cell-ref';\nimport { PreparedHyperlink, prepareHyperlinks, withHyperlinkStyles } from './hyperlinks';\nimport {\n  AutoFilter,\n  CellValue,\n  CellValidation,\n  CellStyle,\n  ConditionalFormat,\n  FormulaResult,\n  Hyperlink,\n  SheetLayout,\n  SheetState,\n} from './types';\n\nexport type { CellValidation, CellStyle } from './types';\n\nexport interface SheetGenerationOptions extends SheetLayout {\n  freezePane?: { row?: number; col?: number };\n  autoWidth?: boolean;\n  columnWidths?: number[];\n  mergeCells?: string[];\n  conditionalFormats?: ConditionalFormat[];\n  sharedStrings?: Map<string, number>;\n  autoFilter?: AutoFilter;\n  hyperlinks?: Hyperlink[];\n}\n\nexport interface DefinedName {\n  name: string;\n  value: string;\n  localSheetId?: number;\n  hidden?: boolean;\n}\n\nconst cfFormulaValue = (value: number | string): string =>\n  typeof value === 'number' ? String(value) : `&quot;${escapeXml(value)}&quot;`;\n\nconst generateConditionalFormattingXml = (\n  formats: ConditionalFormat[] = [],\n  styleManager?: StyleManager\n): string => {\n  if (formats.length === 0) return '';\n\n  return formats\n    .map((cf, index) => {\n      const priority = index + 1;\n      const sqref = escapeXmlAttr(cf.range);\n\n      if (cf.type === 'colorScale') {\n        const cfvos =\n          cf.colors.length === 3\n            ? '<cfvo type=\"min\"/><cfvo type=\"percentile\" val=\"50\"/><cfvo type=\"max\"/>'\n            : '<cfvo type=\"min\"/><cfvo type=\"max\"/>';\n        const colorsXml = cf.colors\n          .map(c => `<color rgb=\"${escapeXmlAttr(normalizeColor(c))}\"/>`)\n          .join('');\n        return `\\n  <conditionalFormatting sqref=\"${sqref}\">\\n    <cfRule type=\"colorScale\" priority=\"${priority}\">\\n      <colorScale>${cfvos}${colorsXml}</colorScale>\\n    </cfRule>\\n  </conditionalFormatting>`;\n      }\n\n      const dxfId = styleManager ? styleManager.getDxfId(cf.style) : 0;\n\n      if (cf.type === 'expression') {\n        return `\\n  <conditionalFormatting sqref=\"${sqref}\">\\n    <cfRule type=\"expression\" dxfId=\"${dxfId}\" priority=\"${priority}\">\\n      <formula>${escapeXml(cf.formula)}</formula>\\n    </cfRule>\\n  </conditionalFormatting>`;\n      }\n\n      const operator = escapeXmlAttr(cf.operator);\n      const formulasXml =\n        cf.operator === 'between' || cf.operator === 'notBetween'\n          ? `<formula>${cfFormulaValue(cf.value)}</formula><formula>${cfFormulaValue(cf.value2!)}</formula>`\n          : `<formula>${cfFormulaValue(cf.value)}</formula>`;\n      return `\\n  <conditionalFormatting sqref=\"${sqref}\">\\n    <cfRule type=\"cellIs\" dxfId=\"${dxfId}\" priority=\"${priority}\" operator=\"${operator}\">${formulasXml}</cfRule>\\n  </conditionalFormatting>`;\n    })\n    .join('');\n};\n\nconst valueCellXml = (\n  open: string,\n  formulaXml: string,\n  value: FormulaResult | null | undefined,\n  ref: string,\n  sharedStrings?: Map<string, number>\n): string => {\n  if (value === null || value === undefined) {\n    return formulaXml ? `${open}>${formulaXml}</c>` : `${open}/>`;\n  }\n\n  if (value instanceof Date && !isDate(value)) {\n    throw new Error(`Cell ${ref} holds an invalid Date`);\n  }\n\n  if (isDate(value)) {\n    return `${open}>${formulaXml}<v>${dateToExcelSerial(value)}</v></c>`;\n  }\n\n  if (typeof value === 'number') {\n    if (!Number.isFinite(value)) {\n      throw new Error(`Cell ${ref} holds ${value}, which a worksheet cannot store`);\n    }\n    return `${open}>${formulaXml}<v>${value}</v></c>`;\n  }\n\n  if (typeof value === 'boolean') {\n    return `${open} t=\"b\">${formulaXml}<v>${value ? 1 : 0}</v></c>`;\n  }\n\n  if (typeof value === 'object') {\n    if ('error' in value) {\n      if (!isExcelError(value.error)) {\n        throw new Error(`Cell ${ref} holds ${value.error}, which a worksheet cannot store`);\n      }\n      return `${open} t=\"e\">${formulaXml}<v>${value.error}</v></c>`;\n    }\n    if ('formula' in value || 'text' in value) {\n      throw new Error(`Cell ${ref} needs a string formula or text`);\n    }\n  }\n\n  const stringValue = value.toString();\n  validateCellValue(stringValue);\n\n  if (formulaXml) {\n    return `${open} t=\"str\">${formulaXml}<v>${escapeXml(stringValue)}</v></c>`;\n  }\n\n  const index = sharedStrings?.get(stringValue);\n  if (index !== undefined) {\n    return `${open} t=\"s\"><v>${index}</v></c>`;\n  }\n\n  const space = stringValue !== stringValue.trim() ? ' xml:space=\"preserve\"' : '';\n  return `${open} t=\"inlineStr\"><is><t${space}>${escapeXml(stringValue)}</t></is></c>`;\n};\n\nexport const generateRowXml = (\n  row: CellValue[],\n  rowIndex: number,\n  styles: Record<string, CellStyle> = {},\n  styleManager?: StyleManager,\n  sharedStrings?: Map<string, number>,\n  attributes: string = ''\n): string => {\n  validateRowIndex(rowIndex);\n  let rowXml = `\\n    <row r=\"${rowIndex + 1}\"${attributes}>`;\n\n  row.forEach((cellValue, colIndex) => {\n    validateColIndex(colIndex);\n    const ref = `${indexToColumnLetter(colIndex)}${rowIndex + 1}`;\n    const cellStyle = styles[`${rowIndex}-${colIndex}`];\n    if (typeof cellValue === 'number' && Number.isFinite(cellValue) && !cellStyle) {\n      rowXml += `<c r=\"${ref}\"><v>${cellValue}</v></c>`;\n      return;\n    }\n    const { formula, value } = splitCell(cellValue);\n    if (formula === '' && typeof cellValue === 'object') {\n      throw new Error(`Cell ${ref} needs a formula`);\n    }\n    const styleId = isDate(value)\n      ? styleManager\n        ? styleManager.getDateStyleId(cellStyle)\n        : 0\n      : cellStyle\n        ? styleManager?.getStyleId(cellStyle)\n        : undefined;\n    const styleAttr = styleId === undefined ? '' : ` s=\"${styleId}\"`;\n    const formulaXml = formula === undefined ? '' : `<f>${escapeXml(formula)}</f>`;\n\n    rowXml += valueCellXml(`<c r=\"${ref}\"${styleAttr}`, formulaXml, value, ref, sharedStrings);\n  });\n\n  rowXml += `</row>`;\n  return rowXml;\n};\n\nexport const generateSheetViewsXml = (freezePane?: { row?: number; col?: number }): string => {\n  if (!freezePane) return '';\n\n  const { row = 0, col = 0 } = freezePane;\n  let sheetViewsXml = `  <sheetViews>\n    <sheetView workbookViewId=\"0\">`;\n\n  if (row > 0 || col > 0) {\n    const topLeftCell = `${indexToColumnLetter(col)}${row + 1}`;\n    let activePane = 'bottomRight';\n    if (row > 0 && col === 0) {\n      activePane = 'bottomLeft';\n    } else if (col > 0 && row === 0) {\n      activePane = 'topRight';\n    }\n\n    sheetViewsXml += `\n      <pane`;\n    if (col > 0) sheetViewsXml += ` xSplit=\"${col}\"`;\n    if (row > 0) sheetViewsXml += ` ySplit=\"${row}\"`;\n    sheetViewsXml += ` topLeftCell=\"${topLeftCell}\" activePane=\"${activePane}\" state=\"frozen\"/>`;\n  }\n\n  sheetViewsXml += `\n    </sheetView>\n  </sheetViews>`;\n  return sheetViewsXml;\n};\n\nexport const generateMergeCellsXml = (ranges: string[] = []): string => {\n  if (ranges.length === 0) return '';\n\n  let mergeCellsXml = `\\n  <mergeCells count=\"${ranges.length}\">`;\n  ranges.forEach(range => {\n    mergeCellsXml += `\\n    <mergeCell ref=\"${escapeXmlAttr(range)}\"/>`;\n  });\n  return mergeCellsXml + `\\n  </mergeCells>`;\n};\n\nexport const generateAutoFilterXml = (autoFilter?: AutoFilter): string =>\n  autoFilter ? `\\n  <autoFilter ref=\"${formatRange(parseRange(autoFilter.range))}\"/>` : '';\n\nconst optionalAttr = (name: string, value?: string): string =>\n  value === undefined ? '' : ` ${name}=\"${escapeXmlAttr(value)}\"`;\n\nexport const generateHyperlinksXml = (links: PreparedHyperlink[]): string => {\n  if (links.length === 0) return '';\n\n  const items = links\n    .map(\n      link =>\n        `\\n    <hyperlink ref=\"${link.ref}\"${optionalAttr('r:id', link.rId)}${optionalAttr('location', link.location)}${optionalAttr('tooltip', link.tooltip)}${optionalAttr('display', link.display)}/>`\n    )\n    .join('');\n\n  return `\\n  <hyperlinks>${items}\\n  </hyperlinks>`;\n};\n\nexport const generateHyperlinkRelsXml = (links: PreparedHyperlink[]): string => {\n  const relationships = links\n    .map(link =>\n      link.rId !== undefined && link.target !== undefined\n        ? `\\n  <Relationship Id=\"${link.rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${escapeXmlAttr(link.target)}\" TargetMode=\"External\"/>`\n        : ''\n    )\n    .join('');\n\n  if (!relationships) return '';\n\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"${XML_NS.main_rel}\">${relationships}\n</Relationships>`;\n};\n\nexport const generateSheetRelsXml = (hyperlinks: Hyperlink[] = []): string =>\n  generateHyperlinkRelsXml(prepareHyperlinks(hyperlinks));\n\nexport const sheetRelsPath = (sheetNumber: number): string =>\n  `xl/worksheets/_rels/sheet${sheetNumber}.xml.rels`;\n\nexport const generateWorksheetStart = (\n  sheetViews: string,\n  cols: string,\n  links: PreparedHyperlink[]\n): string => {\n  const relationshipsNs = links.some(link => link.rId !== undefined)\n    ? ` xmlns:r=\"${XML_NS.relationships}\"`\n    : '';\n  return `<?xml version=\"1.0\"?>\n<worksheet xmlns=\"${XML_NS.spreadsheetml}\"${relationshipsNs}>${sheetViews}${cols}\n  <sheetData>`;\n};\n\nexport const generateWorksheetEnd = (\n  autoFilter: string,\n  mergeCells: string,\n  conditionalFormatting: string,\n  dataValidations: string,\n  hyperlinks: string\n): string => `\n  </sheetData>${autoFilter}${mergeCells}${conditionalFormatting}${dataValidations}${hyperlinks}\n</worksheet>`;\n\nexport const generatePreparedSheetXml = (\n  data: CellValue[][],\n  validations: CellValidation[],\n  styles: Record<string, CellStyle>,\n  styleManager: StyleManager | undefined,\n  options: SheetGenerationOptions,\n  links: PreparedHyperlink[]\n): string => {\n  const sheetStyles = withHyperlinkStyles(styles, links);\n  const autoFilterXml = generateAutoFilterXml(options.autoFilter);\n\n  const layout = prepareLayout(options);\n  const populatedRows = rowIndexes(data);\n  const layoutOnlyRows = layout.rows.filter(rowIndex => !(rowIndex in data));\n  const rows =\n    layoutOnlyRows.length === 0\n      ? populatedRows\n      : populatedRows.concat(layoutOnlyRows).sort((a, b) => a - b);\n\n  let rowsXml = '';\n\n  rows.forEach(rowIndex => {\n    rowsXml += generateRowXml(\n      data[rowIndex] ?? [],\n      rowIndex,\n      sheetStyles,\n      styleManager,\n      options.sharedStrings,\n      layout.rowAttributes(rowIndex)\n    );\n  });\n\n  const colsXml = generateColsXml(\n    options.columnWidths ?? (options.autoWidth ? calculateColumnWidths(data) : []),\n    layout\n  );\n\n  return (\n    generateWorksheetStart(generateSheetViewsXml(options.freezePane), colsXml, links) +\n    rowsXml +\n    generateWorksheetEnd(\n      autoFilterXml,\n      generateMergeCellsXml(options.mergeCells),\n      generateConditionalFormattingXml(options.conditionalFormats, styleManager),\n      generateDataValidationsXml(validations),\n      generateHyperlinksXml(links)\n    )\n  );\n};\n\nexport const generateSheetXml = (\n  data: CellValue[][],\n  validations: CellValidation[] = [],\n  styles: Record<string, CellStyle> = {},\n  styleManager?: StyleManager,\n  options: SheetGenerationOptions = {}\n) =>\n  generatePreparedSheetXml(\n    data,\n    validations,\n    styles,\n    styleManager,\n    options,\n    prepareHyperlinks(options.hyperlinks)\n  );\n\nexport const generateDataValidationsXml = (validations: CellValidation[] = []): string => {\n  let validationsXml = '';\n  if (validations.length > 0) {\n    validationsXml = `\n  <dataValidations count=\"${validations.length}\">`;\n    validations.forEach(v => {\n      const type = v.type ?? 'list';\n      const allowBlank = v.allowBlank === false ? '0' : '1';\n      const sqref = escapeXmlAttr(v.range);\n\n      if (type === 'list') {\n        const formula1 =\n          v.formula1 !== undefined\n            ? escapeXml(v.formula1)\n            : `\"${escapeXml(v.options.replace(/\"/g, '\"\"'))}\"`;\n        validationsXml += `\n    <dataValidation type=\"list\" allowBlank=\"${allowBlank}\" showInputMessage=\"1\" showErrorMessage=\"1\" sqref=\"${sqref}\">\n      <formula1>${formula1}</formula1>\n    </dataValidation>`;\n        return;\n      }\n\n      const operator =\n        type === 'custom' ? '' : ` operator=\"${escapeXmlAttr(v.operator ?? 'between')}\"`;\n      let formulas = '';\n      if (v.formula1 !== undefined) formulas += `<formula1>${escapeXml(v.formula1)}</formula1>`;\n      if (v.formula2 !== undefined) formulas += `<formula2>${escapeXml(v.formula2)}</formula2>`;\n      validationsXml += `\n    <dataValidation type=\"${escapeXmlAttr(type)}\"${operator} allowBlank=\"${allowBlank}\" showInputMessage=\"1\" showErrorMessage=\"1\" sqref=\"${sqref}\">${formulas}</dataValidation>`;\n    });\n    validationsXml += `\n  </dataValidations>`;\n  }\n\n  return validationsXml;\n};\n\nexport const generateSharedStringsXml = (strings: string[]) => {\n  const uniqueStrings = [...new Set(strings)];\n\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"${XML_NS.spreadsheetml}\" count=\"${strings.length}\" uniqueCount=\"${uniqueStrings.length}\">\n  ${uniqueStrings\n    .map(str => {\n      const space = str !== str.trim() ? ' xml:space=\"preserve\"' : '';\n      return `<si><t${space}>${escapeXml(str)}</t></si>`;\n    })\n    .join('')}\n</sst>`;\n};\n\nconst stylesSection = (tag: string, count: number, body: string): string =>\n  `  <${tag} count=\"${count}\">\\n${body}\\n  </${tag}>\\n`;\n\nexport const generateStylesXml = (styleManager = new StyleManager()) => {\n  const numFmtsCount = styleManager.getNumFmtsCount();\n  return `<?xml version=\"1.0\"?>\n<styleSheet xmlns=\"${XML_NS.spreadsheetml}\">\n${numFmtsCount > 0 ? stylesSection('numFmts', numFmtsCount, styleManager.generateNumFmtsXml()) : ''}${stylesSection('fonts', styleManager.getFontsCount(), styleManager.generateFontsXml())}${stylesSection('fills', styleManager.getFillsCount(), styleManager.generateFillsXml())}${stylesSection('borders', styleManager.getBordersCount(), styleManager.generateBordersXml())}  <cellStyleXfs count=\"1\">\n    <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\n  </cellStyleXfs>\n${stylesSection('cellXfs', styleManager.getCellXfsCount(), styleManager.generateCellXfsXml())}  <cellStyles count=\"1\">\n    <cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>\n  </cellStyles>\n${stylesSection('dxfs', styleManager.getDxfsCount(), styleManager.generateDxfsXml())}  <tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>\n</styleSheet>`;\n};\n\nexport const generateContentTypesXml = (\n  sheetCount: number = 1,\n  hasSharedStrings: boolean = false\n) => {\n  const sharedStringsOverride = hasSharedStrings\n    ? '\\n  <Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>'\n    : '';\n\n  const worksheetOverrides = Array.from({ length: sheetCount }, (_, i) => {\n    const sheetNum = i + 1;\n    return `  <Override PartName=\"/xl/worksheets/sheet${sheetNum}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n  }).join('\\n');\n\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"${XML_NS.content_types}\">\n  <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n  <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n  <Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\n${worksheetOverrides}${sharedStringsOverride}\n  <Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\n  <Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>\n  <Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>\n</Types>`;\n};\n\nexport const filterDatabaseNames = (\n  sheetNames: string[],\n  autoFilters: Array<AutoFilter | undefined>\n): DefinedName[] =>\n  autoFilters.flatMap((autoFilter, index) =>\n    autoFilter\n      ? [\n          {\n            name: '_xlnm._FilterDatabase',\n            localSheetId: index,\n            hidden: true,\n            value: `${quoteSheetName(sheetNames[index])}!${formatRange(parseRange(autoFilter.range), true)}`,\n          },\n        ]\n      : []\n  );\n\nconst generateDefinedNamesXml = (definedNames: DefinedName[]): string => {\n  if (definedNames.length === 0) return '';\n\n  const items = definedNames\n    .map(definedName => {\n      const localSheetId =\n        definedName.localSheetId !== undefined ? ` localSheetId=\"${definedName.localSheetId}\"` : '';\n      const hidden = definedName.hidden ? ' hidden=\"1\"' : '';\n      return `\\n    <definedName name=\"${escapeXmlAttr(definedName.name)}\"${localSheetId}${hidden}>${escapeXml(definedName.value)}</definedName>`;\n    })\n    .join('');\n\n  return `\\n  <definedNames>${items}\\n  </definedNames>`;\n};\n\nexport const generateWorkbookXml = (\n  sheetNames: string[] = ['Sheet1'],\n  definedNames: DefinedName[] = [],\n  sheetStates: SheetState[] = []\n) => {\n  const sheetsXml = sheetNames\n    .map((name, index) => {\n      const sheetId = index + 1;\n      const rId = `rId${sheetId}`;\n      const state = sheetStates[index] ?? 'visible';\n      const stateAttribute = state === 'visible' ? '' : ` state=\"${escapeXmlAttr(state)}\"`;\n      return `    <sheet name=\"${escapeXmlAttr(name)}\" sheetId=\"${sheetId}\"${stateAttribute} r:id=\"${rId}\"/>`;\n    })\n    .join('\\n');\n  const firstVisible = sheetNames.findIndex(\n    (_, index) => (sheetStates[index] ?? 'visible') === 'visible'\n  );\n  const activeTab = firstVisible > 0 ? ` activeTab=\"${firstVisible}\"` : '';\n\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"${XML_NS.spreadsheetml}\" xmlns:r=\"${XML_NS.relationships}\">\n  <fileVersion appName=\"xl\" lastEdited=\"7\" lowestEdited=\"7\" rupBuild=\"16925\"/>\n  <workbookPr defaultThemeVersion=\"166925\"/>\n  <bookViews>\n    <workbookView xWindow=\"0\" yWindow=\"0\" windowWidth=\"22260\" windowHeight=\"12645\"${activeTab}/>\n  </bookViews>\n  <sheets>\n${sheetsXml}\n  </sheets>${generateDefinedNamesXml(definedNames)}\n  <calcPr calcId=\"162913\" fullCalcOnLoad=\"1\"/>\n</workbook>`;\n};\n\nexport const generateWorkbookRelsXml = (\n  sheetCount: number = 1,\n  hasSharedStrings: boolean = false\n) => {\n  const worksheetRels = Array.from({ length: sheetCount }, (_, i) => {\n    const rId = i + 1;\n    return `  <Relationship Id=\"rId${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${rId}.xml\"/>`;\n  }).join('\\n');\n\n  const stylesRId = sheetCount + 1;\n  const sharedStringsRId = sheetCount + 2;\n\n  return `<?xml version=\"1.0\"?>\n<Relationships xmlns=\"${XML_NS.main_rel}\">\n${worksheetRels}\n  <Relationship Id=\"rId${stylesRId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>${hasSharedStrings ? `\\n  <Relationship Id=\"rId${sharedStringsRId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/>` : ''}\n</Relationships>`;\n};\n\nexport const generateCorePropsXml = (\n  creator: string = 'Excel Bridge',\n  title?: string,\n  subject?: string\n) => {\n  const now = new Date().toISOString();\n  const titleXml = title ? `\\n  <dc:title>${escapeXml(title)}</dc:title>` : '';\n  const subjectXml = subject ? `\\n  <dc:subject>${escapeXml(subject)}</dc:subject>` : '';\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <dc:creator>${escapeXml(creator)}</dc:creator>\n  <cp:lastModifiedBy>${escapeXml(creator)}</cp:lastModifiedBy>\n  <dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>\n  <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>${titleXml}${subjectXml}\n</cp:coreProperties>`;\n};\n\nexport const generateAppPropsXml = () => {\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\">\n  <Application>Excel Bridge</Application>\n  <AppVersion>1.0</AppVersion>\n</Properties>`;\n};\n\nexport const generateRootRelsXml = () => {\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"${XML_NS.main_rel}\">\n  <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\n  <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>\n  <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>\n</Relationships>`;\n};\n\nconst escapeXml = (text: string): string => {\n  return text\n    .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/g, '')\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n};\n\nconst escapeXmlAttr = (text: string): string => escapeXml(text).replace(/\"/g, '&quot;');\n","const VALID_SHEET_NAME =\n  /^[^\\\\/?*[\\]:\\x00-\\x1F']([^\\\\/?*[\\]:\\x00-\\x1F]{0,29}[^\\\\/?*[\\]:\\x00-\\x1F'])?$/;\n\nexport const validateSheetName = (name: string): void => {\n  if (!VALID_SHEET_NAME.test(name)) {\n    throw new Error(\n      `Invalid sheet name \"${name}\": use 1 to 31 characters, none of \\\\ / ? * [ ] : or control characters, and no apostrophe at either end`\n    );\n  }\n};\n\nexport const validateSheetNames = (names: string[]): void => {\n  if (names.length === 0) {\n    throw new Error('A workbook needs at least one sheet');\n  }\n\n  const seen = new Set<string>();\n  for (const name of names) {\n    validateSheetName(name);\n    const key = name.toLowerCase();\n    if (seen.has(key)) {\n      throw new Error(`Sheet name \"${name}\" is used twice (names are not case-sensitive)`);\n    }\n    seen.add(key);\n  }\n};\n","import { CellValidation, DataValidationOperator } from '../core/types';\nimport { dateToExcelSerial } from '../core/date-utils';\n\ntype RangeOperator = Exclude<DataValidationOperator, never>;\n\n/**\n * Typed builders for cell data validations. Each returns a {@link CellValidation}\n * ready to drop into a sheet's `validations` array or `Workbook.addValidation`.\n */\nexport const dataValidation = {\n  list(range: string, values: string[]): CellValidation {\n    return { range, type: 'list', options: values.join(',') };\n  },\n\n  wholeNumber(\n    range: string,\n    operator: RangeOperator,\n    value: number,\n    value2?: number\n  ): CellValidation {\n    return numericRule('whole', range, operator, value, value2);\n  },\n\n  decimal(range: string, operator: RangeOperator, value: number, value2?: number): CellValidation {\n    return numericRule('decimal', range, operator, value, value2);\n  },\n\n  textLength(\n    range: string,\n    operator: RangeOperator,\n    value: number,\n    value2?: number\n  ): CellValidation {\n    return numericRule('textLength', range, operator, value, value2);\n  },\n\n  dateBetween(range: string, start: Date, end: Date): CellValidation {\n    return {\n      range,\n      type: 'date',\n      operator: 'between',\n      formula1: String(dateToExcelSerial(start)),\n      formula2: String(dateToExcelSerial(end)),\n      options: '',\n    };\n  },\n};\n\nconst numericRule = (\n  type: CellValidation['type'],\n  range: string,\n  operator: RangeOperator,\n  value: number,\n  value2?: number\n): CellValidation => ({\n  range,\n  type,\n  operator,\n  formula1: String(value),\n  ...(value2 !== undefined ? { formula2: String(value2) } : {}),\n  options: '',\n});\n","import { ExternalHyperlink, InternalHyperlink } from '../core/types';\nimport { parseRange, formatRange, quoteSheetName } from '../core/cell-ref';\n\nexport type HyperlinkOptions = Pick<ExternalHyperlink, 'tooltip' | 'display'>;\n\nexport const hyperlink = {\n  url(range: string, url: string, options: HyperlinkOptions = {}): ExternalHyperlink {\n    return { range, url, ...options };\n  },\n\n  email(\n    range: string,\n    address: string,\n    options: HyperlinkOptions & { subject?: string } = {}\n  ): ExternalHyperlink {\n    const { subject, ...rest } = options;\n    const query = subject !== undefined ? `?subject=${encodeURIComponent(subject)}` : '';\n    return { range, url: `mailto:${address}${query}`, ...rest };\n  },\n\n  internal(\n    range: string,\n    sheet: string,\n    cell = 'A1',\n    options: HyperlinkOptions = {}\n  ): InternalHyperlink {\n    return {\n      range,\n      location: `${quoteSheetName(sheet)}!${formatRange(parseRange(cell))}`,\n      ...options,\n    };\n  },\n};\n","import { createExcelBlob, createExcelBuffer, ExcelFiles } from '../core/zip-manager';\nimport {\n  generatePreparedSheetXml,\n  generateStylesXml,\n  generateSharedStringsXml,\n  generateContentTypesXml,\n  generateWorkbookXml,\n  generateWorkbookRelsXml,\n  generateRootRelsXml,\n  generateCorePropsXml,\n  generateAppPropsXml,\n  generateHyperlinkRelsXml,\n  sheetRelsPath,\n  filterDatabaseNames,\n  SheetGenerationOptions,\n} from '../core/xml-templates';\nimport { StyleManager } from '../core/style-manager';\nimport { validateSheetNames } from '../core/sheet-name';\nimport { rowIndexes } from '../core/rows';\nimport { splitCell } from '../core/cells';\nimport { prepareHyperlinks, withHyperlinkStyles } from '../core/hyperlinks';\nimport {\n  AutoFilter,\n  CellValue,\n  CellValidation,\n  CellStyle,\n  ConditionalFormat,\n  Hyperlink,\n  SheetLayout,\n  SheetState,\n} from '../core/types';\n\nexport type {\n  AutoFilter,\n  CellValue,\n  CellValidation,\n  CellStyle,\n  ConditionalFormat,\n  DataValidationType,\n  DataValidationOperator,\n  ErrorCell,\n  ExcelErrorValue,\n  FormulaCell,\n  FormulaResult,\n  Hyperlink,\n  SheetLayout,\n  SheetState,\n  TextCell,\n} from '../core/types';\nexport { dataValidation } from './validation';\nexport { hyperlink } from './hyperlink';\nexport type { HyperlinkOptions } from './hyperlink';\n\nexport interface SheetOptions extends SheetLayout {\n  name?: string;\n  state?: SheetState;\n  freezePane?: { row?: number; col?: number };\n  autoWidth?: boolean;\n  columnWidths?: number[];\n  autoFilter?: AutoFilter;\n}\n\nexport interface ExcelWriterOptions {\n  creator?: string;\n  title?: string;\n  subject?: string;\n  sharedStrings?: boolean;\n}\n\nexport interface ExcelData {\n  data: CellValue[][];\n  validations?: CellValidation[];\n  styles?: Record<string, CellStyle>;\n  mergeCells?: string[];\n  conditionalFormats?: ConditionalFormat[];\n  hyperlinks?: Hyperlink[];\n  options?: SheetOptions;\n}\n\nexport class ExcelWriter {\n  private _options: ExcelWriterOptions;\n\n  constructor(options: ExcelWriterOptions = {}) {\n    this._options = {\n      creator: 'Excel Bridge',\n      ...options,\n    };\n  }\n\n  createWorkbook(data: ExcelData[]): Blob {\n    const files = this.generateFiles(data);\n    return createExcelBlob(files);\n  }\n\n  createWorkbookBuffer(data: ExcelData[]): Uint8Array {\n    const files = this.generateFiles(data);\n    return createExcelBuffer(files);\n  }\n\n  private generateFiles(data: ExcelData[]): ExcelFiles {\n    const sheetCount = data.length;\n\n    const shared = this._options.sharedStrings ? this.buildSharedStrings(data) : null;\n    const hasSharedStrings = !!shared && shared.list.length > 0;\n\n    const styleManager = new StyleManager();\n    const sheetLinks = data.map(sheetData => prepareHyperlinks(sheetData.hyperlinks));\n\n    const sheetNames = data.map((sheet, index) => sheet.options?.name || `Sheet${index + 1}`);\n    validateSheetNames(sheetNames);\n    const sheetStates = data.map(sheet => sheet.options?.state ?? 'visible');\n\n    if (!sheetStates.includes('visible')) {\n      throw new Error('At least one sheet must be visible');\n    }\n\n    data.forEach((sheetData, index) => {\n      const styles = withHyperlinkStyles(sheetData.styles, sheetLinks[index]);\n      if (styles) {\n        Object.values(styles).forEach(style => {\n          styleManager.getStyleId(style);\n        });\n      }\n    });\n\n    const worksheetEntries: Array<{ path: string; xml: string; relsPath: string; rels: string }> =\n      [];\n\n    data.forEach((sheetData, index) => {\n      const sheetIndex = index + 1;\n      const sheetOptions: SheetGenerationOptions = {\n        ...sheetData.options,\n        mergeCells: sheetData.mergeCells,\n        conditionalFormats: sheetData.conditionalFormats,\n        sharedStrings: hasSharedStrings ? shared!.map : undefined,\n      };\n\n      const sheetXml = generatePreparedSheetXml(\n        sheetData.data,\n        sheetData.validations || [],\n        sheetData.styles || {},\n        styleManager,\n        sheetOptions,\n        sheetLinks[index]\n      );\n\n      worksheetEntries.push({\n        path: `xl/worksheets/sheet${sheetIndex}.xml`,\n        xml: sheetXml,\n        relsPath: sheetRelsPath(sheetIndex),\n        rels: generateHyperlinkRelsXml(sheetLinks[index]),\n      });\n    });\n\n    const files: ExcelFiles = {};\n\n    files['[Content_Types].xml'] = generateContentTypesXml(sheetCount, hasSharedStrings);\n\n    files['_rels/.rels'] = generateRootRelsXml();\n\n    files['xl/_rels/workbook.xml.rels'] = generateWorkbookRelsXml(sheetCount, hasSharedStrings);\n\n    files['xl/workbook.xml'] = generateWorkbookXml(\n      sheetNames,\n      filterDatabaseNames(\n        sheetNames,\n        data.map(sheetData => sheetData.options?.autoFilter)\n      ),\n      sheetStates\n    );\n\n    files['xl/styles.xml'] = generateStylesXml(styleManager);\n\n    worksheetEntries.forEach(entry => {\n      files[entry.path] = entry.xml;\n      if (entry.rels) {\n        files[entry.relsPath] = entry.rels;\n      }\n    });\n\n    if (hasSharedStrings) {\n      files['xl/sharedStrings.xml'] = generateSharedStringsXml(shared!.list);\n    }\n\n    files['docProps/core.xml'] = generateCorePropsXml(\n      this._options.creator,\n      this._options.title,\n      this._options.subject\n    );\n    files['docProps/app.xml'] = generateAppPropsXml();\n\n    return files;\n  }\n\n  private buildSharedStrings(data: ExcelData[]): { map: Map<string, number>; list: string[] } {\n    const map = new Map<string, number>();\n    const list: string[] = [];\n\n    data.forEach(sheetData => {\n      rowIndexes(sheetData.data).forEach(index => {\n        sheetData.data[index].forEach(cell => {\n          const { formula, value } = splitCell(cell);\n          if (formula === undefined && typeof value === 'string' && !map.has(value)) {\n            map.set(value, list.length);\n            list.push(value);\n          }\n        });\n      });\n    });\n\n    return { map, list };\n  }\n\n  addValidation(data: ExcelData[], range: string, options: string): ExcelData[] {\n    const newData = [...data];\n    const lastSheet = newData[newData.length - 1];\n\n    if (lastSheet) {\n      if (!lastSheet.validations) {\n        lastSheet.validations = [];\n      }\n      lastSheet.validations.push({ range, options });\n    }\n\n    return newData;\n  }\n\n  addStyle(data: ExcelData[], rowIndex: number, colIndex: number, style: CellStyle): ExcelData[] {\n    const newData = [...data];\n    const lastSheet = newData[newData.length - 1];\n\n    if (lastSheet) {\n      if (!lastSheet.styles) {\n        lastSheet.styles = {};\n      }\n      lastSheet.styles[`${rowIndex}-${colIndex}`] = style;\n    }\n\n    return newData;\n  }\n\n  static createSimple(data: CellValue[][], options?: ExcelWriterOptions): Blob {\n    const writer = new ExcelWriter(options);\n    return writer.createWorkbook([{ data }]);\n  }\n\n  static createSimpleBuffer(data: CellValue[][], options?: ExcelWriterOptions): Uint8Array {\n    const writer = new ExcelWriter(options);\n    return writer.createWorkbookBuffer([{ data }]);\n  }\n}\n\nexport const createExcelFile = (data: CellValue[][], options?: ExcelWriterOptions): Blob => {\n  return ExcelWriter.createSimple(data, options);\n};\n\nexport const createExcelFileBuffer = (\n  data: CellValue[][],\n  options?: ExcelWriterOptions\n): Uint8Array => {\n  return ExcelWriter.createSimpleBuffer(data, options);\n};\n","import { ExcelReader, ParsedCell, ParsedWorkbook } from '../reader';\nimport { ExcelWriter } from '../writer';\nimport { parseRange, formatRange } from '../core/cell-ref';\nimport { EXCEL_LIMITS } from '../core/date-utils';\nimport { validateSheetName } from '../core/sheet-name';\nimport { isExcelError } from '../core/cells';\nimport { prepareLayout } from '../core/sheet-layout';\nimport { HYPERLINK_STYLE, prepareHyperlink } from '../core/hyperlinks';\nimport {\n  AutoFilter,\n  CellValue,\n  ErrorCell,\n  TextCell,\n  CellValidation,\n  CellStyle,\n  ConditionalFormat,\n  Hyperlink,\n  SheetState,\n} from '../core/types';\nimport type { ExcelWriterOptions } from '../writer';\n\ninterface WorkbookSheet {\n  name: string;\n  state?: SheetState;\n  data: CellValue[][];\n  styles: Record<string, CellStyle>;\n  validations: CellValidation[];\n  mergeCells: string[];\n  conditionalFormats: ConditionalFormat[];\n  hyperlinks: Hyperlink[];\n  autoFilter?: AutoFilter;\n  freezePane?: { row?: number; col?: number };\n  columnWidths?: number[];\n  rowHeights?: Record<number, number>;\n  hiddenRows: Set<number>;\n  hiddenColumns: Set<number>;\n  autoWidth?: boolean;\n  literals: Map<string, LiteralCell>;\n}\n\ntype LiteralCell = TextCell | ErrorCell;\n\nconst setMember = (members: Set<number>, index: number, present: boolean): void => {\n  if (present) members.add(index);\n  else members.delete(index);\n};\n\nconst cellToValue = (cell: ParsedCell): CellValue => {\n  if (cell.formula !== undefined) return `=${cell.formula}`;\n  if (cell.type === 'empty') return null;\n  return cell.value;\n};\n\nconst literalOf = (cell: ParsedCell): LiteralCell | undefined => {\n  if (cell.formula !== undefined) return undefined;\n  if (cell.type === 'error' && isExcelError(cell.value)) return { error: cell.value };\n  if (typeof cell.value === 'string' && cell.value.startsWith('=')) return { text: cell.value };\n  return undefined;\n};\n\nconst loadedText = (literal: LiteralCell): string => literal.error ?? literal.text;\n\nconst withLiterals = (sheet: WorkbookSheet): CellValue[][] => {\n  if (sheet.literals.size === 0) return sheet.data;\n  const data = sheet.data.slice();\n  sheet.literals.forEach((literal, key) => {\n    const [row, col] = key.split('-').map(Number);\n    if (data[row]?.[col] !== loadedText(literal)) return;\n    data[row] = data[row].slice();\n    data[row][col] = literal;\n  });\n  return data;\n};\n\nconst placeRows = (\n  rows: ParsedCell[][]\n): { data: CellValue[][]; literals: Map<string, LiteralCell> } => {\n  const data: CellValue[][] = [];\n  const literals = new Map<string, LiteralCell>();\n  let next = 0;\n\n  for (const row of rows) {\n    const declared = row[0]?.rowIndex ?? -1;\n    const index = declared >= next ? declared : next;\n    data[index] = row.map((cell, col) => {\n      const literal = literalOf(cell);\n      if (literal !== undefined) literals.set(`${index}-${col}`, literal);\n      return cellToValue(cell);\n    });\n    next = index + 1;\n  }\n\n  return { data, literals };\n};\n\nconst canonicalHyperlink = (link: Hyperlink): Hyperlink => ({\n  ...link,\n  range: prepareHyperlink(link).ref,\n});\n\nconst canonicalAutoFilter = (autoFilter: AutoFilter): AutoFilter => ({\n  range: formatRange(parseRange(autoFilter.range)),\n});\n\nconst acceptOrDrop = <T>(value: T, canonicalize: (value: T) => T): T[] => {\n  try {\n    return [canonicalize(value)];\n  } catch {\n    return [];\n  }\n};\n\nconst loadHyperlinks = (links: Hyperlink[] = []): Hyperlink[] => {\n  const byRange = new Map<string, Hyperlink>();\n\n  for (const link of links.flatMap(link => acceptOrDrop(link, canonicalHyperlink))) {\n    if (byRange.size === EXCEL_LIMITS.MAX_HYPERLINKS) break;\n    if (!byRange.has(link.range)) byRange.set(link.range, link);\n  }\n\n  return [...byRange.values()];\n};\n\nexport interface WorkbookMetadata {\n  creator?: string;\n  title?: string;\n  subject?: string;\n}\n\nexport class Workbook {\n  private sheets: WorkbookSheet[] = [];\n  private metadata: WorkbookMetadata = {};\n\n  private constructor() {}\n\n  static create(): Workbook {\n    return new Workbook();\n  }\n\n  static fromBuffer(buffer: Uint8Array): Workbook {\n    const reader = new ExcelReader();\n    return Workbook.fromParsed(reader.parseFromBuffer(buffer));\n  }\n\n  static async fromFile(file: File): Promise<Workbook> {\n    const reader = new ExcelReader();\n    return Workbook.fromParsed(await reader.parseFromFile(file));\n  }\n\n  private static fromParsed(parsed: ParsedWorkbook): Workbook {\n    const workbook = new Workbook();\n    workbook.metadata = {\n      creator: parsed.metadata.creator,\n      title: parsed.metadata.title,\n      subject: parsed.metadata.subject,\n    };\n    workbook.sheets = parsed.sheets.map(sheet => {\n      const placed = placeRows(sheet.data);\n      return {\n        name: sheet.name,\n        ...(sheet.state ? { state: sheet.state } : {}),\n        data: placed.data,\n        literals: placed.literals,\n        styles: sheet.styles ?? {},\n        validations: sheet.validations.map(validation => ({ ...validation })),\n        mergeCells: sheet.mergeCells ?? [],\n        conditionalFormats: sheet.conditionalFormats ?? [],\n        hyperlinks: loadHyperlinks(sheet.hyperlinks),\n        autoFilter: sheet.autoFilter\n          ? acceptOrDrop(sheet.autoFilter, canonicalAutoFilter)[0]\n          : undefined,\n        freezePane: sheet.freezePane,\n        columnWidths: sheet.columnWidths,\n        rowHeights: sheet.rowHeights,\n        hiddenRows: new Set(sheet.hiddenRows),\n        hiddenColumns: new Set(sheet.hiddenColumns),\n      };\n    });\n    return workbook;\n  }\n\n  getSheetNames(): string[] {\n    return this.sheets.map(sheet => sheet.name);\n  }\n\n  getMetadata(): WorkbookMetadata {\n    return { ...this.metadata };\n  }\n\n  setMetadata(metadata: WorkbookMetadata): void {\n    this.metadata = { ...this.metadata, ...metadata };\n  }\n\n  private findSheet(name: string): WorkbookSheet {\n    const sheet = this.sheets.find(s => s.name === name);\n    if (!sheet) {\n      throw new Error(`Sheet \"${name}\" not found`);\n    }\n    return sheet;\n  }\n\n  addSheet(name: string, data: CellValue[][] = []): void {\n    validateSheetName(name);\n    if (this.sheets.some(s => s.name.toLowerCase() === name.toLowerCase())) {\n      throw new Error(`Sheet \"${name}\" already exists`);\n    }\n    this.sheets.push({\n      name,\n      data,\n      styles: {},\n      validations: [],\n      mergeCells: [],\n      conditionalFormats: [],\n      hyperlinks: [],\n      hiddenRows: new Set(),\n      hiddenColumns: new Set(),\n      literals: new Map(),\n    });\n  }\n\n  renameSheet(from: string, to: string): void {\n    const sheet = this.findSheet(from);\n    validateSheetName(to);\n    if (this.sheets.some(s => s !== sheet && s.name.toLowerCase() === to.toLowerCase())) {\n      throw new Error(`Sheet \"${to}\" already exists`);\n    }\n    sheet.name = to;\n  }\n\n  removeSheet(name: string): void {\n    const index = this.sheets.findIndex(s => s.name === name);\n    if (index === -1) {\n      throw new Error(`Sheet \"${name}\" not found`);\n    }\n    this.sheets.splice(index, 1);\n  }\n\n  getSheetData(name: string): CellValue[][] {\n    return this.findSheet(name).data;\n  }\n\n  getCellValue(sheetName: string, row: number, col: number): CellValue {\n    return this.findSheet(sheetName).data[row]?.[col] ?? null;\n  }\n\n  setCellValue(sheetName: string, row: number, col: number, value: CellValue): void {\n    const sheet = this.findSheet(sheetName);\n    if (!sheet.data[row]) sheet.data[row] = [];\n    sheet.data[row][col] = value;\n    sheet.literals.delete(`${row}-${col}`);\n  }\n\n  getCellStyle(sheetName: string, row: number, col: number): CellStyle | undefined {\n    return this.findSheet(sheetName).styles[`${row}-${col}`];\n  }\n\n  setCellStyle(sheetName: string, row: number, col: number, style: CellStyle): void {\n    this.findSheet(sheetName).styles[`${row}-${col}`] = style;\n  }\n\n  getSheetState(sheetName: string): SheetState {\n    return this.findSheet(sheetName).state ?? 'visible';\n  }\n\n  setSheetState(sheetName: string, state: SheetState): void {\n    const sheet = this.findSheet(sheetName);\n    if (state === 'visible') {\n      delete sheet.state;\n    } else {\n      sheet.state = state;\n    }\n  }\n\n  setMergeCells(sheetName: string, ranges: string[]): void {\n    this.findSheet(sheetName).mergeCells = ranges;\n  }\n\n  setFreezePane(sheetName: string, pane: { row?: number; col?: number }): void {\n    this.findSheet(sheetName).freezePane = pane;\n  }\n\n  setColumnWidths(sheetName: string, widths: number[]): void {\n    this.findSheet(sheetName).columnWidths = widths;\n  }\n\n  setRowHeight(sheetName: string, row: number, height: number | null): void {\n    const sheet = this.findSheet(sheetName);\n    if (height === null) {\n      delete sheet.rowHeights?.[row];\n    } else {\n      prepareLayout({ rowHeights: { [row]: height } });\n      (sheet.rowHeights ??= {})[row] = height;\n    }\n  }\n\n  getRowHeight(sheetName: string, row: number): number | undefined {\n    return this.findSheet(sheetName).rowHeights?.[row];\n  }\n\n  setRowHidden(sheetName: string, row: number, hidden: boolean = true): void {\n    prepareLayout({ hiddenRows: [row] });\n    setMember(this.findSheet(sheetName).hiddenRows, row, hidden);\n  }\n\n  isRowHidden(sheetName: string, row: number): boolean {\n    return this.findSheet(sheetName).hiddenRows.has(row);\n  }\n\n  setColumnHidden(sheetName: string, col: number, hidden: boolean = true): void {\n    prepareLayout({ hiddenColumns: [col] });\n    setMember(this.findSheet(sheetName).hiddenColumns, col, hidden);\n  }\n\n  isColumnHidden(sheetName: string, col: number): boolean {\n    return this.findSheet(sheetName).hiddenColumns.has(col);\n  }\n\n  setAutoWidth(sheetName: string, enabled: boolean): void {\n    this.findSheet(sheetName).autoWidth = enabled;\n  }\n\n  addValidation(sheetName: string, validation: CellValidation): void {\n    this.findSheet(sheetName).validations.push(validation);\n  }\n\n  addConditionalFormat(sheetName: string, format: ConditionalFormat): void {\n    this.findSheet(sheetName).conditionalFormats.push(format);\n  }\n\n  setAutoFilter(sheetName: string, autoFilter: AutoFilter): void {\n    this.findSheet(sheetName).autoFilter = canonicalAutoFilter(autoFilter);\n  }\n\n  getAutoFilter(sheetName: string): AutoFilter | undefined {\n    const autoFilter = this.findSheet(sheetName).autoFilter;\n    return autoFilter ? { ...autoFilter } : undefined;\n  }\n\n  removeAutoFilter(sheetName: string): void {\n    const sheet = this.findSheet(sheetName);\n    if (sheet.autoFilter) {\n      const { start, end } = parseRange(sheet.autoFilter.range);\n      sheet.hiddenRows.forEach(row => {\n        if (row > start.row && row <= end.row) sheet.hiddenRows.delete(row);\n      });\n    }\n    delete sheet.autoFilter;\n  }\n\n  setHyperlink(sheetName: string, hyperlink: Hyperlink): void {\n    const sheet = this.findSheet(sheetName);\n    const stored = canonicalHyperlink(hyperlink);\n    const index = sheet.hyperlinks.findIndex(link => link.range === stored.range);\n\n    if (index === -1) {\n      sheet.hyperlinks.push(stored);\n    } else {\n      sheet.hyperlinks[index] = stored;\n    }\n  }\n\n  getHyperlinks(sheetName: string): Hyperlink[] {\n    return this.findSheet(sheetName).hyperlinks.map(link => ({ ...link }));\n  }\n\n  removeHyperlink(sheetName: string, range: string): void {\n    const sheet = this.findSheet(sheetName);\n    const parsed = parseRange(range);\n    const ref = formatRange(parsed);\n    const index = sheet.hyperlinks.findIndex(link => link.range === ref);\n    if (index === -1) return;\n\n    sheet.hyperlinks.splice(index, 1);\n\n    const anchor = `${parsed.start.row}-${parsed.start.col}`;\n    const style = sheet.styles[anchor];\n    if (!style) return;\n\n    const remaining: CellStyle = { ...style };\n    if (remaining.underline === true) delete remaining.underline;\n    if (remaining.color?.toUpperCase() === HYPERLINK_STYLE.color) delete remaining.color;\n\n    if (Object.keys(remaining).length > 0) {\n      sheet.styles[anchor] = remaining;\n    } else {\n      delete sheet.styles[anchor];\n    }\n  }\n\n  private toExcelData() {\n    return this.sheets.map(sheet => ({\n      data: withLiterals(sheet),\n      validations: sheet.validations,\n      styles: sheet.styles,\n      mergeCells: sheet.mergeCells,\n      conditionalFormats: sheet.conditionalFormats,\n      hyperlinks: sheet.hyperlinks,\n      options: {\n        name: sheet.name,\n        state: sheet.state,\n        freezePane: sheet.freezePane,\n        columnWidths: sheet.columnWidths,\n        rowHeights: sheet.rowHeights,\n        hiddenRows: [...sheet.hiddenRows],\n        hiddenColumns: [...sheet.hiddenColumns],\n        autoWidth: sheet.autoWidth,\n        autoFilter: sheet.autoFilter,\n      },\n    }));\n  }\n\n  toBuffer(options?: Partial<ExcelWriterOptions>): Uint8Array {\n    const writer = new ExcelWriter({ ...this.metadata, ...options });\n    return writer.createWorkbookBuffer(this.toExcelData());\n  }\n\n  toBlob(options?: Partial<ExcelWriterOptions>): Blob {\n    const writer = new ExcelWriter({ ...this.metadata, ...options });\n    return writer.createWorkbook(this.toExcelData());\n  }\n}\n","import { Zip, ZipDeflate, strToU8 } from 'fflate';\nimport { StyleManager } from '../core/style-manager';\nimport {\n  generateRowXml,\n  generateContentTypesXml,\n  generateWorkbookXml,\n  generateWorkbookRelsXml,\n  generateRootRelsXml,\n  generateCorePropsXml,\n  generateAppPropsXml,\n  generateStylesXml,\n  generateSheetViewsXml,\n  generateMergeCellsXml,\n  generateAutoFilterXml,\n  generateHyperlinksXml,\n  generateHyperlinkRelsXml,\n  generateWorksheetStart,\n  generateWorksheetEnd,\n  sheetRelsPath,\n  filterDatabaseNames,\n} from '../core/xml-templates';\nimport { generateColsXml } from '../core/column-width';\nimport { validateSheetNames } from '../core/sheet-name';\nimport { prepareLayout } from '../core/sheet-layout';\nimport { prepareHyperlinks, withHyperlinkStyles } from '../core/hyperlinks';\nimport { AutoFilter, CellValue, CellStyle, Hyperlink, SheetLayout } from '../core/types';\nimport type { ExcelWriterOptions } from './index';\n\nexport interface StreamingSheetInput extends SheetLayout {\n  name?: string;\n  rows: Iterable<CellValue[]> | AsyncIterable<CellValue[]>;\n  styles?: Record<string, CellStyle>;\n  freezePane?: { row?: number; col?: number };\n  columnWidths?: number[];\n  mergeCells?: string[];\n  autoFilter?: AutoFilter;\n  hyperlinks?: Hyperlink[];\n}\n\nconst hasFrozenSplit = (freezePane?: { row?: number; col?: number }): boolean =>\n  !!freezePane && ((freezePane.row ?? 0) > 0 || (freezePane.col ?? 0) > 0);\n\nconst validateStyles = (sheets: StreamingSheetInput[]): void => {\n  const probe = new StyleManager();\n  sheets.forEach(sheet =>\n    Object.values(sheet.styles ?? {}).forEach(style => probe.getStyleId(style))\n  );\n};\n\nexport async function* createExcelWorkbookStream(\n  sheets: StreamingSheetInput[],\n  options: ExcelWriterOptions = {}\n): AsyncGenerator<Uint8Array, void, unknown> {\n  const sheetNames = sheets.map((sheet, index) => sheet.name || `Sheet${index + 1}`);\n  validateSheetNames(sheetNames);\n  validateStyles(sheets);\n  const sheetLinks = sheets.map(sheet => prepareHyperlinks(sheet.hyperlinks));\n  const layouts = sheets.map(prepareLayout);\n  const definedNames = filterDatabaseNames(\n    sheetNames,\n    sheets.map(sheet => sheet.autoFilter)\n  );\n  const styleManager = new StyleManager();\n  const pending: Uint8Array[] = [];\n\n  const zip = new Zip((err, chunk) => {\n    if (err) throw err;\n    if (chunk) pending.push(chunk);\n  });\n\n  function* drain(): Generator<Uint8Array> {\n    while (pending.length > 0) {\n      yield pending.shift()!;\n    }\n  }\n\n  const addStaticEntry = (path: string, content: string): void => {\n    const entry = new ZipDeflate(path, { level: 6 });\n    zip.add(entry);\n    entry.push(strToU8(content), true);\n  };\n\n  addStaticEntry('[Content_Types].xml', generateContentTypesXml(sheets.length, false));\n  addStaticEntry('_rels/.rels', generateRootRelsXml());\n  addStaticEntry('xl/_rels/workbook.xml.rels', generateWorkbookRelsXml(sheets.length, false));\n  addStaticEntry('xl/workbook.xml', generateWorkbookXml(sheetNames, definedNames));\n  yield* drain();\n\n  for (let sheetIndex = 0; sheetIndex < sheets.length; sheetIndex++) {\n    const sheet = sheets[sheetIndex];\n    const links = sheetLinks[sheetIndex];\n    const layout = layouts[sheetIndex];\n    const styles = withHyperlinkStyles(sheet.styles, links);\n    const entry = new ZipDeflate(`xl/worksheets/sheet${sheetIndex + 1}.xml`, { level: 6 });\n    zip.add(entry);\n\n    const worksheetStart = generateWorksheetStart(\n      hasFrozenSplit(sheet.freezePane) ? generateSheetViewsXml(sheet.freezePane) : '',\n      generateColsXml(sheet.columnWidths ?? [], layout),\n      links\n    );\n    entry.push(strToU8(worksheetStart), false);\n    yield* drain();\n\n    let rowIndex = 0;\n    for await (const row of sheet.rows) {\n      const rowXml = generateRowXml(\n        row,\n        rowIndex,\n        styles,\n        styleManager,\n        undefined,\n        layout.rowAttributes(rowIndex)\n      );\n      entry.push(strToU8(rowXml), false);\n      yield* drain();\n      rowIndex++;\n    }\n\n    for (const layoutRow of layout.rows.filter(index => index >= rowIndex)) {\n      const rowXml = generateRowXml(\n        [],\n        layoutRow,\n        styles,\n        styleManager,\n        undefined,\n        layout.rowAttributes(layoutRow)\n      );\n      entry.push(strToU8(rowXml), false);\n      yield* drain();\n    }\n\n    const worksheetEnd = generateWorksheetEnd(\n      generateAutoFilterXml(sheet.autoFilter),\n      generateMergeCellsXml(sheet.mergeCells),\n      '',\n      '',\n      generateHyperlinksXml(links)\n    );\n    entry.push(strToU8(worksheetEnd), true);\n\n    const rels = generateHyperlinkRelsXml(links);\n    if (rels) {\n      addStaticEntry(sheetRelsPath(sheetIndex + 1), rels);\n    }\n    yield* drain();\n  }\n\n  addStaticEntry('xl/styles.xml', generateStylesXml(styleManager));\n  addStaticEntry(\n    'docProps/core.xml',\n    generateCorePropsXml(options.creator, options.title, options.subject)\n  );\n  addStaticEntry('docProps/app.xml', generateAppPropsXml());\n  yield* drain();\n\n  zip.end();\n  yield* drain();\n}\n\nexport async function streamToBuffer(\n  stream: AsyncGenerator<Uint8Array, void, unknown>\n): Promise<Uint8Array> {\n  const chunks: Uint8Array[] = [];\n  let total = 0;\n\n  for await (const chunk of stream) {\n    chunks.push(chunk);\n    total += chunk.length;\n  }\n\n  const result = new Uint8Array(total);\n  let offset = 0;\n  for (const chunk of chunks) {\n    result.set(chunk, offset);\n    offset += chunk.length;\n  }\n\n  return result;\n}\n","export { ExcelReader, parseExcel } from './reader';\nexport type { ParsedCell, ParsedSheet, ParsedWorkbook } from './reader';\nexport { Workbook } from './workbook';\nexport type { WorkbookMetadata } from './workbook';\n\nexport {\n  ExcelWriter,\n  createExcelFile,\n  createExcelFileBuffer,\n  dataValidation,\n  hyperlink,\n} from './writer';\nexport type {\n  ExcelWriterOptions,\n  ExcelData,\n  CellValidation,\n  CellStyle,\n  CellValue,\n  FormulaCell,\n  FormulaResult,\n  TextCell,\n  ErrorCell,\n  ExcelErrorValue,\n  SheetOptions,\n  ConditionalFormat,\n  DataValidationType,\n  DataValidationOperator,\n  AutoFilter,\n  Hyperlink,\n  HyperlinkOptions,\n  SheetLayout,\n  SheetState,\n} from './writer';\nexport type {\n  CellBorder,\n  BorderSide,\n  BorderSides,\n  BorderLine,\n  BorderLines,\n  BorderSideName,\n  BorderStyleName,\n  ParsedBorder,\n  ParsedCellStyle,\n  ConditionalFormatStyle,\n  ConditionalFormatOperator,\n  CellValueConditionalFormat,\n  ExpressionConditionalFormat,\n  ColorScaleConditionalFormat,\n  ExternalHyperlink,\n  InternalHyperlink,\n} from './core/types';\n\nexport { createExcelWorkbookStream, streamToBuffer } from './writer/stream';\nexport type { StreamingSheetInput } from './writer/stream';\n\nexport {\n  createExcelBlob,\n  createExcelBuffer,\n  extractExcelFiles,\n  validateExcelStructure,\n} from './core/zip-manager';\nexport type { ExcelFiles } from './core/zip-manager';\n\nexport { XML_NS, CONTENT_TYPES, RELATIONSHIP_TYPES, CELL_TYPES } from './core/constants';\nexport {\n  generateSheetXml,\n  generateSharedStringsXml,\n  generateStylesXml,\n  generateContentTypesXml,\n  generateWorkbookXml,\n  generateWorkbookRelsXml,\n  generateRootRelsXml,\n  generateCorePropsXml,\n  generateAppPropsXml,\n  generateSheetRelsXml,\n} from './core/xml-templates';\nexport type { SheetGenerationOptions, DefinedName } from './core/xml-templates';\n\nexport { StyleManager } from './core/style-manager';\nexport type { ExcelStyle, Font, Fill, Border, CellAlignment } from './core/style-manager';\n\nexport {\n  dateToExcelSerial,\n  excelSerialToDate,\n  isDate,\n  isDateNumFmtId,\n  isDateFormatCode,\n  EXCEL_LIMITS,\n  validateRowIndex,\n  validateColIndex,\n  validateCellValue,\n} from './core/date-utils';\n\nexport { calculateColumnWidths, generateColsXml } from './core/column-width';\n\nimport { coordinateToIndex, indexToCoordinate } from './core/cell-ref';\nexport { coordinateToIndex, indexToCoordinate };\n\nimport { ExcelReader as ReaderClass, parseExcel as parseFunction } from './reader';\nimport {\n  ExcelWriter as WriterClass,\n  createExcelFile as createFile,\n  createExcelFileBuffer as createFileBuffer,\n} from './writer';\nimport { Workbook as WorkbookClass } from './workbook';\n\nexport const ExcelBridge = {\n  read: parseFunction,\n  readFromFile: (file: File) => {\n    const reader = new ReaderClass();\n    return reader.parseFromFile(file);\n  },\n\n  write: createFile,\n  writeBuffer: createFileBuffer,\n\n  coordinateToIndex,\n  indexToCoordinate,\n\n  Writer: WriterClass,\n  Reader: ReaderClass,\n  Workbook: WorkbookClass,\n};\n"],"mappings":"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","names":["link","hyperlink","strToU8","strToU8"]}