@justybase/spreadsheet-tasks 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +85 -1
- package/README.md +125 -4
- package/browser/browser-spreadsheet.js +3659 -1784
- package/browser/justybase-spreadsheet.min.js +50 -23
- package/dist/cjs/index.d.ts +460 -61
- package/dist/cjs/index.js +5645 -2525
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +5625 -2525
- package/dist/esm/index.js.map +1 -1
- package/docs/API.md +130 -7
- package/package.json +6 -2
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/BigBuffer.ts","../../src/Formats.ts","../../src/writerHelpers.ts","../../src/ExcelReaderAbstract.ts","../../src/BiffReaderWriter.ts","../../src/XlsbReader.ts","../../src/xmlUtils.ts","../../src/biff12Utils.ts","../../src/XlsxReader.ts","../../src/ReaderFactory.ts","../../src/XlsbWriter.ts","../../src/StreamingSheetState.ts","../../src/XlsxWriter.ts","../../src/XlsxUpdater.ts","../../src/atomicFile.ts","../../src/streamingZip.ts","../../src/XlsbUpdater.ts","../../src/ExcelConverter.ts"],"sourcesContent":["import { Buffer } from 'buffer';\n\nexport class BigBuffer {\n private chunkSize: number;\n private chunks: Buffer[];\n private currentBuffer: Buffer;\n private cursor: number;\n\n constructor(chunkSize: number = 65536) {\n this.chunkSize = chunkSize;\n this.chunks = [];\n this.currentBuffer = Buffer.alloc(chunkSize);\n this.cursor = 0;\n }\n\n ensureCapacity(size: number): void {\n if (this.cursor + size > this.chunkSize) {\n this._flush();\n }\n }\n\n private _ensureCapacity(size: number): void {\n this.ensureCapacity(size);\n }\n\n private _flush(): void {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n }\n\n write(buffer: Buffer): void {\n let len = buffer.length;\n let offset = 0;\n\n while (len > 0) {\n let available = this.chunkSize - this.cursor;\n if (available === 0) {\n this._flush();\n available = this.chunkSize;\n }\n\n const toWrite = Math.min(len, available);\n buffer.copy(this.currentBuffer, this.cursor, offset, offset + toWrite);\n\n this.cursor += toWrite;\n offset += toWrite;\n len -= toWrite;\n }\n }\n\n writeByte(val: number): void {\n this._ensureCapacity(1);\n this.currentBuffer[this.cursor] = val;\n this.cursor++;\n }\n\n writeUnsafeByte(val: number): void {\n this.currentBuffer[this.cursor++] = val;\n }\n\n writeInt32LE(val: number): void {\n this._ensureCapacity(4);\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeUnsafeInt32LE(val: number): void {\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeDoubleLE(val: number): void {\n this._ensureCapacity(8);\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeUnsafeDoubleLE(val: number): void {\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeString(str: string): void {\n const byteLength = Buffer.byteLength(str, 'utf8');\n\n if (this.cursor + byteLength <= this.chunkSize) {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n return;\n }\n\n this._flush();\n\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf8'));\n } else {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n }\n }\n\n writeUtf16LE(str: string): void {\n const byteLength = str.length * 2;\n\n if (this.cursor + byteLength <= this.chunkSize) {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n return;\n }\n\n this._flush();\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf16le'));\n } else {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n }\n }\n\n getChunks(): Buffer[] {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n return this.chunks;\n }\n\n reset(): void {\n this.chunks = [];\n this.cursor = 0;\n }\n}\n\nexport default BigBuffer;\n","export type PrimitiveCellValue = string | number | boolean | Date | bigint | null | undefined;\n\nexport interface FormattedCell {\n value: PrimitiveCellValue;\n format: string;\n}\n\nexport type CellValue = PrimitiveCellValue | FormattedCell;\n\n/** Built-in Excel number-format strings for {@link FormattedCell}. */\nexport const F = {\n THOUSANDS_SEP: '#,##0',\n CURRENCY_PLN: '#,##0.00 \"z\\u0142\"',\n CURRENCY_EUR: '#,##0.00 \\u20AC',\n PERCENTAGE: '0%',\n SCIENTIFIC: '0.00E+00',\n TWO_DECIMALS: '#,##0.00',\n TEXT: '@',\n LEADING_ZEROS: '000000000',\n\n DATE_SHORT: 'dd.mm.yyyy',\n DATE_LONG: 'd mmmm yyyy',\n DATE_DAY_MONTH_YEAR: 'dd-mm-yyyy',\n DATE_ISO: 'yyyy-mm-dd',\n DATE_MONTH_YEAR: 'mmmm yyyy',\n DATE_WEEKDAY: 'dddd, d mmmm yyyy',\n DATE_DAY_MONTH: 'd mmmm',\n DATE_YEAR_ONLY: 'yyyy',\n\n DATETIME_SHORT: 'dd.mm.yyyy hh:mm',\n DATETIME_LONG: 'd mmmm yyyy hh:mm:ss',\n TIME_HH_MM: 'hh:mm',\n TIME_HH_MM_SS: 'hh:mm:ss',\n TIME_12H: 'h:mm AM/PM',\n DATETIME_24H: 'dd.mm.yyyy hh:mm:ss',\n DATETIME_ISO: 'yyyy-mm-dd\"T\"hh:mm:ss',\n TIME_MS: 'hh:mm:ss.000',\n};\n\nexport function isFormattedCell(val: unknown): val is FormattedCell {\n return val !== null && val !== undefined && typeof val === 'object' && 'format' in val && typeof (val as FormattedCell).format === 'string';\n}\n\nexport function unwrapCell(val: CellValue): PrimitiveCellValue {\n if (isFormattedCell(val)) {\n return val.value;\n }\n return val;\n}\n\nexport function getFormat(val: CellValue): string | null {\n if (isFormattedCell(val)) {\n return val.format;\n }\n return null;\n}\n","import { isFormattedCell } from './Formats';\n\nconst OA_EPOCH_1900 = Date.UTC(1899, 11, 30);\nconst MARCH_1_1900 = Date.UTC(1900, 2, 1);\n\n/**\n * Convert an Excel serial number to milliseconds since the given epoch.\n *\n * The 1900 date system counts a fictitious 1900-02-29 (serial 60), so serials\n * 1-59 denote 1900-01-01 through 1900-02-28 and must be shifted by one day\n * (Excel/xlspy/openpyxl parity). The 1904 system has no such gap.\n */\nexport function oaDateToTime(oaDate: number, epochMs: number): number {\n let serial = oaDate;\n if (epochMs === OA_EPOCH_1900 && serial >= 1 && serial < 60) {\n serial += 1;\n }\n return Math.round(serial * 86400000) + epochMs;\n}\n\n/**\n * Convert milliseconds since the given epoch to an Excel serial number.\n *\n * Inverse of {@link oaDateToTime}: dates before 1900-03-01 in the 1900 system\n * serialize one day lower to leave room for the fictitious 1900-02-29\n * (Excel/xlspy/openpyxl parity).\n */\nexport function timeToOaDate(timeMs: number, epochMs: number): number {\n let serial = (timeMs - epochMs) / 86400000;\n if (epochMs === OA_EPOCH_1900 && timeMs < MARCH_1_1900) {\n serial -= 1;\n }\n return serial;\n}\n\n/** Excel sheet name characters that must be replaced. */\nexport const INVALID_SHEET_NAME_CHARS = /[\\\\/*?[\\]:]/g;\n\n/**\n * Sanitize an Excel sheet name (invalid chars, max 31 chars, non-empty).\n * @param sheetCount Current sheet count before adding this sheet (used for defaults).\n */\nexport function sanitizeSheetName(name: string, sheetCount: number): string {\n if (!name || typeof name !== 'string') {\n return `Sheet${sheetCount + 1}`;\n }\n\n let sanitized = name.replace(INVALID_SHEET_NAME_CHARS, '_');\n\n if (sanitized.length > 31) {\n sanitized = sanitized.substring(0, 31);\n }\n\n if (sanitized.trim().length === 0) {\n sanitized = `Sheet${sheetCount + 1}`;\n }\n\n return sanitized;\n}\n\n/** Excel limits (decision: throw on violation, like xlspy). */\nexport const MAX_ROWS = 1_048_576;\nexport const MAX_COLS = 16_384;\nexport const MAX_CELL_CHARS = 32_767;\n\n/** Length in UTF-16 code units (JS string length already counts astral as 2). */\nexport function utf16Length(text: string): number {\n return text.length;\n}\n\n/** Throw when cell text exceeds Excel's 32,767 UTF-16 unit limit. */\nexport function assertCellTextLength(text: string): void {\n if (text.length > MAX_CELL_CHARS) {\n throw new Error(\n `Excel cell text exceeds ${MAX_CELL_CHARS} UTF-16 code units (got ${text.length}).`\n );\n }\n}\n\n/** Throw when column count is outside Excel bounds. */\nexport function assertColumnCount(columnCount: number): void {\n if (!Number.isInteger(columnCount) || columnCount < 1 || columnCount > MAX_COLS) {\n throw new Error(\n `Excel column count must be 1..${MAX_COLS} (got ${columnCount}).`\n );\n }\n}\n\n/** Throw when a row/header is longer than the declared column count. */\nexport function assertRowFitsColumns(kind: string, length: number, columnCount: number): void {\n if (length > columnCount) {\n throw new Error(\n `Excel ${kind} length ${length} exceeds columnCount ${columnCount}.`\n );\n }\n}\n\n/** Throw when total row count exceeds Excel bounds. */\nexport function assertRowCount(totalRows: number): void {\n if (totalRows > MAX_ROWS) {\n throw new Error(\n `Excel row count exceeds ${MAX_ROWS} (got ${totalRows}).`\n );\n }\n}\n\n/** Create column-width scratch array filled with -1 (unknown). */\nexport function initColWidths(columnCount: number): number[] {\n return new Array(columnCount).fill(-1.0);\n}\n\n/** Apply autofit widths from header labels. */\nexport function applyHeaderWidths(colWidths: number[], headers: string[], columnCount: number): void {\n for (let i = 0; i < columnCount; i++) {\n const len = headers[i] ? headers[i].length + 1 : 0;\n let width = 1.25 * len + 2;\n if (width > 80) width = 80;\n if (colWidths[i] < width) colWidths[i] = width;\n }\n}\n\n/**\n * Sample up to `sampleLimit` rows and expand column widths (autofit).\n * Skips null/undefined cells; Dates use a fixed display length of 20.\n */\nexport function updateColWidthsFromRows(\n colWidths: number[],\n rows: unknown[][],\n sampleLimit: number = 100\n): void {\n for (let r = 0; r < Math.min(rows.length, sampleLimit); r++) {\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n const val = isFormattedCell(raw) ? raw.value : raw;\n const len = val instanceof Date ? 20 : String(val).length + 1;\n let width = 1.25 * len + 2;\n if (width > 80) width = 80;\n if (colWidths[c] < width) colWidths[c] = width;\n }\n }\n}\n\n/**\n * Resolve a stored autofit width to the value written into the file.\n * XLSB uses floored integers; XLSX keeps the float.\n */\nexport function defaultColWidth(width: number, floor: boolean = false): number {\n if (width > 0) {\n return floor ? Math.floor(width) : width;\n }\n return 10;\n}\n\n/**\n * The `r` attribute of a cell (leading space included), or '' when the cell\n * directly follows the previous written cell in its row. Such cells take their\n * column from their position, so `r` is only needed after a gap. The first cell\n * of a row has `prevCol = -1` and sits in column A without `r`.\n */\nexport function cellRefAttr(col: number, prevCol: number, colRef: string, rowNum: number): string {\n return col === prevCol + 1 ? '' : ` r=\"${colRef}${rowNum}\"`;\n}\n\n/** Deflate level for the ZIP package. 6 is the zlib default; level 1 (archiver's own default) makes sheet XML about twice as large. */\nexport const DEFAULT_COMPRESSION_LEVEL = 6;\n\nexport function assertCompressionLevel(level: number): number {\n if (!Number.isInteger(level) || level < 0 || level > 9) {\n throw new RangeError(`compressionLevel must be an integer from 0 to 9, got ${level}`);\n }\n return level;\n}\n","import { CellValue } from './Formats';\nimport { oaDateToTime } from './writerHelpers';\n\n/**\n * Shared reader surface for XLSB and XLSX.\n * Always use `await reader.read()` — both formats are async in v2+.\n */\nexport abstract class ExcelReaderAbstract {\n fieldCount: number = 0;\n rowCount: number = 0;\n actualSheetName: string = '';\n resultsCount: number = 0;\n\n protected _oaEpoch: number;\n\n constructor() {\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n /** Open a workbook file. */\n abstract open(path: string, readSharedStrings?: boolean, updateMode?: boolean): Promise<void>;\n\n async close(): Promise<void> {\n // cleanup if needed\n }\n\n /**\n * Advance to the next row.\n * @returns true if a row is available; false at EOF\n */\n abstract read(): Promise<boolean>;\n\n /** Worksheet names in workbook order. */\n abstract getSheetNames(): string[];\n\n /** Cell value for column index `i` of the current row (0-based). */\n abstract getValue(i: number): CellValue;\n\n /**\n * Select a worksheet for subsequent `read()` calls (by name or 0-based index).\n * Resets row state/EOF; default is sheet 0. Resets `fieldCount`.\n */\n abstract selectSheet(nameOrIndex: string | number): Promise<void>;\n\n /**\n * Advance to the next worksheet (like `nextResult` in DB readers).\n * @returns true if another sheet was selected; false at end.\n */\n abstract nextResult(): Promise<boolean>;\n\n dispose(): void {\n // cleanup\n }\n\n getDateTimeFromOaDate(oaDate: number): Date {\n // Round to the nearest millisecond: the float product can land just below a whole ms (x.999),\n // and Date truncates instead of rounding. Handles the fictitious 1900-02-29.\n return new Date(oaDateToTime(oaDate, this._oaEpoch));\n }\n}\n\nexport default ExcelReaderAbstract;\n","export class BiffReaderWriter {\n private buffer: Buffer;\n private pos: number;\n private length: number;\n\n _isSheet: boolean = false;\n _workbookId: number = 0;\n _recId: string | null = null;\n _workbookName: string | null = null;\n\n private _inCellXf: boolean = false;\n private _inNumberFormat: boolean = false;\n private _numberFormatIndex: number = 0;\n private _format: number = 0;\n private _formatString: string | null = null;\n\n _sharedStringValue: string | null = null;\n _sharedStringUniqueCount: number = 0;\n\n _cellType: number = 0;\n _intValue: number = 0;\n _doubleVal: number = 0.0;\n _boolValue: boolean = false;\n _stringValue: string | null = null;\n _columnNum: number = -1;\n _xfIndex: number = 0;\n _readCell: boolean = false;\n _rowIndex: number = -1;\n\n // Start of the current record data (excluding ID and Length)\n private _recordStart: number = 0;\n\n _xfIndexToNumFmtId: number[] = [];\n _customNumFmts: Set<number> = new Set();\n\n constructor(buffer: Buffer) {\n if (!Buffer.isBuffer(buffer)) {\n throw new Error(\"BiffReaderWriter expects a Buffer\");\n }\n this.buffer = buffer;\n this.pos = 0;\n this.length = buffer.length;\n }\n\n private _tryReadVariableValue(): number | null {\n if (this.pos >= this.length) return null;\n\n const b1 = this.buffer[this.pos++];\n let value = (b1 & 0x7F) >>> 0;\n\n if ((b1 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b2 = this.buffer[this.pos++];\n value = (((b2 & 0x7F) << 7) | value) >>> 0;\n\n if ((b2 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b3 = this.buffer[this.pos++];\n value = (((b3 & 0x7F) << 14) | value) >>> 0;\n\n if ((b3 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b4 = this.buffer[this.pos++];\n value = (((b4 & 0x7F) << 21) | value) >>> 0;\n\n return value;\n }\n\n private _getDWord(offset: number): number {\n return this.buffer.readUInt32LE(this._recordStart + offset);\n }\n\n private _getInt32(offset: number): number {\n return this.buffer.readInt32LE(this._recordStart + offset);\n }\n\n private _getWord(offset: number): number {\n return this.buffer.readUInt16LE(this._recordStart + offset);\n }\n\n private _getByte(offset: number): number {\n return this.buffer[this._recordStart + offset];\n }\n\n private _getDouble(offset: number): number {\n return this.buffer.readDoubleLE(this._recordStart + offset);\n }\n\n private _getString(offset: number, length: number): string {\n const start = this._recordStart + offset;\n const end = start + (length * 2);\n if (end > this.buffer.length) return \"\";\n return this.buffer.toString('utf16le', start, end);\n }\n\n private _getNullableString(offsetRef: { val: number }): string | null {\n const length = this._getDWord(offsetRef.val);\n offsetRef.val += 4;\n\n if (length === 0xFFFFFFFF) return null;\n\n const str = this._getString(offsetRef.val, length);\n offsetRef.val += (length * 2);\n return str;\n }\n\n readWorkbook(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._isSheet = false;\n\n if (recordId === 0x9C) {\n this._workbookId = this._getDWord(4);\n\n const offsetRef = { val: 8 };\n this._recId = this._getNullableString(offsetRef);\n\n const nameLength = this._getDWord(offsetRef.val);\n this._workbookName = this._getString(offsetRef.val + 4, nameLength);\n this._isSheet = true;\n }\n\n return true;\n }\n\n readSharedStrings(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._sharedStringValue = null;\n\n if (recordId === 0x13) {\n const length = this._getDWord(1);\n this._sharedStringValue = this._getString(5, length);\n }\n else if (recordId === 159) {\n this._sharedStringUniqueCount = this._getDWord(4);\n }\n\n return true;\n }\n\n readStyles(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n const _cellXfStart = 0x269;\n const _cellXfEnd = 0x26a;\n const _numberFormatStart = 0x267;\n const _numberFormatEnd = 0x268;\n const _xf = 0x2f;\n const _numberFormat = 0x2c;\n\n switch (recordId) {\n case _cellXfStart:\n this._inCellXf = true;\n break;\n case _cellXfEnd:\n this._inCellXf = false;\n break;\n case _numberFormatStart:\n this._inNumberFormat = true;\n break;\n case _numberFormatEnd:\n this._inNumberFormat = false;\n break;\n\n case _xf:\n if (this._inCellXf) {\n this._numberFormatIndex = this._getWord(2);\n this._xfIndexToNumFmtId.push(this._numberFormatIndex);\n }\n break;\n\n case _numberFormat:\n if (this._inNumberFormat) {\n this._format = this._getWord(0);\n const length = this._getDWord(2);\n this._formatString = this._getString(6, length);\n\n const code = this._formatString.toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n this._customNumFmts.add(this._format);\n }\n }\n break;\n }\n\n return true;\n }\n\n private _getRkNumber(offset: number): number {\n const flags = this._getByte(offset);\n let result = 0;\n\n if ((flags & 0x02) !== 0) {\n const intVal = this._getInt32(offset);\n result = intVal >> 2;\n } else {\n const raw = this._getInt32(offset);\n const highBits = (raw & 0xFFFFFFFC);\n\n // Need to construct a double from high bits.\n // Since we can't easily write to a reused buffer without risk,\n // we'll just alloc 8 bytes here. It's rare for RK to be double.\n // Alternatively, we could reuse a small buffer if we cared enough.\n const dBuf = Buffer.allocUnsafe(8);\n dBuf.writeInt32LE(0, 0);\n dBuf.writeInt32LE(highBits, 4);\n\n result = dBuf.readDoubleLE(0);\n }\n\n if ((flags & 0x01) !== 0) {\n result /= 100;\n }\n\n return result;\n }\n\n readWorksheet(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._readCell = false;\n this._columnNum = -1;\n\n const _row = 0x00;\n const _blank = 0x01;\n const _number = 0x02;\n const _boolError = 0x03;\n const _bool = 0x04;\n const _float = 0x05;\n const _string = 0x06;\n const _sharedString = 0x07;\n const _formulaString = 0x08;\n const _formulaNumber = 0x09;\n const _formulaBool = 0x0a;\n const _formulaError = 0x0b;\n\n switch (recordId) {\n case _row:\n this._rowIndex = this._getInt32(0);\n break;\n\n case _blank:\n case _boolError:\n case _formulaError:\n this._readCell = true;\n this._cellType = 0;\n break;\n\n case _number:\n this._doubleVal = this._getRkNumber(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _bool:\n case _formulaBool:\n this._boolValue = (this._getByte(8) === 1);\n this._readCell = true;\n this._cellType = 4;\n break;\n\n case _formulaNumber:\n case _float:\n this._doubleVal = this._getDouble(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _string:\n case _formulaString:\n {\n const length = this._getDWord(8);\n this._stringValue = this._getString(12, length);\n this._readCell = true;\n this._cellType = 5;\n break;\n }\n\n case _sharedString:\n this._intValue = this._getDWord(8);\n this._readCell = true;\n this._cellType = 2;\n break;\n }\n\n if (this._readCell) {\n this._columnNum = this._getDWord(0);\n this._xfIndex = this._getDWord(4) & 0xffffff;\n }\n\n return true;\n }\n}\n\nexport default BiffReaderWriter;\n","import AdmZip from 'adm-zip';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { BiffReaderWriter } from './BiffReaderWriter';\nimport { CellValue } from './Formats';\nimport { parseTagAttributes, resolveRelTarget } from './xmlUtils';\nimport { readRecord, Biff12Record } from './biff12Utils';\nimport { MAX_ROWS } from './writerHelpers';\n\ninterface SheetInfo {\n name: string;\n rId: string;\n path: string | null;\n}\n\nexport class XlsbReader extends ExcelReaderAbstract {\n private zip: AdmZip | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n\n private _currentSheetIndex: number = -1;\n private _reader: BiffReaderWriter | null = null;\n private _currentRow: CellValue[] = [];\n private _pendingRowIndex: number = -1;\n private _nextExpectedRow: number = 0;\n private _eof: boolean = false;\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> | null = null;\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n await this.close();\n // Reset state for re-open (xlspy parity).\n this.sheetNames = [];\n this.sheets = [];\n this.sharedStrings = [];\n this.xfIdToNumFmtId = [];\n this.customDateFormats = new Set();\n this.fieldCount = 0;\n this.resultsCount = 0;\n this.actualSheetName = '';\n this._currentSheetIndex = -1;\n this._currentRow = [];\n this._pendingRowIndex = -1;\n this._nextExpectedRow = 0;\n this._eof = false;\n this._reader = null;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n this.zip = new AdmZip(path);\n\n const wbEntry = this.zip.getEntry('xl/workbook.bin');\n if (wbEntry) {\n const buf = wbEntry.getData();\n const reader = new BiffReaderWriter(buf);\n while (reader.readWorkbook()) {\n if (reader._isSheet) {\n const name = reader._workbookName!;\n const rId = reader._recId!;\n this.sheetNames.push(name);\n this.sheets.push({ name, rId, path: null });\n }\n }\n }\n\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.bin.rels');\n if (relsEntry) {\n const xml = relsEntry.getData().toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n const rIdToTarget: Record<string, string> = {};\n while ((tagMatch = relTagRe.exec(xml)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) {\n rIdToTarget[id] = target;\n }\n }\n\n for (const sheet of this.sheets) {\n const target = rIdToTarget[sheet.rId];\n if (target) {\n sheet.path = resolveRelTarget(target);\n }\n }\n }\n\n // 1904 date system: BrtWbProp (0x99) bit0 f1904 in workbook.bin.\n try {\n const raw = wbEntry ? wbEntry.getData() : null;\n if (raw) {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(raw, pos, rec)) {\n if (rec.id === 0x99 && rec.len >= 4) {\n const is1904 = (raw[rec.dataStart] & 0x01) !== 0;\n this._oaEpoch = is1904 ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n break;\n }\n pos = rec.dataEnd;\n }\n }\n } catch {\n // Keep default epoch on parse errors.\n }\n\n if (readSharedStrings) {\n const ssPath = 'xl/sharedStrings.bin';\n if (this.zip.getEntry(ssPath)) {\n this._readSharedStrings(ssPath);\n }\n }\n\n const stylesPath = 'xl/styles.bin';\n if (this.zip.getEntry(stylesPath)) {\n this._readStyles(stylesPath);\n }\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n }\n\n private _readSharedStrings(path: string): void {\n const entry = this.zip!.getEntry(path);\n if (!entry) return;\n const reader = new BiffReaderWriter(entry.getData());\n\n while (reader.readSharedStrings()) {\n if (reader._sharedStringValue !== null) {\n this.sharedStrings.push(reader._sharedStringValue);\n }\n }\n }\n\n private _readStyles(path: string): void {\n const entry = this.zip!.getEntry(path);\n if (!entry) return;\n\n const reader = new BiffReaderWriter(entry.getData());\n while (reader.readStyles()) {\n // just consume\n }\n\n this.xfIdToNumFmtId = reader._xfIndexToNumFmtId;\n this.customDateFormats = reader._customNumFmts;\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n async selectSheet(nameOrIndex: string | number): Promise<void> {\n let index = -1;\n if (typeof nameOrIndex === 'number') {\n index = nameOrIndex;\n } else {\n index = this.sheetNames.indexOf(nameOrIndex);\n if (index === -1) throw new Error(`Sheet '${nameOrIndex}' not found`);\n }\n if (index < 0 || index >= this.sheets.length) {\n throw new Error(`Sheet index ${String(nameOrIndex)} out of range`);\n }\n this._currentSheetIndex = index;\n if (!this._initSheet(index)) {\n throw new Error(`XlsbReader: worksheet part missing for sheet '${this.sheetNames[index]}'.`);\n }\n }\n\n async nextResult(): Promise<boolean> {\n const next = this._currentSheetIndex + 1;\n if (next >= this.sheets.length) return false;\n this._currentSheetIndex = next;\n if (!this._initSheet(next)) {\n throw new Error(`XlsbReader: worksheet part missing for sheet '${this.sheetNames[next]}'.`);\n }\n return true;\n }\n\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n if (!this._initSheet(0)) return false;\n }\n\n if (this._eof) return false;\n\n // Gap rows (missing BrtRowHdr) are returned as empty rows. An index beyond\n // Excel's row limit is malformed: skip the fill instead of yielding millions of rows.\n if (this._pendingRowIndex > this._nextExpectedRow && this._pendingRowIndex < MAX_ROWS) {\n this._currentRow = [];\n this._nextExpectedRow++;\n return true;\n }\n\n this._currentRow = [];\n\n while (true) {\n const hasRecord = this._reader!.readWorksheet();\n if (!hasRecord) {\n this._eof = true;\n // If the current row never had cells and we never yielded it,\n // still return it once (handles single empty row sheets).\n // When _currentRow is empty and pending was already yielded,\n // the caller already got it via gap logic; avoid duplicate.\n // Here pending == expected, so this is the last row.\n this._nextExpectedRow = this._pendingRowIndex + 1;\n return true;\n }\n\n if (this._reader!._rowIndex !== -1 && this._reader!._rowIndex !== this._pendingRowIndex) {\n const completed = this._pendingRowIndex;\n this._pendingRowIndex = this._reader!._rowIndex;\n this._nextExpectedRow = completed + 1;\n return true;\n }\n\n if (this._reader!._readCell) {\n const col = this._reader!._columnNum;\n let val: CellValue = null;\n switch (this._reader!._cellType) {\n case 2:\n val = this.sharedStrings[this._reader!._intValue];\n break;\n case 3: {\n val = this._reader!._doubleVal;\n\n const xfIndex = this._reader!._xfIndex;\n let numFmtId = 0;\n if (this.xfIdToNumFmtId && xfIndex < this.xfIdToNumFmtId.length) {\n numFmtId = this.xfIdToNumFmtId[xfIndex];\n }\n\n const isDate = (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n (this.customDateFormats && this.customDateFormats.has(numFmtId));\n\n if (isDate) {\n try {\n val = this.getDateTimeFromOaDate(val as number);\n } catch {\n // ignore date conversion errors\n }\n }\n break;\n }\n case 4:\n val = this._reader!._boolValue;\n break;\n case 5:\n val = this._reader!._stringValue;\n break;\n default:\n val = null;\n }\n\n this._currentRow[col] = val;\n if (col >= this.fieldCount) this.fieldCount = col + 1;\n }\n }\n }\n\n private _initSheet(index: number): boolean {\n if (index < 0 || index >= this.sheets.length) return false;\n const sheet = this.sheets[index];\n const entry = sheet.path ? this.zip!.getEntry(sheet.path) : undefined;\n // Only a missing part is an error; a valid but empty sheet is selected\n // successfully and reports EOF through read().\n if (!entry) return false;\n\n this._reader = new BiffReaderWriter(entry.getData());\n this._eof = false;\n this._pendingRowIndex = -1;\n this._nextExpectedRow = 0;\n this._currentRow = [];\n this.fieldCount = 0;\n this.actualSheetName = sheet.name;\n\n while (this._reader.readWorksheet()) {\n if (this._reader._rowIndex !== -1) {\n this._pendingRowIndex = this._reader._rowIndex;\n return true;\n }\n }\n\n this._eof = true;\n return true;\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsbReader;\n","/**\n * Shared low-level XML helpers used by readers and the XlsxUpdater.\n */\n\n/** True when the string contains XML-invalid control characters (tab/CR/LF are allowed). */\nfunction hasInvalidControlChars(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) {\n return true;\n }\n }\n return false;\n}\n\n/** Remove XML-invalid control characters (tab/CR/LF and normal ranges are kept). */\nfunction stripInvalidControlChars(str: string): string {\n let out = '';\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c === 0x09 || c === 0x0a || c === 0x0d || (c >= 0x20 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfffd)) {\n out += str[i];\n }\n }\n return out;\n}\n\n/** Escape text content for use inside an XML element body. */\nexport function escapeXmlText(str: string): string {\n if (!/[&<>\"'\\r]/.test(str) && !hasInvalidControlChars(str)) {\n return str;\n }\n // CR is written as so readers that normalize raw line ends keep it.\n let out = str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\r/g, ' ');\n if (hasInvalidControlChars(out)) {\n out = stripInvalidControlChars(out);\n }\n return out;\n}\n\n/** Unescape the five predefined XML entities (single-pass, order-independent). */\nexport function unescapeXml(str: string): string {\n if (!str || str.indexOf('&') === -1) return str;\n return str.replace(/&(?:amp|lt|gt|quot|apos|#\\d+|#x[0-9a-fA-F]+);/g, (entity: string) => {\n switch (entity) {\n case '&': return '&';\n case '<': return '<';\n case '>': return '>';\n case '"': return '\"';\n case ''': return \"'\";\n default: {\n // Numeric character reference: { or 😀\n if (entity[1] === '#') {\n const body = entity.slice(2, -1);\n const code = body[0] === 'x' || body[0] === 'X'\n ? parseInt(body.slice(1), 16)\n : parseInt(body, 10);\n if (Number.isFinite(code)) {\n try { return String.fromCodePoint(code); } catch { return entity; }\n }\n }\n return entity;\n }\n }\n });\n}\n\n/**\n * Escape text of a shared string or inline string. Beyond XML escaping, a literal\n * `_xHHHH_` must be written as `_x005F_xHHHH_` because Excel decodes that pattern\n * in these elements (ECMA-376 ST_Xstring). Attribute values use `escapeXmlText`.\n */\nexport function escapeXlsxText(str: string): string {\n return escapeXmlText(str.replace(/_x([0-9A-Fa-f]{4})_/g, '_x005F_x$1_'));\n}\n\n/**\n * Unescape element text content. Raw CR LF and lone CR are normalized to LF first\n * (XML 1.0 §2.11); character references such as ` ` are kept as CR. Then the\n * ST_Xstring escape `_xHHHH_` that Excel writes for control characters is decoded.\n */\nexport function unescapeXmlText(str: string): string {\n if (!str) return str;\n const text = unescapeXml(str.indexOf('\\r') === -1 ? str : str.replace(/\\r\\n?/g, '\\n'));\n return text.indexOf('_x') === -1\n ? text\n : text.replace(/_x([0-9A-Fa-f]{4})_/g, (_match: string, hex: string) => String.fromCharCode(parseInt(hex, 16)));\n}\n\n/** Parse XML tag attributes into a map, independent of order/prefix/quote style. */\nexport function parseTagAttributes(tag: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n // Matches name=\"value\" or name='value', allowing : and . in names (r:id, xml:space).\n const re = /([A-Za-z_][\\w.:-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(tag)) !== null) {\n const name = m[1];\n const value = m[3] !== undefined ? m[3] : m[4];\n attrs[name] = value;\n // Also store local name without prefix for convenience (r:id -> id).\n const colon = name.indexOf(':');\n if (colon !== -1) {\n const local = name.slice(colon + 1);\n if (!(local in attrs)) attrs[local] = value;\n }\n }\n return attrs;\n}\n\n/** Resolve a workbook rel Target to a zip entry path (xlspy _resolve_path logic). */\nexport function resolveRelTarget(target: string): string {\n if (!target) return target;\n if (target.startsWith('/')) return target.slice(1);\n if (target.startsWith('xl/')) return target;\n return 'xl/' + target;\n}\n\n/** 0-based column index -> \"A\", \"B\", ..., \"AA\", \"AB\", ... (bijective base-26). */\nexport function columnIndexToLetter(colIndex: number): string {\n let n = colIndex + 1;\n let result = '';\n while (n > 0) {\n const rem = (n - 1) % 26;\n result = String.fromCharCode(65 + rem) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/** \"A\", \"AB\", ... -> 0-based column index. */\nexport function columnLetterToIndex(letter: string): number {\n let column = 0;\n const length = letter.length;\n for (let i = 0; i < length; i++) {\n column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);\n }\n return column - 1;\n}\n\n/**\n * Remove trailing rows that contain no non-empty cells (padding rows sometimes\n * produced by SQL exports). This keeps the written range aligned with the\n * actual data, so pivot tables do not pick up \"(blank)\" items from empty rows.\n */\nexport function trimTrailingEmptyRows<T>(rows: T[][]): T[][] {\n let end = rows.length;\n while (end > 0 && rows[end - 1].every(v => v === null || v === undefined)) {\n end--;\n }\n return end === rows.length ? rows : rows.slice(0, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.xml into the list of string values.\n * Handles plain `<si><t>…</t></si>` entries as well as rich-text `<si><r><t>…</t></r></si>` runs.\n * Phonetic `<rPh>` blocks are skipped (xlspy parity) and self-closing `<si/>` yields \"\".\n */\nexport function parseSharedStringsXml(xml: string): string[] {\n const result: string[] = [];\n // Self-closing <si/> entries (empty strings) — count them to keep indices aligned.\n // Full <si>…</si> entries handled below.\n const itemRegex = /<(?:(?:[A-Za-z_][\\w.-]*):)?si\\b[^>]*>([\\s\\S]*?)<\\/(?:(?:[A-Za-z_][\\w.-]*):)?si\\s*>|<(?:(?:[A-Za-z_][\\w.-]*):)?si\\b[^>]*\\/>/gi;\n let itemMatch: RegExpExecArray | null;\n while ((itemMatch = itemRegex.exec(xml)) !== null) {\n const full = itemMatch[0];\n if (full.endsWith('/>') && itemMatch[1] === undefined) {\n result.push('');\n continue;\n }\n let content = itemMatch[1] ?? '';\n // Skip phonetic runs entirely (their <t> is a reading hint, not cell text).\n content = content.replace(/<(?:(?:[A-Za-z_][\\w.-]*):)?rPh\\b[^>]*>[\\s\\S]*?<\\/(?:(?:[A-Za-z_][\\w.-]*):)?rPh\\s*>/gi, '');\n // Handle self-closing rPh as well.\n content = content.replace(/<(?:(?:[A-Za-z_][\\w.-]*):)?rPh\\b[^>]*\\/>/gi, '');\n const textRegex = /<(?:(?:[A-Za-z_][\\w.-]*):)?t\\b[^>]*>([\\s\\S]*?)<\\/(?:(?:[A-Za-z_][\\w.-]*):)?t\\s*>/gi;\n let value = '';\n let textMatch: RegExpExecArray | null;\n while ((textMatch = textRegex.exec(content)) !== null) {\n value += textMatch[1];\n }\n result.push(unescapeXmlText(value));\n }\n return result;\n}\n","/**\n * Low-level BIFF12 (XLSB) record helpers shared by readers and the XlsbUpdater.\n *\n * A BIFF12 record is: VLQ(id) + VLQ(length) + payload[length].\n */\n\n/** Decode a 7-bit VLQ integer at `pos`. Returns the value and the next byte offset. */\nexport function readVlq(buf: Buffer, pos: number): { value: number; nextPos: number } {\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n byte = buf[pos++];\n value |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n return { value, nextPos: pos };\n}\n\n/** Number of bytes needed to VLQ-encode `value`. */\nexport function vlqLength(value: number): number {\n let n = 1;\n while (value >= 0x80) {\n n++;\n value >>>= 7;\n }\n return n;\n}\n\n/** Encode `value` as a 7-bit VLQ byte array. */\nexport function vlqBytes(value: number): number[] {\n const out: number[] = [];\n while (value >= 0x80) {\n out.push((value & 0x7f) | 0x80);\n value >>>= 7;\n }\n out.push(value & 0x7f);\n return out;\n}\n\n/** A single BIFF12 record view (byte offsets into the source buffer). */\nexport interface Biff12Record {\n /** Byte offset of the record header (id + length). */\n headerStart: number;\n /** Byte offset just past the header — the payload starts here. */\n dataStart: number;\n /** Byte offset just past the payload. */\n dataEnd: number;\n id: number;\n len: number;\n}\n\n/**\n * Fill `rec` with the record starting at `pos`. Returns false when the buffer\n * is exhausted or the record would run past the end.\n */\nexport function readRecord(buf: Buffer, pos: number, rec: Biff12Record): boolean {\n const idRes = readVlq(buf, pos);\n if (idRes.nextPos > buf.length) return false;\n const lenRes = readVlq(buf, idRes.nextPos);\n if (lenRes.nextPos + lenRes.value > buf.length) return false;\n\n rec.headerStart = pos;\n rec.dataStart = lenRes.nextPos;\n rec.dataEnd = lenRes.nextPos + lenRes.value;\n rec.id = idRes.value;\n rec.len = lenRes.value;\n return true;\n}\n\n/** Build a BIFF12 record from an id and payload buffer. */\nexport function buildRecord(id: number, payload: Buffer): Buffer {\n const idBytes = vlqBytes(id);\n const lenBytes = vlqBytes(payload.length);\n const header = Buffer.alloc(idBytes.length + lenBytes.length);\n idBytes.forEach((b, i) => (header[i] = b));\n lenBytes.forEach((b, i) => (header[idBytes.length + i] = b));\n return Buffer.concat([header, payload]);\n}\n\n/** Read a UTF-16LE string of `charCount` characters starting at `start`. */\nexport function readUtf16(buf: Buffer, start: number, charCount: number): string {\n const end = start + charCount * 2;\n if (end > buf.length) return '';\n return buf.toString('utf16le', start, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.bin.\n * Returns the string values in order, the SST counters, and the byte offset of\n * the BrtEndSst record where new items must be inserted.\n */\nexport function parseSharedStringsBin(buf: Buffer): {\n values: string[];\n total: number;\n unique: number;\n endSstOffset: number;\n} {\n const values: string[] = [];\n let total = 0;\n let unique = 0;\n let endSstOffset = buf.length;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x009f) {\n total = buf.readUInt32LE(rec.dataStart);\n unique = buf.readUInt32LE(rec.dataStart + 4);\n } else if (rec.id === 0x0013) {\n const cch = buf.readUInt32LE(rec.dataStart + 1);\n values.push(readUtf16(buf, rec.dataStart + 5, cch));\n } else if (rec.id === 0x00a0) {\n endSstOffset = rec.headerStart;\n }\n }\n return { values, total, unique, endSstOffset };\n}\n","import yauzl, { ZipFile, Entry } from 'yauzl';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { CellValue } from './Formats';\nimport { unescapeXml, unescapeXmlText, columnLetterToIndex, parseSharedStringsXml, parseTagAttributes, resolveRelTarget } from './xmlUtils';\nimport { MAX_ROWS } from './writerHelpers';\n\ninterface SheetInfo {\n name: string;\n sheetId: string;\n rId: string;\n path: string;\n}\n\n/**\n * Parse an ISO 8601 `t=\"d\"` cell as UTC. Numeric OA dates are converted from a\n * UTC epoch, so a value without an offset must not be interpreted as local time.\n */\nfunction parseIsoDateUtc(value: string): Date | null {\n let text = value.trim().replace(' ', 'T');\n if (!text) return null;\n if (!/z$|[+-]\\d{2}:?\\d{2}$/i.test(text) && text.includes('T')) {\n text += 'Z';\n }\n const date = new Date(text);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nexport class XlsxReader extends ExcelReaderAbstract {\n private zipfile: ZipFile | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n private entries: Map<string, Entry> = new Map();\n\n private _currentSheetIndex: number = -1;\n private _sheetXml: string | null = null;\n private _xmlPos: number = 0;\n /** End of the sheetData element; row tags must not be searched past it. */\n private _xmlEnd: number = 0;\n\n private _currentRow: CellValue[] = [];\n private _expectedRowNum: number = 1;\n private _pendingEmptyCount: number = 0;\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> = new Set();\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n await this.close();\n // Reset state so re-opening does not accumulate sheets (xlspy parity).\n this.sheetNames = [];\n this.sheets = [];\n this.sharedStrings = [];\n this.xfIdToNumFmtId = [];\n this.customDateFormats = new Set();\n this.fieldCount = 0;\n this.resultsCount = 0;\n this.actualSheetName = '';\n this._currentSheetIndex = -1;\n this._sheetXml = null;\n this._xmlPos = 0;\n this._xmlEnd = 0;\n this._currentRow = [];\n this._expectedRowNum = 1;\n this._pendingEmptyCount = 0;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n return new Promise((resolve, reject) => {\n yauzl.open(path, { lazyEntries: true, autoClose: false }, async (err, zipfile) => {\n if (err) return reject(err);\n this.zipfile = zipfile;\n\n this.entries = new Map();\n\n zipfile.on('entry', (entry: Entry) => {\n this.entries.set(entry.fileName, entry);\n zipfile.readEntry();\n });\n\n zipfile.on('end', async () => {\n try {\n const wbRelsContent = await this._readZipEntryContent('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (wbRelsContent) {\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = relTagRe.exec(wbRelsContent)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) {\n rIdToTarget[id] = target;\n }\n }\n }\n\n const wbContent = await this._readZipEntryContent('xl/workbook.xml');\n if (wbContent) {\n // Order-independent: parse each <sheet> tag then its attributes.\n const sheetTagRe = /<sheet\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = sheetTagRe.exec(wbContent)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const rawName = attrs['name'];\n const sheetId = attrs['sheetId'] ?? '';\n const rId = attrs['r:id'] ?? attrs['id'] ?? attrs['rId'];\n if (rawName === undefined || rId === undefined) continue;\n const name = unescapeXml(rawName);\n const target = rIdToTarget[rId];\n if (!target) continue;\n const fullPath = resolveRelTarget(target);\n\n this.sheetNames.push(name);\n this.sheets.push({ name, sheetId, rId, path: fullPath });\n }\n // 1904 date system (workbookPr date1904=\"1\").\n const wbPrMatch = /<workbookPr\\b[^>]*>/i.exec(wbContent);\n if (wbPrMatch) {\n const wbPrAttrs = parseTagAttributes(wbPrMatch[0]);\n const v = (wbPrAttrs['date1904'] ?? '').trim().toLowerCase();\n this._oaEpoch = (v === '1' || v === 'true') ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n }\n }\n\n if (readSharedStrings) {\n const ssContent = await this._readZipEntryContent('xl/sharedStrings.xml');\n if (ssContent) {\n this._parseSharedStrings(ssContent);\n }\n }\n\n const stylesContent = await this._readZipEntryContent('xl/styles.xml');\n if (stylesContent) {\n this._parseStyles(stylesContent);\n }\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n\n zipfile.readEntry();\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.zipfile) {\n this.zipfile.close();\n }\n }\n\n private async _readZipEntryContent(path: string): Promise<string | null> {\n const entry = this.entries.get(path);\n if (!entry) return null;\n\n return new Promise((resolve, reject) => {\n this.zipfile!.openReadStream(entry, (err, readStream) => {\n if (err) return reject(err);\n\n const chunks: Buffer[] = [];\n readStream!.on('data', (chunk: Buffer) => chunks.push(chunk));\n readStream!.on('end', () => {\n resolve(Buffer.concat(chunks).toString('utf8'));\n });\n readStream!.on('error', reject);\n });\n });\n }\n\n private _parseSharedStrings(xml: string): void {\n this.sharedStrings = parseSharedStringsXml(xml);\n }\n\n private _parseStyles(xml: string): void {\n const numFmtRegex = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let match;\n this.customDateFormats = new Set();\n\n while ((match = numFmtRegex.exec(xml)) !== null) {\n const id = parseInt(match[1]);\n const code = match[2];\n if (code.toLowerCase().includes('yy') || code.toLowerCase().includes('mm') || code.toLowerCase().includes('dd') || code.toLowerCase().includes('h:mm')) {\n this.customDateFormats.add(id);\n }\n }\n\n this.xfIdToNumFmtId = [];\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart !== -1) {\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd !== -1) {\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n const xfRegex = /<xf\\s+[^>]*numFmtId=\"(\\d+)\"/g;\n while ((match = xfRegex.exec(cellXfsContent)) !== null) {\n const numFmtId = parseInt(match[1]);\n this.xfIdToNumFmtId.push(numFmtId);\n }\n }\n }\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n await this._initSheet(this._currentSheetIndex);\n }\n\n if (this._readNextRow()) {\n return true;\n } else {\n return false;\n }\n }\n\n async selectSheet(nameOrIndex: string | number): Promise<void> {\n let index = -1;\n if (typeof nameOrIndex === 'number') {\n index = nameOrIndex;\n } else {\n index = this.sheetNames.indexOf(nameOrIndex);\n if (index === -1) throw new Error(`Sheet '${nameOrIndex}' not found`);\n }\n if (index < 0 || index >= this.sheets.length) {\n throw new Error(`Sheet index ${String(nameOrIndex)} out of range`);\n }\n this._currentSheetIndex = index;\n await this._initSheet(index);\n }\n\n async nextResult(): Promise<boolean> {\n const next = this._currentSheetIndex + 1;\n if (next >= this.sheets.length) return false;\n this._currentSheetIndex = next;\n await this._initSheet(next);\n return true;\n }\n\n private async _initSheet(index: number): Promise<void> {\n if (index >= this.sheets.length) return;\n const sheet = this.sheets[index];\n this.actualSheetName = sheet.name;\n\n this._sheetXml = await this._readZipEntryContent(sheet.path);\n\n if (!this._sheetXml) {\n this._sheetXml = \"\";\n }\n\n this._xmlPos = 0;\n this._xmlEnd = this._sheetXml.length;\n this._expectedRowNum = 1;\n this._pendingEmptyCount = 0;\n this._currentRow = [];\n this.fieldCount = 0;\n const sd = this._sheetXml.indexOf('<sheetData>');\n if (sd !== -1) {\n this._xmlPos = sd + 11;\n const se = this._sheetXml.indexOf('</sheetData>', this._xmlPos);\n if (se !== -1) this._xmlEnd = se;\n } else {\n // Namespaced or self-closed sheetData.\n const m = /<(?:[A-Za-z_][\\w.-]*:)?sheetData\\b[^>]*>/i.exec(this._sheetXml);\n if (m && m.index !== undefined) {\n this._xmlPos = m.index + m[0].length;\n if (/\\/>\\s*$/.test(m[0])) {\n // <sheetData/> has no rows; do not scan the rest of the part.\n this._xmlEnd = this._xmlPos;\n } else {\n const se = this._sheetXml.indexOf('</sheetData>', this._xmlPos);\n if (se !== -1) this._xmlEnd = se;\n }\n }\n }\n }\n\n private _readNextRow(): boolean {\n if (!this._sheetXml) return false;\n\n // Emit queued gap rows first (leading + intermediate). They are empty.\n if (this._pendingEmptyCount > 0) {\n this._pendingEmptyCount--;\n this._currentRow = [];\n this._expectedRowNum++;\n return true;\n }\n\n const rowStart = this._findRowTagStart(this._xmlPos);\n if (rowStart === -1) return false;\n\n const rowTagEnd = this._sheetXml.indexOf('>', rowStart);\n if (rowTagEnd === -1) return false;\n const rowTag = this._sheetXml.substring(rowStart, rowTagEnd + 1);\n const isSelfClosing = this._sheetXml.charCodeAt(rowTagEnd - 1) === 47; // '/>'\n const rowAttrs = parseTagAttributes(rowTag);\n const rRaw = rowAttrs['r'];\n let rowNum = this._expectedRowNum;\n if (rRaw !== undefined) {\n const parsed = parseInt(rRaw, 10);\n // Values beyond Excel's row limit are malformed; ignore them rather than\n // expanding the gap into millions of phantom rows.\n if (Number.isFinite(parsed) && parsed >= 1 && parsed <= MAX_ROWS) rowNum = parsed;\n }\n\n // Gap: rows without <row> elements are returned as empty rows (xlspy parity).\n if (rowNum > this._expectedRowNum) {\n const gap = rowNum - this._expectedRowNum;\n // Return one empty now, queue the rest without consuming the row.\n this._pendingEmptyCount = gap - 1;\n this._currentRow = [];\n this._expectedRowNum++;\n return true;\n }\n if (rowNum < this._expectedRowNum) {\n // Out-of-order or duplicate: consume and resync forward.\n if (isSelfClosing) {\n this._xmlPos = rowTagEnd + 1;\n this._currentRow = [];\n return true;\n }\n const rowEnd = this._sheetXml.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n this._xmlPos = rowEnd + 6;\n this._parseRowByIndex(rowStart, rowEnd);\n this._expectedRowNum = Math.max(this._expectedRowNum + 1, rowNum + 1);\n return true;\n }\n\n if (isSelfClosing) {\n this._xmlPos = rowTagEnd + 1;\n this._currentRow = [];\n this._expectedRowNum = rowNum + 1;\n return true;\n }\n\n const rowEnd = this._sheetXml.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n\n this._xmlPos = rowEnd + 6;\n this._parseRowByIndex(rowStart, rowEnd);\n this._expectedRowNum = rowNum + 1;\n return true;\n }\n\n /**\n * Find the next `<row …>` start, ignoring similarly named elements such as\n * `<rowBreaks>` that follow `</sheetData>`.\n */\n private _findRowTagStart(from: number): number {\n const xml = this._sheetXml!;\n let pos = from;\n while (pos < this._xmlEnd) {\n const idx = xml.indexOf('<row', pos);\n if (idx === -1 || idx >= this._xmlEnd) return -1;\n const next = xml.charCodeAt(idx + 4);\n // Whitespace, '/' or '>' means this is the row element, not e.g. <rowBreaks>.\n if (next === 0x3e || next === 0x2f || next === 0x20 ||\n next === 0x09 || next === 0x0a || next === 0x0d) {\n return idx;\n }\n pos = idx + 4;\n }\n return -1;\n }\n\n private _parseRowByIndex(rowStart: number, rowEnd: number): void {\n this._currentRow = [];\n const xml = this._sheetXml!;\n\n let pos = xml.indexOf('>', rowStart) + 1;\n let nextCol = 0;\n\n while (pos < rowEnd) {\n const cStart = xml.indexOf('<c', pos);\n if (cStart === -1 || cStart >= rowEnd) break;\n\n const nextTagClose = xml.indexOf('>', cStart);\n\n let colIndex = -1;\n let type = 'n';\n let styleIndex = 0;\n\n let currentIdx = cStart + 2;\n while (currentIdx < nextTagClose) {\n while (xml.charCodeAt(currentIdx) <= 32 && currentIdx < nextTagClose) currentIdx++;\n if (currentIdx >= nextTagClose) break;\n\n const keyStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 61 && currentIdx < nextTagClose) currentIdx++;\n const key = xml.substring(keyStart, currentIdx);\n\n currentIdx++;\n\n if (xml.charCodeAt(currentIdx) === 34) {\n currentIdx++;\n const valStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 34 && currentIdx < nextTagClose) currentIdx++;\n const val = xml.substring(valStart, currentIdx);\n currentIdx++;\n\n if (key === 'r') {\n let letterLen = 0;\n while (letterLen < val.length && val.charCodeAt(letterLen) >= 65) letterLen++;\n colIndex = columnLetterToIndex(val.substring(0, letterLen));\n } else if (key === 't') {\n type = val;\n } else if (key === 's') {\n styleIndex = parseInt(val, 10);\n }\n }\n }\n\n let val: string | null = null;\n let inlineVals: string[] | null = null;\n if (xml.charCodeAt(nextTagClose - 1) === 47) {\n pos = nextTagClose + 1;\n } else {\n const cEnd = xml.indexOf('</c>', nextTagClose);\n const cellContentEnd = (cEnd !== -1 && cEnd < rowEnd) ? cEnd : rowEnd;\n\n const vStart = xml.indexOf('<v>', nextTagClose);\n if (vStart !== -1 && vStart < cellContentEnd) {\n const vInnerStart = vStart + 3;\n const vEnd = xml.indexOf('</v>', vInnerStart);\n if (vEnd !== -1 && vEnd < cellContentEnd) {\n val = xml.substring(vInnerStart, vEnd);\n }\n } else {\n if (type === 'inlineStr') {\n // Rich-text inlineStr: concatenate every <t> inside <is> (xlspy parity).\n inlineVals = [];\n let tSearch = nextTagClose;\n while (true) {\n const tStart = xml.indexOf('<t', tSearch);\n if (tStart === -1 || tStart >= cellContentEnd) break;\n const tClose = xml.indexOf('>', tStart);\n if (tClose === -1 || tClose >= cellContentEnd) break;\n const tContentStart = tClose + 1;\n const tEnd = xml.indexOf('</t>', tContentStart);\n if (tEnd === -1 || tEnd > cellContentEnd) break;\n inlineVals.push(xml.substring(tContentStart, tEnd));\n tSearch = tEnd + 4;\n }\n if (inlineVals.length === 0) inlineVals = null;\n }\n }\n pos = cellContentEnd + 4;\n }\n\n let finalVal: any = null;\n if (inlineVals !== null) {\n finalVal = unescapeXmlText(inlineVals.join(''));\n } else if (val !== null) {\n if (type === 's') {\n const idx = parseInt(val, 10);\n finalVal = this.sharedStrings[idx];\n } else if (type === 'b') {\n finalVal = (val === '1' || val === 'true');\n } else if (type === 'inlineStr') {\n finalVal = unescapeXmlText(val);\n } else if (type === 'str') {\n finalVal = unescapeXmlText(val);\n } else if (type === 'e') {\n finalVal = unescapeXml(val);\n } else if (type === 'd') {\n finalVal = parseIsoDateUtc(val) ?? unescapeXmlText(val);\n } else if (type === 'n' || type === '') {\n finalVal = parseFloat(val);\n\n if (styleIndex > 0 && this.xfIdToNumFmtId) {\n let numFmtId = 0;\n if (styleIndex < this.xfIdToNumFmtId.length) {\n numFmtId = this.xfIdToNumFmtId[styleIndex];\n }\n\n const isDate = (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n (this.customDateFormats && this.customDateFormats.has(numFmtId));\n\n if (isDate) {\n try {\n finalVal = this.getDateTimeFromOaDate(finalVal);\n } catch {\n // ignore date conversion errors\n }\n }\n }\n }\n }\n\n // The r attribute is optional: a cell without it sits in the column after the previous one.\n if (colIndex === -1) colIndex = nextCol;\n nextCol = colIndex + 1;\n\n this._currentRow[colIndex] = finalVal;\n if (colIndex >= this.fieldCount) this.fieldCount = colIndex + 1;\n }\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsxReader;\n","import * as path from 'path';\nimport { XlsxReader } from './XlsxReader';\nimport { XlsbReader } from './XlsbReader';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\n\n/**\n * Create an XLSB or XLSX reader based on the file extension.\n */\nexport class ReaderFactory {\n /**\n * @param filePath Path ending in `.xlsb` or `.xlsx`\n * @throws if the extension is unsupported\n */\n static create(filePath: string): ExcelReaderAbstract {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.xlsx') {\n return new XlsxReader();\n } else if (ext === '.xlsb') {\n return new XlsbReader();\n } else {\n throw new Error(`Unsupported extension: ${ext}`);\n }\n }\n}\n\nexport default ReaderFactory;\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport { CellValue, unwrapCell, getFormat } from './Formats';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n defaultColWidth,\n assertCellTextLength,\n assertColumnCount,\n assertRowFitsColumns,\n assertRowCount,\n timeToOaDate,\n assertCompressionLevel,\n DEFAULT_COMPRESSION_LEVEL,\n} from './writerHelpers';\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n filterHeaderRange: string | null;\n filterData?: {\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n };\n}\n\n/**\n * High-performance XLSB (Excel Binary Workbook) writer.\n * Prefer this format for large datasets — typically faster and smaller than XLSX.\n */\nexport class XlsbWriter {\n private output: fs.WriteStream;\n private archive: ReturnType<typeof archiver>;\n private readonly _targetPath: string;\n private readonly _tempPath: string;\n private _outputError: Error | null = null;\n private _finalized: boolean = false;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstDic: Map<string, number> = new Map();\n private sstCntUnique: number = 0;\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n private _nextFmtId: number = 167;\n private _nextXfIdx: number = 4;\n private _stFmtRecords: Map<string, { numfmtId: number; xfIndex: number }> = new Map();\n\n /** Worksheet binary template (BrtBeginSheet … dimension / views / cols placeholders). */\n private _sheet1Bytes: Buffer;\n private _workbookBinStart: Buffer;\n private _workbookBinMiddle: Buffer;\n private _workbookBinEnd: Buffer;\n /** Default styles.bin template; extended when custom number formats are registered. */\n private _stylesBin: Buffer;\n private _binaryIndexBin: Buffer;\n private _rRkIntegerLowerLimit: number;\n private _rRkIntegerUpperLimit: number;\n private _autoFilterStartBytes: Buffer;\n private _autoFilterEndBytes: Buffer;\n private _stickHeaderA1bytes: Buffer;\n /** Excel 2016+ autofilter compatibility stubs. */\n private _magicFilterExcel2016Fix0: Buffer;\n private _magicFilterExcel2016Fix1: Buffer;\n private _magicFilterExcel2016Fix2: Buffer;\n\n private readonly stream = new StreamingSheetState();\n\n\n /**\n * @param filePath Destination `.xlsb` path on disk.\n */\n /**\n * @param filePath Destination `.xlsb` path on disk.\n * @param options.compressionLevel Deflate level 0-9 (default 6).\n */\n constructor(filePath: string, options: { compressionLevel?: number } = {}) {\n const compressionLevel = assertCompressionLevel(options.compressionLevel ?? DEFAULT_COMPRESSION_LEVEL);\n this._targetPath = path.resolve(filePath);\n fs.mkdirSync(path.dirname(this._targetPath), { recursive: true });\n this._tempPath = path.join(\n path.dirname(this._targetPath),\n `.${path.basename(this._targetPath)}.${randomUUID()}.tmp`\n );\n this.output = fs.createWriteStream(this._tempPath);\n this.output.on('error', (err: Error) => { this._outputError = err; });\n this.archive = archiver('zip', { zlib: { level: compressionLevel } });\n this.archive.on('error', (err: Error) => { this._outputError = err; });\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n this._sheet1Bytes = Buffer.from([\n 0x81, 0x01, 0x00, 0x93, 0x01, 0x17, 0xCB, 0x04,\n 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n 0xFF, 0x00, 0x00, 0x00, 0x00, 0x94, 0x01, 0x10,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x85, 0x01, 0x00, 0x89, 0x01, 0x1E, 0xDC, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x98, 0x01, 0x24, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x8A, 0x01, 0x00, 0x86, 0x01,\n 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E, 0x00,\n 0x80, 0x95, 0x08, 0x02, 0x05, 0x00, 0x26, 0x00,\n 0xE5, 0x03, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x08,\n 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x91,\n 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E,\n 0x00, 0x80, 0x80, 0x08, 0x02, 0x05, 0x00, 0x26,\n 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00,\n 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x92, 0x01, 0x00, 0x97, 0x04, 0x42,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00,\n 0xDD, 0x03, 0x02, 0x10, 0x00, 0xDC, 0x03, 0x30,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80,\n 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x26, 0x00, 0x82, 0x01, 0x00\n ]);\n\n this._workbookBinStart = Buffer.from([\n 0x83, 0x01, 0x00, 0x80, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x78, 0x00, 0x6C, 0x00, 0x01, 0x00, 0x00, 0x00,\n 0x37, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x33, 0x00, 0x32, 0x00, 0x36, 0x00, 0x99, 0x01, 0x0C, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x25, 0x06, 0x01, 0x00, 0x03, 0x0F, 0x00, 0x80, 0x97, 0x10, 0x34, 0x18, 0x00, 0x00, 0x00, 0x43, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x73, 0x00, 0x71, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x5C, 0x00,\n 0x54, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x69, 0x00, 0x73, 0x00, 0x75, 0x00, 0x58, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x26, 0x00,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x81, 0x18, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x31, 0x00, 0x33, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x63, 0x00,\n 0x72, 0x00, 0x3A, 0x00, 0x31, 0x00, 0x5F, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x36, 0x00, 0x35, 0x00, 0x30, 0x00, 0x38, 0x00, 0x44, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x46, 0x00, 0x38, 0x00,\n 0x37, 0x00, 0x2D, 0x00, 0x34, 0x00, 0x37, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x38, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x34, 0x00, 0x41, 0x00, 0x34, 0x00, 0x30, 0x00,\n 0x31, 0x00, 0x31, 0x00, 0x33, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x7D, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x87, 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x10, 0x00, 0x80, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x9E, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x16, 0x00, 0x00, 0xB4, 0x69, 0x00, 0x00, 0xE8, 0x26, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x78, 0x88, 0x01, 0x00,\n 0x8F, 0x01, 0x00\n ]);\n\n this._workbookBinMiddle = Buffer.from([0x90, 0x01, 0x00]);\n\n this._workbookBinEnd = Buffer.from([\n 0x9D, 0x01, 0x1A, 0x35, 0xEA, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0xFC, 0xA9, 0xF1, 0xD2, 0x4D, 0x62, 0x50, 0x3F, 0x01,\n 0x00, 0x00, 0x00, 0x6A, 0x00, 0x9B, 0x01, 0x01, 0x00, 0x23, 0x04, 0x03, 0x0F, 0x00, 0x00, 0xAB, 0x10, 0x01, 0x01, 0x24, 0x00, 0x84, 0x01, 0x00\n ]);\n\n this._stylesBin = Buffer.from([\n 0x96, 0x02, 0x00, 0xE7, 0x04, 0x04, 0x02,\n 0x00, 0x00, 0x00, 0x2C, 0x2C, 0xA4, 0x00, 0x13,\n 0x00, 0x00, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79,\n 0x00, 0x79, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x6D,\n 0x00, 0x6D, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x64,\n 0x00, 0x64, 0x00, 0x5C, 0x00, 0x20, 0x00, 0x68,\n 0x00, 0x68, 0x00, 0x3A, 0x00, 0x6D, 0x00, 0x6D,\n 0x00, 0x2C, 0x1E, 0xA6, 0x00, 0x0C, 0x00, 0x00,\n 0x00, 0x79, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79,\n 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x6D,\n 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x64,\n 0x00, 0xE8, 0x04, 0x00, 0xE3, 0x04, 0x04, 0x01,\n 0x00, 0x00, 0x00,\n 0x2B, 0x27, 0xDC, 0x00, 0x00, 0x00, 0x90, 0x01,\n 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x07,\n 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x62, 0x00, 0x72, 0x00, 0x69,\n 0x00,\n 0x2B, 0x27, 0xDC, 0x00, 0x01, 0x00, 0xBC, 0x02,\n 0x00, 0x00, 0x00, 0x02, 0xEE, 0x00, 0x07, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x07,\n 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x62, 0x00, 0x72, 0x00, 0x69,\n 0x00,\n 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E, 0x00, 0x80, 0x81, 0x08, 0x00, 0x26, 0x00, 0xE4, 0x04, 0x00, 0xDB, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00,\n 0x2D, 0x44, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x41, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x2D, 0x44, 0x11, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x41, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0xDC, 0x04, 0x00, 0xE5, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x04, 0x00, 0xF2,\n 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x2F, 0x10, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\n 0x00, 0xF3, 0x04, 0x00, 0xE9, 0x04, 0x04,\n 0x04,\n 0x00, 0x00, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\n 0xEA, 0x04, 0x00, 0xEB, 0x04, 0x04, 0x01, 0x00,\n 0x00, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x11, 0x00, 0x80, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4E,\n 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6E, 0x00, 0x79, 0x00, 0xEC, 0x04, 0x00, 0xF9, 0x03, 0x04, 0x00, 0x00,\n 0x00, 0x00, 0xFA, 0x03, 0x00, 0xFC, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C,\n 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x75, 0x00,\n 0x6D, 0x00, 0x32, 0x00, 0x11, 0x00, 0x00, 0x00, 0x50, 0x00, 0x69, 0x00, 0x76, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79,\n 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0x36, 0x00, 0xFD, 0x03, 0x00, 0x23,\n 0x04, 0x02, 0x0E, 0x00, 0x00, 0xEB, 0x08, 0x00, 0xF6, 0x08, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x53, 0x00, 0x6C, 0x00,\n 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x67,\n 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0xF7, 0x08, 0x00, 0xEC, 0x08, 0x00, 0x24, 0x00, 0x23, 0x04, 0x03, 0x0F, 0x00, 0x00, 0xB0, 0x10,\n 0x00, 0xB2, 0x10, 0x32, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00,\n 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0xB3, 0x10, 0x00, 0xB1, 0x10, 0x00, 0x24, 0x00, 0x97, 0x02, 0x00\n ]);\n\n this._binaryIndexBin = Buffer.from([\n 0x2A, 0x18, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95,\n 0x02, 0x00\n ]);\n\n this._rRkIntegerLowerLimit = -1 << 29;\n this._rRkIntegerUpperLimit = (1 << 29) - 1;\n\n this._autoFilterStartBytes = Buffer.from([0xA1, 0x01, 0x10]);\n this._autoFilterEndBytes = Buffer.from([0xA2, 0x01, 0x00]);\n\n this._stickHeaderA1bytes = Buffer.from([\n 0x97, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xF0, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03\n ]);\n\n this._magicFilterExcel2016Fix0 = Buffer.from([0xE1, 0x02, 0x00, 0xE5, 0x02, 0x00, 0xEA, 0x02]);\n this._magicFilterExcel2016Fix1 = Buffer.from([\n 0x27, 0x46, 0x21, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x5F,\n 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x61,\n 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x0F, 0x00, 0x00,\n 0x00, 0x3B, 0xFF, 0x00\n ]);\n this._magicFilterExcel2016Fix2 = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF]);\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n private _registerFormat(fmtString: string): number {\n if (this._stFmtRecords.has(fmtString)) {\n return this._stFmtRecords.get(fmtString)!.xfIndex;\n }\n const numfmtId = this._nextFmtId++;\n const xfIndex = this._nextXfIdx++;\n this._stFmtRecords.set(fmtString, { numfmtId, xfIndex });\n return xfIndex;\n }\n\n private static _buildBrtRecord(type: number, data: Buffer): Buffer {\n const header = XlsbWriter._encodeVlq(type);\n header.push(...XlsbWriter._encodeVlq(data.length));\n return Buffer.concat([Buffer.from(header), data]);\n }\n\n private static _encodeVlq(value: number): number[] {\n const result: number[] = [];\n while (value >= 0x80) {\n result.push((value & 0x7F) | 0x80);\n value >>>= 7;\n }\n result.push(value & 0x7F);\n return result;\n }\n\n private static _buildStFmtRecord(ifmt: number, fmtString: string): Buffer {\n const cch = fmtString.length;\n const remaining = 2 + 4 + cch * 2;\n const data = Buffer.alloc(2 + remaining);\n data[0] = 0x2C;\n data[1] = remaining;\n data.writeUInt16LE(ifmt, 2);\n data.writeUInt32LE(cch, 4);\n data.write(fmtString, 8, cch * 2, 'utf16le');\n return data;\n }\n\n private static _buildXfRecord(fontId: number, ifmt: number, flags: number, byte6Extra: number = 0): Buffer {\n const data = Buffer.alloc(18);\n data[0] = 0x2F;\n data[1] = 16;\n data.writeUInt16LE(fontId, 2);\n data.writeUInt16LE(ifmt, 4);\n data[6] = byte6Extra;\n data[14] = 0x10;\n data[15] = 0x10;\n data.writeUInt16LE(flags, 16);\n return data;\n }\n\n private _buildStylesBin(): Buffer {\n if (this._stFmtRecords.size === 0) {\n return this._stylesBin;\n }\n const base = this._stylesBin;\n\n // Find BrtEndFonts (0xE8, 0x04, 0x00)\n let fontEndOff = -1;\n for (let i = 3; i < base.length - 3; i++) {\n if (base[i] === 0xE8 && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n fontEndOff = i;\n break;\n }\n }\n\n // Find BrtBeginCellXFs (0xE9, 0x04)\n let xfBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xE9 && base[i + 1] === 0x04) {\n xfBeginOff = i;\n break;\n }\n }\n\n // Find BrtEndCellXFs (0xEA, 0x04, 0x00)\n let xfEndOff = -1;\n for (let i = xfBeginOff; i < base.length - 3; i++) {\n if (base[i] === 0xEA && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n xfEndOff = i;\n break;\n }\n }\n\n // Find BrtBeginFills (0xE3, 0x04) — start after BrtEndFonts\n let fillBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xE3 && base[i + 1] === 0x04) {\n fillBeginOff = i;\n break;\n }\n }\n\n const totalFmt = 2 + this._stFmtRecords.size;\n const totalXf = 4 + this._stFmtRecords.size;\n\n const parts: Buffer[] = [];\n\n // 1. BrtBeginStyleSheet\n parts.push(base.subarray(0, 3));\n\n // 2. NEW BrtFmt: VLQ(0x0267) + VLQ(4) + count(2 LE) + pad(2)\n const fmtHeader = Buffer.alloc(4);\n fmtHeader.writeUInt16LE(totalFmt, 0);\n parts.push(XlsbWriter._buildBrtRecord(0x0267, fmtHeader));\n\n // 3. BrtNumFmt records: 2 base + custom (ALWAYS add base formats)\n parts.push(XlsbWriter._buildStFmtRecord(164, 'yyyy\\\\-mm\\\\-dd\\\\ hh:mm'));\n parts.push(XlsbWriter._buildStFmtRecord(166, 'yyyy\\\\-mm\\\\-dd'));\n for (const [fmtString, st] of this._stFmtRecords) {\n parts.push(XlsbWriter._buildStFmtRecord(st.numfmtId, fmtString));\n }\n\n // 4. BrtEndFonts\n parts.push(XlsbWriter._buildBrtRecord(0x0268, Buffer.alloc(0)));\n\n // 5. Copy fills+borders+BrtFont+cellStyleXFs from template\n parts.push(base.subarray(fillBeginOff, xfBeginOff));\n\n // 7. NEW BrtBeginCellXFs\n const xfHeader = Buffer.alloc(4);\n xfHeader.writeUInt16LE(totalXf, 0);\n parts.push(XlsbWriter._buildBrtRecord(0x0269, xfHeader));\n\n // 8. Base XF records\n parts.push(XlsbWriter._buildXfRecord(0, 0, 0x0000));\n parts.push(XlsbWriter._buildXfRecord(0, 164, 0x0001));\n parts.push(XlsbWriter._buildXfRecord(0, 166, 0x0001));\n parts.push(XlsbWriter._buildXfRecord(1, 0, 0x0000, 1));\n\n // 9. Custom XF records\n const sortedXf = [...this._stFmtRecords.entries()].sort((a, b) => a[1].xfIndex - b[1].xfIndex);\n for (const [, st] of sortedXf) {\n parts.push(XlsbWriter._buildXfRecord(0, st.numfmtId, 0x0001));\n }\n\n // 10. BrtEndCellXFs\n parts.push(XlsbWriter._buildBrtRecord(0x026A, Buffer.alloc(0)));\n\n // 11. Copy remaining template\n parts.push(base.subarray(xfEndOff + 3));\n\n return Buffer.concat(parts);\n }\n\n /**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n * @param sheetName Display name (sanitized to Excel rules)\n * @param hidden Whether the sheet is hidden in Excel\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n this.sheetCount++;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/sheet${this.sheetCount}.bin`,\n hidden: hidden,\n nameInArchive: `sheet${this.sheetCount}.bin`,\n sheetId: this.sheetCount,\n filterHeaderRange: null\n });\n }\n\n /**\n * Start a new sheet in streaming mode. Call writeRow() for each row, then endSheet() when done.\n * @param sheetName Name of the sheet\n * @param columnCount Number of columns in the sheet\n * @param headers Optional header row\n * @param options Optional settings (hidden, doAutofilter)\n */\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: { hidden?: boolean; doAutofilter?: boolean; sampleRows?: unknown[][] } = {}\n ): void {\n assertColumnCount(columnCount);\n if (headers !== undefined) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n const { hidden = false, doAutofilter = true, sampleRows } = options;\n\n // Add sheet metadata\n this.addSheet(sheetName, hidden);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n const bigBuf = this.stream.buffer!;\n\n if (headers) {\n applyHeaderWidths(this.stream.colWidths, headers, columnCount);\n }\n if (sampleRows) {\n updateColWidthsFromRows(this.stream.colWidths, sampleRows);\n }\n\n // Write sheet header\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n sheetHeader.writeInt32LE(this.stream.startCol, 40);\n sheetHeader.writeInt32LE(this.stream.endCol, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n // Write sticky header if headers are present\n if (headers) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n // Write column definitions\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n\n for (let i = this.stream.startCol; i < this.stream.endCol; i++) {\n bigBuf.writeByte(0);\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(this.stream.colWidths[i], true);\n bigBuf.writeByte(0);\n bigBuf.writeByte(Math.max(0, Math.min(255, width)));\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(2);\n }\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n // Write header row if provided\n if (headers) {\n this.createRowHeader(bigBuf, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(bigBuf, headers[c], c, true);\n }\n this.stream.rowNum++;\n }\n }\n\n /**\n * Write a single row in streaming mode. Must be called between startSheet() and endSheet().\n * @param row Array of cell values\n */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n assertRowCount(this.stream.rowNum + 1);\n\n // Write row header\n this.createRowHeader(bigBuf, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n\n // Write each cell\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const styleNum = fmtString !== null ? this._registerFormat(fmtString) : 0;\n\n if (typeof val === 'number') {\n if (Number.isInteger(val)) {\n if (val >= this._rRkIntegerLowerLimit && val <= this._rRkIntegerUpperLimit) {\n this.writeRkNumberInteger(bigBuf, val, c, styleNum);\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else if (typeof val === 'bigint') {\n this.writeString(bigBuf, val.toString(), c);\n } else if (typeof val === 'boolean') {\n this.writeBool(bigBuf, val, c);\n } else if (val instanceof Date) {\n const oaDate = timeToOaDate(val.getTime(), this._oaEpoch);\n this.writeDouble(bigBuf, oaDate, c, fmtString !== null ? styleNum : 1);\n } else if (val !== null && val !== undefined) {\n this.writeString(bigBuf, val.toString(), c, false, fmtString !== null ? styleNum : undefined);\n }\n }\n\n this.stream.rowNum++;\n }\n\n /**\n * Finalize the current streaming sheet and add it to the archive.\n * Must be called after startSheet() and writeRow() calls.\n */\n endSheet(): void {\n const bigBuf = this.stream.assertStreaming();\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n\n // Write sheet footer sections\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n // Write autofilter if enabled\n if (this.stream.doAutofilter) {\n this._autofilterIsOn = true;\n const endRow = this.stream.rowNum;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(this.stream.startCol, 0);\n colBuf.writeInt32LE(this.stream.endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n // Store filter data for later\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: endRow - 1,\n startColumn: this.stream.startCol,\n endColumn: this.stream.endCol - 1\n };\n }\n\n bigBuf.write(sheetHeader.subarray(290));\n\n // Add to archive\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n\n // Reset streaming state\n this.stream.end();\n }\n\n\n /**\n * Write an entire sheet in one call (batch mode).\n * @param rows Data rows (`CellValue` cells; null/undefined = blank)\n * @param headers Optional header row (bold + frozen + autofilter when enabled)\n * @param doAutofilter Enable autofilter when headers are present (default true)\n */\n writeSheet(rows: CellValue[][], headers: string[] | null = null, doAutofilter: boolean = true): void {\n const bigBuf = new BigBuffer();\n let columnCount = 0;\n\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n if (columnCount > 0) assertColumnCount(columnCount);\n const totalRowsCheck = rows.length + (headers ? 1 : 0);\n assertRowCount(totalRowsCheck);\n if (headers) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n for (let r = 0; r < rows.length; r++) {\n assertRowFitsColumns('row', rows[r].length, columnCount);\n }\n\n const colWidths = initColWidths(columnCount);\n\n if (headers) {\n applyHeaderWidths(colWidths, headers, columnCount);\n }\n updateColWidthsFromRows(colWidths, rows);\n\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n const startCol = 0;\n const endCol = columnCount;\n\n sheetHeader.writeInt32LE(startCol, 40);\n sheetHeader.writeInt32LE(endCol, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n if (headers) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n\n for (let i = startCol; i < endCol; i++) {\n bigBuf.writeByte(0);\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(colWidths[i], true);\n bigBuf.writeByte(0);\n bigBuf.writeByte(Math.max(0, Math.min(255, width)));\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(2);\n }\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n let rowNum = 0;\n\n if (headers) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(bigBuf, headers[c], c, true);\n }\n rowNum++;\n }\n\n for (let r = 0; r < rows.length; r++) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const styleNum = fmtString !== null ? this._registerFormat(fmtString) : 0;\n\n if (typeof val === 'number') {\n if (Number.isInteger(val)) {\n if (val >= this._rRkIntegerLowerLimit && val <= this._rRkIntegerUpperLimit) {\n this.writeRkNumberInteger(bigBuf, val, c, styleNum);\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else if (typeof val === 'bigint') {\n this.writeString(bigBuf, val.toString(), c);\n } else if (typeof val === 'boolean') {\n this.writeBool(bigBuf, val, c);\n } else if (val instanceof Date) {\n const oaDate = timeToOaDate(val.getTime(), this._oaEpoch);\n this.writeDouble(bigBuf, oaDate, c, fmtString !== null ? styleNum : 1);\n } else if (val !== null && val !== undefined) {\n this.writeString(bigBuf, val.toString(), c, false, fmtString !== null ? styleNum : undefined);\n }\n }\n rowNum++;\n }\n\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n if (doAutofilter && headers) {\n this._autofilterIsOn = true;\n const endRow = rows.length + 1;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(startCol, 0);\n colBuf.writeInt32LE(endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: rows.length,\n startColumn: startCol,\n endColumn: endCol - 1\n };\n }\n\n bigBuf.write(sheetHeader.subarray(290));\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: this.sheetList[this.sheetCount - 1].pathInArchive });\n }\n\n\n\n createRowHeader(bigBuf: BigBuffer, rowNumber: number, startCol: number, endCol: number): void {\n bigBuf.ensureCapacity(27);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(25);\n bigBuf.writeUnsafeInt32LE(rowNumber);\n bigBuf.writeUnsafeInt32LE(0);\n bigBuf.writeUnsafeByte(44);\n bigBuf.writeUnsafeByte(1);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(1);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeInt32LE(startCol);\n bigBuf.writeUnsafeInt32LE(endCol);\n }\n\n writeRkNumberInteger(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n bigBuf.ensureCapacity(14);\n bigBuf.writeUnsafeByte(2);\n bigBuf.writeUnsafeByte(12);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n const rkVal = (val << 2) | 2;\n bigBuf.writeUnsafeInt32LE(rkVal);\n }\n\n writeDouble(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n bigBuf.ensureCapacity(18);\n bigBuf.writeUnsafeByte(5);\n bigBuf.writeUnsafeByte(16);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeDoubleLE(val);\n }\n\n writeBool(bigBuf: BigBuffer, val: boolean, colNum: number): void {\n bigBuf.ensureCapacity(13);\n bigBuf.writeUnsafeByte(0x04);\n bigBuf.writeUnsafeByte(9);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeInt32LE(0);\n bigBuf.writeUnsafeByte(val ? 1 : 0);\n }\n\n writeDateTime(bigBuf: BigBuffer, date: Date, colNum: number): void {\n // Use UTC time to avoid timezone conversion issues; handles the\n // fictitious 1900-02-29.\n const oaDate = timeToOaDate(date.getTime(), this._oaEpoch);\n this.writeDouble(bigBuf, oaDate, colNum, 1);\n }\n\n private _getDateWidth(_date: Date): number {\n return 19; // \"YYYY-MM-DD HH:MM:SS\" ≈ 19 chars\n }\n\n writeString(bigBuf: BigBuffer, val: string, colNum: number, bolded: boolean = false, styleOverride?: number): void {\n assertCellTextLength(val);\n let index: number;\n if (this.sstDic.has(val)) {\n index = this.sstDic.get(val)!;\n } else {\n index = this.sstCntUnique;\n this.sstDic.set(val, index);\n this.sstCntUnique++;\n }\n this.sstCntAll++;\n\n const styleNum = styleOverride !== undefined ? styleOverride : (bolded ? 3 : 0);\n bigBuf.ensureCapacity(17);\n bigBuf.writeUnsafeByte(7);\n bigBuf.writeUnsafeByte(12);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeInt32LE(index);\n }\n\n private saveSst(): void {\n const bigBuf = new BigBuffer();\n\n bigBuf.writeByte(159);\n bigBuf.writeByte(1);\n bigBuf.writeByte(8);\n\n bigBuf.writeInt32LE(this.sstCntAll);\n bigBuf.writeInt32LE(this.sstCntUnique);\n\n for (const [txt] of this.sstDic) {\n const txtLen = txt.length;\n\n bigBuf.writeByte(19);\n\n const recLen = 5 + 2 * txtLen;\n\n if (recLen >= 128) {\n bigBuf.writeByte(128 + (recLen % 128));\n const tmp = recLen >> 7;\n if (tmp >= 256) {\n bigBuf.writeByte(128 + (tmp % 128));\n } else {\n bigBuf.writeByte(tmp);\n }\n bigBuf.writeByte(recLen >> 14);\n if ((recLen >> 14) > 0) {\n bigBuf.writeByte(0);\n }\n } else {\n bigBuf.writeByte(recLen & 0xFF);\n bigBuf.writeByte((recLen >> 8) & 0xFF);\n }\n\n bigBuf.writeInt32LE(txtLen);\n bigBuf.writeUtf16LE(txt);\n }\n\n bigBuf.writeByte(160);\n bigBuf.writeByte(1);\n bigBuf.writeByte(0);\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: 'xl/sharedStrings.bin' });\n }\n\n private _writeFilterDefinedName(wbBuffers: Buffer[], sheet: SheetInfo, sheetNum: number): void {\n const filterData = sheet.filterData!;\n const sheetIndex = sheet.sheetId - 1;\n\n const fix1 = Buffer.alloc(this._magicFilterExcel2016Fix1.length);\n this._magicFilterExcel2016Fix1.copy(fix1);\n\n const lastIdx = this._magicFilterExcel2016Fix1.length - 2;\n\n fix1[7] = sheetIndex;\n fix1[lastIdx] = sheetNum;\n\n wbBuffers.push(fix1);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(filterData.startRow, 0);\n rowBuf.writeInt32LE(filterData.endRow, 4);\n wbBuffers.push(rowBuf);\n\n const colBuf = Buffer.alloc(4);\n colBuf.writeInt16LE(filterData.startColumn, 0);\n colBuf.writeInt16LE(filterData.endColumn, 2);\n wbBuffers.push(colBuf);\n\n wbBuffers.push(this._magicFilterExcel2016Fix2);\n }\n\n /**\n * Finalize the ZIP package and close the output stream.\n * Must be awaited before the file is fully written.\n */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this._finalized) {\n reject(new Error('XlsbWriter: already finalized'));\n return;\n }\n this._finalized = true;\n let settled = false;\n const cleanupTemp = (): void => {\n try {\n if (fs.existsSync(this._tempPath)) fs.rmSync(this._tempPath);\n } catch {\n // Preserve original error.\n }\n };\n const fail = (err: unknown): void => {\n if (settled) return;\n settled = true;\n try { this.archive.abort(); } catch { /* preserve */ }\n try { this.output.destroy(); } catch { /* preserve */ }\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n };\n const succeed = (): void => {\n if (settled) return;\n if (this._outputError) {\n fail(this._outputError);\n return;\n }\n settled = true;\n try {\n const fd = fs.openSync(this._tempPath, 'r+');\n try { fs.fsyncSync(fd); } finally { fs.closeSync(fd); }\n // Preserve the mode of a file being replaced (the temp file\n // was created with the process umask).\n try {\n const existing = fs.statSync(this._targetPath);\n fs.chmodSync(this._tempPath, existing.mode & 0o777);\n } catch {\n // Target does not exist yet.\n }\n fs.renameSync(this._tempPath, this._targetPath);\n resolve();\n } catch (err) {\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n };\n try {\n if (this._outputError) throw this._outputError;\n this.saveSst();\n\n this.archive.append(this._buildStylesBin(), { name: 'xl/styles.bin' });\n\n const wbBuffers: Buffer[] = [];\n wbBuffers.push(this._workbookBinStart);\n\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n\n const recLen = 4 + 12 + sheet.name.length * 2 + rId.length * 2;\n const buf = Buffer.alloc(3 + recLen);\n buf[0] = 156; buf[1] = 1; buf[2] = recLen;\n let pos = 3;\n\n buf.writeInt32LE(sheet.hidden ? 1 : 0, pos); pos += 4;\n buf.writeInt32LE(sheet.sheetId, pos); pos += 4;\n\n buf.writeInt32LE(rId.length, pos); pos += 4;\n for (let i = 0; i < rId.length; i++) {\n const c = rId.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n\n buf.writeInt32LE(sheet.name.length, pos); pos += 4;\n for (let i = 0; i < sheet.name.length; i++) {\n const c = sheet.name.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n wbBuffers.push(buf);\n }\n\n wbBuffers.push(this._workbookBinMiddle);\n\n if (this._autofilterIsOn) {\n const filteredSheets = this.sheetList.filter(s => s.filterData);\n const cnt = filteredSheets.length;\n\n if (cnt > 0) {\n wbBuffers.push(this._magicFilterExcel2016Fix0);\n\n const firstByte = cnt <= 20\n ? 0x10 + (cnt - 1) * 0x0C\n : 0x80 + (cnt - 21) * 0x0C;\n const countBuf = cnt <= 10\n ? Buffer.from([firstByte, cnt, 0x00, 0x00, 0x00])\n : Buffer.from([firstByte, Math.floor((cnt - 1) / 10), cnt, 0x00, 0x00, 0x00]);\n wbBuffers.push(countBuf);\n\n for (let nm = 0; nm < cnt; nm++) {\n const sheetIndex = filteredSheets[nm].sheetId - 1;\n const idxBuf = Buffer.alloc(12);\n idxBuf.writeInt32LE(0, 0);\n idxBuf[4] = sheetIndex;\n idxBuf[8] = sheetIndex;\n wbBuffers.push(idxBuf);\n }\n\n wbBuffers.push(Buffer.from([0xE2, 0x02, 0x00]));\n\n for (let sheetNum = 0; sheetNum < cnt; sheetNum++) {\n const sheet = filteredSheets[sheetNum];\n this._writeFilterDefinedName(wbBuffers, sheet, sheetNum);\n }\n }\n }\n\n wbBuffers.push(this._workbookBinEnd);\n\n this.archive.append(Buffer.concat(wbBuffers), { name: 'xl/workbook.bin' });\n\n for (const sheet of this.sheetList) {\n this.archive.append(this._binaryIndexBin, { name: `xl/worksheets/binaryIndex${sheet.sheetId}.bin` });\n }\n\n let contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n<Default Extension=\"bin\" ContentType=\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\"/>\n<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>`;\n for (const sheet of this.sheetList) {\n contentTypes += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.ms-excel.worksheet\"/>`;\n contentTypes += `<Override PartName=\"/xl/worksheets/binaryIndex${sheet.sheetId}.bin\" ContentType=\"application/vnd.ms-excel.binIndexWs\"/>`;\n }\n contentTypes += `<Override PartName=\"/xl/styles.bin\" ContentType=\"application/vnd.ms-excel.styles\"/>\n<Override PartName=\"/xl/sharedStrings.bin\" ContentType=\"application/vnd.ms-excel.sharedStrings\"/>\n</Types>`;\n this.archive.append(contentTypes, { name: '[Content_Types].xml' });\n\n let wbRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n wbRels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n wbRels += `<Relationship Id=\"rId${this.sheetList.length + 2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.bin\"/>\n<Relationship Id=\"rId${this.sheetList.length + 3}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.bin\"/>\n</Relationships>`;\n this.archive.append(wbRels, { name: 'xl/_rels/workbook.bin.rels' });\n\n const globalRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.bin\"/>\n</Relationships>`;\n this.archive.append(globalRels, { name: '_rels/.rels' });\n\n for (const sheet of this.sheetList) {\n const wsRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.microsoft.com/office/2006/relationships/xlBinaryIndex\" Target=\"binaryIndex${sheet.sheetId}.bin\"/>\n</Relationships>`;\n this.archive.append(wsRels, { name: `xl/worksheets/_rels/${sheet.nameInArchive}.rels` });\n }\n\n this.output.once('close', succeed);\n this.output.once('error', fail);\n this.archive.once('error', fail);\n this.archive.finalize();\n } catch (err) {\n fail(err);\n }\n });\n }\n}\n\nexport default XlsbWriter;\n","import { BigBuffer } from './BigBuffer';\nimport { initColWidths } from './writerHelpers';\n\n/**\n * Shared streaming-sheet session state for Node writers.\n * Holds buffer, row cursor, column range, autofilter flag, and autofit widths.\n */\nexport class StreamingSheetState {\n isStreaming: boolean = false;\n rowNum: number = 0;\n startCol: number = 0;\n endCol: number = 0;\n doAutofilter: boolean = false;\n colWidths: number[] = [];\n buffer: BigBuffer | null = null;\n\n /**\n * Begin a streaming sheet session.\n * @throws if already streaming\n */\n begin(columnCount: number, doAutofilter: boolean, buffer: BigBuffer): void {\n if (this.isStreaming) {\n throw new Error('Already in streaming mode. Call endSheet() first.');\n }\n\n this.isStreaming = true;\n this.buffer = buffer;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = columnCount;\n this.doAutofilter = doAutofilter;\n this.colWidths = initColWidths(columnCount);\n }\n\n /** Assert streaming mode and return the active buffer. */\n assertStreaming(): BigBuffer {\n if (!this.isStreaming || !this.buffer) {\n throw new Error('Not in streaming mode. Call startSheet() first.');\n }\n return this.buffer;\n }\n\n /** Reset after endSheet(). */\n end(): void {\n this.isStreaming = false;\n this.buffer = null;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.doAutofilter = false;\n this.colWidths = [];\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport { CellValue, unwrapCell, getFormat } from './Formats';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n defaultColWidth,\n assertCellTextLength,\n assertColumnCount,\n assertRowFitsColumns,\n assertRowCount,\n timeToOaDate,\n cellRefAttr,\n assertCompressionLevel,\n DEFAULT_COMPRESSION_LEVEL,\n} from './writerHelpers';\nimport { columnIndexToLetter } from './xmlUtils';\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n rId: string;\n filterHeaderRange: string | null;\n}\n\n/**\n * XLSX (Office Open XML) writer with streaming ZIP output.\n */\nexport class XlsxWriter {\n private output: fs.WriteStream;\n private archive: archiver.Archiver;\n private readonly _targetPath: string;\n private readonly _tempPath: string;\n private _outputError: Error | null = null;\n private _finalized: boolean = false;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstArray: string[] = [];\n private sstMap: Map<string, number> = new Map();\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n\n // Format registry\n private _formatRegistry: Map<string, number> = new Map();\n private _formatXfMap: Map<string, number> = new Map();\n private _nextNumfmtId: number = 165;\n private _nextXfIndex: number = 4;\n\n private readonly stream = new StreamingSheetState();\n private currentColLetters: string[] = [];\n\n /**\n * @param filePath Destination `.xlsx` path on disk.\n */\n /**\n * @param filePath Destination `.xlsx` path on disk.\n * @param options.compressionLevel Deflate level 0-9 (default 6).\n */\n constructor(filePath: string, options: { compressionLevel?: number } = {}) {\n const compressionLevel = assertCompressionLevel(options.compressionLevel ?? DEFAULT_COMPRESSION_LEVEL);\n this._targetPath = path.resolve(filePath);\n fs.mkdirSync(path.dirname(this._targetPath), { recursive: true });\n this._tempPath = path.join(\n path.dirname(this._targetPath),\n `.${path.basename(this._targetPath)}.${randomUUID()}.tmp`\n );\n this.output = fs.createWriteStream(this._tempPath);\n this.output.on('error', (err: Error) => { this._outputError = err; });\n this.archive = archiver('zip', { zlib: { level: compressionLevel } });\n this.archive.on('error', (err: Error) => { this._outputError = err; });\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n private _getColumnLetter(colIndex: number): string {\n return columnIndexToLetter(colIndex);\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n private _escapeSheetNameForXml(name: string): string {\n return name\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n private _formatSheetNameForFormula(name: string): string {\n if (/[\\s\\-+=()!@#$%^&]/.test(name) || /^[0-9]/.test(name)) {\n const escaped = name.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n return name;\n }\n\n /**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n\n this.sheetCount++;\n const rId = `rId${this.sheetCount}`;\n const sheetFileName = `sheet${this.sheetCount}.xml`;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/${sheetFileName}`,\n hidden: hidden,\n nameInArchive: sheetFileName,\n sheetId: this.sheetCount,\n rId: rId,\n filterHeaderRange: null\n });\n }\n\n private _needsEscape(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c === 38 || c === 60 || c === 62 || c === 34 || c === 39 || c === 13 ||\n (c >= 0 && c <= 8) || c === 11 || c === 12 || (c >= 14 && c <= 31)) {\n return true;\n }\n }\n return false;\n }\n\n private _escape(str: string): string {\n if (typeof str !== 'string') return str;\n // Literal `_xHHHH_` is written as `_x005F_xHHHH_` so Excel does not decode it (ST_Xstring).\n str = str.replace(/_x([0-9A-Fa-f]{4})_/g, '_x005F_x$1_');\n if (!this._needsEscape(str)) return str;\n\n return str.replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n // CR must be a character reference: raw CR is normalized to LF by XML parsers.\n .replace(/\\r/g, ' ')\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g, '');\n }\n\n /**\n * Start streaming a sheet. Call `writeRow` for each row, then `endSheet`.\n */\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: { hidden?: boolean; doAutofilter?: boolean; sampleRows?: unknown[][] } = {}\n ): void {\n assertColumnCount(columnCount);\n if (headers !== undefined) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n\n const { hidden = false, doAutofilter = true, sampleRows } = options;\n\n this.addSheet(sheetName, hidden);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n const bigBuf = this.stream.buffer!;\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n this.currentColLetters = colLetters;\n\n if (headers) {\n applyHeaderWidths(this.stream.colWidths, headers, columnCount);\n }\n if (sampleRows) {\n updateColWidthsFromRows(this.stream.colWidths, sampleRows);\n }\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString('<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">');\n\n // Dimension - just A1 since we don't know row count in advance\n bigBuf.writeString('<dimension ref=\"A1\"/>');\n\n const isFirstSheet = this.sheetCount === 1;\n if (headers) {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n } else {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n }\n\n bigBuf.writeString('<cols>');\n for (let i = 0; i < columnCount; i++) {\n const width = defaultColWidth(this.stream.colWidths[i]);\n bigBuf.writeString(`<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" bestFit=\"1\" customWidth=\"1\" />`);\n }\n bigBuf.writeString('</cols><sheetData>');\n\n if (headers) {\n this.stream.rowNum++;\n bigBuf.writeString(`<row r=\"${this.stream.rowNum}\">`);\n // Headers are contiguous from column A, so no cell needs `r`.\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(bigBuf, headers[c], '', 3);\n }\n bigBuf.writeString('</row>');\n }\n }\n\n /** Write one data row in streaming mode. */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n\n this.stream.rowNum++;\n assertRowCount(this.stream.rowNum);\n bigBuf.writeString(`<row r=\"${this.stream.rowNum}\">`);\n\n let prevCol = -1;\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const xfIdx = fmtString !== null ? this._registerFormat(fmtString) : -1;\n const styleAttr = xfIdx >= 0 ? ` s=\"${xfIdx}\"` : '';\n\n const ref = cellRefAttr(c, prevCol, this.currentColLetters[c], this.stream.rowNum);\n prevCol = c;\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n bigBuf.writeString(`<c${ref}${styleAttr}><v>${val}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (typeof val === 'bigint') {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n } else if (typeof val === 'boolean') {\n bigBuf.writeString(`<c${ref} t=\"b\"${styleAttr}><v>${val ? 1 : 0}</v></c>`);\n } else if (val instanceof Date) {\n const oaDate = this._toOADate(val);\n if (Number.isFinite(oaDate)) {\n const finalStyle = xfIdx >= 0 ? xfIdx : 1;\n bigBuf.writeString(`<c${ref} s=\"${finalStyle}\"><v>${oaDate}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (val !== null && val !== undefined) {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n }\n }\n bigBuf.writeString('</row>');\n }\n\n /** Finish the current streaming sheet and append it to the archive. */\n endSheet(): void {\n const bigBuf = this.stream.assertStreaming();\n bigBuf.writeString('</sheetData>');\n\n if (this.stream.doAutofilter && this.stream.endCol > 0) {\n this._autofilterIsOn = true;\n const filterRef = `A1:${this.currentColLetters[this.stream.endCol - 1]}${this.stream.rowNum}`;\n bigBuf.writeString(`<autoFilter ref=\"${filterRef}\"/>`);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n const formulaSheetName = this._formatSheetNameForFormula(sheet.name);\n sheet.filterHeaderRange = `${formulaSheetName}!$A$1:$${this.currentColLetters[this.stream.endCol - 1]}$${this.stream.rowNum}`;\n }\n\n bigBuf.writeString('</worksheet>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n\n this.stream.end();\n this.currentColLetters = [];\n }\n\n /**\n * Write an entire sheet in one call (batch mode).\n */\n writeSheet(rows: CellValue[][], headers: string[] | null = null, doAutofilter: boolean = true): void {\n const bigBuf = new BigBuffer();\n\n let columnCount = 0;\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n if (columnCount > 0) assertColumnCount(columnCount);\n const totalRows = rows.length + (headers ? 1 : 0);\n assertRowCount(totalRows);\n if (headers) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n for (let r = 0; r < rows.length; r++) {\n assertRowFitsColumns('row', rows[r].length, columnCount);\n }\n\n const colWidths = initColWidths(columnCount);\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n\n if (headers) {\n applyHeaderWidths(colWidths, headers, columnCount);\n }\n updateColWidthsFromRows(colWidths, rows);\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString('<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">');\n\n if (totalRows > 0 && columnCount > 0) {\n bigBuf.writeString(`<dimension ref=\"A1:${colLetters[columnCount - 1]}${totalRows}\"/>`);\n } else {\n bigBuf.writeString('<dimension ref=\"A1\"/>');\n }\n\n const isFirstSheet = this.sheetCount === 1;\n if (headers) {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n } else {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n }\n\n bigBuf.writeString('<cols>');\n for (let i = 0; i < columnCount; i++) {\n const width = defaultColWidth(colWidths[i]);\n bigBuf.writeString(`<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" bestFit=\"1\" customWidth=\"1\" />`);\n }\n bigBuf.writeString('</cols><sheetData>');\n\n let rowNum = 0;\n\n if (headers) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n // Headers are contiguous from column A, so no cell needs `r`.\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(bigBuf, headers[c], '', 3);\n }\n bigBuf.writeString('</row>');\n }\n\n for (let r = 0; r < rows.length; r++) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n const row = rows[r];\n let prevCol = -1;\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const xfIdx = fmtString !== null ? this._registerFormat(fmtString) : -1;\n const styleAttr = xfIdx >= 0 ? ` s=\"${xfIdx}\"` : '';\n\n const ref = cellRefAttr(c, prevCol, colLetters[c], rowNum);\n prevCol = c;\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n bigBuf.writeString(`<c${ref}${styleAttr}><v>${val}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (typeof val === 'bigint') {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n } else if (typeof val === 'boolean') {\n bigBuf.writeString(`<c${ref} t=\"b\"${styleAttr}><v>${val ? 1 : 0}</v></c>`);\n } else if (val instanceof Date) {\n const oaDate = this._toOADate(val);\n if (Number.isFinite(oaDate)) {\n const finalStyle = xfIdx >= 0 ? xfIdx : 1;\n bigBuf.writeString(`<c${ref} s=\"${finalStyle}\"><v>${oaDate}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (val !== null && val !== undefined) {\n this._writeStringCell(bigBuf, val.toString(), ref, xfIdx >= 0 ? xfIdx : undefined);\n }\n }\n bigBuf.writeString('</row>');\n }\n\n bigBuf.writeString('</sheetData>');\n\n if (doAutofilter && headers && columnCount > 0) {\n this._autofilterIsOn = true;\n const filterRef = `A1:${colLetters[columnCount - 1]}${totalRows}`;\n bigBuf.writeString(`<autoFilter ref=\"${filterRef}\"/>`);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n const formulaSheetName = this._formatSheetNameForFormula(sheet.name);\n sheet.filterHeaderRange = `${formulaSheetName}!$A$1:$${colLetters[columnCount - 1]}$${totalRows}`;\n }\n\n bigBuf.writeString('</worksheet>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n }\n\n /** `ref` is the cell's `r` attribute from `cellRefAttr`, or '' when omitted. */\n private _writeStringCell(bigBuf: BigBuffer, val: string, ref: string, styleOverride?: number): void {\n assertCellTextLength(val);\n let index = this.sstMap.get(val);\n if (index === undefined) {\n index = this.sstArray.length;\n this.sstArray.push(val);\n this.sstMap.set(val, index);\n }\n this.sstCntAll++;\n const styleAttr = styleOverride !== undefined ? ` s=\"${styleOverride}\"` : '';\n bigBuf.writeString(`<c${ref} t=\"s\"${styleAttr}><v>${index}</v></c>`);\n }\n\n private _registerFormat(fmtString: string): number {\n if (this._formatXfMap.has(fmtString)) {\n return this._formatXfMap.get(fmtString)!;\n }\n const numfmtId = this._nextNumfmtId++;\n this._formatRegistry.set(fmtString, numfmtId);\n const xfIndex = this._nextXfIndex++;\n this._formatXfMap.set(fmtString, xfIndex);\n return xfIndex;\n }\n\n private _toOADate(date: Date): number {\n // Use UTC time to avoid timezone conversion issues; handles the\n // fictitious 1900-02-29 (dates before 1900-03-01 serialize one lower).\n return timeToOaDate(date.getTime(), this._oaEpoch);\n }\n\n private _getDateWidth(_date: Date): number {\n return 19; // \"YYYY-MM-DD HH:MM:SS\" ≈ 19 chars\n }\n\n /** Finalize the ZIP package and close the output stream. */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this._finalized) {\n reject(new Error('XlsxWriter: already finalized'));\n return;\n }\n this._finalized = true;\n let settled = false;\n const cleanupTemp = (): void => {\n try {\n if (fs.existsSync(this._tempPath)) fs.rmSync(this._tempPath);\n } catch {\n // Preserve original error.\n }\n };\n const fail = (err: unknown): void => {\n if (settled) return;\n settled = true;\n try { this.archive.abort(); } catch { /* preserve */ }\n try { this.output.destroy(); } catch { /* preserve */ }\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n };\n const succeed = (): void => {\n if (settled) return;\n if (this._outputError) {\n fail(this._outputError);\n return;\n }\n settled = true;\n try {\n // Ensure data hits disk before publishing (xlspy parity, no fsync of dir).\n const fd = fs.openSync(this._tempPath, 'r+');\n try { fs.fsyncSync(fd); } finally { fs.closeSync(fd); }\n // Preserve the mode of a file being replaced (the temp file\n // was created with the process umask).\n try {\n const existing = fs.statSync(this._targetPath);\n fs.chmodSync(this._tempPath, existing.mode & 0o777);\n } catch {\n // Target does not exist yet.\n }\n fs.renameSync(this._tempPath, this._targetPath);\n resolve();\n } catch (err) {\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n };\n try {\n if (this._outputError) throw this._outputError;\n this._writeSharedStrings();\n this._writeStyles();\n this._writeWorkbook();\n this._writeContentTypes();\n this._writeRels();\n\n this.output.once('close', succeed);\n this.output.once('error', fail);\n this.archive.once('error', fail);\n\n this.archive.finalize();\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private _writeSharedStrings(): void {\n const bigBuf = new BigBuffer();\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString(`<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${this.sstCntAll}\" uniqueCount=\"${this.sstArray.length}\">`);\n\n for (let i = 0; i < this.sstArray.length; i++) {\n const txt = this.sstArray[i];\n const cleanTxt = this._escape(txt);\n if (cleanTxt.length > 0 && (cleanTxt[0] === ' ' || cleanTxt[cleanTxt.length - 1] === ' ' || /[\\t\\n\\r]/.test(cleanTxt))) {\n bigBuf.writeString(`<si><t xml:space=\"preserve\">${cleanTxt}</t></si>`);\n } else {\n bigBuf.writeString(`<si><t>${cleanTxt}</t></si>`);\n }\n }\n\n bigBuf.writeString('</sst>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: 'xl/sharedStrings.xml' });\n }\n\n private _writeStyles(): void {\n let numFmts = '';\n let numFmtCount = 0;\n\n const xfEntries: string[] = [];\n xfEntries.push('<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>');\n xfEntries.push('<xf numFmtId=\"14\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>');\n xfEntries.push('<xf numFmtId=\"22\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>');\n xfEntries.push('<xf numFmtId=\"0\" fontId=\"1\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"/>');\n\n for (const [fmtString, numfmtId] of this._formatRegistry) {\n const escapedFmt = fmtString\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n numFmts += `<numFmt numFmtId=\"${numfmtId}\" formatCode=\"${escapedFmt}\"/>`;\n numFmtCount++;\n }\n\n const sortedFormats = [...this._formatXfMap.entries()].sort((a, b) => a[1] - b[1]);\n for (const [fmtString] of sortedFormats) {\n const numfmtId = this._formatRegistry.get(fmtString)!;\n xfEntries.push(`<xf numFmtId=\"${numfmtId}\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>`);\n }\n\n const totalXf = xfEntries.length;\n const numFmtsSection = numFmtCount > 0 ? `<numFmts count=\"${numFmtCount}\">${numFmts}</numFmts>` : '';\n\n const styles = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsSection}\n<fonts count=\"2\">\n<font><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font>\n<font><b/><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font>\n</fonts>\n<fills count=\"2\">\n<fill><patternFill patternType=\"none\"/></fill>\n<fill><patternFill patternType=\"gray125\"/></fill>\n</fills>\n<borders count=\"1\">\n<border><left/><right/><top/><bottom/><diagonal/></border>\n</borders>\n<cellStyleXfs count=\"1\">\n<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\n</cellStyleXfs>\n<cellXfs count=\"${totalXf}\">\n${xfEntries.join('\\n')}\n</cellXfs>\n<cellStyles count=\"1\">\n<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>\n</cellStyles>\n<dxfs count=\"0\"/>\n<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>\n</styleSheet>`;\n this.archive.append(styles, { name: 'xl/styles.xml' });\n }\n\n private _writeWorkbook(): void {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n<fileVersion appName=\"xl\" lastEdited=\"4\" lowestEdited=\"4\" rupBuild=\"4505\"/>\n<workbookPr defaultThemeVersion=\"124226\"/>\n<bookViews><workbookView xWindow=\"240\" yWindow=\"15\" windowWidth=\"16095\" windowHeight=\"9660\"/></bookViews>\n<sheets>`;\n\n for (const sheet of this.sheetList) {\n const state = sheet.hidden ? ' state=\"hidden\"' : '';\n const escapedName = this._escapeSheetNameForXml(sheet.name);\n xml += `<sheet name=\"${escapedName}\" sheetId=\"${sheet.sheetId}\"${state} r:id=\"${sheet.rId}\"/>`;\n }\n\n xml += `</sheets>`;\n\n if (this._autofilterIsOn) {\n xml += '<definedNames>';\n for (const sheet of this.sheetList) {\n if (sheet.filterHeaderRange) {\n const localSheetId = sheet.sheetId - 1;\n const escapedRange = this._escape(sheet.filterHeaderRange);\n xml += `<definedName name=\"_xlnm._FilterDatabase\" localSheetId=\"${localSheetId}\" hidden=\"1\">${escapedRange}</definedName>`;\n }\n }\n xml += '</definedNames>';\n }\n\n xml += '<calcPr calcId=\"124519\" fullCalcOnLoad=\"1\"/>';\n xml += `</workbook>`;\n this.archive.append(xml, { name: 'xl/workbook.xml' });\n }\n\n private _writeContentTypes(): void {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/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<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\n<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>`;\n\n for (const sheet of this.sheetList) {\n xml += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n }\n\n xml += `</Types>`;\n this.archive.append(xml, { name: '[Content_Types].xml' });\n }\n\n private _writeRels(): void {\n const globalRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\n</Relationships>`;\n this.archive.append(globalRels, { name: '_rels/.rels' });\n\n let wbRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n\n for (const sheet of this.sheetList) {\n wbRels += `<Relationship Id=\"${sheet.rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n\n let nextId = this.sheetList.length + 1;\n wbRels += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n wbRels += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/>`;\n\n wbRels += `</Relationships>`;\n this.archive.append(wbRels, { name: 'xl/_rels/workbook.xml.rels' });\n }\n}\n\nexport default XlsxWriter;\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport { writeBufferAtomically } from './atomicFile';\nimport { writeAdmZipStreaming, StagedZipPart } from './streamingZip';\nimport { timeToOaDate } from './writerHelpers';\nimport {\n escapeXmlText,\n escapeXlsxText,\n columnIndexToLetter,\n columnLetterToIndex,\n parseSharedStringsXml,\n trimTrailingEmptyRows,\n parseTagAttributes,\n resolveRelTarget,\n unescapeXml,\n} from './xmlUtils';\n\n/**\n * Options for {@link XlsxUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use style 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\n/** A one-pass synchronous or asynchronous source of worksheet rows. */\nexport type RowSource =\n | Iterable<ReadonlyArray<CellValue>>\n | AsyncIterable<ReadonlyArray<CellValue>>;\n\ninterface PivotCacheDef {\n path: string;\n xml: string;\n}\n\ninterface CellRange {\n c1: number;\n r1: number;\n c2: number;\n r2: number;\n}\n\n/** Parse an A1-style range (\"A1\", \"A1:B10\", \"$A$1:$B$10\"). */\nfunction parseCellRange(ref: string): CellRange | null {\n const m = /^\\$?([A-Za-z]+)\\$?(\\d+)(?::\\$?([A-Za-z]+)\\$?(\\d+))?$/.exec(ref.trim());\n if (!m) return null;\n const c1 = columnLetterToIndex(m[1].toUpperCase());\n const r1 = parseInt(m[2], 10);\n const c2 = m[3] ? columnLetterToIndex(m[3].toUpperCase()) : c1;\n const r2 = m[4] ? parseInt(m[4], 10) : r1;\n if (!Number.isFinite(c1) || !Number.isFinite(r1) || !Number.isFinite(c2) || !Number.isFinite(r2)) {\n return null;\n }\n return {\n c1: Math.min(c1, c2),\n r1: Math.min(r1, r2),\n c2: Math.max(c1, c2),\n r2: Math.max(r1, r2),\n };\n}\n\n/**\n * Update the data of a worksheet inside an existing XLSX file without rebuilding\n * the workbook. Everything outside the target sheet's cell data — pivot tables\n * and their caches, other sheets, styles, themes, defined names — is preserved\n * byte-for-byte. This makes it possible to refresh a data sheet that other\n * Excel features (pivot tables, charts, formulas) are wired to.\n *\n * ```ts\n * const updater = new XlsxUpdater('report.xlsx');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsx'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsxUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n private temporaryDirectory: string | null = null;\n private readonly stagedParts: StagedZipPart = new Map();\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefs: PivotCacheDef[] = [];\n private pivotTableDefPaths: string[] = [];\n\n private sharedStringsXml: string | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsOriginalLength: number = 0;\n private sharedStringsCount: number = 0;\n private sharedStringsPending: string[] = [];\n private sharedStringsDirty: boolean = false;\n private stringIndexMap: Map<string, number> = new Map();\n\n private _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsx` file.\n */\n constructor(filePath: string) {\n this.sourcePath = filePath;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`XlsxUpdater: file not found: ${filePath}`);\n }\n\n this.zip = new AdmZip(filePath);\n\n if (this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsxUpdater: XLSB files are not supported yet. Convert the workbook to XLSX first.'\n );\n }\n if (!this.zip.getEntry('xl/workbook.xml')) {\n throw new Error('XlsxUpdater: not a valid XLSX workbook (xl/workbook.xml missing).');\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsxUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsxUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetXml = this._entryData(sheetPath).toString('utf8');\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsXml !== null) {\n this.sharedStringsCount = Math.max(\n 0,\n this.sharedStringsCount - this._sharedStringRefCount(sheetXml),\n );\n this.sharedStringsDirty = true;\n }\n\n let colStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateStyle: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectExistingStyles(sheetXml);\n colStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateStyle = this._findDateStyleIndex();\n }\n\n const lastCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0) - 1;\n const totalRows = rows.length + (headers ? 1 : 0);\n\n const newSheetData = this._buildSheetData(rows, headers, colStyles, headerStyles, dateStyle);\n const newXml = this._patchSheetXml(sheetXml, newSheetData, totalRows, lastCol);\n this.zip.updateFile(sheetPath, Buffer.from(newXml, 'utf8'));\n this._discardStagedPart(sheetPath);\n\n if (this.sharedStringsXml !== null) {\n this._commitSharedStrings();\n }\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n this._updatePivotCaches(sheetName, dimRef, rows.length);\n this._addRefreshOnLoadToPivotTables();\n this._removeCalcChain();\n this._updateTableRefs(sheetName, dimRef);\n }\n\n /**\n * Replace worksheet rows from a one-pass source without materialising the\n * complete result set. Use {@link saveStreaming} to keep the final ZIP\n * write streaming as well.\n */\n async replaceSheetDataStream(\n sheetName: string,\n rows: RowSource,\n options: ReplaceSheetDataOptions = {},\n ): Promise<void> {\n const { headers, styleFallback = 'inherit' } = options;\n if (styleFallback !== 'inherit' && styleFallback !== 'general') {\n throw new Error(\"XlsxUpdater: styleFallback must be 'inherit' or 'general'.\");\n }\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsxUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsxUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const oldStage = this.stagedParts.get(sheetPath);\n const beforeValuesLength = this.sharedStringsValues.length;\n const beforePendingLength = this.sharedStringsPending.length;\n const beforeSharedStringsCount = this.sharedStringsCount;\n const beforeSharedStringsDirty = this.sharedStringsDirty;\n const beforeSharedStringsXml = this.sharedStringsXml;\n const beforeSharedStringsOriginalLength = this.sharedStringsOriginalLength;\n const beforeStringIndexMap = new Map(this.stringIndexMap);\n const sharedStringsEntry = this.zip.getEntry('xl/sharedStrings.xml');\n const beforeSharedStringsBytes = sharedStringsEntry || this.stagedParts.has('xl/sharedStrings.xml')\n ? Buffer.from(this._entryData('xl/sharedStrings.xml'))\n : null;\n const createdParts: string[] = [];\n const oldSheetXml = this._entryData(sheetPath).toString('utf8');\n const rowsPath = this._temporaryPath('.rows');\n const outputPath = this._temporaryPath('.xml');\n createdParts.push(rowsPath, outputPath);\n let output: fs.WriteStream | null = null;\n\n try {\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsXml !== null) {\n this.sharedStringsCount = Math.max(\n 0,\n this.sharedStringsCount - this._sharedStringRefCount(oldSheetXml),\n );\n this.sharedStringsDirty = true;\n }\n\n let colStyles = new Map<number, number>();\n let headerStyles = new Map<number, number>();\n let dateStyle: number | null = null;\n if (styleFallback !== 'general') {\n const collected = this._collectExistingStyles(oldSheetXml);\n colStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateStyle = this._findDateStyleIndex();\n }\n\n const prefixMatch = /<([A-Za-z_][\\w.-]*:)?sheetData\\b/.exec(oldSheetXml);\n const prefix = prefixMatch?.[1] ?? '';\n const rowOutput = fs.createWriteStream(rowsPath);\n output = rowOutput;\n let outputError: Error | null = null;\n rowOutput.on('error', error => { outputError = error; });\n\n let nextRow = 1;\n let width = headers?.length ?? 0;\n let dataRowsSeen = 0;\n let keptDataRows = 0;\n let lastKeptEnd = 0;\n let pendingEmptyWidth = 0;\n let writtenBytes = 0;\n\n const write = async (data: Buffer): Promise<void> => {\n if (outputError) throw outputError;\n writtenBytes += data.length;\n if (rowOutput.write(data)) return;\n await new Promise<void>((resolve, reject) => {\n const onDrain = () => { cleanup(); resolve(); };\n const onError = (error: Error) => { cleanup(); reject(error); };\n const cleanup = () => {\n rowOutput.off('drain', onDrain);\n rowOutput.off('error', onError);\n };\n rowOutput.once('drain', onDrain);\n rowOutput.once('error', onError);\n });\n };\n\n if (headers !== undefined) {\n const cells = headers.map((value, column) =>\n this._valueCell(value, column, nextRow, headerStyles, dateStyle));\n const header = `<${prefix}row r=\"${nextRow}\">${cells.join('')}</${prefix}row>`;\n await write(Buffer.from(header, 'utf8'));\n lastKeptEnd = writtenBytes;\n nextRow++;\n }\n\n for await (const sourceRow of rows) {\n if (typeof sourceRow === 'string' || sourceRow instanceof Uint8Array) {\n throw new TypeError('Each row must be an iterable of cells, not text');\n }\n const row = Array.from(sourceRow) as CellValue[];\n const cells = row.map((value, column) =>\n value === null || value === undefined\n ? ''\n : this._valueCell(value, column, nextRow, colStyles, dateStyle));\n const rowXml = `<${prefix}row r=\"${nextRow}\">${cells.join('')}</${prefix}row>`;\n await write(Buffer.from(rowXml, 'utf8'));\n dataRowsSeen++;\n nextRow++;\n\n if (row.every(value => value === null || value === undefined)) {\n pendingEmptyWidth = Math.max(pendingEmptyWidth, row.length);\n } else {\n width = Math.max(width, pendingEmptyWidth, row.length);\n pendingEmptyWidth = 0;\n keptDataRows = dataRowsSeen;\n lastKeptEnd = writtenBytes;\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n rowOutput.once('close', resolve);\n rowOutput.once('error', reject);\n rowOutput.end();\n });\n if (outputError) throw outputError;\n\n const rowsFd = fs.openSync(rowsPath, 'r+');\n try {\n fs.ftruncateSync(rowsFd, lastKeptEnd);\n } finally {\n fs.closeSync(rowsFd);\n }\n\n const totalRows = keptDataRows + (headers !== undefined ? 1 : 0);\n const lastCol = width - 1;\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n this._patchSheetFile(oldSheetXml, rowsPath, outputPath, dimRef);\n this._stagePart(sheetPath, outputPath);\n this._commitSharedStrings();\n this._updatePivotCaches(sheetName, dimRef, keptDataRows);\n this._addRefreshOnLoadToPivotTables();\n this._removeCalcChain();\n this._updateTableRefs(sheetName, dimRef);\n\n if (oldStage && oldStage !== outputPath) {\n this._removeTemporaryFile(oldStage);\n }\n createdParts.splice(createdParts.indexOf(outputPath), 1);\n } catch (error) {\n this.sharedStringsValues.length = beforeValuesLength;\n this.sharedStringsPending.length = beforePendingLength;\n this.sharedStringsCount = beforeSharedStringsCount;\n this.sharedStringsDirty = beforeSharedStringsDirty;\n this.sharedStringsXml = beforeSharedStringsXml;\n this.sharedStringsOriginalLength = beforeSharedStringsOriginalLength;\n this.stringIndexMap.clear();\n for (const [value, index] of beforeStringIndexMap) this.stringIndexMap.set(value, index);\n if (beforeSharedStringsBytes) {\n this.zip.updateFile('xl/sharedStrings.xml', beforeSharedStringsBytes);\n }\n if (oldStage) this.stagedParts.set(sheetPath, oldStage);\n else this.stagedParts.delete(sheetPath);\n throw error;\n } finally {\n if (output && !output.closed) output.destroy();\n for (const temporaryPath of createdParts) {\n this._removeTemporaryFile(temporaryPath);\n }\n }\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n this._materializeStagedParts();\n writeBufferAtomically(this.zip.toBuffer(), target);\n }\n\n /** Save staged streaming replacements without materialising the ZIP. */\n async saveStreaming(outputPath?: string): Promise<void> {\n const target = outputPath ?? this.sourcePath;\n await writeAdmZipStreaming(this.zip, this.stagedParts, target);\n\n // Keep the updater reusable after an in-place save. The synchronous\n // AdmZip path is refreshed with the staged parts only after the output\n // archive has been safely installed.\n this._materializeStagedParts();\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n this._materializeStagedParts();\n return this.zip.toBuffer();\n }\n\n /**\n * Release the staging directory and any unsaved staged parts.\n * The updater remains usable; a new staging directory is created lazily\n * on the next streaming replacement.\n */\n dispose(): void {\n for (const stagedPath of this.stagedParts.values()) {\n try {\n fs.rmSync(stagedPath, { force: true });\n } catch {\n // Best-effort cleanup.\n }\n }\n this.stagedParts.clear();\n if (this.temporaryDirectory !== null) {\n try {\n fs.rmSync(this.temporaryDirectory, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup.\n }\n this.temporaryDirectory = null;\n }\n }\n\n /** Support `using` declarations for automatic staging cleanup. */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n private _ensureTemporaryDirectory(): string {\n if (this.temporaryDirectory === null) {\n this.temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'spreadsheet-updater-'));\n } else {\n try {\n fs.mkdirSync(this.temporaryDirectory, { recursive: true });\n } catch {\n // Best-effort; file creation will surface persistent failures.\n }\n }\n return this.temporaryDirectory;\n }\n\n private _temporaryPath(suffix: string): string {\n return path.join(this._ensureTemporaryDirectory(), `part-${Date.now()}-${Math.random().toString(16).slice(2)}${suffix}`);\n }\n\n private _removeTemporaryFile(filePath: string): void {\n try {\n fs.rmSync(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n\n private _entryData(name: string): Buffer {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) return fs.readFileSync(stagedPath);\n const entry = this.zip.getEntry(name);\n if (!entry) throw new Error(`XlsxUpdater: ZIP member missing: ${name}`);\n return entry.getData();\n }\n\n private _stagePart(name: string, filePath: string): void {\n this.stagedParts.set(name, filePath);\n }\n\n private _discardStagedPart(name: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (!stagedPath) return;\n this._removeTemporaryFile(stagedPath);\n this.stagedParts.delete(name);\n }\n\n private _materializeStagedParts(): void {\n for (const [name, stagedPath] of this.stagedParts) {\n this.zip.updateFile(name, fs.readFileSync(stagedPath));\n this._removeTemporaryFile(stagedPath);\n }\n this.stagedParts.clear();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) {\n rIdToTarget[id] = target;\n }\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.xml');\n const wbXml = wbEntry ? wbEntry.getData().toString('utf8') : '';\n const sheetRe = /<sheet\\b[^>]*>/g;\n let match;\n while ((match = sheetRe.exec(wbXml)) !== null) {\n const tag = match[0];\n const attrs = parseTagAttributes(tag);\n const rawName = attrs['name'];\n const rId = attrs['r:id'] ?? attrs['id'] ?? attrs['rId'];\n if (rawName === undefined || rId === undefined) continue;\n const name = unescapeXml(rawName);\n const target = rIdToTarget[rId] ?? '';\n const fullPath = resolveRelTarget(target);\n if (fullPath) {\n this.sheetNameToPath.set(name, fullPath);\n }\n }\n // 1904 date system for Date→OA conversion.\n const wbPrMatch = /<workbookPr\\b[^>]*>/i.exec(wbXml);\n if (wbPrMatch) {\n const wbPrAttrs = parseTagAttributes(wbPrMatch[0]);\n const v = (wbPrAttrs['date1904'] ?? '').trim().toLowerCase();\n this._oaEpoch =\n (v === '1' || v === 'true') ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n }\n\n for (const entry of this.zip.getEntries()) {\n const name = entry.entryName;\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.xml$/.test(name)) {\n this.pivotCacheDefs.push({ path: name, xml: entry.getData().toString('utf8') });\n } else if (/^xl\\/pivotTables\\/pivotTable\\d*\\.xml$/.test(name)) {\n this.pivotTableDefPaths.push(name);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsXml !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.xml');\n if (!entry && !this.stagedParts.has('xl/sharedStrings.xml')) {\n this.sharedStringsXml = null;\n return;\n }\n this.sharedStringsXml = this._entryData('xl/sharedStrings.xml').toString('utf8');\n this.sharedStringsValues = parseSharedStringsXml(this.sharedStringsXml);\n\n const countMatch = /<(?:[A-Za-z_][\\w.-]*:)?sst\\b[^>]*>/i.exec(this.sharedStringsXml);\n const countAttr = countMatch ? /(?:^|\\s)count\\s*=\\s*[\"'](\\d+)[\"']/.exec(countMatch[0]) : null;\n this.sharedStringsCount = countAttr ? parseInt(countAttr[1], 10) : this.sharedStringsValues.length;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this.sharedStringsOriginalLength = this.sharedStringsValues.length;\n this.sharedStringsPending = [];\n this.sharedStringsDirty = false;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsXml === null || !this.sharedStringsDirty) {\n return;\n }\n\n let xml = this.sharedStringsXml;\n\n const sstMatch = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sst\\b[^>]*>/i.exec(xml);\n if (!sstMatch || sstMatch.index === undefined) {\n throw new Error('XlsxUpdater: sharedStrings.xml has no sst element.');\n }\n const tag = sstMatch[0];\n const prefix = sstMatch.groups?.prefix ?? '';\n const newTag = XlsxUpdater._replaceOrAddXmlAttribute(\n XlsxUpdater._replaceOrAddXmlAttribute(tag, 'count', String(this.sharedStringsCount)),\n 'uniqueCount',\n String(this.sharedStringsValues.length),\n );\n xml = xml.substring(0, sstMatch.index) + newTag + xml.substring(sstMatch.index + tag.length);\n\n const closingRe = new RegExp(`</${prefix}sst\\\\s*>\\\\s*$`, 'i');\n const closingMatch = closingRe.exec(xml);\n if (!closingMatch || closingMatch.index === undefined) {\n throw new Error('XlsxUpdater: sharedStrings.xml has no closing sst element.');\n }\n\n const appended = this.sharedStringsPending.map(txt => {\n const clean = escapeXlsxText(txt);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n const tAttr = preserve ? ' xml:space=\"preserve\"' : '';\n return `<${prefix}si><${prefix}t${tAttr}>${clean}</${prefix}t></${prefix}si>`;\n }).join('');\n\n xml = xml.substring(0, closingMatch.index) + appended + xml.substring(closingMatch.index);\n this.zip.updateFile('xl/sharedStrings.xml', Buffer.from(xml, 'utf8'));\n this.sharedStringsXml = xml;\n this.sharedStringsOriginalLength = this.sharedStringsValues.length;\n this.sharedStringsPending = [];\n this.sharedStringsDirty = false;\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectExistingStyles(sheetXml: string): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const sdStart = sheetXml.indexOf('<sheetData>');\n if (sdStart === -1) return { dataStyles: new Map(), headerStyles };\n const sdEnd = sheetXml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) return { dataStyles: new Map(), headerStyles };\n\n const region = sheetXml.substring(sdStart, sdEnd);\n // `r` on a cell is optional: a cell without it sits right after the previous\n // cell of its row (column A when first), so track the position per row.\n const cellRe = /<row\\b[^>]*>|<c\\b[^>]*>/g;\n let m;\n let row = 0;\n let nextCol = 0;\n while ((m = cellRe.exec(region)) !== null) {\n const tag = m[0];\n if (tag.startsWith('<row')) {\n const rowAttr = /\\br=\"(\\d+)\"/.exec(tag);\n row = rowAttr ? parseInt(rowAttr[1], 10) : row + 1;\n nextCol = 0;\n continue;\n }\n const rMatch = /r=\"([A-Z]+)(\\d+)\"/.exec(tag);\n let col = nextCol;\n if (rMatch) {\n col = columnLetterToIndex(rMatch[1]);\n row = parseInt(rMatch[2], 10);\n }\n nextCol = col + 1;\n const sMatch = /s=\"(\\d+)\"/.exec(tag);\n if (!sMatch) continue;\n const s = parseInt(sMatch[1], 10);\n if (s <= 0) continue;\n\n if (row === 1) {\n if (!headerStyles.has(col)) headerStyles.set(col, s);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(s, (colCounts.get(s) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [s, count] of colCounts) {\n if (count > bestCount) {\n best = s;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateStyleIndex(): number | null {\n const entry = this.zip.getEntry('xl/styles.xml');\n if (!entry) return null;\n const xml = entry.getData().toString('utf8');\n\n const customDateFormats = new Set<number>();\n const numFmtRe = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let m;\n while ((m = numFmtRe.exec(xml)) !== null) {\n const id = parseInt(m[1], 10);\n const code = m[2].toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n customDateFormats.add(id);\n }\n }\n\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart === -1) return null;\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd === -1) return null;\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n\n const xfRe = /<xf\\b[^>]*>/g;\n let index = 0;\n while ((m = xfRe.exec(cellXfsContent)) !== null) {\n const nfMatch = /numFmtId=\"(\\d+)\"/.exec(m[0]);\n const nfId = nfMatch ? parseInt(nfMatch[1], 10) : 0;\n const isDate = (nfId >= 14 && nfId <= 22) ||\n (nfId >= 45 && nfId <= 47) ||\n customDateFormats.has(nfId);\n if (isDate) return index;\n index++;\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Cell / row serialization\n // ------------------------------------------------------------------\n\n private _buildSheetData(\n rows: CellValue[][],\n headers: string[] | undefined,\n colStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n let out = '';\n let rowNum = 0;\n\n if (headers) {\n rowNum = 1;\n out += '<row r=\"1\">';\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n out += this._stringCell(headers[c], c, rowNum, style);\n }\n out += '</row>';\n }\n\n for (const row of rows) {\n rowNum++;\n out += `<row r=\"${rowNum}\">`;\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n out += this._valueCell(raw, c, rowNum, colStyles, dateStyle);\n }\n out += '</row>';\n }\n return out;\n }\n\n private _valueCell(\n raw: CellValue,\n col: number,\n rowNum: number,\n colStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n const colRef = columnIndexToLetter(col);\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = colStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n return `<c r=\"${colRef}${rowNum}\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'bigint') {\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'boolean') {\n return `<c r=\"${colRef}${rowNum}\" t=\"b\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val ? 1 : 0}</v></c>`;\n }\n if (val instanceof Date) {\n const oaDate = timeToOaDate(val.getTime(), this._oaEpoch);\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateStyle !== null ? dateStyle : 0);\n return `<c r=\"${colRef}${rowNum}\"${style > 0 ? ` s=\"${style}\"` : ''}><v>${oaDate}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (val !== null && val !== undefined) {\n return this._stringCell(String(val), col, rowNum, colStyle);\n }\n return '';\n }\n\n private _stringCell(text: string, col: number, rowNum: number, style: number): string {\n const colRef = columnIndexToLetter(col);\n const styleAttr = style > 0 ? ` s=\"${style}\"` : '';\n\n if (this.sharedStringsXml === null) {\n const clean = escapeXlsxText(text);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n const tAttr = preserve ? ' xml:space=\"preserve\"' : '';\n return `<c r=\"${colRef}${rowNum}\" t=\"inlineStr\"${styleAttr}><is><t${tAttr}>${clean}</t></is></c>`;\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n this.sharedStringsPending.push(text);\n }\n this.sharedStringsCount++;\n this.sharedStringsDirty = true;\n return `<c r=\"${colRef}${rowNum}\" t=\"s\"${styleAttr}><v>${index}</v></c>`;\n }\n\n private static _replaceOrAddXmlAttribute(tag: string, name: string, value: string): string {\n const escaped = escapeXmlText(value);\n const attribute = new RegExp(`(\\\\s${name}\\\\s*=\\\\s*[\"'])[^\"']*([\"'])`, 'i');\n if (attribute.test(tag)) {\n return tag.replace(attribute, `$1${escaped}$2`);\n }\n const insertion = ` ${name}=\"${escaped}\"`;\n return tag.endsWith('/>')\n ? `${tag.slice(0, -2)}${insertion}/>`\n : `${tag.slice(0, -1)}${insertion}>`;\n }\n\n private _sharedStringRefCount(sheetXml: string): number {\n const cellTags = sheetXml.match(/<(?:(?:[A-Za-z_][\\w.-]*):)?c\\b[^>]*>/gi) ?? [];\n return cellTags.filter(tag => /(?:^|\\s)t\\s*=\\s*[\"']s[\"']/i.test(tag)).length;\n }\n\n // ------------------------------------------------------------------\n // Worksheet XML patching\n // ------------------------------------------------------------------\n\n private _patchSheetXml(sheetXml: string, newSheetData: string, totalRows: number, lastCol: number): string {\n let xml = sheetXml;\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n\n // Update the dimension element, or insert one if missing.\n const dimRe = /<dimension\\b[^>]*>/;\n const dimMatch = dimRe.exec(xml);\n if (dimMatch) {\n xml = xml.substring(0, dimMatch.index) +\n dimMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(dimMatch.index + dimMatch[0].length);\n } else {\n const rootRe = /<worksheet\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n const insertAt = rootMatch.index + rootMatch[0].length;\n xml = xml.substring(0, insertAt) + `<dimension ref=\"${dimRef}\"/>` + xml.substring(insertAt);\n }\n }\n\n // Replace the entire sheetData element content.\n const sdOpen = '<sheetData>';\n const sdStart = xml.indexOf(sdOpen);\n if (sdStart === -1) {\n const selfClosing = /<sheetData\\s*\\/\\s*>/;\n const scMatch = selfClosing.exec(xml);\n if (scMatch) {\n xml = xml.substring(0, scMatch.index) +\n '<sheetData>' + newSheetData + '</sheetData>' +\n xml.substring(scMatch.index + scMatch[0].length);\n return xml;\n }\n throw new Error('XlsxUpdater: <sheetData> element not found in worksheet XML.');\n }\n const sdEnd = xml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) {\n throw new Error('XlsxUpdater: <sheetData> element not closed in worksheet XML.');\n }\n xml = xml.substring(0, sdStart + sdOpen.length) + newSheetData + xml.substring(sdEnd);\n\n // Keep the autoFilter range in sync with the new data bounds.\n const afRe = /<autoFilter\\b[^>]*>/;\n const afMatch = afRe.exec(xml);\n if (afMatch && totalRows > 0 && lastCol >= 0 && afMatch[0].includes('ref=')) {\n xml = xml.substring(0, afMatch.index) +\n afMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(afMatch.index + afMatch[0].length);\n }\n\n return xml;\n }\n\n private _patchSheetFile(\n sheetXml: string,\n rowsPath: string,\n outputPath: string,\n dimensionRef: string,\n ): void {\n const source = Buffer.from(sheetXml, 'utf8');\n const text = sheetXml;\n const replacements: Array<{\n start: number;\n end: number;\n data?: Buffer;\n rows?: boolean;\n suffix?: Buffer;\n }> = [];\n\n const emptySheetData = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sheetData\\b(?<attrs>[^>]*)\\/>/i.exec(text);\n if (emptySheetData && emptySheetData.index !== undefined) {\n const prefix = emptySheetData.groups?.prefix ?? '';\n replacements.push({\n start: emptySheetData.index,\n end: emptySheetData.index + emptySheetData[0].length,\n data: Buffer.from(`<${prefix}sheetData${emptySheetData.groups?.attrs ?? ''}>`, 'utf8'),\n rows: true,\n suffix: Buffer.from(`</${prefix}sheetData>`, 'utf8'),\n });\n } else {\n const opening = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sheetData\\b[^>]*>/i.exec(text);\n if (!opening || opening.index === undefined) {\n throw new Error('XlsxUpdater: <sheetData> element not found in worksheet XML.');\n }\n const prefix = opening.groups?.prefix ?? '';\n const closeRe = new RegExp(`</${prefix}sheetData\\\\s*>`, 'i');\n const closing = closeRe.exec(text.slice(opening.index + opening[0].length));\n if (!closing || closing.index === undefined) {\n throw new Error('XlsxUpdater: <sheetData> element not closed in worksheet XML.');\n }\n const closingStart = opening.index + opening[0].length + closing.index;\n replacements.push({\n start: opening.index + opening[0].length,\n end: closingStart,\n rows: true,\n });\n }\n\n const dimension = /<(?<prefix>[A-Za-z_][\\w.-]*:)?dimension\\b[^>]*>/i.exec(text);\n if (dimension && dimension.index !== undefined) {\n replacements.push({\n start: dimension.index,\n end: dimension.index + dimension[0].length,\n data: Buffer.from(\n XlsxUpdater._replaceOrAddXmlAttribute(dimension[0], 'ref', dimensionRef),\n ),\n });\n } else {\n const root = /<(?<prefix>[A-Za-z_][\\w.-]*:)?worksheet\\b[^>]*>/i.exec(text);\n if (root && root.index !== undefined) {\n const prefix = root.groups?.prefix ?? '';\n const insertAt = root.index + root[0].length;\n replacements.push({\n start: insertAt,\n end: insertAt,\n data: Buffer.from(`<${prefix}dimension ref=\"${dimensionRef}\"/>`, 'utf8'),\n });\n }\n }\n\n const autoFilter = /<(?<prefix>[A-Za-z_][\\w.-]*:)?autoFilter\\b[^>]*>/i.exec(text);\n if (autoFilter && autoFilter.index !== undefined) {\n replacements.push({\n start: autoFilter.index,\n end: autoFilter.index + autoFilter[0].length,\n data: Buffer.from(\n XlsxUpdater._replaceOrAddXmlAttribute(autoFilter[0], 'ref', dimensionRef),\n 'utf8',\n ),\n });\n }\n\n replacements.sort((a, b) => a.start - b.start || a.end - b.end);\n const fd = fs.openSync(outputPath, 'w');\n let cursor = 0;\n const writeBuffer = (data: Buffer) => {\n fs.writeSync(fd, data);\n };\n const copyRows = () => {\n const rowsFd = fs.openSync(rowsPath, 'r');\n try {\n const chunk = Buffer.alloc(1024 * 1024);\n const length = fs.statSync(rowsPath).size;\n let position = 0;\n while (position < length) {\n const count = fs.readSync(rowsFd, chunk, 0, Math.min(chunk.length, length - position), position);\n if (count <= 0) throw new Error('XlsxUpdater: failed to read staged rows.');\n fs.writeSync(fd, chunk, 0, count);\n position += count;\n }\n } finally {\n fs.closeSync(rowsFd);\n }\n };\n try {\n for (const replacement of replacements) {\n const startByte = Buffer.byteLength(text.slice(0, replacement.start), 'utf8');\n const endByte = Buffer.byteLength(text.slice(0, replacement.end), 'utf8');\n if (startByte < cursor) throw new Error('XlsxUpdater: overlapping worksheet replacements.');\n writeBuffer(source.subarray(cursor, startByte));\n if (replacement.data) writeBuffer(replacement.data);\n if (replacement.rows) copyRows();\n if (replacement.suffix) writeBuffer(replacement.suffix);\n cursor = endByte;\n }\n writeBuffer(source.subarray(cursor));\n } finally {\n fs.closeSync(fd);\n }\n }\n\n // ------------------------------------------------------------------\n // Pivot table integration\n // ------------------------------------------------------------------\n\n private _updatePivotCaches(sheetName: string, dimRef: string, recordCount: number): void {\n for (const cache of this.pivotCacheDefs) {\n const wsRe = /<worksheetSource\\b[^>]*>/;\n const wsMatch = wsRe.exec(cache.xml);\n if (!wsMatch) continue;\n const wsTag = wsMatch[0];\n const sheetAttr = /sheet=\"([^\"]*)\"/.exec(wsTag);\n if (!sheetAttr || sheetAttr[1] !== sheetName) continue;\n\n let xml = cache.xml;\n xml = xml.substring(0, wsMatch.index) +\n wsTag.replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(wsMatch.index + wsTag.length);\n\n const rootRe = /<pivotCacheDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n let rootTag = rootMatch[0];\n if (/recordCount=\"\\d+\"/.test(rootTag)) {\n rootTag = rootTag.replace(/recordCount=\"\\d+\"/, `recordCount=\"${recordCount}\"`);\n } else if (!/\\/>$/.test(rootTag)) {\n rootTag = rootTag.replace(/>$/, ` recordCount=\"${recordCount}\">`);\n }\n xml = xml.substring(0, rootMatch.index) + rootTag + xml.substring(rootMatch.index + rootMatch[0].length);\n }\n\n this.zip.updateFile(cache.path, Buffer.from(xml, 'utf8'));\n }\n }\n\n private _addRefreshOnLoadToPivotTables(): void {\n for (const path of this.pivotTableDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n let xml = entry.getData().toString('utf8');\n\n const rootRe = /<pivotTableDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (!rootMatch || rootMatch[0].includes('refreshOnLoad')) continue;\n\n const newTag = rootMatch[0].replace(/(\\/?>)$/, ' refreshOnLoad=\"1\"$1');\n xml = xml.substring(0, rootMatch.index) + newTag + xml.substring(rootMatch.index + rootMatch[0].length);\n this.zip.updateFile(path, Buffer.from(xml, 'utf8'));\n }\n }\n\n /**\n * Remove the stale calculation chain (xl/calcChain.xml). Excel rebuilds it\n * on open; keeping stale <c> entries for the replaced sheet would force a\n * repair prompt. Removes the part, its Content_Types override and its\n * workbook rels entry (xlspy parity).\n */\n private _removeCalcChain(): void {\n const calcPath = 'xl/calcChain.xml';\n if (!this.zip.getEntry(calcPath) && !this.stagedParts.has(calcPath)) {\n this._ensureCalcPrFullCalc();\n return;\n }\n try {\n this.zip.deleteFile(calcPath);\n } catch {\n // Best-effort; continue with rels/content-type cleanup.\n }\n const stagedCalc = this.stagedParts.get(calcPath);\n if (stagedCalc) {\n this.stagedParts.delete(calcPath);\n try {\n fs.rmSync(stagedCalc, { force: true });\n } catch {\n // Best-effort.\n }\n }\n\n const ctEntry = this.zip.getEntry('[Content_Types].xml');\n if (ctEntry || this.stagedParts.has('[Content_Types].xml')) {\n try {\n let ct = this._entryData('[Content_Types].xml').toString('utf8');\n const before = ct;\n ct = ct.replace(/<Override\\b[^>]*PartName=\"\\/xl\\/calcChain\\.xml\"[^>]*\\/?>/gi, '');\n if (ct !== before) {\n this._writePartText('[Content_Types].xml', ct);\n }\n } catch {\n // Best-effort.\n }\n }\n\n const relsPath = 'xl/_rels/workbook.xml.rels';\n if (this.zip.getEntry(relsPath) || this.stagedParts.has(relsPath)) {\n try {\n const rels = this._entryData(relsPath).toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let m: RegExpExecArray | null;\n let out = '';\n let last = 0;\n let changed = false;\n while ((m = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(m[0]);\n const type = attrs['Type'] ?? attrs['type'] ?? '';\n const target = attrs['Target'] ?? attrs['target'] ?? '';\n const isCalcChain = type.endsWith('/calcChain') &&\n resolveRelTarget(target) === 'xl/calcChain.xml';\n if (isCalcChain) {\n out += rels.substring(last, m.index);\n last = m.index + m[0].length;\n changed = true;\n }\n }\n if (changed) {\n out += rels.substring(last);\n this._writePartText(relsPath, out);\n }\n } catch {\n // Best-effort.\n }\n }\n this._ensureCalcPrFullCalc();\n }\n\n private _writePartText(name: string, text: string): void {\n if (this.stagedParts.has(name)) {\n fs.writeFileSync(this.stagedParts.get(name)!, text, 'utf8');\n } else {\n this.zip.updateFile(name, Buffer.from(text, 'utf8'));\n }\n }\n\n private _ensureCalcPrFullCalc(): void {\n try {\n const wbPath = 'xl/workbook.xml';\n if (!this.zip.getEntry(wbPath) && !this.stagedParts.has(wbPath)) return;\n let xml = this._entryData(wbPath).toString('utf8');\n const calcPrRe = /<(?:[A-Za-z_][\\w.-]*:)?calcPr\\b[^>]*>/i;\n const match = calcPrRe.exec(xml);\n if (match && match.index !== undefined) {\n const newTag = XlsxUpdater._replaceOrAddXmlAttribute(match[0], 'fullCalcOnLoad', '1');\n // The replacement can change the tag length, so consume the\n // *original* tag (`match[0]`), not `newTag`.\n xml = xml.substring(0, match.index) + newTag + xml.substring(match.index + match[0].length);\n } else {\n const insertAt = XlsxUpdater._calcPrInsertPosition(xml);\n if (insertAt < 0) return;\n xml = xml.substring(0, insertAt) + '<calcPr fullCalcOnLoad=\"1\"/>' + xml.substring(insertAt);\n }\n this._writePartText(wbPath, xml);\n } catch {\n // Best-effort.\n }\n }\n\n /**\n * Insertion offset for a missing `<calcPr>`. The element follows\n * sheets/externalReferences/definedNames in the workbook schema, so insert\n * after the last of those that exists instead of right after `<workbook>`.\n */\n private static _calcPrInsertPosition(xml: string): number {\n const prefixed = '(?:[A-Za-z_][\\\\w.-]*:)?';\n const candidates = [\n new RegExp(`</${prefixed}sheets\\\\s*>`, 'i'),\n new RegExp(`<${prefixed}externalReferences\\\\b[^>]*/>`, 'i'),\n new RegExp(`<${prefixed}externalReferences\\\\b[^>]*>[\\\\s\\\\S]*?</${prefixed}externalReferences\\\\s*>`, 'i'),\n new RegExp(`<${prefixed}definedNames\\\\b[^>]*/>`, 'i'),\n new RegExp(`<${prefixed}definedNames\\\\b[^>]*>[\\\\s\\\\S]*?</${prefixed}definedNames\\\\s*>`, 'i'),\n ];\n let insertAt = -1;\n for (const re of candidates) {\n const m = re.exec(xml);\n if (m && m.index !== undefined) {\n insertAt = Math.max(insertAt, m.index + m[0].length);\n }\n }\n if (insertAt >= 0) return insertAt;\n // Fallbacks for unusual workbooks: before the close tag, else after the root.\n const close = new RegExp(`</${prefixed}workbook\\\\s*>`, 'i').exec(xml);\n if (close && close.index !== undefined) return close.index;\n const root = new RegExp(`<${prefixed}workbook\\\\b[^>]*>`, 'i').exec(xml);\n if (!root || root.index === undefined) return -1;\n return root.index + root[0].length;\n }\n\n /**\n * Update ListObject table ranges (xl/tables/*.xml) for the replaced sheet.\n * Only tables anchored at A1 are updated to the new dimension; tables\n * elsewhere are left untouched (moving them would corrupt the sheet).\n * Empty replacements (dimRef \"A1\") do not shrink multi-column tables.\n */\n private _updateTableRefs(sheetName: string, dimRef: string): void {\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) return;\n const slash = sheetPath.lastIndexOf('/');\n const dir = slash >= 0 ? sheetPath.substring(0, slash + 1) : '';\n const base = slash >= 0 ? sheetPath.substring(slash + 1) : sheetPath;\n const sheetRelsPath = `${dir}_rels/${base}.rels`;\n const sheetRelsEntry = this.zip.getEntry(sheetRelsPath);\n const hasStagedRels = this.stagedParts.has(sheetRelsPath);\n if (!sheetRelsEntry && !hasStagedRels) return;\n\n const tableTargets: string[] = [];\n try {\n const relsXml = this._entryData(sheetRelsPath).toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let m: RegExpExecArray | null;\n while ((m = relTagRe.exec(relsXml)) !== null) {\n const attrs = parseTagAttributes(m[0]);\n const type = attrs['Type'] ?? attrs['type'] ?? '';\n const target = attrs['Target'] ?? attrs['target'] ?? '';\n if (!type.includes('/table') || !target) continue;\n let tablePath: string;\n if (target.startsWith('/')) {\n tablePath = resolveRelTarget(target);\n } else {\n // Resolve relative to the worksheet directory (e.g. ../tables/table1.xml).\n const combined = dir + target;\n const parts: string[] = [];\n for (const seg of combined.split('/')) {\n if (seg === '..') parts.pop();\n else if (seg !== '.' && seg !== '') parts.push(seg);\n }\n tablePath = parts.join('/');\n }\n tableTargets.push(tablePath);\n }\n } catch {\n return;\n }\n if (tableTargets.length === 0) return;\n\n // Read every table first: expanding an A1 table must not overlap a table\n // that sits below it in the same columns.\n const tables: Array<{\n path: string;\n xml: string;\n tag: string;\n tagIndex: number;\n ref: string;\n range: CellRange | null;\n staged: boolean;\n }> = [];\n for (const tablePath of tableTargets) {\n try {\n const hasEntry = !!this.zip.getEntry(tablePath);\n const hasStaged = this.stagedParts.has(tablePath);\n if (!hasEntry && !hasStaged) continue;\n const xml = this._entryData(tablePath).toString('utf8');\n const tableTagRe = /<(?:[A-Za-z_][\\w.-]*:)?table\\b[^>]*>/i;\n const tableMatch = tableTagRe.exec(xml);\n if (!tableMatch || tableMatch.index === undefined) continue;\n const refMatch = /\\bref\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i.exec(tableMatch[0]);\n const ref = refMatch ? (refMatch[2] ?? refMatch[3] ?? '') : '';\n tables.push({\n path: tablePath,\n xml,\n tag: tableMatch[0],\n tagIndex: tableMatch.index,\n ref,\n range: parseCellRange(ref),\n staged: hasStaged,\n });\n } catch {\n // Best-effort per table.\n }\n }\n if (tables.length === 0) return;\n\n const dimRange = parseCellRange(dimRef);\n if (!dimRange) return;\n\n for (const table of tables) {\n try {\n const origRange = table.range;\n if (!origRange) continue;\n // Only A1-anchored tables track the sheet data range.\n if (origRange.r1 !== 1 || origRange.c1 !== 0) continue;\n // Don't collapse a multi-column table to a single cell.\n if (dimRef === 'A1' && !/^A1$/i.test(table.ref)) continue;\n const origCols = origRange.c2 - origRange.c1 + 1;\n const newCols = dimRange.c2 - dimRange.c1 + 1;\n // Changing the width would also require rebuilding <tableColumns>.\n if (newCols !== origCols) continue;\n\n // Cap at the first other table below this one so tables never overlap.\n let lastRow = dimRange.r2;\n for (const other of tables) {\n if (other === table || !other.range) continue;\n if (other.range.r1 <= 1) continue;\n if (other.range.c1 > origRange.c2 || other.range.c2 < origRange.c1) continue;\n lastRow = Math.min(lastRow, other.range.r1 - 1);\n }\n if (lastRow < 1) continue;\n\n const newRef = origRange.c2 === 0 && lastRow === 1\n ? 'A1'\n : `A1:${columnIndexToLetter(origRange.c2)}${lastRow}`;\n let xml = table.xml;\n const newTag = XlsxUpdater._replaceOrAddXmlAttribute(table.tag, 'ref', newRef);\n xml = xml.substring(0, table.tagIndex) + newTag +\n xml.substring(table.tagIndex + table.tag.length);\n const afRe = /<(?:[A-Za-z_][\\w.-]*:)?autoFilter\\b[^>]*>/i;\n const afMatch = afRe.exec(xml);\n if (afMatch && afMatch.index !== undefined) {\n const newAf = XlsxUpdater._replaceOrAddXmlAttribute(afMatch[0], 'ref', newRef);\n xml = xml.substring(0, afMatch.index) + newAf +\n xml.substring(afMatch.index + afMatch[0].length);\n }\n if (table.staged) {\n fs.writeFileSync(this.stagedParts.get(table.path)!, xml, 'utf8');\n } else {\n this.zip.updateFile(table.path, Buffer.from(xml, 'utf8'));\n }\n } catch {\n // Best-effort per table.\n }\n }\n }\n}\n\nexport default XlsxUpdater;\n\n/** Explicit name for updating macro-enabled XLSM packages. */\nexport { XlsxUpdater as XlsmUpdater };\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\n\n/** Internal file operations seam used to test replacement races without Excel. */\nexport interface AtomicFileOperations {\n exists(filePath: string): boolean;\n rename(sourcePath: string, destinationPath: string): void;\n remove(filePath: string): void;\n}\nconst realFileOperations: AtomicFileOperations = {\n exists: (filePath) => fs.existsSync(filePath),\n rename: (sourcePath, destinationPath) => fs.renameSync(sourcePath, destinationPath),\n remove: (filePath) => fs.rmSync(filePath),\n};\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction destinationExistsError(destinationPath: string): Error {\n return new Error(\n `Excel conversion: destination already exists (pass { overwrite: true } to replace it): ${destinationPath}`\n );\n}\n\nfunction readDestinationMode(target: string): number | undefined {\n try {\n if (!fs.existsSync(target)) return undefined;\n return fs.statSync(target).mode & 0o777;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Installs a temporary conversion result without deleting an unapproved or\n * concurrently-created destination. Existing destinations are moved aside\n * before replacement so a failed final rename can be rolled back safely.\n */\nexport function installTemporaryOutput(\n temporaryPath: string,\n destinationPath: string,\n overwrite: boolean,\n operations: AtomicFileOperations = realFileOperations\n): void {\n const backupPath = `${destinationPath}.${randomUUID()}.replacement-backup`;\n let backupCreated = false;\n let installed = false;\n\n if (operations.exists(destinationPath)) {\n if (!overwrite) {\n throw destinationExistsError(destinationPath);\n }\n\n // A rename preserves the old destination if anything fails later.\n operations.rename(destinationPath, backupPath);\n backupCreated = true;\n }\n\n try {\n try {\n operations.rename(temporaryPath, destinationPath);\n installed = true;\n } catch (error) {\n // If overwrite was allowed and a destination appeared after the\n // check above, preserve it as well and retry once.\n if (overwrite && !backupCreated && operations.exists(destinationPath)) {\n operations.rename(destinationPath, backupPath);\n backupCreated = true;\n operations.rename(temporaryPath, destinationPath);\n installed = true;\n } else {\n throw error;\n }\n }\n\n if (backupCreated) {\n operations.remove(backupPath);\n }\n } catch (error) {\n if (backupCreated && !installed) {\n if (!operations.exists(destinationPath)) {\n try {\n operations.rename(backupPath, destinationPath);\n backupCreated = false;\n } catch (rollbackError) {\n throw new Error(\n `Excel conversion: final destination install failed (${errorMessage(error)}), ` +\n `and restoring the original destination also failed (${errorMessage(rollbackError)}). ` +\n `Original file remains at ${backupPath}.`\n );\n }\n } else {\n throw new Error(\n `Excel conversion: final destination install failed (${errorMessage(error)}). ` +\n `A concurrent destination was preserved; the original file remains at ${backupPath}.`\n );\n }\n }\n\n throw error;\n }\n}\n\n/**\n * Write a complete buffer through a same-directory temporary file and replace\n * the destination only after the write has completed successfully.\n */\nexport function writeBufferAtomically(buffer: Buffer, destinationPath: string): void {\n const target = path.resolve(destinationPath);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporaryPath = path.join(\n path.dirname(target),\n `.${path.basename(target)}.${randomUUID()}.tmp`\n );\n const destinationMode = readDestinationMode(target);\n\n try {\n const fd = fs.openSync(temporaryPath, 'w', destinationMode ?? 0o666);\n try {\n if (destinationMode !== undefined) {\n try {\n fs.fchmodSync(fd, destinationMode);\n } catch {\n // Preserve the original write error; mode is best-effort.\n }\n }\n fs.writeFileSync(fd, buffer);\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n if (destinationMode !== undefined) {\n try {\n fs.chmodSync(temporaryPath, destinationMode);\n } catch {\n // Preserve the original write/rename error.\n }\n }\n fs.renameSync(temporaryPath, target);\n } finally {\n if (fs.existsSync(temporaryPath)) {\n try {\n fs.rmSync(temporaryPath);\n } catch {\n // Preserve the original write/rename error.\n }\n }\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport { finished } from 'stream/promises';\nimport { Readable } from 'stream';\nimport AdmZip from 'adm-zip';\nimport archiver from 'archiver';\nimport { DEFAULT_COMPRESSION_LEVEL } from './writerHelpers';\n\n/** A file-backed replacement for one ZIP member. */\nexport type StagedZipPart = Map<string, string>;\n\nfunction readDestinationMode(target: string): number | undefined {\n try {\n if (!fs.existsSync(target)) return undefined;\n return fs.statSync(target).mode & 0o777;\n } catch {\n return undefined;\n }\n}\n\nfunction appendAndWait(\n archive: archiver.Archiver,\n source: NodeJS.ReadableStream,\n name: string,\n output?: fs.WriteStream,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const cleanup = (): void => {\n archive.off('entry', onEntry);\n archive.off('error', onError);\n const maybeEmitter = source as NodeJS.EventEmitter;\n if (typeof maybeEmitter.off === 'function') {\n maybeEmitter.off('error', onError);\n }\n if (output) {\n output.off('error', onError);\n }\n };\n const onEntry = (): void => {\n cleanup();\n resolve();\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n archive.once('entry', onEntry);\n archive.once('error', onError);\n if (output) {\n output.once('error', onError);\n }\n const maybeEmitter = source as NodeJS.EventEmitter;\n if (typeof maybeEmitter.once === 'function') {\n maybeEmitter.once('error', onError);\n }\n try {\n archive.append(source as never, { name });\n } catch (error) {\n cleanup();\n reject(error as Error);\n }\n });\n}\n\n/**\n * Rebuild an existing ZIP package without creating a complete output Buffer.\n * Unchanged members are copied one at a time; staged members are read from\n * temporary files.\n */\nexport async function writeAdmZipStreaming(\n zip: AdmZip,\n stagedParts: StagedZipPart,\n destinationPath: string,\n): Promise<void> {\n const target = path.resolve(destinationPath);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporaryPath = path.join(\n path.dirname(target),\n `.${path.basename(target)}.${randomUUID()}.tmp`\n );\n const destinationMode = readDestinationMode(target);\n\n let output: fs.WriteStream | null = null;\n let archive: archiver.Archiver | null = null;\n try {\n output = fs.createWriteStream(\n temporaryPath,\n destinationMode !== undefined ? { mode: destinationMode } : {},\n );\n // Capture output errors before the append loop (A.3): a failing\n // destination must reject, abort the archive and remove the temp file.\n let outputError: Error | null = null;\n output.on('error', (err: Error) => {\n outputError = err;\n try { archive?.abort(); } catch { /* preserve */ }\n });\n archive = archiver('zip', { zlib: { level: DEFAULT_COMPRESSION_LEVEL } });\n archive.on('error', (err: Error) => {\n outputError = err;\n });\n archive.pipe(output);\n\n for (const entry of zip.getEntries()) {\n if (outputError) throw outputError;\n const stagedPath = stagedParts.get(entry.entryName);\n if (stagedPath) {\n await appendAndWait(archive, fs.createReadStream(stagedPath), entry.entryName, output);\n } else {\n // Decompress each member only after the previous one has been\n // consumed so a single buffer is retained at a time.\n await appendAndWait(archive, Readable.from([entry.getData()]), entry.entryName, output);\n }\n }\n if (outputError) throw outputError;\n\n await archive.finalize();\n await finished(output);\n if (outputError) throw outputError;\n\n if (destinationMode !== undefined) {\n try {\n fs.chmodSync(temporaryPath, destinationMode);\n } catch {\n // Preserve the original archive or rename error.\n }\n }\n const fd = fs.openSync(temporaryPath, 'r+');\n try {\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n fs.renameSync(temporaryPath, target);\n } catch (error) {\n try {\n archive?.abort();\n } catch {\n // Preserve the original archive error.\n }\n throw error;\n } finally {\n if (output && !output.closed) {\n output.destroy();\n }\n if (fs.existsSync(temporaryPath)) {\n try {\n fs.rmSync(temporaryPath);\n } catch {\n // Preserve the original archive or rename error.\n }\n }\n }\n}\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport { writeBufferAtomically } from './atomicFile';\nimport { writeAdmZipStreaming, StagedZipPart } from './streamingZip';\nimport {\n readRecord,\n buildRecord,\n readUtf16,\n parseSharedStringsBin,\n Biff12Record,\n} from './biff12Utils';\nimport { BiffReaderWriter } from './BiffReaderWriter';\nimport { trimTrailingEmptyRows, parseTagAttributes, resolveRelTarget } from './xmlUtils';\nimport { timeToOaDate } from './writerHelpers';\n\n/**\n * Options for {@link XlsbUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style (xf) of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use xf 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\n/** A one-pass synchronous or asynchronous source of worksheet rows. */\nexport type RowSource =\n | Iterable<ReadonlyArray<CellValue>>\n | AsyncIterable<ReadonlyArray<CellValue>>;\n\n/** Worksheet cell records (BrtCellBlank … BrtFmlaError). */\nconst CELL_RECORDS = new Set<number>([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b]);\n\nconst RK_INT_LOWER = -1 << 29;\nconst RK_INT_UPPER = (1 << 29) - 1;\n\n/**\n * Update the data of a worksheet inside an existing XLSB file without rebuilding\n * the workbook. Everything outside the target sheet's rows — pivot tables and\n * their caches, other sheets, styles, column widths, views — is preserved.\n * This makes it possible to refresh a data sheet that pivot tables are wired to.\n *\n * ```ts\n * const updater = new XlsbUpdater('report.xlsb');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsb'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsbUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n private temporaryDirectory: string | null = null;\n private readonly stagedParts: StagedZipPart = new Map();\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefPaths: string[] = [];\n\n private sharedStringsBuf: Buffer | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsTotal: number = 0;\n private sharedStringsUnique: number = 0;\n private sharedStringsEndSst: number = 0;\n private stringIndexMap: Map<string, number> = new Map();\n private sharedStringsDirty: boolean = false;\n\n private _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsb` file.\n */\n constructor(filePath: string) {\n this.sourcePath = filePath;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`XlsbUpdater: file not found: ${filePath}`);\n }\n\n this.zip = new AdmZip(filePath);\n\n if (!this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsbUpdater: not an XLSB workbook (xl/workbook.bin missing). Convert the file to XLSB first.'\n );\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsbUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsbUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetBuf = this._entryData(sheetPath);\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsBuf !== null) {\n this.sharedStringsTotal = Math.max(\n 0,\n this.sharedStringsTotal - this._sharedStringRefCount(sheetBuf),\n );\n this.sharedStringsDirty = true;\n }\n\n let dataStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateXf: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectStyles(sheetBuf);\n dataStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateXf = this._findDateXf();\n }\n\n const lastCol = Math.max(0, Math.max(\n rows.reduce((m, r) => Math.max(m, r.length), 0),\n headers?.length ?? 0\n ) - 1);\n\n const newRows = this._buildRows(rows, headers, dataStyles, headerStyles, dateXf);\n const { rowsStart, rowsEnd, autoFilterRanges } = this._findRowsRegion(sheetBuf);\n\n const newSheet = Buffer.alloc(sheetBuf.length - (rowsEnd - rowsStart) + newRows.length);\n sheetBuf.copy(newSheet, 0, 0, rowsStart);\n newRows.copy(newSheet, rowsStart);\n sheetBuf.copy(newSheet, rowsStart + newRows.length, rowsEnd);\n\n const lastRowIdx = rows.length + (headers ? 1 : 0) - 1;\n const delta = newRows.length - (rowsEnd - rowsStart);\n for (const af of autoFilterRanges) {\n const newAf = af + delta;\n newSheet.writeInt32LE(lastCol, newAf + 12);\n newSheet.writeInt32LE(lastRowIdx, newAf + 4);\n }\n\n // Keep the sheet dimension record (0x94) in sync with the new data. Excel uses\n // its rwLast/colLast fields to read the full row range; stale values make the\n // last written row invisible (and drop it from pivot refreshes).\n this._patchDimension(newSheet, lastRowIdx, lastCol);\n\n this.zip.updateFile(sheetPath, newSheet);\n this._discardStagedPart(sheetPath);\n\n if (this.sharedStringsBuf !== null) {\n this._commitSharedStrings();\n }\n\n const rwLast = Math.max(0, rows.length + (headers ? 1 : 0) - 1);\n const colLast = lastCol;\n this._patchPivotCaches(sheetName, rwLast, colLast);\n this._removeCalcChain();\n }\n\n /** Replace worksheet rows from a one-pass source. */\n async replaceSheetDataStream(\n sheetName: string,\n rows: RowSource,\n options: ReplaceSheetDataOptions = {},\n ): Promise<void> {\n const { headers, styleFallback = 'inherit' } = options;\n if (styleFallback !== 'inherit' && styleFallback !== 'general') {\n throw new Error(\"XlsbUpdater: styleFallback must be 'inherit' or 'general'.\");\n }\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsbUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsbUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const oldStage = this.stagedParts.get(sheetPath);\n const beforeValuesLength = this.sharedStringsValues.length;\n const beforeAppendCount = this._appendCount;\n const beforeSharedStringsTotal = this.sharedStringsTotal;\n const beforeSharedStringsUnique = this.sharedStringsUnique;\n const beforeSharedStringsEndSst = this.sharedStringsEndSst;\n const beforeSharedStringsDirty = this.sharedStringsDirty;\n const beforeStringIndexMap = new Map(this.stringIndexMap);\n const sharedStringsEntry = this.zip.getEntry('xl/sharedStrings.bin');\n const beforeSharedStringsBytes = sharedStringsEntry || this.stagedParts.has('xl/sharedStrings.bin')\n ? Buffer.from(this._entryData('xl/sharedStrings.bin'))\n : null;\n const beforeSharedStringsBuf = this.sharedStringsBuf ? Buffer.from(this.sharedStringsBuf) : null;\n const oldSheet = this._entryData(sheetPath);\n const rowsPath = this._temporaryPath('.rows');\n const outputPath = this._temporaryPath('.bin');\n const createdParts = [rowsPath, outputPath];\n let output: fs.WriteStream | null = null;\n\n try {\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsBuf !== null) {\n this.sharedStringsTotal = Math.max(\n 0,\n this.sharedStringsTotal - this._sharedStringRefCount(oldSheet),\n );\n this.sharedStringsDirty = true;\n }\n\n let dataStyles = new Map<number, number>();\n let headerStyles = new Map<number, number>();\n let dateXf: number | null = null;\n if (styleFallback !== 'general') {\n const collected = this._collectStyles(oldSheet);\n dataStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateXf = this._findDateXf();\n }\n\n const rowOutput = fs.createWriteStream(rowsPath);\n output = rowOutput;\n let outputError: Error | null = null;\n rowOutput.on('error', error => { outputError = error; });\n let writtenBytes = 0;\n let lastKeptEnd = 0;\n let width = headers?.length ?? 0;\n let dataRowsSeen = 0;\n let keptDataRows = 0;\n let pendingEmptyWidth = 0;\n let nextRow = 0;\n const rowHeaderOffsets: number[] = [];\n\n const write = async (data: Buffer): Promise<void> => {\n if (outputError) throw outputError;\n writtenBytes += data.length;\n if (rowOutput.write(data)) return;\n await new Promise<void>((resolve, reject) => {\n const onDrain = () => { cleanup(); resolve(); };\n const onError = (error: Error) => { cleanup(); reject(error); };\n const cleanup = () => {\n rowOutput.off('drain', onDrain);\n rowOutput.off('error', onError);\n };\n rowOutput.once('drain', onDrain);\n rowOutput.once('error', onError);\n });\n };\n\n const writeRow = async (rowNumber: number, cells: Buffer[]): Promise<void> => {\n rowHeaderOffsets.push(writtenBytes);\n const header = Buffer.alloc(27);\n header[0] = 0x00;\n header[1] = 25;\n header.writeInt32LE(rowNumber, 2);\n header[10] = 0x2c;\n header[11] = 0x01;\n header[15] = 0x01;\n header.writeInt32LE(0, 19);\n header.writeInt32LE(0, 23);\n await write(header);\n for (const cell of cells) await write(cell);\n };\n\n if (headers !== undefined) {\n await writeRow(0, headers.map((value, column) =>\n this._stringCellBytes(column, styleFallback === 'general' ? 0 : (headerStyles.get(column) ?? 0), value)));\n lastKeptEnd = writtenBytes;\n nextRow = 1;\n }\n\n for await (const sourceRow of rows) {\n if (typeof sourceRow === 'string' || sourceRow instanceof Uint8Array) {\n throw new TypeError('Each row must be an iterable of cells, not text');\n }\n const row = Array.from(sourceRow) as CellValue[];\n const cells = row\n .map((value, column) => value === null || value === undefined\n ? null\n : this._valueCellBytes(value, column, dataStyles, dateXf))\n .filter((cell): cell is Buffer => cell !== null);\n await writeRow(nextRow, cells);\n dataRowsSeen++;\n nextRow++;\n\n if (row.every(value => value === null || value === undefined)) {\n pendingEmptyWidth = Math.max(pendingEmptyWidth, row.length);\n } else {\n width = Math.max(width, pendingEmptyWidth, row.length);\n pendingEmptyWidth = 0;\n keptDataRows = dataRowsSeen;\n lastKeptEnd = writtenBytes;\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n rowOutput.once('close', resolve);\n rowOutput.once('error', reject);\n rowOutput.end();\n });\n if (outputError) throw outputError;\n\n const rowsFd = fs.openSync(rowsPath, 'r+');\n try {\n fs.ftruncateSync(rowsFd, lastKeptEnd);\n } finally {\n fs.closeSync(rowsFd);\n }\n const lastCol = Math.max(0, width - 1);\n const rowPatchFd = fs.openSync(rowsPath, 'r+');\n try {\n const lastColBuffer = Buffer.alloc(4);\n lastColBuffer.writeInt32LE(lastCol, 0);\n for (const offset of rowHeaderOffsets) {\n if (offset >= lastKeptEnd) continue;\n fs.writeSync(rowPatchFd, lastColBuffer, 0, lastColBuffer.length, offset + 23);\n }\n } finally {\n fs.closeSync(rowPatchFd);\n }\n\n const { rowsStart, rowsEnd, autoFilterRanges } = this._findRowsRegion(oldSheet);\n const oldLength = oldSheet.length;\n const newRowsLength = fs.statSync(rowsPath).size;\n const delta = newRowsLength - (rowsEnd - rowsStart);\n const outputFd = fs.openSync(outputPath, 'w');\n try {\n fs.writeSync(outputFd, oldSheet, 0, rowsStart, null);\n const rowsFdRead = fs.openSync(rowsPath, 'r');\n try {\n const chunk = Buffer.alloc(1024 * 1024);\n let position = 0;\n while (position < newRowsLength) {\n const count = fs.readSync(rowsFdRead, chunk, 0, Math.min(chunk.length, newRowsLength - position), position);\n if (count <= 0) throw new Error('XlsbUpdater: failed to read staged rows.');\n fs.writeSync(outputFd, chunk, 0, count);\n position += count;\n }\n } finally {\n fs.closeSync(rowsFdRead);\n }\n fs.writeSync(outputFd, oldSheet, rowsEnd, oldLength - rowsEnd, rowsStart + newRowsLength);\n } finally {\n fs.closeSync(outputFd);\n }\n\n this._patchSheetMetadataFile(\n outputPath,\n oldSheet,\n rowsEnd,\n delta,\n autoFilterRanges,\n Math.max(0, keptDataRows + (headers !== undefined ? 1 : 0) - 1),\n lastCol,\n );\n this._stagePart(sheetPath, outputPath);\n this._commitSharedStrings();\n this._patchPivotCaches(\n sheetName,\n Math.max(0, keptDataRows + (headers !== undefined ? 1 : 0) - 1),\n lastCol,\n );\n this._removeCalcChain();\n\n if (oldStage && oldStage !== outputPath) this._removeTemporaryFile(oldStage);\n createdParts.splice(createdParts.indexOf(outputPath), 1);\n } catch (error) {\n this.sharedStringsValues.length = beforeValuesLength;\n this._appendCount = beforeAppendCount;\n this.sharedStringsTotal = beforeSharedStringsTotal;\n this.sharedStringsUnique = beforeSharedStringsUnique;\n this.sharedStringsEndSst = beforeSharedStringsEndSst;\n this.sharedStringsDirty = beforeSharedStringsDirty;\n this.sharedStringsBuf = beforeSharedStringsBuf;\n this.stringIndexMap.clear();\n for (const [value, index] of beforeStringIndexMap) this.stringIndexMap.set(value, index);\n if (beforeSharedStringsBytes) {\n this.zip.updateFile('xl/sharedStrings.bin', beforeSharedStringsBytes);\n }\n if (oldStage) this.stagedParts.set(sheetPath, oldStage);\n else this.stagedParts.delete(sheetPath);\n throw error;\n } finally {\n if (output && !output.closed) output.destroy();\n for (const temporaryPath of createdParts) this._removeTemporaryFile(temporaryPath);\n }\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n this._materializeStagedParts();\n writeBufferAtomically(this.zip.toBuffer(), target);\n }\n\n /** Save staged streaming replacements without materialising the ZIP. */\n async saveStreaming(outputPath?: string): Promise<void> {\n const target = outputPath ?? this.sourcePath;\n await writeAdmZipStreaming(this.zip, this.stagedParts, target);\n this._materializeStagedParts();\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n this._materializeStagedParts();\n return this.zip.toBuffer();\n }\n\n /**\n * Release the staging directory and any unsaved staged parts.\n * The updater remains usable; a new staging directory is created lazily\n * on the next streaming replacement.\n */\n dispose(): void {\n for (const stagedPath of this.stagedParts.values()) {\n try {\n fs.rmSync(stagedPath, { force: true });\n } catch {\n // Best-effort cleanup.\n }\n }\n this.stagedParts.clear();\n if (this.temporaryDirectory !== null) {\n try {\n fs.rmSync(this.temporaryDirectory, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup.\n }\n this.temporaryDirectory = null;\n }\n }\n\n /** Support `using` declarations for automatic staging cleanup. */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n private _ensureTemporaryDirectory(): string {\n if (this.temporaryDirectory === null) {\n this.temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'spreadsheet-updater-'));\n } else {\n try {\n fs.mkdirSync(this.temporaryDirectory, { recursive: true });\n } catch {\n // Best-effort; file creation will surface persistent failures.\n }\n }\n return this.temporaryDirectory;\n }\n\n private _temporaryPath(suffix: string): string {\n return path.join(this._ensureTemporaryDirectory(), `part-${Date.now()}-${Math.random().toString(16).slice(2)}${suffix}`);\n }\n\n private _removeTemporaryFile(filePath: string): void {\n try {\n fs.rmSync(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n\n private _entryData(name: string): Buffer {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) return fs.readFileSync(stagedPath);\n const entry = this.zip.getEntry(name);\n if (!entry) throw new Error(`XlsbUpdater: ZIP member missing: ${name}`);\n return entry.getData();\n }\n\n private _stagePart(name: string, filePath: string): void {\n this.stagedParts.set(name, filePath);\n }\n\n private _discardStagedPart(name: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (!stagedPath) return;\n this._removeTemporaryFile(stagedPath);\n this.stagedParts.delete(name);\n }\n\n private _materializeStagedParts(): void {\n for (const [name, stagedPath] of this.stagedParts) {\n this.zip.updateFile(name, fs.readFileSync(stagedPath));\n this._removeTemporaryFile(stagedPath);\n }\n this.stagedParts.clear();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.bin.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) {\n rIdToTarget[id] = target;\n }\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.bin');\n if (wbEntry) {\n const wbBuf = wbEntry.getData();\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(wbBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id !== 0x009c || rec.len < 8) continue;\n\n // BrtBundleSh: hidden(4) + sheetId(4) + rId(string) + name(string)\n let o = rec.dataStart + 8;\n const rIdLen = wbBuf.readUInt32LE(o);\n o += 4;\n const rId = readUtf16(wbBuf, o, rIdLen);\n o += rIdLen * 2;\n const nameLen = wbBuf.readUInt32LE(o);\n o += 4;\n const name = readUtf16(wbBuf, o, nameLen);\n\n let target = rIdToTarget[rId] ?? '';\n target = resolveRelTarget(target);\n if (target) {\n this.sheetNameToPath.set(name, target);\n }\n }\n // 1904 date system: BrtWbProp (0x99) bit0 f1904.\n try {\n const rec1904: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let p1904 = 0;\n while (readRecord(wbBuf, p1904, rec1904)) {\n if (rec1904.id === 0x99 && rec1904.len >= 4) {\n const is1904 = (wbBuf[rec1904.dataStart] & 0x01) !== 0;\n this._oaEpoch =\n is1904 ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n break;\n }\n p1904 = rec1904.dataEnd;\n }\n } catch {\n // Keep default epoch.\n }\n }\n\n for (const e of this.zip.getEntries()) {\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.bin$/.test(e.entryName)) {\n this.pivotCacheDefPaths.push(e.entryName);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _appendCount: number = 0;\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsBuf !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.bin');\n if (!entry && !this.stagedParts.has('xl/sharedStrings.bin')) {\n this.sharedStringsBuf = null;\n return;\n }\n this.sharedStringsBuf = this._entryData('xl/sharedStrings.bin');\n const parsed = parseSharedStringsBin(this.sharedStringsBuf);\n this.sharedStringsValues = parsed.values;\n this.sharedStringsTotal = parsed.total;\n this.sharedStringsUnique = parsed.unique;\n this.sharedStringsEndSst = parsed.endSstOffset;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this._appendCount = 0;\n this.sharedStringsDirty = false;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsBuf === null || !this.sharedStringsDirty) return;\n\n const originalValuesLength = this.sharedStringsValues.length - this._appendCount;\n\n let newItems = Buffer.alloc(0);\n for (let i = originalValuesLength; i < this.sharedStringsValues.length; i++) {\n const text = this.sharedStringsValues[i];\n const payload = Buffer.alloc(1 + 4 + text.length * 2);\n payload[0] = 0x00;\n payload.writeUInt32LE(text.length, 1);\n payload.write(text, 5, text.length * 2, 'utf16le');\n newItems = Buffer.concat([newItems, buildRecord(0x0013, payload)]);\n }\n\n const out = Buffer.alloc(this.sharedStringsBuf.length + newItems.length);\n this.sharedStringsBuf.copy(out, 0, 0, this.sharedStringsEndSst);\n newItems.copy(out, this.sharedStringsEndSst);\n this.sharedStringsBuf.copy(out, this.sharedStringsEndSst + newItems.length, this.sharedStringsEndSst);\n\n // Patch cstTotal / cstUnique inside BrtBeginSst.\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(out, pos, rec)) {\n if (rec.id === 0x009f) {\n out.writeUInt32LE(this.sharedStringsTotal, rec.dataStart);\n out.writeUInt32LE(this.sharedStringsUnique, rec.dataStart + 4);\n break;\n }\n pos = rec.dataEnd;\n }\n\n this.zip.updateFile('xl/sharedStrings.bin', out);\n this.sharedStringsBuf = out;\n this._appendCount = 0;\n this.sharedStringsDirty = false;\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectStyles(sheetBuf: Buffer): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let row = -1;\n while (readRecord(sheetBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x00) {\n row = sheetBuf.readInt32LE(rec.dataStart);\n continue;\n }\n if (!CELL_RECORDS.has(rec.id) || rec.len < 8) continue;\n const col = sheetBuf.readUInt32LE(rec.dataStart);\n const xf = sheetBuf.readUInt32LE(rec.dataStart + 4) & 0xffffff;\n if (xf <= 0) continue;\n\n if (row === 0) {\n if (!headerStyles.has(col)) headerStyles.set(col, xf);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(xf, (colCounts.get(xf) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [xf, count] of colCounts) {\n if (count > bestCount) {\n best = xf;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateXf(): number | null {\n const entry = this.zip.getEntry('xl/styles.bin');\n if (!entry) return null;\n // Reuse the styles parser (handles custom BrtFmt date formats, e.g.\n // xlspy's yyyy-mm-dd), instead of only built-in numFmt ranges.\n const reader = new BiffReaderWriter(entry.getData());\n while (reader.readStyles()) {\n // Consume; results accumulate on the reader.\n }\n const numFmtIds = reader._xfIndexToNumFmtId;\n const customDates = reader._customNumFmts;\n for (let i = 0; i < numFmtIds.length; i++) {\n const numFmtId = numFmtIds[i];\n if (\n (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n customDates.has(numFmtId)\n ) {\n return i;\n }\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Row / cell serialization\n // ------------------------------------------------------------------\n\n private _buildRows(\n rows: CellValue[][],\n headers: string[] | undefined,\n dataStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const chunks: Buffer[] = [];\n const maxCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0, 0);\n const colLast = Math.max(0, maxCol - 1);\n\n const pushRow = (rowNum: number, cellBytes: Buffer[]): void => {\n // BrtRowHeader (0x00, len 25): rw(4) + zero(4) + flags(9) + colFirst(4) + colLast(4)\n const header = Buffer.alloc(27);\n header[0] = 0x00;\n header[1] = 25;\n header.writeInt32LE(rowNum, 2);\n header[10] = 0x2c;\n header[11] = 0x01;\n header[15] = 0x01;\n header.writeInt32LE(0, 19);\n header.writeInt32LE(colLast, 23);\n chunks.push(header);\n\n for (const cell of cellBytes) {\n chunks.push(cell);\n }\n };\n\n if (headers) {\n const cells: Buffer[] = [];\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n cells.push(this._stringCellBytes(c, style, headers[c]));\n }\n pushRow(0, cells);\n }\n\n let rowNum = headers ? 1 : 0;\n for (const row of rows) {\n const cells: Buffer[] = [];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n cells.push(this._valueCellBytes(raw, c, dataStyles, dateXf));\n }\n pushRow(rowNum, cells);\n rowNum++;\n }\n\n return Buffer.concat(chunks);\n }\n\n private _valueCellBytes(\n raw: CellValue,\n col: number,\n dataStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = dataStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val) && Number.isInteger(val) && val >= RK_INT_LOWER && val <= RK_INT_UPPER) {\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeInt32LE((val << 2) | 2, 8);\n return buildRecord(0x0002, payload);\n }\n if (Number.isFinite(val)) {\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeDoubleLE(val, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'bigint') {\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'boolean') {\n const payload = Buffer.alloc(9);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload[8] = val ? 1 : 0;\n return buildRecord(0x0004, payload);\n }\n if (val instanceof Date) {\n const oaDate = timeToOaDate(val.getTime(), this._oaEpoch);\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateXf !== null ? dateXf : 0);\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeDoubleLE(oaDate, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (val !== null && val !== undefined) {\n return this._stringCellBytes(col, colStyle, String(val));\n }\n return this._stringCellBytes(col, colStyle, '');\n }\n\n private _stringCellBytes(col: number, style: number, text: string): Buffer {\n if (this.sharedStringsBuf === null) {\n // Inline string (BrtCellSt): col(4) + xf(4) + cch(4) + utf16.\n const payload = Buffer.alloc(12 + text.length * 2);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(text.length, 8);\n payload.write(text, 12, text.length * 2, 'utf16le');\n return buildRecord(0x0006, payload);\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n this.sharedStringsUnique++;\n this._appendCount++;\n }\n this.sharedStringsTotal++;\n this.sharedStringsDirty = true;\n\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(index, 8);\n return buildRecord(0x0007, payload);\n }\n\n private _sharedStringRefCount(sheetBuf: Buffer): number {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let count = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x0007) count++;\n pos = rec.dataEnd;\n }\n return count;\n }\n\n private _patchSheetMetadataFile(\n filePath: string,\n originalSheet: Buffer,\n rowsEnd: number,\n delta: number,\n autoFilterRanges: number[],\n lastRowIdx: number,\n lastCol: number,\n ): void {\n const fd = fs.openSync(filePath, 'r+');\n try {\n const patchInt32 = (offset: number, value: number): void => {\n const bytes = Buffer.alloc(4);\n bytes.writeInt32LE(value, 0);\n fs.writeSync(fd, bytes, 0, bytes.length, offset);\n };\n\n for (const filterOffset of autoFilterRanges) {\n const newOffset = filterOffset >= rowsEnd ? filterOffset + delta : filterOffset;\n patchInt32(newOffset + 4, lastRowIdx);\n patchInt32(newOffset + 12, lastCol);\n }\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(originalSheet, pos, rec)) {\n // BrtWsDim (0x94), not BrtSel (0x98): 16-byte payload\n // [rwFirst(4), rwLast(4), colFirst(4), colLast(4)].\n if (rec.id === 0x0094 && rec.len >= 16) {\n const shift = rec.dataStart >= rowsEnd ? delta : 0;\n patchInt32(rec.dataStart + shift + 4, lastRowIdx);\n patchInt32(rec.dataStart + shift + 12, lastCol);\n break;\n }\n pos = rec.dataEnd;\n }\n } finally {\n fs.closeSync(fd);\n }\n }\n\n // ------------------------------------------------------------------\n // Rows region detection\n // ------------------------------------------------------------------\n\n private _findRowsRegion(\n sheetBuf: Buffer\n ): { rowsStart: number; rowsEnd: number; autoFilterRanges: number[] } {\n const autoFilterRanges: number[] = [];\n let rowsStart = -1;\n let lastCellEnd = -1;\n let lastW25 = -1;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x00) {\n if (rowsStart === -1) rowsStart = rec.headerStart;\n } else if (rec.id >= 0x01 && rec.id <= 0x0b) {\n lastCellEnd = rec.dataEnd;\n } else if (rec.id === 0x25 && rec.len === 6) {\n lastW25 = rec.headerStart;\n } else if (rec.id === 0x00a1 && rec.len >= 16) {\n autoFilterRanges.push(rec.dataStart);\n }\n pos = rec.dataEnd;\n }\n\n if (rowsStart === -1) {\n // Empty sheet: insert before the trailing wrapper (last 0x25) or at the end.\n const insertAt = lastW25 >= 0 ? lastW25 : sheetBuf.length;\n return { rowsStart: insertAt, rowsEnd: insertAt, autoFilterRanges };\n }\n\n // Replace only the row records. The row-block terminator records that Excel\n // writes after the last row (0x92/0x217/0x1dd/0x1dc) must be preserved,\n // otherwise Excel drops the last written row.\n const rowsEnd = lastCellEnd >= 0 ? lastCellEnd : (lastW25 >= 0 ? lastW25 : sheetBuf.length);\n\n return { rowsStart, rowsEnd, autoFilterRanges };\n }\n\n /**\n * Keep the sheet dimension record (0x94) in sync with the new data.\n * Excel uses its rwLast (payload offset 4) and colLast (payload offset 12)\n * fields to read the full row range; stale values make the last written row\n * invisible to Excel (and drop it from pivot refreshes).\n */\n private _patchDimension(sheetBuf: Buffer, lastRowIdx: number, lastCol: number): void {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x0094 && rec.len >= 16) {\n sheetBuf.writeInt32LE(lastRowIdx, rec.dataStart + 4);\n sheetBuf.writeInt32LE(lastCol, rec.dataStart + 12);\n return;\n }\n pos = rec.dataEnd;\n }\n }\n\n // ------------------------------------------------------------------\n // Pivot cache integration\n // ------------------------------------------------------------------\n\n private _patchPivotCaches(sheetName: string, rwLast: number, colLast: number): void {\n for (const path of this.pivotCacheDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n const buf = Buffer.from(entry.getData());\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let patched = false;\n let refreshXfPatched = false;\n\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n\n if (rec.id === 0x00b3 && rec.len >= 4 && !refreshXfPatched) {\n // BrtBeginPivotCacheDefinition flags: bit 0x04 of payload offset 3 = refreshOnLoad.\n if (rec.dataStart + 4 <= buf.length) {\n const v = buf[rec.dataStart + 3];\n if ((v & 0x04) === 0) {\n buf[rec.dataStart + 3] = v | 0x04;\n patched = true;\n }\n }\n refreshXfPatched = true;\n }\n\n if (rec.id === 0x00bb && rec.len >= 23) {\n // BrtPivotCacheSource: [3] + cch(4) + name(utf16) + rwFirst(4) rwLast(4) colFirst(4) colLast(4)\n const cch = buf.readUInt32LE(rec.dataStart + 3);\n const nameStart = rec.dataStart + 7;\n const refStart = nameStart + cch * 2;\n const name = readUtf16(buf, nameStart, cch);\n if (name === sheetName && refStart + 16 <= buf.length) {\n buf.writeInt32LE(rwLast, refStart + 4);\n buf.writeInt32LE(colLast, refStart + 12);\n patched = true;\n }\n }\n }\n\n if (patched) {\n this.zip.updateFile(path, buf);\n }\n }\n }\n\n /**\n * Remove the stale calculation chain (xl/calcChain.bin). Excel rebuilds it\n * on open. Removes the part, its Content_Types override and its workbook\n * rels entry. XLSB tables are not patched (documented limitation).\n */\n private _removeCalcChain(): void {\n const calcPath = 'xl/calcChain.bin';\n if (!this.zip.getEntry(calcPath) && !this.stagedParts.has(calcPath)) return;\n try {\n this.zip.deleteFile(calcPath);\n } catch {\n // Best-effort.\n }\n const stagedCalc = this.stagedParts.get(calcPath);\n if (stagedCalc) {\n this.stagedParts.delete(calcPath);\n try {\n fs.rmSync(stagedCalc, { force: true });\n } catch {\n // Best-effort.\n }\n }\n\n // XLSB declares non-workbook .bin parts with an Override (the Default\n // \"bin\" content type is the workbook itself), so remove that too.\n const ctPath = '[Content_Types].xml';\n if (this.zip.getEntry(ctPath) || this.stagedParts.has(ctPath)) {\n try {\n const ct = this._entryData(ctPath).toString('utf8');\n const updated = ct.replace(\n /<Override\\b[^>]*PartName=\"\\/xl\\/calcChain\\.bin\"[^>]*\\/?>/gi,\n '',\n );\n if (updated !== ct) this._writePartText(ctPath, updated);\n } catch {\n // Best-effort.\n }\n }\n\n const relsPath = 'xl/_rels/workbook.bin.rels';\n if (this.zip.getEntry(relsPath) || this.stagedParts.has(relsPath)) {\n try {\n const rels = this._entryData(relsPath).toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let m: RegExpExecArray | null;\n let out = '';\n let last = 0;\n let changed = false;\n while ((m = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(m[0]);\n const type = attrs['Type'] ?? attrs['type'] ?? '';\n const target = attrs['Target'] ?? attrs['target'] ?? '';\n if (type.endsWith('/calcChain') && resolveRelTarget(target) === 'xl/calcChain.bin') {\n out += rels.substring(last, m.index);\n last = m.index + m[0].length;\n changed = true;\n }\n }\n if (changed) {\n out += rels.substring(last);\n this._writePartText(relsPath, out);\n }\n } catch {\n // Best-effort.\n }\n }\n }\n\n /** Write an XML/text part to its staged file when present, else into the ZIP. */\n private _writePartText(name: string, text: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) {\n fs.writeFileSync(stagedPath, text, 'utf8');\n } else {\n this.zip.updateFile(name, Buffer.from(text, 'utf8'));\n }\n }\n}\n\nexport default XlsbUpdater;\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport { spawn } from 'child_process';\nimport { installTemporaryOutput } from './atomicFile';\n\n/** Options for an Excel format conversion. */\nexport interface ExcelConversionOptions {\n /** Allow replacing an existing destination file. Defaults to false. */\n overwrite?: boolean;\n}\n\nconst POWERSHELL_CONVERSION_SCRIPT = `\n$ErrorActionPreference = 'Stop'\n$inputPath = [Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_INPUT')\n$outputPath = [Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_OUTPUT')\n$fileFormat = [int][Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_FORMAT')\n$excel = $null\n$workbook = $null\n$exitCode = 0\n\ntry {\n $excel = New-Object -ComObject Excel.Application\n $excel.Visible = $false\n $excel.DisplayAlerts = $false\n $excel.ScreenUpdating = $false\n\n # Open read-only so the source workbook is never changed by the conversion.\n $workbook = $excel.Workbooks.Open($inputPath, 0, $true)\n if ($null -eq $workbook) {\n throw 'Excel did not return a workbook when opening the source file.'\n }\n\n $workbook.SaveAs($outputPath, $fileFormat)\n} catch {\n $exitCode = 1\n [Console]::Error.WriteLine($_.Exception.ToString())\n} finally {\n if ($null -ne $workbook) {\n try { $workbook.Close($false) } catch { }\n try { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook) | Out-Null } catch { }\n }\n if ($null -ne $excel) {\n try { $excel.Quit() } catch { }\n try { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null } catch { }\n }\n [GC]::Collect()\n [GC]::WaitForPendingFinalizers()\n}\n\nexit $exitCode\n`;\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction validateConversionPaths(\n inputPath: string,\n outputPath: string,\n inputExtension: string,\n outputExtension: string,\n overwrite: boolean\n): { input: string; output: string } {\n const input = path.resolve(inputPath);\n const output = path.resolve(outputPath);\n\n if (path.extname(input).toLowerCase() !== inputExtension) {\n throw new Error(\n `Excel conversion: source must have the ${inputExtension} extension: ${inputPath}`\n );\n }\n if (path.extname(output).toLowerCase() !== outputExtension) {\n throw new Error(\n `Excel conversion: destination must have the ${outputExtension} extension: ${outputPath}`\n );\n }\n if (!fs.existsSync(input)) {\n throw new Error(`Excel conversion: source file not found: ${inputPath}`);\n }\n if (!fs.statSync(input).isFile()) {\n throw new Error(`Excel conversion: source path is not a file: ${inputPath}`);\n }\n if (!fs.existsSync(path.dirname(output))) {\n throw new Error(`Excel conversion: destination directory not found: ${path.dirname(output)}`);\n }\n if (fs.existsSync(output)) {\n if (fs.statSync(output).isDirectory()) {\n throw new Error(`Excel conversion: destination path is a directory: ${outputPath}`);\n }\n if (!overwrite) {\n throw new Error(\n `Excel conversion: destination already exists (pass { overwrite: true } to replace it): ${outputPath}`\n );\n }\n }\n\n if (process.platform === 'win32' && input.toLowerCase() === output.toLowerCase()) {\n throw new Error('Excel conversion: source and destination must be different files.');\n }\n\n return { input, output };\n}\n\nfunction runPowerShellConversion(inputPath: string, outputPath: string, fileFormat: 50 | 51): Promise<void> {\n const encodedCommand = Buffer.from(POWERSHELL_CONVERSION_SCRIPT, 'utf16le').toString('base64');\n const environment: NodeJS.ProcessEnv = {\n ...process.env,\n JUSTYBASE_EXCEL_INPUT: inputPath,\n JUSTYBASE_EXCEL_OUTPUT: outputPath,\n JUSTYBASE_EXCEL_FORMAT: String(fileFormat),\n };\n\n return new Promise((resolve, reject) => {\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const child = spawn(\n 'powershell.exe',\n [\n '-NoLogo',\n '-NoProfile',\n '-NonInteractive',\n '-ExecutionPolicy',\n 'Bypass',\n '-EncodedCommand',\n encodedCommand,\n ],\n { env: environment, windowsHide: true }\n );\n\n child.stdout?.setEncoding('utf8');\n child.stderr?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => { stdout += chunk; });\n child.stderr?.on('data', (chunk: string) => { stderr += chunk; });\n\n child.once('error', (error) => {\n if (settled) return;\n settled = true;\n reject(new Error(`Excel conversion: unable to start PowerShell/COM: ${error.message}`));\n });\n\n child.once('close', (code) => {\n if (settled) return;\n settled = true;\n if (code === 0) {\n resolve();\n return;\n }\n\n const details = (stderr || stdout).replace(/\\s+/g, ' ').trim();\n reject(new Error(\n `Excel conversion failed (PowerShell exit code ${code ?? 'unknown'})${details ? `: ${details}` : '.'}`\n ));\n });\n });\n}\n\nasync function convertExcelFile(\n inputPath: string,\n outputPath: string,\n inputExtension: string,\n outputExtension: string,\n fileFormat: 50 | 51,\n options: ExcelConversionOptions = {}\n): Promise<void> {\n const { input, output } = validateConversionPaths(\n inputPath,\n outputPath,\n inputExtension,\n outputExtension,\n options.overwrite === true\n );\n\n if (process.platform !== 'win32') {\n throw new Error('Excel conversion requires Windows with desktop Microsoft Excel and COM automation.');\n }\n\n const temporaryOutput = path.join(\n path.dirname(output),\n `.${path.basename(output, outputExtension)}.${randomUUID()}.conversion${outputExtension}`\n );\n\n try {\n await runPowerShellConversion(input, temporaryOutput, fileFormat);\n if (!fs.existsSync(temporaryOutput)) {\n throw new Error('Excel conversion completed without creating the destination file.');\n }\n\n installTemporaryOutput(temporaryOutput, output, options.overwrite === true);\n } catch (error) {\n throw new Error(`Excel conversion ${inputExtension} -> ${outputExtension}: ${errorMessage(error)}`);\n } finally {\n if (fs.existsSync(temporaryOutput)) {\n try {\n fs.rmSync(temporaryOutput);\n } catch {\n // Preserve the original conversion error if cleanup also fails.\n }\n }\n }\n}\n\n/** Convert an Excel Binary Workbook (.xlsb) to an Open XML Workbook (.xlsx). */\nexport function convertXlsbToXlsx(\n inputPath: string,\n outputPath: string,\n options?: ExcelConversionOptions\n): Promise<void> {\n return convertExcelFile(inputPath, outputPath, '.xlsb', '.xlsx', 51, options);\n}\n\n/** Convert an Open XML Workbook (.xlsx) to an Excel Binary Workbook (.xlsb). */\nexport function convertXlsxToXlsb(\n inputPath: string,\n outputPath: string,\n options?: ExcelConversionOptions\n): Promise<void> {\n return convertExcelFile(inputPath, outputPath, '.xlsx', '.xlsb', 50, options);\n}\n"],"mappings":"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;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAClB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAClB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAClB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAClB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAClB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MACN;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAC9C,CAAC;AAED,SAAK,oBAAoB,OAAO,KAAK;AAAA,MACjC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA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AAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MACZ;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpC;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MACZ;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;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","names":["Buffer","path","path","resolve","rowEnd","val","path","resolve","fs","path","randomUUID","archiver","Readable","randomUUID","archiver","Readable","resolve","fs","path","AdmZip","fs","path","randomUUID","fs","path","randomUUID","Readable","archiver","readDestinationMode","resolve","maybeEmitter","randomUUID","archiver","Readable","AdmZip","resolve","path","fs","os","path","AdmZip","AdmZip","resolve","rowNum","payload","path","fs","path","randomUUID","errorMessage","resolve","randomUUID"]}
|
|
1
|
+
{"version":3,"sources":["../../src/BigBuffer.ts","../../src/Formats.ts","../../src/writerHelpers.ts","../../src/ExcelReaderAbstract.ts","../../src/BiffReaderWriter.ts","../../src/XlsbReader.ts","../../src/xmlUtils.ts","../../src/writers/core/xlsxParts.ts","../../src/biff12Utils.ts","../../src/writers/core/xlsbRecords.ts","../../src/writers/core/xlsbStyles.ts","../../src/XlsxReader.ts","../../src/xlsxStyleParser.ts","../../src/ReaderFactory.ts","../../src/XlsbWriter.ts","../../src/StreamingSheetState.ts","../../src/writers/core/xlsbFormula.ts","../../src/writers/core/xlsbSheetFeatures.ts","../../src/XlsxWriter.ts","../../src/XlsxUpdater.ts","../../src/atomicFile.ts","../../src/streamingZip.ts","../../src/XlsbUpdater.ts","../../src/ExcelConverter.ts"],"sourcesContent":["import { Buffer } from 'buffer';\n\nexport class BigBuffer {\n private chunkSize: number;\n private chunks: Buffer[];\n private currentBuffer: Buffer;\n private cursor: number;\n\n constructor(chunkSize: number = 65536) {\n this.chunkSize = chunkSize;\n this.chunks = [];\n this.currentBuffer = Buffer.alloc(chunkSize);\n this.cursor = 0;\n }\n\n ensureCapacity(size: number): void {\n if (this.cursor + size > this.chunkSize) {\n this._flush();\n }\n }\n\n private _ensureCapacity(size: number): void {\n this.ensureCapacity(size);\n }\n\n private _flush(): void {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n }\n\n write(buffer: Uint8Array): void {\n let len = buffer.length;\n let offset = 0;\n\n while (len > 0) {\n let available = this.chunkSize - this.cursor;\n if (available === 0) {\n this._flush();\n available = this.chunkSize;\n }\n\n const toWrite = Math.min(len, available);\n this.currentBuffer.set(buffer.subarray(offset, offset + toWrite), this.cursor);\n\n this.cursor += toWrite;\n offset += toWrite;\n len -= toWrite;\n }\n }\n\n writeByte(val: number): void {\n this._ensureCapacity(1);\n this.currentBuffer[this.cursor] = val;\n this.cursor++;\n }\n\n writeUnsafeByte(val: number): void {\n this.currentBuffer[this.cursor++] = val;\n }\n\n writeInt32LE(val: number): void {\n this._ensureCapacity(4);\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeUnsafeInt32LE(val: number): void {\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeDoubleLE(val: number): void {\n this._ensureCapacity(8);\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeUnsafeDoubleLE(val: number): void {\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeString(str: string): void {\n // Fast path for ASCII markup: write code units directly, no UTF-8 encode.\n if (this.cursor + str.length <= this.chunkSize) {\n let ascii = true;\n for (let i = 0; i < str.length; i++) {\n if (str.charCodeAt(i) >= 0x80) {\n ascii = false;\n break;\n }\n }\n if (ascii) {\n for (let i = 0; i < str.length; i++) {\n this.currentBuffer[this.cursor++] = str.charCodeAt(i);\n }\n return;\n }\n }\n\n const byteLength = Buffer.byteLength(str, 'utf8');\n\n if (this.cursor + byteLength <= this.chunkSize) {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n return;\n }\n\n this._flush();\n\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf8'));\n } else {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n }\n }\n\n writeUtf16LE(str: string): void {\n const byteLength = str.length * 2;\n\n if (this.cursor + byteLength <= this.chunkSize) {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n return;\n }\n\n this._flush();\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf16le'));\n } else {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n }\n }\n\n getChunks(): Buffer[] {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n return this.chunks;\n }\n\n /** Overwrite a previously written 32-bit integer at an absolute offset. */\n patchInt32LE(offset: number, value: number): boolean {\n let position = 0;\n for (const chunk of this.chunks) {\n if (offset >= position && offset + 4 <= position + chunk.length) {\n chunk.writeInt32LE(value, offset - position);\n return true;\n }\n position += chunk.length;\n }\n if (offset >= position && offset + 4 <= position + this.cursor) {\n this.currentBuffer.writeInt32LE(value, offset - position);\n return true;\n }\n return false;\n }\n\n reset(): void {\n this.chunks = [];\n this.cursor = 0;\n }\n}\n\nexport default BigBuffer;\n","/**\n * An Excel error value (`#DIV/0!`, `#N/A`, ...). Strings are always text, so\n * writing an error requires this marker; readers return the display text\n * (`\"#DIV/0!\"`) for compatibility with plain value consumers.\n */\nexport class ExcelError {\n constructor(public readonly code: string) {}\n\n toString(): string {\n return this.code;\n }\n}\n\nexport type PrimitiveCellValue = string | number | boolean | Date | bigint | ExcelError | null | undefined;\n\n/** RGB/ARGB hex (`'FF0000'`, `'#FF0000'`, `'FFFF0000'`) or an indexed/theme color. */\nexport type StyleColor = string | { indexed: number } | { theme: number; tint?: number };\n\nexport type FontUnderline = 'single' | 'double' | 'singleAccounting' | 'doubleAccounting';\n\nexport interface FontStyle {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: FontUnderline | boolean;\n strike?: boolean;\n color?: StyleColor;\n family?: number;\n scheme?: 'major' | 'minor';\n vertAlign?: 'baseline' | 'superscript' | 'subscript';\n outline?: boolean;\n shadow?: boolean;\n condense?: boolean;\n extend?: boolean;\n charset?: number;\n}\n\nexport type PatternType =\n | 'none' | 'solid' | 'mediumGray' | 'darkGray' | 'lightGray'\n | 'darkHorizontal' | 'darkVertical' | 'darkDown' | 'darkUp' | 'darkGrid'\n | 'darkTrellis' | 'lightHorizontal' | 'lightVertical' | 'lightDown'\n | 'lightUp' | 'lightGrid' | 'lightTrellis' | 'gray125' | 'gray0625';\n\nexport interface FillStyle {\n patternType?: PatternType;\n fgColor?: StyleColor;\n bgColor?: StyleColor;\n}\n\nexport type BorderLineStyle =\n | 'thin' | 'medium' | 'dashed' | 'dotted' | 'thick' | 'double' | 'hair'\n | 'mediumDashed' | 'dashDot' | 'mediumDashDot' | 'dashDotDot'\n | 'mediumDashDotDot' | 'slantDashDot';\n\nexport interface BorderSide {\n style?: BorderLineStyle;\n color?: StyleColor;\n}\n\nexport interface BorderStyle {\n top?: BorderSide;\n bottom?: BorderSide;\n left?: BorderSide;\n right?: BorderSide;\n diagonal?: BorderSide;\n diagonalUp?: boolean;\n diagonalDown?: boolean;\n outline?: boolean;\n}\n\nexport interface AlignmentStyle {\n horizontal?: 'general' | 'left' | 'center' | 'right' | 'fill' | 'justify' | 'centerContinuous' | 'distributed';\n vertical?: 'top' | 'center' | 'bottom' | 'justify' | 'distributed';\n wrapText?: boolean;\n shrinkToFit?: boolean;\n indent?: number;\n textRotation?: number;\n justifyLastLine?: boolean;\n readingOrder?: 0 | 1 | 2;\n}\n\nexport interface ProtectionStyle {\n locked?: boolean;\n hidden?: boolean;\n}\n\n/** Full cell style. Only the properties that are set are applied. */\nexport interface CellStyle {\n numFmt?: string;\n font?: FontStyle;\n fill?: FillStyle;\n border?: BorderStyle;\n alignment?: AlignmentStyle;\n protection?: ProtectionStyle;\n}\n\nexport interface StyledCell {\n value: PrimitiveCellValue | RichText;\n style: CellStyle;\n}\n\n/** A formula and an optional cached value. The formula text may start with `=`. */\nexport interface FormulaCell {\n formula: string;\n value?: PrimitiveCellValue;\n style?: CellStyle;\n}\n\nexport interface RichTextRun {\n text: string;\n /** Run formatting; only font properties are used. */\n style?: CellStyle;\n}\n\n/** Rich text split into formatting runs. */\nexport class RichText {\n constructor(public readonly runs: RichTextRun[]) {}\n\n toString(): string {\n return this.runs.map(run => run.text).join('');\n }\n}\n\nexport interface FormattedCell {\n value: PrimitiveCellValue;\n format: string;\n}\n\nexport type CellValue =\n | PrimitiveCellValue\n | RichText\n | FormattedCell\n | StyledCell\n | FormulaCell;\n\n/** Built-in Excel number-format strings for {@link FormattedCell}. */\nexport const F = {\n THOUSANDS_SEP: '#,##0',\n CURRENCY_PLN: '#,##0.00 \"z\\u0142\"',\n CURRENCY_EUR: '#,##0.00 \\u20AC',\n PERCENTAGE: '0%',\n SCIENTIFIC: '0.00E+00',\n TWO_DECIMALS: '#,##0.00',\n TEXT: '@',\n LEADING_ZEROS: '000000000',\n\n DATE_SHORT: 'dd.mm.yyyy',\n DATE_LONG: 'd mmmm yyyy',\n DATE_DAY_MONTH_YEAR: 'dd-mm-yyyy',\n DATE_ISO: 'yyyy-mm-dd',\n DATE_MONTH_YEAR: 'mmmm yyyy',\n DATE_WEEKDAY: 'dddd, d mmmm yyyy',\n DATE_DAY_MONTH: 'd mmmm',\n DATE_YEAR_ONLY: 'yyyy',\n\n DATETIME_SHORT: 'dd.mm.yyyy hh:mm',\n DATETIME_LONG: 'd mmmm yyyy hh:mm:ss',\n TIME_HH_MM: 'hh:mm',\n TIME_HH_MM_SS: 'hh:mm:ss',\n TIME_12H: 'h:mm AM/PM',\n DATETIME_24H: 'dd.mm.yyyy hh:mm:ss',\n DATETIME_ISO: 'yyyy-mm-dd\"T\"hh:mm:ss',\n TIME_MS: 'hh:mm:ss.000',\n};\n\nexport function isFormattedCell(val: unknown): val is FormattedCell {\n return val !== null && val !== undefined && typeof val === 'object' && 'format' in val && typeof (val as FormattedCell).format === 'string';\n}\n\nexport function isRichText(val: unknown): val is RichText {\n return val instanceof RichText;\n}\n\nexport function isStyledCell(val: unknown): val is StyledCell {\n return val !== null && val !== undefined && typeof val === 'object'\n && 'style' in val && 'value' in val && !('formula' in val);\n}\n\nexport function isFormulaCell(val: unknown): val is FormulaCell {\n return val !== null && val !== undefined && typeof val === 'object' && 'formula' in val;\n}\n\n/**\n * Style carried by a cell. `FormattedCell` maps to `{ numFmt }`; every other\n * value has no style.\n */\nexport function getCellStyle(val: CellValue): CellStyle | null {\n if (isFormattedCell(val)) return { numFmt: val.format };\n if (isStyledCell(val)) return val.style;\n if (isFormulaCell(val)) return val.style ?? null;\n return null;\n}\n\n/** Style with the legacy `FormattedCell.format` merged into `numFmt`. */\nexport function mergeCellStyle(base: CellStyle | null | undefined, extra: CellStyle | null | undefined): CellStyle | null {\n if (!base && !extra) return null;\n return { ...(base ?? {}), ...(extra ?? {}) };\n}\n\nexport function getFormula(val: CellValue): string | null {\n return isFormulaCell(val) ? val.formula : null;\n}\n\nexport function unwrapCell(val: CellValue): PrimitiveCellValue | RichText {\n if (isFormattedCell(val) || isStyledCell(val)) {\n return val.value;\n }\n if (isFormulaCell(val)) {\n return val.value ?? null;\n }\n return val as PrimitiveCellValue | RichText;\n}\n\nexport function getFormat(val: CellValue): string | null {\n const style = getCellStyle(val);\n return style?.numFmt ?? null;\n}\n","import {\n CellStyle,\n CellValue,\n ExcelError,\n FontStyle,\n PrimitiveCellValue,\n RichText,\n getCellStyle,\n isRichText,\n unwrapCell,\n} from './Formats';\n\nconst OA_EPOCH_1900 = Date.UTC(1899, 11, 30);\nconst MARCH_1_1900 = Date.UTC(1900, 2, 1);\n\n/**\n * Convert an Excel serial number to milliseconds since the given epoch.\n *\n * The 1900 date system counts a fictitious 1900-02-29 (serial 60), so serials\n * 1-59 denote 1900-01-01 through 1900-02-28 and must be shifted by one day\n * (Excel/xlspy/openpyxl parity). The 1904 system has no such gap.\n */\nexport function oaDateToTime(oaDate: number, epochMs: number): number {\n let serial = oaDate;\n if (epochMs === OA_EPOCH_1900 && serial >= 1 && serial < 60) {\n serial += 1;\n }\n return Math.round(serial * 86400000) + epochMs;\n}\n\n/**\n * Convert milliseconds since the given epoch to an Excel serial number.\n *\n * Inverse of {@link oaDateToTime}: dates before 1900-03-01 in the 1900 system\n * serialize one day lower to leave room for the fictitious 1900-02-29\n * (Excel/xlspy/openpyxl parity).\n */\nexport function timeToOaDate(timeMs: number, epochMs: number): number {\n let serial = (timeMs - epochMs) / 86400000;\n if (epochMs === OA_EPOCH_1900 && timeMs < MARCH_1_1900) {\n serial -= 1;\n }\n return serial;\n}\n\n/**\n * Whether a value carries a time of day. The writers store dates as the UTC\n * wall clock, so the UTC fields decide whether a datetime format is needed.\n */\nexport function dateHasTime(value: Date): boolean {\n return value.getUTCHours() !== 0 || value.getUTCMinutes() !== 0\n || value.getUTCSeconds() !== 0 || value.getUTCMilliseconds() !== 0;\n}\n\n/** Excel sheet name characters that must be replaced. */\nexport const INVALID_SHEET_NAME_CHARS = /[\\\\/*?[\\]:]/g;\n\n/**\n * Sanitize an Excel sheet name (invalid chars, max 31 chars, non-empty).\n * @param sheetCount Current sheet count before adding this sheet (used for defaults).\n */\nexport function sanitizeSheetName(name: string, sheetCount: number): string {\n if (!name || typeof name !== 'string') {\n return `Sheet${sheetCount + 1}`;\n }\n\n let sanitized = name.replace(INVALID_SHEET_NAME_CHARS, '_');\n\n if (sanitized.length > 31) {\n sanitized = sanitized.substring(0, 31);\n }\n\n if (sanitized.trim().length === 0) {\n sanitized = `Sheet${sheetCount + 1}`;\n }\n\n return sanitized;\n}\n\n/** Excel limits (decision: throw on violation, like xlspy). */\nexport const MAX_ROWS = 1_048_576;\nexport const MAX_COLS = 16_384;\nexport const MAX_CELL_CHARS = 32_767;\n\n/** Length in UTF-16 code units (JS string length already counts astral as 2). */\nexport function utf16Length(text: string): number {\n return text.length;\n}\n\n/** Throw when cell text exceeds Excel's 32,767 UTF-16 unit limit. */\nexport function assertCellTextLength(text: string): void {\n if (text.length > MAX_CELL_CHARS) {\n throw new Error(\n `Excel cell text exceeds ${MAX_CELL_CHARS} UTF-16 code units (got ${text.length}).`\n );\n }\n}\n\n/** Throw when column count is outside Excel bounds. */\nexport function assertColumnCount(columnCount: number): void {\n if (!Number.isInteger(columnCount) || columnCount < 1 || columnCount > MAX_COLS) {\n throw new Error(\n `Excel column count must be 1..${MAX_COLS} (got ${columnCount}).`\n );\n }\n}\n\n/** Throw when a row/header is longer than the declared column count. */\nexport function assertRowFitsColumns(kind: string, length: number, columnCount: number): void {\n if (length > columnCount) {\n throw new Error(\n `Excel ${kind} length ${length} exceeds columnCount ${columnCount}.`\n );\n }\n}\n\n/** Throw when total row count exceeds Excel bounds. */\nexport function assertRowCount(totalRows: number): void {\n if (totalRows > MAX_ROWS) {\n throw new Error(\n `Excel row count exceeds ${MAX_ROWS} (got ${totalRows}).`\n );\n }\n}\n\n/** Create column-width scratch array filled with -1 (unknown). */\nexport function initColWidths(columnCount: number): number[] {\n return new Array(columnCount).fill(-1.0);\n}\n\n/** Excel's default column width in characters (Calibri 11, 96 DPI). */\nexport const DEFAULT_COLUMN_WIDTH = 8.43;\n/** Hard cap for automatic column widths, in Excel character units. */\nexport const MAX_AUTOFIT_WIDTH = 200;\n/**\n * Excel stores the column width plus the 5-pixel cell padding, i.e. 5/7 of a\n * character in Calibri 11 at 96 DPI. Automatic widths include it; explicit\n * `columnWidths` are written unchanged.\n */\nexport const COLUMN_WIDTH_PADDING = 5 / 7;\n/** Room Excel reserves for the autofilter drop-down button, in characters. */\nexport const AUTOFILTER_BUTTON_WIDTH = 2.4;\n\n/**\n * Rows measured by automatic widths. xlspy defaults to 1000; 200 keeps the\n * width estimate representative while cutting the write-time cost and the\n * streaming buffer (measured widths are dominated by the header and the first\n * rows anyway).\n */\nexport const AUTOFIT_SAMPLE_ROWS = 200;\n\n/** Validate the `autofitRows` option (undefined: 200). */\nexport function resolveAutofitRows(value?: number): number {\n if (value === undefined) return AUTOFIT_SAMPLE_ROWS;\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`autofitRows must be a non-negative integer, got ${value}`);\n }\n return value;\n}\n\n/**\n * Safety factor over the widest advance xlspy measures for the fonts it\n * knows. Together with the per-character costs below it keeps automatic\n * widths at or above xlspy's, at the cost of some extra width.\n */\nconst AUTOFIT_FACTOR = 1.2;\n/**\n * Excel gives long text 1/28 more room than short text (xlspy's\n * `_column_pixels`); apply it to the text part so long runs stay above xlspy.\n */\nconst LONG_TEXT_FACTOR = 29 / 28;\nconst BOLD_WIDTH_FACTOR = 1.08;\nconst ITALIC_WIDTH_FACTOR = 1.05;\nconst DEFAULT_FONT_SIZE = 11;\n/** One level of Excel's alignment indent, in characters (9 px at 96 DPI). */\nconst INDENT_WIDTH = 9 / 7;\n\ntype WidthCosts = Record<string, number>;\n\nfunction makeWidthCosts(groups: ReadonlyArray<readonly [string, number]>): WidthCosts {\n const costs: WidthCosts = Object.create(null);\n for (const [characters, cost] of groups) {\n for (const character of characters) costs[character] = cost;\n }\n return costs;\n}\n\n/**\n * Upper bounds of a character's advance in Calibri-11 digit widths. The\n * \"narrow\" table covers Calibri/Aptos/Arial Narrow (the default font family);\n * the \"wide\" table covers every other font xlspy knows, including unknown\n * fonts, so the estimate stays above xlspy for any styled font.\n */\nconst NARROW_FONT_COSTS = makeWidthCosts([\n ['@W', 1.75],\n ['%M', 1.7],\n ['m', 1.7],\n ['OQwGHN', 1.45],\n ['CD', 1.4],\n ['&U', 1.35],\n ['R', 1.25],\n ['BKAPT', 1.2],\n ['ESXbdpqu', 1.15],\n ['$0123456789Yhno', 1.1],\n ['#+<=>^`ae~', 1.1],\n ['?FZcg', 1.05],\n ['*_kLsvy|', 1.0],\n ['xz', 0.95],\n ['J', 0.9],\n ['\"/', 0.85],\n ['\\\\r', 0.8],\n ['!-t', 0.75],\n ['()[]f{}', 0.7],\n ['I', 0.65],\n [',.:;', 0.65],\n ['l', 0.6],\n [' ij', 0.6],\n [\"'\", 0.5],\n]);\n\nconst WIDE_FONT_COSTS = makeWidthCosts([\n ['@W', 2.5],\n ['M', 2.35],\n ['%', 2.3],\n ['m', 2.25],\n ['w', 2.05],\n ['&', 1.95],\n ['OQ', 1.9],\n ['NU', 1.85],\n ['GHD', 1.75],\n ['#K', 1.7],\n ['A', 1.7],\n ['+<=>^~', 1.65],\n ['V', 1.65],\n ['C', 1.6],\n ['BRXY', 1.6],\n ['Pbdhnopqu', 1.5],\n ['$0123456789e', 1.45],\n ['ESTZ', 1.45],\n ['*_ag', 1.4],\n ['FJLckvx|?`y{}', 1.35],\n ['\"/\\\\', 1.3],\n ['s', 1.25],\n [\" !'(),-.:;I[]fijlrtz\", 1.25],\n]);\n\nconst NARROW_FONT_NAMES = new Set([\n 'calibri',\n 'calibri light',\n 'aptos',\n 'aptos narrow',\n 'arial narrow',\n]);\n\nfunction usesNarrowFont(name?: string | null): boolean {\n if (!name) return true;\n return NARROW_FONT_NAMES.has(name.trim().toLowerCase());\n}\n\nfunction isCjkWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo\n (cp >= 0x2e80 && cp <= 0x303e) || // CJK radicals and punctuation\n (cp >= 0x3041 && cp <= 0x33ff) || // Hiragana, Katakana, CJK compatibility\n (cp >= 0x3400 && cp <= 0x4dbf) || // CJK extension A\n (cp >= 0x4e00 && cp <= 0x9fff) || // CJK unified ideographs\n (cp >= 0xa000 && cp <= 0xa4cf) || // Yi\n (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul syllables\n (cp >= 0xf900 && cp <= 0xfaff) || // CJK compatibility ideographs\n (cp >= 0xfe10 && cp <= 0xfe19) || // vertical forms\n (cp >= 0xfe30 && cp <= 0xfe6f) || // CJK compatibility forms\n (cp >= 0xff00 && cp <= 0xff60) || // fullwidth forms\n (cp >= 0xffe0 && cp <= 0xffe6) || // fullwidth signs\n (cp >= 0x20000 && cp <= 0x3fffd) // CJK extensions B+\n );\n}\n\nfunction isEmojiCodePoint(cp: number): boolean {\n return (cp >= 0x1f000 && cp <= 0x1faff) // emoji and pictographs\n || (cp >= 0x2300 && cp <= 0x23ff) // technical symbols used as emoji\n || (cp >= 0x2600 && cp <= 0x27bf) // miscellaneous symbols and dingbats\n || (cp >= 0x2b00 && cp <= 0x2bff); // arrows and geometric shapes\n}\n\nfunction isZeroWidthCodePoint(cp: number): boolean {\n return cp < 0x20 || (cp >= 0x7f && cp <= 0x9f)\n || (cp >= 0x0300 && cp <= 0x036f) // combining diacritics\n || (cp >= 0x1ab0 && cp <= 0x1aff)\n || (cp >= 0x1dc0 && cp <= 0x1dff)\n || (cp >= 0x20d0 && cp <= 0x20ff)\n || (cp >= 0xfe20 && cp <= 0xfe2f);\n}\n\n/**\n * Extra per-character costs for characters outside the Latin-1/ASCII tables,\n * generated from xlspy's widest font advances. Most non-ASCII letters are\n * covered by the range defaults below; this map only holds the outliers (wide\n * Latin Extended, Greek/Cyrillic and symbol characters).\n */\nconst WIDE_UNICODE_COSTS: WidthCosts = makeWidthCosts([\n [\"\\u00a5\\u00c8\\u00c9\\u00ca\\u00cb\\u00de\\u00e8\\u00e9\\u00ea\\u00eb\\u00f0\\u00f1\\u00f2\\u00f3\\u00f4\\u00f5\\u00f6\\u00f8\\u00f9\\u00fa\\u00fb\\u00fc\\u00fe\\u0112\\u0113\\u0114\\u0115\\u0116\\u0117\\u0118\\u0119\\u011a\\u011b\\u0125\\u0133\\u0144\\u0146\\u0148\\u014b\\u014d\\u014f\\u0151\\u015a\\u015c\\u015e\\u0160\\u0162\\u0164\\u0166\\u0169\\u016b\\u016d\\u016f\\u0171\\u0173\\u0179\\u017b\\u017d\\u0183\\u018c\\u018d\\u018e\\u019e\\u01a5\\u01a7\\u01b4\\u01bb\\u01bc\\u01bf\\u01c9\\u01d2\\u01d4\\u01d6\\u01d8\\u01da\\u01dc\\u01dd\\u01eb\\u01ed\\u01f9\\u01ff\\u0204\\u0205\\u0206\\u0207\\u020d\\u020f\\u0215\\u0217\\u0218\\u021a\\u021f\\u0222\\u0223\\u0228\\u0229\\u022b\\u022d\\u022f\\u0231\\u0232\\u023b\\u023e\\u0246\\u024b\", 1.35],\n [\"\\u0127\\u0185\\u01ac\\u01e8\", 1.40],\n [\"\\u00a3\\u00ab\\u00b5\\u00bb\\u00c7\\u00dd\\u00df\\u0106\\u0108\\u010a\\u010c\\u0111\\u013f\\u0154\\u0156\\u0158\\u0176\\u0178\\u0180\\u0182\\u0184\\u0186\\u018b\\u0198\\u01a6\\u01b3\\u01e5\\u0210\\u0212\\u0243\\u024c\", 1.45],\n [\"\\u00ac\\u00b1\\u00d7\\u00f7\\u0194\\u01c2\\u0245\\u024e\", 1.50],\n [\"\\u00b6\\u00c0\\u00c1\\u00c2\\u00c3\\u00c4\\u00c5\\u0100\\u0102\\u0104\\u010f\\u0136\\u0187\\u01cd\\u01de\\u01e0\\u01f7\\u01fa\\u0200\\u0202\\u0221\\u0226\\u023a\", 1.55],\n [\"\\u00d0\\u010e\\u0110\\u011c\\u011e\\u0120\\u0122\\u0124\\u0149\\u014a\\u0189\\u01a1\\u01a4\\u01e6\\u01f4\\u021e\\u0220\\u0235\\u024a\", 1.60],\n [\"\\u00d1\\u00d2\\u00d3\\u00d4\\u00d5\\u00d6\\u00d8\\u00d9\\u00da\\u00db\\u00dc\\u0126\\u0143\\u0145\\u0147\\u014c\\u014e\\u0150\\u0168\\u016a\\u016c\\u016e\\u0170\\u0172\\u0181\\u018f\\u0193\\u019d\\u019f\\u01b0\\u01b1\\u01b2\\u01c8\\u01d1\\u01d3\\u01d5\\u01d7\\u01d9\\u01db\\u01e4\\u01ea\\u01ec\\u01f8\\u01fe\\u020c\\u020e\\u0214\\u0216\\u022a\\u022c\\u022e\\u0230\\u0244\", 1.70],\n [\"\\u00ae\\u01a3\", 1.80],\n [\"\\u018a\", 1.85],\n [\"\\u0175\\u01a0\\u01af\", 1.90],\n [\"\\u01e2\", 1.95],\n [\"\\u00bc\\u00bd\\u00be\\u0195\\u01a2\\u01c7\\u01cc\\u01e3\", 2.00],\n [\"\\u0132\\u03e3\\u0416\\u04c1\\u04dc\\u0502\\u0503\\u050b\\u0906\\u0911\\u0912\\u0913\\u0914\\u0974\\u0975\\u0e33\\u1e3f\\u1e41\\u1e43\\u20a5\\u2106\\u210b\\u21ff\\u220f\\u226a\\u226b\", 2.05],\n [\"\\u00c6\\u00e6\\u01fc\\u01fd\\u0238\\u0239\\u03d6\\u046d\\u0518\\u2105\\u2154\\u25ef\", 2.10],\n [\"\\u00a9\\u205b\\u2117\", 2.15],\n [\"\\u0152\\u0153\\u039c\\u041c\\u1e3e\\u1e40\\u1e42\\u2180\\u2182\\u21ad\\u21ae\\u21ce\\u21d4\\u21dc\\u21dd\\u221e\", 2.20],\n [\"\\u019c\\u03e2\\u0409\\u040a\\u0428\\u042e\\u0468\\u0496\\u04cd\\u0514\\u20a8\\u2120\\u2188\", 2.25],\n [\"\\u0174\\u01cb\\u01f6\\u0429\\u04a6\\u0508\\u050a\\u051c\\u0520\\u0522\\u1e80\\u1e82\\u1e84\\u1e86\\u1e88\\u2014\\u2015\\u2162\\u2177\\u2190\\u2191\\u2192\\u2193\\u2196\\u2197\\u2198\\u2199\\u222d\", 2.30],\n [\"\\u01c6\\u01f3\\u046c\\u0479\\u047c\\u20a9\\u2133\\u214f\", 2.35],\n [\"\\u2230\", 2.40],\n [\"\\u01ca\\u2152\", 2.45],\n [\"\\u0460\\u047e\", 2.50],\n [\"\\u01c5\\u01f2\\u052b\\u2001\\u2003\\u25fd\\u25fe\", 2.55],\n [\"\\u0478\\u2116\\u2121\\u213b\\u22d8\\u22d9\", 2.65],\n [\"\\u2166\\u216b\", 2.70],\n [\"\\u01c4\\u01f1\\u20af\", 2.75],\n [\"\\u2030\", 3.00],\n [\"\\u052a\\u20a7\", 3.10],\n [\"\\u2194\", 3.25],\n [\"\\u2460\\u2461\\u2462\\u2463\\u2464\\u2465\\u2466\\u2467\\u2468\\u2469\\u246a\\u246b\\u246c\\u246d\\u246e\\u246f\\u2470\\u2471\\u2472\\u2473\\u24ea\\u24eb\\u24ec\\u24ed\\u24ee\\u24ef\\u24f0\\u24f1\\u24f2\\u24f3\\u24f4\\u24ff\", 3.35],\n [\"\\u2167\", 3.45],\n [\"\\u2031\", 3.60],\n]);\n\n/**\n * Conservative displayed-width units for `text`, calibrated so that the\n * resulting autofit width is not below xlspy's for the same text and font\n * (up to the 200-character cap). CJK/fullwidth characters count as 2.2 units,\n * emoji as 3.4, combining marks and control characters as zero. The optional\n * `fontName` selects the narrow (Calibri-like) or worst-case cost table.\n */\nexport function textDisplayUnits(text: string, fontName?: string | null): number {\n const costs = usesNarrowFont(fontName) ? NARROW_FONT_COSTS : WIDE_FONT_COSTS;\n let units = 0;\n for (const char of text) {\n const cp = char.codePointAt(0)!;\n if (isZeroWidthCodePoint(cp)) continue;\n if (isEmojiCodePoint(cp)) {\n units += 3.4;\n continue;\n }\n if (isCjkWideCodePoint(cp)) {\n units += 2.2;\n continue;\n }\n const cost = costs[char] ?? WIDE_UNICODE_COSTS[char];\n if (cost !== undefined) {\n units += cost;\n continue;\n }\n // xlspy measures e.g. Hebrew, Arabic and Indic fallback glyphs at up\n // to ~2.0 digit widths; 1.6 was too optimistic.\n units += cp < 0x250 ? 1.3 : 2.0;\n }\n return units;\n}\n\nfunction fontScale(font?: FontStyle | null): number {\n let scale = Math.max(1, (font?.size ?? DEFAULT_FONT_SIZE) / DEFAULT_FONT_SIZE);\n if (font?.bold) scale *= BOLD_WIDTH_FACTOR;\n if (font?.italic) scale *= ITALIC_WIDTH_FACTOR;\n return scale;\n}\n\n/**\n * Characters Excel reserves for an alignment indent. One level is 9 px at\n * any font size; centred/distributed text is indented from both sides.\n */\nfunction alignmentIndentChars(alignment?: CellStyle['alignment'] | null): number {\n const indent = alignment?.indent ?? 0;\n if (!Number.isFinite(indent) || indent <= 0) return 0;\n const sides = alignment?.horizontal === 'center' || alignment?.horizontal === 'distributed'\n ? 2\n : 1;\n return indent * sides * INDENT_WIDTH;\n}\n\nfunction autofitUnitsWidth(units: number, scale: number = 1, extraChars: number = 0): number {\n const width = (AUTOFIT_FACTOR * (units * LONG_TEXT_FACTOR + 1) + 2) * scale + extraChars;\n return Math.min(MAX_AUTOFIT_WIDTH, Math.max(DEFAULT_COLUMN_WIDTH, width));\n}\n\n/** Conservative autofit width in Excel character units (before file padding). */\nexport function autofitWidth(\n text: string,\n font?: FontStyle | null,\n indentChars: number = 0,\n): number {\n return autofitUnitsWidth(textDisplayUnits(text, font?.name), fontScale(font), indentChars);\n}\n\n/** Autofit width as stored in the file: displayed width plus cell padding. */\nexport function autofitFileWidth(\n text: string,\n font?: FontStyle | null,\n indentChars: number = 0,\n): number {\n // The 200-character cap is a cap on the value written to the file, so the\n // 5/7 padding must not push the stored width above it.\n return Math.min(\n MAX_AUTOFIT_WIDTH,\n autofitWidth(text, font, indentChars) + COLUMN_WIDTH_PADDING,\n );\n}\n\nfunction autofitFileUnitsWidth(units: number, indentChars: number = 0): number {\n return Math.min(\n MAX_AUTOFIT_WIDTH,\n autofitUnitsWidth(units, 1, indentChars) + COLUMN_WIDTH_PADDING,\n );\n}\n\nfunction richTextUnits(\n rich: RichText,\n baseFont?: FontStyle | null,\n): number {\n let units = 0;\n for (const run of rich.runs) {\n const font = run.style?.font ?? baseFont;\n units += textDisplayUnits(run.text, font?.name) * fontScale(font);\n }\n return units;\n}\n\n/** Units of each line of a rich text, combining runs that cross lines. */\nfunction richTextLineUnits(\n rich: RichText,\n baseFont?: FontStyle | null,\n): number[] {\n const lines = [0];\n for (const run of rich.runs) {\n const font = run.style?.font ?? baseFont;\n const parts = run.text.split('\\n');\n for (let index = 0; index < parts.length; index++) {\n if (index > 0) lines.push(0);\n lines[lines.length - 1] += textDisplayUnits(parts[index], font?.name) * fontScale(font);\n }\n }\n return lines;\n}\n\nconst DATE_TOKEN_AT = /^(yyyy|yy|mmmmm|mmmm|mmm|mm|m|dddd|ddd|dd|d|hh|h|ss|s|am\\/pm|a\\/p|\\.0+)/i;\nconst DATE_CHECK = /(yyyy|yy|mmmmm|mmmm|mmm|mm|m|dddd|ddd|dd|d|hh|h|ss|s|am\\/pm|a\\/p)/i;\nconst DATE_SAMPLES: Record<string, string> = {\n yyyy: '2024',\n yy: '24',\n mmmmm: 'W',\n mmmm: 'październik',\n mmm: 'Sep',\n mm: '12',\n m: '12',\n dddd: 'poniedziałek',\n ddd: 'Wed',\n dd: '30',\n d: '30',\n hh: '23',\n h: '23',\n ss: '59',\n s: '59',\n 'am/pm': 'PM',\n 'a/p': 'P',\n};\n\nfunction formatSections(format: string): string[] {\n const sections: string[] = [];\n let section = '';\n let quoted = false;\n for (const char of format) {\n if (char === '\"') quoted = !quoted;\n if (char === ';' && !quoted) {\n sections.push(section);\n section = '';\n } else {\n section += char;\n }\n }\n sections.push(section);\n return sections;\n}\n\nfunction withoutQuotedText(format: string): string {\n return format.replace(/\"[^\"]*\"/g, '');\n}\n\n/** The text a date format section shows, using the longest locale samples xlspy uses. */\nfunction dateFormatText(section: string): string | null {\n if (!DATE_CHECK.test(withoutQuotedText(section))) return null;\n let result = '';\n let i = 0;\n while (i < section.length) {\n const char = section[i];\n if (char === '\"') {\n const end = section.indexOf('\"', i + 1);\n if (end < 0) {\n result += section.slice(i + 1);\n break;\n }\n result += section.slice(i + 1, end);\n i = end + 1;\n continue;\n }\n if (char === '\\\\' && i + 1 < section.length) {\n result += section[i + 1];\n i += 2;\n continue;\n }\n if (char === '[') {\n const end = section.indexOf(']', i + 1);\n i = end < 0 ? section.length : end + 1;\n continue;\n }\n const token = DATE_TOKEN_AT.exec(section.slice(i));\n if (token) {\n const key = token[1].toLowerCase();\n if (key.startsWith('.0')) {\n result += '.' + '0'.repeat(token[1].length - 1);\n } else {\n result += DATE_SAMPLES[key] ?? token[1];\n }\n i += token[1].length;\n continue;\n }\n result += char;\n i++;\n }\n return result;\n}\n\n/** Literal characters a number format section displays besides the value. */\nfunction formatLiteralText(section: string): string {\n let result = '';\n let i = 0;\n while (i < section.length) {\n const char = section[i];\n if (char === '\"') {\n const end = section.indexOf('\"', i + 1);\n if (end < 0) {\n result += section.slice(i + 1);\n break;\n }\n result += section.slice(i + 1, end);\n i = end + 1;\n continue;\n }\n if (char === '\\\\' && i + 1 < section.length) {\n result += section[i + 1];\n i += 2;\n continue;\n }\n if (char === '[') {\n const end = section.indexOf(']', i + 1);\n if (end < 0) break;\n const content = section.slice(i + 1, end);\n if (content.startsWith('$')) {\n result += content.slice(1).replace(/-?\\d+$/, '').trim();\n }\n i = end + 1;\n continue;\n }\n if ('0#?.,@'.includes(char)) {\n i++;\n continue;\n }\n if ('Ee+-'.includes(char)) {\n i++;\n continue;\n }\n result += char;\n i++;\n }\n return result;\n}\n\nfunction expandExponential(text: string): string {\n const match = /^(-?)(\\d+)(?:\\.(\\d+))?[eE]([+-]?\\d+)$/.exec(text);\n if (!match) return text;\n const sign = match[1];\n const integer = match[2];\n const fraction = match[3] ?? '';\n const digits = integer + fraction;\n const point = integer.length + Number(match[4]);\n if (point <= 0) return `${sign}0.${'0'.repeat(-point)}${digits}`;\n if (point >= digits.length) return `${sign}${digits}${'0'.repeat(point - digits.length)}`;\n return `${sign}${digits.slice(0, point)}.${digits.slice(point)}`;\n}\n\n/** Excel's General scientific form: up to 6 significant digits. */\nfunction scientificText(value: number): string {\n const [mantissaRaw, exponentRaw] = Math.abs(value).toExponential(5).split('e');\n const mantissa = mantissaRaw.replace(/\\.?0+$/, '');\n const exponent = Number(exponentRaw);\n return `${mantissa}E${exponent < 0 ? '-' : '+'}${String(Math.abs(exponent)).padStart(2, '0')}`;\n}\n\n/**\n * Excel's General display: at most 11 characters besides the sign, rounded\n * half-up, with a scientific fallback for numbers that do not fit or lose\n * significant digits. Mirrors xlspy's `_general_number` so long decimals and\n * large integers do not blow up the measured width.\n */\nfunction generalNumberDisplay(value: number): string {\n if (!Number.isFinite(value)) {\n if (Number.isNaN(value)) return 'NaN';\n return value < 0 ? '-∞' : '∞';\n }\n if (value === 0) return '0';\n const sign = value < 0 ? '-' : '';\n const abs = Math.abs(value);\n if (Number.isInteger(abs)) {\n const text = String(abs);\n if (!/[eE]/.test(text) && text.length <= 11) return sign + text;\n return sign + scientificText(abs);\n }\n if (abs >= 1e-9 && abs < 1e11) {\n const whole = Math.trunc(abs);\n const wholeLength = String(whole).length;\n const decimals = Math.max(0, 10 - wholeLength);\n const rounded = Number(abs.toFixed(decimals));\n let fixed = rounded.toFixed(decimals);\n if (fixed.includes('.')) fixed = fixed.replace(/0+$/, '').replace(/\\.$/, '');\n const exact = rounded === abs;\n const room = whole > 0\n ? decimals + wholeLength\n : decimals + Math.floor(Math.log10(abs)) + 1;\n if (fixed !== '0' && (exact || room >= 6)) return sign + fixed;\n }\n return sign + scientificText(abs);\n}\n\nfunction generalNumberText(value: number, expandLarge: boolean): string {\n if (!Number.isFinite(value)) return String(value);\n let text = String(value);\n if (/[eE]/.test(text) && (expandLarge || Math.abs(value) < 1e-6)) {\n text = expandExponential(text);\n }\n if (text.endsWith('.0')) text = text.slice(0, -2);\n return text;\n}\n\nfunction generalValueText(value: PrimitiveCellValue, expandLarge: boolean = false): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'boolean') return 'PRAWDA';\n if (value instanceof Date) {\n return dateHasTime(value) ? '12/31/2024 23:45' : '12/31/2024';\n }\n if (typeof value === 'number') {\n return expandLarge ? generalNumberText(value, true) : generalNumberDisplay(value);\n }\n if (typeof value === 'bigint') return value.toString();\n if (value instanceof ExcelError) return value.code;\n return String(value);\n}\n\n/**\n * A conservative rendering of the value as Excel shows it, including date\n * names and number-format literals. It only needs to be wide enough for the\n * autofit estimate, so it intentionally over-counts rather than under-counts.\n */\nfunction estimateCellDisplayText(value: PrimitiveCellValue, numFmt?: string | null): string {\n let raw = generalValueText(value);\n if (!numFmt || /^general$/i.test(numFmt.trim())) return raw;\n const sections = formatSections(numFmt);\n const negative = typeof value === 'bigint' ? value < 0n : typeof value === 'number' && value < 0;\n const secondSection = sections[1] ?? '';\n const useNegativeSection = negative && secondSection.trim() !== '';\n const section = useNegativeSection ? secondSection : (sections[0] ?? '');\n const displayValue: PrimitiveCellValue = useNegativeSection\n ? (typeof value === 'bigint' ? -value : Math.abs(value as number))\n : value;\n if (typeof displayValue !== 'number' && typeof displayValue !== 'bigint'\n && !(displayValue instanceof Date)) {\n return raw + formatLiteralText(section);\n }\n raw = generalValueText(displayValue, true);\n const dateText = dateFormatText(section);\n if (dateText !== null) {\n return textDisplayUnits(dateText) >= textDisplayUnits(raw) ? dateText : raw + dateText;\n }\n let result = raw + formatLiteralText(section);\n const clean = withoutQuotedText(section).replace(/\\[[^\\]]*\\]/g, '');\n const placeholder = /[0#?][0#?,.]*/.exec(clean);\n if (placeholder) {\n const [integerPart, fractionPart = ''] = placeholder[0].split('.');\n const minIntegerDigits = (integerPart.match(/0/g) ?? []).length;\n const integerMatch = /^-?\\d+/.exec(raw);\n const rawIntegerDigits = integerMatch ? integerMatch[0].replace('-', '').length : 0;\n result += '0'.repeat(Math.max(0, minIntegerDigits - rawIntegerDigits));\n const decimals = (fractionPart.match(/[0#?]/g) ?? []).length;\n const rawFractionDigits = raw.includes('.') ? raw.split('.')[1].length : 0;\n const extraDecimals = Math.max(0, decimals - rawFractionDigits);\n if (extraDecimals > 0) {\n result += (raw.includes('.') ? '' : '.') + '0'.repeat(extraDecimals);\n }\n if (integerPart.includes(',')) {\n const digits = (raw.match(/\\d/g) ?? []).length;\n result += ','.repeat(Math.max(0, Math.floor((digits - 1) / 3)));\n }\n }\n const exponent = /[eE][+-]([0#]+)/.exec(clean);\n if (exponent) result += 'E+' + '0'.repeat(Math.max(2, exponent[1].length));\n const percent = (clean.match(/%/g) ?? []).length;\n if (percent > 0) result += '00'.repeat(percent) + '%'.repeat(percent);\n return result;\n}\n\n/** Options for {@link applyHeaderWidths}. */\nexport interface HeaderWidthOptions {\n /** Header cells use a bold font. */\n bold?: boolean;\n /** Add room for the autofilter drop-down button. */\n filterButton?: boolean;\n}\n\n/** Apply autofit widths from header labels. */\nexport function applyHeaderWidths(\n colWidths: number[],\n headers: string[],\n columnCount: number,\n options?: HeaderWidthOptions,\n): void {\n const font = options?.bold ? { bold: true } : null;\n for (let i = 0; i < columnCount; i++) {\n let width = autofitFileWidth(headers[i] ?? '', font);\n if (options?.filterButton) {\n width = Math.min(MAX_AUTOFIT_WIDTH, width + AUTOFILTER_BUTTON_WIDTH);\n }\n if (colWidths[i] < width) colWidths[i] = width;\n }\n}\n\nfunction richTextFileWidth(\n rich: RichText,\n baseFont?: FontStyle | null,\n alignment?: CellStyle['alignment'] | null,\n): number {\n const indent = alignmentIndentChars(alignment);\n if (alignment?.wrapText && rich.runs.some(run => run.text.includes('\\n'))) {\n let best = 0;\n for (const units of richTextLineUnits(rich, baseFont)) {\n best = Math.max(best, autofitFileUnitsWidth(units, indent));\n }\n return best;\n }\n return autofitFileUnitsWidth(richTextUnits(rich, baseFont), indent);\n}\n\n/** Autofit file width of one cell, honouring its style and rich-text runs. */\nfunction cellAutofitFileWidth(cell: CellValue): number {\n if (isRichText(cell)) return richTextFileWidth(cell);\n const style = getCellStyle(cell);\n const value = unwrapCell(cell);\n if (value === null || value === undefined) return -1;\n const indent = alignmentIndentChars(style?.alignment);\n if (isRichText(value)) return richTextFileWidth(value, style?.font, style?.alignment);\n const text = estimateCellDisplayText(value, style?.numFmt);\n if (style?.alignment?.wrapText && text.includes('\\n')) {\n let best = 0;\n for (const line of text.split('\\n')) {\n best = Math.max(best, autofitFileWidth(line, style?.font, indent));\n }\n return best;\n }\n return autofitFileWidth(text, style?.font, indent);\n}\n\n/**\n * Sample up to `sampleLimit` rows and expand column widths (autofit).\n * Skips null/undefined cells; understands styled, formula and rich-text cells.\n */\nexport function updateColWidthsFromRows(\n colWidths: number[],\n rows: unknown[][],\n sampleLimit: number = AUTOFIT_SAMPLE_ROWS\n): void {\n for (let r = 0; r < Math.min(rows.length, sampleLimit); r++) {\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n const width = cellAutofitFileWidth(raw as CellValue);\n if (width >= 0 && colWidths[c] < width) colWidths[c] = width;\n }\n }\n}\n\n/**\n * Resolve a stored width to the value written into the file. The fallback is\n * Excel's default width plus cell padding, matching the old 10-character\n * default while staying close to xlspy/Excel.\n */\nexport function defaultColWidth(width: number, floor: boolean = false): number {\n const value = width > 0 ? width : DEFAULT_COLUMN_WIDTH + COLUMN_WIDTH_PADDING;\n return floor ? Math.floor(value) : value;\n}\n\n/** Validate one explicit column width (xlspy accepts 0.5..255 characters). */\nexport function assertColumnWidth(width: number, index: number): number {\n if (typeof width !== 'number' || !Number.isFinite(width)) {\n throw new TypeError(`columnWidths[${index}] must be a finite number`);\n }\n if (width < 0.5 || width > 255) {\n throw new RangeError(`columnWidths[${index}] must be between 0.5 and 255, got ${width}`);\n }\n return width;\n}\n\n/** Compact XML attribute value for an XLSX column width (2 decimals max). */\nexport function formatColumnWidth(width: number): string {\n return String(Math.round(width * 100) / 100);\n}\n\n/**\n * The `r` attribute of a cell (leading space included), or '' when the cell\n * directly follows the previous written cell in its row. Such cells take their\n * column from their position, so `r` is only needed after a gap. The first cell\n * of a row has `prevCol = -1` and sits in column A without `r`.\n */\nexport function cellRefAttr(col: number, prevCol: number, colRef: string, rowNum: number): string {\n return col === prevCol + 1 ? '' : ` r=\"${colRef}${rowNum}\"`;\n}\n\n/** Deflate level for the ZIP package. 3 trades speed for size; 6 is zlib's default and made XLSB writes about 2.6x slower for an 8% smaller file. */\nexport const DEFAULT_COMPRESSION_LEVEL = 3;\n\nexport function assertCompressionLevel(level: number): number {\n if (!Number.isInteger(level) || level < 0 || level > 9) {\n throw new RangeError(`compressionLevel must be an integer from 0 to 9, got ${level}`);\n }\n return level;\n}\n","import { CellValue } from './Formats';\nimport { oaDateToTime } from './writerHelpers';\n\n/**\n * Shared reader surface for XLSB and XLSX.\n * Always use `await reader.read()` — both formats are async in v2+.\n */\nexport abstract class ExcelReaderAbstract {\n fieldCount: number = 0;\n rowCount: number = 0;\n actualSheetName: string = '';\n resultsCount: number = 0;\n\n protected _oaEpoch: number;\n\n constructor() {\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n /** Open a workbook file. */\n abstract open(path: string, readSharedStrings?: boolean, updateMode?: boolean): Promise<void>;\n\n async close(): Promise<void> {\n // cleanup if needed\n }\n\n /**\n * Advance to the next row.\n * @returns true if a row is available; false at EOF\n */\n abstract read(): Promise<boolean>;\n\n /** Worksheet names in workbook order. */\n abstract getSheetNames(): string[];\n\n /** Cell value for column index `i` of the current row (0-based). */\n abstract getValue(i: number): CellValue;\n\n /**\n * Select a worksheet for subsequent `read()` calls (by name or 0-based index).\n * Resets row state/EOF; default is sheet 0. Resets `fieldCount`.\n */\n abstract selectSheet(nameOrIndex: string | number): Promise<void>;\n\n /**\n * Advance to the next worksheet (like `nextResult` in DB readers).\n * @returns true if another sheet was selected; false at end.\n */\n abstract nextResult(): Promise<boolean>;\n\n dispose(): void {\n // cleanup\n }\n\n getDateTimeFromOaDate(oaDate: number): Date {\n // Round to the nearest millisecond: the float product can land just below a whole ms (x.999),\n // and Date truncates instead of rounding. Handles the fictitious 1900-02-29.\n return new Date(oaDateToTime(oaDate, this._oaEpoch));\n }\n}\n\nexport default ExcelReaderAbstract;\n","export class BiffReaderWriter {\n private buffer: Buffer;\n private pos: number;\n private length: number;\n\n _isSheet: boolean = false;\n _workbookId: number = 0;\n _recId: string | null = null;\n _workbookName: string | null = null;\n\n private _inCellXf: boolean = false;\n private _inNumberFormat: boolean = false;\n private _numberFormatIndex: number = 0;\n private _format: number = 0;\n private _formatString: string | null = null;\n\n _sharedStringValue: string | null = null;\n _sharedStringUniqueCount: number = 0;\n\n _cellType: number = 0;\n _intValue: number = 0;\n _doubleVal: number = 0.0;\n _boolValue: boolean = false;\n _stringValue: string | null = null;\n _columnNum: number = -1;\n _xfIndex: number = 0;\n _readCell: boolean = false;\n _rowIndex: number = -1;\n\n // Start of the current record data (excluding ID and Length)\n private _recordStart: number = 0;\n\n _xfIndexToNumFmtId: number[] = [];\n _customNumFmts: Set<number> = new Set();\n\n constructor(buffer: Buffer) {\n if (!Buffer.isBuffer(buffer)) {\n throw new Error(\"BiffReaderWriter expects a Buffer\");\n }\n this.buffer = buffer;\n this.pos = 0;\n this.length = buffer.length;\n }\n\n private _tryReadVariableValue(): number | null {\n if (this.pos >= this.length) return null;\n\n const b1 = this.buffer[this.pos++];\n let value = (b1 & 0x7F) >>> 0;\n\n if ((b1 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b2 = this.buffer[this.pos++];\n value = (((b2 & 0x7F) << 7) | value) >>> 0;\n\n if ((b2 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b3 = this.buffer[this.pos++];\n value = (((b3 & 0x7F) << 14) | value) >>> 0;\n\n if ((b3 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b4 = this.buffer[this.pos++];\n value = (((b4 & 0x7F) << 21) | value) >>> 0;\n\n return value;\n }\n\n private _getDWord(offset: number): number {\n return this.buffer.readUInt32LE(this._recordStart + offset);\n }\n\n private _getInt32(offset: number): number {\n return this.buffer.readInt32LE(this._recordStart + offset);\n }\n\n private _getWord(offset: number): number {\n return this.buffer.readUInt16LE(this._recordStart + offset);\n }\n\n private _getByte(offset: number): number {\n return this.buffer[this._recordStart + offset];\n }\n\n private _getDouble(offset: number): number {\n return this.buffer.readDoubleLE(this._recordStart + offset);\n }\n\n private _getString(offset: number, length: number): string {\n const start = this._recordStart + offset;\n const end = start + (length * 2);\n if (end > this.buffer.length) return \"\";\n return this.buffer.toString('utf16le', start, end);\n }\n\n private _getNullableString(offsetRef: { val: number }): string | null {\n const length = this._getDWord(offsetRef.val);\n offsetRef.val += 4;\n\n if (length === 0xFFFFFFFF) return null;\n\n const str = this._getString(offsetRef.val, length);\n offsetRef.val += (length * 2);\n return str;\n }\n\n readWorkbook(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._isSheet = false;\n\n if (recordId === 0x9C) {\n this._workbookId = this._getDWord(4);\n\n const offsetRef = { val: 8 };\n this._recId = this._getNullableString(offsetRef);\n\n const nameLength = this._getDWord(offsetRef.val);\n this._workbookName = this._getString(offsetRef.val + 4, nameLength);\n this._isSheet = true;\n }\n\n return true;\n }\n\n readSharedStrings(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._sharedStringValue = null;\n\n if (recordId === 0x13) {\n const length = this._getDWord(1);\n this._sharedStringValue = this._getString(5, length);\n }\n else if (recordId === 159) {\n this._sharedStringUniqueCount = this._getDWord(4);\n }\n\n return true;\n }\n\n readStyles(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n const _cellXfStart = 0x269;\n const _cellXfEnd = 0x26a;\n const _numberFormatStart = 0x267;\n const _numberFormatEnd = 0x268;\n const _xf = 0x2f;\n const _numberFormat = 0x2c;\n\n switch (recordId) {\n case _cellXfStart:\n this._inCellXf = true;\n break;\n case _cellXfEnd:\n this._inCellXf = false;\n break;\n case _numberFormatStart:\n this._inNumberFormat = true;\n break;\n case _numberFormatEnd:\n this._inNumberFormat = false;\n break;\n\n case _xf:\n if (this._inCellXf) {\n this._numberFormatIndex = this._getWord(2);\n this._xfIndexToNumFmtId.push(this._numberFormatIndex);\n }\n break;\n\n case _numberFormat:\n if (this._inNumberFormat) {\n this._format = this._getWord(0);\n const length = this._getDWord(2);\n this._formatString = this._getString(6, length);\n\n const code = this._formatString.toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n this._customNumFmts.add(this._format);\n }\n }\n break;\n }\n\n return true;\n }\n\n private _getRkNumber(offset: number): number {\n const flags = this._getByte(offset);\n let result = 0;\n\n if ((flags & 0x02) !== 0) {\n const intVal = this._getInt32(offset);\n result = intVal >> 2;\n } else {\n const raw = this._getInt32(offset);\n const highBits = (raw & 0xFFFFFFFC);\n\n // Need to construct a double from high bits.\n // Since we can't easily write to a reused buffer without risk,\n // we'll just alloc 8 bytes here. It's rare for RK to be double.\n // Alternatively, we could reuse a small buffer if we cared enough.\n const dBuf = Buffer.allocUnsafe(8);\n dBuf.writeInt32LE(0, 0);\n dBuf.writeInt32LE(highBits, 4);\n\n result = dBuf.readDoubleLE(0);\n }\n\n if ((flags & 0x01) !== 0) {\n result /= 100;\n }\n\n return result;\n }\n\n readWorksheet(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._readCell = false;\n this._columnNum = -1;\n\n const _row = 0x00;\n const _blank = 0x01;\n const _number = 0x02;\n const _boolError = 0x03;\n const _bool = 0x04;\n const _float = 0x05;\n const _string = 0x06;\n const _sharedString = 0x07;\n const _formulaString = 0x08;\n const _formulaNumber = 0x09;\n const _formulaBool = 0x0a;\n const _formulaError = 0x0b;\n\n switch (recordId) {\n case _row:\n this._rowIndex = this._getInt32(0);\n break;\n\n case _blank:\n case _boolError:\n case _formulaError:\n this._readCell = true;\n this._cellType = 0;\n break;\n\n case _number:\n this._doubleVal = this._getRkNumber(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _bool:\n case _formulaBool:\n this._boolValue = (this._getByte(8) === 1);\n this._readCell = true;\n this._cellType = 4;\n break;\n\n case _formulaNumber:\n case _float:\n this._doubleVal = this._getDouble(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _string:\n case _formulaString:\n {\n const length = this._getDWord(8);\n this._stringValue = this._getString(12, length);\n this._readCell = true;\n this._cellType = 5;\n break;\n }\n\n case _sharedString:\n this._intValue = this._getDWord(8);\n this._readCell = true;\n this._cellType = 2;\n break;\n }\n\n if (this._readCell) {\n this._columnNum = this._getDWord(0);\n this._xfIndex = this._getDWord(4) & 0xffffff;\n }\n\n return true;\n }\n}\n\nexport default BiffReaderWriter;\n","import AdmZip from 'adm-zip';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { BiffReaderWriter } from './BiffReaderWriter';\nimport { CellStyle, CellValue } from './Formats';\nimport { parseXlsbStylesBin } from './writers/core/xlsbStyles';\nimport { parseTagAttributes, resolveRelTarget } from './xmlUtils';\nimport { biffCodeToExcelError, parseSharedStringsBin, readRecord, Biff12Record } from './biff12Utils';\nimport { MAX_COLS, MAX_ROWS, oaDateToTime } from './writerHelpers';\n\ninterface SheetInfo {\n name: string;\n rId: string;\n path: string | null;\n}\n\n/** Cell record ids in a worksheet part. */\nconst BRT_CELL_BLANK = 0x01;\nconst BRT_CELL_RK = 0x02;\nconst BRT_CELL_ERROR = 0x03;\nconst BRT_CELL_BOOL = 0x04;\nconst BRT_CELL_REAL = 0x05;\nconst BRT_CELL_ST = 0x06;\nconst BRT_CELL_ISST = 0x07;\nconst BRT_FMLA_STRING = 0x08;\nconst BRT_FMLA_NUM = 0x09;\nconst BRT_FMLA_BOOL = 0x0a;\nconst BRT_FMLA_ERROR = 0x0b;\n\nexport class XlsbReader extends ExcelReaderAbstract {\n private zip: AdmZip | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n\n private _currentSheetIndex: number = -1;\n private _sheetBuffer: Buffer | null = null;\n private _pos: number = 0;\n private _currentRow: CellValue[] = [];\n private _currentStyles: number[] = [];\n private _pendingRowIndex: number = -1;\n private _nextExpectedRow: number = 0;\n private _eof: boolean = false;\n private readonly _rkScratch: Buffer = Buffer.allocUnsafe(8);\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> | null = null;\n /** One flag per xf id: 1 when its number format is a date. */\n private _dateXf: Uint8Array = new Uint8Array(0);\n private _xfStyles: Array<CellStyle | null> = [];\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n await this.close();\n this._resetState();\n this.zip = new AdmZip(path);\n this._load(readSharedStrings);\n }\n\n /** Open a workbook already held in memory (ZIP bytes). */\n async openBuffer(buffer: Buffer, readSharedStrings: boolean = true): Promise<void> {\n await this.close();\n this._resetState();\n this.zip = new AdmZip(buffer);\n this._load(readSharedStrings);\n }\n\n private _resetState(): void {\n this.sheetNames = [];\n this.sheets = [];\n this.sharedStrings = [];\n this.xfIdToNumFmtId = [];\n this.customDateFormats = new Set();\n this._dateXf = new Uint8Array(0);\n this._xfStyles = [];\n this.fieldCount = 0;\n this.resultsCount = 0;\n this.actualSheetName = '';\n this._currentSheetIndex = -1;\n this._sheetBuffer = null;\n this._pos = 0;\n this._currentRow = [];\n this._currentStyles = [];\n this._pendingRowIndex = -1;\n this._nextExpectedRow = 0;\n this._eof = false;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n private _load(readSharedStrings: boolean): void {\n const wbEntry = this.zip!.getEntry('xl/workbook.bin');\n let workbookBuffer: Buffer | null = null;\n if (wbEntry) {\n workbookBuffer = wbEntry.getData();\n const reader = new BiffReaderWriter(workbookBuffer);\n while (reader.readWorkbook()) {\n if (reader._isSheet) {\n const name = reader._workbookName!;\n const rId = reader._recId!;\n this.sheetNames.push(name);\n this.sheets.push({ name, rId, path: null });\n }\n }\n }\n\n const relsEntry = this.zip!.getEntry('xl/_rels/workbook.bin.rels');\n if (relsEntry) {\n const xml = relsEntry.getData().toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n const rIdToTarget: Record<string, string> = {};\n while ((tagMatch = relTagRe.exec(xml)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) rIdToTarget[id] = target;\n }\n for (const sheet of this.sheets) {\n const target = rIdToTarget[sheet.rId];\n if (target) sheet.path = resolveRelTarget(target);\n }\n }\n\n // 1904 date system: BrtWbProp (0x99) bit0 f1904 in workbook.bin.\n if (workbookBuffer) {\n try {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(workbookBuffer, pos, rec)) {\n if (rec.id === 0x99 && rec.len >= 4) {\n const is1904 = (workbookBuffer[rec.dataStart] & 0x01) !== 0;\n this._oaEpoch = is1904 ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n break;\n }\n pos = rec.dataEnd;\n }\n } catch {\n // Keep the default epoch on parse errors.\n }\n }\n\n if (readSharedStrings) {\n const ssEntry = this.zip!.getEntry('xl/sharedStrings.bin');\n if (ssEntry) {\n this.sharedStrings = parseSharedStringsBin(ssEntry.getData()).values;\n }\n }\n\n const stylesEntry = this.zip!.getEntry('xl/styles.bin');\n if (stylesEntry) {\n const reader = new BiffReaderWriter(stylesEntry.getData());\n while (reader.readStyles()) {\n // consume\n }\n this.xfIdToNumFmtId = reader._xfIndexToNumFmtId;\n this.customDateFormats = reader._customNumFmts;\n this._xfStyles = parseXlsbStylesBin(stylesEntry.getData());\n }\n this._buildDateXf();\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n }\n\n private _buildDateXf(): void {\n this._dateXf = new Uint8Array(this.xfIdToNumFmtId.length);\n for (let i = 0; i < this.xfIdToNumFmtId.length; i++) {\n const nf = this.xfIdToNumFmtId[i];\n const isDate = (nf >= 14 && nf <= 22) ||\n (nf >= 45 && nf <= 47) ||\n (this.customDateFormats !== null && this.customDateFormats.has(nf));\n this._dateXf[i] = isDate ? 1 : 0;\n }\n }\n\n private _isDateStyle(xf: number): boolean {\n return xf > 0 && xf < this._dateXf.length && this._dateXf[xf] !== 0;\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n async selectSheet(nameOrIndex: string | number): Promise<void> {\n let index = -1;\n if (typeof nameOrIndex === 'number') {\n index = nameOrIndex;\n } else {\n index = this.sheetNames.indexOf(nameOrIndex);\n if (index === -1) throw new Error(`Sheet '${nameOrIndex}' not found`);\n }\n if (index < 0 || index >= this.sheets.length) {\n throw new Error(`Sheet index ${String(nameOrIndex)} out of range`);\n }\n this._currentSheetIndex = index;\n if (!this._initSheet(index)) {\n throw new Error(`XlsbReader: worksheet part missing for sheet '${this.sheetNames[index]}'.`);\n }\n }\n\n async nextResult(): Promise<boolean> {\n const next = this._currentSheetIndex + 1;\n if (next >= this.sheets.length) return false;\n this._currentSheetIndex = next;\n if (!this._initSheet(next)) {\n throw new Error(`XlsbReader: worksheet part missing for sheet '${this.sheetNames[next]}'.`);\n }\n return true;\n }\n\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n if (!this._initSheet(0)) return false;\n }\n return this._readNext();\n }\n\n /**\n * Synchronous row access for batch consumers. Returns the internal row\n * array, valid until the next call; `readAll`/`rows` return copies.\n * Select a sheet (or call `read()` once) before using it.\n */\n readRow(): CellValue[] | null {\n if (this._currentSheetIndex === -1) {\n throw new Error('XlsbReader: select a sheet before readRow()');\n }\n return this._readNext() ? this._currentRow : null;\n }\n\n /** Collect every remaining row of the current sheet. */\n async readAll(): Promise<CellValue[][]> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n if (!this._initSheet(0)) return [];\n }\n const rows: CellValue[][] = [];\n while (true) {\n const row = this.readRow();\n if (row === null) break;\n rows.push(row.slice());\n }\n return rows;\n }\n\n /** Stream every remaining row of the current sheet. */\n async *rows(): AsyncGenerator<CellValue[]> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n if (!this._initSheet(0)) return;\n }\n while (true) {\n const row = this.readRow();\n if (row === null) return;\n yield row.slice();\n }\n }\n\n private _readNext(): boolean {\n if (this._eof) return false;\n const buffer = this._sheetBuffer;\n if (buffer === null) return false;\n\n // Gap rows (missing BrtRowHdr) are returned as empty rows. An index\n // beyond Excel's row limit is malformed: do not expand it.\n if (this._pendingRowIndex > this._nextExpectedRow && this._pendingRowIndex < MAX_ROWS) {\n this._currentRow = [];\n this._currentStyles = [];\n this._nextExpectedRow++;\n return true;\n }\n\n const row: CellValue[] = [];\n const styles: number[] = [];\n this._currentStyles = styles;\n let fieldCount = this.fieldCount;\n\n while (this._pos < buffer.length) {\n let id = 0;\n let shift = 0;\n let byte = 0;\n do {\n if (this._pos >= buffer.length) return this._finishEof(row, fieldCount);\n byte = buffer[this._pos++];\n id |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n\n let len = 0;\n shift = 0;\n do {\n if (this._pos >= buffer.length) return this._finishEof(row, fieldCount);\n byte = buffer[this._pos++];\n len |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n\n const body = this._pos;\n if (body + len > buffer.length) return this._finishEof(row, fieldCount);\n this._pos = body + len;\n\n if (id === 0x00) {\n // BrtRowHdr\n const rowIndex = len >= 4 ? buffer.readInt32LE(body) : -1;\n const normalized = rowIndex < 0 ? -1 : rowIndex;\n if (normalized !== -1 && normalized !== this._pendingRowIndex) {\n const completed = this._pendingRowIndex;\n this._pendingRowIndex = normalized;\n this._nextExpectedRow = completed + 1;\n this._currentRow = row;\n this._currentStyles = styles;\n this.fieldCount = fieldCount;\n return true;\n }\n continue;\n }\n\n if (id < BRT_CELL_BLANK || id > BRT_FMLA_ERROR || len < 8) continue;\n const col = buffer.readUInt32LE(body);\n if (col >= MAX_COLS) continue;\n const xf = buffer.readUInt32LE(body + 4) & 0xffffff;\n let value: CellValue = null;\n\n switch (id) {\n case BRT_CELL_BLANK:\n break;\n case BRT_CELL_RK:\n if (len >= 12) value = this._numberValue(buffer.readInt32LE(body + 8), xf);\n break;\n case BRT_CELL_ERROR:\n case BRT_FMLA_ERROR:\n if (len >= 9) value = biffCodeToExcelError(buffer[body + 8]);\n break;\n case BRT_CELL_BOOL:\n case BRT_FMLA_BOOL:\n if (len >= 9) value = buffer[body + 8] === 1;\n break;\n case BRT_CELL_REAL:\n case BRT_FMLA_NUM:\n if (len >= 16) value = this._doubleValue(buffer.readDoubleLE(body + 8), xf);\n break;\n case BRT_CELL_ST:\n case BRT_FMLA_STRING: {\n if (len >= 12) {\n const chars = buffer.readUInt32LE(body + 8);\n if (chars * 2 + 12 <= len) {\n value = buffer.toString('utf16le', body + 12, body + 12 + chars * 2);\n }\n }\n break;\n }\n case BRT_CELL_ISST: {\n if (len >= 12) {\n const index = buffer.readUInt32LE(body + 8);\n value = this.sharedStrings[index] ?? null;\n }\n break;\n }\n }\n\n row[col] = value;\n styles[col] = xf;\n if (col + 1 > fieldCount) fieldCount = col + 1;\n }\n\n return this._finishEof(row, fieldCount);\n }\n\n private _finishEof(row: CellValue[] = this._currentRow, fieldCount: number = this.fieldCount): boolean {\n this._eof = true;\n this._nextExpectedRow = this._pendingRowIndex + 1;\n this._currentRow = row;\n this.fieldCount = fieldCount;\n return true;\n }\n\n private _numberValue(raw: number, xf: number): CellValue {\n let value: number;\n if ((raw & 0x02) !== 0) {\n value = raw >> 2;\n } else {\n this._rkScratch.writeInt32LE(0, 0);\n this._rkScratch.writeInt32LE(raw & 0xfffffffc, 4);\n value = this._rkScratch.readDoubleLE(0);\n }\n if ((raw & 0x01) !== 0) value /= 100;\n return this._isDateStyle(xf) ? this._asDate(value) : value;\n }\n\n private _doubleValue(value: number, xf: number): CellValue {\n return this._isDateStyle(xf) ? this._asDate(value) : value;\n }\n\n private _asDate(value: number): CellValue {\n try {\n return new Date(oaDateToTime(value, this._oaEpoch));\n } catch {\n return value;\n }\n }\n\n private _initSheet(index: number): boolean {\n if (index < 0 || index >= this.sheets.length) return false;\n const sheet = this.sheets[index];\n const entry = sheet.path ? this.zip!.getEntry(sheet.path) : undefined;\n if (!entry) return false;\n\n this._sheetBuffer = entry.getData();\n this._pos = 0;\n this._eof = false;\n this._pendingRowIndex = -1;\n this._nextExpectedRow = 0;\n this._currentRow = [];\n this._currentStyles = [];\n this.fieldCount = 0;\n this.actualSheetName = sheet.name;\n\n const buffer = this._sheetBuffer;\n while (this._pos < buffer.length) {\n let id = 0;\n let shift = 0;\n let byte = 0;\n do {\n if (this._pos >= buffer.length) break;\n byte = buffer[this._pos++];\n id |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n let len = 0;\n shift = 0;\n do {\n if (this._pos >= buffer.length) break;\n byte = buffer[this._pos++];\n len |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n const body = this._pos;\n if (body + len > buffer.length) break;\n this._pos = body + len;\n if (id === 0x00 && len >= 4) {\n this._pendingRowIndex = buffer.readInt32LE(body);\n return true;\n }\n }\n\n this._eof = true;\n return true;\n }\n\n /** Style of the current row cell at column `i`, or null for the default style. */\n getStyle(i: number): CellStyle | null {\n const xf = this._currentStyles[i];\n if (xf === undefined) return null;\n return this._xfStyles[xf] ?? null;\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsbReader;\n","/**\n * Shared low-level XML helpers used by readers and the XlsxUpdater.\n */\n\n/** True when the string contains XML-invalid control characters (tab/CR/LF are allowed). */\nfunction hasInvalidControlChars(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) {\n return true;\n }\n }\n return false;\n}\n\n/** Remove XML-invalid control characters (tab/CR/LF and normal ranges are kept). */\nfunction stripInvalidControlChars(str: string): string {\n let out = '';\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c === 0x09 || c === 0x0a || c === 0x0d || (c >= 0x20 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfffd)) {\n out += str[i];\n }\n }\n return out;\n}\n\n/** Escape text content for use inside an XML element body. */\nexport function escapeXmlText(str: string): string {\n if (!/[&<>\"'\\r]/.test(str) && !hasInvalidControlChars(str)) {\n return str;\n }\n // CR is written as so readers that normalize raw line ends keep it.\n let out = str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\r/g, ' ');\n if (hasInvalidControlChars(out)) {\n out = stripInvalidControlChars(out);\n }\n return out;\n}\n\n/** Unescape the five predefined XML entities (single-pass, order-independent). */\nexport function unescapeXml(str: string): string {\n if (!str || str.indexOf('&') === -1) return str;\n return str.replace(/&(?:amp|lt|gt|quot|apos|#\\d+|#x[0-9a-fA-F]+);/g, (entity: string) => {\n switch (entity) {\n case '&': return '&';\n case '<': return '<';\n case '>': return '>';\n case '"': return '\"';\n case ''': return \"'\";\n default: {\n // Numeric character reference: { or 😀\n if (entity[1] === '#') {\n const body = entity.slice(2, -1);\n const code = body[0] === 'x' || body[0] === 'X'\n ? parseInt(body.slice(1), 16)\n : parseInt(body, 10);\n if (Number.isFinite(code)) {\n try { return String.fromCodePoint(code); } catch { return entity; }\n }\n }\n return entity;\n }\n }\n });\n}\n\n/**\n * Escape text of a shared string or inline string. Beyond XML escaping, a literal\n * `_xHHHH_` must be written as `_x005F_xHHHH_` because Excel decodes that pattern\n * in these elements (ECMA-376 ST_Xstring). Attribute values use `escapeXmlText`.\n */\nexport function escapeXlsxText(str: string): string {\n return escapeXmlText(str.replace(/_x([0-9A-Fa-f]{4})_/g, '_x005F_x$1_'));\n}\n\n/**\n * Unescape element text content. Raw CR LF and lone CR are normalized to LF first\n * (XML 1.0 §2.11); character references such as ` ` are kept as CR. Then the\n * ST_Xstring escape `_xHHHH_` that Excel writes for control characters is decoded.\n */\nexport function unescapeXmlText(str: string): string {\n if (!str) return str;\n const text = unescapeXml(str.indexOf('\\r') === -1 ? str : str.replace(/\\r\\n?/g, '\\n'));\n return text.indexOf('_x') === -1\n ? text\n : text.replace(/_x([0-9A-Fa-f]{4})_/g, (_match: string, hex: string) => String.fromCharCode(parseInt(hex, 16)));\n}\n\n/** Parse XML tag attributes into a map, independent of order/prefix/quote style. */\nexport function parseTagAttributes(tag: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n // Matches name=\"value\" or name='value', allowing : and . in names (r:id, xml:space).\n const re = /([A-Za-z_][\\w.:-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(tag)) !== null) {\n const name = m[1];\n const value = m[3] !== undefined ? m[3] : m[4];\n attrs[name] = value;\n // Also store local name without prefix for convenience (r:id -> id).\n const colon = name.indexOf(':');\n if (colon !== -1) {\n const local = name.slice(colon + 1);\n if (!(local in attrs)) attrs[local] = value;\n }\n }\n return attrs;\n}\n\n/** Resolve a workbook rel Target to a zip entry path (xlspy _resolve_path logic). */\nexport function resolveRelTarget(target: string): string {\n if (!target) return target;\n if (target.startsWith('/')) return target.slice(1);\n if (target.startsWith('xl/')) return target;\n return 'xl/' + target;\n}\n\n/** 0-based column index -> \"A\", \"B\", ..., \"AA\", \"AB\", ... (bijective base-26). */\nexport function columnIndexToLetter(colIndex: number): string {\n let n = colIndex + 1;\n let result = '';\n while (n > 0) {\n const rem = (n - 1) % 26;\n result = String.fromCharCode(65 + rem) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/** \"A\", \"AB\", ... -> 0-based column index. */\nexport function columnLetterToIndex(letter: string): number {\n let column = 0;\n const length = letter.length;\n for (let i = 0; i < length; i++) {\n column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);\n }\n return column - 1;\n}\n\n/**\n * Remove trailing rows that contain no non-empty cells (padding rows sometimes\n * produced by SQL exports). This keeps the written range aligned with the\n * actual data, so pivot tables do not pick up \"(blank)\" items from empty rows.\n */\nexport function trimTrailingEmptyRows<T>(rows: T[][]): T[][] {\n let end = rows.length;\n while (end > 0 && rows[end - 1].every(v => v === null || v === undefined)) {\n end--;\n }\n return end === rows.length ? rows : rows.slice(0, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.xml into the list of string values.\n * Handles plain `<si><t>…</t></si>` entries as well as rich-text `<si><r><t>…</t></r></si>` runs.\n * Phonetic `<rPh>` blocks are skipped (xlspy parity) and self-closing `<si/>` yields \"\".\n */\nexport function parseSharedStringsXml(xml: string): string[] {\n const result: string[] = [];\n // Self-closing <si/> entries (empty strings) — count them to keep indices aligned.\n // Full <si>…</si> entries handled below.\n const itemRegex = /<(?:(?:[A-Za-z_][\\w.-]*):)?si\\b[^>]*>([\\s\\S]*?)<\\/(?:(?:[A-Za-z_][\\w.-]*):)?si\\s*>|<(?:(?:[A-Za-z_][\\w.-]*):)?si\\b[^>]*\\/>/gi;\n let itemMatch: RegExpExecArray | null;\n while ((itemMatch = itemRegex.exec(xml)) !== null) {\n const full = itemMatch[0];\n if (full.endsWith('/>') && itemMatch[1] === undefined) {\n result.push('');\n continue;\n }\n let content = itemMatch[1] ?? '';\n // Skip phonetic runs entirely (their <t> is a reading hint, not cell text).\n content = content.replace(/<(?:(?:[A-Za-z_][\\w.-]*):)?rPh\\b[^>]*>[\\s\\S]*?<\\/(?:(?:[A-Za-z_][\\w.-]*):)?rPh\\s*>/gi, '');\n // Handle self-closing rPh as well.\n content = content.replace(/<(?:(?:[A-Za-z_][\\w.-]*):)?rPh\\b[^>]*\\/>/gi, '');\n const textRegex = /<(?:(?:[A-Za-z_][\\w.-]*):)?t\\b[^>]*>([\\s\\S]*?)<\\/(?:(?:[A-Za-z_][\\w.-]*):)?t\\s*>/gi;\n let value = '';\n let textMatch: RegExpExecArray | null;\n while ((textMatch = textRegex.exec(content)) !== null) {\n value += textMatch[1];\n }\n result.push(unescapeXmlText(value));\n }\n return result;\n}\n\n/**\n * Buffer-based equivalent of {@link parseSharedStringsXml} for the common\n * Excel markup: unprefixed `<si>`/`<t>`, plain or rich runs, self-closing\n * `<si/>`, and `<rPh>` blocks that must be skipped. Falls back to the regex\n * parser for anything it does not recognise (CDATA, comments, prefixes,\n * attributes on `<si>`).\n */\nexport function parseSharedStringsBuffer(buf: Buffer): string[] {\n const first = buf.indexOf('<si');\n if (first === -1) return parseSharedStringsXml(buf.toString('utf8'));\n // The declaration is fine; comments/doctype/prefixed markup are not.\n const declarationEnd = buf.indexOf('?>');\n if (buf.indexOf('<!') !== -1 ||\n (declarationEnd !== -1 && buf.indexOf('<?', declarationEnd + 2) !== -1)) {\n return parseSharedStringsXml(buf.toString('utf8'));\n }\n\n const result: string[] = [];\n let pos = 0;\n while (true) {\n const open = buf.indexOf('<si', pos);\n if (open === -1) break;\n const next = buf[open + 3];\n if (next === 0x2f) { // <si/>\n result.push('');\n pos = open + 5;\n continue;\n }\n if (next !== 0x3e) {\n // Attributes or prefixed name: leave it to the regex parser.\n return parseSharedStringsXml(buf.toString('utf8'));\n }\n const contentStart = open + 4;\n const close = buf.indexOf('</si>', contentStart);\n if (close === -1) {\n return parseSharedStringsXml(buf.toString('utf8'));\n }\n let contentPos = contentStart;\n let value = '';\n let sawText = false;\n while (contentPos < close) {\n const lt = buf.indexOf('<', contentPos);\n if (lt === -1 || lt >= close) break;\n if (buf[lt + 1] === 0x72 && buf[lt + 2] === 0x50 && buf[lt + 3] === 0x68) {\n // <rPh ...>…</rPh> or <rPh .../>\n const tagEnd = buf.indexOf('>', lt);\n if (tagEnd === -1) return parseSharedStringsXml(buf.toString('utf8'));\n if (buf[tagEnd - 1] === 0x2f) {\n contentPos = tagEnd + 1;\n } else {\n const rphEnd = buf.indexOf('</rPh>', tagEnd + 1);\n if (rphEnd === -1) return parseSharedStringsXml(buf.toString('utf8'));\n contentPos = rphEnd + 6;\n }\n continue;\n }\n if (buf[lt + 1] === 0x74 && (\n buf[lt + 2] === 0x3e || buf[lt + 2] === 0x20 ||\n buf[lt + 2] === 0x09 || buf[lt + 2] === 0x0a || buf[lt + 2] === 0x0d\n )) {\n const tagEnd = buf.indexOf('>', lt);\n if (tagEnd === -1 || tagEnd >= close) return parseSharedStringsXml(buf.toString('utf8'));\n const textEnd = buf.indexOf('</t>', tagEnd + 1);\n if (textEnd === -1 || textEnd > close) return parseSharedStringsXml(buf.toString('utf8'));\n if (sawText) {\n value += buf.toString('utf8', tagEnd + 1, textEnd);\n } else {\n value = buf.toString('utf8', tagEnd + 1, textEnd);\n sawText = true;\n }\n contentPos = textEnd + 4;\n continue;\n }\n // <r>, </r>, <rPr> and its children: skip the tag.\n const tagEnd = buf.indexOf('>', lt);\n if (tagEnd === -1) return parseSharedStringsXml(buf.toString('utf8'));\n contentPos = tagEnd + 1;\n }\n result.push(unescapeXmlText(value));\n pos = close + 5;\n }\n return result;\n}\n","/**\n * Shared XLSX package serialization.\n *\n * Everything in this module is pure string/byte generation with no Node or\n * browser imports: the Node writer and the browser writer both call it, which\n * is what keeps their unpacked parts identical.\n */\nimport {\n AlignmentStyle,\n BorderSide,\n BorderStyle,\n CellStyle,\n CellValue,\n ExcelError,\n FillStyle,\n FontStyle,\n FormulaCell,\n ProtectionStyle,\n RichText,\n StyleColor,\n getCellStyle,\n getFormula,\n isRichText,\n unwrapCell,\n} from '../../Formats';\nimport {\n cellRefAttr,\n dateHasTime,\n defaultColWidth,\n formatColumnWidth,\n} from '../../writerHelpers';\nimport { escapeXmlText, escapeXlsxText } from '../../xmlUtils';\nimport { TextByteSink } from './ByteSink';\n\nexport interface XlsxSheetEntry {\n name: string;\n pathInArchive: string;\n nameInArchive: string;\n hidden: boolean;\n sheetId: number;\n rId: string;\n filterHeaderRange: string | null;\n}\n\n/** Cell styles 0-5 are always emitted; custom styles start at 6. */\nexport const XLSX_BASE_XF_COUNT = 6;\n\nexport function escapeXlsxAttribute(value: string): string {\n return escapeXmlText(value);\n}\n\n/** Sheet name as used inside a defined name / formula. */\nexport function formatSheetNameForFormula(name: string): string {\n if (/[\\s\\-+=()!@#$%^&]/.test(name) || /^[0-9]/.test(name)) {\n return `'${name.replace(/'/g, \"''\")}'`;\n }\n return name;\n}\n\nconst BORDER_LINE_STYLES = new Set([\n 'thin', 'medium', 'dashed', 'dotted', 'thick', 'double', 'hair',\n 'mediumDashed', 'dashDot', 'mediumDashDot', 'dashDotDot',\n 'mediumDashDotDot', 'slantDashDot',\n]);\n\nconst PATTERN_TYPES = new Set([\n 'none', 'solid', 'mediumGray', 'darkGray', 'lightGray', 'darkHorizontal',\n 'darkVertical', 'darkDown', 'darkUp', 'darkGrid', 'darkTrellis',\n 'lightHorizontal', 'lightVertical', 'lightDown', 'lightUp', 'lightGrid',\n 'lightTrellis', 'gray125', 'gray0625',\n]);\n\nconst HORIZONTAL_ALIGNMENTS = new Set([\n 'general', 'left', 'center', 'right', 'fill', 'justify', 'centerContinuous', 'distributed',\n]);\n\nconst VERTICAL_ALIGNMENTS = new Set(['top', 'center', 'bottom', 'justify', 'distributed']);\n\nfunction colorKey(color: StyleColor): string {\n if (typeof color === 'string') {\n let value = color.trim().replace(/^#/, '').toUpperCase();\n if (value.length === 6) value = `FF${value}`;\n if (!/^[0-9A-F]{8}$/.test(value)) {\n throw new Error(`Invalid color '${color}'. Use RRGGBB, AARRGGBB or '#' + hex.`);\n }\n return `rgb:${value}`;\n }\n if ('indexed' in color) return `indexed:${color.indexed}`;\n const tint = color.tint ?? 0;\n return `theme:${color.theme}:${tint}`;\n}\n\nfunction colorXml(color: StyleColor | undefined): string {\n if (color === undefined) return '';\n if (typeof color === 'string') {\n const key = colorKey(color);\n return `<color rgb=\"${key.slice(4)}\"/>`;\n }\n if ('indexed' in color) return `<color indexed=\"${color.indexed}\"/>`;\n const tint = color.tint;\n return `<color theme=\"${color.theme}\"${tint !== undefined ? ` tint=\"${tint}\"` : ''}/>`;\n}\n\nfunction normalizeFont(font: FontStyle | undefined): FontStyle | null {\n if (!font) return null;\n const out: FontStyle = {};\n if (font.name !== undefined) out.name = font.name;\n if (font.size !== undefined) {\n if (!Number.isFinite(font.size) || font.size <= 0 || font.size > 409) {\n throw new RangeError(`font.size must be in (0, 409], got ${font.size}`);\n }\n out.size = font.size;\n }\n if (font.bold) out.bold = true;\n if (font.italic) out.italic = true;\n if (font.strike) out.strike = true;\n if (font.outline) out.outline = true;\n if (font.shadow) out.shadow = true;\n if (font.condense) out.condense = true;\n if (font.extend) out.extend = true;\n if (font.underline === true) out.underline = 'single';\n else if (typeof font.underline === 'string') out.underline = font.underline;\n if (font.color !== undefined) out.color = font.color;\n if (font.family !== undefined) out.family = font.family;\n if (font.scheme !== undefined) out.scheme = font.scheme;\n if (font.vertAlign !== undefined && font.vertAlign !== 'baseline') out.vertAlign = font.vertAlign;\n if (font.charset !== undefined) out.charset = font.charset;\n return Object.keys(out).length > 0 ? out : null;\n}\n\nfunction normalizeFill(fill: FillStyle | undefined): FillStyle | null {\n if (!fill) return null;\n const out: FillStyle = {};\n if (fill.patternType !== undefined) {\n if (!PATTERN_TYPES.has(fill.patternType)) throw new Error(`Unknown fill pattern '${fill.patternType}'`);\n out.patternType = fill.patternType;\n }\n if (fill.fgColor !== undefined) out.fgColor = fill.fgColor;\n if (fill.bgColor !== undefined) out.bgColor = fill.bgColor;\n if (Object.keys(out).length === 0) return null;\n if (out.patternType === undefined) out.patternType = 'solid';\n return out;\n}\n\nfunction normalizeBorderSide(side: BorderSide | undefined): BorderSide | null {\n if (!side) return null;\n if (side.style !== undefined && !BORDER_LINE_STYLES.has(side.style)) {\n throw new Error(`Unknown border style '${side.style}'`);\n }\n const out: BorderSide = {};\n if (side.style !== undefined) out.style = side.style;\n if (side.color !== undefined) out.color = side.color;\n return Object.keys(out).length > 0 ? out : null;\n}\n\nfunction normalizeBorder(border: BorderStyle | undefined): BorderStyle | null {\n if (!border) return null;\n const out: BorderStyle = {};\n for (const name of ['top', 'bottom', 'left', 'right', 'diagonal'] as const) {\n const side = normalizeBorderSide(border[name]);\n if (side) out[name] = side;\n }\n if (border.diagonalUp) out.diagonalUp = true;\n if (border.diagonalDown) out.diagonalDown = true;\n if (border.outline === false) out.outline = false;\n return Object.keys(out).length > 0 ? out : null;\n}\n\nfunction normalizeAlignment(alignment: AlignmentStyle | undefined): AlignmentStyle | null {\n if (!alignment) return null;\n const out: AlignmentStyle = {};\n if (alignment.horizontal !== undefined) {\n if (!HORIZONTAL_ALIGNMENTS.has(alignment.horizontal)) {\n throw new Error(`Unknown horizontal alignment '${alignment.horizontal}'`);\n }\n out.horizontal = alignment.horizontal;\n }\n if (alignment.vertical !== undefined) {\n if (!VERTICAL_ALIGNMENTS.has(alignment.vertical)) {\n throw new Error(`Unknown vertical alignment '${alignment.vertical}'`);\n }\n out.vertical = alignment.vertical;\n }\n if (alignment.wrapText) out.wrapText = true;\n if (alignment.shrinkToFit) out.shrinkToFit = true;\n if (alignment.indent !== undefined) {\n if (!Number.isInteger(alignment.indent) || alignment.indent < 0 || alignment.indent > 250) {\n throw new RangeError(`alignment.indent must be 0..250, got ${alignment.indent}`);\n }\n out.indent = alignment.indent;\n }\n if (alignment.textRotation !== undefined) {\n const rotation = alignment.textRotation;\n if (!Number.isInteger(rotation) || !((rotation >= 0 && rotation <= 180) || rotation === 255)) {\n throw new RangeError(`alignment.textRotation must be 0..180 or 255, got ${rotation}`);\n }\n out.textRotation = rotation;\n }\n if (alignment.justifyLastLine) out.justifyLastLine = true;\n if (alignment.readingOrder !== undefined) out.readingOrder = alignment.readingOrder;\n return Object.keys(out).length > 0 ? out : null;\n}\n\nfunction normalizeProtection(protection: ProtectionStyle | undefined): ProtectionStyle | null {\n if (!protection) return null;\n const out: ProtectionStyle = {};\n if (protection.locked === false) out.locked = false;\n if (protection.hidden) out.hidden = true;\n return Object.keys(out).length > 0 ? out : null;\n}\n\n/** Canonical form of a style; equal styles get identical JSON keys. */\nexport function normalizeStyle(style: CellStyle | null | undefined): CellStyle | null {\n if (!style) return null;\n const out: CellStyle = {};\n if (style.numFmt !== undefined && style.numFmt !== '') out.numFmt = style.numFmt;\n const font = normalizeFont(style.font);\n const fill = normalizeFill(style.fill);\n const border = normalizeBorder(style.border);\n const alignment = normalizeAlignment(style.alignment);\n const protection = normalizeProtection(style.protection);\n if (font) out.font = font;\n if (fill) out.fill = fill;\n if (border) out.border = border;\n if (alignment) out.alignment = alignment;\n if (protection) out.protection = protection;\n return Object.keys(out).length > 0 ? out : null;\n}\n\nconst BASE_FONT_NORMAL =\n '<font><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font>';\nconst BASE_FONT_BOLD =\n '<font><b/><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font>';\nconst BASE_FILL_NONE = '<fill><patternFill patternType=\"none\"/></fill>';\nconst BASE_FILL_GRAY = '<fill><patternFill patternType=\"gray125\"/></fill>';\nconst BASE_FILL_SOLID =\n '<fill><patternFill patternType=\"solid\"><fgColor rgb=\"FFD9E1F2\"/><bgColor indexed=\"64\"/></patternFill></fill>';\nconst BASE_BORDER = '<border><left/><right/><top/><bottom/><diagonal/></border>';\n\nconst BASE_XFS = [\n '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>',\n '<xf numFmtId=\"14\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>',\n '<xf numFmtId=\"22\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>',\n '<xf numFmtId=\"0\" fontId=\"1\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"/>',\n '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"2\" borderId=\"0\" xfId=\"0\" applyFill=\"1\"/>',\n '<xf numFmtId=\"0\" fontId=\"1\" fillId=\"2\" borderId=\"0\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\"/>',\n];\n\nfunction fontXml(font: FontStyle): string {\n let xml = '<font>';\n if (font.name !== undefined) xml += `<name val=\"${escapeXlsxAttribute(font.name)}\"/>`;\n if (font.charset !== undefined) xml += `<charset val=\"${font.charset}\"/>`;\n if (font.family !== undefined) xml += `<family val=\"${font.family}\"/>`;\n if (font.bold) xml += '<b/>';\n if (font.italic) xml += '<i/>';\n if (font.strike) xml += '<strike/>';\n if (font.outline) xml += '<outline/>';\n if (font.shadow) xml += '<shadow/>';\n if (font.condense) xml += '<condense/>';\n if (font.extend) xml += '<extend/>';\n if (font.color !== undefined) xml += colorXml(font.color);\n if (font.size !== undefined) xml += `<sz val=\"${font.size}\"/>`;\n if (font.underline !== undefined) {\n xml += font.underline === 'single' ? '<u/>' : `<u val=\"${font.underline}\"/>`;\n }\n if (font.vertAlign !== undefined) xml += `<vertAlign val=\"${font.vertAlign}\"/>`;\n if (font.scheme !== undefined) xml += `<scheme val=\"${font.scheme}\"/>`;\n return `${xml}</font>`;\n}\n\nfunction fillXml(fill: FillStyle): string {\n const pattern = fill.patternType ?? 'solid';\n let xml = `<fill><patternFill patternType=\"${pattern}\">`;\n if (fill.fgColor !== undefined) xml += colorXml(fill.fgColor).replace('<color', '<fgColor');\n if (fill.bgColor !== undefined) xml += colorXml(fill.bgColor).replace('<color', '<bgColor');\n return `${xml}</patternFill></fill>`;\n}\n\nfunction borderSideXml(tag: string, side: BorderSide | undefined): string {\n if (!side || (side.style === undefined && side.color === undefined)) return `<${tag}/>`;\n let xml = `<${tag}`;\n if (side.style !== undefined) xml += ` style=\"${side.style}\"`;\n xml += '>';\n if (side.color !== undefined) xml += colorXml(side.color);\n return `${xml}</${tag}>`;\n}\n\nfunction borderXml(border: BorderStyle): string {\n let xml = '<border';\n if (border.diagonalUp) xml += ' diagonalUp=\"1\"';\n if (border.diagonalDown) xml += ' diagonalDown=\"1\"';\n if (border.outline === false) xml += ' outline=\"0\"';\n xml += '>';\n xml += borderSideXml('left', border.left);\n xml += borderSideXml('right', border.right);\n xml += borderSideXml('top', border.top);\n xml += borderSideXml('bottom', border.bottom);\n xml += borderSideXml('diagonal', border.diagonal);\n return `${xml}</border>`;\n}\n\nfunction alignmentXml(alignment: AlignmentStyle): string {\n let xml = '<alignment';\n if (alignment.horizontal !== undefined) xml += ` horizontal=\"${alignment.horizontal}\"`;\n if (alignment.vertical !== undefined) xml += ` vertical=\"${alignment.vertical}\"`;\n if (alignment.wrapText) xml += ' wrapText=\"1\"';\n if (alignment.shrinkToFit) xml += ' shrinkToFit=\"1\"';\n if (alignment.indent !== undefined) xml += ` indent=\"${alignment.indent}\"`;\n if (alignment.textRotation !== undefined) xml += ` textRotation=\"${alignment.textRotation}\"`;\n if (alignment.justifyLastLine) xml += ' justifyLastLine=\"1\"';\n if (alignment.readingOrder !== undefined) xml += ` readingOrder=\"${alignment.readingOrder}\"`;\n return `${xml}/>`;\n}\n\nfunction protectionXml(protection: ProtectionStyle): string {\n let xml = '<protection';\n if (protection.locked === false) xml += ' locked=\"0\"';\n if (protection.hidden) xml += ' hidden=\"1\"';\n return `${xml}/>`;\n}\n\n/**\n * Differential style for conditional formatting. Fills use the background\n * color, which is how Excel stores conditional-format highlighting.\n */\nfunction dxfXml(style: CellStyle, numFmtId: number | null): string {\n let xml = '<dxf>';\n if (style.font) xml += fontXml(style.font);\n if (style.numFmt !== undefined && numFmtId !== null) {\n xml += `<numFmt numFmtId=\"${numFmtId}\" formatCode=\"${escapeXlsxAttribute(style.numFmt)}\"/>`;\n }\n if (style.fill) {\n const color = style.fill.bgColor ?? style.fill.fgColor;\n xml += '<fill><patternFill>';\n if (color !== undefined) xml += colorXml(color).replace('<color', '<bgColor');\n xml += '</patternFill></fill>';\n }\n if (style.alignment) xml += alignmentXml(style.alignment);\n if (style.border) xml += borderXml(style.border);\n if (style.protection) xml += protectionXml(style.protection);\n xml += '</dxf>';\n return xml;\n}\n\n/** Deduplicating style registry for the XLSX `styles.xml` part. */\nexport class XlsxStyleRegistry {\n private readonly numFmts = new Map<string, number>();\n private readonly fontIds = new Map<string, number>();\n private readonly fillIds = new Map<string, number>();\n private readonly borderIds = new Map<string, number>();\n private readonly xfIds = new Map<string, number>();\n private readonly fonts: string[] = [BASE_FONT_NORMAL, BASE_FONT_BOLD];\n private readonly fills: string[] = [BASE_FILL_NONE, BASE_FILL_GRAY, BASE_FILL_SOLID];\n private readonly borders: string[] = [BASE_BORDER];\n private readonly xfs: string[] = [...BASE_XFS];\n private readonly styles: (CellStyle | null)[] = [null, null, null, null, null, null];\n private readonly dxfIds = new Map<string, number>();\n private readonly dxfs: string[] = [];\n private nextNumFmtId = 165;\n\n private numFmtIdFor(format: string): number {\n let id = this.numFmts.get(format);\n if (id === undefined) {\n id = this.nextNumFmtId++;\n this.numFmts.set(format, id);\n }\n return id;\n }\n\n /** Cell XF index for a style; 0 for null/empty styles. */\n register(style: CellStyle | null | undefined): number {\n const normalized = normalizeStyle(style);\n if (normalized === null) return 0;\n const key = JSON.stringify(normalized);\n const existing = this.xfIds.get(key);\n if (existing !== undefined) return existing;\n\n let numFmtId = 0;\n if (normalized.numFmt !== undefined) {\n numFmtId = this.numFmtIdFor(normalized.numFmt);\n }\n\n let fontId = 0;\n if (normalized.font) {\n if (normalized.font.bold && Object.keys(normalized.font).length === 1) {\n fontId = 1;\n } else {\n const componentKey = JSON.stringify(normalized.font);\n let id = this.fontIds.get(componentKey);\n if (id === undefined) {\n id = this.fonts.length;\n this.fontIds.set(componentKey, id);\n this.fonts.push(fontXml(normalized.font));\n }\n fontId = id;\n }\n }\n\n let fillId = 0;\n if (normalized.fill) {\n const componentKey = JSON.stringify(normalized.fill);\n let id = this.fillIds.get(componentKey);\n if (id === undefined) {\n id = this.fills.length;\n this.fillIds.set(componentKey, id);\n this.fills.push(fillXml(normalized.fill));\n }\n fillId = id;\n }\n\n let borderId = 0;\n if (normalized.border) {\n const componentKey = JSON.stringify(normalized.border);\n let id = this.borderIds.get(componentKey);\n if (id === undefined) {\n id = this.borders.length;\n this.borderIds.set(componentKey, id);\n this.borders.push(borderXml(normalized.border));\n }\n borderId = id;\n }\n\n let xf = `<xf numFmtId=\"${numFmtId}\" fontId=\"${fontId}\" fillId=\"${fillId}\" borderId=\"${borderId}\" xfId=\"0\"`;\n if (numFmtId !== 0) xf += ' applyNumberFormat=\"1\"';\n if (fontId !== 0) xf += ' applyFont=\"1\"';\n if (fillId !== 0) xf += ' applyFill=\"1\"';\n if (borderId !== 0) xf += ' applyBorder=\"1\"';\n if (normalized.alignment) xf += ' applyAlignment=\"1\"';\n if (normalized.protection) xf += ' applyProtection=\"1\"';\n const children = (normalized.alignment ? alignmentXml(normalized.alignment) : '')\n + (normalized.protection ? protectionXml(normalized.protection) : '');\n if (children) {\n xf += `>${children}</xf>`;\n } else {\n xf += '/>';\n }\n\n const index = this.xfs.length;\n this.xfIds.set(key, index);\n this.xfs.push(xf);\n this.styles.push(normalized);\n return index;\n }\n\n /** Differential style id for conditional formatting; -1 for an empty style. */\n registerDxf(style: CellStyle | null | undefined): number {\n const normalized = normalizeStyle(style);\n if (normalized === null) return -1;\n const key = JSON.stringify(normalized);\n const existing = this.dxfIds.get(key);\n if (existing !== undefined) return existing;\n\n const numFmtId = normalized.numFmt !== undefined\n ? this.numFmtIdFor(normalized.numFmt)\n : null;\n const index = this.dxfs.length;\n this.dxfIds.set(key, index);\n this.dxfs.push(dxfXml(normalized, numFmtId));\n return index;\n }\n\n /** XF index for a plain number format (legacy FormattedCell path). */\n registerFormat(format: string): number {\n return this.register({ numFmt: format });\n }\n\n toXml(): string {\n let numFmts = '';\n for (const [format, id] of this.numFmts) {\n numFmts += `<numFmt numFmtId=\"${id}\" formatCode=\"${escapeXlsxAttribute(format)}\"/>`;\n }\n const numFmtsSection = this.numFmts.size > 0\n ? `<numFmts count=\"${this.numFmts.size}\">${numFmts}</numFmts>`\n : '';\n const dxfsSection = this.dxfs.length > 0\n ? `<dxfs count=\"${this.dxfs.length}\">${this.dxfs.join('\\n')}</dxfs>`\n : '<dxfs count=\"0\"/>';\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsSection}\n<fonts count=\"${this.fonts.length}\">\n${this.fonts.join('\\n')}\n</fonts>\n<fills count=\"${this.fills.length}\">\n${this.fills.join('\\n')}\n</fills>\n<borders count=\"${this.borders.length}\">\n${this.borders.join('\\n')}\n</borders>\n<cellStyleXfs count=\"1\">\n<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\n</cellStyleXfs>\n<cellXfs count=\"${this.xfs.length}\">\n${this.xfs.join('\\n')}\n</cellXfs>\n<cellStyles count=\"1\">\n<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>\n</cellStyles>\n${dxfsSection}\n<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>\n</styleSheet>`;\n }\n}\n\nexport type SharedStringValue = string | RichText;\n\nfunction sharedStringKey(value: SharedStringValue): string {\n if (typeof value === 'string') return `s:${value}`;\n return `r:${JSON.stringify(value.runs)}`;\n}\n\nfunction richTextXml(rich: RichText): string {\n let xml = '';\n for (const run of rich.runs) {\n xml += '<r>';\n const font = normalizeFont(run.style?.font);\n if (font) {\n xml += fontXml(font).replace('<font>', '<rPr>').replace('</font>', '</rPr>');\n }\n xml += `<t xml:space=\"preserve\">${escapeXlsxText(run.text)}</t></r>`;\n }\n return xml;\n}\n\nfunction sharedStringItem(value: SharedStringValue): string {\n if (typeof value !== 'string') return `<si>${richTextXml(value)}</si>`;\n const clean = escapeXlsxText(value);\n if (clean.length > 0 &&\n (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean))) {\n return `<si><t xml:space=\"preserve\">${clean}</t></si>`;\n }\n return `<si><t>${clean}</t></si>`;\n}\n\nexport function buildXlsxSharedStrings(strings: SharedStringValue[], countAll: number): string {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n xml += `<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${countAll}\" uniqueCount=\"${strings.length}\">`;\n for (const value of strings) xml += sharedStringItem(value);\n xml += '</sst>';\n return xml;\n}\n\nexport function buildXlsxWorkbook(sheets: XlsxSheetEntry[], autofilterOn: boolean): string {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n<fileVersion appName=\"xl\" lastEdited=\"4\" lowestEdited=\"4\" rupBuild=\"4505\"/>\n<workbookPr defaultThemeVersion=\"124226\"/>\n<bookViews><workbookView xWindow=\"240\" yWindow=\"15\" windowWidth=\"16095\" windowHeight=\"9660\"/></bookViews>\n<sheets>`;\n\n for (const sheet of sheets) {\n const state = sheet.hidden ? ' state=\"hidden\"' : '';\n xml += `<sheet name=\"${escapeXlsxAttribute(sheet.name)}\" sheetId=\"${sheet.sheetId}\"${state} r:id=\"${sheet.rId}\"/>`;\n }\n xml += '</sheets>';\n\n if (autofilterOn) {\n xml += '<definedNames>';\n for (const sheet of sheets) {\n if (!sheet.filterHeaderRange) continue;\n const escapedRange = escapeXlsxText(sheet.filterHeaderRange);\n xml += `<definedName name=\"_xlnm._FilterDatabase\" localSheetId=\"${sheet.sheetId - 1}\" hidden=\"1\">${escapedRange}</definedName>`;\n }\n xml += '</definedNames>';\n }\n\n xml += '<calcPr calcId=\"124519\" fullCalcOnLoad=\"1\"/></workbook>';\n return xml;\n}\n\nexport function buildXlsxContentTypes(\n sheets: XlsxSheetEntry[],\n comments?: Array<{ path: string }>,\n): string {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>\n${comments && comments.length > 0 ? '<Default Extension=\"vml\" ContentType=\"application/vnd.openxmlformats-officedocument.vmlDrawing\"/>' : ''}\n<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\n<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\n<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>`;\n for (const sheet of sheets) {\n xml += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n }\n for (const part of comments ?? []) {\n xml += `<Override PartName=\"/${part.path}\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"/>`;\n }\n xml += '</Types>';\n return xml;\n}\n\nexport function buildXlsxRels(sheets: XlsxSheetEntry[]): { global: string; workbook: string } {\n const global = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\n</Relationships>`;\n\n let workbook = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n for (const sheet of sheets) {\n workbook += `<Relationship Id=\"${sheet.rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n let nextId = sheets.length + 1;\n workbook += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n workbook += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/>`;\n workbook += '</Relationships>';\n return { global, workbook };\n}\n\n/**\n * Write everything up to and including `<sheetData>`. The caller writes the\n * header row and data rows, then calls {@link writeXlsxSheetTail}.\n */\nexport function writeXlsxSheetHead(\n sink: TextByteSink,\n options: {\n dimensionRef: string;\n columnCount: number;\n isFirstSheet: boolean;\n hasHeaders: boolean;\n colWidths: number[];\n },\n): void {\n const { dimensionRef, columnCount, isFirstSheet, hasHeaders, colWidths } = options;\n\n sink.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n sink.writeString('<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">');\n sink.writeString(`<dimension ref=\"${dimensionRef}\"/>`);\n\n if (hasHeaders) {\n sink.writeString(isFirstSheet\n ? '<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>'\n : '<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n sink.writeString(isFirstSheet\n ? '<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>'\n : '<sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n\n sink.writeString('<cols>');\n for (let i = 0; i < columnCount; i++) {\n const width = defaultColWidth(colWidths[i]);\n sink.writeString(`<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${formatColumnWidth(width)}\" bestFit=\"1\" customWidth=\"1\" />`);\n }\n sink.writeString('</cols><sheetData>');\n}\n\n/**\n * Finish the sheet. Returns the autofilter range for the workbook's defined\n * name, or null when no autofilter was written.\n */\nexport function writeXlsxSheetTail(\n sink: TextByteSink,\n options: {\n doAutofilter: boolean;\n columnCount: number;\n lastColumnLetter: string;\n rowNum: number;\n sheetName: string;\n merges?: string[];\n hyperlinks?: Array<{ spec: HyperlinkSpec; rId?: string }>;\n dataValidations?: DataValidationSpec[];\n conditionalFormats?: ConditionalFormatSpec[];\n legacyDrawingRId?: string;\n cfPriorityStart?: number;\n /** Register a differential style for conditional formatting. */\n registerDxf?: (style: CellStyle) => number;\n },\n): string | null {\n const {\n doAutofilter, columnCount, lastColumnLetter, rowNum, sheetName,\n merges, hyperlinks, dataValidations, conditionalFormats,\n legacyDrawingRId, cfPriorityStart = 1, registerDxf,\n } = options;\n sink.writeString('</sheetData>');\n\n let filterRange: string | null = null;\n if (doAutofilter && columnCount > 0) {\n const ref = `A1:${lastColumnLetter}${rowNum}`;\n sink.writeString(`<autoFilter ref=\"${ref}\"/>`);\n filterRange = `${formatSheetNameForFormula(sheetName)}!$A$1:$${lastColumnLetter}$${rowNum}`;\n }\n\n if (merges && merges.length > 0) {\n sink.writeString(`<mergeCells count=\"${merges.length}\">`);\n for (const ref of merges) sink.writeString(`<mergeCell ref=\"${escapeXmlText(ref)}\"/>`);\n sink.writeString('</mergeCells>');\n }\n if (conditionalFormats && conditionalFormats.length > 0) {\n writeConditionalFormatting(sink, conditionalFormats, cfPriorityStart, registerDxf);\n }\n if (dataValidations && dataValidations.length > 0) {\n writeDataValidations(sink, dataValidations);\n }\n if (hyperlinks && hyperlinks.length > 0) {\n writeHyperlinks(sink, hyperlinks);\n }\n if (legacyDrawingRId) {\n sink.writeString(`<legacyDrawing r:id=\"${legacyDrawingRId}\"/>`);\n }\n\n sink.writeString('</worksheet>');\n return filterRange;\n}\n\nfunction columnLetterFromRef(ref: string): { col: number; row: number } {\n const match = /^([A-Za-z]{1,3})(\\d+)$/.exec(ref.trim());\n if (!match) throw new Error(`Invalid cell reference '${ref}'`);\n let col = 0;\n for (const ch of match[1].toUpperCase()) col = col * 26 + (ch.charCodeAt(0) - 64);\n return { col: col - 1, row: parseInt(match[2], 10) - 1 };\n}\n\nexport function buildXlsxComments(comments: CommentSpec[]): string {\n const authors: string[] = [];\n const authorIds = new Map<string, number>();\n for (const comment of comments) {\n const author = comment.author ?? '';\n if (!authorIds.has(author)) {\n authorIds.set(author, authors.length);\n authors.push(author);\n }\n }\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n xml += '<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><authors>';\n for (const author of authors) xml += `<author>${escapeXlsxText(author)}</author>`;\n xml += '</authors><commentList>';\n for (const comment of comments) {\n const text = escapeXlsxText(comment.text);\n const space = text.length > 0 && (text[0] === ' ' || text[text.length - 1] === ' ' || /[\\t\\n\\r]/.test(text))\n ? ' xml:space=\"preserve\"'\n : '';\n xml += `<comment ref=\"${escapeXmlText(comment.ref)}\" authorId=\"${authorIds.get(comment.author ?? '')}\"><text><t${space}>${text}</t></text></comment>`;\n }\n xml += '</commentList></comments>';\n return xml;\n}\n\nexport function buildXlsxCommentsVml(comments: CommentSpec[]): string {\n const V = 'urn:schemas-microsoft-com:vml';\n const O = 'urn:schemas-microsoft-com:office:office';\n const X = 'urn:schemas-microsoft-com:office:excel';\n let xml = `<xml xmlns:v=\"${V}\" xmlns:o=\"${O}\" xmlns:x=\"${X}\">`;\n xml += `<v:shapetype id=\"_x0000_t202\" coordsize=\"21600,21600\" o:spt=\"202\" path=\"m,l,21600r21600,l21600,xe\">`\n + '<v:stroke joinstyle=\"miter\"/><v:path gradientshapeok=\"t\" o:connecttype=\"rect\"/></v:shapetype>';\n let nextId = 1025;\n for (const comment of comments) {\n const { col, row } = columnLetterFromRef(comment.ref);\n xml += `<v:shape id=\"_x0000_s${nextId++}\" type=\"#_x0000_t202\" `\n + 'style=\"position:absolute;margin-left:59.25pt;margin-top:1.5pt;width:108pt;height:59.25pt;z-index:1;visibility:hidden\" '\n + 'fillcolor=\"#ffffe1\" o:insetmode=\"auto\"><v:fill color2=\"#ffffe1\"/>'\n + '<v:shadow on=\"t\" color=\"black\" obscured=\"t\"/><v:path o:connecttype=\"none\"/>'\n + '<v:textbox style=\"mso-direction-alt:auto\"><div style=\"text-align:left\"/></v:textbox>'\n + `<x:ClientData ObjectType=\"Note\"><x:MoveWithCells/><x:SizeWithCells/><x:AutoFill>False</x:AutoFill>`\n + `<x:Row>${row}</x:Row><x:Column>${col}</x:Column></x:ClientData></v:shape>`;\n }\n xml += '</xml>';\n return xml;\n}\n\n/** Worksheet relationships part for hyperlinks and the comment VML drawing. */\nexport function buildXlsxSheetRels(\n rels: Array<{ id: string; type: string; target: string; external?: boolean }>,\n): string {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n xml += '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">';\n for (const rel of rels) {\n xml += `<Relationship Id=\"${rel.id}\" Type=\"${rel.type}\" Target=\"${escapeXlsxAttribute(rel.target)}\"`;\n if (rel.external) xml += ' TargetMode=\"External\"';\n xml += '/>';\n }\n xml += '</Relationships>';\n return xml;\n}\n\nexport const XLSX_REL_HYPERLINK = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink';\nexport const XLSX_REL_VML = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing';\nexport const XLSX_REL_COMMENTS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments';\nexport function writeXlsxSharedStringCell(\n sink: TextByteSink,\n sst: { values: SharedStringValue[]; index: Map<string, number> },\n value: SharedStringValue,\n ref: string,\n styleOverride?: number,\n): void {\n const key = sharedStringKey(value);\n let index = sst.index.get(key);\n if (index === undefined) {\n index = sst.values.length;\n sst.values.push(value);\n sst.index.set(key, index);\n }\n const styleAttr = styleOverride !== undefined ? ` s=\"${styleOverride}\"` : '';\n sink.writeString(`<c${ref} t=\"s\"${styleAttr}><v>${index}</v></c>`);\n}\n\n/** Write one inline string cell (plain or rich text). */\nexport function writeXlsxInlineStringCell(\n sink: TextByteSink,\n value: SharedStringValue,\n ref: string,\n styleOverride?: number,\n): void {\n const styleAttr = styleOverride !== undefined ? ` s=\"${styleOverride}\"` : '';\n if (typeof value !== 'string') {\n sink.writeString(`<c${ref} t=\"inlineStr\"${styleAttr}><is>${richTextXml(value)}</is></c>`);\n return;\n }\n const clean = escapeXlsxText(value);\n if (clean.length > 0 &&\n (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean))) {\n sink.writeString(`<c${ref} t=\"inlineStr\"${styleAttr}><is><t xml:space=\"preserve\">${clean}</t></is></c>`);\n } else {\n sink.writeString(`<c${ref} t=\"inlineStr\"${styleAttr}><is><t>${clean}</t></is></c>`);\n }\n}\n\nexport interface HyperlinkSpec {\n /** Cell reference, e.g. `A1`. */\n ref: string;\n /** External URL (needs a worksheet relationship). */\n target?: string;\n /** Internal location, e.g. `Other!A1`. */\n location?: string;\n tooltip?: string;\n display?: string;\n}\n\nexport interface DataValidationSpec {\n sqref: string;\n type: 'whole' | 'decimal' | 'list' | 'date' | 'time' | 'textLength' | 'custom';\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'lessThan'\n | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual';\n formula1?: string;\n formula2?: string;\n /** For `type: 'list'`: literal values, emitted as a quoted comma list. */\n values?: string[];\n allowBlank?: boolean;\n showDropdown?: boolean;\n showInputMessage?: boolean;\n promptTitle?: string;\n prompt?: string;\n showErrorMessage?: boolean;\n errorTitle?: string;\n error?: string;\n errorStyle?: 'stop' | 'warning' | 'information';\n}\n\nexport type ConditionalFormatRule =\n | {\n type: 'cellIs';\n operator: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'lessThan'\n | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual';\n formula: string[];\n style?: CellStyle;\n stopIfTrue?: boolean;\n }\n | {\n type: 'expression';\n formula: string;\n style?: CellStyle;\n stopIfTrue?: boolean;\n }\n | {\n type: 'colorScale';\n cfvo: Array<{ type: 'min' | 'max' | 'num' | 'percent' | 'percentile' | 'formula'; value?: string }>;\n colors: string[];\n }\n | {\n type: 'dataBar';\n cfvo: Array<{ type: 'min' | 'max' | 'num' | 'percent' | 'percentile' | 'formula'; value?: string }>;\n color: string;\n showValue?: boolean;\n }\n | {\n type: 'iconSet';\n iconSet?: '3Arrows' | '3ArrowsGray' | '3Flags' | '3TrafficLights1' | '3TrafficLights2'\n | '3Signs' | '3Symbols' | '3Symbols2' | '4Arrows' | '4ArrowsGray' | '4RedToBlack'\n | '4Rating' | '4TrafficLights' | '5Arrows' | '5ArrowsGray' | '5Rating' | '5Quarters';\n cfvo?: Array<{ type: 'percent' | 'num' | 'percentile'; value?: string }>;\n showValue?: boolean;\n reverse?: boolean;\n }\n | {\n type: 'top10';\n rank?: number;\n percent?: boolean;\n bottom?: boolean;\n style?: CellStyle;\n }\n | {\n type: 'duplicateValues' | 'uniqueValues';\n style?: CellStyle;\n }\n | {\n type: 'containsText' | 'notContainsText' | 'beginsWith' | 'endsWith';\n text: string;\n style?: CellStyle;\n };\n\nexport interface ConditionalFormatSpec {\n sqref: string;\n rules: ConditionalFormatRule[];\n}\n\nexport interface CommentSpec {\n ref: string;\n text: string;\n author?: string;\n /** Server-side comment GUID, when the comment came from another system. */\n guid?: string;\n}\n\nexport interface XlsxSheetFeatures {\n merges?: string[];\n hyperlinks?: HyperlinkSpec[];\n dataValidations?: DataValidationSpec[];\n conditionalFormats?: ConditionalFormatSpec[];\n comments?: CommentSpec[];\n}\n\nconst DV_TYPES: Record<DataValidationSpec['type'], string> = {\n whole: 'whole', decimal: 'decimal', list: 'list', date: 'date',\n time: 'time', textLength: 'textLength', custom: 'custom',\n};\n\nconst DV_OPERATORS: Record<NonNullable<DataValidationSpec['operator']>, string> = {\n between: 'between', notBetween: 'notBetween', equal: 'equal', notEqual: 'notEqual',\n lessThan: 'lessThan', lessThanOrEqual: 'lessThanOrEqual',\n greaterThan: 'greaterThan', greaterThanOrEqual: 'greaterThanOrEqual',\n};\n\nfunction writeDataValidations(sink: TextByteSink, validations: DataValidationSpec[]): void {\n if (validations.length === 0) return;\n sink.writeString(`<dataValidations count=\"${validations.length}\">`);\n for (const rule of validations) {\n let attrs = ` type=\"${DV_TYPES[rule.type]}\" sqref=\"${escapeXmlText(rule.sqref)}\"`;\n if (rule.operator !== undefined) attrs += ` operator=\"${DV_OPERATORS[rule.operator]}\"`;\n if (rule.allowBlank) attrs += ' allowBlank=\"1\"';\n if (rule.showDropdown === false) attrs += ' showDropDown=\"1\"';\n if (rule.showInputMessage) attrs += ' showInputMessage=\"1\"';\n if (rule.showErrorMessage) attrs += ' showErrorMessage=\"1\"';\n if (rule.errorStyle !== undefined) attrs += ` errorStyle=\"${rule.errorStyle}\"`;\n if (rule.promptTitle !== undefined) attrs += ` promptTitle=\"${escapeXlsxAttribute(rule.promptTitle)}\"`;\n if (rule.prompt !== undefined) attrs += ` prompt=\"${escapeXlsxAttribute(rule.prompt)}\"`;\n if (rule.errorTitle !== undefined) attrs += ` errorTitle=\"${escapeXlsxAttribute(rule.errorTitle)}\"`;\n if (rule.error !== undefined) attrs += ` error=\"${escapeXlsxAttribute(rule.error)}\"`;\n sink.writeString(`<dataValidation${attrs}>`);\n if (rule.values !== undefined) {\n const list = rule.values.map(value => value.replace(/\"/g, '\"\"')).join(',');\n sink.writeString(`<formula1>\"${escapeXmlText(list)}\"</formula1>`);\n } else if (rule.formula1 !== undefined) {\n sink.writeString(`<formula1>${escapeXmlText(rule.formula1.replace(/^=/, ''))}</formula1>`);\n }\n if (rule.formula2 !== undefined) {\n sink.writeString(`<formula2>${escapeXmlText(rule.formula2.replace(/^=/, ''))}</formula2>`);\n }\n sink.writeString('</dataValidation>');\n }\n sink.writeString('</dataValidations>');\n}\n\nfunction firstCellOfSqref(sqref: string): string {\n const range = sqref.trim().split(/\\s+/)[0] ?? 'A1';\n return range.split(':')[0] || 'A1';\n}\n\nfunction writeConditionalFormatting(\n sink: TextByteSink,\n groups: ConditionalFormatSpec[],\n startPriority: number,\n registerDxf?: (style: CellStyle) => number,\n): void {\n let priority = startPriority;\n for (const group of groups) {\n sink.writeString(`<conditionalFormatting sqref=\"${escapeXmlText(group.sqref)}\">`);\n const firstCell = firstCellOfSqref(group.sqref);\n for (const rule of group.rules) {\n const current = priority++;\n const dxfIndex = 'style' in rule && rule.style\n ? (registerDxf?.(rule.style) ?? -1)\n : -1;\n const dxfAttr = dxfIndex >= 0 ? ` dxfId=\"${dxfIndex}\"` : '';\n switch (rule.type) {\n case 'cellIs': {\n let attrs = ` type=\"cellIs\" operator=\"${rule.operator}\" priority=\"${current}\"${dxfAttr}`;\n if (rule.stopIfTrue) attrs += ' stopIfTrue=\"1\"';\n sink.writeString(`<cfRule${attrs}>`);\n for (const formula of rule.formula) {\n sink.writeString(`<formula>${escapeXmlText(formula.replace(/^=/, ''))}</formula>`);\n }\n sink.writeString('</cfRule>');\n break;\n }\n case 'expression': {\n let attrs = ` type=\"expression\" priority=\"${current}\"${dxfAttr}`;\n if (rule.stopIfTrue) attrs += ' stopIfTrue=\"1\"';\n sink.writeString(`<cfRule${attrs}><formula>${escapeXmlText(rule.formula.replace(/^=/, ''))}</formula></cfRule>`);\n break;\n }\n case 'colorScale': {\n sink.writeString(`<cfRule type=\"colorScale\" priority=\"${current}\"><colorScale>`);\n for (const point of rule.cfvo) {\n sink.writeString(`<cfvo type=\"${point.type}\"${point.value !== undefined ? ` val=\"${escapeXmlText(point.value)}\"` : ''}/>`);\n }\n for (const color of rule.colors) {\n sink.writeString(`<color rgb=\"${colorKey(color).slice(4)}\"/>`);\n }\n sink.writeString('</colorScale></cfRule>');\n break;\n }\n case 'dataBar': {\n sink.writeString(`<cfRule type=\"dataBar\" priority=\"${current}\"><dataBar${rule.showValue === false ? ' showValue=\"0\"' : ''}>`);\n for (const point of rule.cfvo) {\n sink.writeString(`<cfvo type=\"${point.type}\"${point.value !== undefined ? ` val=\"${escapeXmlText(point.value)}\"` : ''}/>`);\n }\n sink.writeString(`<color rgb=\"${colorKey(rule.color).slice(4)}\"/></dataBar></cfRule>`);\n break;\n }\n case 'iconSet': {\n let attrs = ` type=\"iconSet\" priority=\"${current}\"`;\n if (rule.showValue === false) attrs += ' showValue=\"0\"';\n if (rule.reverse) attrs += ' reverse=\"1\"';\n sink.writeString(`<cfRule${attrs}><iconSet iconSet=\"${rule.iconSet ?? '3TrafficLights1'}\">`);\n for (const point of rule.cfvo ?? []) {\n sink.writeString(`<cfvo type=\"${point.type}\"${point.value !== undefined ? ` val=\"${escapeXmlText(point.value)}\"` : ''}/>`);\n }\n sink.writeString('</iconSet></cfRule>');\n break;\n }\n case 'top10': {\n let attrs = ` type=\"top10\" priority=\"${current}\"${dxfAttr}`;\n if (rule.rank !== undefined) attrs += ` rank=\"${rule.rank}\"`;\n if (rule.percent) attrs += ' percent=\"1\"';\n if (rule.bottom) attrs += ' bottom=\"1\"';\n sink.writeString(`<cfRule${attrs}/>`);\n break;\n }\n case 'duplicateValues':\n case 'uniqueValues':\n sink.writeString(`<cfRule type=\"${rule.type}\" priority=\"${current}\"${dxfAttr}/>`);\n break;\n case 'containsText':\n case 'notContainsText':\n case 'beginsWith':\n case 'endsWith': {\n const operator = rule.type === 'containsText' ? 'containsText'\n : rule.type === 'notContainsText' ? 'notContains'\n : rule.type === 'beginsWith' ? 'beginsWith' : 'endsWith';\n const escaped = rule.text.replace(/\"/g, '\"\"');\n sink.writeString(`<cfRule type=\"${rule.type}\" operator=\"${operator}\" text=\"${escapeXlsxAttribute(rule.text)}\" priority=\"${current}\"${dxfAttr}><formula>${escapeXmlText(`NOT(ISERROR(SEARCH(\"${escaped}\",${firstCell})))`)}</formula></cfRule>`);\n break;\n }\n }\n }\n sink.writeString('</conditionalFormatting>');\n }\n}\n\nfunction writeHyperlinks(\n sink: TextByteSink,\n links: Array<{ spec: HyperlinkSpec; rId?: string }>,\n): void {\n if (links.length === 0) return;\n sink.writeString('<hyperlinks>');\n for (const { spec, rId } of links) {\n let attrs = ` ref=\"${escapeXmlText(spec.ref)}\"`;\n if (rId) attrs += ` r:id=\"${rId}\"`;\n if (spec.location !== undefined) attrs += ` location=\"${escapeXlsxAttribute(spec.location)}\"`;\n if (spec.tooltip !== undefined) attrs += ` tooltip=\"${escapeXlsxAttribute(spec.tooltip)}\"`;\n if (spec.display !== undefined) attrs += ` display=\"${escapeXlsxAttribute(spec.display)}\"`;\n sink.writeString(`<hyperlink${attrs}/>`);\n }\n sink.writeString('</hyperlinks>');\n}\n\nexport interface XlsxCellContext {\n /** Write a string using the table selected by the writer (shared/inline). */\n writeStringCell(sink: TextByteSink, value: SharedStringValue, ref: string, styleOverride?: number): void;\n /** Register a full cell style and return its cellXfs index. */\n registerStyle(style: CellStyle): number;\n /** Register a plain number format and return its cellXfs index. */\n registerFormat(format: string): number;\n toOaDate(date: Date): number;\n}\n\nfunction writeFormulaCell(\n sink: TextByteSink,\n context: XlsxCellContext,\n cell: FormulaCell,\n ref: string,\n styleAttr: string,\n dateStyle: number,\n dateTimeStyle: number,\n): void {\n const formula = cell.formula.trim().replace(/^=/, '');\n if (!formula) throw new Error('FormulaCell.formula must not be empty');\n const cached = cell.value;\n let typeAttr = '';\n let cachedXml = '';\n\n if (cached instanceof ExcelError) {\n typeAttr = ' t=\"e\"';\n cachedXml = `<v>${escapeXmlText(cached.code)}</v>`;\n } else if (cached instanceof Date) {\n const serial = context.toOaDate(cached);\n // A caller-supplied style already says how the date is shown.\n const effectiveStyle = styleAttr\n || ` s=\"${dateHasTime(cached) ? dateTimeStyle : dateStyle}\"`;\n sink.writeString(`<c${ref}${effectiveStyle}><f>${escapeXmlText(formula)}</f><v>${serial}</v></c>`);\n return;\n } else if (typeof cached === 'number' && Number.isFinite(cached)) {\n cachedXml = `<v>${cached}</v>`;\n } else if (typeof cached === 'boolean') {\n typeAttr = ' t=\"b\"';\n cachedXml = `<v>${cached ? 1 : 0}</v>`;\n } else if (cached !== null && cached !== undefined) {\n typeAttr = ' t=\"str\"';\n cachedXml = `<v>${escapeXmlText(String(cached))}</v>`;\n }\n\n sink.writeString(`<c${ref}${typeAttr}${styleAttr}><f>${escapeXmlText(formula)}</f>${cachedXml}</c>`);\n}\n\n/**\n * Write one cell. Returns the column of the last written cell, which the caller\n * passes back as `prevCol`; null cells write nothing and leave it unchanged.\n */\nexport function writeXlsxCell(\n sink: TextByteSink,\n context: XlsxCellContext,\n raw: CellValue,\n col: number,\n prevCol: number,\n colLetter: string,\n rowNum: number,\n dateStyle: number = 1,\n dateTimeStyle: number = 2,\n): number {\n if (raw === null || raw === undefined) return prevCol;\n\n const style = getCellStyle(raw);\n const xfIdx = style !== null ? context.registerStyle(style) : -1;\n const styleAttr = xfIdx > 0 ? ` s=\"${xfIdx}\"` : '';\n const ref = cellRefAttr(col, prevCol, colLetter, rowNum);\n const stringStyle = xfIdx > 0 ? xfIdx : undefined;\n\n const formula = getFormula(raw);\n if (formula !== null) {\n writeFormulaCell(sink, context, raw as FormulaCell, ref, styleAttr, dateStyle, dateTimeStyle);\n return col;\n }\n\n const value = unwrapCell(raw);\n if (value === null || value === undefined) return prevCol;\n\n if (isRichText(value)) {\n context.writeStringCell(sink, value, ref, stringStyle);\n } else if (typeof value === 'number') {\n if (Number.isFinite(value)) {\n sink.writeString(`<c${ref}${styleAttr}><v>${value}</v></c>`);\n } else {\n context.writeStringCell(sink, value.toString(), ref, stringStyle);\n }\n } else if (value instanceof ExcelError) {\n sink.writeString(`<c${ref} t=\"e\"${styleAttr}><v>${escapeXmlText(value.code)}</v></c>`);\n } else if (typeof value === 'bigint') {\n context.writeStringCell(sink, value.toString(), ref, stringStyle);\n } else if (typeof value === 'boolean') {\n sink.writeString(`<c${ref} t=\"b\"${styleAttr}><v>${value ? 1 : 0}</v></c>`);\n } else if (value instanceof Date) {\n const oaDate = context.toOaDate(value);\n if (Number.isFinite(oaDate)) {\n const finalStyle = xfIdx > 0\n ? xfIdx\n : (dateHasTime(value) ? dateTimeStyle : dateStyle);\n sink.writeString(`<c${ref} s=\"${finalStyle}\"><v>${oaDate}</v></c>`);\n } else {\n context.writeStringCell(sink, value.toString(), ref, stringStyle);\n }\n } else {\n context.writeStringCell(sink, value.toString(), ref, stringStyle);\n }\n\n return col;\n}\n","/**\n * Low-level BIFF12 (XLSB) record helpers shared by readers and the XlsbUpdater.\n *\n * A BIFF12 record is: VLQ(id) + VLQ(length) + payload[length].\n */\n\n/** Map an Excel error display text to its BIFF12 error code. */\nexport function excelErrorToBiffCode(code: string): number {\n switch (code) {\n case '#NULL!': return 0x00;\n case '#DIV/0!': return 0x07;\n case '#VALUE!': return 0x0f;\n case '#REF!': return 0x17;\n case '#NAME?': return 0x1d;\n case '#NUM!': return 0x24;\n case '#N/A': return 0x2a;\n case '#GETTING_DATA': return 0x2b;\n default: return 0x0f; // #VALUE!, which is what Excel uses for unknown codes\n }\n}\n\n/** Map a BIFF12 error code to the text Excel displays. */\nexport function biffCodeToExcelError(code: number): string {\n switch (code) {\n case 0x00: return '#NULL!';\n case 0x07: return '#DIV/0!';\n case 0x0f: return '#VALUE!';\n case 0x17: return '#REF!';\n case 0x1d: return '#NAME?';\n case 0x24: return '#NUM!';\n case 0x2a: return '#N/A';\n case 0x2b: return '#GETTING_DATA';\n default: return '#VALUE!';\n }\n}\n\n/** Decode a 7-bit VLQ integer at `pos`. Returns the value and the next byte offset. */\nexport function readVlq(buf: Buffer, pos: number): { value: number; nextPos: number } {\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n byte = buf[pos++];\n value |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n return { value, nextPos: pos };\n}\n\n/** Number of bytes needed to VLQ-encode `value`. */\nexport function vlqLength(value: number): number {\n let n = 1;\n while (value >= 0x80) {\n n++;\n value >>>= 7;\n }\n return n;\n}\n\n/** Encode `value` as a 7-bit VLQ byte array. */\nexport function vlqBytes(value: number): number[] {\n const out: number[] = [];\n while (value >= 0x80) {\n out.push((value & 0x7f) | 0x80);\n value >>>= 7;\n }\n out.push(value & 0x7f);\n return out;\n}\n\n/** A single BIFF12 record view (byte offsets into the source buffer). */\nexport interface Biff12Record {\n /** Byte offset of the record header (id + length). */\n headerStart: number;\n /** Byte offset just past the header — the payload starts here. */\n dataStart: number;\n /** Byte offset just past the payload. */\n dataEnd: number;\n id: number;\n len: number;\n}\n\n/**\n * Fill `rec` with the record starting at `pos`. Returns false when the buffer\n * is exhausted or the record would run past the end.\n */\nexport function readRecord(buf: Buffer, pos: number, rec: Biff12Record): boolean {\n const idRes = readVlq(buf, pos);\n if (idRes.nextPos > buf.length) return false;\n const lenRes = readVlq(buf, idRes.nextPos);\n if (lenRes.nextPos + lenRes.value > buf.length) return false;\n\n rec.headerStart = pos;\n rec.dataStart = lenRes.nextPos;\n rec.dataEnd = lenRes.nextPos + lenRes.value;\n rec.id = idRes.value;\n rec.len = lenRes.value;\n return true;\n}\n\n/** Build a BIFF12 record from an id and payload buffer. */\nexport function buildRecord(id: number, payload: Buffer): Buffer {\n const idBytes = vlqBytes(id);\n const lenBytes = vlqBytes(payload.length);\n const header = Buffer.alloc(idBytes.length + lenBytes.length);\n idBytes.forEach((b, i) => (header[i] = b));\n lenBytes.forEach((b, i) => (header[idBytes.length + i] = b));\n return Buffer.concat([header, payload]);\n}\n\n/** Read a UTF-16LE string of `charCount` characters starting at `start`. */\nexport function readUtf16(buf: Buffer, start: number, charCount: number): string {\n const end = start + charCount * 2;\n if (end > buf.length) return '';\n return buf.toString('utf16le', start, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.bin.\n * Returns the string values in order, the SST counters, and the byte offset of\n * the BrtEndSst record where new items must be inserted.\n */\nexport function parseSharedStringsBin(buf: Buffer): {\n values: string[];\n total: number;\n unique: number;\n endSstOffset: number;\n} {\n const values: string[] = [];\n let total = 0;\n let unique = 0;\n let endSstOffset = buf.length;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x009f) {\n total = buf.readUInt32LE(rec.dataStart);\n unique = buf.readUInt32LE(rec.dataStart + 4);\n } else if (rec.id === 0x0013) {\n const cch = buf.readUInt32LE(rec.dataStart + 1);\n values.push(readUtf16(buf, rec.dataStart + 5, cch));\n } else if (rec.id === 0x00a0) {\n endSstOffset = rec.headerStart;\n }\n }\n return { values, total, unique, endSstOffset };\n}\n","/**\n * Shared BIFF12 (XLSB) record serialization.\n *\n * Both the Node and the browser XLSB writers use these functions, so a cell\n * written in Node and the same cell written in a browser produce identical\n * bytes. The module has no platform imports.\n */\nimport { ByteSink } from './ByteSink';\nimport { excelErrorToBiffCode } from '../../biff12Utils';\n\nfunction decodeBase64(base64: string): Uint8Array {\n const binary = atob(base64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n/**\n * Base `xl/styles.bin`: 2 fonts, 2 fills, 1 border, 6 cell XFs\n * (normal, date, datetime, bold, fill, bold+fill), and the two custom date\n * formats (164, 166). Custom cell formats are appended by\n * {@link buildXlsbStylesBin}.\n */\nexport const XLSB_STYLES_TEMPLATE: Uint8Array = decodeBase64(\n 'lgIA5wQEAgAAACwspAATAAAAeQB5AHkAeQBcAC0AbQBtAFwALQBkAGQAXAAgAGgAaAA6AG0AbQAsHqYADAAAAHkAeQB5AHkAXAAtAG0AbQBcAC0AZABkAOgEAOMEBAIAAAArJ9wAAACQAQAAAAIAAAcBAAAAAAD/AgcAAABDAGEAbABpAGIAcgBpACsn3AABALwCAAAAAu4ABwEAAAAAAP8CBwAAAEMAYQBsAGkAYgByAGkAJQYBAAIOAICBCAAmAOQEANsEBAIAAAAtRAAAAAADQAAAAAAA/wNBAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALUQRAAAAA0AAAAAAAP8DQQAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwEAOUEBAEAAAAuMwAAAAEAAAAAAAAAAAABAAAAAAAAAAAAAQAAAAAAAAAAAAEAAAAAAAAAAAABAAAAAAAAAOYEAPIEBAEAAAAvEP//AAAAAAAAAAAAABAQAADzBADpBAQGAAAALxAAAAAAAAAAAAAAAAAQEAAALxAAAKQAAAAAAAAAAAAQEAEALxAAAKYAAAAAAAAAAAAQEAEALxAAAAAAAQAAAAAAAAAQEAEALxAAAAAAAAABAAAAAAAQEAEALxAAAAAAAQABAAAAAAAQEAEA6gQA6wQEAQAAACUGAQACEQCAgBgQAAAAAAAAAAAAAAAAAAAAACYAMBwAAAAAAQAAAAgAAABOAG8AcgBtAGEAbABuAHkA7AQA+QMEAAAAAPoDAPwDUAAAAAARAAAAVABhAGIAbABlAFMAdAB5AGwAZQBNAGUAZABpAHUAbQAyABEAAABQAGkAdgBvAHQAUwB0AHkAbABlAEwAaQBnAGgAdAAxADYA/QMAIwQCDgAA6wgA9ggqAAAAABEAAABTAGwAaQBjAGUAcgBTAHQAeQBsAGUATABpAGcAaAB0ADEA9wgA7AgAJAAjBAMPAACwEACyEDIAAAAAFQAAAFQAaQBtAGUAUwBsAGkAYwBlAHIAUwB0AHkAbABlAEwAaQBnAGgAdAAxALMQALEQACQAlwIA',\n);\n\n/** Cell XFs that always exist in {@link XLSB_STYLES_TEMPLATE}. */\nexport const XLSB_BASE_XF_COUNT = 6;\n\nexport function concat(chunks: Uint8Array[]): Uint8Array {\n let total = 0;\n for (const chunk of chunks) total += chunk.length;\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nfunction encodeVlq(value: number): number[] {\n const result: number[] = [];\n while (value >= 0x80) {\n result.push((value & 0x7f) | 0x80);\n value >>>= 7;\n }\n result.push(value & 0x7f);\n return result;\n}\n\nexport function buildBrtRecord(type: number, data: Uint8Array): Uint8Array {\n const header = [...encodeVlq(type), ...encodeVlq(data.length)];\n return concat([new Uint8Array(header), data]);\n}\n\nfunction buildStFmtRecord(ifmt: number, formatString: string): Uint8Array {\n const cch = formatString.length;\n const remaining = 2 + 4 + cch * 2;\n const data = new Uint8Array(2 + remaining);\n data[0] = 0x2c;\n data[1] = remaining;\n const view = new DataView(data.buffer);\n view.setUint16(2, ifmt, true);\n view.setUint32(4, cch, true);\n for (let i = 0; i < cch; i++) {\n const code = formatString.charCodeAt(i);\n data[8 + i * 2] = code & 0xff;\n data[9 + i * 2] = (code >> 8) & 0xff;\n }\n return data;\n}\n\nfunction buildXfRecord(fontId: number, ifmt: number, flags: number, byte6Extra: number = 0): Uint8Array {\n const data = new Uint8Array(18);\n data[0] = 0x2f;\n data[1] = 16;\n const view = new DataView(data.buffer);\n view.setUint16(2, fontId, true);\n view.setUint16(4, ifmt, true);\n data[6] = byte6Extra;\n data[14] = 0x10;\n data[15] = 0x10;\n view.setUint16(16, flags, true);\n return data;\n}\n\nexport interface XlsbFormatRecord {\n numfmtId: number;\n xfIndex: number;\n}\n\n/**\n * Build `xl/styles.bin`, appending custom number formats after the six base\n * XFs. Returns the template untouched when there are no custom formats.\n */\nexport function buildXlsbStylesBin(\n template: Uint8Array,\n formats: Map<string, XlsbFormatRecord>,\n): Uint8Array {\n if (formats.size === 0) return template;\n\n const base = template;\n\n let fontEndOff = -1;\n for (let i = 3; i < base.length - 3; i++) {\n if (base[i] === 0xe8 && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n fontEndOff = i;\n break;\n }\n }\n\n let xfBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xe9 && base[i + 1] === 0x04) {\n xfBeginOff = i;\n break;\n }\n }\n\n let xfEndOff = -1;\n for (let i = xfBeginOff; i < base.length - 3; i++) {\n if (base[i] === 0xea && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n xfEndOff = i;\n break;\n }\n }\n\n let fillBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xe3 && base[i + 1] === 0x04) {\n fillBeginOff = i;\n break;\n }\n }\n\n const xfBeginBody = xfBeginOff + 3 + 4; // record header + uint16 count + 2 pad bytes\n const baseXfRecords = base.subarray(xfBeginBody, xfEndOff);\n const totalFmt = 2 + formats.size;\n const totalXf = XLSB_BASE_XF_COUNT + formats.size;\n\n const parts: Uint8Array[] = [];\n\n parts.push(base.subarray(0, 3));\n\n const fmtHeader = new Uint8Array(4);\n new DataView(fmtHeader.buffer).setUint16(0, totalFmt, true);\n parts.push(buildBrtRecord(0x0267, fmtHeader));\n\n parts.push(buildStFmtRecord(164, 'yyyy\\\\-mm\\\\-dd\\\\ hh:mm'));\n parts.push(buildStFmtRecord(166, 'yyyy\\\\-mm\\\\-dd'));\n for (const [formatString, record] of formats) {\n parts.push(buildStFmtRecord(record.numfmtId, formatString));\n }\n\n parts.push(buildBrtRecord(0x0268, new Uint8Array(0)));\n parts.push(base.subarray(fillBeginOff, xfBeginOff));\n\n const xfHeader = new Uint8Array(4);\n new DataView(xfHeader.buffer).setUint16(0, totalXf, true);\n parts.push(buildBrtRecord(0x0269, xfHeader));\n\n parts.push(baseXfRecords);\n\n const sorted = [...formats.entries()].sort((a, b) => a[1].xfIndex - b[1].xfIndex);\n for (const [, record] of sorted) {\n parts.push(buildXfRecord(0, record.numfmtId, 0x0001));\n }\n\n parts.push(buildBrtRecord(0x026a, new Uint8Array(0)));\n parts.push(base.subarray(xfEndOff + 3));\n\n return concat(parts);\n}\n\n/** BrtRowHdr (0x00), 27-byte payload. */\nexport function writeXlsbRowHeader(sink: ByteSink, rowNum: number, startCol: number, endCol: number): void {\n sink.ensureCapacity(27);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(25);\n sink.writeUnsafeInt32LE(rowNum);\n sink.writeUnsafeInt32LE(0);\n sink.writeUnsafeByte(44);\n sink.writeUnsafeByte(1);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(1);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeInt32LE(startCol);\n sink.writeUnsafeInt32LE(endCol);\n}\n\n/** BrtCellRk (0x02) holding an integer. */\nexport function writeXlsbRkInteger(sink: ByteSink, val: number, colNum: number, styleNum: number = 0): void {\n sink.ensureCapacity(14);\n sink.writeUnsafeByte(2);\n sink.writeUnsafeByte(12);\n sink.writeUnsafeInt32LE(colNum);\n sink.writeUnsafeByte(styleNum);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeInt32LE((val << 2) | 2);\n}\n\n/** BrtCellReal (0x05). */\nexport function writeXlsbDouble(sink: ByteSink, val: number, colNum: number, styleNum: number = 0): void {\n sink.ensureCapacity(18);\n sink.writeUnsafeByte(5);\n sink.writeUnsafeByte(16);\n sink.writeUnsafeInt32LE(colNum);\n sink.writeUnsafeByte(styleNum);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeDoubleLE(val);\n}\n\n/** BrtCellBool (0x04). */\nexport function writeXlsbBool(sink: ByteSink, val: boolean, colNum: number, styleNum: number = 0): void {\n sink.ensureCapacity(13);\n sink.writeUnsafeByte(0x04);\n sink.writeUnsafeByte(9);\n sink.writeUnsafeInt32LE(colNum);\n sink.writeUnsafeByte(styleNum);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(val ? 1 : 0);\n}\n\n/** BrtCellError (0x03): column, 24-bit style and the BIFF12 error code. */\nexport function writeXlsbError(sink: ByteSink, code: string, colNum: number, styleNum: number = 0): void {\n sink.ensureCapacity(13);\n sink.writeUnsafeByte(0x03);\n sink.writeUnsafeByte(9);\n sink.writeUnsafeInt32LE(colNum);\n sink.writeUnsafeByte(styleNum);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(excelErrorToBiffCode(code));\n}\n\n/** BrtCellIsst (0x07): shared-string index. */\nexport function writeXlsbIsst(sink: ByteSink, index: number, colNum: number, styleNum: number = 0): void {\n sink.ensureCapacity(17);\n sink.writeUnsafeByte(7);\n sink.writeUnsafeByte(12);\n sink.writeUnsafeInt32LE(colNum);\n sink.writeUnsafeByte(styleNum);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeInt32LE(index);\n}\n\n/** BrtCellSt (0x06): inline UTF-16 string. */\nexport function writeXlsbInlineString(sink: ByteSink, value: string, colNum: number, styleNum: number = 0): void {\n const cch = value.length;\n const len = 12 + cch * 2;\n sink.ensureCapacity(4 + len);\n sink.writeUnsafeByte(6);\n let length = len;\n while (length >= 0x80) {\n sink.writeUnsafeByte((length & 0x7f) | 0x80);\n length >>>= 7;\n }\n sink.writeUnsafeByte(length);\n sink.writeUnsafeInt32LE(colNum);\n sink.writeUnsafeByte(styleNum);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeByte(0);\n sink.writeUnsafeInt32LE(cch);\n sink.writeUtf16LE(value);\n}\n\n/**\n * Write the BrtBeginSst / BrtBundleSh-equivalent SST part. Kept byte-compatible\n * with the previous per-writer implementations.\n */\nexport function writeXlsbSharedStrings(\n sink: ByteSink,\n entries: Iterable<string>,\n countAll: number,\n countUnique: number,\n): void {\n sink.writeByte(159);\n sink.writeByte(1);\n sink.writeByte(8);\n\n sink.writeInt32LE(countAll);\n sink.writeInt32LE(countUnique);\n\n for (const text of entries) {\n const textLength = text.length;\n sink.writeByte(19);\n\n const recordLength = 5 + 2 * textLength;\n if (recordLength >= 128) {\n sink.writeByte(128 + (recordLength % 128));\n const high = recordLength >> 7;\n if (high >= 256) {\n sink.writeByte(128 + (high % 128));\n } else {\n sink.writeByte(high);\n }\n sink.writeByte(recordLength >> 14);\n if ((recordLength >> 14) > 0) sink.writeByte(0);\n } else {\n sink.writeByte(recordLength & 0xff);\n sink.writeByte((recordLength >> 8) & 0xff);\n }\n\n sink.writeInt32LE(textLength);\n sink.writeUtf16LE(text);\n }\n\n sink.writeByte(160);\n sink.writeByte(1);\n sink.writeByte(0);\n}\n","/**\n * XLSB cell style registry.\n *\n * Builds the BIFF12 records for fonts, fills, borders, number formats and cell\n * XFs, then rewrites the `xl/styles.bin` template with the registered custom\n * components appended after the six base XFs. Shared by the Node and browser\n * XLSB writers, so both produce identical bytes for the same styles.\n */\nimport {\n BorderSide,\n BorderStyle,\n CellStyle,\n FillStyle,\n FontStyle,\n StyleColor,\n} from '../../Formats';\nimport { normalizeStyle } from './xlsxParts';\nimport { buildBrtRecord, concat, XLSB_BASE_XF_COUNT } from './xlsbRecords';\n\nconst BRT_FONT = 0x002b;\nconst BRT_FMT = 0x002c;\nconst BRT_FILL = 0x002d;\nconst BRT_BORDER = 0x002e;\nconst BRT_XF = 0x002f;\n\nconst BRT_BEGIN_FMTS = 0x0267;\nconst BRT_END_FMTS = 0x0268;\nconst BRT_BEGIN_FONTS = 0x0263;\nconst BRT_END_FONTS = 0x0264;\nconst BRT_BEGIN_FILLS = 0x025b;\nconst BRT_END_FILLS = 0x025c;\nconst BRT_BEGIN_BORDERS = 0x0265;\nconst BRT_END_BORDERS = 0x0266;\nconst BRT_BEGIN_CELL_XFS = 0x0269;\nconst BRT_END_CELL_XFS = 0x026a;\nconst BRT_BEGIN_CELL_STYLE_XFS = 0x0272;\nconst BRT_END_CELL_STYLE_XFS = 0x0273;\n\nconst UNDERLINE_BYTES: Record<string, number> = {\n none: 0x00,\n single: 0x01,\n double: 0x02,\n singleAccounting: 0x21,\n doubleAccounting: 0x22,\n};\n\nconst BASELINE_BYTES: Record<string, number> = {\n baseline: 0,\n superscript: 1,\n subscript: 2,\n};\n\nconst PATTERN_BYTES: Record<string, number> = {\n none: 0,\n solid: 1,\n mediumGray: 2,\n darkGray: 3,\n lightGray: 4,\n darkHorizontal: 5,\n darkVertical: 6,\n darkDown: 7,\n darkUp: 8,\n darkGrid: 9,\n darkTrellis: 10,\n lightHorizontal: 11,\n lightVertical: 12,\n lightDown: 13,\n lightUp: 14,\n lightGrid: 15,\n lightTrellis: 16,\n gray125: 17,\n gray0625: 18,\n};\n\nconst BORDER_BYTES: Record<string, number> = {\n none: 0x00,\n thin: 0x01,\n medium: 0x02,\n dashed: 0x03,\n dotted: 0x04,\n thick: 0x05,\n double: 0x06,\n hair: 0x07,\n mediumDashed: 0x08,\n dashDot: 0x09,\n mediumDashDot: 0x0a,\n dashDotDot: 0x0b,\n mediumDashDotDot: 0x0c,\n slantDashDot: 0x0d,\n};\n\nconst HORIZONTAL_BYTES: Record<string, number> = {\n general: 0,\n left: 1,\n center: 2,\n right: 3,\n fill: 4,\n justify: 5,\n centerContinuous: 6,\n distributed: 7,\n};\n\nconst VERTICAL_BYTES: Record<string, number> = {\n top: 0,\n center: 1,\n bottom: 2,\n justify: 3,\n distributed: 4,\n};\n\nfunction u16(value: number): number[] {\n const v = value & 0xffff;\n return [v & 0xff, (v >>> 8) & 0xff];\n}\n\nfunction u32(value: number): number[] {\n const v = value >>> 0;\n return [v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff];\n}\n\nfunction utf16leBytes(text: string): number[] {\n const out: number[] = [];\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n out.push(code & 0xff, (code >>> 8) & 0xff);\n }\n return out;\n}\n\n/** BrtColor ([MS-XLSB] 2.4.334); all zeroes mean automatic. */\nfunction colorBytes(color: StyleColor | undefined): number[] {\n if (color === undefined) return [0, 0, 0, 0, 0, 0, 0, 0];\n if (typeof color === 'string') {\n let value = color.trim().replace(/^#/, '').toUpperCase();\n if (value.length === 6) value = `FF${value}`;\n if (!/^[0-9A-F]{8}$/.test(value)) {\n throw new Error(`Invalid color '${color}'. Use RRGGBB, AARRGGBB or '#' + hex.`);\n }\n const alpha = parseInt(value.slice(0, 2), 16);\n const red = parseInt(value.slice(2, 4), 16);\n const green = parseInt(value.slice(4, 6), 16);\n const blue = parseInt(value.slice(6, 8), 16);\n return [0x05, 0, 0, 0, red, green, blue, alpha];\n }\n if ('indexed' in color) {\n return [0x03, color.indexed & 0xff, 0, 0, 0, 0, 0, 0xff];\n }\n const tint = Math.max(-32768, Math.min(32767, Math.round((color.tint ?? 0) * 32767)));\n return [0x07, color.theme & 0xff, ...u16(tint), 0, 0, 0, 0xff];\n}\n\n/** BrtFont ([MS-XLSB] 2.4.683). */\nexport function buildXlsbFontRecord(font: FontStyle): Uint8Array {\n if (font.name !== undefined && font.name.length > 31) {\n throw new RangeError('XLSB font names are limited to 31 characters');\n }\n let flags = 0;\n if (font.bold) flags |= 0x01;\n if (font.italic) flags |= 0x02;\n if (font.strike) flags |= 0x08;\n if (font.outline) flags |= 0x10;\n if (font.shadow) flags |= 0x20;\n if (font.condense) flags |= 0x40;\n if (font.extend) flags |= 0x80;\n\n const height = Math.max(0x14, Math.min(0x1fff, Math.round((font.size ?? 11) * 20)));\n const baseline = BASELINE_BYTES[font.vertAlign ?? 'baseline'] ?? 0;\n const underline = font.underline === true\n ? UNDERLINE_BYTES.single\n : typeof font.underline === 'string'\n ? UNDERLINE_BYTES[font.underline] ?? 0\n : 0;\n\n const payload: number[] = [\n ...u16(height),\n ...u16(flags),\n ...u16(font.bold ? 700 : 400),\n ...u16(baseline),\n underline,\n font.family ?? 2,\n font.charset ?? 0,\n 0,\n ...colorBytes(font.color),\n ];\n let scheme = font.scheme === 'major' ? 1 : font.scheme === 'minor' ? 2 : 0;\n if (font.scheme === undefined && font.name === undefined) {\n // Default Calibri is the minor theme font; a named font without an\n // explicit scheme must not claim one.\n scheme = 2;\n }\n payload.push(scheme);\n const name = utf16leBytes(font.name ?? 'Calibri');\n payload.push(...u32(name.length / 2), ...name);\n return buildBrtRecord(BRT_FONT, Uint8Array.from(payload));\n}\n\n/** BrtFill ([MS-XLSB] 2.4.674). */\nexport function buildXlsbFillRecord(fill: FillStyle): Uint8Array {\n const payload: number[] = [\n ...u32(PATTERN_BYTES[fill.patternType ?? 'none'] ?? 0),\n ...colorBytes(fill.fgColor),\n ...colorBytes(fill.bgColor),\n ];\n while (payload.length < 68) payload.push(0);\n return buildBrtRecord(BRT_FILL, Uint8Array.from(payload));\n}\n\nfunction borderSide(side: BorderSide | undefined): number[] {\n const style = side?.style !== undefined ? (BORDER_BYTES[side.style] ?? 0) : 0;\n return [style, 0, ...colorBytes(side?.color)];\n}\n\n/** BrtBorder ([MS-XLSB] 2.4.311). */\nexport function buildXlsbBorderRecord(border: BorderStyle): Uint8Array {\n let diagonal = 0;\n if (border.diagonalDown) diagonal |= 0x01;\n if (border.diagonalUp) diagonal |= 0x02;\n const payload: number[] = [\n diagonal,\n ...borderSide(border.top),\n ...borderSide(border.bottom),\n ...borderSide(border.left),\n ...borderSide(border.right),\n ...borderSide(border.diagonal),\n ];\n return buildBrtRecord(BRT_BORDER, Uint8Array.from(payload));\n}\n\ninterface XlsbXfOptions {\n ifmt?: number;\n fontId?: number;\n fillId?: number;\n borderId?: number;\n style?: CellStyle;\n}\n\n/** BrtXF ([MS-XLSB] 2.4.863). */\nexport function buildXlsbXfRecord(options: XlsbXfOptions): Uint8Array {\n const { ifmt = 0, fontId = 0, fillId = 0, borderId = 0, style } = options;\n const alignment = style?.alignment;\n const protection = style?.protection;\n\n let rotation = 0;\n let indent = 0;\n let alignmentByte = 0x10;\n let flagsByte = 0x10;\n if (alignment) {\n rotation = alignment.textRotation ?? 0;\n indent = alignment.indent ?? 0;\n alignmentByte = (HORIZONTAL_BYTES[alignment.horizontal ?? 'general'] ?? 0)\n | ((VERTICAL_BYTES[alignment.vertical ?? 'bottom'] ?? 2) << 3)\n | (alignment.wrapText ? 0x40 : 0)\n | (alignment.justifyLastLine ? 0x80 : 0);\n flagsByte = 0x10\n | (alignment.shrinkToFit ? 0x01 : 0)\n | ((alignment.readingOrder ?? 0) << 2);\n }\n if (protection) {\n flagsByte = (flagsByte & 0xcf)\n | (protection.locked !== false ? 0x10 : 0)\n | (protection.hidden ? 0x20 : 0);\n }\n\n let flags = 0;\n if (ifmt !== 0) flags |= 0x01;\n if (fontId !== 0) flags |= 0x02;\n if (alignment) flags |= 0x04;\n if (borderId !== 0) flags |= 0x08;\n if (fillId !== 0) flags |= 0x10;\n if (protection) flags |= 0x20;\n\n const payload: number[] = [\n 0, 0, // ixfeParent: built-in cell style XF 0\n ...u16(ifmt),\n ...u16(fontId),\n ...u16(fillId),\n ...u16(borderId),\n rotation & 0xff,\n indent & 0xff,\n alignmentByte & 0xff,\n flagsByte & 0xff,\n ...u16(flags),\n ];\n return buildBrtRecord(BRT_XF, Uint8Array.from(payload));\n}\n\nfunction numFmtRecord(ifmt: number, format: string): Uint8Array {\n if (format.length > 255) {\n throw new RangeError('XLSB number formats are limited to 255 characters');\n }\n const encoded = utf16leBytes(format);\n const payload = [...u16(ifmt), ...u32(encoded.length / 2), ...encoded];\n return buildBrtRecord(BRT_FMT, Uint8Array.from(payload));\n}\n\ninterface Biff12RecordSpan {\n id: number;\n start: number;\n dataStart: number;\n end: number;\n}\n\nfunction scanRecords(data: Uint8Array): Biff12RecordSpan[] {\n const spans: Biff12RecordSpan[] = [];\n let pos = 0;\n while (pos < data.length) {\n const start = pos;\n let id = 0;\n let shift = 0;\n let byte: number;\n do {\n if (pos >= data.length) return spans;\n byte = data[pos++];\n id |= (byte & 0x7f) << shift;\n shift += 7;\n } while (byte & 0x80);\n let len = 0;\n shift = 0;\n do {\n if (pos >= data.length) return spans;\n byte = data[pos++];\n len |= (byte & 0x7f) << shift;\n shift += 7;\n } while (byte & 0x80);\n if (pos + len > data.length) return spans;\n spans.push({ id, start, dataStart: pos, end: pos + len });\n pos += len;\n }\n return spans;\n}\n\nfunction countRecord(id: number, count: number): Uint8Array {\n return buildBrtRecord(id, Uint8Array.from(u32(count)));\n}\n\n/**\n * Deduplicating style registry for `xl/styles.bin`. Base components stay at\n * their template ids: fonts 0-1, fills 0-1, border 0, cell XFs 0-5.\n */\nexport class XlsbStyleRegistry {\n private readonly fontIds = new Map<string, number>();\n private readonly fillIds = new Map<string, number>();\n private readonly borderIds = new Map<string, number>();\n private readonly xfIds = new Map<string, number>();\n private readonly formats = new Map<string, number>();\n\n private readonly fonts: Uint8Array[] = [];\n private readonly fills: Uint8Array[] = [];\n private readonly borders: Uint8Array[] = [];\n private readonly xfs: Uint8Array[] = [];\n private readonly formatRecords: Array<{ ifmt: number; format: string }> = [];\n\n private nextNumFmtId = 167;\n private nextFontId = 2;\n private nextFillId = 2;\n private nextBorderId = 1;\n\n /** Cell XF index for a style; 0 for null/empty styles. */\n register(style: CellStyle | null | undefined): number {\n const normalized = normalizeStyle(style);\n if (normalized === null) return 0;\n const key = JSON.stringify(normalized);\n const existing = this.xfIds.get(key);\n if (existing !== undefined) return existing;\n\n const base = baseXfIndex(normalized);\n if (base !== null) {\n this.xfIds.set(key, base);\n return base;\n }\n\n const fontId = this.componentId(\n this.fontIds,\n normalized.font ? JSON.stringify(normalized.font) : null,\n normalized.font ? buildXlsbFontRecord(normalized.font) : null,\n this.fonts,\n normalized.font?.bold && Object.keys(normalized.font).length === 1 ? 1 : null,\n () => this.nextFontId++,\n );\n const fillId = this.componentId(\n this.fillIds,\n normalized.fill ? JSON.stringify(normalized.fill) : null,\n normalized.fill ? buildXlsbFillRecord(normalized.fill) : null,\n this.fills,\n null,\n () => this.nextFillId++,\n );\n const borderId = this.componentId(\n this.borderIds,\n normalized.border ? JSON.stringify(normalized.border) : null,\n normalized.border ? buildXlsbBorderRecord(normalized.border) : null,\n this.borders,\n null,\n () => this.nextBorderId++,\n );\n\n let ifmt = 0;\n if (normalized.numFmt !== undefined) {\n ifmt = this.numFmtIdFor(normalized.numFmt);\n }\n\n const index = XLSB_BASE_XF_COUNT + this.xfs.length;\n this.xfs.push(buildXlsbXfRecord({\n ifmt,\n fontId,\n fillId,\n borderId,\n style: normalized,\n }));\n this.xfIds.set(key, index);\n return index;\n }\n\n /** XF index for a plain number format (legacy FormattedCell path). */\n registerFormat(format: string): number {\n return this.register({ numFmt: format });\n }\n\n private numFmtIdFor(format: string): number {\n let id = this.formats.get(format);\n if (id === undefined) {\n if (this.nextNumFmtId > 382) {\n throw new RangeError('XLSB supports at most 216 custom number formats');\n }\n id = this.nextNumFmtId++;\n this.formats.set(format, id);\n this.formatRecords.push({ ifmt: id, format });\n }\n return id;\n }\n\n private componentId(\n registry: Map<string, number>,\n key: string | null,\n record: Uint8Array | null,\n target: Uint8Array[],\n baseId: number | null,\n allocate: () => number,\n ): number {\n if (key === null) return 0;\n const existing = registry.get(key);\n if (existing !== undefined) return existing;\n if (baseId !== null) {\n registry.set(key, baseId);\n return baseId;\n }\n const id = allocate();\n registry.set(key, id);\n if (record) target.push(record);\n return id;\n }\n\n /** Rewrite `styles.bin`, appending registered components to the template. */\n toStylesBin(template: Uint8Array): Uint8Array {\n if (this.xfs.length === 0 && this.fonts.length === 0\n && this.fills.length === 0 && this.borders.length === 0\n && this.formatRecords.length === 0) {\n return template;\n }\n\n const records = scanRecords(template);\n const find = (id: number): Biff12RecordSpan => {\n const record = records.find(r => r.id === id);\n if (!record) throw new Error(`XLSB styles template is missing record 0x${id.toString(16)}`);\n return record;\n };\n const section = (beginId: number, endId: number) => {\n const begin = find(beginId);\n const end = find(endId);\n const inner = records.filter(r => r.start >= begin.end && r.end <= end.start);\n return { begin, end, inner };\n };\n\n const parts: Uint8Array[] = [];\n const fmts = section(BRT_BEGIN_FMTS, BRT_END_FMTS);\n parts.push(template.subarray(0, fmts.begin.start));\n parts.push(countRecord(BRT_BEGIN_FMTS, fmts.inner.length + this.formatRecords.length));\n for (const record of fmts.inner) parts.push(template.subarray(record.start, record.end));\n for (const fmt of this.formatRecords) parts.push(numFmtRecord(fmt.ifmt, fmt.format));\n parts.push(template.subarray(fmts.end.start, fmts.end.end));\n\n appendComponentSection(\n parts, template, section(BRT_BEGIN_FONTS, BRT_END_FONTS), BRT_FONT, this.fonts,\n );\n appendComponentSection(\n parts, template, section(BRT_BEGIN_FILLS, BRT_END_FILLS), BRT_FILL, this.fills,\n );\n appendComponentSection(\n parts, template, section(BRT_BEGIN_BORDERS, BRT_END_BORDERS), BRT_BORDER, this.borders,\n );\n\n const styleXfs = find(BRT_BEGIN_CELL_STYLE_XFS);\n const styleXfsEnd = find(BRT_END_CELL_STYLE_XFS);\n parts.push(template.subarray(styleXfs.start, styleXfsEnd.end));\n\n const cellXfs = section(BRT_BEGIN_CELL_XFS, BRT_END_CELL_XFS);\n parts.push(countRecord(BRT_BEGIN_CELL_XFS, cellXfs.inner.length + this.xfs.length));\n for (const record of cellXfs.inner) parts.push(template.subarray(record.start, record.end));\n for (const xf of this.xfs) parts.push(xf);\n parts.push(template.subarray(cellXfs.end.start, cellXfs.end.end));\n parts.push(template.subarray(cellXfs.end.end));\n\n return concat(parts);\n }\n}\n\nfunction appendComponentSection(\n parts: Uint8Array[],\n template: Uint8Array,\n section: { begin: Biff12RecordSpan; end: Biff12RecordSpan; inner: Biff12RecordSpan[] },\n componentId: number,\n custom: Uint8Array[],\n): void {\n parts.push(countRecord(section.begin.id, section.inner.length + custom.length));\n let splitAt = section.begin.end;\n for (const record of section.inner) {\n if (record.id === componentId) splitAt = record.end;\n }\n parts.push(template.subarray(section.begin.end, splitAt));\n for (const record of custom) parts.push(record);\n parts.push(template.subarray(splitAt, section.end.start));\n parts.push(template.subarray(section.end.start, section.end.end));\n}\n\n/** Base XF index for a style that exactly matches one of the six base XFs. */\nfunction baseXfIndex(style: CellStyle): number | null {\n const keys = Object.keys(style);\n if (keys.length === 1 && keys[0] === 'font'\n && style.font?.bold === true && Object.keys(style.font).length === 1) {\n return 3;\n }\n if (keys.length === 1 && keys[0] === 'fill'\n && style.fill?.patternType === 'gray125' && Object.keys(style.fill).length === 1) {\n return 4;\n }\n if (keys.length === 2 && style.font?.bold === true\n && Object.keys(style.font).length === 1\n && style.fill?.patternType === 'gray125' && Object.keys(style.fill).length === 1) {\n return 5;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Reading styles.bin\n// ---------------------------------------------------------------------------\n\nconst BUILTIN_NUMFMTS: Record<number, string> = {\n 1: '0',\n 2: '0.00',\n 3: '#,##0',\n 4: '#,##0.00',\n 9: '0%',\n 10: '0.00%',\n 11: '0.00E+00',\n 14: 'mm-dd-yy',\n 22: 'm/d/yy h:mm',\n 49: '@',\n};\n\nfunction byteName(map: Record<string, number>, value: number): string | undefined {\n for (const [name, id] of Object.entries(map)) {\n if (id === value) return name === 'none' ? undefined : name;\n }\n return undefined;\n}\n\nfunction readColor(data: Uint8Array, offset: number): StyleColor | undefined {\n if (offset + 8 > data.length) return undefined;\n const kind = data[offset] >> 1;\n if (kind === 0) return undefined;\n if (kind === 1) return { indexed: data[offset + 1] };\n if (kind === 2) {\n const hex = (value: number): string => value.toString(16).padStart(2, '0').toUpperCase();\n return `${hex(data[offset + 7])}${hex(data[offset + 4])}${hex(data[offset + 5])}${hex(data[offset + 6])}`;\n }\n const view = new DataView(data.buffer, data.byteOffset + offset, 8);\n const tint = view.getInt16(2, true);\n const color: { theme: number; tint?: number } = { theme: data[offset + 1] };\n if (tint !== 0) color.tint = tint / 32767;\n return color;\n}\n\nfunction parseFontRecord(data: Uint8Array): FontStyle | undefined {\n if (data.length < 25) return undefined;\n const view = new DataView(data.buffer, data.byteOffset, data.length);\n const height = view.getUint16(0, true);\n const flags = view.getUint16(2, true);\n const weight = view.getUint16(4, true);\n const baseline = view.getUint16(6, true);\n const underline = data[8];\n const family = data[9];\n const charset = data[10];\n const color = readColor(data, 12);\n const scheme = data[20];\n const cch = view.getUint32(21, true);\n if (25 + cch * 2 > data.length) return undefined;\n\n const font: FontStyle = {};\n font.name = new TextDecoder('utf-16le').decode(data.subarray(25, 25 + cch * 2));\n font.size = height / 20;\n if ((flags & 0x01) !== 0 || weight >= 700) font.bold = true;\n if ((flags & 0x02) !== 0) font.italic = true;\n if ((flags & 0x08) !== 0) font.strike = true;\n if ((flags & 0x10) !== 0) font.outline = true;\n if ((flags & 0x20) !== 0) font.shadow = true;\n if ((flags & 0x40) !== 0) font.condense = true;\n if ((flags & 0x80) !== 0) font.extend = true;\n if (underline !== 0) {\n font.underline = underline === 0x21 ? 'singleAccounting'\n : underline === 0x22 ? 'doubleAccounting'\n : underline === 0x02 ? 'double'\n : 'single';\n }\n if (color !== undefined) font.color = color;\n if (family !== 0) font.family = family;\n if (charset !== 0) font.charset = charset;\n if (scheme === 1) font.scheme = 'major';\n else if (scheme === 2) font.scheme = 'minor';\n if (baseline === 1) font.vertAlign = 'superscript';\n else if (baseline === 2) font.vertAlign = 'subscript';\n return font;\n}\n\nfunction parseFillRecord(data: Uint8Array): FillStyle | undefined {\n if (data.length < 20) return undefined;\n const view = new DataView(data.buffer, data.byteOffset, data.length);\n const pattern = view.getUint32(0, true);\n const patternType = byteName(PATTERN_BYTES, pattern) as FillStyle['patternType'];\n const fgColor = readColor(data, 4);\n const bgColor = readColor(data, 12);\n if (patternType === undefined && fgColor === undefined && bgColor === undefined) return undefined;\n const fill: FillStyle = {};\n if (patternType !== undefined) fill.patternType = patternType;\n if (fgColor !== undefined) fill.fgColor = fgColor;\n if (bgColor !== undefined) fill.bgColor = bgColor;\n return fill;\n}\n\nfunction parseBorderRecord(data: Uint8Array): BorderStyle | undefined {\n if (data.length < 51) return undefined;\n const border: BorderStyle = {};\n if ((data[0] & 0x01) !== 0) border.diagonalDown = true;\n if ((data[0] & 0x02) !== 0) border.diagonalUp = true;\n const names = ['top', 'bottom', 'left', 'right', 'diagonal'] as const;\n for (let i = 0; i < names.length; i++) {\n const offset = 1 + i * 10;\n const style = byteName(BORDER_BYTES, data[offset]) as BorderSide['style'];\n const color = readColor(data, offset + 2);\n if (style !== undefined || color !== undefined) {\n const side: BorderSide = {};\n if (style !== undefined) side.style = style;\n if (color !== undefined) side.color = color;\n border[names[i]] = side;\n }\n }\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\n/** Parse `xl/styles.bin` into per-cell-XF styles. */\nexport function parseXlsbStylesBin(data: Uint8Array): Array<CellStyle | null> {\n const records = scanRecords(data);\n const section = (beginId: number, endId: number): Biff12RecordSpan[] => {\n const begin = records.findIndex(record => record.id === beginId);\n const end = records.findIndex(record => record.id === endId);\n if (begin === -1 || end === -1 || end <= begin) return [];\n return records.slice(begin + 1, end);\n };\n\n const numFmts = new Map<number, string>();\n for (const record of section(BRT_BEGIN_FMTS, BRT_END_FMTS)) {\n if (record.id !== BRT_FMT || record.dataStart + 6 > record.end) continue;\n const view = new DataView(data.buffer, data.byteOffset + record.dataStart, record.end - record.dataStart);\n const id = view.getUint16(0, true);\n const cch = view.getUint32(2, true);\n if (6 + cch * 2 <= record.end - record.dataStart) {\n numFmts.set(id, new TextDecoder('utf-16le').decode(\n data.subarray(record.dataStart + 6, record.dataStart + 6 + cch * 2),\n ));\n }\n }\n\n const fonts: Array<FontStyle | undefined> = [];\n for (const record of section(BRT_BEGIN_FONTS, BRT_END_FONTS)) {\n if (record.id === BRT_FONT) {\n fonts.push(parseFontRecord(data.subarray(record.dataStart, record.end)));\n }\n }\n const fills: Array<FillStyle | undefined> = [];\n for (const record of section(BRT_BEGIN_FILLS, BRT_END_FILLS)) {\n if (record.id === BRT_FILL) {\n fills.push(parseFillRecord(data.subarray(record.dataStart, record.end)));\n }\n }\n const borders: Array<BorderStyle | undefined> = [];\n for (const record of section(BRT_BEGIN_BORDERS, BRT_END_BORDERS)) {\n if (record.id === BRT_BORDER) {\n borders.push(parseBorderRecord(data.subarray(record.dataStart, record.end)));\n }\n }\n\n const styles: Array<CellStyle | null> = [];\n for (const record of section(BRT_BEGIN_CELL_XFS, BRT_END_CELL_XFS)) {\n if (record.id !== BRT_XF || record.end - record.dataStart < 16) continue;\n const view = new DataView(data.buffer, data.byteOffset + record.dataStart, 16);\n const ifmt = view.getUint16(2, true);\n const fontId = view.getUint16(4, true);\n const fillId = view.getUint16(6, true);\n const borderId = view.getUint16(8, true);\n const rotation = data[record.dataStart + 10];\n const indent = data[record.dataStart + 11];\n const alignmentByte = data[record.dataStart + 12];\n const flagsByte = data[record.dataStart + 13];\n\n const style: CellStyle = {};\n if (ifmt !== 0) {\n const code = numFmts.get(ifmt) ?? BUILTIN_NUMFMTS[ifmt];\n if (code !== undefined) style.numFmt = code;\n }\n if (fontId !== 0 && fonts[fontId]) {\n style.font = fonts[fontId];\n }\n if (fillId > 1 && fills[fillId]) style.fill = fills[fillId];\n if (borderId !== 0 && borders[borderId]) style.border = borders[borderId];\n\n const horizontal = byteName(HORIZONTAL_BYTES, alignmentByte & 0x07);\n const vertical = byteName(VERTICAL_BYTES, (alignmentByte >> 3) & 0x07);\n const alignment: NonNullable<CellStyle['alignment']> = {};\n if (horizontal !== undefined && horizontal !== 'general') {\n alignment.horizontal = horizontal as NonNullable<CellStyle['alignment']>['horizontal'];\n }\n if (vertical !== undefined && vertical !== 'bottom') {\n alignment.vertical = vertical as NonNullable<CellStyle['alignment']>['vertical'];\n }\n if ((alignmentByte & 0x40) !== 0) alignment.wrapText = true;\n if ((alignmentByte & 0x80) !== 0) alignment.justifyLastLine = true;\n if ((flagsByte & 0x01) !== 0) alignment.shrinkToFit = true;\n const readingOrder = (flagsByte >> 2) & 0x03;\n if (readingOrder !== 0) alignment.readingOrder = readingOrder as 1 | 2;\n if (rotation !== 0) alignment.textRotation = rotation;\n if (indent !== 0) alignment.indent = indent;\n if (Object.keys(alignment).length > 0) style.alignment = alignment;\n\n const locked = (flagsByte & 0x10) !== 0;\n const hidden = (flagsByte & 0x20) !== 0;\n if (!locked || hidden) {\n const protection: NonNullable<CellStyle['protection']> = {};\n if (!locked) protection.locked = false;\n if (hidden) protection.hidden = true;\n style.protection = protection;\n }\n\n styles.push(Object.keys(style).length > 0 ? style : null);\n }\n\n return styles;\n}\n","import yauzl, { ZipFile, Entry } from 'yauzl';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { CellStyle, CellValue, RichText } from './Formats';\nimport {\n parseXlsxInlineRichText,\n parseXlsxRichTexts,\n parseXlsxStyles,\n} from './xlsxStyleParser';\nimport {\n unescapeXml,\n unescapeXmlText,\n columnLetterToIndex,\n parseSharedStringsBuffer,\n parseSharedStringsXml,\n parseTagAttributes,\n resolveRelTarget,\n} from './xmlUtils';\nimport { MAX_ROWS } from './writerHelpers';\n\ninterface SheetInfo {\n name: string;\n sheetId: string;\n rId: string;\n path: string;\n}\n\n/**\n * Parse an ISO 8601 `t=\"d\"` cell as UTC. Numeric OA dates are converted from a\n * UTC epoch, so a value without an offset must not be interpreted as local time.\n */\nfunction parseIsoDateUtc(value: string): Date | null {\n let text = value.trim().replace(' ', 'T');\n if (!text) return null;\n if (!/z$|[+-]\\d{2}:?\\d{2}$/i.test(text) && text.includes('T')) {\n text += 'Z';\n }\n const date = new Date(text);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/** Index of the `>` that closes a tag starting at `start`, or -1. */\nfunction tagEndIndex(buf: Buffer, start: number, limit: number): number {\n const end = buf.indexOf(0x3e, start);\n return end === -1 || end >= limit ? -1 : end;\n}\n\nconst BYTE_LT = 0x3c;\nconst BYTE_GT = 0x3e;\nconst BYTE_SLASH = 0x2f;\n\n/** Index of byte `code` in `[start, end)`, or -1. */\nfunction indexOfByte(buf: Buffer, code: number, start: number, end: number): number {\n for (let i = start; i < end; i++) {\n if (buf[i] === code) return i;\n }\n return -1;\n}\n\n/**\n * Index of `<name` in `[start, end)`, or -1.\n *\n * A byte loop beats `Buffer#subarray(...).indexOf` for the few-byte cell\n * bodies: it allocates nothing and stays inside the cell.\n */\nfunction indexOfTag(buf: Buffer, name: number, start: number, end: number): number {\n for (let i = start; i + 1 < end; i++) {\n if (buf[i] === BYTE_LT && buf[i + 1] === name) return i;\n }\n return -1;\n}\n\n/** Index of `</name>` in `[start, end)`, or -1. */\nfunction indexOfCloseTag(buf: Buffer, name: number, start: number, end: number): number {\n for (let i = start; i + 3 < end; i++) {\n if (buf[i] === BYTE_LT && buf[i + 1] === BYTE_SLASH &&\n buf[i + 2] === name && buf[i + 3] === BYTE_GT) {\n return i;\n }\n }\n return -1;\n}\n\n/** String-path counterpart of {@link indexOfCloseTag}. */\nfunction stringIndexOfWithin(xml: string, needle: string, start: number, end: number): number {\n if (end <= start) return -1;\n const index = xml.substring(start, end).indexOf(needle);\n return index === -1 ? -1 : start + index;\n}\n\n/** Value of attribute `name` in `<tag ...>`; raw (entities are not decoded). */\nfunction attributeValue(buf: Buffer, start: number, end: number, name: string): string | null {\n let pos = start + 1;\n // Skip the element name: `<c t=\"s\">` starts with the tag, not an attribute.\n while (pos < end && buf[pos] > 0x20 && buf[pos] !== 0x3e && buf[pos] !== 0x2f) pos++;\n while (pos < end) {\n while (pos < end && buf[pos] <= 0x20) pos++;\n const nameStart = pos;\n while (pos < end && buf[pos] !== 0x3d && buf[pos] > 0x20) pos++;\n const nameEnd = pos;\n while (pos < end && buf[pos] <= 0x20) pos++;\n if (pos >= end || buf[pos] !== 0x3d) {\n pos++;\n continue;\n }\n pos++;\n while (pos < end && buf[pos] <= 0x20) pos++;\n if (pos >= end || (buf[pos] !== 0x22 && buf[pos] !== 0x27)) continue;\n const quote = buf[pos++];\n const valueStart = pos;\n while (pos < end && buf[pos] !== quote) pos++;\n const valueEnd = pos;\n if (nameEnd - nameStart === name.length) {\n let match = true;\n for (let i = 0; i < name.length; i++) {\n if (buf[nameStart + i] !== name.charCodeAt(i)) { match = false; break; }\n }\n if (match) return buf.toString('utf8', valueStart, valueEnd);\n }\n if (pos < end) pos++;\n }\n return null;\n}\n\n/** ASCII unsigned integer in `[start, end)`, or -1. */\nfunction parseUint(buf: Buffer, start: number, end: number): number {\n let value = 0;\n if (start >= end) return -1;\n for (let i = start; i < end; i++) {\n const c = buf[i];\n if (c < 0x30 || c > 0x39) return -1;\n value = value * 10 + (c - 0x30);\n }\n return value;\n}\n\n/**\n * Parse a plain ASCII decimal number without allocating a string.\n *\n * Integers and decimals with at most 15 significant digits are exact (the\n * mantissa fits in 2^53 and the single division by 10^n is correctly\n * rounded), so the result matches `parseFloat`. Everything else (exponents,\n * longer mantissas, surrounding whitespace) falls back to `parseFloat`.\n */\nfunction parseNumberBytes(buf: Buffer, start: number, end: number): number {\n let i = start;\n let negative = false;\n if (i < end) {\n const c = buf[i];\n if (c === 0x2d) {\n negative = true;\n i++;\n } else if (c === 0x2b) {\n i++;\n }\n }\n let mantissa = 0;\n let digits = 0;\n let decimals = 0;\n let sawDot = false;\n let sawDigit = false;\n for (; i < end; i++) {\n const c = buf[i];\n if (c >= 0x30 && c <= 0x39) {\n if (digits >= 15) return parseFloat(buf.toString('utf8', start, end));\n mantissa = mantissa * 10 + (c - 0x30);\n digits++;\n sawDigit = true;\n if (sawDot) decimals++;\n } else if (c === 0x2e && !sawDot) {\n sawDot = true;\n } else {\n return parseFloat(buf.toString('utf8', start, end));\n }\n }\n if (!sawDigit) return NaN;\n const value = decimals === 0 ? mantissa : mantissa / Math.pow(10, decimals);\n return negative ? -value : value;\n}\n\nconst CELL_TYPE_NUM = 0;\nconst CELL_TYPE_SHARED = 1;\nconst CELL_TYPE_BOOL = 2;\nconst CELL_TYPE_ERROR = 3;\nconst CELL_TYPE_DATE = 4;\nconst CELL_TYPE_INLINE = 5;\nconst CELL_TYPE_STR = 6;\n\n/** Decode a cell `t` attribute without allocating a string. */\nfunction parseCellType(buf: Buffer, start: number, end: number): number {\n const length = end - start;\n if (length === 1) {\n const c = buf[start];\n if (c === 0x73) return CELL_TYPE_SHARED; // s\n if (c === 0x62) return CELL_TYPE_BOOL; // b\n if (c === 0x65) return CELL_TYPE_ERROR; // e\n if (c === 0x64) return CELL_TYPE_DATE; // d\n return CELL_TYPE_NUM;\n }\n if (length === 3 && buf[start] === 0x73 && buf[start + 1] === 0x74 && buf[start + 2] === 0x72) {\n return CELL_TYPE_STR; // str\n }\n if (length === 9 &&\n buf[start] === 0x69 && buf[start + 1] === 0x6e && buf[start + 2] === 0x6c &&\n buf[start + 3] === 0x69 && buf[start + 4] === 0x6e && buf[start + 5] === 0x65 &&\n buf[start + 6] === 0x53 && buf[start + 7] === 0x74 && buf[start + 8] === 0x72) {\n return CELL_TYPE_INLINE; // inlineStr\n }\n return CELL_TYPE_NUM;\n}\n\n/** 0-based column from an `r` attribute value, decoded in place. */\nfunction parseCellColumnBytes(buf: Buffer, start: number, end: number): number {\n let value = 0;\n let letters = 0;\n for (let i = start; i < end; i++) {\n const c = buf[i];\n if (c >= 65 && c <= 90) {\n value = value * 26 + (c - 64);\n letters++;\n } else if (c >= 97 && c <= 122) {\n value = value * 26 + (c - 96);\n letters++;\n } else {\n break;\n }\n }\n return letters > 0 && letters <= 3 ? value - 1 : -1;\n}\n\ninterface CellAttributes {\n col: number;\n type: number;\n style: number;\n}\n\n/** Parse `r`, `t` and `s` from a `<c …>` tag in one pass. */\nfunction parseCellAttributes(buf: Buffer, start: number, end: number): CellAttributes {\n let col = -1;\n let type = CELL_TYPE_NUM;\n let style = 0;\n\n let pos = start + 1;\n // Skip the element name.\n while (pos < end && buf[pos] > 0x20 && buf[pos] !== 0x3e && buf[pos] !== 0x2f) pos++;\n\n while (pos < end) {\n while (pos < end && buf[pos] <= 0x20) pos++;\n if (pos >= end) break;\n const nameStart = pos;\n while (pos < end && buf[pos] !== 0x3d && buf[pos] > 0x20) pos++;\n const nameEnd = pos;\n while (pos < end && buf[pos] <= 0x20) pos++;\n if (pos >= end || buf[pos] !== 0x3d) {\n if (pos === nameStart) pos++;\n continue;\n }\n pos++;\n while (pos < end && buf[pos] <= 0x20) pos++;\n if (pos >= end || (buf[pos] !== 0x22 && buf[pos] !== 0x27)) continue;\n const quote = buf[pos++];\n const valueStart = pos;\n while (pos < end && buf[pos] !== quote) pos++;\n const valueEnd = pos;\n\n if (nameEnd - nameStart === 1) {\n const name = buf[nameStart];\n if (name === 0x72) {\n col = parseCellColumnBytes(buf, valueStart, valueEnd);\n } else if (name === 0x74) {\n type = parseCellType(buf, valueStart, valueEnd);\n } else if (name === 0x73) {\n const parsed = parseUint(buf, valueStart, valueEnd);\n if (parsed >= 0) style = parsed;\n }\n }\n if (pos < end) pos++;\n }\n\n return { col, type, style };\n}\n\nexport class XlsxReader extends ExcelReaderAbstract {\n private zipfile: ZipFile | null = null;\n /** Keeps the yauzl source buffer alive when opened from memory. */\n private _zipBuffer: Buffer | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n private entries: Map<string, Entry> = new Map();\n\n private _currentSheetIndex: number = -1;\n /** Buffer-based fast path for the current sheet. */\n private _sheetBuffer: Buffer | null = null;\n /** String fallback for unusual markup (prefixed tags, etc.). */\n private _sheetXml: string | null = null;\n private _xmlPos: number = 0;\n private _xmlEnd: number = 0;\n\n private _currentRow: CellValue[] = [];\n private _currentFormulas: Array<string | null> = [];\n private _currentStyleIndices: number[] = [];\n private _currentSharedIndices: number[] = [];\n private _currentRichTexts: Array<RichText | null> = [];\n private _expectedRowNum: number = 1;\n private _pendingEmptyCount: number = 0;\n\n private _xfStyles: Array<CellStyle | null> = [];\n private _sharedRichTexts: Array<RichText | null> = [];\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> = new Set();\n /** One flag per xf id: 1 when the style's number format is a date. */\n private _dateXf: Uint8Array = new Uint8Array(0);\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n await this._openWith(\n (callback) => yauzl.open(path, { lazyEntries: true, autoClose: false }, callback),\n readSharedStrings,\n );\n }\n\n /** Open a workbook already held in memory (ZIP bytes). */\n async openBuffer(buffer: Buffer, readSharedStrings: boolean = true): Promise<void> {\n if (!Buffer.isBuffer(buffer)) {\n throw new TypeError('XlsxReader.openBuffer expects a Buffer');\n }\n this._zipBuffer = buffer;\n await this._openWith(\n (callback) => yauzl.fromBuffer(buffer, { lazyEntries: true, autoClose: false }, callback),\n readSharedStrings,\n );\n }\n\n private async _openWith(\n opener: (callback: (err: Error | null, zipfile?: ZipFile) => void) => void,\n readSharedStrings: boolean,\n ): Promise<void> {\n await this.close();\n this._resetState();\n return new Promise((resolve, reject) => {\n opener((err, zipfile) => {\n if (err || !zipfile) return reject(err ?? new Error('XlsxReader: could not open ZIP'));\n this.zipfile = zipfile;\n this.entries = new Map();\n\n zipfile.on('entry', (entry: Entry) => {\n this.entries.set(entry.fileName, entry);\n zipfile.readEntry();\n });\n\n zipfile.on('end', async () => {\n try {\n await this._loadWorkbookStructure(readSharedStrings);\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n zipfile.readEntry();\n });\n });\n }\n\n private _resetState(): void {\n this.sheetNames = [];\n this.sheets = [];\n this.sharedStrings = [];\n this.xfIdToNumFmtId = [];\n this.customDateFormats = new Set();\n this._dateXf = new Uint8Array(0);\n this.fieldCount = 0;\n this.resultsCount = 0;\n this.actualSheetName = '';\n this._currentSheetIndex = -1;\n this._sheetBuffer = null;\n this._sheetXml = null;\n this._xmlPos = 0;\n this._xmlEnd = 0;\n this._resetCurrentRow();\n this._currentFormulas = [];\n this._currentStyleIndices = [];\n this._currentSharedIndices = [];\n this._xfStyles = [];\n this._sharedRichTexts = [];\n this._expectedRowNum = 1;\n this._pendingEmptyCount = 0;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n private async _loadWorkbookStructure(readSharedStrings: boolean): Promise<void> {\n const wbRelsContent = await this._readZipEntryContent('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (wbRelsContent) {\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = relTagRe.exec(wbRelsContent)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) rIdToTarget[id] = target;\n }\n }\n\n const wbContent = await this._readZipEntryContent('xl/workbook.xml');\n if (wbContent) {\n // Order-independent: parse each <sheet> tag then its attributes.\n const sheetTagRe = /<sheet\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = sheetTagRe.exec(wbContent)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const rawName = attrs['name'];\n const sheetId = attrs['sheetId'] ?? '';\n const rId = attrs['r:id'] ?? attrs['id'] ?? attrs['rId'];\n if (rawName === undefined || rId === undefined) continue;\n const name = unescapeXml(rawName);\n const target = rIdToTarget[rId];\n if (!target) continue;\n this.sheetNames.push(name);\n this.sheets.push({ name, sheetId, rId, path: resolveRelTarget(target) });\n }\n const wbPrMatch = /<workbookPr\\b[^>]*>/i.exec(wbContent);\n if (wbPrMatch) {\n const wbPrAttrs = parseTagAttributes(wbPrMatch[0]);\n const v = (wbPrAttrs['date1904'] ?? '').trim().toLowerCase();\n this._oaEpoch = (v === '1' || v === 'true') ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n }\n }\n\n if (readSharedStrings) {\n const ssEntry = this.entries.get('xl/sharedStrings.xml');\n if (ssEntry) {\n const ssBuffer = await this._readZipEntryBuffer(ssEntry);\n this.sharedStrings = parseSharedStringsBuffer(ssBuffer);\n if (ssBuffer.includes('<r>') || ssBuffer.includes('<r ')) {\n this._sharedRichTexts = parseXlsxRichTexts(ssBuffer.toString('utf8'));\n }\n }\n }\n\n const stylesEntry = this.entries.get('xl/styles.xml');\n if (stylesEntry) {\n const stylesBuffer = await this._readZipEntryBuffer(stylesEntry);\n this._parseStyles(stylesBuffer.toString('utf8'));\n }\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n }\n\n async close(): Promise<void> {\n if (this.zipfile) {\n this.zipfile.close();\n this.zipfile = null;\n }\n this._zipBuffer = null;\n }\n\n private async _readZipEntryContent(path: string): Promise<string | null> {\n const entry = this.entries.get(path);\n if (!entry) return null;\n return (await this._readZipEntryBuffer(entry)).toString('utf8');\n }\n\n /**\n * Read one ZIP member into a Buffer. The uncompressed size from the\n * central directory is used to allocate once instead of concatenating\n * stream chunks.\n */\n private _readZipEntryBuffer(entry: Entry): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n this.zipfile!.openReadStream(entry, (err, readStream) => {\n if (err || !readStream) return reject(err ?? new Error('XlsxReader: cannot read ZIP entry'));\n // Cap the one-shot allocation: the size comes from the (untrusted)\n // central directory, and larger entries fall back to chunk concat.\n const MAX_PREALLOC = 64 * 1024 * 1024;\n const expected = entry.uncompressedSize;\n const prealloc = expected > 0 && expected <= MAX_PREALLOC\n ? Buffer.allocUnsafe(expected)\n : null;\n let written = 0;\n let overflowed = false;\n const overflow: Buffer[] = [];\n readStream.on('data', (chunk: Buffer) => {\n if (!overflowed && prealloc && written + chunk.length <= prealloc.length) {\n chunk.copy(prealloc, written);\n written += chunk.length;\n } else {\n // Once a chunk does not fit, keep every later chunk in\n // order; the preallocated tail must not be filled.\n overflowed = true;\n overflow.push(chunk);\n }\n });\n readStream.on('end', () => {\n if (prealloc && !overflowed) {\n resolve(prealloc.subarray(0, written));\n return;\n }\n const parts: Buffer[] = [];\n if (prealloc && written > 0) parts.push(prealloc.subarray(0, written));\n if (overflow.length > 0) parts.push(...overflow);\n resolve(Buffer.concat(parts));\n });\n readStream.on('error', reject);\n });\n });\n }\n\n private _parseSharedStrings(xml: string): void {\n this.sharedStrings = parseSharedStringsXml(xml);\n }\n\n private _parseStyles(xml: string): void {\n const numFmtRegex = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let match;\n this.customDateFormats = new Set();\n\n while ((match = numFmtRegex.exec(xml)) !== null) {\n const id = parseInt(match[1]);\n const code = match[2].toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n this.customDateFormats.add(id);\n }\n }\n\n this.xfIdToNumFmtId = [];\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart !== -1) {\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd !== -1) {\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n const xfRegex = /<xf\\s+[^>]*numFmtId=\"(\\d+)\"/g;\n while ((match = xfRegex.exec(cellXfsContent)) !== null) {\n this.xfIdToNumFmtId.push(parseInt(match[1]));\n }\n }\n }\n\n this._dateXf = new Uint8Array(this.xfIdToNumFmtId.length);\n for (let i = 0; i < this.xfIdToNumFmtId.length; i++) {\n this._dateXf[i] = this._isDateNumFmt(this.xfIdToNumFmtId[i]) ? 1 : 0;\n }\n\n this._xfStyles = parseXlsxStyles(xml).cellStyles;\n }\n\n private _isDateNumFmt(numFmtId: number): boolean {\n return (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n this.customDateFormats.has(numFmtId);\n }\n\n private _isDateStyle(styleIndex: number): boolean {\n return styleIndex > 0 && styleIndex < this._dateXf.length && this._dateXf[styleIndex] !== 0;\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n /** Advance to the next row. Always use `await`. */\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n await this._initSheet(0);\n }\n return this.readRow() !== null;\n }\n\n /**\n * Synchronous row access for batch consumers. Returns the internal row\n * array, valid until the next call; `readAll`/`rows` return copies.\n * Select a sheet (or call `read()` once) before using it.\n */\n readRow(): CellValue[] | null {\n if (this._currentSheetIndex === -1) {\n throw new Error('XlsxReader: select a sheet before readRow()');\n }\n const hasRow = this._sheetBuffer !== null ? this._readNextRowBuffer() : this._readNextRowString();\n return hasRow ? this._currentRow : null;\n }\n\n /** Collect every remaining row of the current sheet. */\n async readAll(): Promise<CellValue[][]> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n await this._initSheet(0);\n }\n const rows: CellValue[][] = [];\n while (true) {\n const row = this.readRow();\n if (row === null) break;\n rows.push(row.slice());\n }\n return rows;\n }\n\n /** Stream every remaining row of the current sheet. */\n async *rows(): AsyncGenerator<CellValue[]> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n await this._initSheet(0);\n }\n while (true) {\n const row = this.readRow();\n if (row === null) return;\n yield row.slice();\n }\n }\n\n async selectSheet(nameOrIndex: string | number): Promise<void> {\n let index = -1;\n if (typeof nameOrIndex === 'number') {\n index = nameOrIndex;\n } else {\n index = this.sheetNames.indexOf(nameOrIndex);\n if (index === -1) throw new Error(`Sheet '${nameOrIndex}' not found`);\n }\n if (index < 0 || index >= this.sheets.length) {\n throw new Error(`Sheet index ${String(nameOrIndex)} out of range`);\n }\n this._currentSheetIndex = index;\n await this._initSheet(index);\n }\n\n async nextResult(): Promise<boolean> {\n const next = this._currentSheetIndex + 1;\n if (next >= this.sheets.length) return false;\n this._currentSheetIndex = next;\n await this._initSheet(next);\n return true;\n }\n\n private async _initSheet(index: number): Promise<void> {\n if (index >= this.sheets.length) return;\n const sheet = this.sheets[index];\n this.actualSheetName = sheet.name;\n\n const entry = this.entries.get(sheet.path);\n if (!entry) {\n this._sheetBuffer = null;\n this._sheetXml = '';\n this._xmlPos = 0;\n this._xmlEnd = 0;\n this._expectedRowNum = 1;\n this._pendingEmptyCount = 0;\n this._resetCurrentRow();\n this.fieldCount = 0;\n return;\n }\n\n const buffer = await this._readZipEntryBuffer(entry);\n this._expectedRowNum = 1;\n this._pendingEmptyCount = 0;\n this._resetCurrentRow();\n this.fieldCount = 0;\n\n this._sheetBuffer = null;\n this._sheetXml = null;\n if (this._initBufferSheet(buffer)) return;\n\n // Unusual markup (prefixed names, etc.): use the string parser.\n this._sheetXml = buffer.toString('utf8');\n this._xmlPos = 0;\n this._xmlEnd = this._sheetXml.length;\n this._initStringSheetRange();\n }\n\n /** Set `_xmlPos/_xmlEnd` for the buffer fast path; false when unsupported. */\n private _initBufferSheet(buffer: Buffer): boolean {\n let contentStart = -1;\n let contentEnd = -1;\n const simpleStart = buffer.indexOf('<sheetData>');\n if (simpleStart !== -1) {\n contentStart = simpleStart + '<sheetData>'.length;\n contentEnd = buffer.indexOf('</sheetData>', contentStart);\n if (contentEnd === -1) return false;\n } else {\n // Detect a prefixed or attribute-bearing sheetData; the generic\n // string path understands those.\n const head = buffer.toString('latin1', 0, Math.min(buffer.length, 8192));\n if (/<[A-Za-z_][\\w.-]*:sheetData\\b/i.test(head)) return false;\n const open = buffer.indexOf('<sheetData');\n if (open === -1) {\n // No sheetData at all: empty sheet.\n this._sheetBuffer = buffer;\n this._xmlPos = 0;\n this._xmlEnd = 0;\n return true;\n }\n const end = tagEndIndex(buffer, open, buffer.length);\n if (end === -1) return false;\n if (buffer[end - 1] === 0x2f) {\n this._sheetBuffer = buffer;\n this._xmlPos = end + 1;\n this._xmlEnd = end + 1;\n return true;\n }\n contentStart = end + 1;\n contentEnd = buffer.indexOf('</sheetData>', contentStart);\n if (contentEnd === -1) return false;\n }\n this._sheetBuffer = buffer;\n this._xmlPos = contentStart;\n this._xmlEnd = contentEnd;\n return true;\n }\n\n private _initStringSheetRange(): void {\n if (!this._sheetXml) return;\n const sd = this._sheetXml.indexOf('<sheetData>');\n if (sd !== -1) {\n this._xmlPos = sd + 11;\n const se = this._sheetXml.indexOf('</sheetData>', this._xmlPos);\n if (se !== -1) this._xmlEnd = se;\n return;\n }\n const m = /<(?:[A-Za-z_][\\w.-]*:)?sheetData\\b[^>]*>/i.exec(this._sheetXml);\n if (m && m.index !== undefined) {\n this._xmlPos = m.index + m[0].length;\n if (/\\/>\\s*$/.test(m[0])) {\n this._xmlEnd = this._xmlPos;\n } else {\n const se = this._sheetXml.indexOf('</sheetData>', this._xmlPos);\n if (se !== -1) this._xmlEnd = se;\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Buffer fast path\n // ------------------------------------------------------------------\n\n private _readNextRowBuffer(): boolean {\n const buffer = this._sheetBuffer!;\n if (this._pendingEmptyCount > 0) {\n this._pendingEmptyCount--;\n this._resetCurrentRow();\n this._expectedRowNum++;\n return true;\n }\n\n const rowStart = this._findRowTagStartBuffer(buffer);\n if (rowStart === -1) return false;\n const rowTagEnd = tagEndIndex(buffer, rowStart, this._xmlEnd);\n if (rowTagEnd === -1) return false;\n const isSelfClosing = buffer[rowTagEnd - 1] === 0x2f;\n const rRaw = attributeValue(buffer, rowStart, rowTagEnd, 'r');\n let rowNum = this._expectedRowNum;\n if (rRaw !== null) {\n const parsed = parseInt(rRaw, 10);\n if (Number.isFinite(parsed) && parsed >= 1 && parsed <= MAX_ROWS) rowNum = parsed;\n }\n\n if (rowNum > this._expectedRowNum) {\n const gap = rowNum - this._expectedRowNum;\n this._pendingEmptyCount = gap - 1;\n this._resetCurrentRow();\n this._expectedRowNum++;\n return true;\n }\n if (rowNum < this._expectedRowNum) {\n if (isSelfClosing) {\n this._xmlPos = rowTagEnd + 1;\n this._resetCurrentRow();\n return true;\n }\n const rowEnd = buffer.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n this._xmlPos = rowEnd + 6;\n this._parseRowBuffer(rowStart, rowEnd);\n this._expectedRowNum = Math.max(this._expectedRowNum + 1, rowNum + 1);\n return true;\n }\n\n if (isSelfClosing) {\n this._xmlPos = rowTagEnd + 1;\n this._resetCurrentRow();\n this._expectedRowNum = rowNum + 1;\n return true;\n }\n\n const rowEnd = buffer.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n this._xmlPos = rowEnd + 6;\n this._parseRowBuffer(rowStart, rowEnd);\n this._expectedRowNum = rowNum + 1;\n return true;\n }\n\n private _findRowTagStartBuffer(buffer: Buffer): number {\n let pos = this._xmlPos;\n while (pos < this._xmlEnd) {\n const idx = buffer.indexOf('<row', pos);\n if (idx === -1 || idx >= this._xmlEnd) return -1;\n const next = buffer[idx + 4];\n if (next === 0x3e || next === 0x2f || next === 0x20 ||\n next === 0x09 || next === 0x0a || next === 0x0d) {\n return idx;\n }\n pos = idx + 4;\n }\n return -1;\n }\n\n private _parseRowBuffer(rowStart: number, rowEnd: number): void {\n const buffer = this._sheetBuffer!;\n // Reuse the row arrays: readRow() documents that its result is only\n // valid until the next call, and reuse avoids five allocations per row.\n const row = this._currentRow;\n const styles = this._currentStyleIndices;\n const formulas = this._currentFormulas;\n const sharedIndices = this._currentSharedIndices;\n const richTexts = this._currentRichTexts;\n row.length = 0;\n styles.length = 0;\n formulas.length = 0;\n sharedIndices.length = 0;\n richTexts.length = 0;\n\n let pos = tagEndIndex(buffer, rowStart, rowEnd) + 1;\n let nextCol = 0;\n\n while (pos < rowEnd) {\n const cStart = indexOfTag(buffer, 0x63, pos, rowEnd);\n if (cStart === -1) break;\n const afterName = buffer[cStart + 2];\n if (afterName !== 0x3e && afterName !== 0x2f && afterName !== 0x20 &&\n afterName !== 0x09 && afterName !== 0x0a && afterName !== 0x0d) {\n pos = cStart + 2;\n continue;\n }\n const tagEnd = tagEndIndex(buffer, cStart, rowEnd);\n if (tagEnd === -1) break;\n\n const attrs = parseCellAttributes(buffer, cStart, tagEnd);\n const type = attrs.type;\n const styleIndex = attrs.style;\n\n let finalVal: CellValue = null;\n let formula: string | null = null;\n let sharedIndex = -1;\n let richText: RichText | null = null;\n if (buffer[tagEnd - 1] === 0x2f) {\n pos = tagEnd + 1;\n } else {\n const contentStart = tagEnd + 1;\n const cEnd = indexOfCloseTag(buffer, 0x63, contentStart, rowEnd);\n const contentEnd = cEnd === -1 ? rowEnd : cEnd;\n\n // ECMA-376 puts <f> first when present, so this avoids scanning\n // every cell for a formula that is almost never there.\n if (buffer[contentStart] === BYTE_LT && buffer[contentStart + 1] === 0x66) {\n formula = this._extractFormulaBuffer(buffer, contentStart, contentEnd);\n }\n\n const vOpen = indexOfTag(buffer, 0x76, contentStart, contentEnd);\n if (vOpen !== -1) {\n const vTagEnd = tagEndIndex(buffer, vOpen, contentEnd);\n if (vTagEnd !== -1) {\n const valueStart = vTagEnd + 1;\n // `<` never appears literally inside <v>; the next one\n // closes the element.\n const vEnd = indexOfByte(buffer, BYTE_LT, valueStart, contentEnd);\n if (vEnd !== -1) {\n finalVal = this._decodeCellValue(\n buffer, valueStart, vEnd, type, styleIndex,\n );\n if (type === CELL_TYPE_SHARED) {\n sharedIndex = parseUint(buffer, valueStart, vEnd);\n }\n }\n }\n } else if (type === CELL_TYPE_INLINE) {\n finalVal = this._decodeInlineBuffer(buffer, contentStart, contentEnd);\n // Skip the rich-text regexes for plain inline strings.\n if (indexOfTag(buffer, 0x72, contentStart, contentEnd) !== -1) {\n richText = parseXlsxInlineRichText(\n buffer.toString('utf8', contentStart, contentEnd),\n );\n }\n }\n pos = contentEnd + 4;\n }\n\n const normalizedCol = attrs.col === -1 ? nextCol : attrs.col;\n nextCol = normalizedCol + 1;\n row[normalizedCol] = finalVal;\n styles[normalizedCol] = styleIndex;\n formulas[normalizedCol] = formula;\n sharedIndices[normalizedCol] = sharedIndex;\n richTexts[normalizedCol] = richText;\n if (normalizedCol >= this.fieldCount) this.fieldCount = normalizedCol + 1;\n }\n }\n\n /** Concatenated `<t>` runs of an inline-string cell body. */\n private _decodeInlineBuffer(buffer: Buffer, start: number, end: number): CellValue {\n let value = '';\n let sawText = false;\n let pos = start;\n while (true) {\n const tStart = indexOfTag(buffer, 0x74, pos, end);\n if (tStart === -1) break;\n const tTagEnd = tagEndIndex(buffer, tStart, end);\n if (tTagEnd === -1) break;\n const tContentStart = tTagEnd + 1;\n const tEnd = indexOfCloseTag(buffer, 0x74, tContentStart, end);\n if (tEnd === -1) break;\n value += buffer.toString('utf8', tContentStart, tEnd);\n sawText = true;\n pos = tEnd + 4;\n }\n return sawText ? unescapeXmlText(value) : null;\n }\n\n private _extractFormulaBuffer(buffer: Buffer, start: number, end: number): string | null {\n // The caller already verified that the cell body starts with `<f`.\n const fTagEnd = tagEndIndex(buffer, start, end);\n if (fTagEnd === -1 || buffer[fTagEnd - 1] === 0x2f) return null;\n const fEnd = indexOfCloseTag(buffer, 0x66, fTagEnd + 1, end);\n if (fEnd === -1) return null;\n return unescapeXml(buffer.toString('utf8', fTagEnd + 1, fEnd));\n }\n\n private _decodeCellValue(buffer: Buffer, start: number, end: number, type: number, styleIndex: number): CellValue {\n if (type === CELL_TYPE_SHARED) {\n const index = parseUint(buffer, start, end);\n return index >= 0 ? (this.sharedStrings[index] ?? null) : null;\n }\n if (type === CELL_TYPE_NUM) {\n const value = parseNumberBytes(buffer, start, end);\n if (this._isDateStyle(styleIndex)) {\n try {\n return this.getDateTimeFromOaDate(value);\n } catch {\n return value;\n }\n }\n return value;\n }\n const text = buffer.toString('utf8', start, end);\n if (type === CELL_TYPE_BOOL) {\n return text === '1' || text === 'true';\n }\n if (type === CELL_TYPE_INLINE || type === CELL_TYPE_STR) {\n return text.indexOf('&') === -1 && text.indexOf('_x') === -1 ? text : unescapeXmlText(text);\n }\n if (type === CELL_TYPE_ERROR) {\n return unescapeXml(text);\n }\n if (type === CELL_TYPE_DATE) {\n return parseIsoDateUtc(text) ?? unescapeXmlText(text);\n }\n return parseFloat(text);\n }\n\n // ------------------------------------------------------------------\n // String fallback (unusual markup)\n // ------------------------------------------------------------------\n\n private _readNextRowString(): boolean {\n if (this._sheetXml === null) return false;\n if (this._pendingEmptyCount > 0) {\n this._pendingEmptyCount--;\n this._resetCurrentRow();\n this._expectedRowNum++;\n return true;\n }\n\n const rowStart = this._findRowTagStartString(this._xmlPos);\n if (rowStart === -1) return false;\n\n const rowTagEnd = this._sheetXml.indexOf('>', rowStart);\n if (rowTagEnd === -1) return false;\n const rowTag = this._sheetXml.substring(rowStart, rowTagEnd + 1);\n const isSelfClosing = this._sheetXml.charCodeAt(rowTagEnd - 1) === 47;\n const rowAttrs = parseTagAttributes(rowTag);\n const rRaw = rowAttrs['r'];\n let rowNum = this._expectedRowNum;\n if (rRaw !== undefined) {\n const parsed = parseInt(rRaw, 10);\n if (Number.isFinite(parsed) && parsed >= 1 && parsed <= MAX_ROWS) rowNum = parsed;\n }\n\n if (rowNum > this._expectedRowNum) {\n const gap = rowNum - this._expectedRowNum;\n this._pendingEmptyCount = gap - 1;\n this._resetCurrentRow();\n this._expectedRowNum++;\n return true;\n }\n if (rowNum < this._expectedRowNum) {\n if (isSelfClosing) {\n this._xmlPos = rowTagEnd + 1;\n this._resetCurrentRow();\n return true;\n }\n const rowEnd = this._sheetXml.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n this._xmlPos = rowEnd + 6;\n this._parseRowString(rowStart, rowEnd);\n this._expectedRowNum = Math.max(this._expectedRowNum + 1, rowNum + 1);\n return true;\n }\n\n if (isSelfClosing) {\n this._xmlPos = rowTagEnd + 1;\n this._resetCurrentRow();\n this._expectedRowNum = rowNum + 1;\n return true;\n }\n\n const rowEnd = this._sheetXml.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n this._xmlPos = rowEnd + 6;\n this._parseRowString(rowStart, rowEnd);\n this._expectedRowNum = rowNum + 1;\n return true;\n }\n\n private _findRowTagStartString(from: number): number {\n const xml = this._sheetXml!;\n let pos = from;\n while (pos < this._xmlEnd) {\n const idx = xml.indexOf('<row', pos);\n if (idx === -1 || idx >= this._xmlEnd) return -1;\n const next = xml.charCodeAt(idx + 4);\n if (next === 0x3e || next === 0x2f || next === 0x20 ||\n next === 0x09 || next === 0x0a || next === 0x0d) {\n return idx;\n }\n pos = idx + 4;\n }\n return -1;\n }\n\n private _parseRowString(rowStart: number, rowEnd: number): void {\n this._resetCurrentRow();\n const styles: number[] = [];\n const formulas: Array<string | null> = [];\n const sharedIndices: number[] = [];\n const richTexts: Array<RichText | null> = [];\n const xml = this._sheetXml!;\n let pos = xml.indexOf('>', rowStart) + 1;\n let nextCol = 0;\n\n while (pos < rowEnd) {\n const cStart = stringIndexOfWithin(xml, '<c', pos, rowEnd);\n if (cStart === -1) break;\n const nextTagClose = stringIndexOfWithin(xml, '>', cStart, rowEnd);\n if (nextTagClose === -1) break;\n let colIndex = -1;\n let type = 'n';\n let styleIndex = 0;\n\n let currentIdx = cStart + 2;\n while (currentIdx < nextTagClose) {\n while (xml.charCodeAt(currentIdx) <= 32 && currentIdx < nextTagClose) currentIdx++;\n if (currentIdx >= nextTagClose) break;\n const keyStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 61 && currentIdx < nextTagClose) currentIdx++;\n const key = xml.substring(keyStart, currentIdx);\n currentIdx++;\n if (xml.charCodeAt(currentIdx) === 34) {\n currentIdx++;\n const valStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 34 && currentIdx < nextTagClose) currentIdx++;\n const val = xml.substring(valStart, currentIdx);\n currentIdx++;\n if (key === 'r') {\n let letterLen = 0;\n while (letterLen < val.length && val.charCodeAt(letterLen) >= 65) letterLen++;\n colIndex = columnLetterToIndex(val.substring(0, letterLen));\n } else if (key === 't') {\n type = val;\n } else if (key === 's') {\n styleIndex = parseInt(val, 10);\n }\n }\n }\n\n let val: string | null = null;\n let inlineVals: string[] | null = null;\n let richText: RichText | null = null;\n let cellContentEnd = rowEnd;\n if (xml.charCodeAt(nextTagClose - 1) === 47) {\n // A self-closing cell has no body; keep the scan range empty so\n // the formula/rich-text extraction below does not read later cells.\n cellContentEnd = nextTagClose;\n pos = nextTagClose + 1;\n } else {\n const cEnd = stringIndexOfWithin(xml, '</c>', nextTagClose, rowEnd);\n cellContentEnd = cEnd === -1 ? rowEnd : cEnd;\n const vStart = stringIndexOfWithin(xml, '<v>', nextTagClose, cellContentEnd);\n if (vStart !== -1) {\n const vInnerStart = vStart + 3;\n const vEnd = stringIndexOfWithin(xml, '</v>', vInnerStart, cellContentEnd);\n if (vEnd !== -1) val = xml.substring(vInnerStart, vEnd);\n } else if (type === 'inlineStr') {\n inlineVals = [];\n let tSearch = nextTagClose;\n while (true) {\n const tStart = stringIndexOfWithin(xml, '<t', tSearch, cellContentEnd);\n if (tStart === -1) break;\n const tClose = stringIndexOfWithin(xml, '>', tStart, cellContentEnd);\n if (tClose === -1) break;\n const tContentStart = tClose + 1;\n const tEnd = stringIndexOfWithin(xml, '</t>', tContentStart, cellContentEnd);\n if (tEnd === -1) break;\n inlineVals.push(xml.substring(tContentStart, tEnd));\n tSearch = tEnd + 4;\n }\n if (inlineVals.length === 0) inlineVals = null;\n }\n pos = cellContentEnd + 4;\n }\n\n let finalVal: CellValue = null;\n if (inlineVals !== null) {\n finalVal = unescapeXmlText(inlineVals.join(''));\n } else if (val !== null) {\n if (type === 's') {\n finalVal = this.sharedStrings[parseInt(val, 10)] ?? null;\n } else if (type === 'b') {\n finalVal = (val === '1' || val === 'true');\n } else if (type === 'inlineStr' || type === 'str') {\n finalVal = unescapeXmlText(val);\n } else if (type === 'e') {\n finalVal = unescapeXml(val);\n } else if (type === 'd') {\n finalVal = parseIsoDateUtc(val) ?? unescapeXmlText(val);\n } else {\n finalVal = parseFloat(val);\n if (this._isDateStyle(styleIndex)) {\n try {\n finalVal = this.getDateTimeFromOaDate(finalVal);\n } catch {\n // keep the serial\n }\n }\n }\n }\n\n if (colIndex === -1) colIndex = nextCol;\n nextCol = colIndex + 1;\n this._currentRow[colIndex] = finalVal;\n styles[colIndex] = styleIndex;\n formulas[colIndex] = this._extractFormulaString(xml, nextTagClose, cellContentEnd);\n if (type === 'inlineStr' && cellContentEnd > nextTagClose) {\n richText = parseXlsxInlineRichText(xml.substring(nextTagClose + 1, cellContentEnd));\n }\n richTexts[colIndex] = richText;\n sharedIndices[colIndex] = type === 's' && val !== null\n ? (Number.isFinite(parseInt(val, 10)) ? parseInt(val, 10) : -1)\n : -1;\n if (colIndex >= this.fieldCount) this.fieldCount = colIndex + 1;\n }\n this._currentStyleIndices = styles;\n this._currentFormulas = formulas;\n this._currentSharedIndices = sharedIndices;\n this._currentRichTexts = richTexts;\n }\n\n private _extractFormulaString(xml: string, start: number, end: number): string | null {\n if (end <= start) return null;\n const fStart = stringIndexOfWithin(xml, '<f', start, end);\n if (fStart === -1) return null;\n const fTagEnd = stringIndexOfWithin(xml, '>', fStart, end);\n if (fTagEnd === -1 || xml.charCodeAt(fTagEnd - 1) === 47) return null;\n const fEnd = stringIndexOfWithin(xml, '</f>', fTagEnd + 1, end);\n if (fEnd === -1) return null;\n return unescapeXml(xml.substring(fTagEnd + 1, fEnd));\n }\n\n /** Style of the current row cell at column `i`, or null for the default style. */\n getStyle(i: number): CellStyle | null {\n const xf = this._currentStyleIndices[i];\n if (xf === undefined) return null;\n return this._xfStyles[xf] ?? null;\n }\n\n /** Formula text of the current row cell at column `i`, or null. */\n getFormula(i: number): string | null {\n return this._currentFormulas[i] ?? null;\n }\n\n /** Rich-text runs of the current row cell at column `i`, or null. */\n getRichText(i: number): RichText | null {\n const inline = this._currentRichTexts[i];\n if (inline) return inline;\n const shared = this._currentSharedIndices[i];\n if (shared === undefined || shared < 0) return null;\n return this._sharedRichTexts[shared] ?? null;\n }\n\n private _resetCurrentRow(): void {\n this._currentRow = [];\n this._currentFormulas = [];\n this._currentStyleIndices = [];\n this._currentSharedIndices = [];\n this._currentRichTexts = [];\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsxReader;\n","/**\n * Read-side helpers for XLSX `styles.xml` and rich shared strings.\n *\n * The writer emits a known, simple subset of styles; this parser also accepts\n * the equivalent Excel markup (attribute order, quotes, self-closing tags).\n */\nimport {\n AlignmentStyle,\n BorderSide,\n BorderStyle,\n CellStyle,\n FillStyle,\n FontStyle,\n ProtectionStyle,\n RichText,\n StyleColor,\n} from './Formats';\nimport { unescapeXmlText } from './xmlUtils';\n\nconst BUILTIN_NUMFMTS: Record<number, string> = {\n 1: '0',\n 2: '0.00',\n 3: '#,##0',\n 4: '#,##0.00',\n 9: '0%',\n 10: '0.00%',\n 11: '0.00E+00',\n 14: 'mm-dd-yy',\n 22: 'm/d/yy h:mm',\n 49: '@',\n};\n\nfunction attribute(tag: string, name: string): string | undefined {\n const double = new RegExp(`\\\\b${name}\\\\s*=\\\\s*\"([^\"]*)\"`).exec(tag);\n if (double) return double[1];\n const single = new RegExp(`\\\\b${name}\\\\s*=\\\\s*'([^']*)'`).exec(tag);\n return single?.[1];\n}\n\nfunction parseColorTag(colorTag: string): StyleColor | undefined {\n if (!colorTag) return undefined;\n const rgb = attribute(colorTag, 'rgb');\n if (rgb !== undefined) return rgb;\n const indexed = attribute(colorTag, 'indexed');\n if (indexed !== undefined) return { indexed: parseInt(indexed, 10) };\n const theme = attribute(colorTag, 'theme');\n if (theme !== undefined) {\n const tint = attribute(colorTag, 'tint');\n const color: { theme: number; tint?: number } = { theme: parseInt(theme, 10) };\n if (tint !== undefined) color.tint = parseFloat(tint);\n return color;\n }\n return undefined;\n}\n\nfunction colorFrom(tag: string): StyleColor | undefined {\n const colorTag = /<color\\b[^>]*\\/?>/.exec(tag)?.[0];\n return parseColorTag(colorTag ?? '');\n}\n\nfunction flagValue(block: string, name: string): boolean {\n const match = new RegExp(`<${name}(?:\\\\s+val\\\\s*=\\\\s*[\"']([^\"']*)[\"'])?\\\\s*/?>`).exec(block);\n if (!match) return false;\n const value = match[1];\n return value === undefined || !/^(?:0|false)$/i.test(value);\n}\n\nfunction numberAttribute(tag: string, name: string): number | undefined {\n const value = attribute(tag, name);\n if (value === undefined) return undefined;\n const parsed = parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\n/** Parse the inside of `<font>` or `<rPr>` into a font style. */\nexport function parseXlsxFont(block: string): FontStyle | undefined {\n const font: FontStyle = {};\n const name = /<name\\b[^>]*\\bval\\s*=\\s*[\"']([^\"']*)[\"']/.exec(block)?.[1];\n if (name !== undefined) font.name = unescapeXmlText(name);\n const size = numberAttribute(/<sz\\b[^>]*\\/?>/.exec(block)?.[0] ?? '', 'val');\n if (size !== undefined) font.size = size;\n if (flagValue(block, 'b')) font.bold = true;\n if (flagValue(block, 'i')) font.italic = true;\n if (flagValue(block, 'strike')) font.strike = true;\n if (flagValue(block, 'outline')) font.outline = true;\n if (flagValue(block, 'shadow')) font.shadow = true;\n if (flagValue(block, 'condense')) font.condense = true;\n if (flagValue(block, 'extend')) font.extend = true;\n const underlineTag = /<u\\b[^>]*\\/?>/.exec(block)?.[0];\n if (underlineTag) {\n const value = attribute(underlineTag, 'val');\n if (value === undefined || value === 'single') font.underline = 'single';\n else if (value !== 'none') font.underline = value as FontStyle['underline'];\n }\n const color = colorFrom(block);\n if (color !== undefined) {\n font.color = color;\n }\n const family = numberAttribute(/<family\\b[^>]*\\/?>/.exec(block)?.[0] ?? '', 'val');\n if (family !== undefined) font.family = family;\n const charset = numberAttribute(/<charset\\b[^>]*\\/?>/.exec(block)?.[0] ?? '', 'val');\n if (charset !== undefined) font.charset = charset;\n const scheme = /<scheme\\b[^>]*\\bval\\s*=\\s*[\"']([^\"']*)[\"']/.exec(block)?.[1];\n if (scheme === 'major' || scheme === 'minor') font.scheme = scheme;\n const vertAlign = /<vertAlign\\b[^>]*\\bval\\s*=\\s*[\"']([^\"']*)[\"']/.exec(block)?.[1];\n if (vertAlign === 'superscript' || vertAlign === 'subscript') font.vertAlign = vertAlign;\n return Object.keys(font).length > 0 ? font : undefined;\n}\n\nfunction parseFill(block: string): FillStyle | undefined {\n const patternTag = /<patternFill\\b[^>]*>/.exec(block)?.[0] ?? '';\n const patternType = attribute(patternTag, 'patternType') as FillStyle['patternType'];\n const fgColor = parseColorTag(/<fgColor\\b[^>]*\\/?>/.exec(block)?.[0] ?? '');\n const bgColor = parseColorTag(/<bgColor\\b[^>]*\\/?>/.exec(block)?.[0] ?? '');\n if (patternType === undefined && fgColor === undefined && bgColor === undefined) return undefined;\n const fill: FillStyle = {};\n if (patternType !== undefined) fill.patternType = patternType;\n if (fgColor !== undefined) fill.fgColor = fgColor;\n if (bgColor !== undefined) fill.bgColor = bgColor;\n return fill;\n}\n\nfunction parseBorderSide(block: string, tag: string): BorderSide | undefined {\n const match = new RegExp(`<${tag}(\\\\s[^>]*)?>([\\\\s\\\\S]*?)<\\\\/${tag}>|<${tag}(\\\\s[^>]*)?\\\\/>`).exec(block);\n if (!match) return undefined;\n const openTag = `<${tag}${match[1] ?? match[3] ?? ''}>`;\n const style = attribute(openTag, 'style') as BorderSide['style'];\n const color = colorFrom(match[2] ?? '');\n if (style === undefined && color === undefined) return undefined;\n const side: BorderSide = {};\n if (style !== undefined) side.style = style;\n if (color !== undefined) side.color = color;\n return side;\n}\n\nfunction parseBorder(block: string): BorderStyle | undefined {\n const openTag = /<border\\b[^>]*>/.exec(block)?.[0] ?? '';\n const border: BorderStyle = {};\n for (const name of ['top', 'bottom', 'left', 'right', 'diagonal'] as const) {\n const side = parseBorderSide(block, name);\n if (side) border[name] = side;\n }\n if (/diagonalUp\\s*=\\s*[\"'](?:1|true)[\"']/i.test(openTag)) border.diagonalUp = true;\n if (/diagonalDown\\s*=\\s*[\"'](?:1|true)[\"']/i.test(openTag)) border.diagonalDown = true;\n if (/outline\\s*=\\s*[\"'](?:0|false)[\"']/i.test(openTag)) border.outline = false;\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction parseAlignment(tag: string | undefined): AlignmentStyle | undefined {\n if (!tag) return undefined;\n const alignment: AlignmentStyle = {};\n const horizontal = attribute(tag, 'horizontal');\n if (horizontal !== undefined) alignment.horizontal = horizontal as AlignmentStyle['horizontal'];\n const vertical = attribute(tag, 'vertical');\n if (vertical !== undefined) alignment.vertical = vertical as AlignmentStyle['vertical'];\n if (/wrapText\\s*=\\s*[\"'](?:1|true)[\"']/i.test(tag)) alignment.wrapText = true;\n if (/shrinkToFit\\s*=\\s*[\"'](?:1|true)[\"']/i.test(tag)) alignment.shrinkToFit = true;\n const indent = numberAttribute(tag, 'indent');\n if (indent !== undefined) alignment.indent = indent;\n const rotation = numberAttribute(tag, 'textRotation');\n if (rotation !== undefined) alignment.textRotation = rotation;\n if (/justifyLastLine\\s*=\\s*[\"'](?:1|true)[\"']/i.test(tag)) alignment.justifyLastLine = true;\n const readingOrder = numberAttribute(tag, 'readingOrder');\n if (readingOrder !== undefined) alignment.readingOrder = readingOrder as 0 | 1 | 2;\n return Object.keys(alignment).length > 0 ? alignment : undefined;\n}\n\nfunction parseProtection(tag: string | undefined): ProtectionStyle | undefined {\n if (!tag) return undefined;\n const protection: ProtectionStyle = {};\n if (/locked\\s*=\\s*[\"'](?:0|false)[\"']/i.test(tag)) protection.locked = false;\n if (/hidden\\s*=\\s*[\"'](?:1|true)[\"']/i.test(tag)) protection.hidden = true;\n return Object.keys(protection).length > 0 ? protection : undefined;\n}\n\nexport interface XlsxStyleTable {\n /** Cell style per `cellXfs` index. */\n cellStyles: Array<CellStyle | null>;\n /** Set of XF indices whose number format is a date. */\n dateXfs: Set<number>;\n}\n\n/** Parse `xl/styles.xml` into per-XF cell styles. */\nexport function parseXlsxStyles(xml: string): XlsxStyleTable {\n const numFmts = new Map<number, string>();\n const numFmtRegex = /<numFmt\\b[^>]*>/g;\n let match: RegExpExecArray | null;\n while ((match = numFmtRegex.exec(xml)) !== null) {\n const id = numberAttribute(match[0], 'numFmtId');\n const code = attribute(match[0], 'formatCode');\n if (id !== undefined && code !== undefined) numFmts.set(id, unescapeXmlText(code));\n }\n\n const fonts: Array<FontStyle | undefined> = [];\n const fontsBlock = /<fonts\\b[^>]*>([\\s\\S]*?)<\\/fonts>/.exec(xml)?.[1] ?? '';\n const fontRegex = /<font\\b[^>]*>([\\s\\S]*?)<\\/font>/g;\n while ((match = fontRegex.exec(fontsBlock)) !== null) fonts.push(parseXlsxFont(match[1]));\n\n const fills: Array<FillStyle | undefined> = [];\n const fillsBlock = /<fills\\b[^>]*>([\\s\\S]*?)<\\/fills>/.exec(xml)?.[1] ?? '';\n const fillRegex = /<fill\\b[^>]*>([\\s\\S]*?)<\\/fill>/g;\n while ((match = fillRegex.exec(fillsBlock)) !== null) fills.push(parseFill(match[1]));\n\n const borders: Array<BorderStyle | undefined> = [];\n const bordersBlock = /<borders\\b[^>]*>([\\s\\S]*?)<\\/borders>/.exec(xml)?.[1] ?? '';\n const borderRegex = /<border\\b[^>]*>([\\s\\S]*?)<\\/border>/g;\n while ((match = borderRegex.exec(bordersBlock)) !== null) borders.push(parseBorder(match[0]));\n\n const cellStyles: Array<CellStyle | null> = [];\n const dateXfs = new Set<number>();\n const xfsBlock = /<cellXfs\\b[^>]*>([\\s\\S]*?)<\\/cellXfs>/.exec(xml)?.[1] ?? '';\n const xfRegex = /<xf\\b([^>]*?)(?:\\/>|>([\\s\\S]*?)<\\/xf>)/g;\n let xfIndex = 0;\n while ((match = xfRegex.exec(xfsBlock)) !== null) {\n const openTag = `<xf${match[1]}>`;\n const children = match[2] ?? '';\n const style: CellStyle = {};\n const numFmtId = numberAttribute(openTag, 'numFmtId') ?? 0;\n if (numFmtId !== 0) {\n const code = numFmts.get(numFmtId) ?? BUILTIN_NUMFMTS[numFmtId];\n if (code !== undefined) style.numFmt = code;\n }\n const fontId = numberAttribute(openTag, 'fontId') ?? 0;\n if (fontId !== 0 && fonts[fontId]) {\n style.font = fonts[fontId];\n }\n const fillId = numberAttribute(openTag, 'fillId') ?? 0;\n if (fillId !== 0) {\n const fill = fills[fillId];\n if (fill && fill.patternType !== 'none' && fill.patternType !== 'gray125') {\n style.fill = fill;\n }\n }\n const borderId = numberAttribute(openTag, 'borderId') ?? 0;\n if (borderId !== 0 && borders[borderId]) style.border = borders[borderId];\n const alignment = parseAlignment(/<alignment\\b[^>]*\\/?>/.exec(children)?.[0]);\n const protection = parseProtection(/<protection\\b[^>]*\\/?>/.exec(children)?.[0]);\n if (alignment) style.alignment = alignment;\n if (protection) style.protection = protection;\n\n const isDate = numFmtId >= 14 && numFmtId <= 22;\n if (isDate) dateXfs.add(xfIndex);\n cellStyles.push(Object.keys(style).length > 0 ? style : null);\n xfIndex++;\n }\n\n return { cellStyles, dateXfs };\n}\n\n/** Parse `<r>` runs inside a shared-string `<si>` or an inline `<is>`. */\nfunction parseRichRuns(content: string): Array<{ text: string; style?: CellStyle }> {\n const runs: Array<{ text: string; style?: CellStyle }> = [];\n const runRegex = /<r\\b[^>]*>([\\s\\S]*?)<\\/r>/g;\n let run: RegExpExecArray | null;\n while ((run = runRegex.exec(content)) !== null) {\n const fontBlock = /<rPr\\b[^>]*>([\\s\\S]*?)<\\/rPr>/.exec(run[1])?.[1];\n const text = /<t\\b[^>]*>([\\s\\S]*?)<\\/t>/.exec(run[1])?.[1] ?? '';\n const runStyle = fontBlock ? parseXlsxFont(fontBlock) : undefined;\n runs.push({\n text: unescapeXmlText(text),\n style: runStyle ? { font: runStyle } : undefined,\n });\n }\n return runs;\n}\n\n/** Parse rich-text runs from an inline-string `<is>` body. */\nexport function parseXlsxInlineRichText(content: string): RichText | null {\n const runs = parseRichRuns(content.replace(/<rPh\\b[^>]*>[\\s\\S]*?<\\/rPh>/g, ''));\n return runs.length > 0 ? new RichText(runs) : null;\n}\n\n/** Parse rich-text runs from `xl/sharedStrings.xml`; plain entries are null. */\nexport function parseXlsxRichTexts(xml: string): Array<RichText | null> {\n const result: Array<RichText | null> = [];\n const itemRegex = /<si\\b[^>]*>([\\s\\S]*?)<\\/si>|<si\\b[^>]*\\/>/g;\n let item: RegExpExecArray | null;\n while ((item = itemRegex.exec(xml)) !== null) {\n const content = (item[1] ?? '')\n .replace(/<rPh\\b[^>]*>[\\s\\S]*?<\\/rPh>/g, '')\n .replace(/<rPh\\b[^>]*\\/>/g, '');\n const runs = parseRichRuns(content);\n result.push(runs.length > 0 ? new RichText(runs) : null);\n }\n return result;\n}\n","import * as path from 'path';\nimport { XlsxReader } from './XlsxReader';\nimport { XlsbReader } from './XlsbReader';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\n\n/**\n * Create an XLSB or XLSX reader based on the file extension.\n */\nexport class ReaderFactory {\n /**\n * @param filePath Path ending in `.xlsb` or `.xlsx`\n * @throws if the extension is unsupported\n */\n static create(filePath: string): ExcelReaderAbstract {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.xlsx') {\n return new XlsxReader();\n } else if (ext === '.xlsb') {\n return new XlsbReader();\n } else {\n throw new Error(`Unsupported extension: ${ext}`);\n }\n }\n}\n\nexport default ReaderFactory;\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport {\n CellValue,\n ExcelError,\n FormulaCell,\n getCellStyle,\n getFormula,\n isRichText,\n unwrapCell,\n} from './Formats';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n assertColumnWidth,\n defaultColWidth,\n assertCellTextLength,\n assertColumnCount,\n assertRowFitsColumns,\n assertRowCount,\n timeToOaDate,\n dateHasTime,\n AUTOFIT_SAMPLE_ROWS,\n resolveAutofitRows,\n assertCompressionLevel,\n DEFAULT_COMPRESSION_LEVEL,\n} from './writerHelpers';\nimport {\n writeXlsbBool,\n writeXlsbDouble,\n writeXlsbError,\n writeXlsbInlineString,\n writeXlsbIsst,\n writeXlsbRkInteger,\n writeXlsbRowHeader,\n writeXlsbSharedStrings,\n XLSB_STYLES_TEMPLATE,\n} from './writers/core/xlsbRecords';\nimport { XlsbStyleRegistry } from './writers/core/xlsbStyles';\nimport { buildXlsbFormulaRecord } from './writers/core/xlsbFormula';\nimport {\n buildXlsbHyperlinkRecord,\n buildXlsbMergeRecords,\n buildXlsbValidationRecords,\n parseXlsbRange,\n} from './writers/core/xlsbSheetFeatures';\nimport {\n DataValidationSpec,\n HyperlinkSpec,\n XlsxSheetFeatures,\n} from './writers/core/xlsxParts';\nimport { escapeXmlText } from './xmlUtils';\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n filterHeaderRange: string | null;\n filterData?: {\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n };\n merges?: string[];\n dataValidations?: DataValidationSpec[];\n hyperlinks?: Array<{ spec: HyperlinkSpec; rId?: string; row: number; col: number }>;\n}\n\n/** Options accepted by the XLSB streaming and batch sheet APIs. */\nexport interface XlsbSheetOptions extends XlsxSheetFeatures {\n hidden?: boolean;\n doAutofilter?: boolean;\n sampleRows?: unknown[][];\n /** Conservative autofit from headers and the first rows (default true). */\n autofit?: boolean;\n /** Rows measured by autofit (default 200); 0 measures only headers/samples. */\n autofitRows?: number;\n /** Fixed widths in Excel character units; skips autofit when provided. */\n columnWidths?: Array<number | null | undefined>;\n}\n\n/**\n * High-performance XLSB (Excel Binary Workbook) writer.\n * Prefer this format for large datasets — typically faster and smaller than XLSX.\n */\nexport class XlsbWriter {\n private output: fs.WriteStream;\n private archive: ReturnType<typeof archiver>;\n private readonly _targetPath: string;\n private readonly _tempPath: string;\n private _outputError: Error | null = null;\n private _finalized: boolean = false;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstDic: Map<string, number> = new Map();\n private sstCntUnique: number = 0;\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n private readonly _useSharedStrings: boolean;\n private readonly _styles = new XlsbStyleRegistry();\n\n /** Worksheet binary template (BrtBeginSheet … dimension / views / cols placeholders). */\n private _sheet1Bytes: Buffer;\n private _workbookBinStart: Buffer;\n private _workbookBinMiddle: Buffer;\n private _workbookBinEnd: Buffer;\n /** Default styles.bin template; extended when custom number formats are registered. */\n private _stylesBin: Buffer;\n private _binaryIndexBin: Buffer;\n private _rRkIntegerLowerLimit: number;\n private _rRkIntegerUpperLimit: number;\n private _autoFilterStartBytes: Buffer;\n private _autoFilterEndBytes: Buffer;\n private _stickHeaderA1bytes: Buffer;\n /** Excel 2016+ autofilter compatibility stubs. */\n private _magicFilterExcel2016Fix0: Buffer;\n private _magicFilterExcel2016Fix1: Buffer;\n private _magicFilterExcel2016Fix2: Buffer;\n\n private readonly stream = new StreamingSheetState();\n private _streamPending: BigBuffer | null = null;\n private _streamHeadFlushed: boolean = true;\n private _streamHasHeaders: boolean = false;\n private _streamDataRows: number = 0;\n private _streamAutofitRows: number = AUTOFIT_SAMPLE_ROWS;\n\n\n /**\n * @param filePath Destination `.xlsb` path on disk.\n */\n /**\n * @param filePath Destination `.xlsb` path on disk.\n * @param options.compressionLevel Deflate level 0-9 (default 3).\n */\n constructor(filePath: string, options: { compressionLevel?: number; useSharedStrings?: boolean } = {}) {\n const compressionLevel = assertCompressionLevel(options.compressionLevel ?? DEFAULT_COMPRESSION_LEVEL);\n this._useSharedStrings = options.useSharedStrings !== false;\n this._targetPath = path.resolve(filePath);\n fs.mkdirSync(path.dirname(this._targetPath), { recursive: true });\n this._tempPath = path.join(\n path.dirname(this._targetPath),\n `.${path.basename(this._targetPath)}.${randomUUID()}.tmp`\n );\n this.output = fs.createWriteStream(this._tempPath);\n this.output.on('error', (err: Error) => { this._outputError = err; });\n this.archive = archiver('zip', { zlib: { level: compressionLevel } });\n this.archive.on('error', (err: Error) => { this._outputError = err; });\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n this._sheet1Bytes = Buffer.from([\n 0x81, 0x01, 0x00, 0x93, 0x01, 0x17, 0xCB, 0x04,\n 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n 0xFF, 0x00, 0x00, 0x00, 0x00, 0x94, 0x01, 0x10,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x85, 0x01, 0x00, 0x89, 0x01, 0x1E, 0xDC, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x98, 0x01, 0x24, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x8A, 0x01, 0x00, 0x86, 0x01,\n 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E, 0x00,\n 0x80, 0x95, 0x08, 0x02, 0x05, 0x00, 0x26, 0x00,\n 0xE5, 0x03, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x08,\n 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x91,\n 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E,\n 0x00, 0x80, 0x80, 0x08, 0x02, 0x05, 0x00, 0x26,\n 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00,\n 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x92, 0x01, 0x00, 0x97, 0x04, 0x42,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00,\n 0xDD, 0x03, 0x02, 0x10, 0x00, 0xDC, 0x03, 0x30,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80,\n 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x26, 0x00, 0x82, 0x01, 0x00\n ]);\n\n this._workbookBinStart = Buffer.from([\n 0x83, 0x01, 0x00, 0x80, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x78, 0x00, 0x6C, 0x00, 0x01, 0x00, 0x00, 0x00,\n 0x37, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x33, 0x00, 0x32, 0x00, 0x36, 0x00, 0x99, 0x01, 0x0C, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x25, 0x06, 0x01, 0x00, 0x03, 0x0F, 0x00, 0x80, 0x97, 0x10, 0x34, 0x18, 0x00, 0x00, 0x00, 0x43, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x73, 0x00, 0x71, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x5C, 0x00,\n 0x54, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x69, 0x00, 0x73, 0x00, 0x75, 0x00, 0x58, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x26, 0x00,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x81, 0x18, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x31, 0x00, 0x33, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x63, 0x00,\n 0x72, 0x00, 0x3A, 0x00, 0x31, 0x00, 0x5F, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x36, 0x00, 0x35, 0x00, 0x30, 0x00, 0x38, 0x00, 0x44, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x46, 0x00, 0x38, 0x00,\n 0x37, 0x00, 0x2D, 0x00, 0x34, 0x00, 0x37, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x38, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x34, 0x00, 0x41, 0x00, 0x34, 0x00, 0x30, 0x00,\n 0x31, 0x00, 0x31, 0x00, 0x33, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x7D, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x87, 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x10, 0x00, 0x80, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x9E, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x16, 0x00, 0x00, 0xB4, 0x69, 0x00, 0x00, 0xE8, 0x26, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x78, 0x88, 0x01, 0x00,\n 0x8F, 0x01, 0x00\n ]);\n\n this._workbookBinMiddle = Buffer.from([0x90, 0x01, 0x00]);\n\n this._workbookBinEnd = Buffer.from([\n 0x9D, 0x01, 0x1A, 0x35, 0xEA, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0xFC, 0xA9, 0xF1, 0xD2, 0x4D, 0x62, 0x50, 0x3F, 0x01,\n 0x00, 0x00, 0x00, 0x6A, 0x00, 0x9B, 0x01, 0x01, 0x00, 0x23, 0x04, 0x03, 0x0F, 0x00, 0x00, 0xAB, 0x10, 0x01, 0x01, 0x24, 0x00, 0x84, 0x01, 0x00\n ]);\n\n this._stylesBin = Buffer.from(XLSB_STYLES_TEMPLATE);\n\n this._binaryIndexBin = Buffer.from([\n 0x2A, 0x18, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95,\n 0x02, 0x00\n ]);\n\n this._rRkIntegerLowerLimit = -1 << 29;\n this._rRkIntegerUpperLimit = (1 << 29) - 1;\n\n this._autoFilterStartBytes = Buffer.from([0xA1, 0x01, 0x10]);\n this._autoFilterEndBytes = Buffer.from([0xA2, 0x01, 0x00]);\n\n this._stickHeaderA1bytes = Buffer.from([\n 0x97, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xF0, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03\n ]);\n\n this._magicFilterExcel2016Fix0 = Buffer.from([0xE1, 0x02, 0x00, 0xE5, 0x02, 0x00, 0xEA, 0x02]);\n this._magicFilterExcel2016Fix1 = Buffer.from([\n 0x27, 0x46, 0x21, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x5F,\n 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x61,\n 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x0F, 0x00, 0x00,\n 0x00, 0x3B, 0xFF, 0x00\n ]);\n this._magicFilterExcel2016Fix2 = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF]);\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n private _buildStylesBin(): Uint8Array {\n return this._styles.toStylesBin(this._stylesBin);\n }\n\n /**\n * Resolve column widths: explicit `columnWidths` win, otherwise plain\n * autofit from headers and up to 200 sample rows, capped at 200.\n */\n private _resolveColumnWidths(\n columnCount: number,\n headers: string[] | null | undefined,\n rows: unknown[][] | undefined,\n options: XlsbSheetOptions,\n doAutofilter: boolean,\n ): number[] {\n const widths = initColWidths(columnCount);\n if (options.columnWidths) {\n for (let i = 0; i < columnCount; i++) {\n const width = options.columnWidths[i];\n if (width !== null && width !== undefined) widths[i] = assertColumnWidth(width, i);\n }\n return widths;\n }\n if (options.autofit === false) return widths;\n if (headers) {\n applyHeaderWidths(widths, headers, columnCount, {\n bold: true,\n filterButton: doAutofilter,\n });\n }\n const samples = options.sampleRows ?? rows;\n const limit = options.sampleRows\n ? samples?.length ?? 0\n : resolveAutofitRows(options.autofitRows);\n if (samples && limit > 0) updateColWidthsFromRows(widths, samples, limit);\n return widths;\n }\n\n /** Store supported sheet features; reject the ones XLSB does not emit yet. */\n private _applySheetFeatures(sheet: SheetInfo, features: XlsbSheetOptions): void {\n if (features.conditionalFormats && features.conditionalFormats.length > 0) {\n throw new Error('Conditional formatting is not supported by XlsbWriter yet; use XlsxWriter.');\n }\n if (features.comments && features.comments.length > 0) {\n throw new Error('Cell comments are not supported by XlsbWriter yet; use XlsxWriter.');\n }\n if (features.merges) sheet.merges = features.merges;\n if (features.dataValidations) sheet.dataValidations = features.dataValidations;\n if (features.hyperlinks && features.hyperlinks.length > 0) {\n let nextRelId = 2; // rId1 is the worksheet binary index\n sheet.hyperlinks = features.hyperlinks.map(spec => {\n const range = parseXlsbRange(spec.ref);\n const internal = spec.target === undefined;\n const rId = internal ? undefined : `rId${nextRelId++}`;\n return { spec, rId, row: range.r1, col: range.c1 };\n });\n }\n }\n\n /** Merged cells, validations and hyperlinks go after the autoFilter. */\n private _writeFeatureRecords(bigBuf: BigBuffer, sheet: SheetInfo): void {\n if (sheet.merges && sheet.merges.length > 0) {\n bigBuf.write(buildXlsbMergeRecords(sheet.merges));\n }\n if (sheet.dataValidations && sheet.dataValidations.length > 0) {\n bigBuf.write(buildXlsbValidationRecords(sheet.dataValidations));\n }\n for (const link of sheet.hyperlinks ?? []) {\n bigBuf.write(buildXlsbHyperlinkRecord(link.row, link.col, link.spec, link.rId));\n }\n }\n\n /** Write one cell using the current style registry and formula compiler. */\n private _writeCell(bigBuf: BigBuffer, raw: CellValue, col: number): void {\n if (raw === null || raw === undefined) return;\n\n const style = getCellStyle(raw);\n let styleNum = style !== null ? this._styles.register(style) : 0;\n\n const formula = getFormula(raw);\n if (formula !== null) {\n const rawCached = (raw as FormulaCell).value;\n let cached: string | number | boolean | ExcelError | null | undefined;\n if (rawCached instanceof Date) {\n cached = timeToOaDate(rawCached.getTime(), this._oaEpoch);\n if (styleNum === 0) styleNum = dateHasTime(rawCached) ? 2 : 1;\n } else if (isRichText(rawCached)) {\n cached = rawCached.toString();\n } else if (typeof rawCached === 'bigint') {\n cached = rawCached.toString();\n } else {\n cached = rawCached;\n }\n bigBuf.write(buildXlsbFormulaRecord(col, styleNum, formula, cached));\n return;\n }\n\n const val = unwrapCell(raw);\n if (val === null || val === undefined) return;\n if (isRichText(val)) {\n throw new Error('Rich text is not supported by XlsbWriter yet; use XlsxWriter.');\n }\n\n if (typeof val === 'number') {\n if (Number.isInteger(val)) {\n if (val >= this._rRkIntegerLowerLimit && val <= this._rRkIntegerUpperLimit) {\n this.writeRkNumberInteger(bigBuf, val, col, styleNum);\n } else {\n this.writeDouble(bigBuf, val, col, styleNum);\n }\n } else {\n this.writeDouble(bigBuf, val, col, styleNum);\n }\n } else if (val instanceof ExcelError) {\n this.writeError(bigBuf, val.code, col, styleNum);\n } else if (typeof val === 'bigint') {\n this.writeString(bigBuf, val.toString(), col, false, styleNum);\n } else if (typeof val === 'boolean') {\n this.writeBool(bigBuf, val, col, styleNum);\n } else if (val instanceof Date) {\n const oaDate = timeToOaDate(val.getTime(), this._oaEpoch);\n const dateStyle = dateHasTime(val) ? 2 : 1;\n this.writeDouble(bigBuf, oaDate, col, styleNum !== 0 ? styleNum : dateStyle);\n } else {\n this.writeString(bigBuf, val.toString(), col, false, styleNum);\n }\n }\n\n/**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n * @param sheetName Display name (sanitized to Excel rules)\n * @param hidden Whether the sheet is hidden in Excel\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n this.sheetCount++;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/sheet${this.sheetCount}.bin`,\n hidden: hidden,\n nameInArchive: `sheet${this.sheetCount}.bin`,\n sheetId: this.sheetCount,\n filterHeaderRange: null\n });\n }\n\n /**\n * Start a new sheet in streaming mode. Call writeRow() for each row, then endSheet() when done.\n * @param sheetName Name of the sheet\n * @param columnCount Number of columns in the sheet\n * @param headers Optional header row\n * @param options Optional settings (hidden, doAutofilter)\n */\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: XlsbSheetOptions = {}\n ): void {\n assertColumnCount(columnCount);\n if (headers !== undefined) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n const { hidden = false, doAutofilter = true } = options;\n\n // Add sheet metadata\n this.addSheet(sheetName, hidden);\n const sheet = this.sheetList[this.sheetCount - 1];\n this._applySheetFeatures(sheet, options);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n\n this.stream.colWidths = this._resolveColumnWidths(\n columnCount,\n headers,\n undefined,\n options,\n doAutofilter && headers !== undefined,\n );\n\n // The sheet head carries the widths, so it is delayed until the first\n // AUTOFIT_SAMPLE_ROWS rows have been measured (200 by default).\n this._streamPending = new BigBuffer();\n this._streamHeadFlushed = false;\n this._streamHasHeaders = headers !== undefined;\n this._streamDataRows = 0;\n this._streamAutofitRows = resolveAutofitRows(options.autofitRows);\n\n // Write header row if provided\n if (headers) {\n const pending = this._streamPending;\n this.createRowHeader(pending, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(pending, headers[c], c, true);\n }\n this.stream.rowNum++;\n }\n if (this._streamAutofitRows === 0) this._flushStreamHead();\n }\n\n /** Write the delayed sheet head and everything buffered before it. */\n private _flushStreamHead(): void {\n if (this._streamHeadFlushed) return;\n const bigBuf = this.stream.assertStreaming();\n const pending = this._streamPending;\n\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n sheetHeader.writeInt32LE(this.stream.startCol, 40);\n sheetHeader.writeInt32LE(this.stream.endCol - 1, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n // Write sticky header if headers are present\n if (this._streamHasHeaders) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n // Write column definitions\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n for (let i = this.stream.startCol; i < this.stream.endCol; i++) {\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(this.stream.colWidths[i]);\n bigBuf.writeInt32LE(Math.max(0, Math.min(255 * 256, Math.round(width * 256))));\n\n bigBuf.writeInt32LE(0);\n bigBuf.writeByte(2);\n bigBuf.writeByte(0);\n }\n\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n if (pending) {\n for (const chunk of pending.getChunks()) bigBuf.write(chunk);\n }\n this._streamPending = null;\n this._streamHeadFlushed = true;\n }\n\n private _writeStreamRow(bigBuf: BigBuffer, row: CellValue[]): void {\n assertRowCount(this.stream.rowNum + 1);\n this.createRowHeader(bigBuf, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n for (let c = 0; c < row.length; c++) {\n this._writeCell(bigBuf, row[c], c);\n }\n this.stream.rowNum++;\n }\n\n /**\n * Write a single row in streaming mode. Must be called between startSheet() and endSheet().\n * @param row Array of cell values\n */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n\n if (!this._streamHeadFlushed && this._streamPending) {\n this._streamDataRows++;\n updateColWidthsFromRows(this.stream.colWidths, [row]);\n this._writeStreamRow(this._streamPending, row);\n if (this._streamDataRows >= this._streamAutofitRows) this._flushStreamHead();\n return;\n }\n this._writeStreamRow(bigBuf, row);\n }\n\n /**\n * Finalize the current streaming sheet and add it to the archive.\n * Must be called after startSheet() and writeRow() calls.\n */\n endSheet(): void {\n this._flushStreamHead();\n const bigBuf = this.stream.assertStreaming();\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n\n // Write sheet footer sections\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n // Write autofilter if enabled\n if (this.stream.doAutofilter) {\n this._autofilterIsOn = true;\n const endRow = this.stream.rowNum;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(this.stream.startCol, 0);\n colBuf.writeInt32LE(this.stream.endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n // Store filter data for later\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: endRow - 1,\n startColumn: this.stream.startCol,\n endColumn: this.stream.endCol - 1\n };\n }\n\n this._writeFeatureRecords(bigBuf, this.sheetList[this.sheetCount - 1]);\n\n bigBuf.write(sheetHeader.subarray(290));\n\n // BrtWsDim was written with row 0; patch the inclusive last row now\n // that the row count is known (fixed offset 36 in the sheet header).\n bigBuf.patchInt32LE(36, Math.max(0, this.stream.rowNum - 1));\n\n // Add to archive\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n\n // Reset streaming state\n this.stream.end();\n this._streamPending = null;\n this._streamHeadFlushed = true;\n this._streamHasHeaders = false;\n this._streamDataRows = 0;\n this._streamAutofitRows = AUTOFIT_SAMPLE_ROWS;\n }\n\n\n /**\n * Write an entire sheet in one call (batch mode).\n *\n * The third argument keeps the legacy `doAutofilter` boolean; pass\n * {@link XlsbSheetOptions} instead to add merges, hyperlinks, validations\n * and width control.\n */\n writeSheet(\n rows: CellValue[][],\n headers: string[] | null = null,\n doAutofilterOrOptions: boolean | XlsbSheetOptions = true,\n extraOptions: XlsbSheetOptions = {},\n ): void {\n let doAutofilter = true;\n let options: XlsbSheetOptions;\n if (typeof doAutofilterOrOptions === 'boolean') {\n // The options object is the newer API; an explicit `doAutofilter`\n // there wins over the legacy positional boolean.\n doAutofilter = extraOptions.doAutofilter ?? doAutofilterOrOptions;\n options = { ...extraOptions, doAutofilter };\n } else {\n options = { ...doAutofilterOrOptions, ...extraOptions };\n doAutofilter = options.doAutofilter !== false;\n }\n\n const bigBuf = new BigBuffer();\n let columnCount = 0;\n\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n if (columnCount > 0) assertColumnCount(columnCount);\n const totalRowsCheck = rows.length + (headers ? 1 : 0);\n assertRowCount(totalRowsCheck);\n if (headers) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n for (let r = 0; r < rows.length; r++) {\n assertRowFitsColumns('row', rows[r].length, columnCount);\n }\n\n const sheet = this.sheetList[this.sheetCount - 1];\n if (!sheet) {\n throw new Error('Call addSheet() before writeSheet()');\n }\n this._applySheetFeatures(sheet, options);\n\n const colWidths = this._resolveColumnWidths(\n columnCount,\n headers,\n rows,\n options,\n doAutofilter && headers !== null && headers !== undefined,\n );\n\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n const startCol = 0;\n const endCol = columnCount;\n\n sheetHeader.writeInt32LE(startCol, 40);\n sheetHeader.writeInt32LE(endCol - 1, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n if (headers) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n for (let i = startCol; i < endCol; i++) {\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(colWidths[i]);\n bigBuf.writeInt32LE(Math.max(0, Math.min(255 * 256, Math.round(width * 256))));\n\n bigBuf.writeInt32LE(0);\n bigBuf.writeByte(2);\n bigBuf.writeByte(0);\n }\n\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n let rowNum = 0;\n\n if (headers) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(bigBuf, headers[c], c, true);\n }\n rowNum++;\n }\n\n for (let r = 0; r < rows.length; r++) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n this._writeCell(bigBuf, row[c], c);\n }\n rowNum++;\n }\n\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n if (doAutofilter && headers) {\n this._autofilterIsOn = true;\n const endRow = rows.length + 1;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(startCol, 0);\n colBuf.writeInt32LE(endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: rows.length,\n startColumn: startCol,\n endColumn: endCol - 1\n };\n }\n\n this._writeFeatureRecords(bigBuf, sheet);\n\n bigBuf.write(sheetHeader.subarray(290));\n\n bigBuf.patchInt32LE(36, Math.max(0, rowNum - 1));\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: this.sheetList[this.sheetCount - 1].pathInArchive });\n }\n\n\n\n createRowHeader(bigBuf: BigBuffer, rowNumber: number, startCol: number, endCol: number): void {\n writeXlsbRowHeader(bigBuf, rowNumber, startCol, endCol);\n }\n\n writeRkNumberInteger(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n writeXlsbRkInteger(bigBuf, val, colNum, styleNum);\n }\n\n writeDouble(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n writeXlsbDouble(bigBuf, val, colNum, styleNum);\n }\n\n writeBool(bigBuf: BigBuffer, val: boolean, colNum: number, styleNum: number = 0): void {\n writeXlsbBool(bigBuf, val, colNum, styleNum);\n }\n\n /** BrtCellError: column, style (24-bit) and the BIFF12 error code. */\n writeError(bigBuf: BigBuffer, code: string, colNum: number, styleNum: number = 0): void {\n writeXlsbError(bigBuf, code, colNum, styleNum);\n }\n\n writeDateTime(bigBuf: BigBuffer, date: Date, colNum: number): void {\n // Use UTC time to avoid timezone conversion issues; handles the\n // fictitious 1900-02-29.\n const oaDate = timeToOaDate(date.getTime(), this._oaEpoch);\n this.writeDouble(bigBuf, oaDate, colNum, dateHasTime(date) ? 2 : 1);\n }\n\n writeString(bigBuf: BigBuffer, val: string, colNum: number, bolded: boolean = false, styleOverride?: number): void {\n assertCellTextLength(val);\n const styleNum = styleOverride !== undefined ? styleOverride : (bolded ? 3 : 0);\n\n if (!this._useSharedStrings) {\n writeXlsbInlineString(bigBuf, val, colNum, styleNum);\n return;\n }\n\n let index: number;\n if (this.sstDic.has(val)) {\n index = this.sstDic.get(val)!;\n } else {\n index = this.sstCntUnique;\n this.sstDic.set(val, index);\n this.sstCntUnique++;\n }\n this.sstCntAll++;\n\n writeXlsbIsst(bigBuf, index, colNum, styleNum);\n }\n\n private saveSst(): void {\n const bigBuf = new BigBuffer();\n writeXlsbSharedStrings(bigBuf, this.sstDic.keys(), this.sstCntAll, this.sstCntUnique);\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: 'xl/sharedStrings.bin' });\n }\n\n private _writeFilterDefinedName(wbBuffers: Buffer[], sheet: SheetInfo, sheetNum: number): void {\n const filterData = sheet.filterData!;\n const sheetIndex = sheet.sheetId - 1;\n\n const fix1 = Buffer.alloc(this._magicFilterExcel2016Fix1.length);\n this._magicFilterExcel2016Fix1.copy(fix1);\n\n const lastIdx = this._magicFilterExcel2016Fix1.length - 2;\n\n fix1[7] = sheetIndex;\n fix1[lastIdx] = sheetNum;\n\n wbBuffers.push(fix1);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(filterData.startRow, 0);\n rowBuf.writeInt32LE(filterData.endRow, 4);\n wbBuffers.push(rowBuf);\n\n const colBuf = Buffer.alloc(4);\n colBuf.writeInt16LE(filterData.startColumn, 0);\n colBuf.writeInt16LE(filterData.endColumn, 2);\n wbBuffers.push(colBuf);\n\n wbBuffers.push(this._magicFilterExcel2016Fix2);\n }\n\n /**\n * Finalize the ZIP package and close the output stream.\n * Must be awaited before the file is fully written.\n */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this._finalized) {\n reject(new Error('XlsbWriter: already finalized'));\n return;\n }\n this._finalized = true;\n let settled = false;\n const cleanupTemp = (): void => {\n try {\n if (fs.existsSync(this._tempPath)) fs.rmSync(this._tempPath);\n } catch {\n // Preserve original error.\n }\n };\n const fail = (err: unknown): void => {\n if (settled) return;\n settled = true;\n try { this.archive.abort(); } catch { /* preserve */ }\n try { this.output.destroy(); } catch { /* preserve */ }\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n };\n const succeed = (): void => {\n if (settled) return;\n if (this._outputError) {\n fail(this._outputError);\n return;\n }\n settled = true;\n try {\n const fd = fs.openSync(this._tempPath, 'r+');\n try { fs.fsyncSync(fd); } finally { fs.closeSync(fd); }\n // Preserve the mode of a file being replaced (the temp file\n // was created with the process umask).\n try {\n const existing = fs.statSync(this._targetPath);\n fs.chmodSync(this._tempPath, existing.mode & 0o777);\n } catch {\n // Target does not exist yet.\n }\n fs.renameSync(this._tempPath, this._targetPath);\n resolve();\n } catch (err) {\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n };\n try {\n if (this._outputError) throw this._outputError;\n this.saveSst();\n\n this.archive.append(Buffer.from(this._buildStylesBin()), { name: 'xl/styles.bin' });\n\n const wbBuffers: Buffer[] = [];\n wbBuffers.push(this._workbookBinStart);\n\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n\n const recLen = 4 + 12 + sheet.name.length * 2 + rId.length * 2;\n const buf = Buffer.alloc(3 + recLen);\n buf[0] = 156; buf[1] = 1; buf[2] = recLen;\n let pos = 3;\n\n buf.writeInt32LE(sheet.hidden ? 1 : 0, pos); pos += 4;\n buf.writeInt32LE(sheet.sheetId, pos); pos += 4;\n\n buf.writeInt32LE(rId.length, pos); pos += 4;\n for (let i = 0; i < rId.length; i++) {\n const c = rId.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n\n buf.writeInt32LE(sheet.name.length, pos); pos += 4;\n for (let i = 0; i < sheet.name.length; i++) {\n const c = sheet.name.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n wbBuffers.push(buf);\n }\n\n wbBuffers.push(this._workbookBinMiddle);\n\n if (this._autofilterIsOn) {\n const filteredSheets = this.sheetList.filter(s => s.filterData);\n const cnt = filteredSheets.length;\n\n if (cnt > 0) {\n wbBuffers.push(this._magicFilterExcel2016Fix0);\n\n const firstByte = cnt <= 20\n ? 0x10 + (cnt - 1) * 0x0C\n : 0x80 + (cnt - 21) * 0x0C;\n const countBuf = cnt <= 10\n ? Buffer.from([firstByte, cnt, 0x00, 0x00, 0x00])\n : Buffer.from([firstByte, Math.floor((cnt - 1) / 10), cnt, 0x00, 0x00, 0x00]);\n wbBuffers.push(countBuf);\n\n for (let nm = 0; nm < cnt; nm++) {\n const sheetIndex = filteredSheets[nm].sheetId - 1;\n const idxBuf = Buffer.alloc(12);\n idxBuf.writeInt32LE(0, 0);\n idxBuf[4] = sheetIndex;\n idxBuf[8] = sheetIndex;\n wbBuffers.push(idxBuf);\n }\n\n wbBuffers.push(Buffer.from([0xE2, 0x02, 0x00]));\n\n for (let sheetNum = 0; sheetNum < cnt; sheetNum++) {\n const sheet = filteredSheets[sheetNum];\n this._writeFilterDefinedName(wbBuffers, sheet, sheetNum);\n }\n }\n }\n\n wbBuffers.push(this._workbookBinEnd);\n\n this.archive.append(Buffer.concat(wbBuffers), { name: 'xl/workbook.bin' });\n\n for (const sheet of this.sheetList) {\n this.archive.append(this._binaryIndexBin, { name: `xl/worksheets/binaryIndex${sheet.sheetId}.bin` });\n }\n\n let contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n<Default Extension=\"bin\" ContentType=\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\"/>\n<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>`;\n for (const sheet of this.sheetList) {\n contentTypes += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.ms-excel.worksheet\"/>`;\n contentTypes += `<Override PartName=\"/xl/worksheets/binaryIndex${sheet.sheetId}.bin\" ContentType=\"application/vnd.ms-excel.binIndexWs\"/>`;\n }\n contentTypes += `<Override PartName=\"/xl/styles.bin\" ContentType=\"application/vnd.ms-excel.styles\"/>\n<Override PartName=\"/xl/sharedStrings.bin\" ContentType=\"application/vnd.ms-excel.sharedStrings\"/>\n</Types>`;\n this.archive.append(contentTypes, { name: '[Content_Types].xml' });\n\n let wbRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n wbRels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n wbRels += `<Relationship Id=\"rId${this.sheetList.length + 2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.bin\"/>\n<Relationship Id=\"rId${this.sheetList.length + 3}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.bin\"/>\n</Relationships>`;\n this.archive.append(wbRels, { name: 'xl/_rels/workbook.bin.rels' });\n\n const globalRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.bin\"/>\n</Relationships>`;\n this.archive.append(globalRels, { name: '_rels/.rels' });\n\n for (const sheet of this.sheetList) {\n let wsRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.microsoft.com/office/2006/relationships/xlBinaryIndex\" Target=\"binaryIndex${sheet.sheetId}.bin\"/>`;\n for (const link of sheet.hyperlinks ?? []) {\n if (!link.rId || link.spec.target === undefined) continue;\n wsRels += `<Relationship Id=\"${link.rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${escapeXmlText(link.spec.target)}\" TargetMode=\"External\"/>`;\n }\n wsRels += '</Relationships>';\n this.archive.append(wsRels, { name: `xl/worksheets/_rels/${sheet.nameInArchive}.rels` });\n }\n\n this.output.once('close', succeed);\n this.output.once('error', fail);\n this.archive.once('error', fail);\n this.archive.finalize();\n } catch (err) {\n fail(err);\n }\n });\n }\n}\n\nexport default XlsbWriter;\n","import { BigBuffer } from './BigBuffer';\nimport { initColWidths } from './writerHelpers';\n\n/**\n * Shared streaming-sheet session state for Node writers.\n * Holds buffer, row cursor, column range, autofilter flag, and autofit widths.\n */\nexport class StreamingSheetState {\n isStreaming: boolean = false;\n rowNum: number = 0;\n startCol: number = 0;\n endCol: number = 0;\n doAutofilter: boolean = false;\n colWidths: number[] = [];\n buffer: BigBuffer | null = null;\n\n /**\n * Begin a streaming sheet session.\n * @throws if already streaming\n */\n begin(columnCount: number, doAutofilter: boolean, buffer: BigBuffer): void {\n if (this.isStreaming) {\n throw new Error('Already in streaming mode. Call endSheet() first.');\n }\n\n this.isStreaming = true;\n this.buffer = buffer;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = columnCount;\n this.doAutofilter = doAutofilter;\n this.colWidths = initColWidths(columnCount);\n }\n\n /** Assert streaming mode and return the active buffer. */\n assertStreaming(): BigBuffer {\n if (!this.isStreaming || !this.buffer) {\n throw new Error('Not in streaming mode. Call startSheet() first.');\n }\n return this.buffer;\n }\n\n /** Reset after endSheet(). */\n end(): void {\n this.isStreaming = false;\n this.buffer = null;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.doAutofilter = false;\n this.colWidths = [];\n }\n}\n","/**\n * A deliberately small XLSB formula compiler.\n *\n * Supports literals, A1 references/ranges, unary/binary operators and a\n * curated set of worksheet functions. Anything outside this subset fails with\n * a clear error instead of writing a formula Excel cannot parse.\n */\nimport { ExcelError } from '../../Formats';\nimport { excelErrorToBiffCode } from '../../biff12Utils';\nimport { buildBrtRecord } from './xlsbRecords';\n\nconst BRT_FMLA_STRING = 0x0008;\nconst BRT_FMLA_NUM = 0x0009;\nconst BRT_FMLA_BOOL = 0x000a;\nconst BRT_FMLA_ERROR = 0x000b;\n\ntype OperandClass = 'V' | 'R' | 'A';\n\ninterface FunctionInfo {\n id: number;\n min: number;\n max: number;\n fixed: number | null;\n classes: string;\n}\n\nconst FUNCTIONS: Record<string, FunctionInfo> = {\n COUNT: { id: 0, min: 0, max: 255, fixed: null, classes: 'R' },\n IF: { id: 1, min: 2, max: 3, fixed: null, classes: 'VRR' },\n ISNA: { id: 2, min: 1, max: 1, fixed: 1, classes: 'V' },\n ISERROR: { id: 3, min: 1, max: 1, fixed: 1, classes: 'V' },\n SUM: { id: 4, min: 0, max: 255, fixed: null, classes: 'R' },\n AVERAGE: { id: 5, min: 1, max: 255, fixed: null, classes: 'R' },\n MIN: { id: 6, min: 1, max: 255, fixed: null, classes: 'R' },\n MAX: { id: 7, min: 1, max: 255, fixed: null, classes: 'R' },\n ROW: { id: 8, min: 0, max: 1, fixed: null, classes: 'R' },\n COLUMN: { id: 9, min: 0, max: 1, fixed: null, classes: 'R' },\n NA: { id: 10, min: 0, max: 0, fixed: 0, classes: '' },\n STDEV: { id: 12, min: 1, max: 255, fixed: null, classes: 'R' },\n SIN: { id: 15, min: 1, max: 1, fixed: 1, classes: 'V' },\n COS: { id: 16, min: 1, max: 1, fixed: 1, classes: 'V' },\n TAN: { id: 17, min: 1, max: 1, fixed: 1, classes: 'V' },\n ATAN: { id: 18, min: 1, max: 1, fixed: 1, classes: 'V' },\n PI: { id: 19, min: 0, max: 0, fixed: 0, classes: '' },\n SQRT: { id: 20, min: 1, max: 1, fixed: 1, classes: 'V' },\n EXP: { id: 21, min: 1, max: 1, fixed: 1, classes: 'V' },\n LN: { id: 22, min: 1, max: 1, fixed: 1, classes: 'V' },\n LOG10: { id: 23, min: 1, max: 1, fixed: 1, classes: 'V' },\n ABS: { id: 24, min: 1, max: 1, fixed: 1, classes: 'V' },\n INT: { id: 25, min: 1, max: 1, fixed: 1, classes: 'V' },\n SIGN: { id: 26, min: 1, max: 1, fixed: 1, classes: 'V' },\n ROUND: { id: 27, min: 2, max: 2, fixed: 2, classes: 'VV' },\n INDEX: { id: 29, min: 2, max: 4, fixed: null, classes: 'RVVV' },\n MID: { id: 31, min: 3, max: 3, fixed: 3, classes: 'VVV' },\n LEN: { id: 32, min: 1, max: 1, fixed: 1, classes: 'V' },\n VALUE: { id: 33, min: 1, max: 1, fixed: 1, classes: 'V' },\n AND: { id: 36, min: 1, max: 255, fixed: null, classes: 'R' },\n OR: { id: 37, min: 1, max: 255, fixed: null, classes: 'R' },\n NOT: { id: 38, min: 1, max: 1, fixed: 1, classes: 'V' },\n MOD: { id: 39, min: 2, max: 2, fixed: 2, classes: 'VV' },\n VAR: { id: 46, min: 1, max: 255, fixed: null, classes: 'R' },\n TEXT: { id: 48, min: 2, max: 2, fixed: 2, classes: 'VV' },\n MATCH: { id: 64, min: 2, max: 3, fixed: null, classes: 'VRR' },\n DATE: { id: 65, min: 3, max: 3, fixed: 3, classes: 'VVV' },\n DAY: { id: 67, min: 1, max: 1, fixed: 1, classes: 'V' },\n MONTH: { id: 68, min: 1, max: 1, fixed: 1, classes: 'V' },\n YEAR: { id: 69, min: 1, max: 1, fixed: 1, classes: 'V' },\n HOUR: { id: 71, min: 1, max: 1, fixed: 1, classes: 'V' },\n MINUTE: { id: 72, min: 1, max: 1, fixed: 1, classes: 'V' },\n SECOND: { id: 73, min: 1, max: 1, fixed: 1, classes: 'V' },\n NOW: { id: 74, min: 0, max: 0, fixed: 0, classes: '' },\n ROWS: { id: 76, min: 1, max: 1, fixed: 1, classes: 'R' },\n COLUMNS: { id: 77, min: 1, max: 1, fixed: 1, classes: 'R' },\n SEARCH: { id: 82, min: 2, max: 3, fixed: null, classes: 'VVV' },\n HLOOKUP: { id: 101, min: 3, max: 4, fixed: null, classes: 'VRRV' },\n VLOOKUP: { id: 102, min: 3, max: 4, fixed: null, classes: 'VRRV' },\n LOG: { id: 109, min: 1, max: 2, fixed: null, classes: 'VV' },\n LOWER: { id: 112, min: 1, max: 1, fixed: 1, classes: 'V' },\n UPPER: { id: 113, min: 1, max: 1, fixed: 1, classes: 'V' },\n LEFT: { id: 115, min: 1, max: 2, fixed: null, classes: 'VV' },\n RIGHT: { id: 116, min: 1, max: 2, fixed: null, classes: 'VV' },\n EXACT: { id: 117, min: 2, max: 2, fixed: 2, classes: 'VV' },\n TRIM: { id: 118, min: 1, max: 1, fixed: 1, classes: 'V' },\n REPLACE: { id: 119, min: 4, max: 4, fixed: 4, classes: 'VVVV' },\n SUBSTITUTE: { id: 120, min: 3, max: 4, fixed: null, classes: 'VVVV' },\n FIND: { id: 124, min: 2, max: 3, fixed: null, classes: 'VVV' },\n ISTEXT: { id: 127, min: 1, max: 1, fixed: 1, classes: 'V' },\n ISNUMBER: { id: 128, min: 1, max: 1, fixed: 1, classes: 'V' },\n ISBLANK: { id: 129, min: 1, max: 1, fixed: 1, classes: 'V' },\n T: { id: 130, min: 1, max: 1, fixed: 1, classes: 'R' },\n N: { id: 131, min: 1, max: 1, fixed: 1, classes: 'R' },\n TRUNC: { id: 197, min: 1, max: 2, fixed: null, classes: 'VV' },\n ROUNDUP: { id: 212, min: 2, max: 2, fixed: 2, classes: 'VV' },\n ROUNDDOWN: { id: 213, min: 2, max: 2, fixed: 2, classes: 'VV' },\n RANK: { id: 216, min: 2, max: 3, fixed: null, classes: 'VRV' },\n TODAY: { id: 221, min: 0, max: 0, fixed: 0, classes: '' },\n SUMPRODUCT: { id: 228, min: 1, max: 255, fixed: null, classes: 'A' },\n FLOOR: { id: 285, min: 2, max: 2, fixed: 2, classes: 'VV' },\n CEILING: { id: 288, min: 2, max: 2, fixed: 2, classes: 'VV' },\n CONCATENATE: { id: 336, min: 0, max: 255, fixed: null, classes: 'V' },\n POWER: { id: 337, min: 2, max: 2, fixed: 2, classes: 'VV' },\n SUMIF: { id: 345, min: 2, max: 3, fixed: null, classes: 'RVR' },\n COUNTIF: { id: 346, min: 2, max: 2, fixed: 2, classes: 'RV' },\n COUNTBLANK: { id: 347, min: 1, max: 1, fixed: 1, classes: 'R' },\n AVERAGEA: { id: 361, min: 1, max: 255, fixed: null, classes: 'R' },\n MAXA: { id: 362, min: 1, max: 255, fixed: null, classes: 'R' },\n MINA: { id: 363, min: 1, max: 255, fixed: null, classes: 'R' },\n IFERROR: { id: 480, min: 2, max: 2, fixed: 2, classes: 'VV' },\n COUNTIFS: { id: 481, min: 2, max: 255, fixed: null, classes: 'RV' },\n SUMIFS: { id: 482, min: 3, max: 255, fixed: null, classes: 'RRV' },\n AVERAGEIF: { id: 483, min: 2, max: 3, fixed: null, classes: 'RVR' },\n};\n\nconst VOLATILE = new Set(['NOW', 'TODAY', 'RAND', 'RANDBETWEEN', 'OFFSET', 'INDIRECT', 'CELL', 'INFO']);\n\nconst OPERATOR_IDS: Record<string, number> = {\n '+': 0x03, '-': 0x04, '*': 0x05, '/': 0x06, '^': 0x07, '&': 0x08,\n '<': 0x09, '<=': 0x0a, '=': 0x0b, '>=': 0x0c, '>': 0x0d, '<>': 0x0e,\n ' ': 0x0f, ',': 0x10, ':': 0x11,\n};\n\nconst PRECEDENCE: Record<string, number> = {\n ',': 1, '=': 2, '<': 2, '>': 2, '<=': 2, '>=': 2, '<>': 2,\n '&': 3, '+': 4, '-': 4, '*': 5, '/': 5, '^': 6, ' ': 9, ':': 10,\n};\n\nconst ERROR_CODES: Record<string, number> = {\n '#NULL!': 0x00,\n '#DIV/0!': 0x07,\n '#VALUE!': 0x0f,\n '#REF!': 0x17,\n '#NAME?': 0x1d,\n '#NUM!': 0x24,\n '#N/A': 0x2a,\n '#GETTING_DATA': 0x2b,\n};\n\nconst ADDRESS = String.raw`(?:\\$?[A-Za-z]{1,3}\\$?[1-9]\\d*(?::\\$?[A-Za-z]{1,3}\\$?[1-9]\\d*)?|\\$?[A-Za-z]{1,3}:\\$?[A-Za-z]{1,3}|\\$?[1-9]\\d*:\\$?[1-9]\\d*)`;\n\nconst TOKEN_RE = new RegExp(\n String.raw`\\s+|\"(?:[^\"]|\"\")*\"|'(?:[^']|'')*'`\n + String.raw`|#(?:NULL!|DIV/0!|VALUE!|REF!|NAME\\?|NUM!|N/A|GETTING_DATA)`\n + `|${ADDRESS}(?![\\\\w.])`\n + String.raw`|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[Ee][+-]?\\d+)?|[^\\W\\d][\\w.]*|<>|<=|>=|[+\\-*/^&%=<>(),:]`,\n 'giu',\n);\n\ntype Node =\n | { kind: 'number'; value: number }\n | { kind: 'string'; value: string }\n | { kind: 'bool'; value: boolean }\n | { kind: 'error'; value: number }\n | { kind: 'missing' }\n | { kind: 'reference'; value: string }\n | { kind: 'paren'; value: Node }\n | { kind: 'percent'; value: Node }\n | { kind: 'unary'; op: '+' | '-'; value: Node }\n | { kind: 'binary'; op: string; left: Node; right: Node }\n | { kind: 'function'; name: string; args: Node[] };\n\nfunction tokenize(text: string): string[] {\n const tokens: string[] = [];\n let position = 0;\n while (position < text.length) {\n TOKEN_RE.lastIndex = position;\n const match = TOKEN_RE.exec(text);\n if (!match || match.index !== position) {\n throw new Error(`Unsupported XLSB formula syntax near '${text.slice(position)}'`);\n }\n position = TOKEN_RE.lastIndex;\n const token = match[0];\n if (/^\\s+$/.test(token)) continue;\n tokens.push(token);\n }\n return tokens;\n}\n\nclass Parser {\n private index = 0;\n\n constructor(private readonly tokens: string[]) {}\n\n private peek(): string | undefined {\n return this.tokens[this.index];\n }\n\n private pop(): string {\n const token = this.tokens[this.index++];\n if (token === undefined) throw new Error('Unexpected end of XLSB formula');\n return token;\n }\n\n parse(): Node {\n const node = this.expression(0);\n if (this.peek() !== undefined) {\n throw new Error(`Unsupported XLSB formula token '${this.peek()}'`);\n }\n return node;\n }\n\n private expression(minPrecedence: number): Node {\n let left = this.primary();\n while (this.peek() === '%') {\n this.pop();\n left = { kind: 'percent', value: left };\n }\n for (;;) {\n const operator = this.peek();\n if (operator === undefined) break;\n const precedence = PRECEDENCE[operator];\n if (precedence === undefined || precedence < minPrecedence) break;\n this.pop();\n const right = this.expression(precedence + 1);\n left = { kind: 'binary', op: operator, left, right };\n }\n return left;\n }\n\n private primary(): Node {\n const token = this.pop();\n if (token === '+' || token === '-') {\n return { kind: 'unary', op: token, value: this.expression(7) };\n }\n if (token === '(') {\n const value = this.expression(0);\n if (this.pop() !== ')') throw new Error('Missing ) in XLSB formula');\n return { kind: 'paren', value };\n }\n if (token.startsWith('\"')) {\n return { kind: 'string', value: token.slice(1, -1).replace(/\"\"/g, '\"') };\n }\n if (token.startsWith('#')) {\n const code = ERROR_CODES[token.toUpperCase()];\n if (code === undefined) throw new Error(`Unsupported XLSB formula error literal '${token}'`);\n return { kind: 'error', value: code };\n }\n if (/^(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$/.test(token)) {\n return { kind: 'number', value: Number(token) };\n }\n if (/^[A-Za-z_\\\\]/.test(token)) {\n const upper = token.toUpperCase();\n if (this.peek() === '(') {\n this.pop();\n const args: Node[] = [];\n if (this.peek() !== ')') {\n for (;;) {\n args.push(this.peek() === ',' || this.peek() === ')'\n ? { kind: 'missing' }\n : this.expression(2));\n if (this.peek() !== ',') break;\n this.pop();\n }\n }\n if (this.pop() !== ')') throw new Error('Missing ) in XLSB function call');\n return { kind: 'function', name: upper, args };\n }\n if (upper === 'TRUE' || upper === 'FALSE') {\n return { kind: 'bool', value: upper === 'TRUE' };\n }\n if (ADDRESS_RE.test(token)) {\n return { kind: 'reference', value: token };\n }\n throw new Error(`Unsupported XLSB formula name '${token}' (defined names are not supported)`);\n }\n if (ADDRESS_RE.test(token)) {\n return { kind: 'reference', value: token };\n }\n throw new Error(`Unsupported XLSB formula token '${token}'`);\n }\n}\n\nconst ADDRESS_RE = new RegExp(`^(?:${ADDRESS})$`, 'i');\n\nfunction columnIndex(letters: string): number {\n let value = 0;\n for (const ch of letters.toUpperCase()) {\n value = value * 26 + (ch.charCodeAt(0) - 64);\n }\n return value - 1;\n}\n\ninterface ReferencePart {\n row: number;\n col: number;\n rowRelative: boolean;\n colRelative: boolean;\n}\n\nfunction parseReferencePart(text: string, kind: 'cell' | 'col' | 'row'): ReferencePart {\n if (kind === 'cell') {\n const match = /^(\\$?)([A-Za-z]{1,3})(\\$?)([1-9]\\d*)$/.exec(text);\n if (!match) throw new Error(`Invalid XLSB cell reference '${text}'`);\n const col = columnIndex(match[2]);\n const row = parseInt(match[4], 10) - 1;\n if (col > 16383 || row > 1048575) {\n throw new RangeError(`Cell reference '${text}' is outside the Excel grid`);\n }\n return { row, col, colRelative: match[1] === '', rowRelative: match[3] === '' };\n }\n if (kind === 'col') {\n const match = /^(\\$?)([A-Za-z]{1,3})$/.exec(text);\n if (!match) throw new Error(`Invalid XLSB column reference '${text}'`);\n return { row: 0, col: columnIndex(match[2]), rowRelative: false, colRelative: match[1] === '' };\n }\n const match = /^(\\$?)([1-9]\\d*)$/.exec(text);\n if (!match) throw new Error(`Invalid XLSB row reference '${text}'`);\n return { row: parseInt(match[2], 10) - 1, col: 0, rowRelative: match[1] === '', colRelative: false };\n}\n\nfunction refKind(part: string): 'cell' | 'col' | 'row' {\n if (/^[A-Za-z]/.test(part.replace(/^\\$/, ''))) {\n return /^\\d|^\\$\\d/.test(part.replace(/^\\$?[A-Za-z]{1,3}/, '')) ? 'cell' : 'col';\n }\n return 'row';\n}\n\nfunction columnField(part: ReferencePart): number {\n return (part.col & 0x3fff)\n | (part.colRelative ? 0x4000 : 0)\n | (part.rowRelative ? 0x8000 : 0);\n}\n\nfunction emitReference(text: string, operand: OperandClass): number[] {\n const parts = text.split(':');\n const base = operand === 'R' ? 0x20 : operand === 'A' ? 0x60 : 0x40;\n if (parts.length === 1) {\n const part = parseReferencePart(parts[0], 'cell');\n return [base | 0x04, ...u32(part.row), ...u16(columnField(part))];\n }\n if (parts.length !== 2) throw new Error(`Invalid XLSB range '${text}'`);\n const kind = refKind(parts[0]);\n if (kind !== refKind(parts[1])) {\n throw new Error(`Invalid XLSB range '${text}'`);\n }\n let first = parseReferencePart(parts[0], kind);\n let last = parseReferencePart(parts[1], kind);\n if (kind === 'col') {\n first = { ...first, row: 0, rowRelative: false };\n last = { ...last, row: 1048575, rowRelative: false };\n } else if (kind === 'row') {\n first = { ...first, col: 0, colRelative: false };\n last = { ...last, col: 16383, colRelative: false };\n }\n return [\n base | 0x05,\n ...u32(first.row), ...u32(last.row),\n ...u16(columnField(first)), ...u16(columnField(last)),\n ];\n}\n\nfunction u16(value: number): number[] {\n const v = value & 0xffff;\n return [v & 0xff, (v >>> 8) & 0xff];\n}\n\nfunction u32(value: number): number[] {\n const v = value >>> 0;\n return [v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff];\n}\n\nfunction doubleBytes(value: number): number[] {\n const buffer = new Uint8Array(8);\n new DataView(buffer.buffer).setFloat64(0, value, true);\n return [...buffer];\n}\n\nfunction stringBytes(text: string): number[] {\n if (text.length > 255) {\n throw new RangeError('XLSB formula string literals are limited to 255 UTF-16 units');\n }\n const out = [...u16(text.length)];\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n out.push(code & 0xff, (code >>> 8) & 0xff);\n }\n return out;\n}\n\nfunction functionArgumentClass(info: FunctionInfo, index: number): OperandClass {\n if (info.id === 481) return index % 2 === 0 ? 'R' : 'V';\n if (info.id === 482 || info.id === 484) {\n return index === 0 || index % 2 === 0 ? 'R' : 'V';\n }\n const chars = info.classes;\n if (chars.length === 0) return 'V';\n return chars[Math.min(index, chars.length - 1)] === 'R' ? 'R' : 'V';\n}\n\nfunction emitNode(node: Node, operand: OperandClass = 'V'): number[] {\n switch (node.kind) {\n case 'number': {\n if (Number.isInteger(node.value) && node.value >= 0 && node.value <= 65535) {\n return [0x1e, ...u16(node.value)];\n }\n return [0x1f, ...doubleBytes(node.value)];\n }\n case 'string':\n return [0x17, ...stringBytes(node.value)];\n case 'bool':\n return [0x1d, node.value ? 1 : 0];\n case 'error':\n return [0x1c, node.value];\n case 'missing':\n return [0x16];\n case 'reference':\n return emitReference(node.value, operand);\n case 'paren':\n return [...emitNode(node.value, operand), 0x15];\n case 'percent':\n return [...emitNode(node.value), 0x14];\n case 'unary':\n return [...emitNode(node.value), node.op === '+' ? 0x12 : 0x13];\n case 'binary': {\n const argType: OperandClass = node.op === ',' || node.op === ' ' || node.op === ':'\n ? 'R'\n : 'V';\n return [\n ...emitNode(node.left, argType),\n ...emitNode(node.right, argType),\n OPERATOR_IDS[node.op],\n ];\n }\n case 'function': {\n const info = FUNCTIONS[node.name];\n if (!info) {\n throw new Error(`Unsupported XLSB function '${node.name}'`);\n }\n if (node.args.length < info.min || node.args.length > info.max) {\n throw new RangeError(\n `${node.name} expects ${info.min}..${info.max} arguments, got ${node.args.length}`,\n );\n }\n const encoded = node.args.map((arg, index) => emitNode(arg, functionArgumentClass(info, index)));\n const resultClass = operand === 'R' ? 0x20 : operand === 'A' ? 0x60 : 0x40;\n const ending = info.fixed !== null\n ? [resultClass | 0x01, ...u16(info.id)]\n : [resultClass | 0x02, node.args.length, ...u16(info.id)];\n\n if (info.id === 1) {\n const yes = encoded[1] ?? [];\n const no = encoded[2] ?? [];\n const firstGoto = [0x19, 0x08, ...u16(no.length + (no.length > 0 ? 4 : 0) + ending.length - 1)];\n const lastGoto = no.length > 0 ? [0x19, 0x08, ...u16(ending.length - 1)] : [];\n return [\n ...(encoded[0] ?? []),\n 0x19, 0x02, ...u16(yes.length + 4),\n ...yes, ...firstGoto, ...no, ...lastGoto, ...ending,\n ];\n }\n if (info.id === 480) {\n const fallback = encoded[1] ?? [];\n return [\n ...(encoded[0] ?? []),\n 0x19, 0x80, ...u16(fallback.length),\n ...fallback,\n 0x19, 0x08, ...u16(ending.length - 1),\n ...ending,\n ];\n }\n return [...encoded.flat(), ...ending];\n }\n }\n}\n\nfunction containsVolatile(node: Node): boolean {\n switch (node.kind) {\n case 'function':\n return VOLATILE.has(node.name) || node.args.some(containsVolatile);\n case 'paren':\n case 'percent':\n case 'unary':\n return containsVolatile(node.value);\n case 'binary':\n return containsVolatile(node.left) || containsVolatile(node.right);\n default:\n return false;\n }\n}\n\n/** Compile formula text (with or without a leading `=`) to BIFF12 tokens. */\nexport function compileXlsbFormula(formula: string): Uint8Array {\n const text = formula.trim().replace(/^=/, '');\n if (!text) throw new Error('FormulaCell.formula must not be empty');\n if (text.length > 8192) throw new RangeError('XLSB formula text is limited to 8192 characters');\n const tree = new Parser(tokenize(text)).parse();\n let tokens = emitNode(tree);\n if (containsVolatile(tree)) {\n tokens = [0x19, 0x01, 0x00, 0x00, ...tokens];\n }\n if (tokens.length === 0 || tokens.length > 16384) {\n throw new RangeError('XLSB formula token length exceeds the BIFF12 limit');\n }\n return Uint8Array.from(tokens);\n}\n\nfunction wideString(text: string): number[] {\n const out = [...u32(text.length)];\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n out.push(code & 0xff, (code >>> 8) & 0xff);\n }\n return out;\n}\n\n/**\n * Build a BrtFmla* record with the cached value Excel displays before recalc.\n * `cached` must already be converted from `Date` to an Excel serial number.\n */\nexport function buildXlsbFormulaRecord(\n column: number,\n styleIndex: number,\n formula: string,\n cached: string | number | boolean | ExcelError | null | undefined,\n): Uint8Array {\n let recordId = BRT_FMLA_NUM;\n let cache: number[];\n if (cached instanceof ExcelError) {\n recordId = BRT_FMLA_ERROR;\n cache = [excelErrorToBiffCode(cached.code)];\n } else if (typeof cached === 'string') {\n recordId = BRT_FMLA_STRING;\n cache = wideString(cached);\n } else if (typeof cached === 'boolean') {\n recordId = BRT_FMLA_BOOL;\n cache = [cached ? 1 : 0];\n } else {\n const value = typeof cached === 'number' ? cached : 0;\n if (!Number.isFinite(value)) {\n throw new RangeError('XLSB formula cached values must be finite');\n }\n cache = doubleBytes(value);\n }\n\n const tokens = compileXlsbFormula(formula);\n const payload = [\n ...u32(column),\n ...u32(styleIndex),\n ...cache,\n 0x01, 0x00,\n ...u32(tokens.length),\n ...tokens,\n ...u32(0),\n ];\n return buildBrtRecord(recordId, Uint8Array.from(payload));\n}\n","/**\n * XLSB worksheet feature records: merged cells, hyperlinks and data\n * validations. The XLSX-facing spec types are reused so callers pass the same\n * option objects to both writers.\n */\nimport { DataValidationSpec, HyperlinkSpec } from './xlsxParts';\nimport { buildBrtRecord, concat } from './xlsbRecords';\nimport { compileXlsbFormula } from './xlsbFormula';\n\nconst BRT_BEGIN_MERGE_CELLS = 0x00b1;\nconst BRT_MERGE_CELL = 0x00b0;\nconst BRT_END_MERGE_CELLS = 0x00b2;\n\nconst BRT_BEGIN_DVALS = 0x023d;\nconst BRT_DVAL = 0x0040;\nconst BRT_END_DVALS = 0x023e;\n\nconst BRT_HLINK = 0x01ee;\n\nconst DV_TYPES: Record<DataValidationSpec['type'], number> = {\n whole: 1,\n decimal: 2,\n list: 3,\n date: 4,\n time: 5,\n textLength: 6,\n custom: 7,\n};\n\nconst DV_ERROR_STYLES: Record<string, number> = {\n stop: 0,\n warning: 1,\n information: 2,\n};\n\nconst DV_OPERATORS: Record<string, number> = {\n between: 0,\n notBetween: 1,\n equal: 2,\n notEqual: 3,\n lessThan: 4,\n lessThanOrEqual: 5,\n greaterThan: 6,\n greaterThanOrEqual: 7,\n};\n\ninterface CellRange {\n c1: number;\n r1: number;\n c2: number;\n r2: number;\n}\n\nfunction u16(value: number): number[] {\n const v = value & 0xffff;\n return [v & 0xff, (v >>> 8) & 0xff];\n}\n\nfunction u32(value: number): number[] {\n const v = value >>> 0;\n return [v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff];\n}\n\nfunction wideString(text: string): number[] {\n const out = [...u32(text.length)];\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n out.push(code & 0xff, (code >>> 8) & 0xff);\n }\n return out;\n}\n\nfunction nullableString(text: string | undefined): number[] {\n return text === undefined || text === '' ? [0xff, 0xff, 0xff, 0xff] : wideString(text);\n}\n\nfunction columnIndex(letters: string): number {\n let value = 0;\n for (const ch of letters.toUpperCase()) value = value * 26 + (ch.charCodeAt(0) - 64);\n return value - 1;\n}\n\nfunction parseCell(text: string): { col: number; row: number } {\n const match = /^\\$?([A-Za-z]{1,3})\\$?([1-9]\\d*)$/.exec(text.trim());\n if (!match) throw new Error(`Invalid cell reference '${text}'`);\n const col = columnIndex(match[1]);\n const row = parseInt(match[2], 10) - 1;\n if (col < 0 || col > 16383 || row < 0 || row > 1048575) {\n throw new RangeError(`Cell reference '${text}' is outside the Excel grid`);\n }\n return { col, row };\n}\n\n/** Parse `A1:B2` (or a single `A1`) into zero-based coordinates. */\nexport function parseXlsbRange(text: string): CellRange {\n const parts = text.split(':');\n if (parts.length > 2) throw new Error(`Invalid range '${text}'`);\n const first = parseCell(parts[0]);\n const last = parts.length === 2 ? parseCell(parts[1]) : first;\n return {\n c1: Math.min(first.col, last.col),\n r1: Math.min(first.row, last.row),\n c2: Math.max(first.col, last.col),\n r2: Math.max(first.row, last.row),\n };\n}\n\n/** BrtBeginMergeCells / BrtMergeCell* / BrtEndMergeCells. */\nexport function buildXlsbMergeRecords(merges: string[]): Uint8Array {\n if (merges.length === 0) return new Uint8Array(0);\n const parts: Uint8Array[] = [\n buildBrtRecord(BRT_BEGIN_MERGE_CELLS, Uint8Array.from(u32(merges.length))),\n ];\n for (const ref of merges) {\n const range = parseXlsbRange(ref);\n parts.push(buildBrtRecord(BRT_MERGE_CELL, Uint8Array.from([\n ...u32(range.r1), ...u32(range.r2), ...u32(range.c1), ...u32(range.c2),\n ])));\n }\n parts.push(buildBrtRecord(BRT_END_MERGE_CELLS, new Uint8Array(0)));\n return concat(parts);\n}\n\n/** One BrtHLink record. `rId` is required for external targets. */\nexport function buildXlsbHyperlinkRecord(\n row: number,\n col: number,\n link: HyperlinkSpec,\n rId?: string,\n): Uint8Array {\n const internal = link.target === undefined;\n const relationship = internal ? '' : (rId ?? '');\n const location = internal ? (link.location ?? '') : '';\n const display = link.display\n ?? (internal ? (link.location ?? '') : (link.target ?? ''));\n const payload = [\n ...u32(row), ...u32(row), ...u32(col), ...u32(col),\n ...wideString(relationship),\n ...wideString(location),\n ...wideString(link.tooltip ?? ''),\n ...wideString(display),\n ];\n return buildBrtRecord(BRT_HLINK, Uint8Array.from(payload));\n}\n\nfunction literalListFormula(values: string[]): string {\n return `\"${values.map(value => value.replace(/\"/g, '\"\"')).join(',')}\"`;\n}\n\nfunction validationFormula(text: string | undefined): Uint8Array {\n if (text === undefined || text === '') return new Uint8Array(8);\n const tokens = compileXlsbFormula(text);\n return Uint8Array.from([...u32(tokens.length), ...tokens, ...u32(0)]);\n}\n\n/** BrtBeginDVals / BrtDVal* / BrtEndDVals. */\nexport function buildXlsbValidationRecords(validations: DataValidationSpec[]): Uint8Array {\n if (validations.length === 0) return new Uint8Array(0);\n const parts: Uint8Array[] = [\n buildBrtRecord(BRT_BEGIN_DVALS, Uint8Array.from([\n ...u16(0), ...u32(0), ...u32(0), ...u32(0), ...u32(validations.length),\n ])),\n ];\n for (const rule of validations) {\n const ranges = rule.sqref.trim().split(/\\s+/).map(parseXlsbRange);\n if (ranges.length === 0) throw new Error('Data validation sqref must not be empty');\n\n let flags = DV_TYPES[rule.type] ?? 0;\n flags |= (DV_ERROR_STYLES[rule.errorStyle ?? 'stop'] ?? 0) << 4;\n const isLiteralList = rule.type === 'list' && rule.values !== undefined;\n if (isLiteralList) flags |= 0x80;\n if (rule.allowBlank) flags |= 0x100;\n if (rule.showDropdown === false) flags |= 0x200;\n if (rule.showInputMessage) flags |= 1 << 18;\n if (rule.showErrorMessage) flags |= 1 << 19;\n if (rule.operator !== undefined) flags |= (DV_OPERATORS[rule.operator] ?? 0) << 20;\n\n const payload: number[] = [...u32(flags), ...u32(ranges.length)];\n for (const range of ranges) {\n payload.push(...u32(range.r1), ...u32(range.r2), ...u32(range.c1), ...u32(range.c2));\n }\n payload.push(\n ...nullableString(rule.errorTitle),\n ...nullableString(rule.error),\n ...nullableString(rule.promptTitle),\n ...nullableString(rule.prompt),\n );\n const formula1 = isLiteralList\n ? literalListFormula(rule.values!)\n : rule.formula1;\n payload.push(...validationFormula(formula1));\n payload.push(...validationFormula(rule.formula2));\n parts.push(buildBrtRecord(BRT_DVAL, Uint8Array.from(payload)));\n }\n parts.push(buildBrtRecord(BRT_END_DVALS, new Uint8Array(0)));\n return concat(parts);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport { CellValue, CellStyle } from './Formats';\nimport { TextByteSink } from './writers/core/ByteSink';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n assertColumnWidth,\n assertCellTextLength,\n assertColumnCount,\n assertRowFitsColumns,\n assertRowCount,\n timeToOaDate,\n AUTOFIT_SAMPLE_ROWS,\n resolveAutofitRows,\n assertCompressionLevel,\n DEFAULT_COMPRESSION_LEVEL,\n} from './writerHelpers';\nimport { columnIndexToLetter } from './xmlUtils';\nimport {\n buildXlsxContentTypes,\n buildXlsxComments,\n buildXlsxCommentsVml,\n buildXlsxRels,\n buildXlsxSharedStrings,\n buildXlsxSheetRels,\n buildXlsxWorkbook,\n CommentSpec,\n ConditionalFormatSpec,\n DataValidationSpec,\n HyperlinkSpec,\n SharedStringValue,\n writeXlsxCell,\n writeXlsxInlineStringCell,\n writeXlsxSharedStringCell,\n writeXlsxSheetHead,\n writeXlsxSheetTail,\n XLSX_REL_COMMENTS,\n XLSX_REL_HYPERLINK,\n XLSX_REL_VML,\n XlsxSheetFeatures,\n XlsxStyleRegistry,\n} from './writers/core/xlsxParts';\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n rId: string;\n filterHeaderRange: string | null;\n merges?: string[];\n dataValidations?: DataValidationSpec[];\n conditionalFormats?: ConditionalFormatSpec[];\n comments?: CommentSpec[];\n hyperlinks?: Array<{ spec: HyperlinkSpec; rId?: string }>;\n legacyDrawingRId?: string;\n sheetRelsXml?: string;\n extraParts?: Array<{ name: string; data: string }>;\n}\n\nexport interface XlsxSheetOptions extends XlsxSheetFeatures {\n hidden?: boolean;\n doAutofilter?: boolean;\n sampleRows?: unknown[][];\n /** Conservative autofit from headers and the first rows (default true). */\n autofit?: boolean;\n /** Rows measured by autofit (default 200); 0 measures only headers/samples. */\n autofitRows?: number;\n /** Fixed widths in Excel character units; skips autofit when provided. */\n columnWidths?: Array<number | null | undefined>;\n}\n\n/**\n * XLSX (Office Open XML) writer with streaming ZIP output.\n */\nexport class XlsxWriter {\n private output: fs.WriteStream;\n private archive: archiver.Archiver;\n private readonly _targetPath: string;\n private readonly _tempPath: string;\n private _outputError: Error | null = null;\n private _finalized: boolean = false;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstArray: SharedStringValue[] = [];\n private sstMap: Map<string, number> = new Map();\n private readonly _styles = new XlsxStyleRegistry();\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n\n private readonly _useSharedStrings: boolean;\n\n private readonly stream = new StreamingSheetState();\n private currentColLetters: string[] = [];\n private _streamPending: BigBuffer | null = null;\n private _streamHeadFlushed: boolean = true;\n private _streamHasHeaders: boolean = false;\n private _streamDataRows: number = 0;\n private _streamAutofitRows: number = AUTOFIT_SAMPLE_ROWS;\n\n /**\n * @param filePath Destination `.xlsx` path on disk.\n */\n /**\n * @param filePath Destination `.xlsx` path on disk.\n * @param options.compressionLevel Deflate level 0-9 (default 3).\n */\n constructor(filePath: string, options: { compressionLevel?: number; useSharedStrings?: boolean } = {}) {\n const compressionLevel = assertCompressionLevel(options.compressionLevel ?? DEFAULT_COMPRESSION_LEVEL);\n this._useSharedStrings = options.useSharedStrings !== false;\n this._targetPath = path.resolve(filePath);\n fs.mkdirSync(path.dirname(this._targetPath), { recursive: true });\n this._tempPath = path.join(\n path.dirname(this._targetPath),\n `.${path.basename(this._targetPath)}.${randomUUID()}.tmp`\n );\n this.output = fs.createWriteStream(this._tempPath);\n this.output.on('error', (err: Error) => { this._outputError = err; });\n this.archive = archiver('zip', { zlib: { level: compressionLevel } });\n this.archive.on('error', (err: Error) => { this._outputError = err; });\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n private _getColumnLetter(colIndex: number): string {\n return columnIndexToLetter(colIndex);\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n /**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n\n this.sheetCount++;\n const rId = `rId${this.sheetCount}`;\n const sheetFileName = `sheet${this.sheetCount}.xml`;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/${sheetFileName}`,\n hidden: hidden,\n nameInArchive: sheetFileName,\n sheetId: this.sheetCount,\n rId: rId,\n filterHeaderRange: null\n });\n }\n\n /**\n * Resolve column widths with the conservative autofit: header text and up\n * to 200 sample rows, calibrated character costs plus padding, capped at\n * 200. Fixed `columnWidths` win over autofit.\n */\n private _resolveColumnWidths(\n columnCount: number,\n headers: string[] | null | undefined,\n rows: unknown[][] | undefined,\n options: XlsxSheetOptions,\n doAutofilter: boolean,\n ): number[] {\n const widths = initColWidths(columnCount);\n if (options.columnWidths) {\n for (let i = 0; i < columnCount; i++) {\n const width = options.columnWidths[i];\n if (width !== null && width !== undefined) widths[i] = assertColumnWidth(width, i);\n }\n return widths;\n }\n if (options.autofit === false) return widths;\n if (headers) {\n applyHeaderWidths(widths, headers, columnCount, {\n bold: true,\n filterButton: doAutofilter,\n });\n }\n const samples = options.sampleRows ?? rows;\n const limit = options.sampleRows\n ? samples?.length ?? 0\n : resolveAutofitRows(options.autofitRows);\n if (samples && limit > 0) updateColWidthsFromRows(widths, samples, limit);\n return widths;\n }\n\n /** Store sheet features and build the worksheet rels/comments parts. */\n private _applySheetFeatures(sheet: SheetInfo, features: XlsxSheetFeatures): void {\n if (features.merges) sheet.merges = features.merges;\n if (features.dataValidations) sheet.dataValidations = features.dataValidations;\n if (features.conditionalFormats) sheet.conditionalFormats = features.conditionalFormats;\n\n const rels: Array<{ id: string; type: string; target: string; external?: boolean }> = [];\n let nextRelId = 1;\n const hyperlinks: Array<{ spec: HyperlinkSpec; rId?: string }> = [];\n for (const spec of features.hyperlinks ?? []) {\n if (spec.target) {\n const id = `rId${nextRelId++}`;\n rels.push({ id, type: XLSX_REL_HYPERLINK, target: spec.target, external: true });\n hyperlinks.push({ spec, rId: id });\n } else {\n hyperlinks.push({ spec });\n }\n }\n if (hyperlinks.length > 0) sheet.hyperlinks = hyperlinks;\n\n const comments = features.comments ?? [];\n if (comments.length > 0) {\n const commentsPath = `xl/comments/sheet${sheet.sheetId}.xml`;\n const vmlPath = `xl/drawings/commentsDrawing${sheet.sheetId}.vml`;\n const commentsRid = `rId${nextRelId++}`;\n const vmlRid = `rId${nextRelId++}`;\n rels.push({\n id: commentsRid,\n type: XLSX_REL_COMMENTS,\n target: `../comments/sheet${sheet.sheetId}.xml`,\n });\n rels.push({\n id: vmlRid,\n type: XLSX_REL_VML,\n target: `../drawings/commentsDrawing${sheet.sheetId}.vml`,\n });\n sheet.comments = comments;\n sheet.legacyDrawingRId = vmlRid;\n sheet.extraParts = [\n { name: commentsPath, data: buildXlsxComments(comments) },\n { name: vmlPath, data: buildXlsxCommentsVml(comments) },\n ];\n }\n\n if (rels.length > 0) sheet.sheetRelsXml = buildXlsxSheetRels(rels);\n }\n\n private _appendExtraParts(sheet: SheetInfo): void {\n if (sheet.sheetRelsXml) {\n this.archive.append(sheet.sheetRelsXml, {\n name: `xl/worksheets/_rels/${sheet.nameInArchive}.rels`,\n });\n }\n for (const part of sheet.extraParts ?? []) {\n this.archive.append(part.data, { name: part.name });\n }\n }\n\n\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: XlsxSheetOptions = {}\n ): void {\n assertColumnCount(columnCount);\n if (headers !== undefined) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n\n const { hidden = false, doAutofilter = true } = options;\n\n this.addSheet(sheetName, hidden);\n const sheet = this.sheetList[this.sheetCount - 1];\n this._applySheetFeatures(sheet, options);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n this.currentColLetters = colLetters;\n\n this.stream.colWidths = this._resolveColumnWidths(\n columnCount,\n headers,\n undefined,\n options,\n doAutofilter && headers !== undefined,\n );\n\n // Widths come from the header and the first AUTOFIT_SAMPLE_ROWS data\n // rows, so the sheet head is delayed until they are measured (xlspy\n // behaves the same way). Until then rows are buffered here.\n this._streamHasHeaders = headers !== undefined;\n this._streamDataRows = 0;\n this._streamAutofitRows = resolveAutofitRows(options.autofitRows);\n this._streamHeadFlushed = false;\n this._streamPending = new BigBuffer();\n\n if (headers) {\n this.stream.rowNum++;\n const pending = this._streamPending;\n pending.writeString(`<row r=\"${this.stream.rowNum}\">`);\n // Headers are contiguous from column A, so no cell needs `r`.\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(pending, headers[c], '', 3);\n }\n pending.writeString('</row>');\n }\n if (this._streamAutofitRows === 0) this._flushStreamHead();\n }\n\n /** Write the delayed sheet head and everything buffered before it. */\n private _flushStreamHead(): void {\n if (this._streamHeadFlushed) return;\n const bigBuf = this.stream.assertStreaming();\n const pending = this._streamPending;\n writeXlsxSheetHead(bigBuf, {\n dimensionRef: 'A1',\n columnCount: this.stream.endCol,\n isFirstSheet: this.sheetCount === 1,\n hasHeaders: this._streamHasHeaders,\n colWidths: this.stream.colWidths,\n });\n if (pending) {\n for (const chunk of pending.getChunks()) bigBuf.write(chunk);\n }\n this._streamPending = null;\n this._streamHeadFlushed = true;\n }\n\n private _writeStreamRow(bigBuf: BigBuffer, row: CellValue[]): void {\n this.stream.rowNum++;\n assertRowCount(this.stream.rowNum);\n bigBuf.writeString(`<row r=\"${this.stream.rowNum}\">`);\n\n let prevCol = -1;\n for (let c = 0; c < row.length; c++) {\n prevCol = writeXlsxCell(\n bigBuf,\n this,\n row[c],\n c,\n prevCol,\n this.currentColLetters[c],\n this.stream.rowNum,\n );\n }\n bigBuf.writeString('</row>');\n }\n\n /** Write one data row in streaming mode. */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n\n if (!this._streamHeadFlushed && this._streamPending) {\n this._streamDataRows++;\n updateColWidthsFromRows(this.stream.colWidths, [row]);\n this._writeStreamRow(this._streamPending, row);\n if (this._streamDataRows >= this._streamAutofitRows) this._flushStreamHead();\n return;\n }\n this._writeStreamRow(bigBuf, row);\n }\n\n /** Finish the current streaming sheet and append it to the archive. */\n endSheet(): void {\n this._flushStreamHead();\n const bigBuf = this.stream.assertStreaming();\n const sheet = this.sheetList[this.sheetCount - 1];\n const filterRange = writeXlsxSheetTail(bigBuf, {\n doAutofilter: this.stream.doAutofilter,\n columnCount: this.stream.endCol,\n lastColumnLetter: this.currentColLetters[this.stream.endCol - 1] ?? 'A',\n rowNum: this.stream.rowNum,\n sheetName: sheet.name,\n merges: sheet.merges,\n hyperlinks: sheet.hyperlinks,\n dataValidations: sheet.dataValidations,\n conditionalFormats: sheet.conditionalFormats,\n legacyDrawingRId: sheet.legacyDrawingRId,\n registerDxf: style => this._styles.registerDxf(style),\n });\n if (filterRange !== null) {\n this._autofilterIsOn = true;\n sheet.filterHeaderRange = filterRange;\n }\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: sheet.pathInArchive\n });\n this._appendExtraParts(sheet);\n\n this.stream.end();\n this.currentColLetters = [];\n this._streamPending = null;\n this._streamHeadFlushed = true;\n this._streamHasHeaders = false;\n this._streamDataRows = 0;\n this._streamAutofitRows = AUTOFIT_SAMPLE_ROWS;\n }\n\n /**\n * Write an entire sheet in one call (batch mode).\n *\n * The third argument keeps the legacy `doAutofilter` boolean; pass\n * {@link XlsxSheetOptions} instead to add features (merges, hyperlinks,\n * validations, conditional formats, comments) and width control.\n */\n writeSheet(\n rows: CellValue[][],\n headers: string[] | null = null,\n doAutofilterOrOptions: boolean | XlsxSheetOptions = true,\n extraOptions: XlsxSheetOptions = {},\n ): void {\n let doAutofilter = true;\n let options: XlsxSheetOptions;\n if (typeof doAutofilterOrOptions === 'boolean') {\n // The options object is the newer API; an explicit `doAutofilter`\n // there wins over the legacy positional boolean.\n doAutofilter = extraOptions.doAutofilter ?? doAutofilterOrOptions;\n options = { ...extraOptions, doAutofilter };\n } else {\n options = { ...doAutofilterOrOptions, ...extraOptions };\n doAutofilter = options.doAutofilter !== false;\n }\n\n const bigBuf = new BigBuffer();\n\n let columnCount = 0;\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n if (columnCount > 0) assertColumnCount(columnCount);\n const totalRows = rows.length + (headers ? 1 : 0);\n assertRowCount(totalRows);\n if (headers) {\n assertRowFitsColumns('header', headers.length, columnCount);\n for (const h of headers) assertCellTextLength(h);\n }\n for (let r = 0; r < rows.length; r++) {\n assertRowFitsColumns('row', rows[r].length, columnCount);\n }\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n\n const colWidths = this._resolveColumnWidths(\n columnCount,\n headers,\n rows,\n options,\n doAutofilter && headers !== null && headers !== undefined,\n );\n\n const dimensionRef = totalRows > 0 && columnCount > 0\n ? `A1:${colLetters[columnCount - 1]}${totalRows}`\n : 'A1';\n writeXlsxSheetHead(bigBuf, {\n dimensionRef,\n columnCount,\n isFirstSheet: this.sheetCount === 1,\n hasHeaders: headers !== null && headers !== undefined,\n colWidths,\n });\n\n let rowNum = 0;\n\n if (headers) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n // Headers are contiguous from column A, so no cell needs `r`.\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(bigBuf, headers[c], '', 3);\n }\n bigBuf.writeString('</row>');\n }\n\n for (let r = 0; r < rows.length; r++) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n const row = rows[r];\n let prevCol = -1;\n for (let c = 0; c < row.length; c++) {\n prevCol = writeXlsxCell(bigBuf, this, row[c], c, prevCol, colLetters[c], rowNum);\n }\n bigBuf.writeString('</row>');\n }\n\n const sheet = this.sheetList[this.sheetCount - 1];\n if (!sheet) {\n throw new Error('Call addSheet() before writeSheet()');\n }\n this._applySheetFeatures(sheet, options);\n\n const filterRange = writeXlsxSheetTail(bigBuf, {\n doAutofilter: doAutofilter && headers !== null && headers !== undefined,\n columnCount,\n lastColumnLetter: columnCount > 0 ? colLetters[columnCount - 1] : 'A',\n rowNum: totalRows,\n sheetName: sheet.name,\n merges: sheet.merges,\n hyperlinks: sheet.hyperlinks,\n dataValidations: sheet.dataValidations,\n conditionalFormats: sheet.conditionalFormats,\n legacyDrawingRId: sheet.legacyDrawingRId,\n registerDxf: style => this._styles.registerDxf(style),\n });\n if (filterRange !== null) {\n this._autofilterIsOn = true;\n sheet.filterHeaderRange = filterRange;\n }\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: sheet.pathInArchive\n });\n this._appendExtraParts(sheet);\n }\n\n /** `ref` is the cell's `r` attribute from `cellRefAttr`, or '' when omitted. */\n private _writeStringCell(bigBuf: TextByteSink, val: SharedStringValue, ref: string, styleOverride?: number): void {\n assertCellTextLength(typeof val === 'string' ? val : val.toString());\n if (this._useSharedStrings) {\n writeXlsxSharedStringCell(bigBuf, { values: this.sstArray, index: this.sstMap }, val, ref, styleOverride);\n this.sstCntAll++;\n return;\n }\n writeXlsxInlineStringCell(bigBuf, val, ref, styleOverride);\n }\n\n // XlsxCellContext implementation used by the shared cell writer.\n writeStringCell(bigBuf: TextByteSink, val: SharedStringValue, ref: string, styleOverride?: number): void {\n this._writeStringCell(bigBuf, val, ref, styleOverride);\n }\n\n registerStyle(style: CellStyle): number {\n return this._styles.register(style);\n }\n\n registerFormat(fmtString: string): number {\n return this._styles.registerFormat(fmtString);\n }\n\n toOaDate(date: Date): number {\n return this._toOADate(date);\n }\n\n private _toOADate(date: Date): number {\n // Use UTC time to avoid timezone conversion issues; handles the\n // fictitious 1900-02-29 (dates before 1900-03-01 serialize one lower).\n return timeToOaDate(date.getTime(), this._oaEpoch);\n }\n\n /** Finalize the ZIP package and close the output stream. */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this._finalized) {\n reject(new Error('XlsxWriter: already finalized'));\n return;\n }\n this._finalized = true;\n let settled = false;\n const cleanupTemp = (): void => {\n try {\n if (fs.existsSync(this._tempPath)) fs.rmSync(this._tempPath);\n } catch {\n // Preserve original error.\n }\n };\n const fail = (err: unknown): void => {\n if (settled) return;\n settled = true;\n try { this.archive.abort(); } catch { /* preserve */ }\n try { this.output.destroy(); } catch { /* preserve */ }\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n };\n const succeed = (): void => {\n if (settled) return;\n if (this._outputError) {\n fail(this._outputError);\n return;\n }\n settled = true;\n try {\n // Ensure data hits disk before publishing (xlspy parity, no fsync of dir).\n const fd = fs.openSync(this._tempPath, 'r+');\n try { fs.fsyncSync(fd); } finally { fs.closeSync(fd); }\n // Preserve the mode of a file being replaced (the temp file\n // was created with the process umask).\n try {\n const existing = fs.statSync(this._targetPath);\n fs.chmodSync(this._tempPath, existing.mode & 0o777);\n } catch {\n // Target does not exist yet.\n }\n fs.renameSync(this._tempPath, this._targetPath);\n resolve();\n } catch (err) {\n cleanupTemp();\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n };\n try {\n if (this._outputError) throw this._outputError;\n this._writeSharedStrings();\n this._writeStyles();\n this._writeWorkbook();\n this._writeContentTypes();\n this._writeRels();\n\n this.output.once('close', succeed);\n this.output.once('error', fail);\n this.archive.once('error', fail);\n\n this.archive.finalize();\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private _writeSharedStrings(): void {\n this.archive.append(\n buildXlsxSharedStrings(this.sstArray, this.sstCntAll),\n { name: 'xl/sharedStrings.xml' },\n );\n }\n\n private _writeStyles(): void {\n this.archive.append(this._styles.toXml(), { name: 'xl/styles.xml' });\n }\n\n private _writeWorkbook(): void {\n this.archive.append(\n buildXlsxWorkbook(this.sheetList, this._autofilterIsOn),\n { name: 'xl/workbook.xml' },\n );\n }\n\n private _writeContentTypes(): void {\n const commentParts = this.sheetList\n .filter(sheet => (sheet.comments?.length ?? 0) > 0)\n .map(sheet => ({ path: `xl/comments/sheet${sheet.sheetId}.xml` }));\n this.archive.append(\n buildXlsxContentTypes(this.sheetList, commentParts),\n { name: '[Content_Types].xml' },\n );\n }\n\n private _writeRels(): void {\n const rels = buildXlsxRels(this.sheetList);\n this.archive.append(rels.global, { name: '_rels/.rels' });\n this.archive.append(rels.workbook, { name: 'xl/_rels/workbook.xml.rels' });\n }\n}\n\nexport default XlsxWriter;\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport { writeBufferAtomically } from './atomicFile';\nimport { writeAdmZipStreaming, StagedZipPart } from './streamingZip';\nimport { timeToOaDate } from './writerHelpers';\nimport {\n escapeXmlText,\n escapeXlsxText,\n columnIndexToLetter,\n columnLetterToIndex,\n parseSharedStringsXml,\n trimTrailingEmptyRows,\n parseTagAttributes,\n resolveRelTarget,\n unescapeXml,\n} from './xmlUtils';\n\n/**\n * Options for {@link XlsxUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use style 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\n/** A one-pass synchronous or asynchronous source of worksheet rows. */\nexport type RowSource =\n | Iterable<ReadonlyArray<CellValue>>\n | AsyncIterable<ReadonlyArray<CellValue>>;\n\ninterface PivotCacheDef {\n path: string;\n xml: string;\n}\n\ninterface CellRange {\n c1: number;\n r1: number;\n c2: number;\n r2: number;\n}\n\n/** Parse an A1-style range (\"A1\", \"A1:B10\", \"$A$1:$B$10\"). */\nfunction parseCellRange(ref: string): CellRange | null {\n const m = /^\\$?([A-Za-z]+)\\$?(\\d+)(?::\\$?([A-Za-z]+)\\$?(\\d+))?$/.exec(ref.trim());\n if (!m) return null;\n const c1 = columnLetterToIndex(m[1].toUpperCase());\n const r1 = parseInt(m[2], 10);\n const c2 = m[3] ? columnLetterToIndex(m[3].toUpperCase()) : c1;\n const r2 = m[4] ? parseInt(m[4], 10) : r1;\n if (!Number.isFinite(c1) || !Number.isFinite(r1) || !Number.isFinite(c2) || !Number.isFinite(r2)) {\n return null;\n }\n return {\n c1: Math.min(c1, c2),\n r1: Math.min(r1, r2),\n c2: Math.max(c1, c2),\n r2: Math.max(r1, r2),\n };\n}\n\n/**\n * Update the data of a worksheet inside an existing XLSX file without rebuilding\n * the workbook. Everything outside the target sheet's cell data — pivot tables\n * and their caches, other sheets, styles, themes, defined names — is preserved\n * byte-for-byte. This makes it possible to refresh a data sheet that other\n * Excel features (pivot tables, charts, formulas) are wired to.\n *\n * ```ts\n * const updater = new XlsxUpdater('report.xlsx');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsx'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsxUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n private temporaryDirectory: string | null = null;\n private readonly stagedParts: StagedZipPart = new Map();\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefs: PivotCacheDef[] = [];\n private pivotTableDefPaths: string[] = [];\n\n private sharedStringsXml: string | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsOriginalLength: number = 0;\n private sharedStringsCount: number = 0;\n private sharedStringsPending: string[] = [];\n private sharedStringsDirty: boolean = false;\n private stringIndexMap: Map<string, number> = new Map();\n\n private _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsx` file.\n */\n constructor(filePath: string) {\n this.sourcePath = filePath;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`XlsxUpdater: file not found: ${filePath}`);\n }\n\n this.zip = new AdmZip(filePath);\n\n if (this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsxUpdater: XLSB files are not supported yet. Convert the workbook to XLSX first.'\n );\n }\n if (!this.zip.getEntry('xl/workbook.xml')) {\n throw new Error('XlsxUpdater: not a valid XLSX workbook (xl/workbook.xml missing).');\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsxUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsxUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetXml = this._entryData(sheetPath).toString('utf8');\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsXml !== null) {\n this.sharedStringsCount = Math.max(\n 0,\n this.sharedStringsCount - this._sharedStringRefCount(sheetXml),\n );\n this.sharedStringsDirty = true;\n }\n\n let colStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateStyle: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectExistingStyles(sheetXml);\n colStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateStyle = this._findDateStyleIndex();\n }\n\n const lastCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0) - 1;\n const totalRows = rows.length + (headers ? 1 : 0);\n\n const newSheetData = this._buildSheetData(rows, headers, colStyles, headerStyles, dateStyle);\n const newXml = this._patchSheetXml(sheetXml, newSheetData, totalRows, lastCol);\n this.zip.updateFile(sheetPath, Buffer.from(newXml, 'utf8'));\n this._discardStagedPart(sheetPath);\n\n if (this.sharedStringsXml !== null) {\n this._commitSharedStrings();\n }\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n this._updatePivotCaches(sheetName, dimRef, rows.length);\n this._addRefreshOnLoadToPivotTables();\n this._removeCalcChain();\n this._updateTableRefs(sheetName, dimRef);\n }\n\n /**\n * Replace worksheet rows from a one-pass source without materialising the\n * complete result set. Use {@link saveStreaming} to keep the final ZIP\n * write streaming as well.\n */\n async replaceSheetDataStream(\n sheetName: string,\n rows: RowSource,\n options: ReplaceSheetDataOptions = {},\n ): Promise<void> {\n const { headers, styleFallback = 'inherit' } = options;\n if (styleFallback !== 'inherit' && styleFallback !== 'general') {\n throw new Error(\"XlsxUpdater: styleFallback must be 'inherit' or 'general'.\");\n }\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsxUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsxUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const oldStage = this.stagedParts.get(sheetPath);\n const beforeValuesLength = this.sharedStringsValues.length;\n const beforePendingLength = this.sharedStringsPending.length;\n const beforeSharedStringsCount = this.sharedStringsCount;\n const beforeSharedStringsDirty = this.sharedStringsDirty;\n const beforeSharedStringsXml = this.sharedStringsXml;\n const beforeSharedStringsOriginalLength = this.sharedStringsOriginalLength;\n const beforeStringIndexMap = new Map(this.stringIndexMap);\n const sharedStringsEntry = this.zip.getEntry('xl/sharedStrings.xml');\n const beforeSharedStringsBytes = sharedStringsEntry || this.stagedParts.has('xl/sharedStrings.xml')\n ? Buffer.from(this._entryData('xl/sharedStrings.xml'))\n : null;\n const createdParts: string[] = [];\n const oldSheetXml = this._entryData(sheetPath).toString('utf8');\n const rowsPath = this._temporaryPath('.rows');\n const outputPath = this._temporaryPath('.xml');\n createdParts.push(rowsPath, outputPath);\n let output: fs.WriteStream | null = null;\n\n try {\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsXml !== null) {\n this.sharedStringsCount = Math.max(\n 0,\n this.sharedStringsCount - this._sharedStringRefCount(oldSheetXml),\n );\n this.sharedStringsDirty = true;\n }\n\n let colStyles = new Map<number, number>();\n let headerStyles = new Map<number, number>();\n let dateStyle: number | null = null;\n if (styleFallback !== 'general') {\n const collected = this._collectExistingStyles(oldSheetXml);\n colStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateStyle = this._findDateStyleIndex();\n }\n\n const prefixMatch = /<([A-Za-z_][\\w.-]*:)?sheetData\\b/.exec(oldSheetXml);\n const prefix = prefixMatch?.[1] ?? '';\n const rowOutput = fs.createWriteStream(rowsPath);\n output = rowOutput;\n let outputError: Error | null = null;\n rowOutput.on('error', error => { outputError = error; });\n\n let nextRow = 1;\n let width = headers?.length ?? 0;\n let dataRowsSeen = 0;\n let keptDataRows = 0;\n let lastKeptEnd = 0;\n let pendingEmptyWidth = 0;\n let writtenBytes = 0;\n\n const write = async (data: Buffer): Promise<void> => {\n if (outputError) throw outputError;\n writtenBytes += data.length;\n if (rowOutput.write(data)) return;\n await new Promise<void>((resolve, reject) => {\n const onDrain = () => { cleanup(); resolve(); };\n const onError = (error: Error) => { cleanup(); reject(error); };\n const cleanup = () => {\n rowOutput.off('drain', onDrain);\n rowOutput.off('error', onError);\n };\n rowOutput.once('drain', onDrain);\n rowOutput.once('error', onError);\n });\n };\n\n if (headers !== undefined) {\n const cells = headers.map((value, column) =>\n this._valueCell(value, column, nextRow, headerStyles, dateStyle));\n const header = `<${prefix}row r=\"${nextRow}\">${cells.join('')}</${prefix}row>`;\n await write(Buffer.from(header, 'utf8'));\n lastKeptEnd = writtenBytes;\n nextRow++;\n }\n\n for await (const sourceRow of rows) {\n if (typeof sourceRow === 'string' || sourceRow instanceof Uint8Array) {\n throw new TypeError('Each row must be an iterable of cells, not text');\n }\n const row = Array.from(sourceRow) as CellValue[];\n const cells = row.map((value, column) =>\n value === null || value === undefined\n ? ''\n : this._valueCell(value, column, nextRow, colStyles, dateStyle));\n const rowXml = `<${prefix}row r=\"${nextRow}\">${cells.join('')}</${prefix}row>`;\n await write(Buffer.from(rowXml, 'utf8'));\n dataRowsSeen++;\n nextRow++;\n\n if (row.every(value => value === null || value === undefined)) {\n pendingEmptyWidth = Math.max(pendingEmptyWidth, row.length);\n } else {\n width = Math.max(width, pendingEmptyWidth, row.length);\n pendingEmptyWidth = 0;\n keptDataRows = dataRowsSeen;\n lastKeptEnd = writtenBytes;\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n rowOutput.once('close', resolve);\n rowOutput.once('error', reject);\n rowOutput.end();\n });\n if (outputError) throw outputError;\n\n const rowsFd = fs.openSync(rowsPath, 'r+');\n try {\n fs.ftruncateSync(rowsFd, lastKeptEnd);\n } finally {\n fs.closeSync(rowsFd);\n }\n\n const totalRows = keptDataRows + (headers !== undefined ? 1 : 0);\n const lastCol = width - 1;\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n this._patchSheetFile(oldSheetXml, rowsPath, outputPath, dimRef);\n this._stagePart(sheetPath, outputPath);\n this._commitSharedStrings();\n this._updatePivotCaches(sheetName, dimRef, keptDataRows);\n this._addRefreshOnLoadToPivotTables();\n this._removeCalcChain();\n this._updateTableRefs(sheetName, dimRef);\n\n if (oldStage && oldStage !== outputPath) {\n this._removeTemporaryFile(oldStage);\n }\n createdParts.splice(createdParts.indexOf(outputPath), 1);\n } catch (error) {\n this.sharedStringsValues.length = beforeValuesLength;\n this.sharedStringsPending.length = beforePendingLength;\n this.sharedStringsCount = beforeSharedStringsCount;\n this.sharedStringsDirty = beforeSharedStringsDirty;\n this.sharedStringsXml = beforeSharedStringsXml;\n this.sharedStringsOriginalLength = beforeSharedStringsOriginalLength;\n this.stringIndexMap.clear();\n for (const [value, index] of beforeStringIndexMap) this.stringIndexMap.set(value, index);\n if (beforeSharedStringsBytes) {\n this.zip.updateFile('xl/sharedStrings.xml', beforeSharedStringsBytes);\n }\n if (oldStage) this.stagedParts.set(sheetPath, oldStage);\n else this.stagedParts.delete(sheetPath);\n throw error;\n } finally {\n if (output && !output.closed) output.destroy();\n for (const temporaryPath of createdParts) {\n this._removeTemporaryFile(temporaryPath);\n }\n }\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n this._materializeStagedParts();\n writeBufferAtomically(this.zip.toBuffer(), target);\n }\n\n /** Save staged streaming replacements without materialising the ZIP. */\n async saveStreaming(outputPath?: string): Promise<void> {\n const target = outputPath ?? this.sourcePath;\n await writeAdmZipStreaming(this.zip, this.stagedParts, target);\n\n // Keep the updater reusable after an in-place save. The synchronous\n // AdmZip path is refreshed with the staged parts only after the output\n // archive has been safely installed.\n this._materializeStagedParts();\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n this._materializeStagedParts();\n return this.zip.toBuffer();\n }\n\n /**\n * Release the staging directory and any unsaved staged parts.\n * The updater remains usable; a new staging directory is created lazily\n * on the next streaming replacement.\n */\n dispose(): void {\n for (const stagedPath of this.stagedParts.values()) {\n try {\n fs.rmSync(stagedPath, { force: true });\n } catch {\n // Best-effort cleanup.\n }\n }\n this.stagedParts.clear();\n if (this.temporaryDirectory !== null) {\n try {\n fs.rmSync(this.temporaryDirectory, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup.\n }\n this.temporaryDirectory = null;\n }\n }\n\n /** Support `using` declarations for automatic staging cleanup. */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n private _ensureTemporaryDirectory(): string {\n if (this.temporaryDirectory === null) {\n this.temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'spreadsheet-updater-'));\n } else {\n try {\n fs.mkdirSync(this.temporaryDirectory, { recursive: true });\n } catch {\n // Best-effort; file creation will surface persistent failures.\n }\n }\n return this.temporaryDirectory;\n }\n\n private _temporaryPath(suffix: string): string {\n return path.join(this._ensureTemporaryDirectory(), `part-${Date.now()}-${Math.random().toString(16).slice(2)}${suffix}`);\n }\n\n private _removeTemporaryFile(filePath: string): void {\n try {\n fs.rmSync(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n\n private _entryData(name: string): Buffer {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) return fs.readFileSync(stagedPath);\n const entry = this.zip.getEntry(name);\n if (!entry) throw new Error(`XlsxUpdater: ZIP member missing: ${name}`);\n return entry.getData();\n }\n\n private _stagePart(name: string, filePath: string): void {\n this.stagedParts.set(name, filePath);\n }\n\n private _discardStagedPart(name: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (!stagedPath) return;\n this._removeTemporaryFile(stagedPath);\n this.stagedParts.delete(name);\n }\n\n private _materializeStagedParts(): void {\n for (const [name, stagedPath] of this.stagedParts) {\n this.zip.updateFile(name, fs.readFileSync(stagedPath));\n this._removeTemporaryFile(stagedPath);\n }\n this.stagedParts.clear();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) {\n rIdToTarget[id] = target;\n }\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.xml');\n const wbXml = wbEntry ? wbEntry.getData().toString('utf8') : '';\n const sheetRe = /<sheet\\b[^>]*>/g;\n let match;\n while ((match = sheetRe.exec(wbXml)) !== null) {\n const tag = match[0];\n const attrs = parseTagAttributes(tag);\n const rawName = attrs['name'];\n const rId = attrs['r:id'] ?? attrs['id'] ?? attrs['rId'];\n if (rawName === undefined || rId === undefined) continue;\n const name = unescapeXml(rawName);\n const target = rIdToTarget[rId] ?? '';\n const fullPath = resolveRelTarget(target);\n if (fullPath) {\n this.sheetNameToPath.set(name, fullPath);\n }\n }\n // 1904 date system for Date→OA conversion.\n const wbPrMatch = /<workbookPr\\b[^>]*>/i.exec(wbXml);\n if (wbPrMatch) {\n const wbPrAttrs = parseTagAttributes(wbPrMatch[0]);\n const v = (wbPrAttrs['date1904'] ?? '').trim().toLowerCase();\n this._oaEpoch =\n (v === '1' || v === 'true') ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n }\n\n for (const entry of this.zip.getEntries()) {\n const name = entry.entryName;\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.xml$/.test(name)) {\n this.pivotCacheDefs.push({ path: name, xml: entry.getData().toString('utf8') });\n } else if (/^xl\\/pivotTables\\/pivotTable\\d*\\.xml$/.test(name)) {\n this.pivotTableDefPaths.push(name);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsXml !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.xml');\n if (!entry && !this.stagedParts.has('xl/sharedStrings.xml')) {\n this.sharedStringsXml = null;\n return;\n }\n this.sharedStringsXml = this._entryData('xl/sharedStrings.xml').toString('utf8');\n this.sharedStringsValues = parseSharedStringsXml(this.sharedStringsXml);\n\n const countMatch = /<(?:[A-Za-z_][\\w.-]*:)?sst\\b[^>]*>/i.exec(this.sharedStringsXml);\n const countAttr = countMatch ? /(?:^|\\s)count\\s*=\\s*[\"'](\\d+)[\"']/.exec(countMatch[0]) : null;\n this.sharedStringsCount = countAttr ? parseInt(countAttr[1], 10) : this.sharedStringsValues.length;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this.sharedStringsOriginalLength = this.sharedStringsValues.length;\n this.sharedStringsPending = [];\n this.sharedStringsDirty = false;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsXml === null || !this.sharedStringsDirty) {\n return;\n }\n\n let xml = this.sharedStringsXml;\n\n const sstMatch = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sst\\b[^>]*>/i.exec(xml);\n if (!sstMatch || sstMatch.index === undefined) {\n throw new Error('XlsxUpdater: sharedStrings.xml has no sst element.');\n }\n const tag = sstMatch[0];\n const prefix = sstMatch.groups?.prefix ?? '';\n const newTag = XlsxUpdater._replaceOrAddXmlAttribute(\n XlsxUpdater._replaceOrAddXmlAttribute(tag, 'count', String(this.sharedStringsCount)),\n 'uniqueCount',\n String(this.sharedStringsValues.length),\n );\n xml = xml.substring(0, sstMatch.index) + newTag + xml.substring(sstMatch.index + tag.length);\n\n const closingRe = new RegExp(`</${prefix}sst\\\\s*>\\\\s*$`, 'i');\n const closingMatch = closingRe.exec(xml);\n if (!closingMatch || closingMatch.index === undefined) {\n throw new Error('XlsxUpdater: sharedStrings.xml has no closing sst element.');\n }\n\n const appended = this.sharedStringsPending.map(txt => {\n const clean = escapeXlsxText(txt);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n const tAttr = preserve ? ' xml:space=\"preserve\"' : '';\n return `<${prefix}si><${prefix}t${tAttr}>${clean}</${prefix}t></${prefix}si>`;\n }).join('');\n\n xml = xml.substring(0, closingMatch.index) + appended + xml.substring(closingMatch.index);\n this.zip.updateFile('xl/sharedStrings.xml', Buffer.from(xml, 'utf8'));\n this.sharedStringsXml = xml;\n this.sharedStringsOriginalLength = this.sharedStringsValues.length;\n this.sharedStringsPending = [];\n this.sharedStringsDirty = false;\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectExistingStyles(sheetXml: string): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const sdStart = sheetXml.indexOf('<sheetData>');\n if (sdStart === -1) return { dataStyles: new Map(), headerStyles };\n const sdEnd = sheetXml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) return { dataStyles: new Map(), headerStyles };\n\n const region = sheetXml.substring(sdStart, sdEnd);\n // `r` on a cell is optional: a cell without it sits right after the previous\n // cell of its row (column A when first), so track the position per row.\n const cellRe = /<row\\b[^>]*>|<c\\b[^>]*>/g;\n let m;\n let row = 0;\n let nextCol = 0;\n while ((m = cellRe.exec(region)) !== null) {\n const tag = m[0];\n if (tag.startsWith('<row')) {\n const rowAttr = /\\br=\"(\\d+)\"/.exec(tag);\n row = rowAttr ? parseInt(rowAttr[1], 10) : row + 1;\n nextCol = 0;\n continue;\n }\n const rMatch = /r=\"([A-Z]+)(\\d+)\"/.exec(tag);\n let col = nextCol;\n if (rMatch) {\n col = columnLetterToIndex(rMatch[1]);\n row = parseInt(rMatch[2], 10);\n }\n nextCol = col + 1;\n const sMatch = /s=\"(\\d+)\"/.exec(tag);\n if (!sMatch) continue;\n const s = parseInt(sMatch[1], 10);\n if (s <= 0) continue;\n\n if (row === 1) {\n if (!headerStyles.has(col)) headerStyles.set(col, s);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(s, (colCounts.get(s) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [s, count] of colCounts) {\n if (count > bestCount) {\n best = s;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateStyleIndex(): number | null {\n const entry = this.zip.getEntry('xl/styles.xml');\n if (!entry) return null;\n const xml = entry.getData().toString('utf8');\n\n const customDateFormats = new Set<number>();\n const numFmtRe = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let m;\n while ((m = numFmtRe.exec(xml)) !== null) {\n const id = parseInt(m[1], 10);\n const code = m[2].toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n customDateFormats.add(id);\n }\n }\n\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart === -1) return null;\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd === -1) return null;\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n\n const xfRe = /<xf\\b[^>]*>/g;\n let index = 0;\n while ((m = xfRe.exec(cellXfsContent)) !== null) {\n const nfMatch = /numFmtId=\"(\\d+)\"/.exec(m[0]);\n const nfId = nfMatch ? parseInt(nfMatch[1], 10) : 0;\n const isDate = (nfId >= 14 && nfId <= 22) ||\n (nfId >= 45 && nfId <= 47) ||\n customDateFormats.has(nfId);\n if (isDate) return index;\n index++;\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Cell / row serialization\n // ------------------------------------------------------------------\n\n private _buildSheetData(\n rows: CellValue[][],\n headers: string[] | undefined,\n colStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n let out = '';\n let rowNum = 0;\n\n if (headers) {\n rowNum = 1;\n out += '<row r=\"1\">';\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n out += this._stringCell(headers[c], c, rowNum, style);\n }\n out += '</row>';\n }\n\n for (const row of rows) {\n rowNum++;\n out += `<row r=\"${rowNum}\">`;\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n out += this._valueCell(raw, c, rowNum, colStyles, dateStyle);\n }\n out += '</row>';\n }\n return out;\n }\n\n private _valueCell(\n raw: CellValue,\n col: number,\n rowNum: number,\n colStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n const colRef = columnIndexToLetter(col);\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = colStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n return `<c r=\"${colRef}${rowNum}\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'bigint') {\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'boolean') {\n return `<c r=\"${colRef}${rowNum}\" t=\"b\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val ? 1 : 0}</v></c>`;\n }\n if (val instanceof Date) {\n const oaDate = timeToOaDate(val.getTime(), this._oaEpoch);\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateStyle !== null ? dateStyle : 0);\n return `<c r=\"${colRef}${rowNum}\"${style > 0 ? ` s=\"${style}\"` : ''}><v>${oaDate}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (val !== null && val !== undefined) {\n return this._stringCell(String(val), col, rowNum, colStyle);\n }\n return '';\n }\n\n private _stringCell(text: string, col: number, rowNum: number, style: number): string {\n const colRef = columnIndexToLetter(col);\n const styleAttr = style > 0 ? ` s=\"${style}\"` : '';\n\n if (this.sharedStringsXml === null) {\n const clean = escapeXlsxText(text);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n const tAttr = preserve ? ' xml:space=\"preserve\"' : '';\n return `<c r=\"${colRef}${rowNum}\" t=\"inlineStr\"${styleAttr}><is><t${tAttr}>${clean}</t></is></c>`;\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n this.sharedStringsPending.push(text);\n }\n this.sharedStringsCount++;\n this.sharedStringsDirty = true;\n return `<c r=\"${colRef}${rowNum}\" t=\"s\"${styleAttr}><v>${index}</v></c>`;\n }\n\n private static _replaceOrAddXmlAttribute(tag: string, name: string, value: string): string {\n const escaped = escapeXmlText(value);\n const attribute = new RegExp(`(\\\\s${name}\\\\s*=\\\\s*[\"'])[^\"']*([\"'])`, 'i');\n if (attribute.test(tag)) {\n return tag.replace(attribute, `$1${escaped}$2`);\n }\n const insertion = ` ${name}=\"${escaped}\"`;\n return tag.endsWith('/>')\n ? `${tag.slice(0, -2)}${insertion}/>`\n : `${tag.slice(0, -1)}${insertion}>`;\n }\n\n private _sharedStringRefCount(sheetXml: string): number {\n const cellTags = sheetXml.match(/<(?:(?:[A-Za-z_][\\w.-]*):)?c\\b[^>]*>/gi) ?? [];\n return cellTags.filter(tag => /(?:^|\\s)t\\s*=\\s*[\"']s[\"']/i.test(tag)).length;\n }\n\n // ------------------------------------------------------------------\n // Worksheet XML patching\n // ------------------------------------------------------------------\n\n private _patchSheetXml(sheetXml: string, newSheetData: string, totalRows: number, lastCol: number): string {\n let xml = sheetXml;\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n\n // Update the dimension element, or insert one if missing.\n const dimRe = /<dimension\\b[^>]*>/;\n const dimMatch = dimRe.exec(xml);\n if (dimMatch) {\n xml = xml.substring(0, dimMatch.index) +\n dimMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(dimMatch.index + dimMatch[0].length);\n } else {\n const rootRe = /<worksheet\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n const insertAt = rootMatch.index + rootMatch[0].length;\n xml = xml.substring(0, insertAt) + `<dimension ref=\"${dimRef}\"/>` + xml.substring(insertAt);\n }\n }\n\n // Replace the entire sheetData element content.\n const sdOpen = '<sheetData>';\n const sdStart = xml.indexOf(sdOpen);\n if (sdStart === -1) {\n const selfClosing = /<sheetData\\s*\\/\\s*>/;\n const scMatch = selfClosing.exec(xml);\n if (scMatch) {\n xml = xml.substring(0, scMatch.index) +\n '<sheetData>' + newSheetData + '</sheetData>' +\n xml.substring(scMatch.index + scMatch[0].length);\n return xml;\n }\n throw new Error('XlsxUpdater: <sheetData> element not found in worksheet XML.');\n }\n const sdEnd = xml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) {\n throw new Error('XlsxUpdater: <sheetData> element not closed in worksheet XML.');\n }\n xml = xml.substring(0, sdStart + sdOpen.length) + newSheetData + xml.substring(sdEnd);\n\n // Keep the autoFilter range in sync with the new data bounds.\n const afRe = /<autoFilter\\b[^>]*>/;\n const afMatch = afRe.exec(xml);\n if (afMatch && totalRows > 0 && lastCol >= 0 && afMatch[0].includes('ref=')) {\n xml = xml.substring(0, afMatch.index) +\n afMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(afMatch.index + afMatch[0].length);\n }\n\n return xml;\n }\n\n private _patchSheetFile(\n sheetXml: string,\n rowsPath: string,\n outputPath: string,\n dimensionRef: string,\n ): void {\n const source = Buffer.from(sheetXml, 'utf8');\n const text = sheetXml;\n const replacements: Array<{\n start: number;\n end: number;\n data?: Buffer;\n rows?: boolean;\n suffix?: Buffer;\n }> = [];\n\n const emptySheetData = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sheetData\\b(?<attrs>[^>]*)\\/>/i.exec(text);\n if (emptySheetData && emptySheetData.index !== undefined) {\n const prefix = emptySheetData.groups?.prefix ?? '';\n replacements.push({\n start: emptySheetData.index,\n end: emptySheetData.index + emptySheetData[0].length,\n data: Buffer.from(`<${prefix}sheetData${emptySheetData.groups?.attrs ?? ''}>`, 'utf8'),\n rows: true,\n suffix: Buffer.from(`</${prefix}sheetData>`, 'utf8'),\n });\n } else {\n const opening = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sheetData\\b[^>]*>/i.exec(text);\n if (!opening || opening.index === undefined) {\n throw new Error('XlsxUpdater: <sheetData> element not found in worksheet XML.');\n }\n const prefix = opening.groups?.prefix ?? '';\n const closeRe = new RegExp(`</${prefix}sheetData\\\\s*>`, 'i');\n const closing = closeRe.exec(text.slice(opening.index + opening[0].length));\n if (!closing || closing.index === undefined) {\n throw new Error('XlsxUpdater: <sheetData> element not closed in worksheet XML.');\n }\n const closingStart = opening.index + opening[0].length + closing.index;\n replacements.push({\n start: opening.index + opening[0].length,\n end: closingStart,\n rows: true,\n });\n }\n\n const dimension = /<(?<prefix>[A-Za-z_][\\w.-]*:)?dimension\\b[^>]*>/i.exec(text);\n if (dimension && dimension.index !== undefined) {\n replacements.push({\n start: dimension.index,\n end: dimension.index + dimension[0].length,\n data: Buffer.from(\n XlsxUpdater._replaceOrAddXmlAttribute(dimension[0], 'ref', dimensionRef),\n ),\n });\n } else {\n const root = /<(?<prefix>[A-Za-z_][\\w.-]*:)?worksheet\\b[^>]*>/i.exec(text);\n if (root && root.index !== undefined) {\n const prefix = root.groups?.prefix ?? '';\n const insertAt = root.index + root[0].length;\n replacements.push({\n start: insertAt,\n end: insertAt,\n data: Buffer.from(`<${prefix}dimension ref=\"${dimensionRef}\"/>`, 'utf8'),\n });\n }\n }\n\n const autoFilter = /<(?<prefix>[A-Za-z_][\\w.-]*:)?autoFilter\\b[^>]*>/i.exec(text);\n if (autoFilter && autoFilter.index !== undefined) {\n replacements.push({\n start: autoFilter.index,\n end: autoFilter.index + autoFilter[0].length,\n data: Buffer.from(\n XlsxUpdater._replaceOrAddXmlAttribute(autoFilter[0], 'ref', dimensionRef),\n 'utf8',\n ),\n });\n }\n\n replacements.sort((a, b) => a.start - b.start || a.end - b.end);\n const fd = fs.openSync(outputPath, 'w');\n let cursor = 0;\n const writeBuffer = (data: Buffer) => {\n fs.writeSync(fd, data);\n };\n const copyRows = () => {\n const rowsFd = fs.openSync(rowsPath, 'r');\n try {\n const chunk = Buffer.alloc(1024 * 1024);\n const length = fs.statSync(rowsPath).size;\n let position = 0;\n while (position < length) {\n const count = fs.readSync(rowsFd, chunk, 0, Math.min(chunk.length, length - position), position);\n if (count <= 0) throw new Error('XlsxUpdater: failed to read staged rows.');\n fs.writeSync(fd, chunk, 0, count);\n position += count;\n }\n } finally {\n fs.closeSync(rowsFd);\n }\n };\n try {\n for (const replacement of replacements) {\n const startByte = Buffer.byteLength(text.slice(0, replacement.start), 'utf8');\n const endByte = Buffer.byteLength(text.slice(0, replacement.end), 'utf8');\n if (startByte < cursor) throw new Error('XlsxUpdater: overlapping worksheet replacements.');\n writeBuffer(source.subarray(cursor, startByte));\n if (replacement.data) writeBuffer(replacement.data);\n if (replacement.rows) copyRows();\n if (replacement.suffix) writeBuffer(replacement.suffix);\n cursor = endByte;\n }\n writeBuffer(source.subarray(cursor));\n } finally {\n fs.closeSync(fd);\n }\n }\n\n // ------------------------------------------------------------------\n // Pivot table integration\n // ------------------------------------------------------------------\n\n private _updatePivotCaches(sheetName: string, dimRef: string, recordCount: number): void {\n for (const cache of this.pivotCacheDefs) {\n const wsRe = /<worksheetSource\\b[^>]*>/;\n const wsMatch = wsRe.exec(cache.xml);\n if (!wsMatch) continue;\n const wsTag = wsMatch[0];\n const sheetAttr = /sheet=\"([^\"]*)\"/.exec(wsTag);\n if (!sheetAttr || sheetAttr[1] !== sheetName) continue;\n\n let xml = cache.xml;\n xml = xml.substring(0, wsMatch.index) +\n wsTag.replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(wsMatch.index + wsTag.length);\n\n const rootRe = /<pivotCacheDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n let rootTag = rootMatch[0];\n if (/recordCount=\"\\d+\"/.test(rootTag)) {\n rootTag = rootTag.replace(/recordCount=\"\\d+\"/, `recordCount=\"${recordCount}\"`);\n } else if (!/\\/>$/.test(rootTag)) {\n rootTag = rootTag.replace(/>$/, ` recordCount=\"${recordCount}\">`);\n }\n xml = xml.substring(0, rootMatch.index) + rootTag + xml.substring(rootMatch.index + rootMatch[0].length);\n }\n\n this.zip.updateFile(cache.path, Buffer.from(xml, 'utf8'));\n }\n }\n\n private _addRefreshOnLoadToPivotTables(): void {\n for (const path of this.pivotTableDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n let xml = entry.getData().toString('utf8');\n\n const rootRe = /<pivotTableDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (!rootMatch || rootMatch[0].includes('refreshOnLoad')) continue;\n\n const newTag = rootMatch[0].replace(/(\\/?>)$/, ' refreshOnLoad=\"1\"$1');\n xml = xml.substring(0, rootMatch.index) + newTag + xml.substring(rootMatch.index + rootMatch[0].length);\n this.zip.updateFile(path, Buffer.from(xml, 'utf8'));\n }\n }\n\n /**\n * Remove the stale calculation chain (xl/calcChain.xml). Excel rebuilds it\n * on open; keeping stale <c> entries for the replaced sheet would force a\n * repair prompt. Removes the part, its Content_Types override and its\n * workbook rels entry (xlspy parity).\n */\n private _removeCalcChain(): void {\n const calcPath = 'xl/calcChain.xml';\n if (!this.zip.getEntry(calcPath) && !this.stagedParts.has(calcPath)) {\n this._ensureCalcPrFullCalc();\n return;\n }\n try {\n this.zip.deleteFile(calcPath);\n } catch {\n // Best-effort; continue with rels/content-type cleanup.\n }\n const stagedCalc = this.stagedParts.get(calcPath);\n if (stagedCalc) {\n this.stagedParts.delete(calcPath);\n try {\n fs.rmSync(stagedCalc, { force: true });\n } catch {\n // Best-effort.\n }\n }\n\n const ctEntry = this.zip.getEntry('[Content_Types].xml');\n if (ctEntry || this.stagedParts.has('[Content_Types].xml')) {\n try {\n let ct = this._entryData('[Content_Types].xml').toString('utf8');\n const before = ct;\n ct = ct.replace(/<Override\\b[^>]*PartName=\"\\/xl\\/calcChain\\.xml\"[^>]*\\/?>/gi, '');\n if (ct !== before) {\n this._writePartText('[Content_Types].xml', ct);\n }\n } catch {\n // Best-effort.\n }\n }\n\n const relsPath = 'xl/_rels/workbook.xml.rels';\n if (this.zip.getEntry(relsPath) || this.stagedParts.has(relsPath)) {\n try {\n const rels = this._entryData(relsPath).toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let m: RegExpExecArray | null;\n let out = '';\n let last = 0;\n let changed = false;\n while ((m = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(m[0]);\n const type = attrs['Type'] ?? attrs['type'] ?? '';\n const target = attrs['Target'] ?? attrs['target'] ?? '';\n const isCalcChain = type.endsWith('/calcChain') &&\n resolveRelTarget(target) === 'xl/calcChain.xml';\n if (isCalcChain) {\n out += rels.substring(last, m.index);\n last = m.index + m[0].length;\n changed = true;\n }\n }\n if (changed) {\n out += rels.substring(last);\n this._writePartText(relsPath, out);\n }\n } catch {\n // Best-effort.\n }\n }\n this._ensureCalcPrFullCalc();\n }\n\n private _writePartText(name: string, text: string): void {\n if (this.stagedParts.has(name)) {\n fs.writeFileSync(this.stagedParts.get(name)!, text, 'utf8');\n } else {\n this.zip.updateFile(name, Buffer.from(text, 'utf8'));\n }\n }\n\n private _ensureCalcPrFullCalc(): void {\n try {\n const wbPath = 'xl/workbook.xml';\n if (!this.zip.getEntry(wbPath) && !this.stagedParts.has(wbPath)) return;\n let xml = this._entryData(wbPath).toString('utf8');\n const calcPrRe = /<(?:[A-Za-z_][\\w.-]*:)?calcPr\\b[^>]*>/i;\n const match = calcPrRe.exec(xml);\n if (match && match.index !== undefined) {\n const newTag = XlsxUpdater._replaceOrAddXmlAttribute(match[0], 'fullCalcOnLoad', '1');\n // The replacement can change the tag length, so consume the\n // *original* tag (`match[0]`), not `newTag`.\n xml = xml.substring(0, match.index) + newTag + xml.substring(match.index + match[0].length);\n } else {\n const insertAt = XlsxUpdater._calcPrInsertPosition(xml);\n if (insertAt < 0) return;\n xml = xml.substring(0, insertAt) + '<calcPr fullCalcOnLoad=\"1\"/>' + xml.substring(insertAt);\n }\n this._writePartText(wbPath, xml);\n } catch {\n // Best-effort.\n }\n }\n\n /**\n * Insertion offset for a missing `<calcPr>`. The element follows\n * sheets/externalReferences/definedNames in the workbook schema, so insert\n * after the last of those that exists instead of right after `<workbook>`.\n */\n private static _calcPrInsertPosition(xml: string): number {\n const prefixed = '(?:[A-Za-z_][\\\\w.-]*:)?';\n const candidates = [\n new RegExp(`</${prefixed}sheets\\\\s*>`, 'i'),\n new RegExp(`<${prefixed}externalReferences\\\\b[^>]*/>`, 'i'),\n new RegExp(`<${prefixed}externalReferences\\\\b[^>]*>[\\\\s\\\\S]*?</${prefixed}externalReferences\\\\s*>`, 'i'),\n new RegExp(`<${prefixed}definedNames\\\\b[^>]*/>`, 'i'),\n new RegExp(`<${prefixed}definedNames\\\\b[^>]*>[\\\\s\\\\S]*?</${prefixed}definedNames\\\\s*>`, 'i'),\n ];\n let insertAt = -1;\n for (const re of candidates) {\n const m = re.exec(xml);\n if (m && m.index !== undefined) {\n insertAt = Math.max(insertAt, m.index + m[0].length);\n }\n }\n if (insertAt >= 0) return insertAt;\n // Fallbacks for unusual workbooks: before the close tag, else after the root.\n const close = new RegExp(`</${prefixed}workbook\\\\s*>`, 'i').exec(xml);\n if (close && close.index !== undefined) return close.index;\n const root = new RegExp(`<${prefixed}workbook\\\\b[^>]*>`, 'i').exec(xml);\n if (!root || root.index === undefined) return -1;\n return root.index + root[0].length;\n }\n\n /**\n * Update ListObject table ranges (xl/tables/*.xml) for the replaced sheet.\n * Only tables anchored at A1 are updated to the new dimension; tables\n * elsewhere are left untouched (moving them would corrupt the sheet).\n * Empty replacements (dimRef \"A1\") do not shrink multi-column tables.\n */\n private _updateTableRefs(sheetName: string, dimRef: string): void {\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) return;\n const slash = sheetPath.lastIndexOf('/');\n const dir = slash >= 0 ? sheetPath.substring(0, slash + 1) : '';\n const base = slash >= 0 ? sheetPath.substring(slash + 1) : sheetPath;\n const sheetRelsPath = `${dir}_rels/${base}.rels`;\n const sheetRelsEntry = this.zip.getEntry(sheetRelsPath);\n const hasStagedRels = this.stagedParts.has(sheetRelsPath);\n if (!sheetRelsEntry && !hasStagedRels) return;\n\n const tableTargets: string[] = [];\n try {\n const relsXml = this._entryData(sheetRelsPath).toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let m: RegExpExecArray | null;\n while ((m = relTagRe.exec(relsXml)) !== null) {\n const attrs = parseTagAttributes(m[0]);\n const type = attrs['Type'] ?? attrs['type'] ?? '';\n const target = attrs['Target'] ?? attrs['target'] ?? '';\n if (!type.includes('/table') || !target) continue;\n let tablePath: string;\n if (target.startsWith('/')) {\n tablePath = resolveRelTarget(target);\n } else {\n // Resolve relative to the worksheet directory (e.g. ../tables/table1.xml).\n const combined = dir + target;\n const parts: string[] = [];\n for (const seg of combined.split('/')) {\n if (seg === '..') parts.pop();\n else if (seg !== '.' && seg !== '') parts.push(seg);\n }\n tablePath = parts.join('/');\n }\n tableTargets.push(tablePath);\n }\n } catch {\n return;\n }\n if (tableTargets.length === 0) return;\n\n // Read every table first: expanding an A1 table must not overlap a table\n // that sits below it in the same columns.\n const tables: Array<{\n path: string;\n xml: string;\n tag: string;\n tagIndex: number;\n ref: string;\n range: CellRange | null;\n staged: boolean;\n }> = [];\n for (const tablePath of tableTargets) {\n try {\n const hasEntry = !!this.zip.getEntry(tablePath);\n const hasStaged = this.stagedParts.has(tablePath);\n if (!hasEntry && !hasStaged) continue;\n const xml = this._entryData(tablePath).toString('utf8');\n const tableTagRe = /<(?:[A-Za-z_][\\w.-]*:)?table\\b[^>]*>/i;\n const tableMatch = tableTagRe.exec(xml);\n if (!tableMatch || tableMatch.index === undefined) continue;\n const refMatch = /\\bref\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i.exec(tableMatch[0]);\n const ref = refMatch ? (refMatch[2] ?? refMatch[3] ?? '') : '';\n tables.push({\n path: tablePath,\n xml,\n tag: tableMatch[0],\n tagIndex: tableMatch.index,\n ref,\n range: parseCellRange(ref),\n staged: hasStaged,\n });\n } catch {\n // Best-effort per table.\n }\n }\n if (tables.length === 0) return;\n\n const dimRange = parseCellRange(dimRef);\n if (!dimRange) return;\n\n for (const table of tables) {\n try {\n const origRange = table.range;\n if (!origRange) continue;\n // Only A1-anchored tables track the sheet data range.\n if (origRange.r1 !== 1 || origRange.c1 !== 0) continue;\n // Don't collapse a multi-column table to a single cell.\n if (dimRef === 'A1' && !/^A1$/i.test(table.ref)) continue;\n const origCols = origRange.c2 - origRange.c1 + 1;\n const newCols = dimRange.c2 - dimRange.c1 + 1;\n // Changing the width would also require rebuilding <tableColumns>.\n if (newCols !== origCols) continue;\n\n // Cap at the first other table below this one so tables never overlap.\n let lastRow = dimRange.r2;\n for (const other of tables) {\n if (other === table || !other.range) continue;\n if (other.range.r1 <= 1) continue;\n if (other.range.c1 > origRange.c2 || other.range.c2 < origRange.c1) continue;\n lastRow = Math.min(lastRow, other.range.r1 - 1);\n }\n if (lastRow < 1) continue;\n\n const newRef = origRange.c2 === 0 && lastRow === 1\n ? 'A1'\n : `A1:${columnIndexToLetter(origRange.c2)}${lastRow}`;\n let xml = table.xml;\n const newTag = XlsxUpdater._replaceOrAddXmlAttribute(table.tag, 'ref', newRef);\n xml = xml.substring(0, table.tagIndex) + newTag +\n xml.substring(table.tagIndex + table.tag.length);\n const afRe = /<(?:[A-Za-z_][\\w.-]*:)?autoFilter\\b[^>]*>/i;\n const afMatch = afRe.exec(xml);\n if (afMatch && afMatch.index !== undefined) {\n const newAf = XlsxUpdater._replaceOrAddXmlAttribute(afMatch[0], 'ref', newRef);\n xml = xml.substring(0, afMatch.index) + newAf +\n xml.substring(afMatch.index + afMatch[0].length);\n }\n if (table.staged) {\n fs.writeFileSync(this.stagedParts.get(table.path)!, xml, 'utf8');\n } else {\n this.zip.updateFile(table.path, Buffer.from(xml, 'utf8'));\n }\n } catch {\n // Best-effort per table.\n }\n }\n }\n}\n\nexport default XlsxUpdater;\n\n/** Explicit name for updating macro-enabled XLSM packages. */\nexport { XlsxUpdater as XlsmUpdater };\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\n\n/** Internal file operations seam used to test replacement races without Excel. */\nexport interface AtomicFileOperations {\n exists(filePath: string): boolean;\n rename(sourcePath: string, destinationPath: string): void;\n remove(filePath: string): void;\n}\nconst realFileOperations: AtomicFileOperations = {\n exists: (filePath) => fs.existsSync(filePath),\n rename: (sourcePath, destinationPath) => fs.renameSync(sourcePath, destinationPath),\n remove: (filePath) => fs.rmSync(filePath),\n};\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction destinationExistsError(destinationPath: string): Error {\n return new Error(\n `Excel conversion: destination already exists (pass { overwrite: true } to replace it): ${destinationPath}`\n );\n}\n\nfunction readDestinationMode(target: string): number | undefined {\n try {\n if (!fs.existsSync(target)) return undefined;\n return fs.statSync(target).mode & 0o777;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Installs a temporary conversion result without deleting an unapproved or\n * concurrently-created destination. Existing destinations are moved aside\n * before replacement so a failed final rename can be rolled back safely.\n */\nexport function installTemporaryOutput(\n temporaryPath: string,\n destinationPath: string,\n overwrite: boolean,\n operations: AtomicFileOperations = realFileOperations\n): void {\n const backupPath = `${destinationPath}.${randomUUID()}.replacement-backup`;\n let backupCreated = false;\n let installed = false;\n\n if (operations.exists(destinationPath)) {\n if (!overwrite) {\n throw destinationExistsError(destinationPath);\n }\n\n // A rename preserves the old destination if anything fails later.\n operations.rename(destinationPath, backupPath);\n backupCreated = true;\n }\n\n try {\n try {\n operations.rename(temporaryPath, destinationPath);\n installed = true;\n } catch (error) {\n // If overwrite was allowed and a destination appeared after the\n // check above, preserve it as well and retry once.\n if (overwrite && !backupCreated && operations.exists(destinationPath)) {\n operations.rename(destinationPath, backupPath);\n backupCreated = true;\n operations.rename(temporaryPath, destinationPath);\n installed = true;\n } else {\n throw error;\n }\n }\n\n if (backupCreated) {\n operations.remove(backupPath);\n }\n } catch (error) {\n if (backupCreated && !installed) {\n if (!operations.exists(destinationPath)) {\n try {\n operations.rename(backupPath, destinationPath);\n backupCreated = false;\n } catch (rollbackError) {\n throw new Error(\n `Excel conversion: final destination install failed (${errorMessage(error)}), ` +\n `and restoring the original destination also failed (${errorMessage(rollbackError)}). ` +\n `Original file remains at ${backupPath}.`\n );\n }\n } else {\n throw new Error(\n `Excel conversion: final destination install failed (${errorMessage(error)}). ` +\n `A concurrent destination was preserved; the original file remains at ${backupPath}.`\n );\n }\n }\n\n throw error;\n }\n}\n\n/**\n * Write a complete buffer through a same-directory temporary file and replace\n * the destination only after the write has completed successfully.\n */\nexport function writeBufferAtomically(buffer: Buffer, destinationPath: string): void {\n const target = path.resolve(destinationPath);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporaryPath = path.join(\n path.dirname(target),\n `.${path.basename(target)}.${randomUUID()}.tmp`\n );\n const destinationMode = readDestinationMode(target);\n\n try {\n const fd = fs.openSync(temporaryPath, 'w', destinationMode ?? 0o666);\n try {\n if (destinationMode !== undefined) {\n try {\n fs.fchmodSync(fd, destinationMode);\n } catch {\n // Preserve the original write error; mode is best-effort.\n }\n }\n fs.writeFileSync(fd, buffer);\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n if (destinationMode !== undefined) {\n try {\n fs.chmodSync(temporaryPath, destinationMode);\n } catch {\n // Preserve the original write/rename error.\n }\n }\n fs.renameSync(temporaryPath, target);\n } finally {\n if (fs.existsSync(temporaryPath)) {\n try {\n fs.rmSync(temporaryPath);\n } catch {\n // Preserve the original write/rename error.\n }\n }\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport { finished } from 'stream/promises';\nimport { Readable } from 'stream';\nimport AdmZip from 'adm-zip';\nimport archiver from 'archiver';\nimport { DEFAULT_COMPRESSION_LEVEL } from './writerHelpers';\n\n/** A file-backed replacement for one ZIP member. */\nexport type StagedZipPart = Map<string, string>;\n\nfunction readDestinationMode(target: string): number | undefined {\n try {\n if (!fs.existsSync(target)) return undefined;\n return fs.statSync(target).mode & 0o777;\n } catch {\n return undefined;\n }\n}\n\nfunction appendAndWait(\n archive: archiver.Archiver,\n source: NodeJS.ReadableStream,\n name: string,\n output?: fs.WriteStream,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const cleanup = (): void => {\n archive.off('entry', onEntry);\n archive.off('error', onError);\n const maybeEmitter = source as NodeJS.EventEmitter;\n if (typeof maybeEmitter.off === 'function') {\n maybeEmitter.off('error', onError);\n }\n if (output) {\n output.off('error', onError);\n }\n };\n const onEntry = (): void => {\n cleanup();\n resolve();\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n archive.once('entry', onEntry);\n archive.once('error', onError);\n if (output) {\n output.once('error', onError);\n }\n const maybeEmitter = source as NodeJS.EventEmitter;\n if (typeof maybeEmitter.once === 'function') {\n maybeEmitter.once('error', onError);\n }\n try {\n archive.append(source as never, { name });\n } catch (error) {\n cleanup();\n reject(error as Error);\n }\n });\n}\n\n/**\n * Rebuild an existing ZIP package without creating a complete output Buffer.\n * Unchanged members are copied one at a time; staged members are read from\n * temporary files.\n */\nexport async function writeAdmZipStreaming(\n zip: AdmZip,\n stagedParts: StagedZipPart,\n destinationPath: string,\n): Promise<void> {\n const target = path.resolve(destinationPath);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporaryPath = path.join(\n path.dirname(target),\n `.${path.basename(target)}.${randomUUID()}.tmp`\n );\n const destinationMode = readDestinationMode(target);\n\n let output: fs.WriteStream | null = null;\n let archive: archiver.Archiver | null = null;\n try {\n output = fs.createWriteStream(\n temporaryPath,\n destinationMode !== undefined ? { mode: destinationMode } : {},\n );\n // Capture output errors before the append loop (A.3): a failing\n // destination must reject, abort the archive and remove the temp file.\n let outputError: Error | null = null;\n output.on('error', (err: Error) => {\n outputError = err;\n try { archive?.abort(); } catch { /* preserve */ }\n });\n archive = archiver('zip', { zlib: { level: DEFAULT_COMPRESSION_LEVEL } });\n archive.on('error', (err: Error) => {\n outputError = err;\n });\n archive.pipe(output);\n\n for (const entry of zip.getEntries()) {\n if (outputError) throw outputError;\n const stagedPath = stagedParts.get(entry.entryName);\n if (stagedPath) {\n await appendAndWait(archive, fs.createReadStream(stagedPath), entry.entryName, output);\n } else {\n // Decompress each member only after the previous one has been\n // consumed so a single buffer is retained at a time.\n await appendAndWait(archive, Readable.from([entry.getData()]), entry.entryName, output);\n }\n }\n if (outputError) throw outputError;\n\n await archive.finalize();\n await finished(output);\n if (outputError) throw outputError;\n\n if (destinationMode !== undefined) {\n try {\n fs.chmodSync(temporaryPath, destinationMode);\n } catch {\n // Preserve the original archive or rename error.\n }\n }\n const fd = fs.openSync(temporaryPath, 'r+');\n try {\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n fs.renameSync(temporaryPath, target);\n } catch (error) {\n try {\n archive?.abort();\n } catch {\n // Preserve the original archive error.\n }\n throw error;\n } finally {\n if (output && !output.closed) {\n output.destroy();\n }\n if (fs.existsSync(temporaryPath)) {\n try {\n fs.rmSync(temporaryPath);\n } catch {\n // Preserve the original archive or rename error.\n }\n }\n }\n}\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport { writeBufferAtomically } from './atomicFile';\nimport { writeAdmZipStreaming, StagedZipPart } from './streamingZip';\nimport {\n readRecord,\n buildRecord,\n readUtf16,\n parseSharedStringsBin,\n Biff12Record,\n} from './biff12Utils';\nimport { BiffReaderWriter } from './BiffReaderWriter';\nimport { trimTrailingEmptyRows, parseTagAttributes, resolveRelTarget } from './xmlUtils';\nimport { timeToOaDate } from './writerHelpers';\n\n/**\n * Options for {@link XlsbUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style (xf) of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use xf 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\n/** A one-pass synchronous or asynchronous source of worksheet rows. */\nexport type RowSource =\n | Iterable<ReadonlyArray<CellValue>>\n | AsyncIterable<ReadonlyArray<CellValue>>;\n\n/** Worksheet cell records (BrtCellBlank … BrtFmlaError). */\nconst CELL_RECORDS = new Set<number>([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b]);\n\nconst RK_INT_LOWER = -1 << 29;\nconst RK_INT_UPPER = (1 << 29) - 1;\n\n/**\n * Update the data of a worksheet inside an existing XLSB file without rebuilding\n * the workbook. Everything outside the target sheet's rows — pivot tables and\n * their caches, other sheets, styles, column widths, views — is preserved.\n * This makes it possible to refresh a data sheet that pivot tables are wired to.\n *\n * ```ts\n * const updater = new XlsbUpdater('report.xlsb');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsb'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsbUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n private temporaryDirectory: string | null = null;\n private readonly stagedParts: StagedZipPart = new Map();\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefPaths: string[] = [];\n\n private sharedStringsBuf: Buffer | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsTotal: number = 0;\n private sharedStringsUnique: number = 0;\n private sharedStringsEndSst: number = 0;\n private stringIndexMap: Map<string, number> = new Map();\n private sharedStringsDirty: boolean = false;\n\n private _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsb` file.\n */\n constructor(filePath: string) {\n this.sourcePath = filePath;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`XlsbUpdater: file not found: ${filePath}`);\n }\n\n this.zip = new AdmZip(filePath);\n\n if (!this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsbUpdater: not an XLSB workbook (xl/workbook.bin missing). Convert the file to XLSB first.'\n );\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsbUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsbUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetBuf = this._entryData(sheetPath);\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsBuf !== null) {\n this.sharedStringsTotal = Math.max(\n 0,\n this.sharedStringsTotal - this._sharedStringRefCount(sheetBuf),\n );\n this.sharedStringsDirty = true;\n }\n\n let dataStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateXf: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectStyles(sheetBuf);\n dataStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateXf = this._findDateXf();\n }\n\n const lastCol = Math.max(0, Math.max(\n rows.reduce((m, r) => Math.max(m, r.length), 0),\n headers?.length ?? 0\n ) - 1);\n\n const newRows = this._buildRows(rows, headers, dataStyles, headerStyles, dateXf);\n const { rowsStart, rowsEnd, autoFilterRanges } = this._findRowsRegion(sheetBuf);\n\n const newSheet = Buffer.alloc(sheetBuf.length - (rowsEnd - rowsStart) + newRows.length);\n sheetBuf.copy(newSheet, 0, 0, rowsStart);\n newRows.copy(newSheet, rowsStart);\n sheetBuf.copy(newSheet, rowsStart + newRows.length, rowsEnd);\n\n const lastRowIdx = rows.length + (headers ? 1 : 0) - 1;\n const delta = newRows.length - (rowsEnd - rowsStart);\n for (const af of autoFilterRanges) {\n const newAf = af + delta;\n newSheet.writeInt32LE(lastCol, newAf + 12);\n newSheet.writeInt32LE(lastRowIdx, newAf + 4);\n }\n\n // Keep the sheet dimension record (0x94) in sync with the new data. Excel uses\n // its rwLast/colLast fields to read the full row range; stale values make the\n // last written row invisible (and drop it from pivot refreshes).\n this._patchDimension(newSheet, lastRowIdx, lastCol);\n\n this.zip.updateFile(sheetPath, newSheet);\n this._discardStagedPart(sheetPath);\n\n if (this.sharedStringsBuf !== null) {\n this._commitSharedStrings();\n }\n\n const rwLast = Math.max(0, rows.length + (headers ? 1 : 0) - 1);\n const colLast = lastCol;\n this._patchPivotCaches(sheetName, rwLast, colLast);\n this._removeCalcChain();\n }\n\n /** Replace worksheet rows from a one-pass source. */\n async replaceSheetDataStream(\n sheetName: string,\n rows: RowSource,\n options: ReplaceSheetDataOptions = {},\n ): Promise<void> {\n const { headers, styleFallback = 'inherit' } = options;\n if (styleFallback !== 'inherit' && styleFallback !== 'general') {\n throw new Error(\"XlsbUpdater: styleFallback must be 'inherit' or 'general'.\");\n }\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsbUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsbUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const oldStage = this.stagedParts.get(sheetPath);\n const beforeValuesLength = this.sharedStringsValues.length;\n const beforeAppendCount = this._appendCount;\n const beforeSharedStringsTotal = this.sharedStringsTotal;\n const beforeSharedStringsUnique = this.sharedStringsUnique;\n const beforeSharedStringsEndSst = this.sharedStringsEndSst;\n const beforeSharedStringsDirty = this.sharedStringsDirty;\n const beforeStringIndexMap = new Map(this.stringIndexMap);\n const sharedStringsEntry = this.zip.getEntry('xl/sharedStrings.bin');\n const beforeSharedStringsBytes = sharedStringsEntry || this.stagedParts.has('xl/sharedStrings.bin')\n ? Buffer.from(this._entryData('xl/sharedStrings.bin'))\n : null;\n const beforeSharedStringsBuf = this.sharedStringsBuf ? Buffer.from(this.sharedStringsBuf) : null;\n const oldSheet = this._entryData(sheetPath);\n const rowsPath = this._temporaryPath('.rows');\n const outputPath = this._temporaryPath('.bin');\n const createdParts = [rowsPath, outputPath];\n let output: fs.WriteStream | null = null;\n\n try {\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsBuf !== null) {\n this.sharedStringsTotal = Math.max(\n 0,\n this.sharedStringsTotal - this._sharedStringRefCount(oldSheet),\n );\n this.sharedStringsDirty = true;\n }\n\n let dataStyles = new Map<number, number>();\n let headerStyles = new Map<number, number>();\n let dateXf: number | null = null;\n if (styleFallback !== 'general') {\n const collected = this._collectStyles(oldSheet);\n dataStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateXf = this._findDateXf();\n }\n\n const rowOutput = fs.createWriteStream(rowsPath);\n output = rowOutput;\n let outputError: Error | null = null;\n rowOutput.on('error', error => { outputError = error; });\n let writtenBytes = 0;\n let lastKeptEnd = 0;\n let width = headers?.length ?? 0;\n let dataRowsSeen = 0;\n let keptDataRows = 0;\n let pendingEmptyWidth = 0;\n let nextRow = 0;\n const rowHeaderOffsets: number[] = [];\n\n const write = async (data: Buffer): Promise<void> => {\n if (outputError) throw outputError;\n writtenBytes += data.length;\n if (rowOutput.write(data)) return;\n await new Promise<void>((resolve, reject) => {\n const onDrain = () => { cleanup(); resolve(); };\n const onError = (error: Error) => { cleanup(); reject(error); };\n const cleanup = () => {\n rowOutput.off('drain', onDrain);\n rowOutput.off('error', onError);\n };\n rowOutput.once('drain', onDrain);\n rowOutput.once('error', onError);\n });\n };\n\n const writeRow = async (rowNumber: number, cells: Buffer[]): Promise<void> => {\n rowHeaderOffsets.push(writtenBytes);\n const header = Buffer.alloc(27);\n header[0] = 0x00;\n header[1] = 25;\n header.writeInt32LE(rowNumber, 2);\n header[10] = 0x2c;\n header[11] = 0x01;\n header[15] = 0x01;\n header.writeInt32LE(0, 19);\n header.writeInt32LE(0, 23);\n await write(header);\n for (const cell of cells) await write(cell);\n };\n\n if (headers !== undefined) {\n await writeRow(0, headers.map((value, column) =>\n this._stringCellBytes(column, styleFallback === 'general' ? 0 : (headerStyles.get(column) ?? 0), value)));\n lastKeptEnd = writtenBytes;\n nextRow = 1;\n }\n\n for await (const sourceRow of rows) {\n if (typeof sourceRow === 'string' || sourceRow instanceof Uint8Array) {\n throw new TypeError('Each row must be an iterable of cells, not text');\n }\n const row = Array.from(sourceRow) as CellValue[];\n const cells = row\n .map((value, column) => value === null || value === undefined\n ? null\n : this._valueCellBytes(value, column, dataStyles, dateXf))\n .filter((cell): cell is Buffer => cell !== null);\n await writeRow(nextRow, cells);\n dataRowsSeen++;\n nextRow++;\n\n if (row.every(value => value === null || value === undefined)) {\n pendingEmptyWidth = Math.max(pendingEmptyWidth, row.length);\n } else {\n width = Math.max(width, pendingEmptyWidth, row.length);\n pendingEmptyWidth = 0;\n keptDataRows = dataRowsSeen;\n lastKeptEnd = writtenBytes;\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n rowOutput.once('close', resolve);\n rowOutput.once('error', reject);\n rowOutput.end();\n });\n if (outputError) throw outputError;\n\n const rowsFd = fs.openSync(rowsPath, 'r+');\n try {\n fs.ftruncateSync(rowsFd, lastKeptEnd);\n } finally {\n fs.closeSync(rowsFd);\n }\n const lastCol = Math.max(0, width - 1);\n const rowPatchFd = fs.openSync(rowsPath, 'r+');\n try {\n const lastColBuffer = Buffer.alloc(4);\n lastColBuffer.writeInt32LE(lastCol, 0);\n for (const offset of rowHeaderOffsets) {\n if (offset >= lastKeptEnd) continue;\n fs.writeSync(rowPatchFd, lastColBuffer, 0, lastColBuffer.length, offset + 23);\n }\n } finally {\n fs.closeSync(rowPatchFd);\n }\n\n const { rowsStart, rowsEnd, autoFilterRanges } = this._findRowsRegion(oldSheet);\n const oldLength = oldSheet.length;\n const newRowsLength = fs.statSync(rowsPath).size;\n const delta = newRowsLength - (rowsEnd - rowsStart);\n const outputFd = fs.openSync(outputPath, 'w');\n try {\n fs.writeSync(outputFd, oldSheet, 0, rowsStart, null);\n const rowsFdRead = fs.openSync(rowsPath, 'r');\n try {\n const chunk = Buffer.alloc(1024 * 1024);\n let position = 0;\n while (position < newRowsLength) {\n const count = fs.readSync(rowsFdRead, chunk, 0, Math.min(chunk.length, newRowsLength - position), position);\n if (count <= 0) throw new Error('XlsbUpdater: failed to read staged rows.');\n fs.writeSync(outputFd, chunk, 0, count);\n position += count;\n }\n } finally {\n fs.closeSync(rowsFdRead);\n }\n fs.writeSync(outputFd, oldSheet, rowsEnd, oldLength - rowsEnd, rowsStart + newRowsLength);\n } finally {\n fs.closeSync(outputFd);\n }\n\n this._patchSheetMetadataFile(\n outputPath,\n oldSheet,\n rowsEnd,\n delta,\n autoFilterRanges,\n Math.max(0, keptDataRows + (headers !== undefined ? 1 : 0) - 1),\n lastCol,\n );\n this._stagePart(sheetPath, outputPath);\n this._commitSharedStrings();\n this._patchPivotCaches(\n sheetName,\n Math.max(0, keptDataRows + (headers !== undefined ? 1 : 0) - 1),\n lastCol,\n );\n this._removeCalcChain();\n\n if (oldStage && oldStage !== outputPath) this._removeTemporaryFile(oldStage);\n createdParts.splice(createdParts.indexOf(outputPath), 1);\n } catch (error) {\n this.sharedStringsValues.length = beforeValuesLength;\n this._appendCount = beforeAppendCount;\n this.sharedStringsTotal = beforeSharedStringsTotal;\n this.sharedStringsUnique = beforeSharedStringsUnique;\n this.sharedStringsEndSst = beforeSharedStringsEndSst;\n this.sharedStringsDirty = beforeSharedStringsDirty;\n this.sharedStringsBuf = beforeSharedStringsBuf;\n this.stringIndexMap.clear();\n for (const [value, index] of beforeStringIndexMap) this.stringIndexMap.set(value, index);\n if (beforeSharedStringsBytes) {\n this.zip.updateFile('xl/sharedStrings.bin', beforeSharedStringsBytes);\n }\n if (oldStage) this.stagedParts.set(sheetPath, oldStage);\n else this.stagedParts.delete(sheetPath);\n throw error;\n } finally {\n if (output && !output.closed) output.destroy();\n for (const temporaryPath of createdParts) this._removeTemporaryFile(temporaryPath);\n }\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n this._materializeStagedParts();\n writeBufferAtomically(this.zip.toBuffer(), target);\n }\n\n /** Save staged streaming replacements without materialising the ZIP. */\n async saveStreaming(outputPath?: string): Promise<void> {\n const target = outputPath ?? this.sourcePath;\n await writeAdmZipStreaming(this.zip, this.stagedParts, target);\n this._materializeStagedParts();\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n this._materializeStagedParts();\n return this.zip.toBuffer();\n }\n\n /**\n * Release the staging directory and any unsaved staged parts.\n * The updater remains usable; a new staging directory is created lazily\n * on the next streaming replacement.\n */\n dispose(): void {\n for (const stagedPath of this.stagedParts.values()) {\n try {\n fs.rmSync(stagedPath, { force: true });\n } catch {\n // Best-effort cleanup.\n }\n }\n this.stagedParts.clear();\n if (this.temporaryDirectory !== null) {\n try {\n fs.rmSync(this.temporaryDirectory, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup.\n }\n this.temporaryDirectory = null;\n }\n }\n\n /** Support `using` declarations for automatic staging cleanup. */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n private _ensureTemporaryDirectory(): string {\n if (this.temporaryDirectory === null) {\n this.temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'spreadsheet-updater-'));\n } else {\n try {\n fs.mkdirSync(this.temporaryDirectory, { recursive: true });\n } catch {\n // Best-effort; file creation will surface persistent failures.\n }\n }\n return this.temporaryDirectory;\n }\n\n private _temporaryPath(suffix: string): string {\n return path.join(this._ensureTemporaryDirectory(), `part-${Date.now()}-${Math.random().toString(16).slice(2)}${suffix}`);\n }\n\n private _removeTemporaryFile(filePath: string): void {\n try {\n fs.rmSync(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n\n private _entryData(name: string): Buffer {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) return fs.readFileSync(stagedPath);\n const entry = this.zip.getEntry(name);\n if (!entry) throw new Error(`XlsbUpdater: ZIP member missing: ${name}`);\n return entry.getData();\n }\n\n private _stagePart(name: string, filePath: string): void {\n this.stagedParts.set(name, filePath);\n }\n\n private _discardStagedPart(name: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (!stagedPath) return;\n this._removeTemporaryFile(stagedPath);\n this.stagedParts.delete(name);\n }\n\n private _materializeStagedParts(): void {\n for (const [name, stagedPath] of this.stagedParts) {\n this.zip.updateFile(name, fs.readFileSync(stagedPath));\n this._removeTemporaryFile(stagedPath);\n }\n this.stagedParts.clear();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.bin.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let tagMatch;\n while ((tagMatch = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(tagMatch[0]);\n const id = attrs['Id'] ?? attrs['id'];\n const target = attrs['Target'] ?? attrs['target'];\n if (id !== undefined && target !== undefined) {\n rIdToTarget[id] = target;\n }\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.bin');\n if (wbEntry) {\n const wbBuf = wbEntry.getData();\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(wbBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id !== 0x009c || rec.len < 8) continue;\n\n // BrtBundleSh: hidden(4) + sheetId(4) + rId(string) + name(string)\n let o = rec.dataStart + 8;\n const rIdLen = wbBuf.readUInt32LE(o);\n o += 4;\n const rId = readUtf16(wbBuf, o, rIdLen);\n o += rIdLen * 2;\n const nameLen = wbBuf.readUInt32LE(o);\n o += 4;\n const name = readUtf16(wbBuf, o, nameLen);\n\n let target = rIdToTarget[rId] ?? '';\n target = resolveRelTarget(target);\n if (target) {\n this.sheetNameToPath.set(name, target);\n }\n }\n // 1904 date system: BrtWbProp (0x99) bit0 f1904.\n try {\n const rec1904: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let p1904 = 0;\n while (readRecord(wbBuf, p1904, rec1904)) {\n if (rec1904.id === 0x99 && rec1904.len >= 4) {\n const is1904 = (wbBuf[rec1904.dataStart] & 0x01) !== 0;\n this._oaEpoch =\n is1904 ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, 30);\n break;\n }\n p1904 = rec1904.dataEnd;\n }\n } catch {\n // Keep default epoch.\n }\n }\n\n for (const e of this.zip.getEntries()) {\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.bin$/.test(e.entryName)) {\n this.pivotCacheDefPaths.push(e.entryName);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _appendCount: number = 0;\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsBuf !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.bin');\n if (!entry && !this.stagedParts.has('xl/sharedStrings.bin')) {\n this.sharedStringsBuf = null;\n return;\n }\n this.sharedStringsBuf = this._entryData('xl/sharedStrings.bin');\n const parsed = parseSharedStringsBin(this.sharedStringsBuf);\n this.sharedStringsValues = parsed.values;\n this.sharedStringsTotal = parsed.total;\n this.sharedStringsUnique = parsed.unique;\n this.sharedStringsEndSst = parsed.endSstOffset;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this._appendCount = 0;\n this.sharedStringsDirty = false;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsBuf === null || !this.sharedStringsDirty) return;\n\n const originalValuesLength = this.sharedStringsValues.length - this._appendCount;\n\n let newItems = Buffer.alloc(0);\n for (let i = originalValuesLength; i < this.sharedStringsValues.length; i++) {\n const text = this.sharedStringsValues[i];\n const payload = Buffer.alloc(1 + 4 + text.length * 2);\n payload[0] = 0x00;\n payload.writeUInt32LE(text.length, 1);\n payload.write(text, 5, text.length * 2, 'utf16le');\n newItems = Buffer.concat([newItems, buildRecord(0x0013, payload)]);\n }\n\n const out = Buffer.alloc(this.sharedStringsBuf.length + newItems.length);\n this.sharedStringsBuf.copy(out, 0, 0, this.sharedStringsEndSst);\n newItems.copy(out, this.sharedStringsEndSst);\n this.sharedStringsBuf.copy(out, this.sharedStringsEndSst + newItems.length, this.sharedStringsEndSst);\n\n // Patch cstTotal / cstUnique inside BrtBeginSst.\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(out, pos, rec)) {\n if (rec.id === 0x009f) {\n out.writeUInt32LE(this.sharedStringsTotal, rec.dataStart);\n out.writeUInt32LE(this.sharedStringsUnique, rec.dataStart + 4);\n break;\n }\n pos = rec.dataEnd;\n }\n\n this.zip.updateFile('xl/sharedStrings.bin', out);\n this.sharedStringsBuf = out;\n this._appendCount = 0;\n this.sharedStringsDirty = false;\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectStyles(sheetBuf: Buffer): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let row = -1;\n while (readRecord(sheetBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x00) {\n row = sheetBuf.readInt32LE(rec.dataStart);\n continue;\n }\n if (!CELL_RECORDS.has(rec.id) || rec.len < 8) continue;\n const col = sheetBuf.readUInt32LE(rec.dataStart);\n const xf = sheetBuf.readUInt32LE(rec.dataStart + 4) & 0xffffff;\n if (xf <= 0) continue;\n\n if (row === 0) {\n if (!headerStyles.has(col)) headerStyles.set(col, xf);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(xf, (colCounts.get(xf) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [xf, count] of colCounts) {\n if (count > bestCount) {\n best = xf;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateXf(): number | null {\n const entry = this.zip.getEntry('xl/styles.bin');\n if (!entry) return null;\n // Reuse the styles parser (handles custom BrtFmt date formats, e.g.\n // xlspy's yyyy-mm-dd), instead of only built-in numFmt ranges.\n const reader = new BiffReaderWriter(entry.getData());\n while (reader.readStyles()) {\n // Consume; results accumulate on the reader.\n }\n const numFmtIds = reader._xfIndexToNumFmtId;\n const customDates = reader._customNumFmts;\n for (let i = 0; i < numFmtIds.length; i++) {\n const numFmtId = numFmtIds[i];\n if (\n (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n customDates.has(numFmtId)\n ) {\n return i;\n }\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Row / cell serialization\n // ------------------------------------------------------------------\n\n private _buildRows(\n rows: CellValue[][],\n headers: string[] | undefined,\n dataStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const chunks: Buffer[] = [];\n const maxCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0, 0);\n const colLast = Math.max(0, maxCol - 1);\n\n const pushRow = (rowNum: number, cellBytes: Buffer[]): void => {\n // BrtRowHeader (0x00, len 25): rw(4) + zero(4) + flags(9) + colFirst(4) + colLast(4)\n const header = Buffer.alloc(27);\n header[0] = 0x00;\n header[1] = 25;\n header.writeInt32LE(rowNum, 2);\n header[10] = 0x2c;\n header[11] = 0x01;\n header[15] = 0x01;\n header.writeInt32LE(0, 19);\n header.writeInt32LE(colLast, 23);\n chunks.push(header);\n\n for (const cell of cellBytes) {\n chunks.push(cell);\n }\n };\n\n if (headers) {\n const cells: Buffer[] = [];\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n cells.push(this._stringCellBytes(c, style, headers[c]));\n }\n pushRow(0, cells);\n }\n\n let rowNum = headers ? 1 : 0;\n for (const row of rows) {\n const cells: Buffer[] = [];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n cells.push(this._valueCellBytes(raw, c, dataStyles, dateXf));\n }\n pushRow(rowNum, cells);\n rowNum++;\n }\n\n return Buffer.concat(chunks);\n }\n\n private _valueCellBytes(\n raw: CellValue,\n col: number,\n dataStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = dataStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val) && Number.isInteger(val) && val >= RK_INT_LOWER && val <= RK_INT_UPPER) {\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeInt32LE((val << 2) | 2, 8);\n return buildRecord(0x0002, payload);\n }\n if (Number.isFinite(val)) {\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeDoubleLE(val, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'bigint') {\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'boolean') {\n const payload = Buffer.alloc(9);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload[8] = val ? 1 : 0;\n return buildRecord(0x0004, payload);\n }\n if (val instanceof Date) {\n const oaDate = timeToOaDate(val.getTime(), this._oaEpoch);\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateXf !== null ? dateXf : 0);\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeDoubleLE(oaDate, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (val !== null && val !== undefined) {\n return this._stringCellBytes(col, colStyle, String(val));\n }\n return this._stringCellBytes(col, colStyle, '');\n }\n\n private _stringCellBytes(col: number, style: number, text: string): Buffer {\n if (this.sharedStringsBuf === null) {\n // Inline string (BrtCellSt): col(4) + xf(4) + cch(4) + utf16.\n const payload = Buffer.alloc(12 + text.length * 2);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(text.length, 8);\n payload.write(text, 12, text.length * 2, 'utf16le');\n return buildRecord(0x0006, payload);\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n this.sharedStringsUnique++;\n this._appendCount++;\n }\n this.sharedStringsTotal++;\n this.sharedStringsDirty = true;\n\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(index, 8);\n return buildRecord(0x0007, payload);\n }\n\n private _sharedStringRefCount(sheetBuf: Buffer): number {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let count = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x0007) count++;\n pos = rec.dataEnd;\n }\n return count;\n }\n\n private _patchSheetMetadataFile(\n filePath: string,\n originalSheet: Buffer,\n rowsEnd: number,\n delta: number,\n autoFilterRanges: number[],\n lastRowIdx: number,\n lastCol: number,\n ): void {\n const fd = fs.openSync(filePath, 'r+');\n try {\n const patchInt32 = (offset: number, value: number): void => {\n const bytes = Buffer.alloc(4);\n bytes.writeInt32LE(value, 0);\n fs.writeSync(fd, bytes, 0, bytes.length, offset);\n };\n\n for (const filterOffset of autoFilterRanges) {\n const newOffset = filterOffset >= rowsEnd ? filterOffset + delta : filterOffset;\n patchInt32(newOffset + 4, lastRowIdx);\n patchInt32(newOffset + 12, lastCol);\n }\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(originalSheet, pos, rec)) {\n // BrtWsDim (0x94), not BrtSel (0x98): 16-byte payload\n // [rwFirst(4), rwLast(4), colFirst(4), colLast(4)].\n if (rec.id === 0x0094 && rec.len >= 16) {\n const shift = rec.dataStart >= rowsEnd ? delta : 0;\n patchInt32(rec.dataStart + shift + 4, lastRowIdx);\n patchInt32(rec.dataStart + shift + 12, lastCol);\n break;\n }\n pos = rec.dataEnd;\n }\n } finally {\n fs.closeSync(fd);\n }\n }\n\n // ------------------------------------------------------------------\n // Rows region detection\n // ------------------------------------------------------------------\n\n private _findRowsRegion(\n sheetBuf: Buffer\n ): { rowsStart: number; rowsEnd: number; autoFilterRanges: number[] } {\n const autoFilterRanges: number[] = [];\n let rowsStart = -1;\n let lastCellEnd = -1;\n let lastW25 = -1;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x00) {\n if (rowsStart === -1) rowsStart = rec.headerStart;\n } else if (rec.id >= 0x01 && rec.id <= 0x0b) {\n lastCellEnd = rec.dataEnd;\n } else if (rec.id === 0x25 && rec.len === 6) {\n lastW25 = rec.headerStart;\n } else if (rec.id === 0x00a1 && rec.len >= 16) {\n autoFilterRanges.push(rec.dataStart);\n }\n pos = rec.dataEnd;\n }\n\n if (rowsStart === -1) {\n // Empty sheet: insert before the trailing wrapper (last 0x25) or at the end.\n const insertAt = lastW25 >= 0 ? lastW25 : sheetBuf.length;\n return { rowsStart: insertAt, rowsEnd: insertAt, autoFilterRanges };\n }\n\n // Replace only the row records. The row-block terminator records that Excel\n // writes after the last row (0x92/0x217/0x1dd/0x1dc) must be preserved,\n // otherwise Excel drops the last written row.\n const rowsEnd = lastCellEnd >= 0 ? lastCellEnd : (lastW25 >= 0 ? lastW25 : sheetBuf.length);\n\n return { rowsStart, rowsEnd, autoFilterRanges };\n }\n\n /**\n * Keep the sheet dimension record (0x94) in sync with the new data.\n * Excel uses its rwLast (payload offset 4) and colLast (payload offset 12)\n * fields to read the full row range; stale values make the last written row\n * invisible to Excel (and drop it from pivot refreshes).\n */\n private _patchDimension(sheetBuf: Buffer, lastRowIdx: number, lastCol: number): void {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x0094 && rec.len >= 16) {\n sheetBuf.writeInt32LE(lastRowIdx, rec.dataStart + 4);\n sheetBuf.writeInt32LE(lastCol, rec.dataStart + 12);\n return;\n }\n pos = rec.dataEnd;\n }\n }\n\n // ------------------------------------------------------------------\n // Pivot cache integration\n // ------------------------------------------------------------------\n\n private _patchPivotCaches(sheetName: string, rwLast: number, colLast: number): void {\n for (const path of this.pivotCacheDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n const buf = Buffer.from(entry.getData());\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let patched = false;\n let refreshXfPatched = false;\n\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n\n if (rec.id === 0x00b3 && rec.len >= 4 && !refreshXfPatched) {\n // BrtBeginPivotCacheDefinition flags: bit 0x04 of payload offset 3 = refreshOnLoad.\n if (rec.dataStart + 4 <= buf.length) {\n const v = buf[rec.dataStart + 3];\n if ((v & 0x04) === 0) {\n buf[rec.dataStart + 3] = v | 0x04;\n patched = true;\n }\n }\n refreshXfPatched = true;\n }\n\n if (rec.id === 0x00bb && rec.len >= 23) {\n // BrtPivotCacheSource: [3] + cch(4) + name(utf16) + rwFirst(4) rwLast(4) colFirst(4) colLast(4)\n const cch = buf.readUInt32LE(rec.dataStart + 3);\n const nameStart = rec.dataStart + 7;\n const refStart = nameStart + cch * 2;\n const name = readUtf16(buf, nameStart, cch);\n if (name === sheetName && refStart + 16 <= buf.length) {\n buf.writeInt32LE(rwLast, refStart + 4);\n buf.writeInt32LE(colLast, refStart + 12);\n patched = true;\n }\n }\n }\n\n if (patched) {\n this.zip.updateFile(path, buf);\n }\n }\n }\n\n /**\n * Remove the stale calculation chain (xl/calcChain.bin). Excel rebuilds it\n * on open. Removes the part, its Content_Types override and its workbook\n * rels entry. XLSB tables are not patched (documented limitation).\n */\n private _removeCalcChain(): void {\n const calcPath = 'xl/calcChain.bin';\n if (!this.zip.getEntry(calcPath) && !this.stagedParts.has(calcPath)) return;\n try {\n this.zip.deleteFile(calcPath);\n } catch {\n // Best-effort.\n }\n const stagedCalc = this.stagedParts.get(calcPath);\n if (stagedCalc) {\n this.stagedParts.delete(calcPath);\n try {\n fs.rmSync(stagedCalc, { force: true });\n } catch {\n // Best-effort.\n }\n }\n\n // XLSB declares non-workbook .bin parts with an Override (the Default\n // \"bin\" content type is the workbook itself), so remove that too.\n const ctPath = '[Content_Types].xml';\n if (this.zip.getEntry(ctPath) || this.stagedParts.has(ctPath)) {\n try {\n const ct = this._entryData(ctPath).toString('utf8');\n const updated = ct.replace(\n /<Override\\b[^>]*PartName=\"\\/xl\\/calcChain\\.bin\"[^>]*\\/?>/gi,\n '',\n );\n if (updated !== ct) this._writePartText(ctPath, updated);\n } catch {\n // Best-effort.\n }\n }\n\n const relsPath = 'xl/_rels/workbook.bin.rels';\n if (this.zip.getEntry(relsPath) || this.stagedParts.has(relsPath)) {\n try {\n const rels = this._entryData(relsPath).toString('utf8');\n const relTagRe = /<Relationship\\b[^>]*>/g;\n let m: RegExpExecArray | null;\n let out = '';\n let last = 0;\n let changed = false;\n while ((m = relTagRe.exec(rels)) !== null) {\n const attrs = parseTagAttributes(m[0]);\n const type = attrs['Type'] ?? attrs['type'] ?? '';\n const target = attrs['Target'] ?? attrs['target'] ?? '';\n if (type.endsWith('/calcChain') && resolveRelTarget(target) === 'xl/calcChain.bin') {\n out += rels.substring(last, m.index);\n last = m.index + m[0].length;\n changed = true;\n }\n }\n if (changed) {\n out += rels.substring(last);\n this._writePartText(relsPath, out);\n }\n } catch {\n // Best-effort.\n }\n }\n }\n\n /** Write an XML/text part to its staged file when present, else into the ZIP. */\n private _writePartText(name: string, text: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) {\n fs.writeFileSync(stagedPath, text, 'utf8');\n } else {\n this.zip.updateFile(name, Buffer.from(text, 'utf8'));\n }\n }\n}\n\nexport default XlsbUpdater;\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport { spawn } from 'child_process';\nimport { installTemporaryOutput } from './atomicFile';\n\n/** Options for an Excel format conversion. */\nexport interface ExcelConversionOptions {\n /** Allow replacing an existing destination file. Defaults to false. */\n overwrite?: boolean;\n}\n\nconst POWERSHELL_CONVERSION_SCRIPT = `\n$ErrorActionPreference = 'Stop'\n$inputPath = [Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_INPUT')\n$outputPath = [Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_OUTPUT')\n$fileFormat = [int][Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_FORMAT')\n$excel = $null\n$workbook = $null\n$exitCode = 0\n\ntry {\n $excel = New-Object -ComObject Excel.Application\n $excel.Visible = $false\n $excel.DisplayAlerts = $false\n $excel.ScreenUpdating = $false\n\n # Open read-only so the source workbook is never changed by the conversion.\n $workbook = $excel.Workbooks.Open($inputPath, 0, $true)\n if ($null -eq $workbook) {\n throw 'Excel did not return a workbook when opening the source file.'\n }\n\n $workbook.SaveAs($outputPath, $fileFormat)\n} catch {\n $exitCode = 1\n [Console]::Error.WriteLine($_.Exception.ToString())\n} finally {\n if ($null -ne $workbook) {\n try { $workbook.Close($false) } catch { }\n try { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook) | Out-Null } catch { }\n }\n if ($null -ne $excel) {\n try { $excel.Quit() } catch { }\n try { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null } catch { }\n }\n [GC]::Collect()\n [GC]::WaitForPendingFinalizers()\n}\n\nexit $exitCode\n`;\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction validateConversionPaths(\n inputPath: string,\n outputPath: string,\n inputExtension: string,\n outputExtension: string,\n overwrite: boolean\n): { input: string; output: string } {\n const input = path.resolve(inputPath);\n const output = path.resolve(outputPath);\n\n if (path.extname(input).toLowerCase() !== inputExtension) {\n throw new Error(\n `Excel conversion: source must have the ${inputExtension} extension: ${inputPath}`\n );\n }\n if (path.extname(output).toLowerCase() !== outputExtension) {\n throw new Error(\n `Excel conversion: destination must have the ${outputExtension} extension: ${outputPath}`\n );\n }\n if (!fs.existsSync(input)) {\n throw new Error(`Excel conversion: source file not found: ${inputPath}`);\n }\n if (!fs.statSync(input).isFile()) {\n throw new Error(`Excel conversion: source path is not a file: ${inputPath}`);\n }\n if (!fs.existsSync(path.dirname(output))) {\n throw new Error(`Excel conversion: destination directory not found: ${path.dirname(output)}`);\n }\n if (fs.existsSync(output)) {\n if (fs.statSync(output).isDirectory()) {\n throw new Error(`Excel conversion: destination path is a directory: ${outputPath}`);\n }\n if (!overwrite) {\n throw new Error(\n `Excel conversion: destination already exists (pass { overwrite: true } to replace it): ${outputPath}`\n );\n }\n }\n\n if (process.platform === 'win32' && input.toLowerCase() === output.toLowerCase()) {\n throw new Error('Excel conversion: source and destination must be different files.');\n }\n\n return { input, output };\n}\n\nfunction runPowerShellConversion(inputPath: string, outputPath: string, fileFormat: 50 | 51): Promise<void> {\n const encodedCommand = Buffer.from(POWERSHELL_CONVERSION_SCRIPT, 'utf16le').toString('base64');\n const environment: NodeJS.ProcessEnv = {\n ...process.env,\n JUSTYBASE_EXCEL_INPUT: inputPath,\n JUSTYBASE_EXCEL_OUTPUT: outputPath,\n JUSTYBASE_EXCEL_FORMAT: String(fileFormat),\n };\n\n return new Promise((resolve, reject) => {\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const child = spawn(\n 'powershell.exe',\n [\n '-NoLogo',\n '-NoProfile',\n '-NonInteractive',\n '-ExecutionPolicy',\n 'Bypass',\n '-EncodedCommand',\n encodedCommand,\n ],\n { env: environment, windowsHide: true }\n );\n\n child.stdout?.setEncoding('utf8');\n child.stderr?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => { stdout += chunk; });\n child.stderr?.on('data', (chunk: string) => { stderr += chunk; });\n\n child.once('error', (error) => {\n if (settled) return;\n settled = true;\n reject(new Error(`Excel conversion: unable to start PowerShell/COM: ${error.message}`));\n });\n\n child.once('close', (code) => {\n if (settled) return;\n settled = true;\n if (code === 0) {\n resolve();\n return;\n }\n\n const details = (stderr || stdout).replace(/\\s+/g, ' ').trim();\n reject(new Error(\n `Excel conversion failed (PowerShell exit code ${code ?? 'unknown'})${details ? `: ${details}` : '.'}`\n ));\n });\n });\n}\n\nasync function convertExcelFile(\n inputPath: string,\n outputPath: string,\n inputExtension: string,\n outputExtension: string,\n fileFormat: 50 | 51,\n options: ExcelConversionOptions = {}\n): Promise<void> {\n const { input, output } = validateConversionPaths(\n inputPath,\n outputPath,\n inputExtension,\n outputExtension,\n options.overwrite === true\n );\n\n if (process.platform !== 'win32') {\n throw new Error('Excel conversion requires Windows with desktop Microsoft Excel and COM automation.');\n }\n\n const temporaryOutput = path.join(\n path.dirname(output),\n `.${path.basename(output, outputExtension)}.${randomUUID()}.conversion${outputExtension}`\n );\n\n try {\n await runPowerShellConversion(input, temporaryOutput, fileFormat);\n if (!fs.existsSync(temporaryOutput)) {\n throw new Error('Excel conversion completed without creating the destination file.');\n }\n\n installTemporaryOutput(temporaryOutput, output, options.overwrite === true);\n } catch (error) {\n throw new Error(`Excel conversion ${inputExtension} -> ${outputExtension}: ${errorMessage(error)}`);\n } finally {\n if (fs.existsSync(temporaryOutput)) {\n try {\n fs.rmSync(temporaryOutput);\n } catch {\n // Preserve the original conversion error if cleanup also fails.\n }\n }\n }\n}\n\n/** Convert an Excel Binary Workbook (.xlsb) to an Open XML Workbook (.xlsx). */\nexport function convertXlsbToXlsx(\n inputPath: string,\n outputPath: string,\n options?: ExcelConversionOptions\n): Promise<void> {\n return convertExcelFile(inputPath, outputPath, '.xlsb', '.xlsx', 51, options);\n}\n\n/** Convert an Open XML Workbook (.xlsx) to an Excel Binary Workbook (.xlsb). */\nexport function convertXlsxToXlsb(\n inputPath: string,\n outputPath: string,\n options?: ExcelConversionOptions\n): Promise<void> {\n return convertExcelFile(inputPath, outputPath, '.xlsx', '.xlsb', 50, options);\n}\n"],"mappings":"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AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAClB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAClB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MACN;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAC9C,CAAC;AAED,SAAK,oBAAoB,OAAO,KAAK;AAAA,MACjC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAA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","names":["Buffer","tagEnd","path","BUILTIN_NUMFMTS","path","resolve","rowEnd","val","path","BRT_FMLA_STRING","BRT_FMLA_NUM","BRT_FMLA_BOOL","BRT_FMLA_ERROR","match","u32","u16","DV_TYPES","DV_OPERATORS","u16","u32","wideString","columnIndex","sheet","resolve","fs","path","randomUUID","archiver","Readable","randomUUID","archiver","Readable","resolve","fs","path","AdmZip","fs","path","randomUUID","fs","path","randomUUID","Readable","archiver","readDestinationMode","resolve","maybeEmitter","randomUUID","archiver","Readable","AdmZip","resolve","attribute","path","fs","os","path","AdmZip","AdmZip","resolve","rowNum","payload","path","fs","path","randomUUID","errorMessage","resolve","randomUUID"]}
|