@ex-grid/data-xlsx 0.0.0-stage → 0.2.0-beta.3

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/text-casing.ts", "../src/invariant.ts", "../src/cell-reference.ts", "../src/names.ts", "../src/xlsx-error.ts", "../src/must.ts", "../src/xml-reader.ts", "../src/zip-read.ts", "../src/package.ts", "../src/pacer.ts", "../src/shared-strings.ts", "../src/model.ts", "../src/x-string.ts", "../src/string-item.ts", "../src/steps.ts", "../src/values.ts", "../src/sheet-reader.ts", "../src/styles.ts", "../src/styles-reader.ts", "../src/theme.ts", "../src/reader.ts", "../src/styles-writer.ts", "../src/xml-writer.ts", "../src/crc32.ts", "../src/zip-write.ts", "../src/writer.ts"],
4
+ "sourcesContent": ["// Text compares as .NET's OrdinalIgnoreCase does (ADR-0023), as the Script Core's query/text-casing.ts says it;\n// the packages share no code, so each carries its own: character by character, each upper-cased by\n// the invariant simple mapping, never by the reader's culture, so the machine a Consumer runs on cannot\n// reorder a result. JavaScript's toUpperCase applies the full mapping instead, and .NET keeps two rules it\n// does not: a character whose full upper case is several characters takes its simple mapping, which is\n// itself (\u00DF, \u0149) except for the Greek letters with ypogegrammeni (\u1FB3 is \u1FBC), and a character outside ASCII\n// never folds into ASCII (the dotless \u0131 is not I, the long \u017F is not S), so ASCII text compares as ASCII\n// always has. Every code point was compared against .NET 10 when this was written.\n\n/** `text` upper-cased as OrdinalIgnoreCase compares it. */\nexport function foldCase(text: string): string {\n let folded = '';\n let changed = false;\n for (const character of text) {\n const upper = upperOf(character);\n if (upper !== character) changed = true;\n folded += upper;\n }\n return changed ? folded : text;\n}\n\nfunction upperOf(character: string): string {\n const code = character.charCodeAt(0);\n if (code < 0x80) return code >= 0x61 && code <= 0x7a ? String.fromCharCode(code - 0x20) : character;\n const upper = character.toUpperCase();\n // One code point to one code point, and never from outside ASCII into it.\n const point = upper.codePointAt(0);\n const single = point !== undefined && upper.length === (point > 0xffff ? 2 : 1);\n if (!single) return simpleUpperOf(code, character);\n if (upper === character || point < 0x80) return character;\n return upper;\n}\n\n/** The simple upper case of a character whose full upper case is several characters. Only the Greek\n * letters with ypogegrammeni have one that is not themselves: each takes the prosgegrammeni form. */\nfunction simpleUpperOf(code: number, character: string): string {\n const pairs = (code >= 0x1f80 && code <= 0x1f87) || (code >= 0x1f90 && code <= 0x1f97) || (code >= 0x1fa0 && code <= 0x1fa7);\n if (pairs) return String.fromCharCode(code + 8);\n if (code === 0x1fb3 || code === 0x1fc3 || code === 0x1ff3) return String.fromCharCode(code + 9);\n return character;\n}\n", "import { foldCase } from './text-casing';\n\n// Numbers read and written as ExGrid.Data.Xlsx reads and writes them with the invariant culture, so a file,\n// a refusal and a written part read alike in both packages (ADR-0370, section 2). Each function names the\n// .NET parse or format it stands for: JavaScript's own `Number()` and `String(n)` take other text and\n// write other text.\n\n/** C#'s `int.TryParse(text, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture)`: ASCII digits after an\n * optional sign, no space, within a 32-bit integer; `undefined` otherwise. */\nexport function parseInt32(text: string): number | undefined {\n if (!/^[+-]?[0-9]+$/.test(text)) return undefined;\n const value = Number(text);\n return value >= -2147483648 && value <= 2147483647 ? value : undefined;\n}\n\n/** C#'s `int.TryParse(text, NumberStyles.None, CultureInfo.InvariantCulture)`: ASCII digits alone, within a 32-bit\n * integer; `undefined` otherwise. */\nexport function parseDigits(text: string): number | undefined {\n if (!/^[0-9]+$/.test(text)) return undefined;\n const value = Number(text);\n return value <= 2147483647 ? value : undefined;\n}\n\n/** C#'s `uint.TryParse(text, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture)`: hexadecimal digits\n * alone, no `0x` and no space, within 32 bits; `undefined` otherwise. */\nexport function parseHex32(text: string): number | undefined {\n if (!/^[0-9A-Fa-f]+$/.test(text)) return undefined;\n const value = Number.parseInt(text, 16);\n return value <= 0xFFFFFFFF ? value : undefined;\n}\n\n/**\n * C#'s `double.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture)`: an optional sign, digits with\n * an optional point, an optional exponent, and white space (U+0009 to U+000D and U+0020) on either side; or the\n * invariant culture's `Infinity` and `NaN`, in any case, with a sign. A number past the doubles' range is\n * infinite, as .NET reads it. `undefined` for anything else.\n */\nexport function parseDouble(text: string): number | undefined {\n const trimmed = text.replace(/^[\\t\\n\\v\\f\\r ]+|[\\t\\n\\v\\f\\r ]+$/g, '');\n if (/^[+-]?(?:[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/.test(trimmed)) return Number(trimmed);\n const lower = trimmed.toLowerCase();\n if (lower === 'infinity' || lower === '+infinity') return Number.POSITIVE_INFINITY;\n if (lower === '-infinity') return Number.NEGATIVE_INFINITY;\n if (lower === 'nan' || lower === '+nan' || lower === '-nan') return Number.NaN;\n return undefined;\n}\n\n/** C#'s `ToString(\"N0\", CultureInfo.InvariantCulture)` of a whole number: its digits grouped by threes with commas. */\nexport function grouped(value: number): string {\n const digits = String(Math.abs(Math.trunc(value)));\n const groups: string[] = [];\n for (let end = digits.length; end > 0; end -= 3) groups.unshift(digits.slice(Math.max(0, end - 3), end));\n return (value < 0 ? '-' : '') + groups.join(',');\n}\n\n/** C#'s `ToString(\"X8\")` of a 32-bit value: eight upper-case hexadecimal digits. */\nexport function hex8(value: number): string {\n return (value >>> 0).toString(16).toUpperCase().padStart(8, '0');\n}\n\n/**\n * C#'s `ToString(\"R\", CultureInfo.InvariantCulture)` of a double: the shortest digits that read back as the same\n * number, in exponent form (`1E-05`, `1.2345678901234568E+17`) where the point stands more than seventeen places\n * right of the first digit or more than three places left of it; `NaN`, `Infinity` and `-Infinity` by the\n * invariant culture's names.\n */\nexport function roundTrip(value: number): string {\n if (Number.isNaN(value)) return 'NaN';\n if (!Number.isFinite(value)) return value > 0 ? 'Infinity' : '-Infinity';\n if (value === 0) return Object.is(value, -0) ? '-0' : '0';\n const match = /^(\\d)(?:\\.(\\d+))?e([+-]\\d+)$/.exec(Math.abs(value).toExponential());\n if (match === null) throw new Error(`Internal: ${String(value)} is not written in exponent form.`);\n const [, first = '', rest = '', exponent = ''] = match;\n const digits = first + rest;\n const point = Number(exponent) + 1;\n const sign = value < 0 ? '-' : '';\n if (point > 17 || point < -3) {\n const e = point - 1;\n const mantissa = digits.length > 1 ? `${digits.slice(0, 1)}.${digits.slice(1)}` : digits;\n return `${sign}${mantissa}E${e < 0 ? '-' : '+'}${String(Math.abs(e)).padStart(2, '0')}`;\n }\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/** C#'s `string.Equals(a, b, StringComparison.OrdinalIgnoreCase)`. */\nexport function equalsIgnoreCase(a: string, b: string): boolean {\n return a.length === b.length && foldCase(a) === foldCase(b);\n}\n", "// A cell's place written as `B7`, and read from it, within Excel's grid of 1,048,576 rows and 16,384 columns, as\n// ExGrid.Data.Xlsx's XlsxCellReference writes and reads it.\n\n/** The rows a worksheet has: 1,048,576. */\nexport const maxRows = 1_048_576;\n\n/** The columns a worksheet has: 16,384 (A to XFD). */\nexport const maxColumns = 16_384;\n\n/** The name of the column `column`, from zero: 0 is `A`, 26 is `AA`. */\nexport function columnName(column: number): string {\n if (!Number.isInteger(column) || column < 0) throw new RangeError(`The column ${String(column)} is not a column from zero.`);\n let letters = '';\n let n = column + 1;\n while (n > 0) {\n const rem = (n - 1) % 26;\n letters = String.fromCharCode(0x41 + rem) + letters;\n n = Math.floor((n - 1) / 26);\n }\n return letters;\n}\n\n/** The cell at `row` and `column`, both from zero, as `B7`. */\nexport function formatCell(row: number, column: number): string {\n if (!Number.isInteger(row) || row < 0) throw new RangeError(`The row ${String(row)} is not a row from zero.`);\n return columnName(column) + String(row + 1);\n}\n\n/** A cell's place, both from zero. */\nexport interface XlsxPlaceOfCell {\n /** The row, from zero (row 1 is 0). */\n readonly row: number;\n /** The column, from zero (column A is 0). */\n readonly column: number;\n}\n\n/** Reads `B7` into its row and column, from zero; `undefined` for text that is not a cell inside the grid. `$` marks are\n * allowed. */\nexport function parseCell(text: string): XlsxPlaceOfCell | undefined {\n let i = 0;\n if (text.charAt(i) === '$') i++;\n let col = 0;\n let letters = 0;\n for (; i < text.length; i++) {\n const c = text.charCodeAt(i);\n const upper = c >= 0x61 && c <= 0x7a ? c - 0x20 : c;\n if (upper < 0x41 || upper > 0x5a) break;\n col = col * 26 + (upper - 0x41 + 1);\n if (++letters > 3) return undefined;\n }\n if (letters === 0 || col > maxColumns) return undefined;\n if (text.charAt(i) === '$') i++;\n let r = 0;\n let digits = 0;\n for (; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (c < 0x30 || c > 0x39) break;\n r = r * 10 + (c - 0x30);\n if (++digits > 7) return undefined;\n }\n if (digits === 0 || i !== text.length || r < 1 || r > maxRows) return undefined;\n return { row: r - 1, column: col - 1 };\n}\n", "// The names the package and its parts are read and written by (ECMA-376 Part 1 and Part 2, transitional), as\n// ExGrid.Data.Xlsx's Names holds them.\n\nexport const mainNamespace = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main';\nexport const relationshipsNamespace = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\nexport const packageRelationshipsNamespace = 'http://schemas.openxmlformats.org/package/2006/relationships';\nexport const contentTypesNamespace = 'http://schemas.openxmlformats.org/package/2006/content-types';\nexport const drawingNamespace = 'http://schemas.openxmlformats.org/drawingml/2006/main';\nexport const strictPrefix = 'http://purl.oclc.org/ooxml/';\n\nexport const officeDocumentType = `${relationshipsNamespace}/officeDocument`;\nexport const worksheetType = `${relationshipsNamespace}/worksheet`;\nexport const sharedStringsType = `${relationshipsNamespace}/sharedStrings`;\nexport const stylesType = `${relationshipsNamespace}/styles`;\nexport const themeType = `${relationshipsNamespace}/theme`;\nexport const sheetMetadataType = `${relationshipsNamespace}/sheetMetadata`;\nexport const tableType = `${relationshipsNamespace}/table`;\n\nexport const workbookContent = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml';\nexport const templateContent = 'application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml';\nexport const binaryContent = 'application/vnd.ms-excel.sheet.binary.macroEnabled.main';\nexport const worksheetContent = 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml';\nexport const sharedStringsContent = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml';\nexport const stylesContent = 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml';\nexport const sheetMetadataContent = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml';\nexport const tableContent = 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml';\nexport const relationshipsContent = 'application/vnd.openxmlformats-package.relationships+xml';\nexport const vbaProjectContent = 'application/vnd.ms-office.vbaProject';\n\n/** The future-metadata extension that marks a dynamic array (Excel 365). */\nexport const dynamicArrayExtension = '{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}';\n", "// A file refused by name (ADR-0330 \u00A74, \u00A79), as ExGrid.Data.Xlsx's XlsxException refuses it: the reason, and the\n// part, the Sheet and the cell it met, worded as that package words it, so a refusal reads alike in both.\n\n/** Why a file was refused (ADR-0330 \u00A74, \u00A79). A refused file is never read in part. */\nexport type XlsxRefusal =\n /** The bytes are not a zip package, or the zip is damaged. */\n | 'notAZip'\n /** A zip package, but not a spreadsheet: it has no workbook part (a `.docx`, a `.pptx`, any other zip). */\n | 'notAWorkbook'\n /** A workbook with macros (`.xlsm`, `.xltm`, `.xlam`): its content types name a macro-enabled workbook or a VBA project. */\n | 'macroEnabled'\n /** A binary workbook (`.xlsb`). */\n | 'binary'\n /** A legacy Excel 97\u20132003 workbook (`.xls`): an OLE compound file that holds no encrypted package. */\n | 'legacy'\n /** An encrypted (password-protected) workbook: an OLE compound file holding an `EncryptedPackage`. */\n | 'encrypted'\n /** A workbook written as Strict Open XML, whose parts use other namespaces than the transitional ones Excel saves by default. */\n | 'strictOpenXml'\n /** A part declares a document type (`<!DOCTYPE`), which a workbook never needs and an attack uses. */\n | 'dtd'\n /** A part is not well-formed XML, or does not hold what its place in the package says it does. */\n | 'malformed'\n /** The file holds more uncompressed bytes than a read allows; or a workbook written would hold more than a write allows. */\n | 'tooLarge'\n /** The workbook holds more cells than a read allows. */\n | 'tooManyCells';\n\n/** Where a refusal met what it refuses: the part, the Sheet and the cell, as far as it is about one. */\nexport interface XlsxPlace {\n /** The package part, as `xl/worksheets/sheet1.xml`. */\n readonly part?: string | undefined;\n /** The Sheet's name. */\n readonly sheet?: string | undefined;\n /** The cell, as `B7`. */\n readonly cell?: string | undefined;\n}\n\n/**\n * A file refused by name (ADR-0330 \u00A74, \u00A79): the reason, and the part, the Sheet and the cell it met, as far as the\n * refusal is about one. Nothing is read from a refused file: `Sheet 'Trades', cell B7: \u2026`.\n */\nexport class XlsxError extends Error {\n /** Why the file was refused. */\n readonly reason: XlsxRefusal;\n /** The package part the refusal met, as `xl/worksheets/sheet1.xml`; `undefined` when it is about the file as a whole. */\n readonly part: string | undefined;\n /** The name of the Sheet the refusal met; `undefined` when it is not about one Sheet. */\n readonly sheet: string | undefined;\n /** The cell the refusal met, as `B7`; `undefined` when it is not about one cell. */\n readonly cell: string | undefined;\n\n /**\n * A refusal naming what it met.\n * @param reason - Why the file is refused.\n * @param message - What was wrong, as a sentence that follows the Sheet and the cell.\n * @param where - The part, the Sheet and the cell it met, as far as it is about one.\n * @param options - What caused it, when it was another error.\n */\n constructor(reason: XlsxRefusal, message: string, where: XlsxPlace = {}, options?: ErrorOptions) {\n super(formatted(where.sheet, where.cell, where.part, message), options);\n this.name = 'XlsxError';\n this.reason = reason;\n this.part = where.part;\n this.sheet = where.sheet;\n this.cell = where.cell;\n }\n}\n\nfunction formatted(sheet: string | undefined, cell: string | undefined, part: string | undefined, message: string): string {\n if (sheet !== undefined) return cell !== undefined ? `Sheet '${sheet}', cell ${cell}: ${message}` : `Sheet '${sheet}': ${message}`;\n if (part !== undefined) return `Part '${part}': ${message}`;\n return message;\n}\n", "// What the package knows is there, as core/src/must.ts says it for the Script Core: a miss is a defect in\n// the package, said by throwing where a `!` would read on with `undefined` (CONVENTIONS.md, \"No quiet\n// fallback\"). The packages share no code, so each carries its own.\n\n/** The element at `index`, which the caller knows is there. A miss throws: it is a defect, never an answer. */\nexport function elementAt<T extends object | string | number | boolean | bigint | null>(list: ArrayLike<T>, index: number): T {\n const value = list[index];\n if (value === undefined) {\n throw new Error(`Internal: index ${String(index)} is outside a list of ${String(list.length)}.`);\n }\n return value;\n}\n\n/** The value, which the caller knows is there. `undefined` throws, naming what was missing. */\nexport function defined<T>(value: T | undefined, what: string): T {\n if (value === undefined) {\n throw new Error(`Internal: ${what} is missing.`);\n }\n return value;\n}\n\n/** The end of a switch that has taken every member of a union; a value from outside it throws here. */\nexport function unreachable(value: never): never {\n throw new Error(`Internal: ${String(value)} is not a value this switch takes.`);\n}\n", "// A pull reader of a part's XML, read as .NET's XmlReader reads it under the settings ExGrid.Data.Xlsx gives it\n// (ADR-0330 \u00A79): DTDs prohibited, comments and processing instructions ignored, whitespace kept, characters\n// checked. It is not a general XML reader: it reads what a well-formed part holds, refuses what is not\n// well-formed, and offers the members the package's readers use, with XmlReader's meaning \u2014 the node's depth,\n// whether an element is empty, an element's text read whole, an element skipped.\n//\n// Text arrives in pieces, as a worksheet inflates. The reader holds what has arrived and has not been read,\n// and asks for more by throwing `NeedMore` when a node runs past it; a caller that reads a worksheet a batch at\n// a time marks where its batch began, gives the reader more and reads the batch again from the mark\n// (`snapshot`, `restore`). A part read whole is given all of its text first, and never asks.\n\nimport { unreachable } from './must';\n\n/** A part that is not well-formed XML: what XmlReader throws an XmlException for. */\nexport class XmlError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'XmlError';\n }\n}\n\n/** The reader ran past the text it holds: give it more and read again from the last mark. Never escapes the package. */\nexport class NeedMore extends Error {\n constructor() {\n super('Internal: the XML reader needs more text than it holds.');\n this.name = 'NeedMore';\n }\n}\n\n/** What the reader is on, as XmlReader's NodeType names it, of the kinds a part's reader meets. */\nexport type XmlNodeType = 'none' | 'element' | 'endElement' | 'text' | 'cdata' | 'whitespace' | 'significantWhitespace';\n\n/** An attribute of the element the reader is on. */\nexport interface XmlAttribute {\n /** Its qualified name, as written: `r:id`. */\n readonly name: string;\n readonly prefix: string;\n readonly localName: string;\n /** Its namespace: none for an attribute written without a prefix; `http://www.w3.org/2000/xmlns/` for a declaration. */\n readonly namespaceUri: string;\n readonly value: string;\n}\n\n/** The text of a part, piece by piece; `undefined` once it has all come. */\nexport type TextSource = () => Promise<string | undefined>;\n\nconst xmlnsNamespace = 'http://www.w3.org/2000/xmlns/';\nconst xmlNamespace = 'http://www.w3.org/XML/1998/namespace';\n\ninterface Frame {\n readonly name: string;\n readonly localName: string;\n readonly prefix: string;\n readonly namespaceUri: string;\n /** The namespaces this element declares, by prefix ('' for the default one); null for none. */\n readonly declared: ReadonlyMap<string, string> | null;\n /** Whether `xml:space=\"preserve\"` is in force inside it. */\n readonly preserve: boolean;\n}\n\n/** Where the reader stands, kept by `snapshot` and put back by `restore`. */\nexport interface XmlMark {\n readonly pos: number;\n readonly state: ReaderState;\n}\n\ninterface ReaderState {\n readonly nodeType: XmlNodeType;\n readonly localName: string;\n readonly prefix: string;\n readonly namespaceUri: string;\n readonly value: string;\n readonly isEmptyElement: boolean;\n readonly depth: number;\n readonly attributes: readonly XmlAttribute[];\n readonly stack: readonly Frame[];\n readonly popOnNext: boolean;\n readonly started: boolean;\n readonly rootSeen: boolean;\n readonly rootClosed: boolean;\n readonly eof: boolean;\n}\n\nconst invalidCharacter = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\uFFFE\\uFFFF]/; // oxlint-disable-line no-control-regex -- XML 1.0 refuses exactly these characters\n// oxlint-disable-next-line no-misleading-character-class -- XML 1.0's NameStartChar ranges, read a UTF-16 unit at a time\nconst nameStart = /[A-Z_a-z:\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\uD800-\\uDBFF]/;\n// oxlint-disable-next-line no-misleading-character-class -- XML 1.0's NameChar ranges, read a UTF-16 unit at a time\nconst nameRest = /^[A-Z_a-z:\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\uD800-\\uDFFF.\\-0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/;\n\n/** A qualified name's prefix and local name. */\nfunction split(qualified: string): readonly [string, string] {\n const colon = qualified.indexOf(':');\n return colon < 0 ? ['', qualified] : [qualified.slice(0, colon), qualified.slice(colon + 1)];\n}\n\nfunction isSpace(c: number): boolean {\n return c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d;\n}\n\n/** XML's line ends made line feeds: `\\r\\n` and a lone `\\r` are each `\\n` (XML 1.0, section 2.11). */\nfunction lineFeeds(text: string): string {\n return text.includes('\\r') ? text.replace(/\\r\\n?/g, '\\n') : text;\n}\n\nfunction checkCharacters(text: string): void {\n const bad = invalidCharacter.exec(text);\n if (bad !== null) {\n const code = bad[0].charCodeAt(0);\n throw new XmlError(`'${bad[0]}', hexadecimal value 0x${code.toString(16).toUpperCase().padStart(2, '0')}, is an invalid character.`);\n }\n}\n\nfunction checkName(name: string): void {\n if (name === '' || !nameStart.test(name.charAt(0)) || !nameRest.test(name.slice(1))) {\n throw new XmlError(`'${name}' is not a name XML allows.`);\n }\n}\n\n/** The text with its character and entity references replaced, as XML 1.0 section 4.6 predefines them. */\nfunction unescape(text: string): string {\n if (!text.includes('&')) return text;\n let out = '';\n let at = 0;\n for (;;) {\n const amp = text.indexOf('&', at);\n if (amp < 0) return out + text.slice(at);\n const semi = text.indexOf(';', amp + 1);\n if (semi < 0) throw new XmlError('An entity reference is not ended by a semicolon.');\n out += text.slice(at, amp);\n const name = text.slice(amp + 1, semi);\n switch (name) {\n case 'lt': out += '<'; break;\n case 'gt': out += '>'; break;\n case 'amp': out += '&'; break;\n case 'quot': out += '\"'; break;\n case 'apos': out += \"'\"; break;\n default: {\n const decimal = /^#([0-9]+)$/.exec(name);\n const hexadecimal = /^#x([0-9a-fA-F]+)$/.exec(name);\n const digits = decimal?.[1] ?? hexadecimal?.[1];\n if (digits === undefined) {\n if (name.startsWith('#')) throw new XmlError(`'&${name};' is not a character reference.`);\n throw new XmlError(`Reference to undeclared entity '${name}'.`);\n }\n const code = Number.parseInt(digits, decimal === null ? 16 : 10);\n const valid = code === 0x9 || code === 0xa || code === 0xd || (code >= 0x20 && code <= 0xd7ff)\n || (code >= 0xe000 && code <= 0xfffd) || (code >= 0x10000 && code <= 0x10ffff);\n if (!valid) throw new XmlError(`The character reference '&${name};' is to a character XML does not allow.`);\n out += String.fromCodePoint(code);\n }\n }\n at = semi + 1;\n }\n}\n\n/** A pull reader of one part's XML, XmlReader's members by its meaning. */\nexport class XmlReader {\n readonly #source: TextSource;\n #text = '';\n #pos = 0;\n #ended = false;\n\n #nodeType: XmlNodeType = 'none';\n #localName = '';\n #prefix = '';\n #namespaceUri = '';\n #value = '';\n #isEmptyElement = false;\n #depth = 0;\n #attributes: readonly XmlAttribute[] = [];\n #stack: Frame[] = [];\n #popOnNext = false;\n #started = false;\n #rootSeen = false;\n #rootClosed = false;\n #eof = false;\n\n constructor(source: TextSource) {\n this.#source = source;\n }\n\n /** A reader of `text`, whole. */\n static of(text: string): XmlReader {\n let given = false;\n return new XmlReader(() => {\n if (given) return Promise.resolve(undefined);\n given = true;\n return Promise.resolve(text);\n });\n }\n\n nodeType(): XmlNodeType { return this.#nodeType; }\n\n localName(): string { return this.#localName; }\n\n prefix(): string { return this.#prefix; }\n\n namespaceUri(): string { return this.#namespaceUri; }\n\n /** The text of a text, CDATA or whitespace node; '' on an element. */\n value(): string { return this.#value; }\n\n isEmptyElement(): boolean { return this.#isEmptyElement; }\n\n /** How deep the node lies: the root element is 0, its children 1, and an element's text one below it. */\n depth(): number { return this.#depth; }\n\n attributes(): readonly XmlAttribute[] { return this.#attributes; }\n\n /** Whether the reader has read past the part's end. */\n eof(): boolean { return this.#eof; }\n\n /** Whether every piece of the text has arrived. */\n ended(): boolean { return this.#ended; }\n\n /** The characters that have arrived and are not read yet. */\n unread(): number { return this.#text.length - this.#pos; }\n\n /** Reads pieces until at least `ahead` characters lie unread, or the text has all come. Done only where no mark\n * is held: what has been read is let go. */\n async fill(ahead: number): Promise<void> {\n if (this.#pos > 0) {\n this.#text = this.#text.slice(this.#pos);\n this.#pos = 0;\n }\n while (!this.#ended && this.#text.length < ahead) {\n const piece = await this.#source();\n if (piece === undefined) this.#ended = true;\n else this.#text += piece;\n }\n }\n\n snapshot(): XmlMark {\n return {\n pos: this.#pos,\n state: {\n nodeType: this.#nodeType, localName: this.#localName, prefix: this.#prefix, namespaceUri: this.#namespaceUri,\n value: this.#value, isEmptyElement: this.#isEmptyElement, depth: this.#depth, attributes: this.#attributes,\n stack: [...this.#stack], popOnNext: this.#popOnNext, started: this.#started, rootSeen: this.#rootSeen,\n rootClosed: this.#rootClosed, eof: this.#eof,\n },\n };\n }\n\n restore(mark: XmlMark): void {\n const s = mark.state;\n this.#pos = mark.pos;\n this.#nodeType = s.nodeType;\n this.#localName = s.localName;\n this.#prefix = s.prefix;\n this.#namespaceUri = s.namespaceUri;\n this.#value = s.value;\n this.#isEmptyElement = s.isEmptyElement;\n this.#depth = s.depth;\n this.#attributes = s.attributes;\n this.#stack = [...s.stack];\n this.#popOnNext = s.popOnNext;\n this.#started = s.started;\n this.#rootSeen = s.rootSeen;\n this.#rootClosed = s.rootClosed;\n this.#eof = s.eof;\n }\n\n /** The attribute by its qualified name, as written (`GetAttribute(name)`), or `undefined`. */\n getAttribute(name: string): string | undefined {\n for (const attribute of this.#attributes) {\n if (attribute.name === name) return attribute.value;\n }\n return undefined;\n }\n\n /** The attribute by its local name and namespace (`GetAttribute(localName, namespaceURI)`), or `undefined`. */\n getAttributeNs(localName: string, namespaceUri: string): string | undefined {\n for (const attribute of this.#attributes) {\n if (attribute.localName === localName && attribute.namespaceUri === namespaceUri) return attribute.value;\n }\n return undefined;\n }\n\n /** Moves to the next content node \u2014 an element, an element's end, or text that is not only white space \u2014 unless the\n * reader is on one (`MoveToContent`). */\n moveToContent(): XmlNodeType {\n for (;;) {\n switch (this.#nodeType) {\n case 'element':\n case 'endElement':\n case 'text':\n case 'cdata':\n return this.#nodeType;\n case 'none':\n case 'whitespace':\n case 'significantWhitespace':\n if (!this.read()) return this.#nodeType;\n break;\n default:\n return unreachable(this.#nodeType);\n }\n }\n }\n\n /** The text of the element the reader is on, its text and CDATA joined, leaving the reader past its end\n * (`ReadElementContentAsString`). An element that holds an element is not well-formed for it. */\n readElementContentAsString(): string {\n if (this.#nodeType !== 'element') throw new Error(`Internal: the reader is on ${this.#nodeType}, not an element.`);\n if (this.#isEmptyElement) {\n this.read();\n return '';\n }\n let text = '';\n this.read();\n for (;;) {\n const node = this.nodeType();\n switch (node) {\n case 'text':\n case 'cdata':\n case 'whitespace':\n case 'significantWhitespace':\n text += this.#value;\n this.read();\n break;\n case 'element':\n throw new XmlError('ReadElementContentAs() methods cannot be called on an element that has child elements.');\n case 'endElement':\n this.read();\n return text;\n case 'none':\n throw new XmlError('Unexpected end of file.');\n default:\n return unreachable(node);\n }\n }\n }\n\n /** Reads on to the next element of `localName` in `namespaceUri`; false, at the part's end, when there is none\n * (`ReadToFollowing`). */\n readToFollowing(localName: string, namespaceUri: string): boolean {\n while (this.read()) {\n if (this.#nodeType === 'element' && this.#localName === localName && this.#namespaceUri === namespaceUri) return true;\n }\n return false;\n }\n\n /** Moves past the element the reader is on and all it holds, or past any other node (`Skip`). */\n skip(): void {\n if (this.#nodeType !== 'element' || this.#isEmptyElement) {\n this.read();\n return;\n }\n const depth = this.#depth;\n while (this.read()) {\n if (this.nodeType() === 'endElement' && this.depth() === depth) break;\n }\n this.read();\n }\n\n /** Reads the next node; false at the part's end. */\n read(): boolean {\n if (this.#eof) return false;\n if (this.#popOnNext) {\n this.#stack.pop();\n this.#popOnNext = false;\n }\n if (!this.#started) this.#prolog();\n const text = this.#text;\n for (;;) {\n if (this.#pos >= text.length) {\n if (!this.#ended) throw new NeedMore();\n if (!this.#rootSeen) throw new XmlError('Root element is missing.');\n if (this.#stack.length > 0) {\n throw new XmlError(`Unexpected end of file has occurred. The following elements are not closed: ${this.#stack.map(f => f.name).toReversed().join(', ')}.`);\n }\n this.#eof = true;\n this.#node('none', '', '', '', '', this.#stack.length);\n return false;\n }\n if (text.charCodeAt(this.#pos) !== 0x3c) {\n this.#readText(text);\n return true;\n }\n const next = this.#charAt(text, this.#pos + 1);\n if (next === '/') {\n this.#readEnd(text);\n return true;\n }\n if (next === '?') {\n this.#skipInstruction(text);\n continue;\n }\n if (next === '!') {\n if (this.#readBang(text)) return true;\n continue;\n }\n this.#readStart(text);\n return true;\n }\n }\n\n // ---- the nodes -------------------------------------------------------------------------------\n\n #node(type: XmlNodeType, localName: string, prefix: string, namespaceUri: string, value: string, depth: number): void {\n this.#nodeType = type;\n this.#localName = localName;\n this.#prefix = prefix;\n this.#namespaceUri = namespaceUri;\n this.#value = value;\n this.#depth = depth;\n this.#isEmptyElement = false;\n this.#attributes = [];\n }\n\n /** The character at `at`, asking for more text where it has not arrived; '' past the part's end. */\n #charAt(text: string, at: number): string {\n if (at < text.length) return text.charAt(at);\n if (!this.#ended) throw new NeedMore();\n return '';\n }\n\n /** Where `token` next begins at or after `from`, asking for more text where it has not arrived; -1 past the part's end. */\n #find(text: string, token: string, from: number): number {\n const at = text.indexOf(token, from);\n if (at < 0 && !this.#ended) throw new NeedMore();\n return at;\n }\n\n #prolog(): void {\n const text = this.#text;\n // The declaration, when there is one, is the part's first characters (XML 1.0, section 2.8).\n if (text.length < 6 && !this.#ended) throw new NeedMore();\n if (text.startsWith('<?xml') && isSpace(text.charCodeAt(5))) {\n const end = this.#find(text, '?>', 5);\n if (end < 0) throw new XmlError('The XML declaration is not ended.');\n const declaration = text.slice(5, end);\n const encoding = /\\bencoding\\s*=\\s*[\"']([^\"']*)[\"']/.exec(declaration)?.[1];\n if (!/\\bversion\\s*=\\s*[\"']1\\.[0-9]+[\"']/.test(declaration)) throw new XmlError('The XML declaration names no version 1.x.');\n if (encoding !== undefined && !/^(?:utf-?8|utf-?16|unicode)$/i.test(encoding)) {\n throw new XmlError(`The part declares the encoding '${encoding}', which is not read.`);\n }\n this.#pos = end + 2;\n }\n this.#started = true;\n }\n\n #readText(text: string): void {\n const lt = this.#find(text, '<', this.#pos);\n const end = lt < 0 ? text.length : lt;\n const raw = text.slice(this.#pos, end);\n checkCharacters(raw);\n if (raw.includes(']]>')) throw new XmlError(\"']]>' is not allowed in text.\");\n // Line ends are normalised before references are expanded (XML 1.0 \u00A72.11), so `&#13;` stays a carriage return.\n const value = unescape(lineFeeds(raw));\n let space = true;\n for (let i = 0; i < raw.length; i++) {\n if (!isSpace(raw.charCodeAt(i))) {\n space = false;\n break;\n }\n }\n const depth = this.#stack.length;\n if (depth === 0 && !space) throw new XmlError('Data at the root level is invalid.');\n if (depth > 0 && lt < 0) throw new XmlError(`Unexpected end of file has occurred. The following elements are not closed: ${this.#stack.map(f => f.name).toReversed().join(', ')}.`);\n const preserve = this.#stack.at(-1)?.preserve === true;\n this.#node(space ? (preserve ? 'significantWhitespace' : 'whitespace') : 'text', '', '', '', value, depth);\n this.#pos = end;\n }\n\n #skipInstruction(text: string): void {\n const end = this.#find(text, '?>', this.#pos + 2);\n if (end < 0) throw new XmlError('A processing instruction is not ended.');\n const body = text.slice(this.#pos + 2, end);\n const space = body.search(/\\s/);\n const target = space < 0 ? body : body.slice(0, space);\n if (target.toLowerCase() === 'xml') throw new XmlError('Unexpected XML declaration. The XML declaration must be the first node in the document.');\n checkName(target);\n checkCharacters(body);\n this.#pos = end + 2;\n }\n\n /** A comment (skipped), CDATA (a node: true) or a document type (refused). */\n #readBang(text: string): boolean {\n const at = this.#pos;\n if (text.length < at + 9 && !this.#ended) throw new NeedMore();\n if (text.startsWith('<!--', at)) {\n const end = this.#find(text, '-->', at + 4);\n if (end < 0) throw new XmlError('A comment is not ended.');\n const body = text.slice(at + 4, end);\n if (body.includes('--') || body.endsWith('-')) throw new XmlError(\"An XML comment cannot contain '--', and '-' cannot be the last character.\");\n checkCharacters(body);\n this.#pos = end + 3;\n return false;\n }\n if (text.startsWith('<![CDATA[', at)) {\n if (this.#stack.length === 0) throw new XmlError('Data at the root level is invalid.');\n const end = this.#find(text, ']]>', at + 9);\n if (end < 0) throw new XmlError('A CDATA section is not ended.');\n const body = text.slice(at + 9, end);\n checkCharacters(body);\n this.#node('cdata', '', '', '', lineFeeds(body), this.#stack.length);\n this.#pos = end + 3;\n return true;\n }\n if (text.startsWith('<!DOCTYPE', at)) {\n throw new XmlError(\"For security reasons DTD is prohibited in this XML document. To enable DTD processing set the DtdProcessing property on XmlReaderSettings to Parse and pass the settings into XmlReader.Create method.\");\n }\n throw new XmlError('An unexpected markup declaration was met.');\n }\n\n #readEnd(text: string): void {\n const close = this.#find(text, '>', this.#pos + 2);\n if (close < 0) throw new XmlError('An end tag is not ended.');\n const name = text.slice(this.#pos + 2, close).replace(/[\\t\\n\\r ]+$/, '');\n const frame = this.#stack.at(-1);\n if (frame === undefined) throw new XmlError(`The end tag '${name}' closes no element.`);\n if (frame.name !== name) throw new XmlError(`The '${frame.name}' start tag does not match the end tag of '${name}'.`);\n this.#node('endElement', frame.localName, frame.prefix, frame.namespaceUri, '', this.#stack.length - 1);\n this.#stack.pop();\n if (this.#stack.length === 0) this.#rootClosed = true;\n this.#pos = close + 1;\n }\n\n #readStart(text: string): void {\n if (this.#rootClosed) throw new XmlError('There are multiple root elements.');\n let at = this.#pos + 1;\n const nameEnd = (from: number): number => {\n let i = from;\n for (;;) {\n const c = this.#charAt(text, i);\n if (c === '' || c === '>' || c === '/' || c === '=' || isSpace(c.charCodeAt(0))) return i;\n i++;\n }\n };\n const end = nameEnd(at);\n const name = text.slice(at, end);\n checkName(name);\n at = end;\n const raw: { name: string; value: string }[] = [];\n let empty = false;\n for (;;) {\n let spaced = false;\n while (isSpace(this.#charAt(text, at).charCodeAt(0))) {\n at++;\n spaced = true;\n }\n const c = this.#charAt(text, at);\n if (c === '>') {\n at++;\n break;\n }\n if (c === '/') {\n if (this.#charAt(text, at + 1) !== '>') throw new XmlError(`The start tag '${name}' is not ended.`);\n at += 2;\n empty = true;\n break;\n }\n if (c === '') throw new XmlError(`The start tag '${name}' is not ended.`);\n if (!spaced) throw new XmlError(`The start tag '${name}' needs white space before an attribute.`);\n const attributeEnd = nameEnd(at);\n const attributeName = text.slice(at, attributeEnd);\n checkName(attributeName);\n at = attributeEnd;\n while (isSpace(this.#charAt(text, at).charCodeAt(0))) at++;\n if (this.#charAt(text, at) !== '=') throw new XmlError(`The attribute '${attributeName}' has no value.`);\n at++;\n while (isSpace(this.#charAt(text, at).charCodeAt(0))) at++;\n const quote = this.#charAt(text, at);\n if (quote !== '\"' && quote !== \"'\") throw new XmlError(`The value of the attribute '${attributeName}' is not quoted.`);\n const close = this.#find(text, quote, at + 1);\n if (close < 0) throw new XmlError(`The value of the attribute '${attributeName}' is not ended.`);\n const written = text.slice(at + 1, close);\n if (written.includes('<')) throw new XmlError(`'<', hexadecimal value 0x3C, is an invalid attribute character.`);\n checkCharacters(written);\n // Attribute-value normalization (XML 1.0, section 3.3.3): each literal white space character is a space,\n // a line end one space; a character reference keeps its character.\n const value = unescape(written.replace(/\\r\\n|[\\t\\n\\r]/g, ' '));\n if (raw.some(a => a.name === attributeName)) throw new XmlError(`'${attributeName}' is a duplicate attribute name.`);\n raw.push({ name: attributeName, value });\n at = close + 1;\n }\n // The namespaces it declares, then its own name and its attributes' resolved through them.\n let declared: Map<string, string> | null = null;\n let preserve = this.#stack.at(-1)?.preserve === true;\n for (const attribute of raw) {\n if (attribute.name === 'xmlns') (declared ??= new Map()).set('', attribute.value);\n else if (attribute.name.startsWith('xmlns:')) (declared ??= new Map()).set(attribute.name.slice(6), attribute.value);\n else if (attribute.name === 'xml:space') preserve = attribute.value === 'preserve' ? true : attribute.value === 'default' ? false : preserve;\n }\n const lookup = (prefix: string): string | undefined => {\n if (prefix === 'xml') return xmlNamespace;\n if (prefix === 'xmlns') return xmlnsNamespace;\n const own = declared?.get(prefix);\n if (own !== undefined) return own;\n for (let i = this.#stack.length - 1; i >= 0; i--) {\n const uri = this.#stack[i]?.declared?.get(prefix);\n if (uri !== undefined) return uri;\n }\n return prefix === '' ? '' : undefined;\n };\n const [prefix, localName] = split(name);\n const namespaceUri = lookup(prefix);\n if (namespaceUri === undefined) throw new XmlError(`'${prefix}' is an undeclared prefix.`);\n const attributes = raw.map((attribute): XmlAttribute => {\n if (attribute.name === 'xmlns') return { name: 'xmlns', prefix: '', localName: 'xmlns', namespaceUri: xmlnsNamespace, value: attribute.value };\n const [p, local] = split(attribute.name);\n if (p === '') return { name: attribute.name, prefix: '', localName: local, namespaceUri: '', value: attribute.value };\n const uri = lookup(p);\n if (uri === undefined) throw new XmlError(`'${p}' is an undeclared prefix.`);\n return { name: attribute.name, prefix: p, localName: local, namespaceUri: uri, value: attribute.value };\n });\n for (let i = 0; i < attributes.length; i++) {\n const a = attributes[i];\n if (a === undefined || a.namespaceUri === '') continue;\n for (let j = i + 1; j < attributes.length; j++) {\n const b = attributes[j];\n if (b !== undefined && b.localName === a.localName && b.namespaceUri === a.namespaceUri) {\n throw new XmlError(`The attribute '${b.localName}' of the namespace '${b.namespaceUri}' is written twice.`);\n }\n }\n }\n const depth = this.#stack.length;\n this.#node('element', localName, prefix, namespaceUri, '', depth);\n this.#isEmptyElement = empty;\n this.#attributes = attributes;\n this.#stack.push({ name, localName, prefix, namespaceUri, declared, preserve });\n this.#popOnNext = empty;\n this.#rootSeen = true;\n if (empty && depth === 0) this.#rootClosed = true;\n this.#pos = at;\n }\n}\n", "// The zip under a workbook (APPNOTE 6.3), read where its bytes lie: the central directory names the entries, and an\n// entry's bytes are inflated by the platform's DecompressionStream('deflate-raw') a piece at a time, so a worksheet\n// is never held inflated whole. A File is read through Blob.slice, so not even the file is read whole.\n\n/** The bytes of a file, read where they are asked for. */\nexport interface ByteSource {\n readonly size: number;\n /** The bytes from `offset`, at most `length` of them: fewer where the file ends first. */\n read(offset: number, length: number): Promise<Uint8Array>;\n /** The bytes from `offset`, `length` of them, a piece at a time. */\n stream(offset: number, length: number): ReadableStream<Uint8Array<ArrayBuffer>>;\n}\n\nconst piece = 1 << 20;\n\n/** The file as a source of its bytes: an array of them, or a Blob (a File) read where it is asked. */\nexport function byteSource(file: Uint8Array | ArrayBuffer | Blob): ByteSource {\n if (typeof Blob !== 'undefined' && file instanceof Blob) {\n return {\n size: file.size,\n read: async (offset, length) => new Uint8Array(await file.slice(offset, Math.min(file.size, offset + length)).arrayBuffer()),\n stream: (offset, length) => file.slice(offset, offset + length).stream(),\n };\n }\n if (!(file instanceof Uint8Array) && !(file instanceof ArrayBuffer)) {\n throw new TypeError('The file is a Uint8Array, an ArrayBuffer or a Blob.');\n }\n const bytes = file instanceof Uint8Array ? file : new Uint8Array(file);\n return {\n size: bytes.length,\n read: (offset, length) => Promise.resolve(bytes.subarray(offset, Math.min(bytes.length, offset + length))),\n stream: (offset, length) => {\n let at = offset;\n const end = Math.min(bytes.length, offset + length);\n return new ReadableStream<Uint8Array<ArrayBuffer>>({\n pull(controller) {\n if (at >= end) {\n controller.close();\n return;\n }\n const next = Math.min(end, at + piece);\n controller.enqueue(bytes.slice(at, next));\n at = next;\n },\n });\n },\n };\n}\n\n/** A zip that cannot be read: what .NET's ZipArchive throws an InvalidDataException for. */\nexport class ZipFormatError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ZipFormatError';\n }\n}\n\n/** An entry as the central directory lists it. */\nexport interface ZipEntry {\n /** Its name, as the directory writes it. */\n readonly name: string;\n /** How it is compressed: 0 stored, 8 deflated. */\n readonly method: number;\n readonly flags: number;\n readonly compressedSize: number;\n /** What it declares it inflates to. */\n readonly uncompressedSize: number;\n readonly localHeaderOffset: number;\n}\n\n/** A little-endian 16-bit integer of a record; a record cut short is not a zip. */\nexport function u16(bytes: Uint8Array, at: number): number {\n const low = bytes[at];\n const high = bytes[at + 1];\n if (low === undefined || high === undefined) throw new ZipFormatError('A record of the zip is cut short.');\n return low | (high << 8);\n}\n\n/** A little-endian 32-bit integer of a record; a record cut short is not a zip. */\nexport function u32(bytes: Uint8Array, at: number): number {\n return (u16(bytes, at) | (u16(bytes, at + 2) << 16)) >>> 0;\n}\n\n/** A 64-bit little-endian size, as a number; past 2^53 it is Infinity, which every limit refuses. */\nfunction u64(bytes: Uint8Array, at: number): number {\n const value = u32(bytes, at) + u32(bytes, at + 4) * 0x1_0000_0000;\n return value > Number.MAX_SAFE_INTEGER ? Number.POSITIVE_INFINITY : value;\n}\n\nfunction need(bytes: Uint8Array, length: number, what: string): void {\n if (bytes.length < length) throw new ZipFormatError(`${what} is cut short.`);\n}\n\nconst utf8 = new TextDecoder();\n\n/** The entries the zip's central directory lists, in its order. */\nexport async function readCentralDirectory(source: ByteSource): Promise<readonly ZipEntry[]> {\n const tailLength = Math.min(source.size, 22 + 0xFFFF);\n const tailStart = source.size - tailLength;\n const tail = await source.read(tailStart, tailLength);\n let end = -1;\n for (let at = tail.length - 22; at >= 0; at--) {\n if (u32(tail, at) === 0x06054b50) {\n end = at;\n break;\n }\n }\n if (end < 0) throw new ZipFormatError('End of Central Directory record could not be found.');\n let count = u16(tail, end + 10);\n let size = u32(tail, end + 12);\n let offset = u32(tail, end + 16);\n if (count === 0xFFFF || size === 0xFFFFFFFF || offset === 0xFFFFFFFF) {\n const locator = end - 20;\n if (locator < 0 || u32(tail, locator) !== 0x07064b50) throw new ZipFormatError('The Zip64 end of central directory locator could not be found.');\n const at = u64(tail, locator + 8);\n const record = await source.read(at, 56);\n need(record, 56, 'The Zip64 end of central directory record');\n if (u32(record, 0) !== 0x06064b50) throw new ZipFormatError('The Zip64 end of central directory record could not be found.');\n count = u64(record, 32);\n size = u64(record, 40);\n offset = u64(record, 48);\n }\n if (!Number.isFinite(size) || !Number.isFinite(offset) || offset + size > source.size) {\n throw new ZipFormatError('The central directory lies outside the file.');\n }\n const directory = await source.read(offset, size);\n const entries: ZipEntry[] = [];\n let at = 0;\n while (at + 46 <= directory.length && u32(directory, at) === 0x02014b50) {\n const flags = u16(directory, at + 8);\n const method = u16(directory, at + 10);\n let compressedSize = u32(directory, at + 20);\n let uncompressedSize = u32(directory, at + 24);\n const nameLength = u16(directory, at + 28);\n const extraLength = u16(directory, at + 30);\n const commentLength = u16(directory, at + 32);\n let localHeaderOffset = u32(directory, at + 42);\n const nameAt = at + 46;\n need(directory, nameAt + nameLength + extraLength + commentLength, 'The central directory');\n const name = utf8.decode(directory.subarray(nameAt, nameAt + nameLength));\n // The Zip64 extra field carries, in this order, each size or offset the record writes as 0xFFFFFFFF.\n let extra = nameAt + nameLength;\n const extraEnd = extra + extraLength;\n while (extra + 4 <= extraEnd) {\n const id = u16(directory, extra);\n const length = u16(directory, extra + 2);\n if (id === 0x0001) {\n let field = extra + 4;\n if (uncompressedSize === 0xFFFFFFFF) { uncompressedSize = u64(directory, field); field += 8; }\n if (compressedSize === 0xFFFFFFFF) { compressedSize = u64(directory, field); field += 8; }\n if (localHeaderOffset === 0xFFFFFFFF) { localHeaderOffset = u64(directory, field); }\n }\n extra += 4 + length;\n }\n entries.push({ name, method, flags, compressedSize, uncompressedSize, localHeaderOffset });\n at = extraEnd + commentLength;\n }\n if (entries.length !== count) {\n throw new ZipFormatError('Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory.');\n }\n return entries;\n}\n\n/** Where an entry's compressed bytes begin, past its local header. */\nexport async function dataOffset(source: ByteSource, entry: ZipEntry): Promise<number> {\n const header = await source.read(entry.localHeaderOffset, 30);\n if (header.length < 30 || u32(header, 0) !== 0x04034b50) throw new ZipFormatError('A local file header is corrupt.');\n const start = entry.localHeaderOffset + 30 + u16(header, 26) + u16(header, 28);\n if (start + entry.compressedSize > source.size) throw new ZipFormatError('A local file header is corrupt.');\n return start;\n}\n", "// The zip under a workbook as ExGrid.Data.Xlsx's Package reads it (ADR-0330 \u00A79): its parts by name, each read a piece\n// at a time through a reader that refuses a part that inflates past what the zip declares, or whose compressed bytes\n// cannot be inflated; and the XML of a part read with DTDs prohibited. Beside it, what the first bytes of a file say\n// it is before any zip is read, and an OLE compound file told apart as encrypted or legacy.\n\nimport { grouped } from './invariant';\nimport { XlsxError } from './xlsx-error';\nimport { XmlError, XmlReader, type TextSource } from './xml-reader';\nimport { foldCase } from './text-casing';\nimport { dataOffset, readCentralDirectory, u16, u32, ZipFormatError, type ByteSource, type ZipEntry } from './zip-read';\n\n/** The bytes of a part kept for the refusal of a part that is not well-formed: the prolog lies in them (ADR-0330 \u00A79). */\nconst headLength = 64 * 1024;\n\n/** One part's bytes as they inflate, counted, and refused past what the zip declared for it. */\nexport class PartBytes {\n readonly #reader: ReadableStreamDefaultReader<Uint8Array>;\n readonly #declared: number;\n readonly #deflated: boolean;\n readonly #part: string;\n readonly #sheet: string | undefined;\n readonly #head = new Uint8Array(headLength);\n #headLength = 0;\n #read = 0;\n #done = false;\n\n constructor(stream: ReadableStream<Uint8Array<ArrayBuffer>>, entry: ZipEntry, part: string, sheet: string | undefined) {\n this.#deflated = entry.method === 8;\n this.#reader = (this.#deflated ? stream.pipeThrough(new DecompressionStream('deflate-raw')) : stream).getReader();\n this.#declared = entry.uncompressedSize;\n this.#part = part;\n this.#sheet = sheet;\n }\n\n /** The bytes inflated so far. */\n get bytesRead(): number {\n return this.#read;\n }\n\n /** The first bytes the part inflated to, as far as they have been read. */\n get head(): Uint8Array {\n return this.#head.subarray(0, this.#headLength);\n }\n\n /**\n * The next bytes, or `undefined` at the part's end. A deflated part is inflated no further than it declares, as .NET\n * cuts it; a stored one, which .NET reads to its compressed size, is refused past it: a zip bomb's headers may lie.\n * Bytes that cannot be inflated are refused as malformed, naming the part.\n */\n async next(): Promise<Uint8Array | undefined> {\n if (this.#done) return undefined;\n let result: ReadableStreamReadResult<Uint8Array>;\n try {\n result = await this.#reader.read();\n } catch (error) {\n // The stream is errored now, and cancelling it would only throw its error again.\n this.#done = true;\n throw new XlsxError('malformed', `The part's compressed bytes cannot be inflated: ${inflateFailure(error)}`, { part: this.#part, sheet: this.#sheet }, { cause: error });\n }\n if (result.done) {\n this.#done = true;\n return undefined;\n }\n let bytes = result.value;\n if (this.#read + bytes.length > this.#declared) {\n if (!this.#deflated) {\n throw new XlsxError('tooLarge', `The part inflates to more than the ${grouped(this.#declared)} bytes the zip declares for it.`,\n { part: this.#part, sheet: this.#sheet });\n }\n bytes = bytes.subarray(0, this.#declared - this.#read);\n this.#done = true;\n await this.#reader.cancel();\n }\n if (this.#headLength < headLength) {\n const kept = bytes.subarray(0, headLength - this.#headLength);\n this.#head.set(kept, this.#headLength);\n this.#headLength += kept.length;\n }\n this.#read += bytes.length;\n return bytes;\n }\n\n /** Lets go of what the part has not read. */\n async close(): Promise<void> {\n if (this.#done) return;\n this.#done = true;\n await this.#reader.cancel();\n }\n}\n\n/** What the platform says of bytes it could not inflate: Node's DecompressionStream throws an empty TypeError whose cause\n * is zlib's own account. */\nfunction inflateFailure(error: unknown): string {\n if (!(error instanceof Error)) return String(error);\n if (error.message === '' && error.cause instanceof Error) return error.cause.message;\n return error.message;\n}\n\n/** The encoding a part's first bytes say it is in: a byte order mark, or the `<?` of a declaration in UTF-16. */\nfunction encodingOf(head: Uint8Array): string {\n const [a, b, c, d] = head;\n if (a === 0xFF && b === 0xFE) return 'utf-16le';\n if (a === 0xFE && b === 0xFF) return 'utf-16be';\n if (a === 0x3C && b === 0x00 && c === 0x3F && d === 0x00) return 'utf-16le';\n if (a === 0x00 && b === 0x3C && c === 0x00 && d === 0x3F) return 'utf-16be';\n return 'utf-8';\n}\n\n/** A part's text, decoded as its first bytes say, piece by piece. Bytes the encoding does not hold are not well-formed. */\nexport function textOf(bytes: PartBytes): TextSource {\n let decoder: TextDecoder | undefined;\n let held = new Uint8Array(0);\n let finished = false;\n const decode = (chunk: Uint8Array, stream: boolean): string => {\n try {\n return (decoder ??= new TextDecoder(encodingOf(chunk), { fatal: true })).decode(chunk, { stream });\n } catch (error) {\n throw new XmlError('Invalid character in the given encoding.', { cause: error });\n }\n };\n return async () => {\n if (finished) return undefined;\n for (;;) {\n const chunk = await bytes.next();\n if (chunk === undefined) {\n finished = true;\n const rest = decode(held, false);\n held = new Uint8Array(0);\n return rest;\n }\n if (decoder === undefined && held.length + chunk.length < 4) {\n // The encoding is told by the first four bytes, which may arrive in more than one piece.\n const more = new Uint8Array(held.length + chunk.length);\n more.set(held);\n more.set(chunk, held.length);\n held = more;\n continue;\n }\n if (held.length > 0) {\n const joined = new Uint8Array(held.length + chunk.length);\n joined.set(held);\n joined.set(chunk, held.length);\n held = new Uint8Array(0);\n return decode(joined, true);\n }\n return decode(chunk, true);\n }\n };\n}\n\n/** A part's XML, being read, beside its bytes. */\nexport interface PartXml {\n readonly xml: XmlReader;\n readonly bytes: PartBytes;\n}\n\n/** The zip under a workbook: its parts by name, each opened a piece at a time. */\nexport class Package {\n readonly #source: ByteSource;\n readonly #entries: ReadonlyMap<string, ZipEntry>;\n /** The parts' names, in the zip's order, as the first entry of each name in any case writes it. */\n readonly partNames: readonly string[];\n\n private constructor(source: ByteSource, entries: ReadonlyMap<string, ZipEntry>, names: readonly string[]) {\n this.#source = source;\n this.#entries = entries;\n this.partNames = names;\n }\n\n /** The zip in `source`, refused when it cannot be read or holds more than `maxUncompressedBytes`. */\n static async open(source: ByteSource, maxUncompressedBytes: number): Promise<Package> {\n let listed: readonly ZipEntry[];\n try {\n listed = await readCentralDirectory(source);\n } catch (error) {\n if (!(error instanceof ZipFormatError)) throw error;\n throw new XlsxError('notAZip', `The file is not a zip package that can be read: ${error.message}`, {}, { cause: error });\n }\n const entries = new Map<string, ZipEntry>();\n const names: string[] = [];\n for (const entry of listed) {\n if (entry.name.endsWith('/')) continue;\n const name = entry.name.replace(/^\\/+/, '');\n const key = foldCase(name);\n if (entries.has(key)) continue;\n entries.set(key, entry);\n names.push(name);\n }\n let total = 0;\n for (const entry of entries.values()) {\n total += entry.uncompressedSize;\n if (total > maxUncompressedBytes) {\n throw new XlsxError('tooLarge',\n `The file holds more than the ${grouped(maxUncompressedBytes)} uncompressed bytes a read is allowed (XlsxReadOptions.MaxUncompressedBytes).`);\n }\n }\n return new Package(source, entries, Object.freeze(names));\n }\n\n has(part: string): boolean {\n return this.#entries.has(foldCase(part));\n }\n\n lengthOf(part: string): number {\n return this.#entries.get(foldCase(part))?.uncompressedSize ?? 0; // oxlint-disable-line ex-grid/no-stand-in-default -- ExGrid.Data.Xlsx: a part the package does not hold is 0 bytes of the worksheets' total\n }\n\n /** The part's bytes as they inflate, or `undefined` when the package has no such part.\n * @param sheet - The Sheet the part is, named by a refusal the read meets. */\n async openPart(part: string, sheet?: string): Promise<PartBytes | undefined> {\n const entry = this.#entries.get(foldCase(part));\n if (entry === undefined) return undefined;\n if (entry.method !== 0 && entry.method !== 8) {\n throw new XlsxError('notAZip', 'The part cannot be inflated: The archive entry was compressed using an unsupported compression method.', { part, sheet });\n }\n let start: number;\n try {\n start = await dataOffset(this.#source, entry);\n } catch (error) {\n if (!(error instanceof ZipFormatError)) throw error;\n throw new XlsxError('notAZip', `The part cannot be inflated: ${error.message}`, { part, sheet }, { cause: error });\n }\n return new PartBytes(this.#source.stream(start, entry.compressedSize), entry, part, sheet);\n }\n\n /** The part's XML, being read a piece at a time, or `undefined` when the package has no such part. */\n async openXml(part: string, sheet?: string): Promise<PartXml | undefined> {\n const bytes = await this.openPart(part, sheet);\n return bytes === undefined ? undefined : { xml: new XmlReader(textOf(bytes)), bytes };\n }\n\n /** The part's XML with all of its text read, for a part read whole, or `undefined` when the package has no such part. */\n async readXml(part: string): Promise<PartXml | undefined> {\n const opened = await this.openXml(part);\n if (opened === undefined) return undefined;\n await opened.xml.fill(Number.POSITIVE_INFINITY);\n return opened;\n }\n\n /**\n * The refusal a part that is not well-formed stands for: one that declares a document type, which the first 64 KiB\n * show in any part a workbook has, or one that is not well-formed.\n */\n static refuse(error: XmlError, opened: PartXml, part: string, sheet?: string): XlsxError {\n if (new TextDecoder().decode(opened.bytes.head).includes('<!DOCTYPE')) {\n return new XlsxError('dtd', 'The part declares a document type (<!DOCTYPE), which a workbook never needs; it is not read.', { part, sheet }, { cause: error });\n }\n return new XlsxError('malformed', `The part is not well-formed XML: ${error.message}`, { part, sheet }, { cause: error });\n }\n}\n\n// ---- what the first bytes say -----------------------------------------------------------------\n\nconst ole = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];\n\nexport function isOle(head: Uint8Array): boolean {\n return head.length >= ole.length && ole.every((b, i) => head[i] === b);\n}\n\nexport function isZip(head: Uint8Array): boolean {\n return head.length >= 4 && head[0] === 0x50 && head[1] === 0x4B\n && ((head[2] === 3 && head[3] === 4) || (head[2] === 5 && head[3] === 6) || (head[2] === 7 && head[3] === 8));\n}\n\nconst lastSector = 0xFFFFFFFA;\nconst endOfChain = 0xFFFFFFFE;\nconst guard = 1 << 16;\n\n/**\n * The refusal an OLE compound file stands for: an encrypted workbook, whose compound file holds an `EncryptedPackage`\n * stream, or a legacy binary workbook. The compound file's directory is read through its sector chains (MS-CFB), and\n * nothing else of the file: its header, the FAT sectors the directory's chain passes through, and the directory's own\n * sectors. A directory that cannot be followed is taken for a legacy workbook.\n */\nexport async function classifyOle(source: ByteSource): Promise<XlsxError> {\n if (await isEncrypted(source)) {\n return new XlsxError('encrypted',\n 'The file is an encrypted workbook. Remove its password in Excel (File, Info, Protect Workbook, Encrypt with Password) and save it again.');\n }\n return new XlsxError('legacy',\n 'The file is an Excel 97\u20132003 workbook (.xls), or another Office binary file, not an .xlsx. Save it from Excel as an Excel Workbook (.xlsx).');\n}\n\n/** The bytes at `offset`, all `length` of them, or `undefined` when the file ends first. */\nasync function readExactly(source: ByteSource, offset: number, length: number): Promise<Uint8Array | undefined> {\n if (offset + length > source.size) return undefined;\n const bytes = await source.read(offset, length);\n return bytes.length === length ? bytes : undefined;\n}\n\n/** Whether the compound file's directory names an `EncryptedPackage` or `EncryptionInfo` stream. */\nasync function isEncrypted(source: ByteSource): Promise<boolean> {\n const header = await readExactly(source, 0, 512);\n if (header === undefined) return false;\n const shift = u16(header, 30);\n if (shift !== 9 && shift !== 12) return false;\n const size = 1 << shift;\n const perSector = size / 4;\n const at = (sector: number): number => (sector + 1) * size;\n\n // The FAT's own sectors: the first 109 the header lists, the rest along the DIFAT chain, read only when the\n // directory's chain reaches that far.\n const fatSectors: number[] = [];\n for (let i = 0; i < 109; i++) {\n const s = u32(header, 76 + i * 4);\n if (s < lastSector) fatSectors.push(s);\n }\n let difat = u32(header, 68);\n let difatRead = 0;\n const fatCache = new Map<number, Uint8Array | null>();\n const next = async (sector: number): Promise<number> => {\n const fat = Math.floor(sector / perSector);\n while (fat >= fatSectors.length && difat < lastSector && difatRead++ < guard) {\n const block = await readExactly(source, at(difat), size);\n if (block === undefined) return endOfChain;\n for (let i = 0; i < size / 4 - 1; i++) {\n const s = u32(block, i * 4);\n if (s < lastSector) fatSectors.push(s);\n }\n difat = u32(block, size - 4);\n }\n const fatSector = fatSectors[fat];\n if (fatSector === undefined) return endOfChain;\n let entries = fatCache.get(fat);\n if (entries === undefined) {\n const read = await readExactly(source, at(fatSector), size);\n entries = read === undefined ? null : read;\n fatCache.set(fat, entries);\n }\n return entries === null ? endOfChain : u32(entries, (sector % perSector) * 4);\n };\n\n const names = new TextDecoder('utf-16le');\n let dir = u32(header, 48);\n for (let step = 0; dir < lastSector && step < guard; step++) {\n const directory = await readExactly(source, at(dir), size);\n if (directory === undefined) break;\n for (let e = 0; e < size / 128; e++) {\n const entry = directory.subarray(e * 128, e * 128 + 128);\n const length = u16(entry, 64);\n if (length >= 2 && length <= 64) {\n const name = names.decode(entry.subarray(0, length - 2));\n if (name === 'EncryptedPackage' || name === 'EncryptionInfo') return true;\n }\n }\n dir = await next(dir);\n }\n return false;\n}\n", "// How a read paces itself (ADR-0330 \u00A79, ADR-0064), as ExGrid.Data.Xlsx's Pacer paces it: in slices sized by time,\n// yielding between them so that a browser keeps painting while a large workbook opens, reporting its progress after\n// each, and seeing a cancellation between them.\n\n/** How far a read has come. */\nexport interface XlsxProgress {\n /** The index of the worksheet being read, or -1 while the shared strings are. */\n readonly sheet: number;\n /** The sheets the workbook lists. */\n readonly sheets: number;\n /** The cells read so far, every worksheet counted. */\n readonly cells: number;\n /** The worksheets' bytes inflated so far; while the shared strings are read, theirs. */\n readonly bytes: number;\n /** The worksheets' uncompressed bytes, as the zip declares them; while the shared strings are read, theirs. */\n readonly totalBytes: number;\n}\n\n/** The limits, progress and pacing of a read. A key left out takes the default its comment names. */\nexport interface XlsxReadOptions {\n /**\n * The uncompressed bytes the package may hold, every part counted, as the zip declares them, and that a part may\n * inflate to: past it the file is refused as `tooLarge`. 1 GiB when left out.\n */\n readonly maxUncompressedBytes?: number;\n /** The cells a read may hold, every worksheet counted: past it the file is refused as `tooManyCells`. 10,000,000\n * when left out. */\n readonly maxCells?: number;\n /** Told how far the read has come after every slice, and once more at the end of the shared strings and of each\n * worksheet. */\n readonly onProgress?: (progress: XlsxProgress) => void;\n /** How long one slice works, in milliseconds, before the read yields; 30 when left out. A slice always does some work,\n * so 0 yields after every batch. */\n readonly sliceBudgetMs?: number;\n /** What the read awaits between slices; a macrotask (`setTimeout(\u2026, 0)`) when left out, which gives a browser a turn\n * of its event loop to paint in. */\n readonly yield?: () => Promise<void>;\n /** Cancels the read: it rejects with the signal's reason, looked at between slices. */\n readonly signal?: AbortSignal;\n}\n\n/** The uncompressed bytes a read allows when the options name none: 1 GiB. */\nexport const defaultMaxUncompressedBytes = 2 ** 30;\n\n/** The cells a read allows when the options name none. */\nexport const defaultMaxCells = 10_000_000;\n\nfunction macrotask(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n}\n\n/** Paces a read in slices sized by time; cancellation is looked at between them. */\nexport class Pacer {\n readonly #budget: number;\n readonly #yield: () => Promise<void>;\n readonly #onProgress: ((progress: XlsxProgress) => void) | undefined;\n readonly #signal: AbortSignal | undefined;\n #sliceStart = performance.now();\n\n constructor(options: XlsxReadOptions) {\n const budget = options.sliceBudgetMs === undefined ? 30 : options.sliceBudgetMs;\n if (typeof budget !== 'number' || Number.isNaN(budget)) throw new TypeError(`The slice budget ${String(budget)} is not a number of milliseconds.`);\n this.#budget = Math.max(0, budget);\n this.#yield = options.yield === undefined ? macrotask : options.yield;\n this.#onProgress = options.onProgress;\n this.#signal = options.signal;\n }\n\n cancelled(): void {\n this.#signal?.throwIfAborted();\n }\n\n /** A point between batches: when the slice has spent its budget, reports `progress` and yields. */\n async checkpoint(progress: () => XlsxProgress): Promise<void> {\n this.cancelled();\n if (performance.now() < this.#sliceStart + this.#budget) return;\n this.#onProgress?.(progress());\n await this.#yield();\n this.cancelled();\n this.#sliceStart = performance.now();\n }\n\n report(progress: XlsxProgress): void {\n this.#onProgress?.(progress);\n }\n}\n", "// The workbook's shared strings, held whole: the one part read whole as text (ADR-0330 \u00A79).\n\n/** The workbook's shared strings, held whole, in the part's order, and which of them came in runs of their own\n * formatting. */\nexport class XlsxSharedStrings {\n /** A workbook with no shared strings. */\n static readonly empty: XlsxSharedStrings = new XlsxSharedStrings([], new Set());\n\n readonly #texts: readonly string[];\n readonly #rich: ReadonlySet<number>;\n\n /** The strings `texts`, those at the indexes in `rich` marked as having come in runs. */\n constructor(texts: readonly string[], rich: ReadonlySet<number>) {\n this.#texts = Object.freeze(texts);\n this.#rich = rich;\n }\n\n /** The strings, in the part's order: a cell's `<v>` is an index into them. */\n get texts(): readonly string[] {\n return this.#texts;\n }\n\n /** How many there are. */\n get count(): number {\n return this.#texts.length;\n }\n\n /** Whether the string at `index` came in runs of their own formatting, which are not carried; its text is. */\n isRich(index: number): boolean {\n return this.#rich.has(index);\n }\n}\n", "// The model of a workbook as its file writes it (ADR-0330 \u00A79), as ExGrid.Data.Xlsx's records hold it: a number is\n// its text, a Formula its stored text, a style its index. Nothing is interpreted.\n\nimport { formatCell, parseCell } from './cell-reference';\nimport { equalsIgnoreCase } from './invariant';\n\n/** What a cell's value is, as its `t` attribute writes it (ECMA-376 `ST_CellType`). */\nexport type XlsxCellType =\n /** A number (`t=\"n\"`, or no `t`): the value is its decimal text, invariant. A cell with no value is a number with none. */\n | 'number'\n /** Text held in the shared strings (`t=\"s\"`): the value is its index, and the cell's `text` the text. */\n | 'sharedString'\n /** Text written in the cell itself (`t=\"inlineStr\"`): the cell's `text` is the text. */\n | 'inlineString'\n /** A Formula's text result (`t=\"str\"`): the value is the text. */\n | 'formulaString'\n /** A boolean (`t=\"b\"`): the value is `0` or `1`. */\n | 'boolean'\n /** An Error Value (`t=\"e\"`): the value is its text, as `#DIV/0!`. */\n | 'error'\n /** A date in ISO 8601 (`t=\"d\"`), which Excel itself never writes. */\n | 'date';\n\n/** How a Formula is written (ECMA-376 `ST_CellFormulaType`). */\nexport type XlsxFormulaKind =\n /** A Formula of the cell's own. */\n | 'normal'\n /** A shared formula: the master carries the text, the range it covers and its index; every other cell of the group\n * carries only the index, and its Formula is the master's moved to it. */\n | 'shared'\n /** An array formula over its range: a dynamic array that spills when it says so, and a legacy multi-cell array formula\n * otherwise. */\n | 'array'\n /** A What-If data table. */\n | 'dataTable';\n\n/** A cell's Formula as the file writes it: its text, without the leading `=`, and how it is shared. */\nexport interface XlsxFormula {\n /** The Formula's text as stored, Excel's `_xlfn.` and `_xlws.` prefixes included; empty for a cell that takes a shared\n * formula from its master. */\n readonly text: string;\n /** How it is written. */\n readonly kind: XlsxFormulaKind;\n /** The range a shared formula's master or an array formula covers, as `A1:A10`; otherwise null. */\n readonly reference: string | null;\n /** A shared formula's group (`si`); otherwise null. */\n readonly sharedIndex: number | null;\n /** Whether an array formula is a dynamic array that spills (Excel 365), as the workbook's cell metadata marks one. */\n readonly isDynamicArray: boolean;\n}\n\n/** A Formula to write: its text, and how it is shared where it is not a cell's own. */\nexport interface XlsxFormulaInput {\n /** The Formula's text, without the leading `=`, Excel's prefixes included; empty for a cell that takes a shared formula. */\n readonly text: string;\n /** How it is written; `normal` when left out. */\n readonly kind?: XlsxFormulaKind;\n /** The range a shared formula's master or an array formula covers; an array formula left without one covers its cell. */\n readonly reference?: string | null;\n /** A shared formula's group. */\n readonly sharedIndex?: number | null;\n /** Whether an array formula is a dynamic array that spills. */\n readonly isDynamicArray?: boolean;\n}\n\n/**\n * One cell as a worksheet writes it (ADR-0330 \u00A79): its place, its type, its value as written, its Formula and its\n * style. Nothing is interpreted: a number is its text, a Formula its stored text, a style its index into the styles'\n * cell formats.\n */\nexport interface XlsxCell {\n /** The cell's row, from zero (row 1 is 0). */\n readonly row: number;\n /** The cell's column, from zero (column A is 0). */\n readonly column: number;\n /** What the value is. */\n readonly type: XlsxCellType;\n /** The value as written (`<v>`), or null for a cell with none: a cell that carries only a style, or an inline string. */\n readonly value: string | null;\n /** The text of a shared or inline string; otherwise null. */\n readonly text: string | null;\n /** The Formula, or null. */\n readonly formula: XlsxFormula | null;\n /** The index into the styles' cell formats (`s`); 0 when the cell names none. */\n readonly styleIndex: number;\n /** Whether the text came in runs of their own formatting, which are not carried; the text is. */\n readonly isRichText: boolean;\n}\n\n/** A cell to write. A shared string is written from its `text`, whatever its `value` says. */\nexport interface XlsxCellInput {\n /** The cell's row, from zero. */\n readonly row: number;\n /** The cell's column, from zero. */\n readonly column: number;\n /** What the value is. */\n readonly type: XlsxCellType;\n /** The value as written; none when left out. */\n readonly value?: string | null;\n /** The text of a shared or inline string. */\n readonly text?: string | null;\n /** The Formula. */\n readonly formula?: XlsxFormulaInput | null;\n /** The index into the styles' cell formats; 0 when left out. */\n readonly styleIndex?: number;\n}\n\n/** The cell's place as `B7`. */\nexport function referenceOf(cell: { readonly row: number; readonly column: number }): string {\n return formatCell(cell.row, cell.column);\n}\n\n/** A column range's width, as `<col>` writes it. */\nexport interface XlsxColumn {\n /** The first column of the range, from zero. */\n readonly first: number;\n /** The last column of the range, from zero. */\n readonly last: number;\n /** The width in Excel's own unit (characters of the default font's widest digit, with padding), or null when the range\n * sets none. */\n readonly width: number | null;\n /** Whether the columns are hidden. */\n readonly hidden: boolean;\n /** The style the columns' empty cells take, or 0. */\n readonly styleIndex: number;\n /** Whether the width is marked as fitted to what the columns hold (`bestFit`): where a typed entry widened the column,\n * or where it was fitted on purpose; the file does not say which. */\n readonly bestFit: boolean;\n /** Whether the width is one set for the columns (`customWidth`), rather than the default width written only so that a\n * range that records a style has a width. */\n readonly customWidth: boolean;\n}\n\n/** A column range to write; a key left out is the record's default. */\nexport interface XlsxColumnInput {\n /** The first column of the range, from zero. */\n readonly first: number;\n /** The last column of the range, from zero. */\n readonly last: number;\n /** The width in Excel's own unit; none when left out. */\n readonly width?: number | null;\n /** Whether the columns are hidden; false when left out. */\n readonly hidden?: boolean;\n /** The style the columns' empty cells take; 0 when left out. */\n readonly styleIndex?: number;\n /** Whether the width is marked as fitted; false when left out. */\n readonly bestFit?: boolean;\n /** Whether the width is one set for the columns; true when left out. */\n readonly customWidth?: boolean;\n}\n\n/** A row that records a cell format of its own (`<row s=\"\u2026\" customFormat=\"1\">`): the format its cells take where the row\n * holds no cell, in place of their columns'. */\nexport interface XlsxRow {\n /** The row, from zero (row 1 is 0). */\n readonly row: number;\n /** The index into the styles' cell formats its empty cells take; 0 is the default format, which still stands in place\n * of the columns'. */\n readonly styleIndex: number;\n}\n\n/** Whether a sheet is shown. */\nexport type XlsxSheetVisibility =\n /** Shown. */\n | 'visible'\n /** Hidden, and listed in Excel's Unhide. */\n | 'hidden'\n /** Hidden, and not listed in Excel's Unhide. */\n | 'veryHidden';\n\n/** What kind of sheet a workbook lists. */\nexport type XlsxSheetKind =\n /** A worksheet of cells. */\n | 'worksheet'\n /** A chart sheet, or any other sheet that holds no cells. */\n | 'other';\n\n/** A worksheet as the workbook part lists it. */\nexport interface XlsxSheetInfo {\n /** Its name, as its tab shows it. */\n readonly name: string;\n /** Its `sheetId`. */\n readonly sheetId: number;\n /** Whether it is shown. */\n readonly visibility: XlsxSheetVisibility;\n /** The package part that holds it, as `xl/worksheets/sheet1.xml`, or null for a sheet that is not a worksheet. */\n readonly part: string | null;\n /** What kind of sheet it is. */\n readonly kind: XlsxSheetKind;\n}\n\n/** A defined name, as the workbook part writes it. */\nexport interface XlsxDefinedName {\n /** The name, as `Rate`, or a built-in one such as `_xlnm.Print_Area`. */\n readonly name: string;\n /** What it refers to, as a Formula's text. */\n readonly text: string;\n /** The index of the sheet it is local to, or null for a name of the whole workbook. */\n readonly localSheet: number | null;\n /** Whether it is hidden. */\n readonly hidden: boolean;\n}\n\n/**\n * An Excel Table on a worksheet (ECMA-376 Part 1, \u00A718.5), as a sheet writer's `addTable` writes it: a header row holding\n * each column's name, its rows of data below, an AutoFilter over them and Excel's default table style.\n */\nexport interface XlsxTable {\n /** The name a Formula reads it by (`Positions[PV]`), as Excel names a Table (`isValidTableName`), and no other table's or\n * defined name's in the workbook, in any case. */\n readonly name: string;\n /** The header's row, from zero. */\n readonly headerRow: number;\n /** The first column, from zero. */\n readonly firstColumn: number;\n /** The columns' names, in order: at least one, none empty, no two the same in any case. */\n readonly columns: readonly string[];\n /** The rows of data below the header: at least one, as Excel holds a table of none as one empty row. */\n readonly dataRows: number;\n /** Whether the header's cells carry an AutoFilter's buttons, as a table Excel makes does; true when left out. */\n readonly autoFilter?: boolean;\n}\n\n/**\n * Whether `name` is a name Excel gives a Table: a letter, `_` or `\\`, then letters, digits, `_` and `.`; at most 255\n * characters; not a cell's address (`A1`, `A01`), not an R1C1 one, `R` or `C`, and not `TRUE` or `FALSE`. Whether another\n * table or a defined name has it is the workbook's to say.\n */\nexport function isValidTableName(name: string): boolean {\n // .NET's \\p{L} reads UTF-16 units, and no half of a surrogate pair is a letter.\n return name.length > 0 && name.length <= 255 && !/[\\uD800-\\uDFFF]/.test(name) && /^[\\p{L}_\\\\][\\p{L}\\p{Nd}_.]*$/u.test(name)\n && parseCell(name) === undefined && !/^[Rr][0-9]*[Cc][0-9]*$|^[RrCc]$/.test(name)\n && !equalsIgnoreCase(name, 'TRUE') && !equalsIgnoreCase(name, 'FALSE');\n}\n\n/** The cells the table covers, its header's included, as `A1:C4`. */\nexport function tableReference(table: XlsxTable): string {\n return `${formatCell(table.headerRow, table.firstColumn)}:${formatCell(table.headerRow + table.dataRows, table.firstColumn + table.columns.length - 1)}`;\n}\n\n/**\n * An element of a worksheet that the reader does not read, kept as far as a reader of the file needs to judge what it\n * holds: its name, its attributes, its text, and its children to `elementMaxDepth` levels, the first `elementMaxChildren`\n * of each. It is never the whole element, and is not written back.\n */\nexport interface XlsxElement {\n /** The element's local name, as `pageMargins`; an extension's without its prefix, as `conditionalFormattings`. */\n readonly name: string;\n /** Its attributes by local name (`r:id` is `id`), namespace declarations left out, in the file's order. */\n readonly attributes: ReadonlyMap<string, string>;\n /** Its child elements, the first `elementMaxChildren`, to `elementMaxDepth` levels below the worksheet's element. */\n readonly children: readonly XlsxElement[];\n /** Its own text, its first `elementMaxText` characters; null when it holds none. */\n readonly text: string | null;\n /** Whether it held children that `children` leaves out, past the limits. */\n readonly childrenCut: boolean;\n}\n\n/** The levels of children an `XlsxElement` keeps below a worksheet's element. */\nexport const elementMaxDepth = 3;\n\n/** The children an `XlsxElement` keeps of each element, in the file's order. */\nexport const elementMaxChildren = 16;\n\n/** The characters of an element's own text that an `XlsxElement` keeps. */\nexport const elementMaxText = 1024;\n", "// The escaping ECMA-376 gives text (ST_Xstring, Part 1, \u00A722.9.2.19), as ExGrid.Data.Xlsx's XString does it: a\n// character XML cannot carry is written `_xHHHH_`, and a literal `_x` that would read as one is written `_x005F_`\n// first. Excel writes a carriage return in a cell as `_x000D_`.\n\nfunction hexAt(text: string, at: number): number | undefined {\n const digits = text.slice(at, at + 4);\n return /^[0-9A-Fa-f]{4}$/.test(digits) ? Number.parseInt(digits, 16) : undefined;\n}\n\n/** The text an escaped one stands for: each whole `_xHHHH_` its character. */\nexport function decodeXString(text: string): string {\n let at = text.indexOf('_x');\n if (at < 0) return text;\n let out = '';\n let start = 0;\n while (at >= 0) {\n const code = at + 7 <= text.length && text.charAt(at + 6) === '_' ? hexAt(text, at + 2) : undefined;\n if (code !== undefined) {\n out += text.slice(start, at) + String.fromCharCode(code);\n start = at + 7;\n at = text.indexOf('_x', start);\n } else {\n at = text.indexOf('_x', at + 2);\n }\n }\n return out + text.slice(start);\n}\n\n/** A character XML 1.0 cannot carry, or a carriage return, which XML would turn into a line feed. */\nfunction escaped(c: number): boolean {\n return (c < 0x20 && c !== 0x09 && c !== 0x0a) || c === 0xfffe || c === 0xffff;\n}\n\nfunction looksEscaped(text: string, at: number): boolean {\n return at + 7 <= text.length && text.charAt(at + 1) === 'x' && text.charAt(at + 6) === '_' && hexAt(text, at + 2) !== undefined;\n}\n\n/** The text escaped as a file writes it. */\nexport function encodeXString(text: string): string {\n let needs = false;\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (c === 0x5f || escaped(c)) {\n needs = true;\n break;\n }\n }\n if (!needs) return text;\n let out = '';\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (escaped(c)) out += `_x${c.toString(16).toUpperCase().padStart(4, '0')}_`;\n else if (c === 0x5f && looksEscaped(text, i)) out += '_x005F_';\n else out += text.charAt(i);\n }\n return out;\n}\n\n/**\n * Whether XML 1.0 carries `text`: as it is, or, when `encoded`, once `encodeXString` has escaped it. Escaping carries\n * every control character, but no half of a surrogate pair without the other.\n */\nexport function carries(text: string, encoded: boolean): boolean {\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (c >= 0xd800 && c <= 0xdbff) {\n const next = i + 1 < text.length ? text.charCodeAt(i + 1) : 0;\n if (next >= 0xdc00 && next <= 0xdfff) {\n i++;\n continue;\n }\n return false;\n }\n if (c >= 0xdc00 && c <= 0xdfff) return false;\n if (!encoded && ((c < 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) || c === 0xfffe || c === 0xffff)) return false;\n }\n return true;\n}\n", "// A string item's text \u2014 a shared string's `<si>`, an inline string's `<is>` \u2014 as ExGrid.Data.Xlsx reads it.\n\nimport { decodeXString } from './x-string';\nimport type { XmlReader } from './xml-reader';\n\n/** The text of a string item (`<si>` or `<is>`), the reader on its start: its `<t>`, or its runs' `<t>`s in order, a\n * phonetic guide left out. Leaves the reader on its end. */\nexport function readText(xml: XmlReader): [string, boolean] {\n if (xml.isEmptyElement()) return ['', false];\n const depth = xml.depth();\n let text = '';\n let rich = false;\n xml.read();\n while (!xml.eof() && !(xml.nodeType() === 'endElement' && xml.depth() === depth)) {\n if (xml.nodeType() !== 'element') {\n xml.read();\n continue;\n }\n switch (xml.localName()) {\n case 't':\n text += xml.readElementContentAsString();\n break;\n case 'r':\n rich = true;\n if (xml.isEmptyElement()) xml.skip();\n else xml.read();\n break;\n default:\n // A run's properties, a phonetic guide and its properties: not text.\n xml.skip();\n break;\n }\n }\n return [decodeXString(text), rich];\n}\n", "// A streamed part read a step at a time. The XML reader holds the text that has arrived; a step reads items from it,\n// synchronously, while at least `margin` characters lie ahead, and ends asking for more, pausing for the pacer, or done.\n// An item larger than what lies ahead makes the reader throw `NeedMore`: the step is then rewound \u2014 the reader to the\n// mark taken before it, the caller's state by the rewind its `save` returned \u2014 and read again with more text.\n\nimport { NeedMore, type XmlReader } from './xml-reader';\n\n/** The text a step keeps ahead of the item it reads next: no item a workbook writes in its streamed parts comes near it,\n * so a step is rarely read twice. */\nconst margin = 64 * 1024;\n\n/** The text a step is given before it starts. */\nconst ahead = 1 << 20;\n\n/** How a step ended: wanting more text, its state kept; pausing for the pacer; or with nothing more to read. */\nexport type StepEnd = 'more' | 'pause' | 'done';\n\n/** Whether a step should end for more text before reading another item. */\nexport function low(xml: XmlReader): boolean {\n return !xml.ended() && xml.unread() < margin;\n}\n\n/**\n * Runs `step` until it pauses or is done, giving the reader more text whenever it asks. `save` is called before each\n * step and returns what puts the caller's state back, for a step read again.\n */\nexport async function runSteps(xml: XmlReader, save: () => () => void, step: () => StepEnd): Promise<'pause' | 'done'> {\n let want = ahead;\n for (;;) {\n await xml.fill(want);\n const mark = xml.snapshot();\n const rewind = save();\n let end: StepEnd;\n try {\n end = step();\n // oxlint-disable-next-line ex-grid/no-catch -- NeedMore never escapes: the step is read again with more text\n } catch (error) {\n if (!(error instanceof NeedMore)) throw error;\n xml.restore(mark);\n rewind();\n want = Math.max(want, xml.unread()) * 2;\n continue;\n }\n if (end !== 'more') return end;\n want = ahead;\n }\n}\n", "// An attribute's value read as ExGrid.Data.Xlsx's reader reads it, a value that is not one refused as malformed,\n// naming where it was met.\n\nimport { parseDouble, parseInt32 } from './invariant';\nimport { XlsxError, type XlsxPlace } from './xlsx-error';\n\n/** An `xsd:boolean` that is true: `1` or `true`. Anything else, an absent attribute included, is false. */\nexport function bool(value: string | undefined): boolean {\n return value === '1' || value === 'true';\n}\n\n/** A whole number, as `int.TryParse` with a leading sign reads it. */\nexport function int(value: string, where: XlsxPlace): number {\n const n = parseInt32(value);\n if (n === undefined) throw new XlsxError('malformed', `'${value}' is not a whole number where the part needs one.`, where);\n return n;\n}\n\n/** A number, as `double.TryParse` with `NumberStyles.Float` reads it. */\nexport function double(value: string, part: string): number {\n const n = parseDouble(value);\n if (n === undefined) throw new XlsxError('malformed', `'${value}' is not a number where the part needs one.`, { part });\n return n;\n}\n", "// One worksheet's cells read as a stream (ADR-0330 \u00A79), as ExGrid.Data.Xlsx's XlsxSheetReader reads them: `read` reads\n// the next batch into `cells`, row by row as the file holds them, and between batches the read reports its progress and\n// yields once a slice has spent its budget. The worksheet is never held as a document; only the batch at hand is, and\n// the text it was read from.\n\nimport { formatCell, maxColumns, maxRows, parseCell } from './cell-reference';\nimport { parseDigits } from './invariant';\nimport { elementAt, unreachable } from './must';\nimport {\n elementMaxChildren, elementMaxDepth, elementMaxText,\n type XlsxCell, type XlsxCellType, type XlsxColumn, type XlsxElement, type XlsxFormula, type XlsxFormulaKind, type XlsxRow,\n type XlsxSheetInfo,\n} from './model';\nimport { strictPrefix } from './names';\nimport { Package, type PartXml } from './package';\nimport { readText } from './string-item';\nimport type { XlsxSharedStrings } from './shared-strings';\nimport { low, runSteps, type StepEnd } from './steps';\nimport type { XlsxStyles } from './styles';\nimport { bool, double, int } from './values';\nimport { decodeXString } from './x-string';\nimport { XlsxError } from './xlsx-error';\nimport { XmlError } from './xml-reader';\n\n/** The cells a batch holds at most. */\nexport const batchSize = 4096;\n\n/** What a worksheet's reader asks of the workbook's. */\nexport interface SheetOwner {\n readonly styles: XlsxStyles;\n sharedStrings(): XlsxSharedStrings;\n isDynamicArray(cellMetadata: number): boolean;\n countCell(sheet: XlsxSheetInfo, row: number, column: number): void;\n cells(): number;\n rewindCells(to: number): void;\n countBytes(bytes: number): void;\n checkpoint(sheet: number): Promise<void>;\n report(sheet: number): void;\n closed(): void;\n}\n\ntype State = 'start' | 'head' | 'cells' | 'tail' | 'finished';\n\n/**\n * One worksheet's cells read as a stream (ADR-0330 \u00A79): `read` reads the next batch into `cells`, row by row as the file\n * holds them, and between batches the read reports its progress and yields once a slice has spent its budget. Made by\n * `XlsxReader.openSheet`; close it before opening the next.\n */\nexport interface XlsxSheetReader {\n /** The sheet as the workbook lists it. */\n readonly sheet: XlsxSheetInfo;\n /** The cells of the batch the last `read` read, in the file's order. */\n readonly cells: readonly XlsxCell[];\n /** The rows the last `read` began that record a cell format of their own (`customFormat`), in the file's order. A row\n * comes in the batch that holds its first cell, or in an earlier one. */\n readonly rows: readonly XlsxRow[];\n /** The worksheet's column widths, complete once the first `read` has returned: they come before the cells. */\n readonly columns: readonly XlsxColumn[];\n /**\n * Every element of the worksheet the reader does not read, beside its cells and columns, in the file's order, complete\n * once `read` has returned false: `dimension`, `sheetViews` (of which only `frozenPanes` is read), `sheetFormatPr`,\n * `mergeCells`, `conditionalFormatting`, `dataValidations`, `hyperlinks`, `drawing`, `legacyDrawing` (notes),\n * `tableParts`, `sheetProtection`, `pageMargins`, `pageSetup`, `extLst` and the rest, each as far as `XlsxElement`\n * keeps it. None of it is judged here: whether an element holds anything that matters is for the reader of the file to\n * say.\n */\n readonly otherElements: readonly XlsxElement[];\n /** Whether a row read so far sets a height of its own. */\n readonly customRowHeights: boolean;\n /** Whether a row read so far is hidden. */\n readonly hiddenRows: boolean;\n /** Whether the sheet's view freezes panes; known once the first `read` has returned. */\n readonly frozenPanes: boolean;\n /** Reads the next batch of cells into `cells`; false when the worksheet has no more. Refuses the file by name\n * (`XlsxError`) on a cell it cannot read, or past the read's cells. */\n read(): Promise<boolean>;\n /** Closes the worksheet's part. */\n close(): Promise<void>;\n}\n\nexport class SheetReader implements XlsxSheetReader {\n readonly #owner: SheetOwner;\n readonly #index: number;\n readonly #part: string;\n readonly #opened: PartXml;\n readonly #batch: XlsxCell[] = [];\n readonly #columns: XlsxColumn[] = [];\n readonly #rows: XlsxRow[] = [];\n readonly #other: XlsxElement[] = [];\n #state: State = 'start';\n #row = -1;\n #column = -1;\n #reported = 0;\n #customRowHeights = false;\n #hiddenRows = false;\n #frozenPanes = false;\n #closed = false;\n\n /** The sheet as the workbook lists it. */\n readonly sheet: XlsxSheetInfo;\n\n constructor(owner: SheetOwner, index: number, sheet: XlsxSheetInfo, part: string, opened: PartXml) {\n this.#owner = owner;\n this.#index = index;\n this.sheet = sheet;\n this.#part = part;\n this.#opened = opened;\n }\n\n /** The cells of the batch the last `read` read, in the file's order. */\n get cells(): readonly XlsxCell[] {\n return this.#batch;\n }\n\n /** The rows the last `read` began that record a cell format of their own (`customFormat`), in the file's order. A row\n * comes in the batch that holds its first cell, or in an earlier one. */\n get rows(): readonly XlsxRow[] {\n return this.#rows;\n }\n\n /** The worksheet's column widths, complete once the first `read` has returned: they come before the cells. */\n get columns(): readonly XlsxColumn[] {\n return this.#columns;\n }\n\n /**\n * Every element of the worksheet the reader does not read, beside its cells and columns, in the file's order, complete\n * once `read` has returned false: `dimension`, `sheetViews` (of which only `frozenPanes` is read), `sheetFormatPr`,\n * `mergeCells`, `conditionalFormatting`, `dataValidations`, `hyperlinks`, `drawing`, `legacyDrawing` (notes),\n * `tableParts`, `sheetProtection`, `pageMargins`, `pageSetup`, `extLst` and the rest, each as far as `XlsxElement`\n * keeps it. None of it is judged here: whether an element holds anything that matters is for the reader of the file to\n * say.\n */\n get otherElements(): readonly XlsxElement[] {\n return this.#other;\n }\n\n /** Whether a row read so far sets a height of its own. */\n get customRowHeights(): boolean {\n return this.#customRowHeights;\n }\n\n /** Whether a row read so far is hidden. */\n get hiddenRows(): boolean {\n return this.#hiddenRows;\n }\n\n /** Whether the sheet's view freezes panes; known once the first `read` has returned. */\n get frozenPanes(): boolean {\n return this.#frozenPanes;\n }\n\n /**\n * Reads the next batch of cells into `cells`; false when the worksheet has no more. Refuses the file by name\n * (`XlsxError`) on a cell it cannot read, or past the read's cells.\n */\n async read(): Promise<boolean> {\n if (this.#closed) throw new Error('The worksheet reader is closed.');\n this.#batch.length = 0;\n this.#rows.length = 0;\n if (this.#finished()) return false;\n await this.#owner.checkpoint(this.#index);\n const { xml, bytes } = this.#opened;\n try {\n await runSteps(xml, () => this.#save(), () => this.#step());\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, this.#opened, this.#part, this.sheet.name);\n throw error;\n } finally {\n this.#owner.countBytes(bytes.bytesRead - this.#reported);\n this.#reported = bytes.bytesRead;\n }\n if (this.#finished()) {\n this.#owner.report(this.#index);\n await bytes.close();\n }\n // A last batch of formatted rows with no cell is still a batch: their formats are read.\n return this.#batch.length > 0 || this.#rows.length > 0 || !this.#finished();\n }\n\n #finished(): boolean {\n return this.#stateIs('finished');\n }\n\n /** The state, read where a call before may have changed it. */\n #stateIs(state: State): boolean {\n return this.#state === state;\n }\n\n /** Closes the worksheet's part. */\n async close(): Promise<void> {\n if (this.#closed) return;\n this.#closed = true;\n this.#owner.closed();\n await this.#opened.bytes.close();\n }\n\n /** What puts the reader back where a step began, for a step read again with more text. */\n #save(): () => void {\n const state = this.#state;\n const row = this.#row;\n const column = this.#column;\n const batch = this.#batch.length;\n const rows = this.#rows.length;\n const columns = this.#columns.length;\n const other = this.#other.length;\n const flags = [this.#customRowHeights, this.#hiddenRows, this.#frozenPanes] as const;\n const cells = this.#owner.cells();\n return () => {\n this.#state = state;\n this.#row = row;\n this.#column = column;\n this.#batch.length = batch;\n this.#rows.length = rows;\n this.#columns.length = columns;\n this.#other.length = other;\n [this.#customRowHeights, this.#hiddenRows, this.#frozenPanes] = flags;\n this.#owner.rewindCells(cells);\n };\n }\n\n #step(): StepEnd {\n if (this.#state === 'start') this.#readRoot();\n if (this.#state === 'head' && this.#readHead() === 'more') return 'more';\n if (this.#state === 'cells') {\n const end = this.#readCells();\n if (end !== 'done' || this.#stateIs('cells')) return end;\n }\n if (this.#state === 'tail' && this.#readTail() === 'more') return 'more';\n return 'done';\n }\n\n #where(cell?: string): { part: string; sheet: string; cell?: string } {\n return cell === undefined ? { part: this.#part, sheet: this.sheet.name } : { part: this.#part, sheet: this.sheet.name, cell };\n }\n\n /** Reads the root, and refuses a worksheet that is not one. */\n #readRoot(): void {\n const xml = this.#opened.xml;\n xml.moveToContent();\n if (xml.namespaceUri().startsWith(strictPrefix)) {\n throw new XlsxError('strictOpenXml', 'The worksheet is saved as Strict Open XML, which is not read.', this.#where());\n }\n if (xml.localName() !== 'worksheet') throw new XlsxError('malformed', `The worksheet part's root is <${xml.localName()}>, not <worksheet>.`, this.#where());\n if (xml.isEmptyElement()) {\n this.#state = 'tail';\n return;\n }\n xml.read();\n this.#state = 'head';\n }\n\n /** Reads the children before `<sheetData>`. */\n #readHead(): 'more' | 'done' {\n const xml = this.#opened.xml;\n while (!xml.eof() && !(xml.nodeType() === 'endElement' && xml.depth() === 0)) {\n if (xml.nodeType() !== 'element') {\n xml.read();\n continue;\n }\n if (low(xml)) return 'more';\n switch (xml.localName()) {\n case 'sheetData':\n this.#state = xml.isEmptyElement() ? 'tail' : 'cells';\n xml.read();\n return 'done';\n case 'cols':\n this.#readColumns();\n break;\n case 'sheetViews': {\n const views = this.#readElement(0);\n this.#other.push(views);\n this.#frozenPanes = views.children.some(view => view.children.some(pane => {\n const state = pane.attributes.get('state');\n return pane.name === 'pane' && (state === 'frozen' || state === 'frozenSplit');\n }));\n break;\n }\n default:\n this.#other.push(this.#readElement(0));\n break;\n }\n }\n this.#state = 'tail';\n return 'done';\n }\n\n #readColumns(): void {\n const xml = this.#opened.xml;\n if (xml.isEmptyElement()) {\n xml.read();\n return;\n }\n const depth = xml.depth();\n const sheet = this.sheet.name;\n const part = this.#part;\n xml.read();\n while (!xml.eof() && !(xml.nodeType() === 'endElement' && xml.depth() === depth)) {\n if (xml.nodeType() === 'element' && xml.localName() === 'col') {\n const a = xml.getAttribute('min');\n const b = xml.getAttribute('max');\n const min = a === undefined ? 0 : int(a, { part, sheet });\n const max = b === undefined ? min : int(b, { part, sheet });\n if (min < 1 || max < min || max > maxColumns) {\n throw new XlsxError('malformed', `A column range ${String(min)} to ${String(max)} lies outside the sheet's columns.`, { part, sheet });\n }\n const w = xml.getAttribute('width');\n const width = w === undefined ? null : double(w, part);\n const hidden = bool(xml.getAttribute('hidden'));\n const s = xml.getAttribute('style');\n const style = s === undefined ? 0 : int(s, { part, sheet });\n if (style < 0 || style >= this.#owner.styles.cellFormats.length) {\n throw new XlsxError('malformed',\n `The columns ${String(min)} to ${String(max)} name the cell format ${String(style)}, which the styles do not hold.`, { part, sheet });\n }\n this.#columns.push(Object.freeze({\n first: min - 1, last: max - 1, width, hidden, styleIndex: style, bestFit: bool(xml.getAttribute('bestFit')),\n customWidth: width === null || bool(xml.getAttribute('customWidth')),\n }));\n }\n if (xml.nodeType() === 'element') xml.skip();\n else xml.read();\n }\n xml.read();\n }\n\n /** The element at the reader, kept as `XlsxElement` keeps it, `depth` levels below the worksheet's element; the reader\n * is left past its end. */\n #readElement(depth: number): XlsxElement {\n const xml = this.#opened.xml;\n const name = xml.localName();\n const attributes = new Map<string, string>();\n for (const attribute of xml.attributes()) {\n if (attribute.namespaceUri !== 'http://www.w3.org/2000/xmlns/' && !attributes.has(attribute.localName)) {\n attributes.set(attribute.localName, attribute.value);\n }\n }\n if (xml.isEmptyElement()) {\n xml.read();\n return Object.freeze({ name, attributes, children: Object.freeze([]), text: null, childrenCut: false });\n }\n const children: XlsxElement[] = [];\n let text: string | null = null;\n let cut = false;\n const end = xml.depth();\n xml.read();\n while (!xml.eof() && !(xml.nodeType() === 'endElement' && xml.depth() === end)) {\n const node = xml.nodeType();\n switch (node) {\n case 'element':\n if (depth < elementMaxDepth && children.length < elementMaxChildren) {\n children.push(this.#readElement(depth + 1));\n } else {\n cut = true;\n xml.skip();\n }\n break;\n case 'text':\n case 'cdata':\n case 'significantWhitespace': {\n const kept: string = text === null ? '' : text;\n text = kept + xml.value().slice(0, elementMaxText - kept.length);\n xml.read();\n break;\n }\n case 'whitespace':\n case 'endElement':\n case 'none':\n xml.read();\n break;\n default:\n unreachable(node);\n }\n }\n xml.read();\n return Object.freeze({ name, attributes, children: Object.freeze(children), text, childrenCut: cut });\n }\n\n /** Reads cells until the batch is full, `<sheetData>` ends, or the text ahead runs low. */\n #readCells(): 'more' | 'done' {\n const xml = this.#opened.xml;\n // Formatted rows count toward the batch, so that rows formatted with no cell are not gathered without end.\n while (this.#batch.length + this.#rows.length < batchSize) {\n if (xml.eof()) throw new XlsxError('malformed', 'The worksheet ends inside its cells.', this.#where());\n if (low(xml)) return 'more';\n const node = xml.nodeType();\n switch (node) {\n case 'element':\n if (xml.localName() === 'row') {\n this.#startRow();\n if (xml.isEmptyElement()) xml.skip();\n else xml.read();\n } else if (xml.localName() === 'c') {\n this.#readCell();\n } else {\n xml.skip();\n }\n break;\n case 'endElement':\n if (xml.localName() === 'sheetData') {\n xml.read();\n this.#state = 'tail';\n return 'done';\n }\n xml.read();\n break;\n case 'text':\n case 'cdata':\n case 'whitespace':\n case 'significantWhitespace':\n case 'none':\n xml.read();\n break;\n default:\n unreachable(node);\n }\n }\n return 'done';\n }\n\n #startRow(): void {\n const xml = this.#opened.xml;\n const where = this.#where();\n let r = this.#row + 1;\n let style: string | undefined;\n let customFormat = false;\n for (const attribute of xml.attributes()) {\n switch (attribute.localName) {\n case 'r':\n r = int(attribute.value, where) - 1;\n break;\n case 'customHeight':\n if (bool(attribute.value)) this.#customRowHeights = true;\n break;\n case 'hidden':\n if (bool(attribute.value)) this.#hiddenRows = true;\n break;\n case 's':\n style = attribute.value;\n break;\n case 'customFormat':\n customFormat = bool(attribute.value);\n break;\n default:\n break;\n }\n }\n if (r < 0 || r >= maxRows) throw new XlsxError('malformed', `Row ${String(r + 1)} lies outside the sheet's rows.`, where);\n if (r <= this.#row) {\n throw new XlsxError('malformed', `Row ${String(r + 1)} comes after row ${String(this.#row + 1)}: a worksheet's rows are in order, each once.`, where);\n }\n this.#row = r;\n this.#column = -1;\n if (!customFormat) return;\n // A row's s counts only beside customFormat (ECMA-376 Part 1, \u00A718.3.1.73); without it the row records no format.\n const index = style === undefined ? 0 : int(style, where);\n if (index < 0 || index >= this.#owner.styles.cellFormats.length) {\n throw new XlsxError('malformed', `Row ${String(r + 1)} names the cell format ${String(index)}, which the styles do not hold.`, where);\n }\n this.#rows.push(Object.freeze({ row: r, styleIndex: index }));\n }\n\n #readCell(): void {\n const xml = this.#opened.xml;\n let reference: string | undefined;\n let type: string | undefined;\n let style: string | undefined;\n let metadata: string | undefined;\n for (const attribute of xml.attributes()) {\n switch (attribute.localName) {\n case 'r': reference = attribute.value; break;\n case 't': type = attribute.value; break;\n case 's': style = attribute.value; break;\n case 'cm': metadata = attribute.value; break;\n default: break;\n }\n }\n let r: number;\n let c: number;\n if (reference === undefined) {\n r = this.#row < 0 ? 0 : this.#row;\n c = this.#column + 1;\n if (c >= maxColumns) throw new XlsxError('malformed', 'A cell lies past the sheet\\'s last column.', this.#where());\n } else {\n const place = parseCell(reference);\n if (place === undefined) throw new XlsxError('malformed', `'${reference}' is not a cell of the sheet.`, this.#where());\n r = place.row;\n c = place.column;\n if (this.#row >= 0 && r !== this.#row) {\n throw new XlsxError('malformed', `The cell is written inside row ${String(this.#row + 1)}, not its own.`, this.#where(reference));\n }\n if (c <= this.#column) {\n throw new XlsxError('malformed',\n `The cell comes after ${formatCell(r, this.#column)}: a row's cells are in order, each once.`, this.#where(reference));\n }\n }\n this.#row = r;\n this.#column = c;\n this.#owner.countCell(this.sheet, r, c);\n const at = (): { part: string; sheet: string; cell?: string } => this.#where(formatCell(r, c));\n const cellType = cellTypeOf(type, at);\n const styleIndex = style === undefined ? 0 : int(style, at());\n if (styleIndex < 0 || styleIndex >= this.#owner.styles.cellFormats.length) {\n throw new XlsxError('malformed', `The cell names the cell format ${String(styleIndex)}, which the styles do not hold.`, at());\n }\n let value: string | null = null;\n let text: string | null = null;\n let formula: XlsxFormula | null = null;\n let rich = false;\n if (xml.isEmptyElement()) {\n xml.read();\n } else {\n const depth = xml.depth();\n xml.read();\n while (!xml.eof() && !(xml.nodeType() === 'endElement' && xml.depth() === depth)) {\n if (xml.nodeType() !== 'element') {\n xml.read();\n continue;\n }\n switch (xml.localName()) {\n case 'v':\n value = xml.readElementContentAsString();\n break;\n case 'f':\n formula = this.#readFormula(metadata, at);\n break;\n case 'is':\n [text, rich] = readText(xml);\n xml.read();\n break;\n default:\n xml.skip();\n break;\n }\n }\n xml.read();\n }\n switch (cellType) {\n case 'sharedString': {\n const strings = this.#owner.sharedStrings();\n const index = value === null ? undefined : parseDigits(value);\n if (index === undefined || index >= strings.count) {\n throw new XlsxError('malformed', `The cell names the shared string '${value === null ? '' : value}', which the workbook does not hold.`, at());\n }\n text = elementAt(strings.texts, index);\n rich = strings.isRich(index);\n break;\n }\n case 'inlineString':\n if (text === null) text = '';\n break;\n case 'formulaString':\n if (value !== null) value = decodeXString(value);\n break;\n case 'number':\n case 'boolean':\n case 'error':\n case 'date':\n break;\n default:\n return unreachableType(cellType);\n }\n this.#batch.push(Object.freeze({ row: r, column: c, type: cellType, value, text, formula, styleIndex, isRichText: rich }));\n }\n\n #readFormula(metadata: string | undefined, at: () => { part: string; sheet: string; cell?: string }): XlsxFormula {\n const xml = this.#opened.xml;\n let kind: string | undefined;\n let reference: string | undefined;\n let shared: string | undefined;\n for (const attribute of xml.attributes()) {\n switch (attribute.localName) {\n case 't': kind = attribute.value; break;\n case 'ref': reference = attribute.value; break;\n case 'si': shared = attribute.value; break;\n default: break;\n }\n }\n const formulaKind = formulaKindOf(kind, at);\n const sharedIndex = shared === undefined ? null : int(shared, at());\n if (formulaKind === 'shared' && sharedIndex === null) throw new XlsxError('malformed', 'A shared formula names no group (si).', at());\n const cm = metadata === undefined ? undefined : parseDigits(metadata);\n const isDynamicArray = formulaKind === 'array' && cm !== undefined && this.#owner.isDynamicArray(cm);\n const text = decodeXString(xml.readElementContentAsString());\n return Object.freeze({ text, kind: formulaKind, reference: reference === undefined ? null : reference, sharedIndex, isDynamicArray });\n }\n\n /** Reads what follows the cells, to the part's end. */\n #readTail(): 'more' | 'done' {\n const xml = this.#opened.xml;\n while (!xml.eof()) {\n if (xml.nodeType() === 'element') {\n if (low(xml)) return 'more';\n this.#other.push(this.#readElement(0));\n } else {\n xml.read();\n }\n }\n this.#state = 'finished';\n return 'done';\n }\n}\n\nfunction cellTypeOf(type: string | undefined, at: () => { part: string; sheet: string; cell?: string }): XlsxCellType {\n switch (type) {\n case undefined:\n case 'n': return 'number';\n case 's': return 'sharedString';\n case 'inlineStr': return 'inlineString';\n case 'str': return 'formulaString';\n case 'b': return 'boolean';\n case 'e': return 'error';\n case 'd': return 'date';\n default: throw new XlsxError('malformed', `'${type}' is not a cell type.`, at());\n }\n}\n\nfunction formulaKindOf(kind: string | undefined, at: () => { part: string; sheet: string; cell?: string }): XlsxFormulaKind {\n switch (kind) {\n case undefined:\n case 'normal': return 'normal';\n case 'shared': return 'shared';\n case 'array': return 'array';\n case 'dataTable': return 'dataTable';\n default: throw new XlsxError('malformed', `'${kind}' is not a kind of Formula.`, at());\n }\n}\n\nfunction unreachableType(type: never): never {\n throw new Error(`Internal: ${String(type)} is not a cell's type.`);\n}\n", "// The styles part as far as ADR-0330 \u00A74 carries it, as ExGrid.Data.Xlsx's records hold it: the custom Number Formats,\n// the fonts, fills and borders, and the cell formats that cells point at.\n\n/** What a colour names (ECMA-376 `CT_Color`). */\nexport type XlsxColorKind =\n /** The automatic colour (`auto=\"1\"`): the window's text or background, as the place it colours decides. */\n | 'automatic'\n /** An ARGB value (`rgb`). */\n | 'rgb'\n /** A slot of the workbook's theme (`theme`), resolved through `XlsxTheme`. */\n | 'theme'\n /** An entry of the legacy indexed palette (`indexed`). */\n | 'indexed';\n\n/** A colour as the file writes it: an ARGB value, a theme slot, an indexed entry or the automatic colour, each with a\n * tint. `XlsxTheme.resolve` turns it into the RGB Excel paints (ADR-0330 \u00A78). */\nexport interface XlsxColor {\n /** What the colour names. */\n readonly kind: XlsxColorKind;\n /** The ARGB value for `rgb` (alpha in the high byte, unsigned), the theme slot for `theme`, the palette index for\n * `indexed`; 0 for `automatic`. */\n readonly value: number;\n /** How far the colour is lightened (positive, up to 1) or darkened (negative, down to -1); 0 for none. */\n readonly tint: number;\n}\n\n/** How a font underlines (ECMA-376 `ST_UnderlineValues`). */\nexport type XlsxUnderline = 'none' | 'single' | 'double' | 'singleAccounting' | 'doubleAccounting';\n\n/** A font of the styles part. */\nexport interface XlsxFont {\n /** The typeface, as `Calibri`, or null. */\n readonly name: string | null;\n /** The size in points, or null. */\n readonly size: number | null;\n /** Whether it is bold. */\n readonly bold: boolean;\n /** Whether it is italic. */\n readonly italic: boolean;\n /** How it is underlined. */\n readonly underline: XlsxUnderline;\n /** Whether it is struck through. */\n readonly strike: boolean;\n /** Its colour, or null for none written. */\n readonly color: XlsxColor | null;\n}\n\n/** A fill of the styles part. */\nexport interface XlsxFill {\n /** The pattern, as ECMA-376 `ST_PatternType` names it: `none`, `solid`, `gray125`, \u2026; null for a gradient fill. */\n readonly pattern: string | null;\n /** The pattern's foreground colour \u2014 a solid fill's colour \u2014 or null. */\n readonly foreground: XlsxColor | null;\n /** The pattern's background colour, or null. */\n readonly background: XlsxColor | null;\n /** Whether it is a gradient fill, which carries no pattern. */\n readonly isGradient: boolean;\n}\n\n/** A border line's style: none, or one of Excel's thirteen (ECMA-376 `ST_BorderStyle`). */\nexport type XlsxBorderStyle =\n | 'none' | 'thin' | 'medium' | 'dashed' | 'dotted' | 'thick' | 'double' | 'hair'\n | 'mediumDashed' | 'dashDot' | 'mediumDashDot' | 'dashDotDot' | 'mediumDashDotDot' | 'slantDashDot';\n\n/** One edge of a border: its line style and colour. */\nexport interface XlsxBorderEdge {\n /** The line's style; `none` for no line. */\n readonly style: XlsxBorderStyle;\n /** The line's colour, or null for none written. */\n readonly color: XlsxColor | null;\n}\n\n/** A border of the styles part: four edges and a diagonal. */\nexport interface XlsxBorder {\n /** The left edge. */\n readonly left: XlsxBorderEdge;\n /** The right edge. */\n readonly right: XlsxBorderEdge;\n /** The top edge. */\n readonly top: XlsxBorderEdge;\n /** The bottom edge. */\n readonly bottom: XlsxBorderEdge;\n /** The diagonal line, drawn where `diagonalUp` or `diagonalDown` says. */\n readonly diagonal: XlsxBorderEdge;\n /** Whether the diagonal rises from bottom left to top right. */\n readonly diagonalUp: boolean;\n /** Whether the diagonal falls from top left to bottom right. */\n readonly diagonalDown: boolean;\n}\n\n/** A cell's horizontal alignment (ECMA-376 `ST_HorizontalAlignment`). */\nexport type XlsxHorizontalAlignment = 'general' | 'left' | 'center' | 'right' | 'fill' | 'justify' | 'centerContinuous' | 'distributed';\n\n/** A cell's vertical alignment (ECMA-376 `ST_VerticalAlignment`). */\nexport type XlsxVerticalAlignment = 'bottom' | 'top' | 'center' | 'justify' | 'distributed';\n\n/** A cell's alignment, as an `<alignment>` writes it. */\nexport interface XlsxAlignment {\n /** Where the text lies across the cell. */\n readonly horizontal: XlsxHorizontalAlignment;\n /** Where the text lies up and down the cell. */\n readonly vertical: XlsxVerticalAlignment;\n /** Whether the text wraps onto more lines. */\n readonly wrapText: boolean;\n /** The indent, in steps. */\n readonly indent: number;\n /** The rotation, as the file writes it: 0 to 180, or 255 for stacked text. */\n readonly textRotation: number;\n /** Whether the text shrinks to fit the cell's width. */\n readonly shrinkToFit: boolean;\n}\n\n/** A cell format (`<xf>` of `cellXfs`): what a cell's style index points at. */\nexport interface XlsxCellFormat {\n /** The Number Format's id: a built-in one below 164, or one of the styles' own. */\n readonly numberFormatId: number;\n /** The index of its font in the styles' fonts. */\n readonly fontId: number;\n /** The index of its fill in the styles' fills. */\n readonly fillId: number;\n /** The index of its border in the styles' borders. */\n readonly borderId: number;\n /** The alignment, or null when the format writes none. */\n readonly alignment: XlsxAlignment | null;\n}\n\n/**\n * The styles part as far as ADR-0330 \u00A74 carries it: the custom Number Formats, the fonts, fills and borders, and the cell\n * formats that cells point at. What else the part holds (named cell styles, differential formats, table styles) is not\n * read.\n */\nexport interface XlsxStyles {\n /** The custom Number Formats by id (164 and above, or a built-in id written over), each its format code. */\n readonly numberFormats: ReadonlyMap<number, string>;\n /** The fonts, which a cell format names by index. */\n readonly fonts: readonly XlsxFont[];\n /** The fills, the first two of which Excel reserves: `none` and `gray125`. */\n readonly fills: readonly XlsxFill[];\n /** The borders, which a cell format names by index. */\n readonly borders: readonly XlsxBorder[];\n /** The cell formats, which a cell's style index names; the first is the one a cell of no style takes. */\n readonly cellFormats: readonly XlsxCellFormat[];\n /** The indexed palette written over (`<colors><indexedColors>`), as ARGB values, or null when the file keeps the default one. */\n readonly indexedColors: readonly number[] | null;\n}\n\n/** The automatic colour. */\nexport const automaticColor: XlsxColor = Object.freeze({ kind: 'automatic', value: 0, tint: 0 });\n\n/** An ARGB value, as `0xFF4472C4`. */\nexport function rgbColor(argb: number, tint = 0): XlsxColor {\n return Object.freeze({ kind: 'rgb', value: argb >>> 0, tint });\n}\n\n/** A theme slot, with a tint: 0 Background 1, 1 Text 1, 2 Background 2, 3 Text 2, 4 to 9 Accents 1 to 6, 10 Hyperlink,\n * 11 Followed Hyperlink. */\nexport function themeColor(slot: number, tint = 0): XlsxColor {\n return Object.freeze({ kind: 'theme', value: slot >>> 0, tint });\n}\n\n/** An entry of the indexed palette, 0 to 65. */\nexport function indexedColor(index: number, tint = 0): XlsxColor {\n return Object.freeze({ kind: 'indexed', value: index >>> 0, tint });\n}\n\n/** No line. */\nexport const noBorderEdge: XlsxBorderEdge = Object.freeze({ style: 'none', color: null });\n\n/** No border: the first border of every styles part. */\nexport const noBorder: XlsxBorder = Object.freeze({\n left: noBorderEdge, right: noBorderEdge, top: noBorderEdge, bottom: noBorderEdge, diagonal: noBorderEdge, diagonalUp: false, diagonalDown: false,\n});\n\n/** No fill: the first fill of every styles part. */\nexport const noFill: XlsxFill = Object.freeze({ pattern: 'none', foreground: null, background: null, isGradient: false });\n\n/** The 12.5% grey pattern Excel reserves as every styles part's second fill. */\nexport const gray125Fill: XlsxFill = Object.freeze({ pattern: 'gray125', foreground: null, background: null, isGradient: false });\n\n/** A solid fill of `color`. */\nexport function solidFill(color: XlsxColor): XlsxFill {\n return Object.freeze({ pattern: 'solid', foreground: color, background: null, isGradient: false });\n}\n\n/** The alignment of a cell that writes none. */\nexport const defaultAlignment: XlsxAlignment = Object.freeze({\n horizontal: 'general', vertical: 'bottom', wrapText: false, indent: 0, textRotation: 0, shrinkToFit: false,\n});\n\n/** A map nobody can change: the default styles are shared by every workbook that takes them. */\nclass FrozenMap<K, V> extends Map<K, V> {\n constructor(entries: readonly (readonly [K, V])[]) {\n super(entries);\n Object.freeze(this);\n }\n\n override set(key: K, value: V): this {\n if (Object.isFrozen(this)) throw new TypeError('The default styles cannot be changed.');\n return super.set(key, value);\n }\n\n override delete(): boolean {\n throw new TypeError('The default styles cannot be changed.');\n }\n\n override clear(): void {\n throw new TypeError('The default styles cannot be changed.');\n }\n}\n\n/** The styles of a workbook that styles nothing: Calibri 11, no fill (and the reserved grey), no border, and one cell\n * format of all four. */\nexport const defaultStyles: XlsxStyles = Object.freeze({\n numberFormats: new FrozenMap<number, string>([]),\n fonts: Object.freeze([Object.freeze({\n name: 'Calibri', size: 11, bold: false, italic: false, underline: 'none', strike: false, color: themeColor(1),\n } satisfies XlsxFont)]),\n fills: Object.freeze([noFill, gray125Fill]),\n borders: Object.freeze([noBorder]),\n cellFormats: Object.freeze([Object.freeze({ numberFormatId: 0, fontId: 0, fillId: 0, borderId: 0, alignment: null } satisfies XlsxCellFormat)]),\n indexedColors: null,\n});\n\n/** The first Number Format id a styles part defines for itself; the ones below it are built in. */\nexport const firstCustomNumberFormat = 164;\n\nexport const borderStyleNames: readonly XlsxBorderStyle[] = [\n 'none', 'thin', 'medium', 'dashed', 'dotted', 'thick', 'double', 'hair',\n 'mediumDashed', 'dashDot', 'mediumDashDot', 'dashDotDot', 'mediumDashDotDot', 'slantDashDot',\n];\n\nexport const horizontalNames: readonly XlsxHorizontalAlignment[] = ['general', 'left', 'center', 'right', 'fill', 'justify', 'centerContinuous', 'distributed'];\n\nexport const verticalNames: readonly XlsxVerticalAlignment[] = ['bottom', 'top', 'center', 'justify', 'distributed'];\n", "// The styles part read as far as ADR-0330 \u00A74 carries it, and nothing past it, as ExGrid.Data.Xlsx's StylesReader\n// reads it. The part is small and is read whole.\n\nimport { parseHex32 } from './invariant';\nimport { Package } from './package';\nimport {\n borderStyleNames, defaultStyles, firstCustomNumberFormat, horizontalNames, noBorderEdge, noFill, verticalNames,\n type XlsxAlignment, type XlsxBorder, type XlsxBorderEdge, type XlsxBorderStyle, type XlsxCellFormat, type XlsxColor,\n type XlsxFill, type XlsxFont, type XlsxStyles, type XlsxUnderline,\n} from './styles';\nimport { decodeXString } from './x-string';\nimport { XlsxError } from './xlsx-error';\nimport { XmlError, type XmlReader } from './xml-reader';\nimport { bool, double, int } from './values';\n\nexport async function readStyles(pkg: Package, part: string): Promise<XlsxStyles> {\n const opened = await pkg.readXml(part);\n if (opened === undefined) return defaultStyles;\n const numberFormats = new Map<number, string>();\n const fonts: XlsxFont[] = [];\n const fills: XlsxFill[] = [];\n const borders: XlsxBorder[] = [];\n const cellFormats: XlsxCellFormat[] = [];\n let indexed: number[] | null = null;\n const xml = opened.xml;\n try {\n xml.moveToContent();\n if (xml.isEmptyElement()) return defaultStyles;\n const depth = xml.depth();\n xml.read();\n while (!xml.eof() && !(xml.nodeType() === 'endElement' && xml.depth() === depth)) {\n if (xml.nodeType() !== 'element') {\n xml.read();\n continue;\n }\n switch (xml.localName()) {\n case 'numFmts':\n children(xml, 'numFmt', () => {\n const id = xml.getAttribute('numFmtId');\n const code = xml.getAttribute('formatCode');\n if (id !== undefined && code !== undefined) numberFormats.set(int(id, { part }), decodeXString(code));\n });\n break;\n case 'fonts':\n children(xml, 'font', () => fonts.push(readFont(xml, part)));\n break;\n case 'fills':\n children(xml, 'fill', () => fills.push(readFill(xml, part)));\n break;\n case 'borders':\n children(xml, 'border', () => borders.push(readBorder(xml, part)));\n break;\n case 'cellXfs':\n children(xml, 'xf', () => cellFormats.push(readCellFormat(xml, part)));\n break;\n case 'colors':\n indexed = readIndexedColors(xml, part);\n break;\n default:\n xml.skip();\n break;\n }\n }\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, opened, part);\n throw error;\n }\n if (fonts.length === 0) fonts.push(...defaultStyles.fonts);\n if (fills.length === 0) fills.push(...defaultStyles.fills);\n if (borders.length === 0) borders.push(...defaultStyles.borders);\n if (cellFormats.length === 0) cellFormats.push(...defaultStyles.cellFormats);\n cellFormats.forEach((f, i) => {\n const check = (what: string, id: number, count: number): void => {\n if (id < 0 || id >= count) {\n throw new XlsxError('malformed', `The cell format ${String(i)} names the ${what} ${String(id)}, which the styles do not hold.`, { part });\n }\n };\n check('font', f.fontId, fonts.length);\n check('fill', f.fillId, fills.length);\n check('border', f.borderId, borders.length);\n // Below 164 a Number Format is built in, or one the part may redefine; from 164 it is the part's own.\n if (f.numberFormatId < 0 || (f.numberFormatId >= firstCustomNumberFormat && !numberFormats.has(f.numberFormatId))) {\n throw new XlsxError('malformed',\n `The cell format ${String(i)} names the Number Format ${String(f.numberFormatId)}, which the styles do not hold.`, { part });\n }\n });\n return Object.freeze({\n numberFormats,\n fonts: Object.freeze(fonts),\n fills: Object.freeze(fills),\n borders: Object.freeze(borders),\n cellFormats: Object.freeze(cellFormats),\n indexedColors: indexed === null ? null : Object.freeze(indexed),\n });\n}\n\n/**\n * Walks the children of the element the reader is on, calling `each` on every one named `name` with the reader on its\n * start; the caller reads its attributes or its subtree, and the walk goes past it. Leaves the reader after the\n * element's end.\n */\nfunction children(xml: XmlReader, name: string, each: () => void): void {\n if (xml.isEmptyElement()) {\n xml.read();\n return;\n }\n const depth = xml.depth();\n xml.read();\n while (!xml.eof() && !(xml.nodeType() === 'endElement' && xml.depth() === depth)) {\n if (xml.nodeType() === 'element' && xml.depth() === depth + 1 && xml.localName() === name) {\n each();\n // The caller read the attributes or the subtree; the element and its content go now.\n xml.skip();\n continue;\n }\n if (xml.nodeType() === 'element') xml.skip();\n else xml.read();\n }\n xml.read();\n}\n\n/**\n * Walks the subtree of the element the reader is on, as `XmlReader.ReadSubtree` does: `visit` is called on each node\n * inside it with its depth below the element. Leaves the reader on the element's end, or on the element when it is\n * empty.\n */\nfunction subtree(xml: XmlReader, visit: (depth: number) => void): void {\n if (xml.isEmptyElement()) return;\n const top = xml.depth();\n while (xml.read() && !(xml.nodeType() === 'endElement' && xml.depth() === top)) visit(xml.depth() - top);\n}\n\nfunction readFont(xml: XmlReader, part: string): XlsxFont {\n let name: string | null = null;\n let size: number | null = null;\n let bold = false;\n let italic = false;\n let strike = false;\n let underline: XlsxUnderline = 'none';\n let color: XlsxColor | null = null;\n subtree(xml, depth => {\n if (xml.nodeType() !== 'element' || depth !== 1) return;\n const val = xml.getAttribute('val');\n switch (xml.localName()) {\n case 'name':\n name = val === undefined ? null : val;\n break;\n case 'sz':\n size = val === undefined ? null : double(val, part);\n break;\n case 'b':\n bold = val === undefined || bool(val);\n break;\n case 'i':\n italic = val === undefined || bool(val);\n break;\n case 'strike':\n strike = val === undefined || bool(val);\n break;\n case 'u':\n underline = underlineOf(val, part);\n break;\n case 'color':\n color = readColor(xml, part);\n break;\n default:\n break;\n }\n });\n return Object.freeze({ name, size, bold, italic, underline, strike, color });\n}\n\nfunction underlineOf(val: string | undefined, part: string): XlsxUnderline {\n switch (val) {\n case undefined:\n case 'single': return 'single';\n case 'double': return 'double';\n case 'singleAccounting': return 'singleAccounting';\n case 'doubleAccounting': return 'doubleAccounting';\n case 'none': return 'none';\n default: throw new XlsxError('malformed', `'${val}' is not an underline.`, { part });\n }\n}\n\nfunction readFill(xml: XmlReader, part: string): XlsxFill {\n if (xml.isEmptyElement()) return noFill;\n const top = xml.depth();\n const fill = firstFill(xml, top, part);\n // The rest of the fill is not read, and the reader is left on its end, as the subtree's reader leaves it.\n while (!(xml.nodeType() === 'endElement' && xml.depth() === top) && xml.read());\n return fill;\n}\n\nfunction firstFill(xml: XmlReader, top: number, part: string): XlsxFill {\n while (xml.read() && !(xml.nodeType() === 'endElement' && xml.depth() === top)) {\n if (xml.nodeType() !== 'element' || xml.depth() !== top + 1) continue;\n if (xml.localName() === 'gradientFill') return Object.freeze({ pattern: null, foreground: null, background: null, isGradient: true });\n if (xml.localName() !== 'patternFill') continue;\n const patternType = xml.getAttribute('patternType');\n const pattern = patternType === undefined ? 'none' : patternType;\n let foreground: XlsxColor | null = null;\n let background: XlsxColor | null = null;\n if (!xml.isEmptyElement()) {\n const at = xml.depth();\n while (xml.read() && xml.depth() > at) {\n if (xml.nodeType() !== 'element') continue;\n if (xml.localName() === 'fgColor') foreground = readColor(xml, part);\n else if (xml.localName() === 'bgColor') background = readColor(xml, part);\n }\n }\n return Object.freeze({ pattern, foreground, background, isGradient: false });\n }\n return noFill;\n}\n\nfunction readBorder(xml: XmlReader, part: string): XlsxBorder {\n const diagonalUp = bool(xml.getAttribute('diagonalUp'));\n const diagonalDown = bool(xml.getAttribute('diagonalDown'));\n let left = noBorderEdge;\n let right = noBorderEdge;\n let top = noBorderEdge;\n let bottom = noBorderEdge;\n let diagonal = noBorderEdge;\n subtree(xml, depth => {\n if (xml.nodeType() !== 'element' || depth !== 1) return;\n const name = xml.localName();\n const style = borderStyle(xml.getAttribute('style'), part);\n let color: XlsxColor | null = null;\n if (!xml.isEmptyElement()) {\n const at = xml.depth();\n while (xml.read() && xml.depth() > at) {\n if (xml.nodeType() === 'element' && xml.localName() === 'color') color = readColor(xml, part);\n }\n }\n const edge: XlsxBorderEdge = style === 'none' && color === null ? noBorderEdge : Object.freeze({ style, color });\n switch (name) {\n case 'left':\n case 'start':\n left = edge;\n break;\n case 'right':\n case 'end':\n right = edge;\n break;\n case 'top':\n top = edge;\n break;\n case 'bottom':\n bottom = edge;\n break;\n case 'diagonal':\n diagonal = edge;\n break;\n default:\n break;\n }\n });\n return Object.freeze({ left, right, top, bottom, diagonal, diagonalUp, diagonalDown });\n}\n\nfunction borderStyle(name: string | undefined, part: string): XlsxBorderStyle {\n if (name === undefined) return 'none';\n const style = borderStyleNames.find(s => s === name);\n if (style === undefined) throw new XlsxError('malformed', `'${name}' is not a border style.`, { part });\n return style;\n}\n\nfunction readCellFormat(xml: XmlReader, part: string): XlsxCellFormat {\n const id = (attribute: string): number => {\n const v = xml.getAttribute(attribute);\n return v === undefined ? 0 : int(v, { part });\n };\n const numberFormatId = id('numFmtId');\n const fontId = id('fontId');\n const fillId = id('fillId');\n const borderId = id('borderId');\n let alignment: XlsxAlignment | null = null;\n subtree(xml, depth => {\n if (xml.nodeType() === 'element' && depth === 1 && xml.localName() === 'alignment') alignment = readAlignment(xml, part);\n });\n return Object.freeze({ numberFormatId, fontId, fillId, borderId, alignment });\n}\n\nfunction readAlignment(xml: XmlReader, part: string): XlsxAlignment {\n const hv = xml.getAttribute('horizontal');\n const vv = xml.getAttribute('vertical');\n const horizontal = hv === undefined ? 'general' : horizontalNames.find(n => n === hv);\n const vertical = vv === undefined ? 'bottom' : verticalNames.find(n => n === vv);\n if (horizontal === undefined || vertical === undefined) throw new XlsxError('malformed', 'A cell format names an alignment that is not one.', { part });\n const indent = xml.getAttribute('indent');\n const rotation = xml.getAttribute('textRotation');\n return Object.freeze({\n horizontal,\n vertical,\n wrapText: bool(xml.getAttribute('wrapText')),\n indent: indent === undefined ? 0 : int(indent, { part }),\n textRotation: rotation === undefined ? 0 : int(rotation, { part }),\n shrinkToFit: bool(xml.getAttribute('shrinkToFit')),\n });\n}\n\nfunction readIndexedColors(xml: XmlReader, part: string): number[] | null {\n let colors: number[] | null = null;\n subtree(xml, () => {\n if (xml.nodeType() !== 'element') return;\n if (xml.localName() === 'indexedColors') {\n colors = [];\n return;\n }\n const rgb = xml.getAttribute('rgb');\n if (xml.localName() === 'rgbColor' && colors !== null && rgb !== undefined) colors.push(argb(rgb, part));\n });\n return colors;\n}\n\n/** The colour the element the reader is on writes (`CT_Color`). */\nexport function readColor(xml: XmlReader, part: string): XlsxColor {\n const t = xml.getAttribute('tint');\n const tint = t === undefined ? 0 : double(t, part);\n if (bool(xml.getAttribute('auto'))) return Object.freeze({ kind: 'automatic', value: 0, tint });\n const rgb = xml.getAttribute('rgb');\n if (rgb !== undefined) return Object.freeze({ kind: 'rgb', value: argb(rgb, part), tint });\n const theme = xml.getAttribute('theme');\n if (theme !== undefined) return Object.freeze({ kind: 'theme', value: int(theme, { part }) >>> 0, tint });\n const indexed = xml.getAttribute('indexed');\n if (indexed !== undefined) return Object.freeze({ kind: 'indexed', value: int(indexed, { part }) >>> 0, tint });\n return Object.freeze({ kind: 'automatic', value: 0, tint });\n}\n\nfunction argb(text: string, part: string): number {\n const value = parseHex32(text);\n if (value === undefined || (text.length !== 6 && text.length !== 8)) throw new XlsxError('malformed', `'${text}' is not an RGB colour.`, { part });\n return text.length === 6 ? (0xFF000000 | value) >>> 0 : value;\n}\n", "// The colours of a workbook's theme, and the resolution of any colour a style writes into the RGB Excel paints\n// (ADR-0330 \u00A78), as ExGrid.Data.Xlsx's XlsxTheme resolves it.\n\nimport { elementAt } from './must';\nimport type { XlsxColor } from './styles';\n\n/** The default indexed palette's 64 colours (ECMA-376 Part 1, \u00A718.8.27), as ARGB values. */\nexport const defaultIndexedColors: readonly number[] = Object.freeze([\n 0xFF000000, 0xFFFFFFFF, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF,\n 0xFF000000, 0xFFFFFFFF, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF,\n 0xFF800000, 0xFF008000, 0xFF000080, 0xFF808000, 0xFF800080, 0xFF008080, 0xFFC0C0C0, 0xFF808080,\n 0xFF9999FF, 0xFF993366, 0xFFFFFFCC, 0xFFCCFFFF, 0xFF660066, 0xFFFF8080, 0xFF0066CC, 0xFFCCCCFF,\n 0xFF000080, 0xFFFF00FF, 0xFFFFFF00, 0xFF00FFFF, 0xFF800080, 0xFF800000, 0xFF008080, 0xFF0000FF,\n 0xFF00CCFF, 0xFFCCFFFF, 0xFFCCFFCC, 0xFFFFFF99, 0xFF99CCFF, 0xFFFF99CC, 0xFFCC99FF, 0xFFFFCC99,\n 0xFF3366FF, 0xFF33CCCC, 0xFF99CC00, 0xFFFFCC00, 0xFFFF9900, 0xFFFF6600, 0xFF666699, 0xFF969696,\n 0xFF003366, 0xFF339966, 0xFF003300, 0xFF333300, 0xFF993300, 0xFF993366, 0xFF333399, 0xFF333333,\n]);\n\n/**\n * The colours of a workbook's theme (`<a:clrScheme>`), and the resolution of any colour a style writes into the RGB\n * Excel paints (ADR-0330 \u00A78): a theme slot through these colours, an indexed entry through the palette, and the tint\n * applied to the result as ECMA-376 Part 1, \u00A718.8.19 says.\n */\nexport class XlsxTheme {\n /**\n * The theme of Office 2013\u20132022, which a workbook with no theme part takes: dark 1 `000000`, light 1 `FFFFFF`,\n * `44546A`, `E7E6E6`, the accents `4472C4`, `ED7D31`, `A5A5A5`, `FFC000`, `5B9BD5`, `70AD47`, and the hyperlinks\n * `0563C1` and `954F72`.\n */\n static readonly office: XlsxTheme = new XlsxTheme([\n 0xFF000000, 0xFFFFFFFF, 0xFF44546A, 0xFFE7E6E6,\n 0xFF4472C4, 0xFFED7D31, 0xFFA5A5A5, 0xFFFFC000, 0xFF5B9BD5, 0xFF70AD47,\n 0xFF0563C1, 0xFF954F72,\n ]);\n\n /** The scheme's twelve colours as ARGB values, in the scheme's order: dark 1, light 1, dark 2, light 2, accents 1 to 6,\n * hyperlink, followed hyperlink. */\n readonly schemeColors: readonly number[];\n\n /** A theme of the twelve colours its scheme lists, as ARGB values in the scheme's own order. */\n constructor(schemeColors: readonly number[]) {\n if (schemeColors.length !== 12) {\n throw new TypeError(\"A theme's colour scheme has twelve colours: dark 1, light 1, dark 2, light 2, six accents and two hyperlinks.\");\n }\n this.schemeColors = Object.freeze(schemeColors.map(c => c >>> 0));\n }\n\n /**\n * The colour a style's theme slot names. A style numbers the first four slots in another order than the scheme lists\n * them \u2014 0 is light 1 (Background 1), 1 dark 1 (Text 1), 2 light 2, 3 dark 2 \u2014 and the rest as listed.\n */\n slotColor(slot: number): number {\n switch (slot) {\n case 0: return elementAt(this.schemeColors, 1);\n case 1: return elementAt(this.schemeColors, 0);\n case 2: return elementAt(this.schemeColors, 3);\n case 3: return elementAt(this.schemeColors, 2);\n default:\n if (Number.isInteger(slot) && slot >= 4 && slot < 12) return elementAt(this.schemeColors, slot);\n throw new RangeError(`A theme has twelve slots, 0 to 11, not ${String(slot)}.`);\n }\n }\n\n /**\n * The RGB value, as `0xFFRRGGBB`, that `color` paints, or `undefined` for the automatic colour (and the indexed entries\n * 64 and 65, which name the window's text and background), whose meaning the place it colours decides.\n * @param indexedColors - The styles part's own indexed palette, or none for the default one.\n */\n resolve(color: XlsxColor, indexedColors?: readonly number[] | null): number | undefined {\n let argb: number | undefined;\n switch (color.kind) {\n case 'rgb': argb = color.value; break;\n case 'theme': argb = color.value < 12 ? this.slotColor(color.value) : undefined; break;\n case 'indexed': {\n const palette = indexedColors ?? defaultIndexedColors;\n argb = color.value < palette.length ? elementAt(palette, color.value) : undefined;\n break;\n }\n case 'automatic': argb = undefined; break;\n default: return unreachableKind(color.kind);\n }\n return argb !== undefined && color.tint !== 0 ? applyTint(argb, color.tint) : argb;\n }\n}\n\nfunction unreachableKind(kind: never): never {\n throw new Error(`Internal: ${String(kind)} is not a colour's kind.`);\n}\n\n/**\n * `argb` lightened or darkened by `tint`, as ECMA-376 Part 1, \u00A718.8.19 says: the colour taken to hue, luminance and\n * saturation, its luminance scaled toward black (`L \u00D7 (1 + tint)`) or toward white (`L \u00D7 (1 \u2212 tint) + tint`), and taken\n * back, each channel rounded to the nearest of 0 to 255. Alpha is kept.\n * @param tint - From -1 (black) to 1 (white).\n */\nexport function applyTint(argb: number, tint: number): number {\n const t = Math.min(Math.max(tint, -1), 1);\n const r = ((argb >>> 16) & 0xFF) / 255;\n const g = ((argb >>> 8) & 0xFF) / 255;\n const b = (argb & 0xFF) / 255;\n const max = Math.max(r, Math.max(g, b));\n const min = Math.min(r, Math.min(g, b));\n let l = (max + min) / 2;\n let h = 0;\n let s = 0;\n if (max !== min) {\n const d = max - min;\n s = l <= 0.5 ? d / (max + min) : d / (2 - max - min);\n h = max === r ? (g - b) / d + (g < b ? 6 : 0)\n : max === g ? (b - r) / d + 2\n : (r - g) / d + 4;\n h /= 6;\n }\n l = t < 0 ? l * (1 + t) : l * (1 - t) + t;\n let r2: number;\n let g2: number;\n let b2: number;\n if (s === 0) {\n r2 = g2 = b2 = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r2 = hue(p, q, h + 1 / 3);\n g2 = hue(p, q, h);\n b2 = hue(p, q, h - 1 / 3);\n }\n return ((argb & 0xFF000000) | (channel(r2) << 16) | (channel(g2) << 8) | channel(b2)) >>> 0;\n}\n\nfunction hue(p: number, q: number, given: number): number {\n let t = given;\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 0.5) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n\n/** A channel rounded as .NET's `Math.Round(v * 255, MidpointRounding.AwayFromZero)`, clamped to 0 to 255. */\nfunction channel(v: number): number {\n const x = v * 255;\n const whole = Math.trunc(x);\n const rounded = Math.abs(x - whole) >= 0.5 ? whole + Math.sign(x) : whole;\n return Math.min(Math.max(rounded, 0), 255);\n}\n", "// An .xlsx workbook opened for reading (ADR-0330 \u00A71, \u00A79), as ExGrid.Data.Xlsx's XlsxReader opens it. Opening reads the\n// package's parts that are small and whole \u2014 the workbook part, the shared strings, the styles and the theme \u2014 and\n// refuses by name a file that is not a plain .xlsx, or that passes a limit. Each worksheet's cells are then read as a\n// stream, a batch at a time, through `openSheet`; no worksheet is ever held as a document, nor is the file.\n\nimport { grouped, parseHex32 } from './invariant';\nimport { formatCell } from './cell-reference';\nimport type { XlsxCell, XlsxColumn, XlsxDefinedName, XlsxElement, XlsxRow, XlsxSheetInfo, XlsxSheetVisibility } from './model';\nimport {\n binaryContent, drawingNamespace, relationshipsNamespace, sharedStringsType, sheetMetadataType, strictPrefix, stylesType, templateContent,\n themeType, vbaProjectContent, workbookContent, worksheetType,\n} from './names';\nimport { classifyOle, isOle, isZip, Package } from './package';\nimport { defaultMaxCells, defaultMaxUncompressedBytes, Pacer, type XlsxProgress, type XlsxReadOptions } from './pacer';\nimport { XlsxSharedStrings } from './shared-strings';\nimport { SheetReader, type SheetOwner, type XlsxSheetReader } from './sheet-reader';\nimport { low, runSteps, type StepEnd } from './steps';\nimport type { XlsxStyles } from './styles';\nimport { defaultStyles } from './styles';\nimport { readStyles } from './styles-reader';\nimport { XlsxTheme } from './theme';\nimport { foldCase } from './text-casing';\nimport { decodeXString } from './x-string';\nimport { readText } from './string-item';\nimport { XlsxError } from './xlsx-error';\nimport { XmlError } from './xml-reader';\nimport { byteSource } from './zip-read';\nimport { bool, int } from './values';\nimport { elementAt } from './must';\n\n/** A worksheet read whole (`XlsxReader.readSheet`). */\nexport interface XlsxWorksheet {\n /** The sheet as the workbook lists it. */\n readonly sheet: XlsxSheetInfo;\n /** Its column widths. */\n readonly columns: readonly XlsxColumn[];\n /** Its cells, in the file's order: row by row, left to right. */\n readonly cells: readonly XlsxCell[];\n /** What else it holds, as `XlsxSheetReader.otherElements` lists it. */\n readonly otherElements: readonly XlsxElement[];\n /** The rows that record a cell format of their own, in order; empty for none. */\n readonly rows: readonly XlsxRow[];\n /** Whether a row sets a height of its own. */\n readonly customRowHeights: boolean;\n /** Whether a row is hidden. */\n readonly hiddenRows: boolean;\n /** Whether the sheet's view freezes panes. */\n readonly frozenPanes: boolean;\n}\n\ninterface Relationship {\n readonly type: string;\n readonly target: string;\n}\n\n/** The shared strings read between two looks at the clock: a few microseconds' work. */\nconst sharedStringSlice = 256;\n\n/**\n * An `.xlsx` workbook opened for reading (ADR-0330 \u00A71, \u00A79): its sheets, defined names, shared strings, styles and theme,\n * read when it is opened; each worksheet's cells read as a stream through `openSheet`. The model is the file's own: a\n * number is its text, a Formula its stored text with its prefixes, a style an index. Made by `openXlsx`.\n */\nexport interface XlsxReader {\n /** The workbook part's name, as `xl/workbook.xml`. */\n readonly workbookPart: string;\n /** The workbook's sheets, in its order: the order of its tabs. */\n readonly sheets: readonly XlsxSheetInfo[];\n /** The index into `sheets` of the sheet the workbook shows (`activeTab`), 0 when it names none. */\n readonly activeSheet: number;\n /** Whether the workbook counts dates from 1904 (`date1904`), whose serials are 1,462 less than 1900's for the same day. */\n readonly date1904: boolean;\n /** The workbook's defined names. */\n readonly definedNames: readonly XlsxDefinedName[];\n /** The shared strings, held whole. */\n readonly sharedStrings: XlsxSharedStrings;\n /** The styles, as far as ADR-0330 \u00A74 carries them; `defaultStyles` when the package has no styles part. */\n readonly styles: XlsxStyles;\n /** The theme's colours; `XlsxTheme.office` when the package has no theme part (`hasTheme`). */\n readonly theme: XlsxTheme;\n /** Whether the package has a theme part of its own. */\n readonly hasTheme: boolean;\n /** Every part the package holds, by name, as `xl/comments1.xml`: what else it holds than what is read. */\n readonly parts: readonly string[];\n /** The cells read so far, every worksheet counted. */\n readonly cellsRead: number;\n /** The worksheets' uncompressed bytes, as the zip declares them. */\n readonly sheetBytes: number;\n /** Opens the worksheet at `index` for reading its cells as a stream. One worksheet is read at a time: close the reader\n * before opening the next. */\n openSheet(index: number): Promise<XlsxSheetReader>;\n /** Reads the worksheet at `index` whole: its columns, its cells and what else it holds. For a sheet that is small, or a\n * test; a large one is read a batch at a time through `openSheet`. */\n readSheet(index: number): Promise<XlsxWorksheet>;\n}\n\nclass WorkbookReader implements XlsxReader {\n readonly #package: Package;\n readonly #pacer: Pacer;\n readonly #maxCells: number;\n readonly #dynamicArrayMetadata: ReadonlySet<number>;\n readonly #owner: SheetOwner;\n #cells = 0;\n #sheetBytesRead = 0;\n #sharedStrings = XlsxSharedStrings.empty;\n #sheetOpen = false;\n\n /** The workbook part's name, as `xl/workbook.xml`. */\n readonly workbookPart: string;\n /** The workbook's sheets, in its order: the order of its tabs. */\n readonly sheets: readonly XlsxSheetInfo[];\n /** The index into `sheets` of the sheet the workbook shows (`activeTab`), 0 when it names none. */\n readonly activeSheet: number;\n /** Whether the workbook counts dates from 1904 (`date1904`), whose serials are 1,462 less than 1900's for the same day. */\n readonly date1904: boolean;\n /** The workbook's defined names. */\n readonly definedNames: readonly XlsxDefinedName[];\n /** The styles, as far as ADR-0330 \u00A74 carries them; `defaultStyles` when the package has no styles part. */\n readonly styles: XlsxStyles;\n /** The theme's colours; `XlsxTheme.office` when the package has no theme part (`hasTheme`). */\n readonly theme: XlsxTheme;\n /** Whether the package has a theme part of its own. */\n readonly hasTheme: boolean;\n /** The worksheets' uncompressed bytes, as the zip declares them. */\n readonly sheetBytes: number;\n\n private constructor(pkg: Package, options: XlsxReadOptions, read: WorkbookRead) {\n this.#package = pkg;\n this.#pacer = new Pacer(options);\n this.#maxCells = options.maxCells === undefined ? defaultMaxCells : options.maxCells;\n this.workbookPart = read.part;\n this.sheets = read.sheets;\n this.activeSheet = read.active;\n this.date1904 = read.date1904;\n this.definedNames = read.names;\n this.styles = read.styles;\n this.theme = read.theme;\n this.hasTheme = read.hasTheme;\n this.#dynamicArrayMetadata = read.dynamicArrayMetadata;\n this.sheetBytes = read.sheets.reduce((sum, s) => (s.part === null ? sum : sum + pkg.lengthOf(s.part)), 0);\n const progress = (sheet: number): XlsxProgress => ({\n sheet, sheets: this.sheets.length, cells: this.#cells, bytes: this.#sheetBytesRead, totalBytes: this.sheetBytes,\n });\n this.#owner = {\n styles: this.styles,\n sharedStrings: () => this.#sharedStrings,\n isDynamicArray: cm => this.#dynamicArrayMetadata.has(cm),\n countCell: (sheet, row, column) => {\n if (++this.#cells > this.#maxCells) {\n throw new XlsxError('tooManyCells',\n `The workbook holds more than the ${grouped(this.#maxCells)} cells a read is allowed (XlsxReadOptions.MaxCells).`,\n { part: sheet.part === null ? undefined : sheet.part, sheet: sheet.name, cell: formatCell(row, column) });\n }\n },\n cells: () => this.#cells,\n rewindCells: to => {\n this.#cells = to;\n },\n countBytes: bytes => {\n this.#sheetBytesRead += bytes;\n },\n checkpoint: sheet => this.#pacer.checkpoint(() => progress(sheet)),\n report: sheet => this.#pacer.report(progress(sheet)),\n closed: () => {\n this.#sheetOpen = false;\n },\n };\n }\n\n /** Opens the workbook in `file`. */\n static async open(file: Uint8Array | ArrayBuffer | Blob, options: XlsxReadOptions = {}): Promise<WorkbookReader> {\n options.signal?.throwIfAborted();\n const max = options.maxUncompressedBytes === undefined ? defaultMaxUncompressedBytes : options.maxUncompressedBytes;\n const source = byteSource(file);\n const head = await source.read(0, 8);\n if (isOle(head)) throw await classifyOle(source);\n if (!isZip(head)) throw new XlsxError('notAZip', head.length === 0 ? 'The file is empty.' : 'The file is not a zip package, so it is not an .xlsx.');\n const pkg = await Package.open(source, max);\n const read = await readWorkbookParts(pkg);\n const reader = new WorkbookReader(pkg, options, read);\n if (read.sharedStringsPart !== undefined) await reader.#readSharedStrings(read.sharedStringsPart);\n return reader;\n }\n\n /** The shared strings, held whole. */\n get sharedStrings(): XlsxSharedStrings {\n return this.#sharedStrings;\n }\n\n /** Every part the package holds, by name, as `xl/comments1.xml`: what else it holds than what is read. */\n get parts(): readonly string[] {\n return this.#package.partNames;\n }\n\n /** The cells read so far, every worksheet counted. */\n get cellsRead(): number {\n return this.#cells;\n }\n\n /**\n * Opens the worksheet at `index` for reading its cells as a stream. One worksheet is read at a time: close the reader\n * before opening the next.\n */\n async openSheet(index: number): Promise<XlsxSheetReader> {\n if (!Number.isInteger(index) || index < 0 || index >= this.sheets.length) {\n throw new RangeError(`The workbook has ${String(this.sheets.length)} sheets; ${String(index)} is not the index of one.`);\n }\n const sheet = elementAt(this.sheets, index);\n if (sheet.part === null) throw new Error(`The sheet '${sheet.name}' is not a worksheet and holds no cells.`);\n if (this.#sheetOpen) throw new Error('Another worksheet is being read: close its reader first.');\n const opened = await this.#package.openXml(sheet.part, sheet.name);\n if (opened === undefined) {\n throw new XlsxError('malformed', 'The workbook names a worksheet part the package does not hold.', { part: sheet.part, sheet: sheet.name });\n }\n this.#sheetOpen = true;\n return new SheetReader(this.#owner, index, sheet, sheet.part, opened);\n }\n\n /**\n * Reads the worksheet at `index` whole: its columns, its cells and what else it holds. For a sheet that is small, or a\n * test; a large one is read a batch at a time through `openSheet`.\n */\n async readSheet(index: number): Promise<XlsxWorksheet> {\n const reader = await this.openSheet(index);\n try {\n const cells: XlsxCell[] = [];\n const rows: XlsxRow[] = [];\n while (await reader.read()) {\n cells.push(...reader.cells);\n rows.push(...reader.rows);\n }\n return Object.freeze({\n sheet: reader.sheet,\n columns: reader.columns,\n cells: Object.freeze(cells),\n otherElements: reader.otherElements,\n rows: Object.freeze(rows),\n customRowHeights: reader.customRowHeights,\n hiddenRows: reader.hiddenRows,\n frozenPanes: reader.frozenPanes,\n });\n } finally {\n await reader.close();\n }\n }\n\n /**\n * Reads the shared strings, the one part held whole, in slices as a worksheet is read (ADR-0330 \u00A79): cancellation is\n * looked at, progress reported and the read yields between them. Its progress names no worksheet (`sheet` is -1) and\n * counts the part's bytes.\n */\n async #readSharedStrings(part: string): Promise<void> {\n const opened = await this.#package.openXml(part);\n if (opened === undefined) return;\n const { xml, bytes } = opened;\n const total = this.#package.lengthOf(part);\n const progress = (): XlsxProgress => ({ sheet: -1, sheets: this.sheets.length, cells: 0, bytes: bytes.bytesRead, totalBytes: total });\n const texts: string[] = [];\n const rich: number[] = [];\n let started = false;\n const step = (): StepEnd => {\n if (!started) {\n xml.moveToContent();\n started = true;\n }\n let slice = 0;\n for (;;) {\n if (low(xml)) return 'more';\n if (!xml.read()) return 'done';\n if (xml.nodeType() === 'element' && xml.localName() === 'si') {\n const [text, isRich] = readText(xml);\n if (isRich) rich.push(texts.length);\n texts.push(text);\n if (++slice === sharedStringSlice) return 'pause';\n }\n }\n };\n const save = (): (() => void) => {\n const count = texts.length;\n const richCount = rich.length;\n const wasStarted = started;\n return () => {\n texts.length = count;\n rich.length = richCount;\n started = wasStarted;\n };\n };\n try {\n while ((await runSteps(xml, save, step)) === 'pause') await this.#pacer.checkpoint(progress);\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, opened, part);\n throw error;\n } finally {\n await bytes.close();\n }\n this.#pacer.report(progress());\n this.#sharedStrings = new XlsxSharedStrings(texts, new Set(rich));\n }\n}\n\n/**\n * Opens the workbook in `file`, reading its workbook part, shared strings, styles and theme, or refuses it by name\n * (`XlsxError`). A Blob \u2014 a File \u2014 is read where its bytes are asked for, through `slice`, and never whole.\n * @param file - The file's bytes, or a Blob.\n * @param options - The limits, progress and pacing; the defaults when left out.\n */\nexport function openXlsx(file: Uint8Array | ArrayBuffer | Blob, options?: XlsxReadOptions): Promise<XlsxReader> {\n return WorkbookReader.open(file, options);\n}\n\n// ---- the workbook's parts ---------------------------------------------------------------------\n\ninterface WorkbookRead {\n readonly part: string;\n readonly sheets: readonly XlsxSheetInfo[];\n readonly active: number;\n readonly date1904: boolean;\n readonly names: readonly XlsxDefinedName[];\n readonly styles: XlsxStyles;\n readonly theme: XlsxTheme;\n readonly hasTheme: boolean;\n readonly dynamicArrayMetadata: ReadonlySet<number>;\n readonly sharedStringsPart: string | undefined;\n}\n\nasync function readWorkbookParts(pkg: Package): Promise<WorkbookRead> {\n const part = await workbookPartOf(pkg);\n const rels = await relationships(pkg, part);\n const { sheets, active, date1904, names } = await readWorkbook(pkg, part, rels);\n const target = (type: string): string | undefined => {\n for (const r of rels.values()) if (r.type === type) return r.target;\n return undefined;\n };\n const stylesPart = target(stylesType);\n const themePart = target(themeType);\n const metadataPart = target(sheetMetadataType);\n return {\n part, sheets, active, date1904, names,\n styles: stylesPart === undefined ? defaultStyles : await readStyles(pkg, stylesPart),\n theme: themePart === undefined ? XlsxTheme.office : await readTheme(pkg, themePart),\n hasTheme: themePart !== undefined,\n dynamicArrayMetadata: metadataPart === undefined ? new Set() : await readDynamicArrayMetadata(pkg, metadataPart),\n sharedStringsPart: target(sharedStringsType),\n };\n}\n\nfunction strict(): XlsxError {\n return new XlsxError('strictOpenXml', 'The workbook is saved as Strict Open XML, which is not read. Save it from Excel as an Excel Workbook (.xlsx).');\n}\n\n/** The extension of a part's name, without its point, as `Path.GetExtension` finds it; '' for none. */\nfunction extensionOf(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot < 0 || dot < name.lastIndexOf('/') ? '' : name.slice(dot + 1);\n}\n\n/** The workbook part, from the content types and the package's relationships; refused by name when the package is not\n * a plain transitional workbook. */\nasync function workbookPartOf(pkg: Package): Promise<string> {\n const { defaults, overrides } = await readContentTypes(pkg);\n const root = await relationships(pkg, '');\n let office: Relationship | undefined;\n for (const r of root.values()) {\n if (r.type.endsWith('/officeDocument')) {\n office = r;\n break;\n }\n }\n if (office === undefined) {\n if ([...root.values()].some(r => r.type.startsWith(strictPrefix))) throw strict();\n throw new XlsxError('notAWorkbook', 'The zip package holds no document, so it is not an .xlsx.');\n }\n if (office.type.startsWith(strictPrefix)) throw strict();\n const part = office.target;\n const contentType = overrides.get(foldCase(part)) ?? defaults.get(foldCase(extensionOf(part))) ?? ''; // oxlint-disable-line ex-grid/no-stand-in-default -- ExGrid.Data.Xlsx: a document with no content type is refused below by that absence\n if (contentType === binaryContent || foldCase(part).endsWith('.bin')) {\n throw new XlsxError('binary', 'The file is an Excel Binary Workbook (.xlsb), not an .xlsx. Save it from Excel as an Excel Workbook (.xlsx).', { part });\n }\n if (foldCase(contentType).includes(foldCase('macroEnabled')) || [...overrides.values(), ...defaults.values()].includes(vbaProjectContent)) {\n throw new XlsxError('macroEnabled',\n 'The file is a workbook with macros (.xlsm), which is not read. Save it from Excel as an Excel Workbook (.xlsx), which leaves the macros out.', { part });\n }\n if (contentType !== workbookContent && contentType !== templateContent) {\n throw new XlsxError('notAWorkbook', contentType === ''\n ? \"The package's document has no content type, so it is not an .xlsx.\"\n : `The package's document is '${contentType}', not a workbook: the file is not an .xlsx.`, { part });\n }\n if (!pkg.has(part)) throw new XlsxError('malformed', 'The package names a workbook part it does not hold.', { part });\n return part;\n}\n\n/** The content types: the defaults by extension and the overrides by part, each keyed in any case. */\nasync function readContentTypes(pkg: Package): Promise<{ defaults: Map<string, string>; overrides: Map<string, string> }> {\n const part = '[Content_Types].xml';\n const defaults = new Map<string, string>();\n const overrides = new Map<string, string>();\n const opened = await pkg.readXml(part);\n if (opened === undefined) throw new XlsxError('notAWorkbook', 'The zip package has no [Content_Types].xml, so it is not an Office document.');\n const xml = opened.xml;\n try {\n while (xml.read()) {\n if (xml.nodeType() !== 'element') continue;\n if (xml.localName() === 'Default') {\n const ext = xml.getAttribute('Extension');\n const type = xml.getAttribute('ContentType');\n if (ext !== undefined && type !== undefined) defaults.set(foldCase(ext), type);\n } else if (xml.localName() === 'Override') {\n const name = xml.getAttribute('PartName');\n const type = xml.getAttribute('ContentType');\n if (name !== undefined && type !== undefined) overrides.set(foldCase(name.replace(/^\\/+/, '')), type);\n }\n }\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, opened, part);\n throw error;\n }\n return { defaults, overrides };\n}\n\n/** The relationships of `source` (the package itself when empty), by id, each target resolved to a part name. */\nasync function relationships(pkg: Package, source: string): Promise<Map<string, Relationship>> {\n const slash = source.lastIndexOf('/');\n const dir = slash < 0 ? '' : source.slice(0, slash);\n const part = `${dir === '' ? '' : `${dir}/`}_rels/${source.slice(slash + 1)}.rels`;\n const found = new Map<string, Relationship>();\n const opened = await pkg.readXml(part);\n if (opened === undefined) return found;\n const xml = opened.xml;\n try {\n while (xml.read()) {\n if (xml.nodeType() !== 'element' || xml.localName() !== 'Relationship') continue;\n const id = xml.getAttribute('Id');\n const type = xml.getAttribute('Type');\n const target = xml.getAttribute('Target');\n if (id === undefined || type === undefined || target === undefined || xml.getAttribute('TargetMode') === 'External') continue;\n found.set(id, { type, target: resolve(dir, target) });\n }\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, opened, part);\n throw error;\n }\n return found;\n}\n\n/** `Uri.UnescapeDataString`: each run of `%XX` escapes that spells UTF-8 decoded, and any other `%` left as it is. */\nfunction unescapeData(text: string): string {\n return text.replace(/(?:%[0-9A-Fa-f]{2})+/g, run => {\n const bytes = Uint8Array.from(run.match(/%[0-9A-Fa-f]{2}/g) ?? [], h => Number.parseInt(h.slice(1), 16)); // oxlint-disable-line ex-grid/no-stand-in-default -- the run matched the pattern, so it holds at least one escape\n let out = '';\n let at = 0;\n while (at < bytes.length) {\n const length = utf8Length(bytes, at);\n if (length === 0) {\n out += run.slice(at * 3, at * 3 + 3);\n at++;\n } else {\n out += new TextDecoder().decode(bytes.subarray(at, at + length));\n at += length;\n }\n }\n return out;\n });\n}\n\n/** The length of the well-formed UTF-8 sequence at `at`, or 0 when none starts there. */\nfunction utf8Length(bytes: Uint8Array, at: number): number {\n const b = elementAt(bytes, at);\n const length = b < 0x80 ? 1 : b >= 0xC2 && b < 0xE0 ? 2 : b >= 0xE0 && b < 0xF0 ? 3 : b >= 0xF0 && b < 0xF5 ? 4 : 0;\n if (length === 0 || at + length > bytes.length) return 0;\n for (let i = 1; i < length; i++) {\n if ((elementAt(bytes, at + i) & 0xC0) !== 0x80) return 0;\n }\n const second = length > 1 ? elementAt(bytes, at + 1) : 0;\n if ((b === 0xE0 && second < 0xA0) || (b === 0xED && second >= 0xA0) || (b === 0xF0 && second < 0x90) || (b === 0xF4 && second >= 0x90)) return 0;\n return length;\n}\n\nfunction resolve(dir: string, given: string): string {\n const target = unescapeData(given.replaceAll('\\\\', '/'));\n const path = target.startsWith('/') ? target.replace(/^\\/+/, '') : dir === '' ? target : `${dir}/${target}`;\n const parts: string[] = [];\n for (const segment of path.split('/')) {\n if (segment === '' || segment === '.') continue;\n if (segment === '..') {\n parts.pop();\n continue;\n }\n parts.push(segment);\n }\n return parts.join('/');\n}\n\ninterface Workbook {\n readonly sheets: readonly XlsxSheetInfo[];\n readonly active: number;\n readonly date1904: boolean;\n readonly names: readonly XlsxDefinedName[];\n}\n\nasync function readWorkbook(pkg: Package, part: string, rels: ReadonlyMap<string, Relationship>): Promise<Workbook> {\n const sheets: XlsxSheetInfo[] = [];\n const names: XlsxDefinedName[] = [];\n let active = 0;\n let date1904 = false;\n const opened = await pkg.readXml(part);\n if (opened === undefined) throw new Error(`Internal: the package was checked to hold '${part}'.`);\n const xml = opened.xml;\n try {\n xml.moveToContent();\n if (xml.namespaceUri().startsWith(strictPrefix)) throw strict();\n if (xml.localName() !== 'workbook') throw new XlsxError('malformed', `The workbook part's root is <${xml.localName()}>, not <workbook>.`, { part });\n // A defined name's text is read with readElementContentAsString, which leaves the reader on the node after it:\n // that node is looked at before reading on.\n let more = xml.read();\n while (more) {\n if (xml.nodeType() !== 'element') {\n more = xml.read();\n continue;\n }\n let advanced = false;\n switch (xml.localName()) {\n case 'workbookPr':\n date1904 = bool(xml.getAttribute('date1904'));\n break;\n case 'workbookView': {\n const tab = xml.getAttribute('activeTab');\n if (tab !== undefined) active = int(tab, { part });\n break;\n }\n case 'sheet': {\n const name = xml.getAttribute('name');\n if (name === undefined) throw new XlsxError('malformed', 'A sheet has no name.', { part });\n const id = xml.getAttributeNs('id', relationshipsNamespace);\n const state = xml.getAttribute('state');\n const visibility: XlsxSheetVisibility = state === 'hidden' ? 'hidden' : state === 'veryHidden' ? 'veryHidden' : 'visible';\n const sid = xml.getAttribute('sheetId');\n const sheetId = sid === undefined ? sheets.length + 1 : int(sid, { part });\n const rel = id === undefined ? undefined : rels.get(id);\n sheets.push(Object.freeze(rel !== undefined && rel.type === worksheetType\n ? { name, sheetId, visibility, part: rel.target, kind: 'worksheet' as const }\n : { name, sheetId, visibility, part: null, kind: 'other' as const }));\n break;\n }\n case 'definedName': {\n const given = xml.getAttribute('name');\n const name = given === undefined ? '' : given;\n const l = xml.getAttribute('localSheetId');\n const localSheet = l === undefined ? null : int(l, { part });\n const hidden = bool(xml.getAttribute('hidden'));\n names.push(Object.freeze({ name, text: decodeXString(xml.readElementContentAsString()), localSheet, hidden }));\n advanced = true;\n break;\n }\n default:\n break;\n }\n more = advanced ? !xml.eof() : xml.read();\n }\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, opened, part);\n throw error;\n }\n if (sheets.length === 0) throw new XlsxError('malformed', 'The workbook lists no sheets.', { part });\n if (active < 0 || active >= sheets.length) active = 0;\n return { sheets: Object.freeze(sheets), active, date1904, names: Object.freeze(names) };\n}\n\nconst schemeOrder = ['dk1', 'lt1', 'dk2', 'lt2', 'accent1', 'accent2', 'accent3', 'accent4', 'accent5', 'accent6', 'hlink', 'folHlink'];\n\nasync function readTheme(pkg: Package, part: string): Promise<XlsxTheme> {\n const colors = [...XlsxTheme.office.schemeColors];\n const opened = await pkg.readXml(part);\n if (opened === undefined) return XlsxTheme.office;\n const xml = opened.xml;\n try {\n if (!xml.readToFollowing('clrScheme', drawingNamespace)) return XlsxTheme.office;\n const depth = xml.depth();\n let slot = -1;\n while (xml.read() && xml.depth() > depth) {\n if (xml.nodeType() !== 'element') continue;\n if (xml.depth() === depth + 1) {\n slot = schemeOrder.indexOf(xml.localName());\n continue;\n }\n if (slot < 0) continue;\n const value = xml.localName() === 'srgbClr' ? xml.getAttribute('val') : xml.localName() === 'sysClr' ? xml.getAttribute('lastClr') : undefined;\n const rgb = value === undefined ? undefined : parseHex32(value);\n if (rgb !== undefined) colors[slot] = (0xFF000000 | (rgb & 0xFFFFFF)) >>> 0;\n }\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, opened, part);\n throw error;\n }\n return new XlsxTheme(colors);\n}\n\n/** The cell metadata indexes (`cm`, from one) that mark a dynamic array: a `cellMetadata` block whose record points at an\n * `XLDAPR` future-metadata block with `fDynamic=\"1\"`. */\nasync function readDynamicArrayMetadata(pkg: Package, part: string): Promise<ReadonlySet<number>> {\n const dynamic = new Set<number>();\n const opened = await pkg.readXml(part);\n if (opened === undefined) return dynamic;\n const xml = opened.xml;\n const types: string[] = [];\n const futures = new Map<string, boolean[]>();\n const cellBlocks: [number, number][] = [];\n try {\n let future: boolean[] | null = null;\n let inCellMetadata = false;\n let pendingRecord = false;\n while (xml.read()) {\n if (xml.nodeType() === 'endElement') {\n if (xml.localName() === 'futureMetadata') future = null;\n else if (xml.localName() === 'cellMetadata') inCellMetadata = false;\n continue;\n }\n if (xml.nodeType() !== 'element') continue;\n const name = xml.localName();\n if (name === 'metadataType') {\n const typeName = xml.getAttribute('name');\n types.push(typeName === undefined ? '' : typeName);\n } else if (name === 'futureMetadata') {\n const futureName = xml.getAttribute('name');\n const blocks: boolean[] = [];\n futures.set(futureName === undefined ? '' : futureName, blocks);\n future = xml.isEmptyElement() ? null : blocks;\n } else if (name === 'bk' && future !== null) {\n future.push(false);\n } else if (name === 'dynamicArrayProperties' && future !== null && future.length > 0) {\n future[future.length - 1] = bool(xml.getAttribute('fDynamic'));\n } else if (name === 'cellMetadata') {\n inCellMetadata = !xml.isEmptyElement();\n } else if (name === 'bk' && inCellMetadata) {\n pendingRecord = true;\n cellBlocks.push([-1, -1]);\n } else if (name === 'rc' && inCellMetadata && pendingRecord) {\n pendingRecord = false;\n const t = xml.getAttribute('t');\n const v = xml.getAttribute('v');\n cellBlocks[cellBlocks.length - 1] = [int(t === undefined ? '0' : t, { part }), int(v === undefined ? '0' : v, { part })];\n }\n }\n } catch (error) {\n if (error instanceof XmlError) throw Package.refuse(error, opened, part);\n throw error;\n }\n const blocks = futures.get('XLDAPR');\n cellBlocks.forEach(([type, value], i) => {\n if (type < 1 || type > types.length || types[type - 1] !== 'XLDAPR') return;\n if (blocks !== undefined && value >= 0 && value < blocks.length && blocks[value] === true) dynamic.add(i + 1);\n });\n return dynamic;\n}\n", "// The styles part written from XlsxStyles, as ExGrid.Data.Xlsx's StylesWriter writes it: what the styles reader reads,\n// and the one named style (Normal) every styles part carries.\n\nimport { hex8, roundTrip } from './invariant';\nimport { mainNamespace } from './names';\nimport type { XlsxBorder, XlsxBorderEdge, XlsxCellFormat, XlsxColor, XlsxFill, XlsxFont, XlsxStyles } from './styles';\nimport { encodeXString } from './x-string';\nimport type { XmlTextWriter } from './xml-writer';\nimport { unreachable } from './must';\n\nexport function writeStyles(w: XmlTextWriter, styles: XlsxStyles): void {\n w.start('styleSheet', mainNamespace);\n if (styles.numberFormats.size > 0) {\n w.start('numFmts');\n count(w, styles.numberFormats.size);\n for (const [id, code] of [...styles.numberFormats].toSorted(([a], [b]) => a - b)) {\n w.start('numFmt');\n w.attribute('numFmtId', String(id));\n w.attribute('formatCode', encodeXString(code));\n w.end();\n }\n w.end();\n }\n\n w.start('fonts');\n count(w, styles.fonts.length);\n for (const font of styles.fonts) writeFont(w, font);\n w.end();\n\n w.start('fills');\n count(w, styles.fills.length);\n for (const fill of styles.fills) writeFill(w, fill);\n w.end();\n\n w.start('borders');\n count(w, styles.borders.length);\n for (const border of styles.borders) writeBorder(w, border);\n w.end();\n\n w.start('cellStyleXfs');\n count(w, 1);\n w.start('xf');\n w.attribute('numFmtId', '0');\n w.attribute('fontId', '0');\n w.attribute('fillId', '0');\n w.attribute('borderId', '0');\n w.end();\n w.end();\n\n w.start('cellXfs');\n count(w, styles.cellFormats.length);\n for (const format of styles.cellFormats) writeCellFormat(w, format);\n w.end();\n\n w.start('cellStyles');\n count(w, 1);\n w.start('cellStyle');\n w.attribute('name', 'Normal');\n w.attribute('xfId', '0');\n w.attribute('builtinId', '0');\n w.end();\n w.end();\n\n const indexed = styles.indexedColors;\n if (indexed !== null && indexed.length > 0) {\n w.start('colors');\n w.start('indexedColors');\n for (const argb of indexed) {\n w.start('rgbColor');\n w.attribute('rgb', hex8(argb));\n w.end();\n }\n w.end();\n w.end();\n }\n w.end();\n}\n\nfunction count(w: XmlTextWriter, n: number): void {\n w.attribute('count', String(n));\n}\n\nfunction writeFont(w: XmlTextWriter, font: XlsxFont): void {\n w.start('font');\n // The schema's order: b, i, strike, \u2026, u, \u2026, sz, color, name.\n if (font.bold) w.element('b', null);\n if (font.italic) w.element('i', null);\n if (font.strike) w.element('strike', null);\n if (font.underline !== 'none') {\n w.start('u');\n if (font.underline !== 'single') w.attribute('val', font.underline);\n w.end();\n }\n if (font.size !== null) {\n w.start('sz');\n w.attribute('val', roundTrip(font.size));\n w.end();\n }\n if (font.color !== null) writeColor(w, 'color', font.color);\n if (font.name !== null) {\n w.start('name');\n w.attribute('val', font.name);\n w.end();\n }\n w.end();\n}\n\nfunction writeFill(w: XmlTextWriter, fill: XlsxFill): void {\n w.start('fill');\n if (fill.isGradient) {\n // A gradient's stops are not read, so none is written: an empty gradient.\n w.start('gradientFill');\n w.end();\n } else {\n w.start('patternFill');\n w.attribute('patternType', fill.pattern === null ? 'none' : fill.pattern);\n if (fill.foreground !== null) writeColor(w, 'fgColor', fill.foreground);\n if (fill.background !== null) writeColor(w, 'bgColor', fill.background);\n w.end();\n }\n w.end();\n}\n\nfunction writeBorder(w: XmlTextWriter, border: XlsxBorder): void {\n w.start('border');\n if (border.diagonalUp) w.attribute('diagonalUp', '1');\n if (border.diagonalDown) w.attribute('diagonalDown', '1');\n writeEdge(w, 'left', border.left);\n writeEdge(w, 'right', border.right);\n writeEdge(w, 'top', border.top);\n writeEdge(w, 'bottom', border.bottom);\n writeEdge(w, 'diagonal', border.diagonal);\n w.end();\n}\n\nfunction writeEdge(w: XmlTextWriter, name: string, edge: XlsxBorderEdge): void {\n w.start(name);\n if (edge.style !== 'none') w.attribute('style', edge.style);\n if (edge.color !== null) writeColor(w, 'color', edge.color);\n w.end();\n}\n\nfunction writeCellFormat(w: XmlTextWriter, format: XlsxCellFormat): void {\n w.start('xf');\n w.attribute('numFmtId', String(format.numberFormatId));\n w.attribute('fontId', String(format.fontId));\n w.attribute('fillId', String(format.fillId));\n w.attribute('borderId', String(format.borderId));\n w.attribute('xfId', '0');\n if (format.numberFormatId !== 0) w.attribute('applyNumberFormat', '1');\n if (format.fontId !== 0) w.attribute('applyFont', '1');\n if (format.fillId !== 0) w.attribute('applyFill', '1');\n if (format.borderId !== 0) w.attribute('applyBorder', '1');\n const a = format.alignment;\n if (a !== null) {\n w.attribute('applyAlignment', '1');\n w.start('alignment');\n if (a.horizontal !== 'general') w.attribute('horizontal', a.horizontal);\n if (a.vertical !== 'bottom') w.attribute('vertical', a.vertical);\n if (a.textRotation !== 0) w.attribute('textRotation', String(a.textRotation));\n if (a.wrapText) w.attribute('wrapText', '1');\n if (a.indent !== 0) w.attribute('indent', String(a.indent));\n if (a.shrinkToFit) w.attribute('shrinkToFit', '1');\n w.end();\n }\n w.end();\n}\n\nfunction writeColor(w: XmlTextWriter, name: string, color: XlsxColor): void {\n w.start(name);\n switch (color.kind) {\n case 'automatic':\n w.attribute('auto', '1');\n break;\n case 'rgb':\n w.attribute('rgb', hex8(color.value));\n break;\n case 'theme':\n w.attribute('theme', String(color.value));\n break;\n case 'indexed':\n w.attribute('indexed', String(color.value));\n break;\n default:\n unreachable(color.kind);\n }\n if (color.tint !== 0) w.attribute('tint', roundTrip(color.tint));\n w.end();\n}\n", "// A part's XML written as .NET's XmlWriter writes it under the settings ExGrid.Data.Xlsx gives it (UTF-8, no byte\n// order mark, no indentation), so a part written by either package is the same text (ADR-0370, section 2): the\n// declaration with `standalone=\"yes\"`, a default namespace declared after the element's other attributes, an empty\n// element closed as ` />`, text with `&`, `<` and `>` escaped and its line ends written as line feeds, and an\n// attribute with `\"`, a tab and its line ends escaped as well. It writes what the writer's callers give it, which\n// have checked that XML can carry it.\n\nconst declaration = '<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>';\n\nfunction escapeText(text: string): string {\n return text.replace(/[&<>]|\\r\\n?/g, c => {\n switch (c) {\n case '&': return '&amp;';\n case '<': return '&lt;';\n case '>': return '&gt;';\n default: return '\\n';\n }\n });\n}\n\nfunction escapeAttribute(text: string): string {\n return text.replace(/[&<>\"\\t\\n\\r]/g, c => {\n switch (c) {\n case '&': return '&amp;';\n case '<': return '&lt;';\n case '>': return '&gt;';\n case '\"': return '&quot;';\n case '\\t': return '&#x9;';\n case '\\n': return '&#xA;';\n default: return '&#xD;';\n }\n });\n}\n\n/** Writes a part's XML into text taken a piece at a time. */\nexport class XmlTextWriter {\n #text = '';\n readonly #names: string[] = [];\n /** Whether the last element's start tag is not closed yet: its attributes may still come. */\n #open = false;\n /** The default namespace the open start tag declares after its attributes, or `undefined`. */\n #namespace: string | undefined;\n\n /** The text written and not taken. */\n get length(): number {\n return this.#text.length;\n }\n\n /** Takes the text written so far. */\n take(): string {\n const text = this.#text;\n this.#text = '';\n return text;\n }\n\n /** `WriteStartDocument(standalone: true)`. */\n startDocument(): void {\n this.#text += declaration;\n }\n\n /** `WriteStartElement`: the element `name`, as written, declaring `namespace` as the default one when given. */\n start(name: string, namespace?: string): void {\n this.#close();\n this.#text += `<${name}`;\n this.#names.push(name);\n this.#open = true;\n this.#namespace = namespace;\n }\n\n /** `WriteAttributeString`: an attribute of the open start tag, its name as written (`r:id`, `xmlns:r`). */\n attribute(name: string, value: string): void {\n if (!this.#open) throw new Error(`Internal: the attribute ${name} is written outside a start tag.`);\n this.#text += ` ${name}=\"${escapeAttribute(value)}\"`;\n }\n\n /** `WriteString`: text inside the element. Even empty, it closes the start tag, so the element ends with its own tag. */\n text(value: string): void {\n this.#close();\n this.#text += escapeText(value);\n }\n\n /** `WriteEndElement`. */\n end(): void {\n const name = this.#names.pop();\n if (name === undefined) throw new Error('Internal: an element is ended where none is open.');\n if (this.#open) {\n this.#declare();\n this.#text += ' />';\n this.#open = false;\n } else {\n this.#text += `</${name}>`;\n }\n }\n\n /** `WriteElementString`: an element holding `value`, or empty for none or ''. */\n element(name: string, value: string | null): void {\n this.start(name);\n if (value !== null && value !== '') this.text(value);\n this.end();\n }\n\n #declare(): void {\n if (this.#namespace !== undefined) this.#text += ` xmlns=\"${escapeAttribute(this.#namespace)}\"`;\n this.#namespace = undefined;\n }\n\n #close(): void {\n if (!this.#open) return;\n this.#declare();\n this.#text += '>';\n this.#open = false;\n }\n}\n", "// The CRC-32 a zip entry carries (ISO 3309, as APPNOTE 4.4.7 names it), computed a piece at a time.\n\nconst table = ((): Uint32Array => {\n const t = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = (c & 1) !== 0 ? 0xEDB88320 ^ (c >>> 1) : c >>> 1;\n t[n] = c >>> 0;\n }\n return t;\n})();\n\n/** The CRC-32 of what came before, `crc` (0 for nothing), followed by `bytes`. */\nexport function crc32(crc: number, bytes: Uint8Array): number {\n let c = ~crc >>> 0;\n // Indexed in place: a checked read per byte made the CRC 14 times slower, 27 against 379 MB/s on Node 26 (2026-10-27),\n // and neither read can miss: i stays below the length, and a byte masked to 0xFF stays below the table's 256.\n for (let i = 0; i < bytes.length; i++) {\n c = (table[(c ^ (bytes[i] as number)) & 0xFF] as number) ^ (c >>> 8); // oxlint-disable-line typescript/no-unsafe-type-assertion -- both indexes are in range, as the comment above says\n }\n return ~c >>> 0;\n}\n", "// The zip under a written workbook (APPNOTE 6.3): each part deflated as it is written, by the platform's\n// CompressionStream('deflate-raw'), a piece at a time, and the package put together once every part is closed \u2014 a\n// local header with the sizes known in front of each part's compressed bytes, then the central directory. Nothing past\n// 4 GiB is written: a workbook is held to 1 GiB uncompressed (ADR-0330 \u00A79).\n\nimport { crc32 } from './crc32';\nimport { elementAt } from './must';\n\n/** The DOS date every entry carries, 1980-01-01 at midnight: what is written does not depend on when. */\nconst dosDate = (0 << 9) | (1 << 5) | 1;\n\ninterface Closed {\n readonly name: Uint8Array;\n readonly crc: number;\n readonly size: number;\n readonly compressed: readonly Uint8Array<ArrayBuffer>[];\n readonly compressedSize: number;\n}\n\nconst encoder = new TextEncoder();\n\n/** One part being written: its bytes deflated as they come, its CRC and sizes counted. */\nexport class ZipEntryWriter {\n readonly #name: string;\n readonly #writer: WritableStreamDefaultWriter<Uint8Array<ArrayBuffer>>;\n readonly #compressed: Uint8Array<ArrayBuffer>[] = [];\n readonly #pumped: Promise<void>;\n #written: Promise<void> = Promise.resolve();\n #compressedSize = 0;\n #crc = 0;\n #size = 0;\n #closed = false;\n #result: Closed | undefined;\n\n constructor(name: string) {\n this.#name = name;\n const stream = new CompressionStream('deflate-raw');\n this.#writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n this.#pumped = (async () => {\n for (;;) {\n const result = await reader.read();\n if (result.done) return;\n this.#compressed.push(result.value);\n this.#compressedSize += result.value.length;\n }\n })();\n }\n\n /** Adds `bytes` to the part. They are deflated in turn; `flush` awaits them. */\n write(bytes: Uint8Array<ArrayBuffer>): void {\n if (this.#closed) throw new Error(`Internal: the part '${this.#name}' is written after it was closed.`);\n if (bytes.length === 0) return;\n this.#crc = crc32(this.#crc, bytes);\n this.#size += bytes.length;\n const writer = this.#writer;\n this.#written = this.#written.then(() => writer.write(bytes));\n }\n\n /** Awaits the deflating of every byte written so far, so that memory holds them compressed. */\n async flush(): Promise<void> {\n await this.#written;\n }\n\n /** Ends the part: what it was given, deflated. */\n async close(): Promise<void> {\n this.#closed = true;\n await this.#written;\n await this.#writer.close();\n await this.#pumped;\n this.#result = { name: encoder.encode(this.#name), crc: this.#crc, size: this.#size, compressed: this.#compressed, compressedSize: this.#compressedSize };\n }\n\n /** The part as closed. */\n get result(): Closed {\n if (this.#result === undefined) throw new Error(`Internal: the part '${this.#name}' is put in the package before it was closed.`);\n return this.#result;\n }\n}\n\nfunction header(size: number): { bytes: Uint8Array<ArrayBuffer>; view: DataView } {\n const bytes = new Uint8Array(size);\n return { bytes, view: new DataView(bytes.buffer) };\n}\n\n/** The package being written: its parts in the order they were begun. */\nexport class ZipWriter {\n readonly #entries: ZipEntryWriter[] = [];\n\n /** Begins the part `name`, after every part begun before it. */\n entry(name: string): ZipEntryWriter {\n const entry = new ZipEntryWriter(name);\n this.#entries.push(entry);\n return entry;\n }\n\n /** The package, every part of it closed. */\n finish(): Blob {\n const entries = this.#entries.map(e => e.result);\n const parts: Uint8Array<ArrayBuffer>[] = [];\n const offsets: number[] = [];\n let offset = 0;\n for (const e of entries) {\n offsets.push(offset);\n const { bytes, view } = header(30 + e.name.length);\n view.setUint32(0, 0x04034b50, true);\n view.setUint16(4, 20, true);\n view.setUint16(6, 0, true);\n view.setUint16(8, 8, true);\n view.setUint16(10, 0, true);\n view.setUint16(12, dosDate, true);\n view.setUint32(14, e.crc, true);\n view.setUint32(18, e.compressedSize, true);\n view.setUint32(22, e.size, true);\n view.setUint16(26, e.name.length, true);\n view.setUint16(28, 0, true);\n bytes.set(e.name, 30);\n parts.push(bytes);\n parts.push(...e.compressed);\n offset += bytes.length + e.compressedSize;\n }\n const directoryStart = offset;\n entries.forEach((e, i) => {\n const { bytes, view } = header(46 + e.name.length);\n view.setUint32(0, 0x02014b50, true);\n view.setUint16(4, 20, true);\n view.setUint16(6, 20, true);\n view.setUint16(8, 0, true);\n view.setUint16(10, 8, true);\n view.setUint16(12, 0, true);\n view.setUint16(14, dosDate, true);\n view.setUint32(16, e.crc, true);\n view.setUint32(20, e.compressedSize, true);\n view.setUint32(24, e.size, true);\n view.setUint16(28, e.name.length, true);\n view.setUint32(42, elementAt(offsets, i), true);\n bytes.set(e.name, 46);\n parts.push(bytes);\n offset += bytes.length;\n });\n const { bytes, view } = header(22);\n view.setUint32(0, 0x06054b50, true);\n view.setUint16(8, entries.length, true);\n view.setUint16(10, entries.length, true);\n view.setUint32(12, offset - directoryStart, true);\n view.setUint32(16, directoryStart, true);\n parts.push(bytes);\n return new Blob(parts, { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\n }\n}\n", "// An .xlsx workbook written as a stream (ADR-0330 \u00A71), as ExGrid.Data.Xlsx's XlsxWriter writes it, part for part and\n// character for character: each worksheet's cells go into the package as they are written, row by row, and the parts\n// that need every sheet \u2014 the shared strings, the styles, the workbook part, the relationships and the content types \u2014\n// at `complete`. Each part is deflated as it is written, so the package waits in memory compressed.\n\nimport { formatCell, maxColumns, maxRows } from './cell-reference';\nimport { equalsIgnoreCase, grouped, roundTrip } from './invariant';\nimport {\n isValidTableName, tableReference,\n type XlsxCellInput, type XlsxColumnInput, type XlsxFormulaInput, type XlsxRow, type XlsxSheetVisibility, type XlsxTable,\n} from './model';\nimport {\n contentTypesNamespace, dynamicArrayExtension, mainNamespace, officeDocumentType, packageRelationshipsNamespace, relationshipsContent,\n relationshipsNamespace, sharedStringsContent, sharedStringsType, sheetMetadataContent, sheetMetadataType, stylesContent, stylesType,\n tableContent, tableType, workbookContent, worksheetContent, worksheetType,\n} from './names';\nimport { defaultMaxUncompressedBytes } from './pacer';\nimport { defaultStyles, firstCustomNumberFormat, type XlsxStyles } from './styles';\nimport { writeStyles } from './styles-writer';\nimport { carries, encodeXString } from './x-string';\nimport { XlsxError } from './xlsx-error';\nimport { XmlTextWriter } from './xml-writer';\nimport { ZipWriter, type ZipEntryWriter } from './zip-write';\nimport { foldCase } from './text-casing';\nimport { elementAt } from './must';\n\n/** A defined name to write. */\nexport interface XlsxDefinedNameInput {\n /** The name, as `Rate`, or a built-in one such as `_xlnm.Print_Area`. */\n readonly name: string;\n /** What it refers to, as a Formula's text. */\n readonly text: string;\n /** The index of the sheet it is local to; none, for a name of the whole workbook, when left out. */\n readonly localSheet?: number | null;\n /** Whether it is hidden; false when left out. */\n readonly hidden?: boolean;\n}\n\n/** What a written workbook says of itself, beside its sheets. A key left out takes the default its comment names. */\nexport interface XlsxWriteOptions {\n /** The styles the cells' style indexes point into; `defaultStyles` when left out. */\n readonly styles?: XlsxStyles;\n /** The index of the sheet the workbook shows when it opens; 0 when left out. */\n readonly activeSheet?: number;\n /** Whether the workbook counts dates from 1904; the serials written are the caller's. False when left out. */\n readonly date1904?: boolean;\n /** Whether the workbook asks to be calculated in full when Excel opens it (`fullCalcOnLoad`): every Formula is written\n * with its Value, and Excel computes them again (ADR-0330 \u00A76). False when left out. */\n readonly fullCalculationOnLoad?: boolean;\n /** The defined names the workbook part writes; none when left out. */\n readonly definedNames?: readonly XlsxDefinedNameInput[];\n /**\n * The uncompressed bytes the package's parts may hold together, 1 to 1 GiB; 1 GiB, the most a file is read with by\n * default, when left out, so that what is written opens again. A write that would go past it is refused by name\n * (`XlsxError`, `tooLarge`), naming the part, and the sheet, it met; the workbook is then abandoned.\n */\n readonly maxUncompressedBytes?: number;\n}\n\n/** The text a part's writer gathers before it is counted and deflated. */\nconst pieceLength = 64 * 1024;\n\n/** The cells `writeAll` writes between two flushes. */\nconst writeBatch = 4096;\n\nconst encoder = new TextEncoder();\n\n/** Whether `text` holds a character below U+0020. */\nfunction hasControl(text: string): boolean {\n for (let i = 0; i < text.length; i++) if (text.charCodeAt(i) < 0x20) return true;\n return false;\n}\n\n/** `char.IsWhiteSpace`: Unicode's White_Space, which is not JavaScript's `\\s`. */\nfunction isWhiteSpace(c: number): boolean {\n return (c >= 0x09 && c <= 0x0D) || c === 0x20 || c === 0x85 || c === 0xA0 || c === 0x1680 || (c >= 0x2000 && c <= 0x200A)\n || c === 0x2028 || c === 0x2029 || c === 0x202F || c === 0x205F || c === 0x3000;\n}\n\n/** A string item's text (`<t>`), keeping its edges' white space, a line feed and a tab where it has them. */\nfunction writeText(w: XmlTextWriter, text: string): void {\n w.start('t');\n if (text.length > 0 && (isWhiteSpace(text.charCodeAt(0)) || isWhiteSpace(text.charCodeAt(text.length - 1)) || text.includes('\\n') || text.includes('\\t'))) {\n w.attribute('xml:space', 'preserve');\n }\n w.text(encodeXString(text));\n w.end();\n}\n\n/** What a sheet's writer asks of the workbook's. */\ninterface WorkbookSide {\n readonly styles: XlsxStyles;\n share(text: string): number;\n dynamicArray(): void;\n addTable(sheet: number, table: XlsxTable): string;\n /** Counts and deflates a piece of a part's text, or refuses it past the limit. */\n put(entry: ZipEntryWriter, text: string, part: string, sheet: string | undefined): void;\n checkUsable(): void;\n}\n\n/**\n * Writes an `.xlsx` workbook as a stream (ADR-0330 \u00A71): each worksheet's cells go into the package as they are written,\n * and the parts that need every sheet at `complete`. Made by `createXlsxWriter`.\n */\nexport interface XlsxWriter {\n /**\n * Begins the next worksheet, after the ones before it, ending the one being written. Its cells are then written in the\n * order of the sheet: row by row, left to right.\n * @param name - The sheet's name: 1 to 31 characters, none of `[ ] : * ? / \\` and no control character or half of a\n * surrogate pair, not beginning or ending with `'`, and no other sheet's in any case.\n * @param columns - The column widths: ranges that do not overlap, each naming a cell format the styles hold.\n * @param visibility - Whether the sheet is shown; `visible` when left out.\n */\n addSheet(name: string, columns?: readonly XlsxColumnInput[], visibility?: XlsxSheetVisibility): XlsxSheetWriter;\n /** Ends the last worksheet, writes the parts that need every sheet, and returns the package. The workbook needs a sheet,\n * and the options' active sheet must name one of them. */\n complete(): Promise<Blob>;\n /** Abandons a workbook not completed, writing nothing more. */\n abandon(): Promise<void>;\n}\n\n/**\n * One worksheet being written (`XlsxWriter.addSheet`): its cells, row by row and left to right. A cell out of that order,\n * or one written twice, is refused.\n */\nexport interface XlsxSheetWriter {\n /** The sheet's name. */\n readonly name: string;\n /**\n * Adds an Excel Table over cells of this sheet (`tableParts`, and a table part of its own), before the first cell of its\n * header's row is written. Each cell of its header must then be written, as text equal to its column's name (a shared\n * or inline string, no Formula), or the cell, or the sheet's end, is refused; its rows of data hold whatever is written\n * there. A table whose name is another table's or a defined name's in the workbook, in any case, or that overlaps\n * another table of the sheet, is refused.\n */\n addTable(table: XlsxTable): void;\n /** Begins `row` with the cell format of its own that its empty cells take (`customFormat`), after every row written\n * before it; the row's cells, if any, are then written as any others. A row written before, or one that already holds\n * a cell, is refused. */\n writeRow(row: XlsxRow): void;\n /** Writes `cell`, after every cell written before it in the sheet's order. A shared string is written from its `text`\n * into the workbook's shared strings, whatever its `value` says. */\n write(cell: XlsxCellInput): void;\n /** Writes every cell of `cells` in turn, flushing between batches. */\n writeAll(cells: Iterable<XlsxCellInput>): Promise<void>;\n /** Awaits the deflating of what is written so far, so that memory holds it compressed: call it between batches of a\n * large sheet. */\n flush(): Promise<void>;\n}\n\nclass WorkbookWriter implements XlsxWriter {\n readonly #zip = new ZipWriter();\n readonly #styles: XlsxStyles;\n readonly #activeSheet: number;\n readonly #date1904: boolean;\n readonly #fullCalculation: boolean;\n readonly #definedNames: readonly XlsxDefinedNameInput[];\n readonly #max: number;\n readonly #sheets: { readonly name: string; readonly visibility: XlsxSheetVisibility }[] = [];\n readonly #sharedIndex = new Map<string, number>();\n readonly #shared: string[] = [];\n readonly #tables: { readonly sheet: number; readonly table: XlsxTable }[] = [];\n readonly #closing: Promise<void>[] = [];\n readonly #side: WorkbookSide;\n #current: SheetWriter | undefined;\n #completed = false;\n #refused = false;\n #sharedReferences = 0;\n #uncompressed = 0;\n #dynamic = false;\n\n constructor(options: XlsxWriteOptions = {}) {\n this.#styles = options.styles === undefined ? defaultStyles : options.styles;\n this.#activeSheet = options.activeSheet === undefined ? 0 : whole(options.activeSheet, 'The active sheet');\n this.#date1904 = options.date1904 === true;\n this.#fullCalculation = options.fullCalculationOnLoad === true;\n this.#definedNames = options.definedNames === undefined ? [] : [...options.definedNames];\n this.#max = options.maxUncompressedBytes === undefined ? defaultMaxUncompressedBytes : options.maxUncompressedBytes;\n if (!Number.isInteger(this.#max) || this.#max < 1 || this.#max > defaultMaxUncompressedBytes) {\n throw new RangeError(`MaxUncompressedBytes is 1 to ${grouped(defaultMaxUncompressedBytes)}.`);\n }\n validateStyles(this.#styles);\n validateNames(this.#definedNames);\n this.#side = {\n styles: this.#styles,\n share: text => {\n this.#sharedReferences++;\n let at = this.#sharedIndex.get(text);\n if (at === undefined) {\n at = this.#shared.length;\n this.#shared.push(text);\n this.#sharedIndex.set(text, at);\n }\n return at;\n },\n dynamicArray: () => {\n this.#dynamic = true;\n },\n addTable: (sheet, table) => this.#addTable(sheet, table),\n put: (entry, text, part, sheet) => this.#put(entry, text, part, sheet),\n checkUsable: () => {\n if (this.#refused) throw new Error('The workbook was refused as too large and is abandoned: nothing more is written to it.');\n },\n };\n }\n\n /**\n * Begins the next worksheet, after the ones before it, ending the one being written. Its cells are then written in the\n * order of the sheet: row by row, left to right.\n * @param name - The sheet's name: 1 to 31 characters, none of `[ ] : * ? / \\` and no control character or half of a\n * surrogate pair, not beginning or ending with `'`, and no other sheet's in any case.\n * @param columns - The column widths: ranges that do not overlap, each naming a cell format the styles hold.\n * @param visibility - Whether the sheet is shown; `visible` when left out.\n */\n addSheet(name: string, columns: readonly XlsxColumnInput[] = [], visibility: XlsxSheetVisibility = 'visible'): XlsxSheetWriter {\n this.#checkOpen();\n this.#checkName(name);\n const sorted = columns.toSorted((a, b) => a.first - b.first);\n let last = -1;\n for (const c of sorted) {\n const style = c.styleIndex === undefined ? 0 : c.styleIndex;\n const range = `${String(c.first)} to ${String(c.last)}`;\n if (!Number.isInteger(c.first) || !Number.isInteger(c.last) || c.first < 0 || c.last < c.first || c.last >= maxColumns) {\n throw new TypeError(`The column range ${range} lies outside the sheet's columns.`);\n }\n if (c.first <= last) throw new TypeError(`The column range ${range} overlaps another, which ends at ${String(last)}.`);\n if (!Number.isInteger(style) || style < 0 || style >= this.#styles.cellFormats.length) {\n throw new TypeError(`The column range ${range} names the cell format ${String(style)}, which the styles do not hold.`);\n }\n last = c.last;\n }\n this.#endCurrent();\n const index = this.#sheets.length;\n this.#sheets.push({ name, visibility });\n const part = `xl/worksheets/sheet${String(index + 1)}.xml`;\n this.#current = new SheetWriter(this.#side, index, name, part, this.#zip.entry(part), sorted, index === this.#activeSheet,\n closing => this.#closing.push(closing));\n return this.#current;\n }\n\n /**\n * Ends the last worksheet, writes the parts that need every sheet, and returns the package. The workbook needs a sheet,\n * and the options' active sheet must name one of them.\n */\n async complete(): Promise<Blob> {\n this.#checkOpen();\n if (this.#sheets.length === 0) throw new Error('A workbook holds at least one sheet; add one before completing it.');\n if (this.#activeSheet < 0 || this.#activeSheet >= this.#sheets.length) {\n throw new Error(`The active sheet ${String(this.#activeSheet)} is not one of the workbook's ${String(this.#sheets.length)} sheets.`);\n }\n // Completed from here, whatever happens: nothing more is written.\n this.#completed = true;\n this.#endCurrent();\n this.#current = undefined;\n const dynamic = this.#dynamic;\n if (this.#shared.length > 0) this.#part('xl/sharedStrings.xml', w => this.#writeSharedStrings(w));\n this.#part('xl/styles.xml', w => writeStyles(w, this.#styles));\n if (dynamic) this.#part('xl/metadata.xml', writeMetadata);\n this.#tables.forEach(({ table }, i) => {\n const id = i + 1;\n this.#part(`xl/tables/table${String(id)}.xml`, w => writeTable(w, table, id));\n });\n for (const sheet of new Set(this.#tables.map(t => t.sheet))) {\n this.#part(`xl/worksheets/_rels/sheet${String(sheet + 1)}.xml.rels`, w => this.#writeSheetRelationships(w, sheet));\n }\n this.#part('xl/workbook.xml', w => this.#writeWorkbook(w));\n this.#part('xl/_rels/workbook.xml.rels', w => this.#writeWorkbookRelationships(w, dynamic));\n this.#part('_rels/.rels', writeRootRelationships);\n this.#part('[Content_Types].xml', w => this.#writeContentTypes(w, dynamic));\n await Promise.all(this.#closing);\n return this.#zip.finish();\n }\n\n /** Abandons a workbook not completed, writing nothing more. */\n async abandon(): Promise<void> {\n this.#completed = true;\n this.#current?.abandon();\n this.#current = undefined;\n // What was being deflated is let finish; it is dropped with the writer.\n await Promise.allSettled(this.#closing);\n }\n\n #checkOpen(): void {\n this.#side.checkUsable();\n if (this.#completed) throw new Error('The workbook is completed or abandoned: nothing more is written to it.');\n }\n\n #endCurrent(): void {\n this.#current?.end();\n }\n\n #put(entry: ZipEntryWriter, text: string, part: string, sheet: string | undefined): void {\n this.#side.checkUsable();\n const bytes = encoder.encode(text);\n this.#uncompressed += bytes.length;\n if (this.#uncompressed > this.#max) {\n this.#refused = true;\n throw new XlsxError('tooLarge',\n `The workbook would hold more than the ${grouped(this.#max)} uncompressed bytes a file is written with (XlsxWriteOptions.MaxUncompressedBytes).`,\n { part, sheet });\n }\n entry.write(bytes);\n }\n\n #part(name: string, write: (w: XmlTextWriter) => void): void {\n const entry = this.#zip.entry(name);\n const w = new XmlTextWriter();\n w.startDocument();\n write(w);\n this.#put(entry, w.take(), name, undefined);\n this.#closing.push(entry.close());\n }\n\n /** Records a table on the sheet `sheet`, checked against every other table and defined name of the workbook: the id of\n * the relationship the sheet's `tablePart` names. */\n #addTable(sheet: number, table: XlsxTable): string {\n checkTable(table);\n if (this.#tables.some(t => equalsIgnoreCase(t.table.name, table.name)) || this.#definedNames.some(n => equalsIgnoreCase(n.name, table.name))) {\n throw new TypeError(`The workbook already has a table or a defined name named '${table.name}', in some case.`);\n }\n const own = this.#tables.filter(t => t.sheet === sheet).map(t => t.table);\n const other = own.find(t => overlaps(t, table));\n if (other !== undefined) {\n throw new TypeError(`The table '${table.name}' (${tableReference(table)}) overlaps the table '${other.name}' (${tableReference(other)}).`);\n }\n this.#tables.push({ sheet, table });\n return `rId${String(own.length + 1)}`;\n }\n\n #checkName(name: string): void {\n if (typeof name !== 'string') throw new TypeError(\"A sheet's name is text.\");\n if (name.length === 0 || name.length > 31) throw new TypeError(`A sheet's name is 1 to 31 characters; '${name}' is ${String(name.length)}.`);\n if (!carries(name, false) || hasControl(name)) {\n throw new TypeError(\"A sheet's name holds no control character and no half of a surrogate pair, which XML cannot carry.\");\n }\n if (/[[\\]:*?/\\\\]/.test(name)) throw new TypeError(`A sheet's name holds none of [ ] : * ? / \\\\; '${name}' does.`);\n if (name.startsWith(\"'\") || name.endsWith(\"'\")) throw new TypeError(`A sheet's name does not begin or end with an apostrophe; '${name}' does.`);\n if (this.#sheets.some(s => equalsIgnoreCase(s.name, name))) throw new TypeError(`The workbook already has a sheet named '${name}', in some case.`);\n }\n\n #writeSharedStrings(w: XmlTextWriter): void {\n w.start('sst', mainNamespace);\n w.attribute('count', String(this.#sharedReferences));\n w.attribute('uniqueCount', String(this.#shared.length));\n for (const text of this.#shared) {\n w.start('si');\n writeText(w, text);\n w.end();\n }\n w.end();\n }\n\n #writeSheetRelationships(w: XmlTextWriter, sheet: number): void {\n w.start('Relationships', packageRelationshipsNamespace);\n let id = 1;\n this.#tables.forEach((t, i) => {\n if (t.sheet !== sheet) return;\n w.start('Relationship');\n w.attribute('Id', `rId${String(id++)}`);\n w.attribute('Type', tableType);\n w.attribute('Target', `../tables/table${String(i + 1)}.xml`);\n w.end();\n });\n w.end();\n }\n\n #writeWorkbook(w: XmlTextWriter): void {\n w.start('workbook', mainNamespace);\n w.attribute('xmlns:r', relationshipsNamespace);\n if (this.#date1904) {\n w.start('workbookPr');\n w.attribute('date1904', '1');\n w.end();\n }\n w.start('bookViews');\n w.start('workbookView');\n if (this.#activeSheet !== 0) w.attribute('activeTab', String(this.#activeSheet));\n w.end();\n w.end();\n w.start('sheets');\n this.#sheets.forEach((s, i) => {\n w.start('sheet');\n w.attribute('name', s.name);\n w.attribute('sheetId', String(i + 1));\n if (s.visibility !== 'visible') w.attribute('state', s.visibility);\n w.attribute('r:id', `rId${String(i + 1)}`);\n w.end();\n });\n w.end();\n if (this.#definedNames.length > 0) {\n w.start('definedNames');\n for (const n of this.#definedNames) {\n w.start('definedName');\n w.attribute('name', n.name);\n if (n.localSheet !== undefined && n.localSheet !== null) w.attribute('localSheetId', String(n.localSheet));\n if (n.hidden === true) w.attribute('hidden', '1');\n w.text(encodeXString(n.text));\n w.end();\n }\n w.end();\n }\n w.start('calcPr');\n w.attribute('calcId', '191029');\n if (this.#fullCalculation) w.attribute('fullCalcOnLoad', '1');\n w.end();\n w.end();\n }\n\n #writeWorkbookRelationships(w: XmlTextWriter, dynamic: boolean): void {\n w.start('Relationships', packageRelationshipsNamespace);\n let id = 1;\n const relationship = (type: string, target: string): void => {\n w.start('Relationship');\n w.attribute('Id', `rId${String(id++)}`);\n w.attribute('Type', type);\n w.attribute('Target', target);\n w.end();\n };\n this.#sheets.forEach((_, i) => relationship(worksheetType, `worksheets/sheet${String(i + 1)}.xml`));\n relationship(stylesType, 'styles.xml');\n if (this.#shared.length > 0) relationship(sharedStringsType, 'sharedStrings.xml');\n if (dynamic) relationship(sheetMetadataType, 'metadata.xml');\n w.end();\n }\n\n #writeContentTypes(w: XmlTextWriter, dynamic: boolean): void {\n w.start('Types', contentTypesNamespace);\n const entry = (element: string, key: string, value: string, type: string): void => {\n w.start(element);\n w.attribute(key, value);\n w.attribute('ContentType', type);\n w.end();\n };\n entry('Default', 'Extension', 'rels', relationshipsContent);\n entry('Default', 'Extension', 'xml', 'application/xml');\n entry('Override', 'PartName', '/xl/workbook.xml', workbookContent);\n this.#sheets.forEach((_, i) => entry('Override', 'PartName', `/xl/worksheets/sheet${String(i + 1)}.xml`, worksheetContent));\n entry('Override', 'PartName', '/xl/styles.xml', stylesContent);\n if (this.#shared.length > 0) entry('Override', 'PartName', '/xl/sharedStrings.xml', sharedStringsContent);\n if (dynamic) entry('Override', 'PartName', '/xl/metadata.xml', sheetMetadataContent);\n this.#tables.forEach((_, i) => entry('Override', 'PartName', `/xl/tables/table${String(i + 1)}.xml`, tableContent));\n w.end();\n }\n}\n\n/** A writer of an `.xlsx` workbook (`XlsxWriter`).\n * @param options - What the workbook says of itself; the defaults when left out. */\nexport function createXlsxWriter(options?: XlsxWriteOptions): XlsxWriter {\n return new WorkbookWriter(options);\n}\n\nfunction overlaps(a: XlsxTable, b: XlsxTable): boolean {\n return a.headerRow <= b.headerRow + b.dataRows && b.headerRow <= a.headerRow + a.dataRows\n && a.firstColumn < b.firstColumn + b.columns.length && b.firstColumn < a.firstColumn + a.columns.length;\n}\n\nfunction writeRootRelationships(w: XmlTextWriter): void {\n w.start('Relationships', packageRelationshipsNamespace);\n w.start('Relationship');\n w.attribute('Id', 'rId1');\n w.attribute('Type', officeDocumentType);\n w.attribute('Target', 'xl/workbook.xml');\n w.end();\n w.end();\n}\n\nfunction writeMetadata(w: XmlTextWriter): void {\n const xda = 'http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray';\n w.start('metadata', mainNamespace);\n w.attribute('xmlns:xda', xda);\n w.start('metadataTypes');\n w.attribute('count', '1');\n w.start('metadataType');\n for (const [name, value] of [\n ['name', 'XLDAPR'], ['minSupportedVersion', '120000'], ['copy', '1'], ['pasteAll', '1'], ['pasteValues', '1'],\n ['merge', '1'], ['splitFirst', '1'], ['rowColShift', '1'], ['clearFormats', '1'], ['clearComments', '1'],\n ['assign', '1'], ['coerce', '1'], ['cellMeta', '1'],\n ] as const) {\n w.attribute(name, value);\n }\n w.end();\n w.end();\n w.start('futureMetadata');\n w.attribute('name', 'XLDAPR');\n w.attribute('count', '1');\n w.start('bk');\n w.start('extLst');\n w.start('ext');\n w.attribute('uri', dynamicArrayExtension);\n w.start('xda:dynamicArrayProperties');\n w.attribute('fDynamic', '1');\n w.attribute('fCollapsed', '0');\n w.end();\n w.end();\n w.end();\n w.end();\n w.end();\n w.start('cellMetadata');\n w.attribute('count', '1');\n w.start('bk');\n w.start('rc');\n w.attribute('t', '1');\n w.attribute('v', '0');\n w.end();\n w.end();\n w.end();\n w.end();\n}\n\n/** A table part (CT_Table): its range, an AutoFilter over it, its columns and Excel's default style. */\nfunction writeTable(w: XmlTextWriter, table: XlsxTable, id: number): void {\n const reference = tableReference(table);\n w.start('table', mainNamespace);\n w.attribute('id', String(id));\n w.attribute('name', table.name);\n w.attribute('displayName', table.name);\n w.attribute('ref', reference);\n w.attribute('totalsRowShown', '0');\n if (table.autoFilter !== false) {\n w.start('autoFilter');\n w.attribute('ref', reference);\n w.end();\n }\n w.start('tableColumns');\n w.attribute('count', String(table.columns.length));\n table.columns.forEach((column, i) => {\n w.start('tableColumn');\n w.attribute('id', String(i + 1));\n w.attribute('name', encodeXString(column));\n w.end();\n });\n w.end();\n w.start('tableStyleInfo');\n w.attribute('name', 'TableStyleMedium2');\n w.attribute('showFirstColumn', '0');\n w.attribute('showLastColumn', '0');\n w.attribute('showRowStripes', '1');\n w.attribute('showColumnStripes', '0');\n w.end();\n w.end();\n}\n\n/** A table's own shape: its name as Excel names a Table, its columns, and its range within a sheet. */\nfunction checkTable(table: XlsxTable): void {\n if (!isValidTableName(table.name)) {\n throw new TypeError(\n `'${table.name}' is not a name a table can have: a letter, _ or \\\\, then letters, digits, _ and ., at most 255 characters, and not a cell's address.`);\n }\n const name = table.name;\n if (table.columns.length === 0) throw new TypeError(`The table '${name}' has at least one column.`);\n const seen = new Set<string>();\n for (const column of table.columns) {\n if (typeof column !== 'string' || column === '') throw new TypeError(`A column of the table '${name}' has no name.`);\n if (!carries(column, true)) throw new TypeError(`A column's name in the table '${name}' holds half of a surrogate pair, which XML cannot carry.`);\n const folded = foldCase(column);\n if (seen.has(folded)) throw new TypeError(`The table '${name}' names the column '${column}' twice, in some case.`);\n seen.add(folded);\n }\n if (!Number.isInteger(table.dataRows) || table.dataRows < 1) {\n throw new TypeError(`The table '${name}' has at least one row of data; Excel holds a table of none as one empty row.`);\n }\n if (!Number.isInteger(table.headerRow) || !Number.isInteger(table.firstColumn) || table.headerRow < 0 || table.firstColumn < 0\n || table.headerRow + table.dataRows >= maxRows || table.firstColumn + table.columns.length > maxColumns) {\n throw new TypeError(`The table '${name}' lies outside the sheet.`);\n }\n}\n\n/** `value`, which a whole number's place in the file needs; a fraction is refused, where .NET's `int` cannot hold one. */\nfunction whole(value: number, what: string): number {\n if (!Number.isInteger(value)) throw new TypeError(`${what} is a whole number, not ${String(value)}.`);\n return value;\n}\n\nfunction validateStyles(styles: XlsxStyles): void {\n if (styles.fonts.length === 0 || styles.fills.length < 2 || styles.borders.length === 0 || styles.cellFormats.length === 0) {\n throw new TypeError('A styles part has at least one font, two fills (none and gray125, which Excel reserves), one border and one cell format.');\n }\n styles.cellFormats.forEach((f, i) => {\n for (const id of [f.numberFormatId, f.fontId, f.fillId, f.borderId]) whole(id, `An index of the cell format ${String(i)}`);\n if (f.alignment !== null) {\n whole(f.alignment.indent, `The indent of the cell format ${String(i)}`);\n whole(f.alignment.textRotation, `The text rotation of the cell format ${String(i)}`);\n }\n if (f.fontId < 0 || f.fontId >= styles.fonts.length || f.fillId < 0 || f.fillId >= styles.fills.length\n || f.borderId < 0 || f.borderId >= styles.borders.length || f.numberFormatId < 0\n || (f.numberFormatId >= firstCustomNumberFormat && !styles.numberFormats.has(f.numberFormatId))) {\n throw new TypeError(`The cell format ${String(i)} names a font, fill, border or Number Format the styles do not hold.`);\n }\n });\n // What the styles part writes as text is checked here, so that completing the workbook cannot fail on it.\n if ([...styles.numberFormats.values()].some(code => typeof code !== 'string' || !carries(code, true))\n || styles.fonts.some(f => f.name !== null && !carries(f.name, false))\n || styles.fills.some(f => f.pattern !== null && !carries(f.pattern, false))) {\n throw new TypeError(\"A Number Format, a font's name or a fill's pattern holds text XML cannot carry: a control character, or half of a surrogate pair.\");\n }\n}\n\nfunction validateNames(names: readonly XlsxDefinedNameInput[]): void {\n for (const n of names) {\n if (typeof n.name !== 'string' || n.name === '' || typeof n.text !== 'string') throw new TypeError('A defined name has a name and a text.');\n if (n.localSheet !== undefined && n.localSheet !== null) whole(n.localSheet, `The defined name '${n.name}''s sheet`);\n if (!carries(n.name, false) || hasControl(n.name) || !carries(n.text, true)) {\n throw new TypeError(`The defined name '${n.name}' holds a control character or half of a surrogate pair, which XML cannot carry.`);\n }\n }\n}\n\nclass SheetWriter implements XlsxSheetWriter {\n readonly #owner: WorkbookSide;\n readonly #index: number;\n readonly #part: string;\n readonly #entry: ZipEntryWriter;\n readonly #xml = new XmlTextWriter();\n readonly #closed: (closing: Promise<void>) => void;\n readonly #tables: { readonly table: XlsxTable; readonly id: string; written: number }[] = [];\n #rowOpen = false;\n #ended = false;\n #row = -1;\n #column = -1;\n\n /** The sheet's name. */\n readonly name: string;\n\n constructor(owner: WorkbookSide, index: number, name: string, part: string, entry: ZipEntryWriter, columns: readonly XlsxColumnInput[],\n active: boolean, closed: (closing: Promise<void>) => void) {\n this.#owner = owner;\n this.#index = index;\n this.name = name;\n this.#part = part;\n this.#entry = entry;\n this.#closed = closed;\n const xml = this.#xml;\n xml.startDocument();\n xml.start('worksheet', mainNamespace);\n xml.attribute('xmlns:r', relationshipsNamespace);\n xml.start('sheetViews');\n xml.start('sheetView');\n if (active) xml.attribute('tabSelected', '1');\n xml.attribute('workbookViewId', '0');\n xml.end();\n xml.end();\n xml.start('sheetFormatPr');\n xml.attribute('defaultRowHeight', '15');\n xml.end();\n if (columns.length > 0) {\n xml.start('cols');\n for (const c of columns) {\n xml.start('col');\n xml.attribute('min', String(c.first + 1));\n xml.attribute('max', String(c.last + 1));\n if (c.width !== undefined && c.width !== null) {\n xml.attribute('width', roundTrip(c.width));\n if (c.customWidth !== false) xml.attribute('customWidth', '1');\n if (c.bestFit === true) xml.attribute('bestFit', '1');\n }\n if (c.styleIndex !== undefined && c.styleIndex !== 0) xml.attribute('style', String(c.styleIndex));\n if (c.hidden === true) xml.attribute('hidden', '1');\n xml.end();\n }\n xml.end();\n }\n xml.start('sheetData');\n }\n\n #checkOpen(): void {\n this.#owner.checkUsable();\n if (this.#ended) throw new Error(`The sheet '${this.name}' is ended: another sheet was begun, or the workbook completed.`);\n }\n\n /**\n * Adds an Excel Table over cells of this sheet (`tableParts`, and a table part of its own), before the first cell of its\n * header's row is written. Each cell of its header must then be written, as text equal to its column's name (a shared\n * or inline string, no Formula), or the cell, or the sheet's end, is refused; its rows of data hold whatever is written\n * there. A table whose name is another table's or a defined name's in the workbook, in any case, or that overlaps\n * another table of the sheet, is refused.\n */\n addTable(table: XlsxTable): void {\n this.#checkOpen();\n // A copy, so that a list the caller changes afterwards cannot make the table part's names differ from the header written.\n const copy: XlsxTable = Object.freeze({ ...table, columns: Object.freeze([...table.columns]) });\n if (copy.headerRow <= this.#row) {\n throw new TypeError(`The table '${copy.name}' is added after row ${String(this.#row + 1)} was begun: a table is added before its header's row.`);\n }\n const id = this.#owner.addTable(this.#index, copy);\n this.#tables.push({ table: copy, id, written: 0 });\n }\n\n /**\n * Begins `row` with the cell format of its own that its empty cells take (`customFormat`), after every row written\n * before it; the row's cells, if any, are then written as any others. A row written before, or one that already holds\n * a cell, is refused.\n */\n writeRow(row: XlsxRow): void {\n this.#checkOpen();\n if (!Number.isInteger(row.row) || row.row < 0 || row.row >= maxRows) throw new TypeError(`The row ${String(row.row)} lies outside the sheet.`);\n if (row.row <= this.#row) {\n throw new TypeError(`The row ${String(row.row + 1)} is begun after row ${String(this.#row + 1)}: a sheet's rows are written in order, each once.`);\n }\n if (!Number.isInteger(row.styleIndex) || row.styleIndex < 0 || row.styleIndex >= this.#owner.styles.cellFormats.length) {\n throw new TypeError(`The row ${String(row.row + 1)} names the cell format ${String(row.styleIndex)}, which the styles do not hold.`);\n }\n const xml = this.#xml;\n if (this.#rowOpen) xml.end();\n xml.start('row');\n xml.attribute('r', String(row.row + 1));\n xml.attribute('s', String(row.styleIndex));\n xml.attribute('customFormat', '1');\n this.#rowOpen = true;\n this.#row = row.row;\n this.#column = -1;\n this.#spill();\n }\n\n /**\n * Writes `cell`, after every cell written before it in the sheet's order. A shared string is written from its `text`\n * into the workbook's shared strings, whatever its `value` says.\n */\n write(cell: XlsxCellInput): void {\n this.#checkOpen();\n if (!Number.isInteger(cell.row) || !Number.isInteger(cell.column) || cell.row < 0 || cell.row >= maxRows || cell.column < 0 || cell.column >= maxColumns) {\n throw new TypeError(`The cell at row ${String(cell.row)}, column ${String(cell.column)} lies outside the sheet.`);\n }\n const reference = formatCell(cell.row, cell.column);\n const type = typeAttribute(cell);\n if (cell.row < this.#row || (cell.row === this.#row && cell.column <= this.#column)) {\n const after = this.#column < 0 ? `row ${String(this.#row + 1)}` : formatCell(this.#row, this.#column);\n throw new TypeError(`The cell ${reference} is written after ${after}: a sheet's cells are written row by row, left to right, each once.`);\n }\n const styleIndex = cell.styleIndex === undefined ? 0 : cell.styleIndex;\n if (!Number.isInteger(styleIndex) || styleIndex < 0 || styleIndex >= this.#owner.styles.cellFormats.length) {\n throw new TypeError(`The cell ${reference} names the cell format ${String(styleIndex)}, which the styles do not hold.`);\n }\n const value = cell.value === undefined ? null : cell.value;\n const text = cell.text === undefined ? null : cell.text;\n const formula = cell.formula === undefined ? null : cell.formula;\n // Every argument is checked before anything is written, so that a refused cell leaves the sheet as it was.\n const kind = formula === null || formula.kind === undefined ? 'normal' : formula.kind;\n const sharedIndex = formula === null || formula.sharedIndex === undefined ? null : formula.sharedIndex;\n if (kind === 'shared' && sharedIndex === null) throw new TypeError(`The cell ${reference}'s shared formula names no group.`);\n if (sharedIndex !== null) whole(sharedIndex, `The cell ${reference}'s shared formula group`);\n if (formula !== null && (typeof formula.text !== 'string' || !carries(formula.text, true)\n || (formula.reference !== undefined && formula.reference !== null && !carries(formula.reference, false)))) {\n throw new TypeError(`The cell ${reference}'s Formula holds text XML cannot carry.`);\n }\n const carried = cell.type === 'sharedString' || cell.type === 'inlineString' ? text === null || carries(text, true)\n : cell.type === 'formulaString' ? value === null || carries(value, true)\n : value === null || carries(value, false);\n if (!carried) throw new TypeError(`The cell ${reference} holds text XML cannot carry: a control character, or half of a surrogate pair.`);\n const header = this.#headerOf(cell, reference, text, formula);\n const xml = this.#xml;\n if (cell.row !== this.#row) {\n if (this.#rowOpen) xml.end();\n xml.start('row');\n xml.attribute('r', String(cell.row + 1));\n this.#rowOpen = true;\n this.#row = cell.row;\n }\n this.#column = cell.column;\n if (header !== undefined) header.written++;\n xml.start('c');\n xml.attribute('r', reference);\n if (styleIndex !== 0) xml.attribute('s', String(styleIndex));\n if (type !== undefined) xml.attribute('t', type);\n if (formula !== null && formula.isDynamicArray === true) {\n xml.attribute('cm', '1');\n this.#owner.dynamicArray();\n }\n if (formula !== null) this.#writeFormula(formula, kind, sharedIndex, reference);\n switch (cell.type) {\n case 'sharedString':\n xml.element('v', String(this.#owner.share(text === null ? '' : text)));\n break;\n case 'inlineString':\n xml.start('is');\n writeText(xml, text === null ? '' : text);\n xml.end();\n break;\n case 'formulaString':\n if (value !== null) xml.element('v', encodeXString(value));\n break;\n case 'number':\n case 'boolean':\n case 'error':\n case 'date':\n if (value !== null) xml.element('v', value);\n break;\n default:\n throw new TypeError(`'${String(cell.type)}' is not a cell's type.`);\n }\n xml.end();\n this.#spill();\n }\n\n #writeFormula(formula: XlsxFormulaInput, kind: string, sharedIndex: number | null, reference: string): void {\n const xml = this.#xml;\n xml.start('f');\n if (kind !== 'normal') xml.attribute('t', kind);\n if (formula.reference !== undefined && formula.reference !== null) xml.attribute('ref', formula.reference);\n else if (kind === 'array') xml.attribute('ref', reference);\n if (sharedIndex !== null) xml.attribute('si', String(sharedIndex));\n if (formula.text.length > 0) xml.text(encodeXString(formula.text));\n xml.end();\n }\n\n /** Writes every cell of `cells` in turn, flushing between batches. */\n async writeAll(cells: Iterable<XlsxCellInput>): Promise<void> {\n let n = 0;\n for (const cell of cells) {\n this.write(cell);\n if (++n % writeBatch === 0) await this.flush();\n }\n }\n\n /** Awaits the deflating of what is written so far, so that memory holds it compressed: call it between batches of a\n * large sheet. */\n async flush(): Promise<void> {\n if (!this.#ended) this.#spill(true);\n await this.#entry.flush();\n }\n\n /** The count of header cells written of the table whose header holds `cell`, or undefined when none does; a header's\n * cell that does not hold its column's name as text is refused. */\n #headerOf(cell: XlsxCellInput, reference: string, text: string | null, formula: XlsxFormulaInput | null): { written: number } | undefined {\n for (const t of this.#tables) {\n const { table } = t;\n if (cell.row !== table.headerRow || cell.column < table.firstColumn || cell.column >= table.firstColumn + table.columns.length) continue;\n const name = elementAt(table.columns, cell.column - table.firstColumn);\n if ((cell.type !== 'sharedString' && cell.type !== 'inlineString') || formula !== null || text !== name) {\n throw new TypeError(\n `The cell ${reference} is in the header of the table '${table.name}', and holds its column's name, '${name}', as text, with no Formula.`);\n }\n return t;\n }\n return undefined;\n }\n\n /** Hands the text gathered to the package once it is long enough, or whatever there is when `all`. */\n #spill(all = false): void {\n if (this.#xml.length === 0 || (!all && this.#xml.length < pieceLength)) return;\n this.#owner.put(this.#entry, this.#xml.take(), this.#part, this.name);\n }\n\n /** Ends the sheet. */\n end(): void {\n if (this.#ended) return;\n // A table whose header was not written whole would be repaired by Excel: the sheet is not ended, and the caller\n // abandons the workbook.\n for (const { table, written } of this.#tables) {\n if (written !== table.columns.length) {\n throw new Error(`The sheet '${this.name}' ends with ${String(written)} of the ${String(table.columns.length)} cells of the header of the table '${table.name}' written; each holds its column's name.`);\n }\n }\n this.#ended = true;\n const xml = this.#xml;\n if (this.#rowOpen) xml.end();\n xml.end();\n if (this.#tables.length > 0) {\n xml.start('tableParts');\n xml.attribute('count', String(this.#tables.length));\n for (const { id } of this.#tables) {\n xml.start('tablePart');\n xml.attribute('r:id', id);\n xml.end();\n }\n xml.end();\n }\n xml.end();\n this.#owner.put(this.#entry, xml.take(), this.#part, this.name);\n this.#closed(this.#entry.close());\n }\n\n /** Abandons the sheet. */\n abandon(): void {\n if (this.#ended) return;\n this.#ended = true;\n this.#closed(this.#entry.close());\n }\n}\n\nfunction typeAttribute(cell: XlsxCellInput): string | undefined {\n switch (cell.type) {\n case 'sharedString': return 's';\n case 'inlineString': return 'inlineStr';\n case 'formulaString': return 'str';\n case 'boolean': return 'b';\n case 'error': return 'e';\n case 'date': return 'd';\n case 'number': return undefined;\n default: throw new TypeError(`'${String(cell.type)}' is not a cell's type.`);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ahead", "piece", "declaration", "prefix", "low", "at", "count", "header", "header", "resolve", "table", "children", "argb", "count", "argb", "whole", "count", "blocks", "argb", "bytes", "view", "encoder", "table", "header"]
7
+ }