@particle-academy/holy-sheet 2.4.2 → 2.4.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util.ts","../src/schema/inference.ts","../src/helpers/array-builder.ts","../src/helpers/csv-builder.ts","../src/workbook/cell-address.ts","../src/workbook/cell.ts","../src/workbook/cell-comment.ts","../src/workbook/cell-format.ts","../src/workbook/merged-region.ts","../src/workbook/sheet.ts","../src/workbook/workbook.ts","../src/writer/format/date-converter.ts","../src/schema/theme.ts","../src/schema/normalizer.ts","../src/schema/formula-linter.ts","../src/exceptions.ts","../src/schema/repairer.ts","../src/schema/validator.ts","../src/zip/crc32.ts","../src/zip/zip-writer.ts","../src/zip/inflate.ts","../src/zip/zip-reader.ts","../src/reader/ods/ns.ts","../src/reader/format-sniffer.ts","../src/reader/ods/ods-formula.ts","../src/reader/format/num-fmt-parser.ts","../src/reader/ods/ods-styles.ts","../src/reader/ods/ods-text.ts","../src/reader/format/date-inverter.ts","../src/reader/workbook-schema.ts","../src/reader/xml.ts","../src/reader/ods-reader.ts","../src/reader/comments-parser.ts","../src/reader/rels-parser.ts","../src/reader/shared-strings-parser.ts","../src/reader/styles-parser.ts","../src/reader/worksheet-parser.ts","../src/reader/xlsx-reader.ts","../src/xml.ts","../src/writer/format/num-fmt-builder.ts","../src/writer/styles-registry.ts","../src/writer/xlsx-writer.ts","../src/ops/php.ts","../src/ops/sheet-op-schema.ts","../src/ops/sheet-reducer.ts","../src/ops/sheet-diff.ts","../src/holy-sheet.schema.json","../src/agent.ts","../src/holy-sheet.ts"],"names":["sheetName","quote","color","error","first","ISO_DATE","VALID_THEMES","part","decoder","el","has","lines","serial","end","border","hex","encoder","v","phpInt","phpTrim","position","at","i","j"],"mappings":"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","file":"index.js","sourcesContent":["/** Shared low-level helpers that mirror PHP's loose numeric semantics. */\n\n/** PHP `is_numeric` (approx): optional leading whitespace, sign, int/float, exponent. */\nexport function isNumericString(v: unknown): boolean {\n if (typeof v === \"number\") return Number.isFinite(v);\n if (typeof v !== \"string\") return false;\n return /^\\s*[+-]?(\\d+(\\.\\d+)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(v);\n}\n\n/**\n * Coerce a numeric string the way PHP does.\n *\n * This used to be `v.includes(\".\") ? parseFloat(v) : parseInt(v, 10)`, on the\n * theory that it mirrored PHP's `(float)`/`(int)`. It does not. `parseInt`\n * stops at the first character that is not a digit, so it reads \"1e5\" as 1 and\n * throws the exponent away, while PHP has parsed exponent notation in numeric\n * strings since PHP 7 and says 100000. Every value written as \"1e5\", \"2E-3\" or\n * \"1.5e3\" therefore landed in the sheet as a different number depending on\n * which backend wrote it.\n *\n * `Number` is what the rest of this package already uses for exactly this\n * (see `FormulaLinter.coerceNumber`) — the two disagreed with each other, not\n * just with PHP.\n *\n * The float path is deliberate for integers too: PHP's `(int)` cast CLAMPS at\n * PHP_INT_MAX, so `(int) \"1e21\"` is 9223372036854775807 — a number nobody\n * wrote. Both engines now take the float path and both say 1e21. The emitted\n * `<v>` is unchanged for integral values, because `formatFloat` trims the\n * fraction away.\n */\nexport function numericStringToNumber(v: string): number {\n return Number(v);\n}\n\n/**\n * Serialize a float the way the PHP writer does:\n * `rtrim(rtrim(number_format($v, 14, '.', ''), '0'), '.')`.\n *\n * `toFixed` alone cannot do this. It switches to exponential notation at 1e21,\n * and the trailing-zero trim then chewed on the EXPONENT rather than a\n * fraction:\n *\n * (1e300).toFixed(14) === \"1e+300\"\n * \"1e+300\".replace(/0+$/, \"\") === \"1e+3\"\n *\n * so 1e300 was written to the sheet as 1e3. Not a crash and not invalid XML —\n * simply a different number, silently, in a file someone opens later and\n * believes. At 1e21 exactly it produced `<v>1e+21</v>`, which is not valid cell\n * content at all. PHP's `number_format` has no exponential mode and was right\n * throughout.\n *\n * Above 1e21 every double is an integer, so `BigInt` gives the exact digits\n * PHP prints — verified against it, including that 1e300 expands to\n * 1000000000000000052504760… and not to a 1 with 300 zeros.\n */\nexport function formatFloat(v: number): string {\n // NaN and Infinity have no `<v>` representation; \"NaN\" in a cell is a\n // corrupt sheet. PHP's number_format yields 0 for both, so match it.\n if (!Number.isFinite(v)) return \"0\";\n\n let s = Math.abs(v) >= 1e21 ? BigInt(v).toString() : v.toFixed(14);\n\n // Only ever trim a FRACTION. The old unconditional /0+$/ is what turned an\n // exponent into a smaller exponent, and it would equally have eaten the\n // trailing zeros of an integer like 1200 had toFixed not always emitted a\n // decimal point.\n if (s.includes(\".\")) s = s.replace(/0+$/, \"\").replace(/\\.$/, \"\");\n\n return s === \"\" || s === \"-0\" ? \"0\" : s;\n}\n\n/** PHP-style debug type name, used by the validator's `got` field. */\nexport function typeOf(value: unknown): string {\n if (value === null || value === undefined) return \"null\";\n if (Array.isArray(value)) return \"array\";\n switch (typeof value) {\n case \"object\":\n return \"object\";\n case \"boolean\":\n return \"bool\";\n case \"number\":\n return Number.isInteger(value) ? \"int\" : \"float\";\n case \"string\":\n return \"string\";\n default:\n return typeof value;\n }\n}\n\n/**\n * True for a plain object map (sparse cells / CellData), false for arrays/primitives.\n * Narrows to `Record<string, any>` because the input is loose agent JSON — the\n * Validator, not the type system, is the gate.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isPlainObject(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { isNumericString } from \"../util\";\nimport type { BuilderOptions, ColumnSchema } from \"./types\";\n\n/** Type inference for tabular data → column types. Mirrors PHP `Schema\\Inference`. */\nconst SAMPLE_SIZE = 50;\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst ISO_DATETIME = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?$/;\nconst HEADER_INTEGER = /(^|[\\s_])(count|qty|quantity|num|number|id|n)([\\s_]|$)/i;\nconst HEADER_CURRENCY = /(price|amount|cost|revenue|fee|total|salary|budget|balance)/i;\nconst HEADER_PERCENT = /(rate|percent|growth|yoy|margin|share|ratio)/i;\n\ntype Any = any;\n\nexport const Inference = {\n detect(columnValues: unknown[], headerName: string, options: BuilderOptions = {}): ColumnSchema {\n const sample = nonNullSample(columnValues);\n\n if (sample.length === 0) return { header: headerName, type: \"auto\" };\n\n if (allBoolean(sample)) return { header: headerName, type: \"boolean\" };\n\n const allNum = allNumeric(sample);\n const allInRange = allNum && allInRange01(sample);\n const allInt = allNum && allInteger(sample);\n const allDate = allMatch(sample, ISO_DATE);\n const allDateTime = allMatch(sample, ISO_DATETIME);\n\n if (allDate) return { header: headerName, type: \"date\" };\n if (allDateTime) return { header: headerName, type: \"datetime\" };\n\n if (allNum) {\n if (HEADER_PERCENT.test(headerName) && allInRange) {\n return { header: headerName, type: \"percent\", decimals: detectDecimals(sample) || 1 };\n }\n if (HEADER_CURRENCY.test(headerName)) {\n return {\n header: headerName,\n type: \"currency\",\n currency: options.currency ?? \"USD\",\n decimals: detectDecimals(sample) ?? undefined,\n } as ColumnSchema;\n }\n if (HEADER_INTEGER.test(headerName) && allInt) {\n return { header: headerName, type: \"integer\" };\n }\n if (allInt) return { header: headerName, type: \"integer\" };\n\n const col: ColumnSchema = { header: headerName, type: \"number\" };\n const decimals = detectDecimals(sample);\n if (decimals !== null && decimals > 0) col.decimals = decimals;\n return col;\n }\n\n if (allStringish(sample)) return { header: headerName, type: \"string\" };\n\n return { header: headerName, type: \"auto\" };\n },\n};\n\nfunction nonNullSample(values: unknown[]): unknown[] {\n const out: unknown[] = [];\n for (const v of values) {\n if (v === null || v === undefined) continue;\n out.push(v);\n if (out.length >= SAMPLE_SIZE) break;\n }\n return out;\n}\n\nfunction allBoolean(sample: unknown[]): boolean {\n return sample.every((v) => typeof v === \"boolean\");\n}\n\nfunction allNumeric(sample: unknown[]): boolean {\n return sample.every((v) => {\n if (typeof v === \"boolean\") return false;\n if (typeof v === \"number\") return Number.isFinite(v);\n return typeof v === \"string\" && isNumericString(v);\n });\n}\n\nfunction allInteger(sample: unknown[]): boolean {\n return sample.every((v) => {\n if (typeof v === \"number\") return Number.isInteger(v);\n return typeof v === \"string\" && /^-?\\d+$/.test(v);\n });\n}\n\nfunction allInRange01(sample: unknown[]): boolean {\n return sample.every((v) => {\n const f = Number(v as Any);\n return f >= 0 && f <= 1;\n });\n}\n\nfunction detectDecimals(sample: unknown[]): number | null {\n let max = 0;\n let sawFloat = false;\n for (const v of sample) {\n const s = typeof v === \"string\" ? v : String(v);\n if (s.includes(\".\")) {\n sawFloat = true;\n const frac = (s.split(\".\", 2)[1] ?? \"\").replace(/0+$/, \"\");\n if (frac.length > max) max = frac.length;\n }\n }\n if (!sawFloat) return 0;\n return Math.max(max, 2);\n}\n\nfunction allMatch(sample: unknown[], regex: RegExp): boolean {\n return sample.every((v) => typeof v === \"string\" && regex.test(v));\n}\n\nfunction allStringish(sample: unknown[]): boolean {\n return sample.every((v) => typeof v === \"string\");\n}\n","import { Inference } from \"../schema/inference\";\nimport type { BuilderOptions, ColumnSchema, HolySheetSchema, SheetSchema } from \"../schema/types\";\n\ntype Any = any;\n\n/**\n * Flat rows (+ optional headers) → Holy Sheet schema with inferred column types.\n * Mirrors PHP `Helpers\\ArrayBuilder`.\n */\nexport const ArrayBuilder = {\n build(\n rows: Any[][],\n headers: string[] | null = null,\n sheetName = \"Sheet 1\",\n options: BuilderOptions = {},\n ): HolySheetSchema {\n let hdrs = headers;\n let data = rows;\n if (hdrs === null) {\n if (rows.length === 0) return wrap([], [], sheetName, options);\n hdrs = (rows[0] ?? []).map((v) => String(v));\n data = rows.slice(1);\n }\n const columns = inferColumns(data, hdrs, options);\n return wrap(columns, data, sheetName, options);\n },\n};\n\nfunction inferColumns(rows: Any[][], headers: string[], options: BuilderOptions): ColumnSchema[] {\n return headers.map((headerName, i) => {\n const columnValues = rows.map((row) => row[i] ?? null);\n return Inference.detect(columnValues, String(headerName), options);\n });\n}\n\nfunction wrap(\n columns: ColumnSchema[],\n rows: Any[][],\n sheetName: string,\n options: BuilderOptions,\n): HolySheetSchema {\n const sheet: SheetSchema = { name: sheetName, columns, rows };\n if (options.theme !== undefined) sheet.theme = options.theme;\n if (options.totals && typeof options.totals === \"object\") sheet.totals = options.totals;\n if (options.frozenRows !== undefined) sheet.frozenRows = Math.trunc(Number(options.frozenRows));\n if (options.frozenCols !== undefined) sheet.frozenCols = Math.trunc(Number(options.frozenCols));\n return { sheets: [sheet] };\n}\n","import { isNumericString, numericStringToNumber } from \"../util\";\nimport type { BuilderOptions, HolySheetSchema } from \"../schema/types\";\nimport { ArrayBuilder } from \"./array-builder\";\n\n/**\n * CSV string → Holy Sheet schema. Mirrors PHP `Helpers\\CsvBuilder`, but takes\n * CSV *content* (isomorphic). To convert a file in Node, read it yourself and\n * pass the string. First row is treated as headers.\n */\nexport const CsvBuilder = {\n build(csv: string, options: BuilderOptions = {}): HolySheetSchema {\n const delimiter = options.delimiter ?? \",\";\n const enclosure = options.enclosure ?? '\"';\n const sheetName = options.sheetName ?? \"Sheet 1\";\n\n const rows = parseRows(csv, delimiter, enclosure);\n\n if (rows.length === 0) {\n return { sheets: [{ name: sheetName, columns: [], rows: [] }] };\n }\n\n const headers = rows[0]!.map((v) => String(v));\n const dataRows: (string | number)[][] = rows.slice(1).map((row) =>\n row.map((cell) => (isNumericString(cell) ? numericStringToNumber(cell) : cell)),\n );\n\n return ArrayBuilder.build(dataRows, headers, sheetName, options);\n },\n};\n\n/** RFC-4180-ish CSV parser: quoted fields, doubled quotes, embedded newlines. */\nfunction parseRows(csv: string, delimiter: string, quote: string): string[][] {\n const rows: string[][] = [];\n let field = \"\";\n let row: string[] = [];\n let inQuotes = false;\n let started = false; // did this row have any content/field?\n\n const pushField = (): void => {\n row.push(field);\n field = \"\";\n started = true;\n };\n const pushRow = (): void => {\n pushField();\n rows.push(row);\n row = [];\n started = false;\n };\n\n for (let i = 0; i < csv.length; i++) {\n const ch = csv[i]!;\n if (inQuotes) {\n if (ch === quote) {\n if (csv[i + 1] === quote) {\n field += quote;\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n field += ch;\n }\n continue;\n }\n if (ch === quote) {\n inQuotes = true;\n started = true;\n continue;\n }\n if (ch === delimiter) {\n pushField();\n continue;\n }\n if (ch === \"\\r\") {\n if (csv[i + 1] === \"\\n\") i++;\n pushRow();\n continue;\n }\n if (ch === \"\\n\") {\n pushRow();\n continue;\n }\n field += ch;\n started = true;\n }\n // trailing field/row (skip a purely-empty trailing line)\n if (field !== \"\" || row.length > 0 || started) pushRow();\n\n // Drop blank lines (a single empty field), matching fgetcsv's blank-line skip.\n return rows.filter((r) => !(r.length === 1 && r[0] === \"\"));\n}\n","/**\n * A1 cell address utilities — column-letter ↔ 0-based index conversion,\n * address parsing. Mirrors PHP `Workbook\\CellAddress`.\n */\nexport const CellAddress = {\n /** 0-based column index → Excel-style letters. */\n letter(index: number): string {\n if (index < 0) {\n throw new Error(`[holy-sheet] column index must be ≥ 0, got ${index}`);\n }\n let letters = \"\";\n let n = index;\n do {\n letters = String.fromCharCode(65 + (n % 26)) + letters;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return letters;\n },\n\n /** Column-letters → 0-based index. */\n index(letters: string): number {\n const up = letters.trim().toUpperCase();\n if (up === \"\" || !/^[A-Z]+$/.test(up)) {\n throw new Error(`[holy-sheet] invalid column letters: '${up}'`);\n }\n let idx = 0;\n for (let i = 0; i < up.length; i++) {\n idx = idx * 26 + (up.charCodeAt(i) - 64);\n }\n return idx - 1;\n },\n\n /** Parse an A1 address into [columnIndex, rowNumber] (1-based row), or null. */\n parse(address: string): [number, number] | null {\n const m = /^([A-Z]+)(\\d+)$/.exec(address.trim().toUpperCase());\n if (!m) return null;\n return [CellAddress.index(m[1]!), parseInt(m[2]!, 10)];\n },\n};\n","import type { CellPrimitive } from \"../schema/types\";\nimport type { CellComment } from \"./cell-comment\";\nimport type { CellFormat } from \"./cell-format\";\n\nexport type ExcelType = \"str\" | \"inlineStr\" | \"b\" | \"n\";\n\n/** A single cell. Mirrors PHP `Workbook\\Cell`. */\nexport class Cell {\n constructor(\n readonly address: string,\n readonly value: CellPrimitive,\n readonly formula: string | null = null,\n readonly format: CellFormat | null = null,\n readonly comment: CellComment | null = null,\n readonly cachedValue: CellPrimitive = null,\n ) {}\n\n excelType(): ExcelType {\n if (this.formula !== null) return \"str\";\n if (typeof this.value === \"string\") return \"inlineStr\";\n if (typeof this.value === \"boolean\") return \"b\";\n return \"n\";\n }\n}\n","export class CellComment {\n constructor(\n readonly text: string,\n readonly author: string | null = null,\n readonly color: string | null = null,\n ) {}\n}\n","import type { CellFormatInput, DisplayFormat } from \"../schema/types\";\n\nexport interface CellFormatProps {\n bold?: boolean;\n italic?: boolean;\n textAlign?: string | null;\n displayFormat?: DisplayFormat | null;\n decimals?: number | null;\n color?: string | null;\n backgroundColor?: string | null;\n fontSize?: number | null;\n borderTop?: string | null;\n borderRight?: string | null;\n borderBottom?: string | null;\n borderLeft?: string | null;\n currency?: string | null;\n}\n\n/**\n * Per-cell format. The writer's StylesRegistry deduplicates equal formats.\n * Mirrors PHP `Workbook\\CellFormat` (PHP named args → an options object here).\n */\nexport class CellFormat {\n readonly bold: boolean;\n readonly italic: boolean;\n readonly textAlign: string | null;\n readonly displayFormat: DisplayFormat | null;\n readonly decimals: number | null;\n readonly color: string | null;\n readonly backgroundColor: string | null;\n readonly fontSize: number | null;\n readonly borderTop: string | null;\n readonly borderRight: string | null;\n readonly borderBottom: string | null;\n readonly borderLeft: string | null;\n readonly currency: string | null;\n\n constructor(p: CellFormatProps = {}) {\n this.bold = p.bold ?? false;\n this.italic = p.italic ?? false;\n this.textAlign = p.textAlign ?? null;\n this.displayFormat = p.displayFormat ?? null;\n this.decimals = p.decimals ?? null;\n this.color = p.color ?? null;\n this.backgroundColor = p.backgroundColor ?? null;\n this.fontSize = p.fontSize ?? null;\n this.borderTop = p.borderTop ?? null;\n this.borderRight = p.borderRight ?? null;\n this.borderBottom = p.borderBottom ?? null;\n this.borderLeft = p.borderLeft ?? null;\n this.currency = p.currency ?? null;\n }\n\n /** Stable dedup key (JSON of ordered fields — replaces PHP md5(serialize)). */\n key(): string {\n return JSON.stringify([\n this.bold,\n this.italic,\n this.textAlign,\n this.displayFormat,\n this.decimals,\n this.color,\n this.backgroundColor,\n this.fontSize,\n this.borderTop,\n this.borderRight,\n this.borderBottom,\n this.borderLeft,\n this.currency,\n ]);\n }\n\n isEmpty(): boolean {\n return (\n !this.bold &&\n !this.italic &&\n this.textAlign === null &&\n this.displayFormat === null &&\n this.decimals === null &&\n this.color === null &&\n this.backgroundColor === null &&\n this.fontSize === null &&\n this.borderTop === null &&\n this.borderRight === null &&\n this.borderBottom === null &&\n this.borderLeft === null &&\n this.currency === null\n );\n }\n\n static fromInput(a: CellFormatInput): CellFormat {\n return new CellFormat({\n bold: Boolean(a.bold ?? false),\n italic: Boolean(a.italic ?? false),\n textAlign: a.textAlign ?? null,\n displayFormat: a.displayFormat ?? null,\n decimals: a.decimals != null ? Math.trunc(a.decimals) : null,\n color: a.color ?? null,\n backgroundColor: a.backgroundColor ?? null,\n fontSize: a.fontSize != null ? Math.trunc(a.fontSize) : null,\n borderTop: a.borderTop ?? null,\n borderRight: a.borderRight ?? null,\n borderBottom: a.borderBottom ?? null,\n borderLeft: a.borderLeft ?? null,\n currency: a.currency ?? null,\n });\n }\n\n /** Merge another format on top of this one (other wins where set). */\n mergeWith(other: CellFormat | null): CellFormat {\n if (other === null) return this;\n return new CellFormat({\n bold: other.bold || this.bold,\n italic: other.italic || this.italic,\n textAlign: other.textAlign ?? this.textAlign,\n displayFormat: other.displayFormat ?? this.displayFormat,\n decimals: other.decimals ?? this.decimals,\n color: other.color ?? this.color,\n backgroundColor: other.backgroundColor ?? this.backgroundColor,\n fontSize: other.fontSize ?? this.fontSize,\n borderTop: other.borderTop ?? this.borderTop,\n borderRight: other.borderRight ?? this.borderRight,\n borderBottom: other.borderBottom ?? this.borderBottom,\n borderLeft: other.borderLeft ?? this.borderLeft,\n currency: other.currency ?? this.currency,\n });\n }\n}\n","export class MergedRegion {\n constructor(\n readonly start: string,\n readonly end: string,\n ) {}\n\n ref(): string {\n return `${this.start}:${this.end}`;\n }\n}\n","import type { Cell } from \"./cell\";\nimport type { CellComment } from \"./cell-comment\";\nimport type { MergedRegion } from \"./merged-region\";\n\n/** A worksheet. Mirrors PHP `Workbook\\Sheet`. Cells are an A1-keyed map. */\nexport class Sheet {\n constructor(\n readonly name: string,\n readonly cells: Map<string, Cell> = new Map(),\n readonly mergedRegions: MergedRegion[] = [],\n readonly columnWidths: Map<number, number> = new Map(),\n readonly frozenRows: number = 0,\n readonly frozenCols: number = 0,\n ) {}\n\n /** rowNumber → (colLetter → Cell), sorted by ascending row number. */\n rows(): Map<number, Map<string, Cell>> {\n const rows = new Map<number, Map<string, Cell>>();\n for (const [address, cell] of this.cells) {\n const m = /^([A-Z]+)(\\d+)$/.exec(address);\n if (!m) continue;\n const rowNum = parseInt(m[2]!, 10);\n let row = rows.get(rowNum);\n if (!row) {\n row = new Map();\n rows.set(rowNum, row);\n }\n row.set(m[1]!, cell);\n }\n return new Map([...rows.entries()].sort((a, b) => a[0] - b[0]));\n }\n\n hasComments(): boolean {\n for (const c of this.cells.values()) if (c.comment !== null) return true;\n return false;\n }\n\n comments(): { address: string; comment: CellComment }[] {\n const out: { address: string; comment: CellComment }[] = [];\n for (const c of this.cells.values()) {\n if (c.comment !== null) out.push({ address: c.address, comment: c.comment });\n }\n return out;\n }\n}\n","import type { Sheet } from \"./sheet\";\n\n/** Internal canonical workbook value object. Mirrors PHP `Workbook\\Workbook`. */\nexport class Workbook {\n constructor(\n readonly sheets: Sheet[],\n readonly meta: Record<string, unknown> = {},\n ) {}\n}\n","/**\n * ISO string / Date → Excel serial number. Mirrors PHP `Writer\\Format\\DateConverter`.\n * Excel epoch is anchored to 1899-12-30 (accommodating the legacy 1900 leap-year bug).\n */\n\nfunction parseToUtcMs(value: string): number | null {\n const s = value.trim();\n if (s === \"\") return null;\n const m =\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2})(?::(\\d{1,2})(?:\\.\\d+)?)?)?\\s*(Z|[+-]\\d{2}:?\\d{2})?$/.exec(\n s,\n );\n if (m) {\n const [, y, mo, d, h, mi, se, tz] = m;\n let ms = Date.UTC(+y!, +mo! - 1, +d!, h ? +h : 0, mi ? +mi : 0, se ? +se : 0);\n if (tz && tz !== \"Z\") {\n const sign = tz[0] === \"-\" ? -1 : 1;\n const clean = tz.slice(1).replace(\":\", \"\");\n const offMin = sign * (parseInt(clean.slice(0, 2), 10) * 60 + parseInt(clean.slice(2, 4) || \"0\", 10));\n ms -= offMin * 60000;\n }\n return ms;\n }\n const fallback = Date.parse(s);\n return Number.isNaN(fallback) ? null : fallback;\n}\n\nexport const DateConverter = {\n toSerial(value: string | Date, includeTime = false): number {\n const ts = value instanceof Date ? value.getTime() : parseToUtcMs(value);\n if (ts === null) return 0;\n const epoch = Date.UTC(1899, 11, 30, 0, 0, 0);\n let days = (ts - epoch) / 86400000;\n if (!includeTime) days = Math.floor(days);\n return days;\n },\n};\n","import { CellFormat } from \"../workbook/cell-format\";\n\n/** Theme presets — pre-baked CellFormat sets. Mirrors PHP `Schema\\Theme`. */\nexport class Theme {\n constructor(readonly key: string) {}\n\n headerFormat(): CellFormat | null {\n switch (this.key) {\n case \"default\":\n case \"business\":\n return new CellFormat({\n bold: true,\n color: \"#FFFFFF\",\n backgroundColor: this.key === \"business\" ? \"#1F2937\" : \"#374151\",\n });\n case \"minimal\":\n return new CellFormat({ bold: true, borderBottom: \"#000000\" });\n default:\n return null;\n }\n }\n\n dataFormat(rowIndexZeroBased: number): CellFormat | null {\n if ((this.key === \"default\" || this.key === \"business\") && rowIndexZeroBased % 2 === 1) {\n return new CellFormat({ backgroundColor: \"#F3F4F6\" });\n }\n return null;\n }\n\n totalsFormat(): CellFormat | null {\n switch (this.key) {\n case \"default\":\n case \"business\":\n case \"minimal\":\n return new CellFormat({ bold: true, borderTop: \"#000000\" });\n default:\n return null;\n }\n }\n}\n","import { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport { CellComment } from \"../workbook/cell-comment\";\nimport { CellFormat } from \"../workbook/cell-format\";\nimport { MergedRegion } from \"../workbook/merged-region\";\nimport { Sheet } from \"../workbook/sheet\";\nimport { Workbook } from \"../workbook/workbook\";\nimport { DateConverter } from \"../writer/format/date-converter\";\nimport { isNumericString, isPlainObject, numericStringToNumber } from \"../util\";\nimport type { CellPrimitive } from \"./types\";\nimport { Theme } from \"./theme\";\n\ntype Any = any; // input is loose agent JSON\n\n/** Schema → canonical Workbook. Mirrors PHP `Schema\\Normalizer`. */\nexport class Normalizer {\n normalize(schema: Any): Workbook {\n const sheets: Sheet[] = [];\n for (const sheetSchema of schema.sheets as Any[]) {\n sheets.push(this.normalizeSheet(sheetSchema));\n }\n return new Workbook(sheets, (schema.meta as Record<string, unknown>) ?? {});\n }\n\n private normalizeSheet(sheet: Any): Sheet {\n const name = String(sheet.name);\n\n // NOTE: there is no separate \"cells-only\" path. A sheet with no columns\n // and no rows builds an empty table below and then takes the overlay, which\n // is the same code the combined case runs.\n //\n // It USED to return here the moment `cells` was set, and that early return\n // silently discarded `columns`, `rows`, `totals` and `theme` — a four-row\n // table with one styled title cell wrote a one-cell workbook, while\n // `validate()` reported no errors because the validator explicitly permits\n // both together. The PHP twin had the identical bug in the identical place;\n // see `Schema/Normalizer.php`.\n const cells = new Map<string, Cell>();\n const columns: Any[] = sheet.columns ?? [];\n const rows: Any[] = sheet.rows ?? [];\n const themeKey = sheet.theme ?? \"default\";\n const theme = new Theme(themeKey);\n let headerOffset = 0;\n\n const columnFormats = new Map<number, CellFormat | null>();\n const columnByHeader = new Map<string, number>();\n columns.forEach((columnDef, colIdx) => {\n columnFormats.set(colIdx, this.columnFormat(columnDef));\n if (isPlainObject(columnDef) && columnDef.header !== undefined) {\n columnByHeader.set(String(columnDef.header), colIdx);\n }\n });\n\n if (columns.length > 0) {\n columns.forEach((columnDef, col) => {\n const address = CellAddress.letter(col) + \"1\";\n const header = isPlainObject(columnDef) ? (columnDef.header ?? \"\") : String(columnDef);\n cells.set(address, new Cell(address, String(header), null, theme.headerFormat()));\n });\n headerOffset = 1;\n }\n\n rows.forEach((row: Any[], r) => {\n row.forEach((value, c) => {\n const address = CellAddress.letter(c) + (r + 1 + headerOffset);\n const columnFormat = columnFormats.get(c) ?? null;\n const rowBand = theme.dataFormat(r);\n const merged =\n rowBand !== null ? (columnFormat ? columnFormat.mergeWith(rowBand) : rowBand) : columnFormat;\n cells.set(address, this.buildCell(address, value, merged));\n });\n });\n\n if (\n sheet.totals &&\n isPlainObject(sheet.totals) &&\n Object.keys(sheet.totals).length > 0 &&\n rows.length > 0 &&\n columns.length > 0\n ) {\n const totalsRow = rows.length + 1 + headerOffset;\n const totalsTheme = theme.totalsFormat();\n const labelAddr = CellAddress.letter(0) + totalsRow;\n cells.set(labelAddr, new Cell(labelAddr, \"Total\", null, totalsTheme));\n\n for (const [headerKey, aggOp] of Object.entries(sheet.totals as Record<string, Any>)) {\n if (!columnByHeader.has(headerKey)) continue;\n const colIdx = columnByHeader.get(headerKey)!;\n const colLetter = CellAddress.letter(colIdx);\n const rangeStart = colLetter + (headerOffset + 1);\n const rangeEnd = colLetter + (rows.length + headerOffset);\n const func = String(aggOp).toUpperCase();\n if (![\"SUM\", \"AVG\", \"COUNT\", \"MIN\", \"MAX\"].includes(func)) continue;\n const excelFunc = func === \"AVG\" ? \"AVERAGE\" : func;\n const address = colLetter + totalsRow;\n const colFmt = columnFormats.get(colIdx) ?? null;\n const combined = colFmt ? colFmt.mergeWith(totalsTheme) : totalsTheme;\n cells.set(address, new Cell(address, null, `${excelFunc}(${rangeStart}:${rangeEnd})`, combined));\n }\n }\n\n // The overlay. Explicit cells win at their address; a format is MERGED\n // rather than swapped, so a cell that only sets `bold` keeps the theme's\n // banding and the column's currency format instead of dropping to bare.\n if (sheet.cells != null) {\n for (const [address, cell] of this.normalizeCellMap(sheet.cells)) {\n const beneath = cells.get(address);\n\n cells.set(\n address,\n beneath?.format\n ? new Cell(\n cell.address,\n cell.value,\n cell.formula,\n beneath.format.mergeWith(cell.format),\n cell.comment,\n cell.cachedValue,\n )\n : cell,\n );\n }\n }\n\n return new Sheet(\n name,\n cells,\n this.normalizeMerges(sheet.mergedRegions ?? []),\n this.normalizeColumnWidths(sheet.columnWidths ?? {}),\n toInt(sheet.frozenRows ?? 0),\n toInt(sheet.frozenCols ?? 0),\n );\n }\n\n private normalizeCellMap(map: Record<string, Any>): Map<string, Cell> {\n const cells = new Map<string, Cell>();\n for (const [address, cellData] of Object.entries(map)) {\n // A bare scalar cell, e.g. {A1: 42} or {A1: \"=SUM(B1:B5)\"}.\n //\n // Without this branch every non-object cell read as EMPTY: `cellData.value`\n // on a number is `undefined`, so `{A1: 42}` wrote a blank cell and a bare\n // formula string vanished outright — no error, just a hole in the sheet.\n // PHP has always had this branch; the port dropped it.\n if (!isPlainObject(cellData)) {\n const [bare, formula] = promoteFormula(cellData);\n cells.set(\n address,\n new Cell(address, formula !== null ? null : this.coerceValue(bare, null), formula),\n );\n continue;\n }\n\n const format = isPlainObject(cellData.format) ? CellFormat.fromInput(cellData.format) : null;\n // `comment` takes either a string or an object. The string form was\n // accepted by the validator and dropped here — the same silent-drop shape.\n const comment = isPlainObject(cellData.comment)\n ? new CellComment(\n String(cellData.comment.text ?? \"\"),\n cellData.comment.author ?? null,\n cellData.comment.color ?? null,\n )\n : typeof cellData.comment === \"string\"\n ? new CellComment(cellData.comment)\n : null;\n const rawValue = cellData?.value ?? null;\n cells.set(\n address,\n new Cell(\n address,\n this.coerceValue(rawValue, format),\n cellData?.formula ?? null,\n format,\n comment,\n cellData?.computedValue ?? null,\n ),\n );\n }\n return cells;\n }\n\n private normalizeMerges(list: Any[]): MergedRegion[] {\n const out: MergedRegion[] = [];\n for (const m of list) {\n if (m && m.start !== undefined && m.end !== undefined) {\n out.push(new MergedRegion(String(m.start), String(m.end)));\n }\n }\n return out;\n }\n\n private normalizeColumnWidths(widths: Record<string, Any>): Map<number, number> {\n const out = new Map<number, number>();\n for (const [key, px] of Object.entries(widths)) {\n out.set(parseInt(key, 10), Number(px));\n }\n return out;\n }\n\n private columnFormat(columnDef: Any): CellFormat | null {\n if (typeof columnDef === \"string\") return null;\n const type = columnDef.type ?? \"auto\";\n const decimals = columnDef.decimals != null ? toInt(columnDef.decimals) : null;\n const currency = columnDef.currency ?? null;\n\n switch (type) {\n case \"integer\":\n return new CellFormat({ displayFormat: \"number\", decimals: 0 });\n case \"number\":\n return decimals !== null ? new CellFormat({ displayFormat: \"number\", decimals }) : null;\n case \"percent\":\n return new CellFormat({ displayFormat: \"percentage\", decimals: decimals ?? 1 });\n case \"currency\":\n return new CellFormat({ displayFormat: \"currency\", decimals: decimals ?? 2, currency });\n case \"date\":\n return new CellFormat({ displayFormat: \"date\" });\n case \"datetime\":\n return new CellFormat({ displayFormat: \"datetime\" });\n default:\n return null;\n }\n }\n\n private buildCell(address: string, value: Any, columnFormat: CellFormat | null): Cell {\n if (isPlainObject(value)) {\n const cellFormat = isPlainObject(value.format) ? CellFormat.fromInput(value.format) : null;\n const merged = columnFormat ? columnFormat.mergeWith(cellFormat) : cellFormat;\n const comment = isPlainObject(value.comment)\n ? new CellComment(\n String(value.comment.text ?? \"\"),\n value.comment.author ?? null,\n value.comment.color ?? null,\n )\n : null;\n const rawValue = value.value ?? null;\n return new Cell(\n address,\n this.coerceValue(rawValue, merged),\n value.formula ?? null,\n merged,\n comment,\n value.computedValue ?? null,\n );\n }\n\n const [bare, formula] = promoteFormula(value);\n\n return new Cell(\n address,\n formula !== null ? null : this.coerceValue(bare, columnFormat),\n formula,\n columnFormat,\n );\n }\n\n private coerceValue(value: Any, format: CellFormat | null): CellPrimitive {\n if (value === null || value === undefined) return null;\n\n const df = format?.displayFormat;\n if (df === \"date\" || df === \"datetime\") {\n if (value instanceof Date || (typeof value === \"string\" && value.trim() !== \"\")) {\n return DateConverter.toSerial(value, df === \"datetime\");\n }\n }\n\n if (typeof value === \"string\" && isNumericString(value)) {\n return numericStringToNumber(value);\n }\n\n if (value instanceof Date) {\n return DateConverter.toSerial(value, true);\n }\n\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return String(value);\n }\n\n return value;\n }\n}\n\n/**\n * A bare string cell value beginning with \"=\" (e.g. \"=SUM(B2:B10)\") is an Excel\n * formula, not literal text — promote it to a real formula cell.\n *\n * Only *bare* strings promote. An object cell ({value: \"=x\"} or {formula: \"x\"})\n * is always taken as the caller's explicit intent, so {value: \"=literal\"} is the\n * escape hatch for a genuine leading-\"=\" string. Mirrors PHP\n * `Normalizer::promoteFormula`, which the port had omitted entirely: the same\n * schema produced a formula in PHP and the literal text \"=SUM(B2:B10)\" in Node.\n */\nfunction promoteFormula(value: Any): [Any, string | null] {\n if (typeof value === \"string\" && value.length > 1 && value[0] === \"=\") {\n return [null, value.slice(1)];\n }\n return [value, null];\n}\n\nfunction toInt(v: unknown): number {\n const n = Math.trunc(Number(v));\n return Number.isFinite(n) ? n : 0;\n}\n","import type { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { isNumericString } from \"../util\";\nimport { Normalizer } from \"./normalizer\";\nimport type { FormulaProblem } from \"./types\";\n\nconst ERR_VALUE = \"#VALUE!\";\nconst ERR_REF = \"#REF!\";\nconst ERR_NAME = \"#NAME?\";\nconst ERR_DIV0 = \"#DIV/0!\";\nconst ERR_CIRC = \"#CIRC!\";\n\n/**\n * A sheet qualifier, quoted ('My Sheet'!) or bare (Sheet2!). Group 1 is the name\n * as written, quotes included.\n */\nconst SHEET_QUALIFIER = \"('(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!\";\n\nclass LinterError extends Error {\n constructor(public errorCode: string) {\n super(errorCode);\n }\n}\n\ninterface Token {\n type: \"NUMBER\" | \"STRING\" | \"IDENT\" | \"SHEET\" | \"OP\";\n value: string;\n}\ninterface Cursor {\n tokens: Token[];\n pos: number;\n}\n\ntype Val = number | string | boolean | null | Val[];\n\n/**\n * Evaluates every formula and reports Excel-style errors. Mirrors PHP\n * `Schema\\FormulaLinter` rule-for-rule.\n */\nexport class FormulaLinter {\n private index = new Map<string, Cell>();\n private cache = new Map<string, Val>();\n /**\n * Every sheet name, keyed by its lower-cased form. Excel matches sheet names\n * without regard to case, and a reference to a sheet that is not here is\n * `#REF!` rather than a range of blanks.\n */\n private sheetNames = new Map<string, string>();\n\n lint(schema: unknown): FormulaProblem[] {\n const workbook = new Normalizer().normalize(schema);\n this.sheetNames = new Map(workbook.sheets.map((sheet) => [sheet.name.toLowerCase(), sheet.name]));\n this.index = this.buildIndex(workbook);\n this.cache = new Map();\n const issues: FormulaProblem[] = [];\n\n for (const sheet of workbook.sheets) {\n for (const [address, cell] of sheet.cells) {\n if (cell.formula === null) continue;\n const key = sheet.name + \"!\" + address;\n const result = this.evaluate(cell.formula, sheet.name, [key]);\n this.cache.set(key, result);\n\n if (this.isError(result)) {\n issues.push({\n sheet: sheet.name,\n address,\n formula: cell.formula,\n error: result as string,\n hint: this.hint(result as string, cell.formula, sheet.name),\n });\n }\n }\n }\n return issues;\n }\n\n private buildIndex(wb: Workbook): Map<string, Cell> {\n const index = new Map<string, Cell>();\n for (const sheet of wb.sheets) {\n for (const [address, cell] of sheet.cells) {\n index.set(sheet.name + \"!\" + address, cell);\n }\n }\n return index;\n }\n\n private isError(v: Val): boolean {\n return typeof v === \"string\" && v.length > 0 && v[0] === \"#\";\n }\n\n private evaluate(formula: string, defaultSheet: string, stack: string[]): Val {\n try {\n const c: Cursor = { tokens: this.tokenize(formula), pos: 0 };\n const result = this.parseExpr(c, defaultSheet, stack);\n if (c.pos < c.tokens.length) return ERR_NAME;\n return result;\n } catch (e) {\n if (e instanceof LinterError) return e.errorCode;\n return ERR_NAME;\n }\n }\n\n // ---- Tokenizer ----\n\n private tokenize(src: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n const len = src.length;\n const isSpace = (ch: string) => /\\s/.test(ch);\n const isDigit = (ch: string) => ch >= \"0\" && ch <= \"9\";\n const isAlpha = (ch: string) => /[A-Za-z]/.test(ch);\n const isAlnum = (ch: string) => /[A-Za-z0-9]/.test(ch);\n\n while (i < len) {\n const ch = src[i]!;\n if (isSpace(ch)) {\n i++;\n continue;\n }\n if (isDigit(ch) || (ch === \".\" && i + 1 < len && isDigit(src[i + 1]!))) {\n const start = i;\n while (i < len && (isDigit(src[i]!) || src[i] === \".\")) i++;\n tokens.push({ type: \"NUMBER\", value: src.slice(start, i) });\n continue;\n }\n if (ch === '\"') {\n i++;\n const start = i;\n while (i < len && src[i] !== '\"') i++;\n const value = src.slice(start, i);\n i++; // closing quote\n tokens.push({ type: \"STRING\", value });\n continue;\n }\n // Quoted sheet name: 'My Sheet', with Excel's '' for a literal quote.\n // Kept with its quotes; cleanSheetName() unwraps it. A quote that never\n // closes is a syntax error, not a name running to the end.\n if (ch === \"'\") {\n const start = i;\n i++;\n for (;;) {\n if (i >= len) throw new LinterError(ERR_NAME);\n if (src[i] === \"'\") {\n if (i + 1 < len && src[i + 1] === \"'\") {\n i += 2;\n continue;\n }\n i++;\n break;\n }\n i++;\n }\n tokens.push({ type: \"SHEET\", value: src.slice(start, i) });\n continue;\n }\n if (isAlpha(ch) || ch === \"_\" || ch === \"$\") {\n const start = i;\n while (i < len && (isAlnum(src[i]!) || src[i] === \"_\" || src[i] === \"$\" || src[i] === \".\")) i++;\n tokens.push({ type: \"IDENT\", value: src.slice(start, i) });\n continue;\n }\n if (i + 1 < len) {\n const two = src.slice(i, i + 2);\n if (two === \"<=\" || two === \">=\" || two === \"<>\") {\n tokens.push({ type: \"OP\", value: two });\n i += 2;\n continue;\n }\n }\n if (\"+-*/^%&=<>(),:!\".includes(ch)) {\n tokens.push({ type: \"OP\", value: ch });\n i++;\n continue;\n }\n throw new LinterError(ERR_NAME);\n }\n return tokens;\n }\n\n // ---- Parser (recursive descent) ----\n\n private peek(c: Cursor): Token | undefined {\n return c.tokens[c.pos];\n }\n private isOp(c: Cursor, ...vals: string[]): boolean {\n const t = c.tokens[c.pos];\n return !!t && t.type === \"OP\" && vals.includes(t.value);\n }\n\n private parseExpr(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseConcat(c, sheet, stack);\n while (this.isOp(c, \"=\", \"<\", \">\", \"<=\", \">=\", \"<>\")) {\n const op = c.tokens[c.pos]!.value;\n c.pos++;\n const right = this.parseConcat(c, sheet, stack);\n left = this.compare(left, right, op);\n }\n return left;\n }\n\n private parseConcat(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseArith(c, sheet, stack);\n while (this.isOp(c, \"&\")) {\n c.pos++;\n const right = this.parseArith(c, sheet, stack);\n left = this.coerceString(left) + this.coerceString(right);\n }\n return left;\n }\n\n private parseArith(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseTerm(c, sheet, stack);\n while (this.isOp(c, \"+\", \"-\")) {\n const op = c.tokens[c.pos]!.value;\n c.pos++;\n const right = this.parseTerm(c, sheet, stack);\n const a = this.coerceNumber(left);\n const b = this.coerceNumber(right);\n left = op === \"+\" ? a + b : a - b;\n }\n return left;\n }\n\n private parseTerm(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseUnary(c, sheet, stack);\n while (this.isOp(c, \"*\", \"/\", \"%\", \"^\")) {\n const op = c.tokens[c.pos]!.value;\n c.pos++;\n const right = this.parseUnary(c, sheet, stack);\n const a = this.coerceNumber(left);\n const b = this.coerceNumber(right);\n switch (op) {\n case \"*\":\n left = a * b;\n break;\n case \"/\":\n if (b === 0) throw new LinterError(ERR_DIV0);\n left = a / b;\n break;\n case \"%\":\n left = (a / 100.0) * b;\n break;\n case \"^\":\n left = a ** b;\n break;\n }\n }\n return left;\n }\n\n private parseUnary(c: Cursor, sheet: string, stack: string[]): Val {\n if (this.isOp(c, \"-\")) {\n c.pos++;\n const v = this.parseUnary(c, sheet, stack);\n return -this.coerceNumber(v);\n }\n if (this.isOp(c, \"+\")) {\n c.pos++;\n return this.parseUnary(c, sheet, stack);\n }\n return this.parsePrimary(c, sheet, stack);\n }\n\n private parsePrimary(c: Cursor, sheet: string, stack: string[]): Val {\n const tok = this.peek(c);\n if (!tok) throw new LinterError(ERR_NAME);\n\n if (tok.type === \"OP\" && tok.value === \"(\") {\n c.pos++;\n const val = this.parseExpr(c, sheet, stack);\n this.expectOp(c, \")\");\n return val;\n }\n\n if (tok.type === \"NUMBER\") {\n c.pos++;\n return parseFloat(tok.value);\n }\n if (tok.type === \"STRING\") {\n c.pos++;\n return tok.value;\n }\n\n // A quoted name is only ever a sheet qualifier. On its own it is not a\n // value, so it falls through to #NAME? below.\n if (tok.type === \"SHEET\" || tok.type === \"IDENT\") {\n const next = c.tokens[c.pos + 1];\n const next2 = c.tokens[c.pos + 2];\n // Sheet!Ref: (SHEET | IDENT) '!' IDENT\n if (next && next.type === \"OP\" && next.value === \"!\" && next2 && next2.type === \"IDENT\") {\n const sheetName = this.sheetNames.get(this.cleanSheetName(tok.value).toLowerCase());\n if (sheetName === undefined) throw new LinterError(ERR_REF);\n c.pos += 2;\n const startTok = c.tokens[c.pos]!.value;\n c.pos++;\n return this.resolveRefOrRange(startTok, sheetName, c, stack);\n }\n if (tok.type === \"SHEET\") throw new LinterError(ERR_NAME);\n // Function call\n if (next && next.type === \"OP\" && next.value === \"(\") {\n const name = tok.value.toUpperCase();\n c.pos += 2;\n const args: Val[] = [];\n if (!this.isOp(c, \")\")) {\n for (;;) {\n args.push(this.parseExpr(c, sheet, stack));\n if (this.isOp(c, \",\")) {\n c.pos++;\n continue;\n }\n break;\n }\n }\n this.expectOp(c, \")\");\n return this.callFunction(name, args);\n }\n // Boolean literals\n const upper = tok.value.toUpperCase();\n if (upper === \"TRUE\" || upper === \"FALSE\") {\n c.pos++;\n return upper === \"TRUE\";\n }\n // Bare cell reference\n c.pos++;\n return this.resolveRefOrRange(tok.value, sheet, c, stack);\n }\n\n throw new LinterError(ERR_NAME);\n }\n\n private resolveRefOrRange(startRef: string, defaultSheet: string, c: Cursor, stack: string[]): Val {\n const cleanStart = this.cleanRef(startRef);\n if (cleanStart === null) throw new LinterError(ERR_REF);\n\n const next = c.tokens[c.pos + 1];\n if (this.isOp(c, \":\") && next && next.type === \"IDENT\") {\n const endRef = next.value;\n c.pos += 2;\n const cleanEnd = this.cleanRef(endRef);\n if (cleanEnd === null) throw new LinterError(ERR_REF);\n return this.resolveRange(defaultSheet, cleanStart, cleanEnd, stack);\n }\n return this.resolveCell(defaultSheet, cleanStart, stack);\n }\n\n private cleanRef(ref: string): string | null {\n const r = ref.replace(/\\$/g, \"\").toUpperCase();\n return /^[A-Z]+\\d+$/.test(r) ? r : null;\n }\n\n /**\n * Unwrap the single quotes Excel puts around a sheet name that needs them,\n * and turn its doubled quote back into one: 'Q3 ''Final''' is Q3 'Final'.\n */\n private cleanSheetName(name: string): string {\n if (name.length >= 2 && name[0] === \"'\" && name[name.length - 1] === \"'\") {\n // split/join rather than replaceAll: the package targets a lib before ES2021.\n return name.slice(1, -1).split(\"''\").join(\"'\");\n }\n return name;\n }\n\n private resolveCell(sheet: string, a1: string, stack: string[]): Val {\n const key = sheet + \"!\" + a1;\n if (stack.includes(key)) return ERR_CIRC;\n if (this.cache.has(key)) return this.cache.get(key)!;\n const cell = this.index.get(key);\n if (!cell) return null;\n if (cell.formula !== null) {\n const result = this.evaluate(cell.formula, sheet, [...stack, key]);\n this.cache.set(key, result);\n return result;\n }\n return cell.value;\n }\n\n private resolveRange(sheet: string, start: string, end: string, stack: string[]): Val[] {\n const a = CellAddress.parse(start);\n const b = CellAddress.parse(end);\n if (a === null || b === null) throw new LinterError(ERR_REF);\n const col1 = Math.min(a[0], b[0]);\n const row1 = Math.min(a[1], b[1]);\n const col2 = Math.max(a[0], b[0]);\n const row2 = Math.max(a[1], b[1]);\n\n const values: Val[] = [];\n for (let r = row1; r <= row2; r++) {\n for (let col = col1; col <= col2; col++) {\n values.push(this.resolveCell(sheet, CellAddress.letter(col) + r, stack));\n }\n }\n return values;\n }\n\n private expectOp(c: Cursor, op: string): void {\n const t = c.tokens[c.pos];\n if (!t || t.type !== \"OP\" || t.value !== op) throw new LinterError(ERR_NAME);\n c.pos++;\n }\n\n // ---- Coercion / comparison / functions ----\n\n private coerceNumber(v: Val): number {\n if (this.isError(v)) throw new LinterError(v as string);\n if (Array.isArray(v)) {\n for (const item of v) {\n if (typeof item === \"number\") return item;\n if (typeof item === \"string\" && isNumericString(item)) return Number(item);\n }\n throw new LinterError(ERR_VALUE);\n }\n if (typeof v === \"number\") return v;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (v === null) return 0;\n if (typeof v === \"string\" && isNumericString(v)) return Number(v);\n throw new LinterError(ERR_VALUE);\n }\n\n private coerceString(v: Val): string {\n if (this.isError(v)) throw new LinterError(v as string);\n if (v === null) return \"\";\n if (typeof v === \"boolean\") return v ? \"TRUE\" : \"FALSE\";\n if (Array.isArray(v)) return v.map((x) => this.coerceString(x)).join(\"\");\n return String(v);\n }\n\n private compare(a: Val, b: Val, op: string): boolean {\n const cmp = this.cmpVal(a, b);\n switch (op) {\n case \"=\":\n return cmp === 0;\n case \"<>\":\n return cmp !== 0;\n case \"<\":\n return cmp < 0;\n case \">\":\n return cmp > 0;\n case \"<=\":\n return cmp <= 0;\n case \">=\":\n return cmp >= 0;\n default:\n return false;\n }\n }\n\n private cmpVal(a: Val, b: Val): number {\n const an = typeof a === \"number\" || (typeof a === \"string\" && isNumericString(a));\n const bn = typeof b === \"number\" || (typeof b === \"string\" && isNumericString(b));\n if (an && bn) {\n const x = Number(a);\n const y = Number(b);\n return x < y ? -1 : x > y ? 1 : 0;\n }\n const sa = String(a);\n const sb = String(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n\n private callFunction(name: string, args: Val[]): Val {\n const flat = this.flatten(args);\n switch (name) {\n case \"SUM\":\n return flat.filter((v) => this.isNumericLike(v)).reduce((s: number, v) => s + this.maybeNum(v), 0);\n case \"AVERAGE\":\n case \"AVG\":\n return this.avg(flat);\n case \"COUNT\":\n return flat.filter((v) => this.isNumericLike(v)).length;\n case \"COUNTA\":\n return flat.filter((v) => v !== null && v !== \"\").length;\n case \"MIN\":\n return this.minMax(flat, true);\n case \"MAX\":\n return this.minMax(flat, false);\n case \"IF\":\n return this.ifFn(args);\n case \"ROUND\":\n return phpRound(this.coerceNumber(args[0] ?? 0), Math.trunc(this.coerceNumber(args[1] ?? 0)));\n case \"ABS\":\n return Math.abs(this.coerceNumber(args[0] ?? 0));\n case \"LEN\":\n return this.coerceString(args[0] ?? \"\").length;\n case \"UPPER\":\n return this.coerceString(args[0] ?? \"\").toUpperCase();\n case \"LOWER\":\n return this.coerceString(args[0] ?? \"\").toLowerCase();\n case \"CONCAT\":\n case \"CONCATENATE\":\n return flat.map((v) => this.coerceString(v)).join(\"\");\n case \"TRUE\":\n return true;\n case \"FALSE\":\n return false;\n default:\n return ERR_NAME;\n }\n }\n\n private flatten(args: Val[]): Val[] {\n const out: Val[] = [];\n for (const a of args) {\n if (Array.isArray(a)) for (const x of a) out.push(x);\n else out.push(a);\n }\n return out;\n }\n\n private isNumericLike(v: Val): boolean {\n return (\n typeof v === \"number\" ||\n (typeof v === \"string\" && isNumericString(v)) ||\n typeof v === \"boolean\"\n );\n }\n\n private maybeNum(v: Val): number {\n return typeof v === \"boolean\" ? (v ? 1 : 0) : Number(v);\n }\n\n private avg(flat: Val[]): number | string {\n const nums = flat.filter((v) => this.isNumericLike(v));\n if (nums.length === 0) return ERR_DIV0;\n return nums.reduce((s: number, v) => s + this.maybeNum(v), 0) / nums.length;\n }\n\n private minMax(flat: Val[], min: boolean): number {\n const nums = flat.filter((v) => this.isNumericLike(v));\n if (nums.length === 0) return 0;\n const vals = nums.map((v) => this.maybeNum(v));\n return min ? Math.min(...vals) : Math.max(...vals);\n }\n\n private ifFn(args: Val[]): Val {\n if (args.length < 2) return ERR_VALUE;\n const cond = args[0]!;\n const truthy =\n typeof cond === \"boolean\"\n ? cond\n : cond !== null && cond !== 0 && cond !== \"\" && cond !== \"FALSE\";\n return truthy ? args[1]! : (args[2] ?? false);\n }\n\n // ---- Hints ----\n\n private hint(error: string, formula: string, sheet: string): string {\n switch (error) {\n case ERR_VALUE:\n return this.hintValue(formula, sheet);\n case ERR_REF:\n return this.hintRef(formula);\n case ERR_NAME:\n return \"The formula references an unknown function or has a syntax error. Holy Sheet supports: SUM, AVERAGE, COUNT, COUNTA, MIN, MAX, IF, ROUND, ABS, LEN, UPPER, LOWER, CONCAT.\";\n case ERR_DIV0:\n return \"Division by zero — the divisor evaluated to 0.\";\n case ERR_CIRC:\n return \"Circular reference — the formula directly or transitively depends on its own cell.\";\n default:\n return \"Formula evaluation failed.\";\n }\n }\n\n private hintRef(formula: string): string {\n // Name the sheet when that is what is missing. \"A cell doesn't exist\" sends\n // an agent to check column letters in a sheet it never created.\n for (const m of formula.matchAll(new RegExp(SHEET_QUALIFIER, \"g\"))) {\n const name = this.cleanSheetName(m[1]!);\n if (!this.sheetNames.has(name.toLowerCase())) {\n return `The formula refers to a sheet named '${name}', and this workbook has no such sheet. Its sheets are: ${[...this.sheetNames.values()].join(\", \")}. Quote a name that contains spaces or punctuation: 'My Sheet'!A1.`;\n }\n }\n return \"A cell reference points to a cell that doesn't exist in the workbook. Check column letters and row numbers.\";\n }\n\n private hintValue(formula: string, sheet: string): string {\n const re = new RegExp(`(?:${SHEET_QUALIFIER})?\\\\$?([A-Z]+)\\\\$?(\\\\d+)`, \"gi\");\n const offenders: string[] = [];\n for (const m of formula.matchAll(re)) {\n const sheetName = m[1]\n ? (this.sheetNames.get(this.cleanSheetName(m[1]).toLowerCase()) ?? this.cleanSheetName(m[1]))\n : sheet;\n const a1 = m[2]!.toUpperCase() + m[3]!;\n const key = sheetName + \"!\" + a1;\n const cell = this.index.get(key);\n if (!cell) continue;\n const value = this.cache.has(key)\n ? this.cache.get(key)!\n : cell.formula !== null\n ? null\n : cell.value;\n if (typeof value === \"string\" && !isNumericString(value) && value !== \"\") {\n const row = parseInt(m[3]!, 10);\n const col = m[2]!;\n const next = sheetName + \"!\" + col.toUpperCase() + (row + 1);\n const nextCell = this.index.get(next);\n let suggestion = \"\";\n if (nextCell && isNumericString(nextCell.value as never)) {\n suggestion = ` Did you mean ${col.toUpperCase()}${row + 1}? (it holds ${String(nextCell.value)})`;\n }\n offenders.push(`${a1} = \"${value}\" (string)${suggestion}`);\n }\n }\n if (offenders.length > 0) {\n return \"Arithmetic on a non-numeric cell: \" + offenders.join(\"; \");\n }\n return \"A non-numeric value was used in arithmetic. Check that all referenced cells contain numbers.\";\n }\n}\n\n/** PHP round() — half away from zero. */\nfunction phpRound(x: number, n: number): number {\n const factor = 10 ** n;\n return (Math.sign(x) * Math.round(Math.abs(x) * factor)) / factor;\n}\n","import type { ValidationError } from \"./schema/types\";\n\n/** Thrown when a Holy Sheet schema fails validation. Mirrors PHP `SchemaException`. */\nexport class SchemaException extends Error {\n readonly errors: ValidationError[];\n\n constructor(errors: ValidationError[], message?: string) {\n super(message ?? summarize(errors));\n this.name = \"SchemaException\";\n this.errors = errors;\n Object.setPrototypeOf(this, SchemaException.prototype);\n }\n\n static fromErrors(errors: ValidationError[]): SchemaException {\n return new SchemaException(errors);\n }\n\n getErrors(): ValidationError[] {\n return this.errors;\n }\n}\n\nfunction summarize(errors: ValidationError[]): string {\n if (errors.length === 1) {\n const e = errors[0]!;\n return `[holy-sheet] schema invalid at ${e.path}: expected ${e.expected}, got ${e.got}`;\n }\n const first = errors[0]!;\n const rest = errors.length - 1;\n return `[holy-sheet] schema invalid at ${first.path}: expected ${first.expected}, got ${first.got} (+${rest} more)`;\n}\n\n/**\n * Thrown by `Agent.read()` / `Agent.describe()` for a file that is neither an\n * xlsx workbook nor an OpenDocument spreadsheet. Mirrors PHP\n * `UnsupportedFormatException`.\n *\n * It extends Error, which is what an unreadable file threw before it existed,\n * so an existing catch still catches it. `mimetype` carries what the package\n * declared about itself when it declared anything (an OpenDocument TEXT file,\n * say), so a caller can say \"that is a document, not a spreadsheet\".\n */\nexport class UnsupportedFormatException extends Error {\n readonly path: string | null;\n readonly mimetype: string | null;\n\n constructor(message: string, path: string | null = null, mimetype: string | null = null) {\n super(message);\n this.name = \"UnsupportedFormatException\";\n this.path = path;\n this.mimetype = mimetype;\n Object.setPrototypeOf(this, UnsupportedFormatException.prototype);\n }\n\n static notAZip(path: string | null = null): UnsupportedFormatException {\n return new UnsupportedFormatException(\n `[holy-sheet] cannot read ${path ?? \"this file\"}: it is not a zip archive, and xlsx and ods both are`,\n path,\n );\n }\n\n static unknownPackage(path: string | null, mimetype: string | null): UnsupportedFormatException {\n const what =\n mimetype !== null && mimetype !== \"\"\n ? `its mimetype is ${mimetype}`\n : \"it has neither xl/workbook.xml nor an OpenDocument mimetype\";\n return new UnsupportedFormatException(\n `[holy-sheet] cannot read ${path ?? \"this file\"}: ${what}. Supported: xlsx, ods`,\n path,\n mimetype !== \"\" ? mimetype : null,\n );\n }\n}\n","import { isNumericString, isPlainObject, numericStringToNumber } from \"../util\";\n\nconst VALID_THEMES = [\"default\", \"minimal\", \"plain\", \"business\"];\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\nconst NUMERIC_TYPES = [\"number\", \"integer\", \"currency\", \"percent\"];\n\ntype Any = any;\n\n/**\n * Conservative, high-confidence schema repairs. Mirrors PHP `Schema\\Repairer`.\n * Returns [repairedSchema, repairs].\n */\nexport class Repairer {\n private repairs: string[] = [];\n\n repair(schema: Any): [Record<string, unknown>, string[]] {\n this.repairs = [];\n let s = clone(schema);\n s = this.repairTopLevel(s);\n\n if (Array.isArray(s.sheets)) {\n s.sheets = s.sheets.map((sheet: Any, i: number) => this.repairSheet(sheet, `sheets[${i}]`));\n }\n\n return [s, this.repairs];\n }\n\n private repairTopLevel(schema: Any): Any {\n if (schema.sheets == null && schema.sheet != null) {\n const value = schema.sheet;\n delete schema.sheet;\n schema.sheets = Array.isArray(value) ? value : [value];\n this.repairs.push(\"renamed top-level 'sheet' → 'sheets'\");\n }\n return schema;\n }\n\n private repairSheet(sheet: Any, path: string): Any {\n if (!isPlainObject(sheet)) return sheet;\n\n // 'row' → 'rows'\n if (sheet.rows == null && sheet.row != null) {\n sheet.rows = sheet.row;\n delete sheet.row;\n this.repairs.push(`renamed '${path}.row' → '${path}.rows'`);\n }\n\n // Object-as-list: rows is {0:[],1:[],2:[]} → indexed array\n if (sheet.rows != null && isPlainObject(sheet.rows)) {\n const keys = Object.keys(sheet.rows);\n const allIntegerKeys = keys.every((k) => /^\\d+$/.test(k));\n if (allIntegerKeys) {\n sheet.rows = Object.values(sheet.rows);\n this.repairs.push(`converted '${path}.rows' from integer-keyed object to indexed list`);\n }\n }\n\n // Unknown theme → 'default'\n if (sheet.theme != null && !VALID_THEMES.includes(sheet.theme)) {\n const original = sheet.theme;\n sheet.theme = \"default\";\n this.repairs.push(`changed '${path}.theme' from '${original}' to 'default' (unknown theme)`);\n }\n\n // Trim whitespace in sparse-cell A1 addresses\n if (sheet.cells != null && isPlainObject(sheet.cells)) {\n const cleaned: Record<string, unknown> = {};\n let changed = false;\n for (const [addr, data] of Object.entries(sheet.cells)) {\n const trimmed = addr.trim();\n if (trimmed !== addr) changed = true;\n cleaned[trimmed] = data;\n }\n if (changed) {\n sheet.cells = cleaned;\n this.repairs.push(`trimmed whitespace from cell addresses in '${path}.cells'`);\n }\n }\n\n // Column-driven repairs\n if (sheet.columns != null && sheet.rows != null && Array.isArray(sheet.columns) && Array.isArray(sheet.rows)) {\n this.repairColumnTypeInference(sheet, path);\n this.repairStringifiedNumerics(sheet);\n }\n\n return sheet;\n }\n\n private repairColumnTypeInference(sheet: Any, path: string): void {\n sheet.columns.forEach((col: Any, colIdx: number) => {\n if (!isPlainObject(col)) return;\n if (col.type !== undefined && col.type !== \"auto\") return;\n\n const values: unknown[] = [];\n for (const row of sheet.rows as Any[]) {\n if (Array.isArray(row) && colIdx < row.length) values.push(row[colIdx]);\n }\n const nonNull = values.filter((v) => v !== null && v !== undefined);\n if (nonNull.length === 0) return;\n\n const allDateLike = nonNull.every((v) => typeof v === \"string\" && ISO_DATE.test(v));\n if (allDateLike) {\n const type = String(nonNull[0]).includes(\"T\") ? \"datetime\" : \"date\";\n sheet.columns[colIdx].type = type;\n this.repairs.push(`inferred '${path}.columns[${colIdx}].type' = '${type}' from row values`);\n }\n });\n }\n\n private repairStringifiedNumerics(sheet: Any): void {\n sheet.columns.forEach((col: Any, colIdx: number) => {\n if (!isPlainObject(col)) return;\n const type = col.type ?? \"auto\";\n if (!NUMERIC_TYPES.includes(type)) return;\n\n (sheet.rows as Any[]).forEach((row) => {\n if (!Array.isArray(row)) return;\n const value = row[colIdx];\n if (typeof value === \"string\" && isNumericString(value)) {\n row[colIdx] = numericStringToNumber(value);\n }\n });\n });\n }\n}\n\nfunction clone<T>(v: T): T {\n return typeof structuredClone === \"function\"\n ? structuredClone(v)\n : (JSON.parse(JSON.stringify(v)) as T);\n}\n","import { SchemaException } from \"../exceptions\";\nimport { isPlainObject, typeOf } from \"../util\";\nimport { Repairer } from \"./repairer\";\nimport type { RepairResult, ValidationError } from \"./types\";\n\nconst VALID_THEMES = [\"default\", \"minimal\", \"plain\", \"business\"];\nconst ALLOWED_TYPES = [\n \"auto\",\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"date\",\n \"datetime\",\n \"currency\",\n \"percent\",\n \"formula\",\n];\n\ntype Any = any;\n\n/** Hand-rolled schema validator. Mirrors PHP `Schema\\Validator`. */\nexport class Validator {\n validate(schema: Any): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (schema == null || !Array.isArray(schema.sheets)) {\n errors.push(\n error(\n \"sheets\",\n \"array\",\n typeOf(schema?.sheets ?? null),\n schema?.sheets ?? null,\n 'Top-level \"sheets\" must be an array of sheet definitions.',\n ),\n );\n return errors;\n }\n\n if (schema.sheets.length === 0) {\n errors.push(\n error(\"sheets\", \"non-empty array\", \"empty array\", [], \"A workbook must contain at least one sheet.\"),\n );\n return errors;\n }\n\n schema.sheets.forEach((sheet: Any, i: number) => {\n errors.push(...this.validateSheet(sheet, `sheets[${i}]`));\n });\n\n return errors;\n }\n\n assert(schema: Any): void {\n const errors = this.validate(schema);\n if (errors.length > 0) throw SchemaException.fromErrors(errors);\n }\n\n validateAndRepair(schema: Any): RepairResult {\n const [repairedSchema, repairs] = new Repairer().repair(schema);\n const errors = this.validate(repairedSchema);\n return { schema: repairedSchema, errors, repairs };\n }\n\n private validateSheet(sheet: Any, path: string): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (!isPlainObject(sheet)) {\n return [\n error(\n path,\n \"object\",\n typeOf(sheet),\n sheet,\n 'Each sheet must be an object with at least a \"name\" key.',\n ),\n ];\n }\n\n if (typeof sheet.name !== \"string\" || sheet.name.trim() === \"\") {\n errors.push(\n error(\n `${path}.name`,\n \"non-empty string\",\n typeOf(sheet.name ?? null),\n sheet.name ?? null,\n \"Sheet name is required and visible in Excel's tab strip.\",\n ),\n );\n }\n\n const hasColumnsRows = sheet.rows != null || sheet.columns != null;\n const hasCells = sheet.cells != null;\n\n if (!hasColumnsRows && !hasCells) {\n errors.push(\n error(\n path,\n \"object with rows OR cells\",\n \"object without either\",\n sheet,\n \"A sheet needs either {columns, rows} (row-oriented) or {cells} (sparse A1-keyed) data.\",\n ),\n );\n }\n\n if (sheet.columns != null) {\n if (!Array.isArray(sheet.columns)) {\n errors.push(\n error(\n `${path}.columns`,\n \"array\",\n typeOf(sheet.columns),\n sheet.columns,\n \"Columns must be an array of column definitions.\",\n ),\n );\n } else {\n sheet.columns.forEach((col: Any, j: number) => {\n errors.push(...this.validateColumn(col, `${path}.columns[${j}]`));\n });\n }\n }\n\n if (sheet.rows != null) {\n if (!Array.isArray(sheet.rows)) {\n errors.push(\n error(`${path}.rows`, \"array\", typeOf(sheet.rows), sheet.rows, \"Rows must be an array of arrays.\"),\n );\n } else {\n sheet.rows.forEach((row: Any, j: number) => {\n if (!Array.isArray(row)) {\n errors.push(\n error(\n `${path}.rows[${j}]`,\n \"array\",\n typeOf(row),\n row,\n \"Each row is an array of cell values, in column order.\",\n ),\n );\n }\n });\n }\n }\n\n if (sheet.cells != null) {\n // `[]` is an empty map in PHP terms: PHP's describe() reports a sheet with\n // no cells that way, so rejecting it broke describe() -> write().\n const emptyList = Array.isArray(sheet.cells) && sheet.cells.length === 0;\n if (!isPlainObject(sheet.cells) && !emptyList) {\n errors.push(\n error(\n `${path}.cells`,\n \"object keyed by A1 address\",\n typeOf(sheet.cells),\n sheet.cells,\n 'Cells must be an object/map keyed by A1 references like \"A1\", \"B2\".',\n ),\n );\n }\n }\n\n if (sheet.theme != null && !VALID_THEMES.includes(sheet.theme)) {\n errors.push(\n error(\n `${path}.theme`,\n \"one of: default, minimal, plain, business\",\n \"unknown\",\n sheet.theme,\n \"Pick a built-in theme or omit for default.\",\n ),\n );\n }\n\n return errors;\n }\n\n private validateColumn(col: Any, path: string): ValidationError[] {\n if (!isPlainObject(col)) {\n return [\n error(path, \"object\", typeOf(col), col, 'Each column is an object with at least a \"header\" key.'),\n ];\n }\n\n const errors: ValidationError[] = [];\n if (typeof col.header !== \"string\") {\n errors.push(\n error(\n `${path}.header`,\n \"string\",\n typeOf(col.header ?? null),\n col.header ?? null,\n \"Column header is the visible label in row 1.\",\n ),\n );\n }\n\n if (col.type !== undefined && !ALLOWED_TYPES.includes(col.type)) {\n errors.push(\n error(\n `${path}.type`,\n \"one of: \" + ALLOWED_TYPES.join(\", \"),\n \"unknown\",\n col.type,\n 'Pick a supported type or omit for \"auto\" (inferred per cell).',\n ),\n );\n }\n\n return errors;\n }\n}\n\nfunction error(\n path: string,\n expected: string,\n got: string,\n value: unknown,\n hint: string,\n): ValidationError {\n return { path, expected, got, value, hint };\n}\n","/**\n * CRC-32 (IEEE 802.3) over a byte array — used for ZIP local/central headers.\n * Table-based, zero-dependency.\n */\n\nconst TABLE = /* @__PURE__ */ (() => {\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++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nexport function crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i++) {\n crc = TABLE[(crc ^ bytes[i]!) & 0xff]! ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n","/**\n * Minimal ZIP writer using the STORE method (no compression). Valid OOXML\n * containers don't require compression, so this stays tiny, deterministic, and\n * isomorphic. Filenames are UTF-8 (general-purpose bit 11 set).\n */\nimport { crc32 } from \"./crc32\";\n\nexport interface ZipFile {\n name: string;\n data: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\n\n// Fixed DOS timestamp (1980-01-01 00:00:00) for deterministic, reproducible output.\nconst DOS_TIME = 0;\nconst DOS_DATE = 0x0021;\n\nexport function zipSync(files: ZipFile[]): Uint8Array {\n const localParts: Uint8Array[] = [];\n const centralParts: Uint8Array[] = [];\n let offset = 0;\n\n for (const f of files) {\n const nameBytes = encoder.encode(f.name);\n const crc = crc32(f.data);\n const size = f.data.length;\n\n const lh = new Uint8Array(30 + nameBytes.length);\n const ldv = new DataView(lh.buffer);\n ldv.setUint32(0, 0x04034b50, true);\n ldv.setUint16(4, 20, true); // version needed to extract\n ldv.setUint16(6, 0x0800, true); // flags: UTF-8 filename\n ldv.setUint16(8, 0, true); // method: STORE\n ldv.setUint16(10, DOS_TIME, true);\n ldv.setUint16(12, DOS_DATE, true);\n ldv.setUint32(14, crc, true);\n ldv.setUint32(18, size, true); // compressed size\n ldv.setUint32(22, size, true); // uncompressed size\n ldv.setUint16(26, nameBytes.length, true);\n ldv.setUint16(28, 0, true); // extra length\n lh.set(nameBytes, 30);\n localParts.push(lh, f.data);\n\n const cd = new Uint8Array(46 + nameBytes.length);\n const cdv = new DataView(cd.buffer);\n cdv.setUint32(0, 0x02014b50, true);\n cdv.setUint16(4, 20, true); // version made by\n cdv.setUint16(6, 20, true); // version needed\n cdv.setUint16(8, 0x0800, true);\n cdv.setUint16(10, 0, true); // method\n cdv.setUint16(12, DOS_TIME, true);\n cdv.setUint16(14, DOS_DATE, true);\n cdv.setUint32(16, crc, true);\n cdv.setUint32(20, size, true);\n cdv.setUint32(24, size, true);\n cdv.setUint16(28, nameBytes.length, true);\n cdv.setUint16(30, 0, true); // extra length\n cdv.setUint16(32, 0, true); // comment length\n cdv.setUint16(34, 0, true); // disk number start\n cdv.setUint16(36, 0, true); // internal attrs\n cdv.setUint32(38, 0, true); // external attrs\n cdv.setUint32(42, offset, true); // local header offset\n cd.set(nameBytes, 46);\n centralParts.push(cd);\n\n offset += lh.length + f.data.length;\n }\n\n const localSize = offset;\n const centralSize = centralParts.reduce((s, c) => s + c.length, 0);\n\n const eocd = new Uint8Array(22);\n const edv = new DataView(eocd.buffer);\n edv.setUint32(0, 0x06054b50, true);\n edv.setUint16(4, 0, true); // this disk\n edv.setUint16(6, 0, true); // disk with central dir\n edv.setUint16(8, files.length, true);\n edv.setUint16(10, files.length, true);\n edv.setUint32(12, centralSize, true);\n edv.setUint32(16, localSize, true); // central dir offset\n edv.setUint16(20, 0, true); // comment length\n\n const out = new Uint8Array(localSize + centralSize + 22);\n let p = 0;\n for (const part of localParts) {\n out.set(part, p);\n p += part.length;\n }\n for (const part of centralParts) {\n out.set(part, p);\n p += part.length;\n }\n out.set(eocd, p);\n return out;\n}\n","/**\n * Raw DEFLATE (RFC 1951) decompression — `inflateRaw`.\n *\n * Office documents (.xlsx/.pptx) authored by Excel/PowerPoint store their parts\n * with DEFLATE compression, so the reader must inflate them. Our own writer uses\n * the STORE method (no compression), so this is only exercised when reading\n * externally-authored files. Decompress-only, zero-dependency, isomorphic.\n *\n * Algorithm adapted from the public-domain \"tinf\" inflate (Jørgen Ibsen).\n */\n\nclass Tree {\n // number of codes with a given bit length\n readonly table = new Uint16Array(16);\n // symbols sorted by code\n readonly trans = new Uint16Array(288);\n}\n\nconst LENGTH_BITS = new Uint8Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5,\n 5, 5, 0,\n]);\nconst LENGTH_BASE = new Uint16Array([\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67,\n 83, 99, 115, 131, 163, 195, 227, 258,\n]);\nconst DIST_BITS = new Uint8Array([\n 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11,\n 11, 12, 12, 13, 13,\n]);\nconst DIST_BASE = new Uint16Array([\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769,\n 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577,\n]);\n// order in which code-length-code lengths are stored\nconst CLC_INDEX = new Uint8Array([\n 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15,\n]);\n\nfunction buildFixedTrees(lt: Tree, dt: Tree): void {\n let i: number;\n for (i = 0; i < 7; i++) lt.table[i] = 0;\n lt.table[7] = 24;\n lt.table[8] = 152;\n lt.table[9] = 112;\n for (i = 0; i < 24; i++) lt.trans[i] = 256 + i;\n for (i = 0; i < 144; i++) lt.trans[24 + i] = i;\n for (i = 0; i < 8; i++) lt.trans[24 + 144 + i] = 280 + i;\n for (i = 0; i < 112; i++) lt.trans[24 + 144 + 8 + i] = 144 + i;\n for (i = 0; i < 5; i++) dt.table[i] = 0;\n dt.table[5] = 32;\n for (i = 0; i < 32; i++) dt.trans[i] = i;\n}\n\nconst OFFS = new Uint16Array(16);\n\nfunction buildTree(t: Tree, lengths: Uint8Array, off: number, num: number): void {\n let i: number;\n let sum = 0;\n for (i = 0; i < 16; i++) t.table[i] = 0;\n for (i = 0; i < num; i++) t.table[lengths[off + i]!]!++;\n t.table[0] = 0;\n for (i = 0; i < 16; i++) {\n OFFS[i] = sum;\n sum += t.table[i]!;\n }\n for (i = 0; i < num; i++) {\n const len = lengths[off + i]!;\n if (len) t.trans[OFFS[len]!++] = i;\n }\n}\n\nclass Reader {\n source: Uint8Array;\n index = 0;\n tag = 0;\n bitcount = 0;\n constructor(source: Uint8Array) {\n this.source = source;\n }\n}\n\nfunction getBit(d: Reader): number {\n if (d.bitcount-- === 0) {\n d.tag = d.source[d.index++]!;\n d.bitcount = 7;\n }\n const bit = d.tag & 1;\n d.tag >>>= 1;\n return bit;\n}\n\nfunction readBits(d: Reader, num: number, base: number): number {\n if (!num) return base;\n let val = 0;\n for (let i = 0; i < num; i++) val |= getBit(d) << i;\n return val + base;\n}\n\nfunction decodeSymbol(d: Reader, t: Tree): number {\n let sum = 0;\n let cur = 0;\n let len = 0;\n do {\n cur = 2 * cur + getBit(d);\n len++;\n sum += t.table[len]!;\n cur -= t.table[len]!;\n } while (cur >= 0);\n return t.trans[sum + cur]!;\n}\n\nfunction decodeTrees(d: Reader, lt: Tree, dt: Tree): void {\n const lengths = new Uint8Array(288 + 32);\n const hlit = readBits(d, 5, 257);\n const hdist = readBits(d, 5, 1);\n const hclen = readBits(d, 4, 4);\n let i: number;\n for (i = 0; i < 19; i++) lengths[i] = 0;\n for (i = 0; i < hclen; i++) {\n const clen = readBits(d, 3, 0);\n lengths[CLC_INDEX[i]!] = clen;\n }\n const codeTree = new Tree();\n buildTree(codeTree, lengths, 0, 19);\n for (let num = 0; num < hlit + hdist; ) {\n const sym = decodeSymbol(d, codeTree);\n switch (sym) {\n case 16: {\n const prev = lengths[num - 1]!;\n for (let length = readBits(d, 2, 3); length; length--) lengths[num++] = prev;\n break;\n }\n case 17:\n for (let length = readBits(d, 3, 3); length; length--) lengths[num++] = 0;\n break;\n case 18:\n for (let length = readBits(d, 7, 11); length; length--) lengths[num++] = 0;\n break;\n default:\n lengths[num++] = sym;\n break;\n }\n }\n buildTree(lt, lengths, 0, hlit);\n buildTree(dt, lengths, hlit, hdist);\n}\n\nclass Out {\n buf = new Uint8Array(1024);\n len = 0;\n push(b: number): void {\n if (this.len >= this.buf.length) {\n const next = new Uint8Array(this.buf.length * 2);\n next.set(this.buf);\n this.buf = next;\n }\n this.buf[this.len++] = b;\n }\n}\n\nfunction inflateBlockData(d: Reader, out: Out, lt: Tree, dt: Tree): void {\n for (;;) {\n const sym = decodeSymbol(d, lt);\n if (sym === 256) return;\n if (sym < 256) {\n out.push(sym);\n } else {\n const lengthSym = sym - 257;\n const length = readBits(d, LENGTH_BITS[lengthSym]!, LENGTH_BASE[lengthSym]!);\n const distSym = decodeSymbol(d, dt);\n const dist = readBits(d, DIST_BITS[distSym]!, DIST_BASE[distSym]!);\n const offs = out.len - dist;\n for (let i = 0; i < length; i++) out.push(out.buf[offs + i]!);\n }\n }\n}\n\nfunction inflateUncompressedBlock(d: Reader, out: Out): void {\n // discard remaining bits in the current (partial) byte\n d.bitcount = 0;\n let length = d.source[d.index + 1]! * 256 + d.source[d.index]!;\n d.index += 4; // skip LEN + NLEN\n for (; length; length--) out.push(d.source[d.index++]!);\n}\n\nexport function inflateRaw(source: Uint8Array): Uint8Array {\n const d = new Reader(source);\n const out = new Out();\n const lt = new Tree();\n const dt = new Tree();\n let bfinal: number;\n do {\n bfinal = getBit(d);\n const btype = readBits(d, 2, 0);\n if (btype === 0) {\n inflateUncompressedBlock(d, out);\n } else if (btype === 1) {\n buildFixedTrees(lt, dt);\n inflateBlockData(d, out, lt, dt);\n } else if (btype === 2) {\n decodeTrees(d, lt, dt);\n inflateBlockData(d, out, lt, dt);\n } else {\n throw new Error(\"holy-sheet: invalid DEFLATE block type\");\n }\n } while (!bfinal);\n return out.buf.subarray(0, out.len);\n}\n","/**\n * Minimal ZIP reader. Parses the central directory and returns a name → bytes\n * map. Supports STORE (method 0) and DEFLATE (method 8, via `inflateRaw`) so it\n * reads both our own output and Excel/PowerPoint-authored files. Zip64 is not\n * handled (OOXML parts are well under 4 GB).\n */\nimport { inflateRaw } from \"./inflate\";\n\nconst decoder = new TextDecoder();\n\nexport function unzipSync(data: Uint8Array): Record<string, Uint8Array> {\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Locate the End Of Central Directory record (scan backward; it may carry a comment).\n let eocd = -1;\n for (let i = data.length - 22; i >= 0; i--) {\n if (dv.getUint32(i, true) === 0x06054b50) {\n eocd = i;\n break;\n }\n }\n if (eocd < 0) throw new Error(\"holy-sheet: not a zip archive (no EOCD record)\");\n\n const count = dv.getUint16(eocd + 10, true);\n let cd = dv.getUint32(eocd + 16, true);\n const result: Record<string, Uint8Array> = {};\n\n for (let n = 0; n < count; n++) {\n if (dv.getUint32(cd, true) !== 0x02014b50) break;\n const method = dv.getUint16(cd + 10, true);\n const compSize = dv.getUint32(cd + 20, true);\n const nameLen = dv.getUint16(cd + 28, true);\n const extraLen = dv.getUint16(cd + 30, true);\n const commentLen = dv.getUint16(cd + 32, true);\n const localOffset = dv.getUint32(cd + 42, true);\n const name = decoder.decode(data.subarray(cd + 46, cd + 46 + nameLen));\n\n const lhNameLen = dv.getUint16(localOffset + 26, true);\n const lhExtraLen = dv.getUint16(localOffset + 28, true);\n const dataStart = localOffset + 30 + lhNameLen + lhExtraLen;\n const raw = data.subarray(dataStart, dataStart + compSize);\n\n let content: Uint8Array;\n if (method === 0) content = raw.slice();\n else if (method === 8) content = inflateRaw(raw);\n else throw new Error(`holy-sheet: unsupported zip method ${method} for \"${name}\"`);\n\n result[name] = content;\n cd += 46 + nameLen + extraLen + commentLen;\n }\n\n return result;\n}\n","import type { XmlNode } from \"../xml\";\n\n/**\n * OpenDocument namespace URIs, and lookups by URI. Mirrors PHP `Reader\\Ods\\Ns`.\n *\n * Elements and attributes are matched by URI, never by prefix: `table:` is a\n * convention every producer happens to follow, not something the format\n * promises. Parse with `parseXml(src, { namespaces: true })`.\n */\nexport const NS = {\n OFFICE: \"urn:oasis:names:tc:opendocument:xmlns:office:1.0\",\n TABLE: \"urn:oasis:names:tc:opendocument:xmlns:table:1.0\",\n TEXT: \"urn:oasis:names:tc:opendocument:xmlns:text:1.0\",\n STYLE: \"urn:oasis:names:tc:opendocument:xmlns:style:1.0\",\n FO: \"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\",\n NUMBER: \"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\",\n DC: \"http://purl.org/dc/elements/1.1/\",\n META: \"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\",\n /** LibreOffice's extension namespace; carries `value-type=\"error\"` for a formula error. */\n CALCEXT: \"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0\",\n} as const;\n\n/** The first child element with this namespace and local name. */\nexport function child(node: XmlNode | null | undefined, ns: string, name: string): XmlNode | undefined {\n return node?.children.find((c) => c.ns === ns && c.name === name);\n}\n\n/** Child elements in this namespace, in document order. */\nexport function childrenIn(node: XmlNode | null | undefined, ns: string): XmlNode[] {\n return node ? node.children.filter((c) => c.ns === ns) : [];\n}\n\n/** A namespaced attribute, or undefined when absent. */\nexport function attr(node: XmlNode | null | undefined, ns: string, name: string): string | undefined {\n return node?.nsAttrs?.[`{${ns}}${name}`];\n}\n\n/** An element's own text: its direct text runs, as SimpleXML's `(string)` cast reads it. */\nexport function ownText(node: XmlNode | null | undefined): string {\n return node ? node.text : \"\";\n}\n\n// ─── PHP semantics the reference reader relies on ──────────────────────────\n//\n// The PHP reader is the reference, and several of its primitives are narrower\n// than their JavaScript look-alikes. `trim` and `strtolower` are ASCII-only;\n// `(int)` reads a leading integer and gives 0 for anything else. Using the\n// JavaScript versions would agree on every fixture and disagree on the first\n// file with a narrow no-break space in a currency format.\n\n/** PHP `trim()`: space, tab, LF, CR, NUL and vertical tab only. */\nexport function phpTrim(s: string): string {\n return s.replace(/^[ \\t\\n\\r\\0\\x0B]+|[ \\t\\n\\r\\0\\x0B]+$/g, \"\");\n}\n\n/** PHP 8 `strtolower()`: ASCII letters only. */\nexport function asciiLower(s: string): string {\n return s.replace(/[A-Z]/g, (c) => c.toLowerCase());\n}\n\n/** PHP `(int) $string`: the leading integer, 0 when there is none. */\nexport function phpInt(s: string): number {\n const m = /^[ \\t\\n\\r\\v\\f]*([+-]?\\d+)/.exec(s);\n return m ? parseInt(m[1]!, 10) : 0;\n}\n\n/** PHP 8 `is_numeric()` on a string. */\nexport function phpIsNumeric(s: string): boolean {\n return /^[ \\t\\n\\r\\v\\f]*[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?[ \\t\\n\\r\\v\\f]*$/.test(s);\n}\n","import { UnsupportedFormatException } from \"../exceptions\";\nimport { unzipSync } from \"../zip\";\nimport { phpTrim } from \"./ods/ns\";\n\nexport type SpreadsheetFormat = \"xlsx\" | \"ods\";\n\n/** The spreadsheet media types, and the template variant (.ots) which is read the same way. */\nconst ODS_MIMETYPES = new Set([\n \"application/vnd.oasis.opendocument.spreadsheet\",\n \"application/vnd.oasis.opendocument.spreadsheet-template\",\n]);\n\nconst decoder = new TextDecoder();\n\n/**\n * Which reader a file needs, decided from its contents, never its extension.\n * Mirrors PHP `Reader\\FormatSniffer`.\n *\n * An OpenDocument package names itself in its `mimetype` entry; an xlsx has no\n * such entry and is recognised by `xl/workbook.xml`. Anything else is refused\n * by name. The unzipped entries are returned so the reader does not unzip again.\n */\nexport const FormatSniffer = {\n sniff(\n bytes: Uint8Array,\n path: string | null = null,\n ): { format: SpreadsheetFormat; files: Record<string, Uint8Array> } {\n let files: Record<string, Uint8Array>;\n try {\n files = unzipSync(bytes);\n } catch (e) {\n // A real zip this reader cannot inflate is a different failure; say so.\n if (e instanceof Error && e.message.includes(\"unsupported zip method\")) throw e;\n throw UnsupportedFormatException.notAZip(path);\n }\n\n const mimetype = files[\"mimetype\"] ? phpTrim(decoder.decode(files[\"mimetype\"])) : null;\n if (mimetype !== null && ODS_MIMETYPES.has(mimetype)) return { format: \"ods\", files };\n if (files[\"xl/workbook.xml\"]) return { format: \"xlsx\", files };\n\n throw UnsupportedFormatException.unknownPackage(path, mimetype);\n },\n};\n","/**\n * An OpenDocument `table:formula` -> the A1 syntax the xlsx reader returns.\n * Mirrors PHP `Reader\\Ods\\OdsFormula`; the full list of what is and is not\n * translated is documented there.\n *\n * `of:=SUM([.A1:.B2];[$'Other Sheet'.C3])` becomes `SUM(A1:B2,'Other Sheet'!C3)`.\n */\nexport function odsFormulaToA1(formula: string): string {\n let grammar = \"of\";\n const m = /^(of|oooc|msoxl):/i.exec(formula);\n if (m) {\n grammar = m[1]!.toLowerCase();\n formula = formula.slice(m[0].length);\n }\n if (formula.startsWith(\"=\")) formula = formula.slice(1);\n\n return grammar === \"msoxl\" ? formula : translate(formula);\n}\n\nfunction translate(s: string): string {\n let out = \"\";\n const length = s.length;\n let arrayDepth = 0;\n\n for (let i = 0; i < length; i++) {\n let c = s[i]!;\n\n if (c === '\"') {\n let end = i + 1;\n while (end < length) {\n if (s[end] === '\"') {\n if (end + 1 < length && s[end + 1] === '\"') {\n end += 2;\n continue;\n }\n break;\n }\n end++;\n }\n out += s.slice(i, end + 1);\n i = end;\n continue;\n }\n\n if (c === \"[\") {\n let end = i + 1;\n let quoted = false;\n while (end < length && (quoted || s[end] !== \"]\")) {\n if (s[end] === \"'\") quoted = !quoted;\n end++;\n }\n out += reference(s.slice(i + 1, end));\n i = end;\n continue;\n }\n\n if (c === \"{\") {\n arrayDepth++;\n } else if (c === \"}\") {\n arrayDepth = Math.max(0, arrayDepth - 1);\n } else if (c === \";\") {\n c = \",\";\n } else if (c === \"|\" && arrayDepth > 0) {\n c = \";\";\n }\n out += c;\n }\n\n return out;\n}\n\n/** The inside of one `[...]`. */\nfunction reference(ref: string): string {\n const parts: string[] = [];\n let start = 0;\n let quoted = false;\n for (let i = 0; i < ref.length; i++) {\n if (ref[i] === \"'\") {\n quoted = !quoted;\n } else if (ref[i] === \":\" && !quoted) {\n parts.push(ref.slice(start, i));\n start = i + 1;\n }\n }\n parts.push(ref.slice(start));\n\n const parsed = parts.length <= 2 ? parts.map(part) : [null];\n if (parsed.some((p) => p === null)) {\n return ref.includes(\"#REF!\") ? \"#REF!\" : `[${ref}]`;\n }\n\n const [sheet, address] = parsed[0]!;\n if (parsed.length === 1) return sheetPrefix(sheet) + address;\n\n const [sheet2, address2] = parsed[1]!;\n if (sheet2 === null || sheet2 === sheet) return sheetPrefix(sheet) + address + \":\" + address2;\n if (sheet === null) return address + \":\" + sheetPrefix(sheet2) + address2;\n\n // A range across sheets: one prefix naming both, quoted as a whole.\n const both =\n needsQuotes(sheet) || needsQuotes(sheet2)\n ? \"'\" + sheet.replace(/'/g, \"''\") + \":\" + sheet2.replace(/'/g, \"''\") + \"'\"\n : sheet + \":\" + sheet2;\n\n return both + \"!\" + address + \":\" + address2;\n}\n\n/** One end of a reference: `$'Sheet'.$A$1`, `Sheet.A1`, `.A1`, `.A`, `.1`. */\nfunction part(p: string): [string | null, string] | null {\n const length = p.length;\n let i = 0;\n if (i < length && p[i] === \"$\") i++;\n\n let sheet: string | null = null;\n if (i < length && p[i] === \"'\") {\n sheet = \"\";\n i++;\n for (;;) {\n if (i >= length) return null;\n if (p[i] === \"'\") {\n if (i + 1 < length && p[i + 1] === \"'\") {\n sheet += \"'\";\n i += 2;\n continue;\n }\n i++;\n break;\n }\n sheet += p[i++];\n }\n if (i >= length || p[i] !== \".\") return null;\n i++;\n } else {\n const dot = p.indexOf(\".\", i);\n if (dot < 0) return null;\n if (dot > i) sheet = p.slice(i, dot);\n i = dot + 1;\n }\n\n const address = p.slice(i);\n if (!/^(\\$?[A-Za-z]{1,3}\\$?[0-9]+|\\$?[A-Za-z]{1,3}|\\$?[0-9]+)$/.test(address)) return null;\n\n return [sheet, address];\n}\n\nfunction sheetPrefix(sheet: string | null): string {\n if (sheet === null) return \"\";\n return (needsQuotes(sheet) ? \"'\" + sheet.replace(/'/g, \"''\") + \"'\" : sheet) + \"!\";\n}\n\n/** Whether Excel needs the sheet name quoted. Over-quoting is still valid. */\nfunction needsQuotes(sheet: string): boolean {\n return (\n !/^[A-Za-z_][A-Za-z0-9_.]*$/.test(sheet) ||\n /^[A-Za-z]{1,3}[0-9]+$/.test(sheet) ||\n /^[Rr]([0-9]+)?[Cc]([0-9]+)?$/.test(sheet)\n );\n}\n","import type { DisplayFormat } from \"../../schema/types\";\n\nexport interface NumFmtParsed {\n displayFormat: DisplayFormat;\n decimals?: number;\n currency?: string;\n}\n\n/** Reverse of NumFmtBuilder. Mirrors PHP `Reader\\Format\\NumFmtParser`. */\nconst BUILTIN: Record<number, string> = {\n 0: \"General\",\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"mm-dd-yy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yy h:mm\",\n 37: \"#,##0 ;(#,##0)\",\n 38: \"#,##0 ;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mmss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\",\n};\n\nexport const SYMBOL_TO_ISO: Record<string, string> = {\n $: \"USD\",\n \"€\": \"EUR\",\n \"£\": \"GBP\",\n \"¥\": \"JPY\",\n \"₹\": \"INR\",\n \"₩\": \"KRW\",\n};\n\nexport const NumFmtParser = {\n parse(formatCode: string | null): NumFmtParsed | null {\n if (formatCode === null) return null;\n const code = formatCode;\n\n if (code === \"\" || code === \"General\" || code === \"@\") {\n return { displayFormat: code === \"@\" ? \"text\" : \"auto\" };\n }\n\n if (looksLikeDate(code)) {\n return { displayFormat: hasTimeComponent(code) ? \"datetime\" : \"date\" };\n }\n\n if (code.includes(\"%\")) {\n return { displayFormat: \"percentage\", decimals: decimalsAfter(code) };\n }\n\n const m = /^\"([^\"]+)\"/u.exec(code);\n if (m) {\n const iso = SYMBOL_TO_ISO[m[1]!];\n const result: NumFmtParsed = { displayFormat: \"currency\", decimals: decimalsAfter(code) };\n if (iso !== undefined) result.currency = iso;\n return result;\n }\n\n if (/^#?,?#?#?0(\\.0+)?$/.test(code.split(\";\")[0]!)) {\n return { displayFormat: \"number\", decimals: decimalsAfter(code) };\n }\n\n return null;\n },\n\n parseBuiltin(id: number): NumFmtParsed | null {\n const code = BUILTIN[id];\n if (code === undefined) return null;\n return NumFmtParser.parse(code);\n },\n};\n\nfunction looksLikeDate(code: string): boolean {\n const stripped = code.replace(/\"[^\"]*\"|\\[[^\\]]*\\]/gu, \"\");\n return /[ymd]/i.test(stripped);\n}\n\nfunction hasTimeComponent(code: string): boolean {\n const stripped = code.replace(/\"[^\"]*\"|\\[[^\\]]*\\]/gu, \"\");\n return /[hHsS]/.test(stripped) || stripped.toLowerCase().includes(\"mm:\");\n}\n\nfunction decimalsAfter(code: string): number {\n const section = code.split(\";\")[0]!;\n const m = /0\\.(0+)/.exec(section);\n return m ? m[1]!.length : 0;\n}\n","import { CellFormat } from \"../../workbook/cell-format\";\nimport type { DisplayFormat } from \"../../schema/types\";\nimport { SYMBOL_TO_ISO } from \"../format/num-fmt-parser\";\nimport type { XmlNode } from \"../xml\";\nimport { NS, asciiLower, attr, child, childrenIn, ownText, phpInt, phpIsNumeric, phpTrim } from \"./ns\";\n\ninterface DataFormat {\n displayFormat: DisplayFormat;\n decimals?: number;\n currency?: string;\n}\n\ninterface Resolved {\n bold: boolean;\n italic: boolean;\n textAlign: string | null;\n color: string | null;\n backgroundColor: string | null;\n fontSize: number | null;\n borderTop: string | null;\n borderRight: string | null;\n borderBottom: string | null;\n borderLeft: string | null;\n data: DataFormat | null;\n}\n\n/**\n * Cell styles and data styles -> `CellFormat`. Mirrors PHP `Reader\\Ods\\OdsStyles`,\n * where what is and is not mapped is documented.\n *\n * A cell's style is found in content.xml's automatic styles, then styles.xml's\n * common styles, and inherits along `style:parent-style-name` down to the\n * table-cell `style:default-style`. The nearest style that sets a property wins.\n */\nexport class OdsStyles {\n private readonly automatic = new Map<string, XmlNode>();\n private readonly common = new Map<string, XmlNode>();\n private defaultStyle: XmlNode | null = null;\n private readonly dataStyles = new Map<string, XmlNode>();\n private readonly resolved = new Map<string, Resolved>();\n private readonly defaultFontSize: number | null;\n\n constructor(content: XmlNode | null, styles: XmlNode | null) {\n if (content) this.index(child(content, NS.OFFICE, \"automatic-styles\"), this.automatic);\n if (styles) {\n this.index(child(styles, NS.OFFICE, \"styles\"), this.common);\n this.index(child(styles, NS.OFFICE, \"automatic-styles\"), this.common);\n }\n this.defaultFontSize = this.properties(\"Default\").fontSize;\n }\n\n /**\n * The format of one cell.\n *\n * @param styleName the cell's effective style (cell, row default, column default, or \"Default\")\n * @param valueType office:value-type\n * @param currency office:currency, the ISO code a currency value carries\n * @param dateHasTime whether an office:date-value carries a time of day\n */\n cellFormat(styleName: string, valueType: string | null, currency: string | null, dateHasTime: boolean): CellFormat | null {\n const p = this.properties(styleName);\n let data: DataFormat | null = p.data;\n const display = data?.displayFormat ?? null;\n\n // The value type says what the value IS; the data style only says how it is shown.\n switch (valueType) {\n case \"date\":\n data = { displayFormat: display === \"date\" || display === \"datetime\" ? display : dateHasTime ? \"datetime\" : \"date\" };\n break;\n case \"time\":\n data = { displayFormat: \"datetime\" };\n break;\n case \"percentage\":\n if (display !== \"percentage\") {\n data = { displayFormat: \"percentage\", ...(data?.decimals !== undefined ? { decimals: data.decimals } : {}) };\n }\n break;\n case \"currency\":\n if (display !== \"currency\") {\n data = { displayFormat: \"currency\", ...(data?.decimals !== undefined ? { decimals: data.decimals } : {}) };\n } else {\n data = { ...data! };\n }\n if (currency !== null && currency !== \"\") data.currency = currency;\n break;\n }\n\n const format = new CellFormat({\n bold: p.bold,\n italic: p.italic,\n textAlign: p.textAlign,\n displayFormat: data?.displayFormat ?? null,\n decimals: data?.decimals ?? null,\n color: p.color,\n backgroundColor: p.backgroundColor,\n fontSize: p.fontSize !== null && p.fontSize !== this.defaultFontSize ? p.fontSize : null,\n borderTop: p.borderTop,\n borderRight: p.borderRight,\n borderBottom: p.borderBottom,\n borderLeft: p.borderLeft,\n currency: data?.currency ?? null,\n });\n\n return format.isEmpty() ? null : format;\n }\n\n private index(container: XmlNode | undefined, into: Map<string, XmlNode>): void {\n if (!container) return;\n\n for (const el of childrenIn(container, NS.STYLE)) {\n const family = attr(el, NS.STYLE, \"family\") ?? \"\";\n if (el.name === \"default-style\" && family === \"table-cell\") {\n this.defaultStyle ??= el;\n } else if (el.name === \"style\" && family === \"table-cell\") {\n const name = attr(el, NS.STYLE, \"name\") ?? \"\";\n if (!into.has(name)) into.set(name, el);\n }\n }\n for (const el of childrenIn(container, NS.NUMBER)) {\n const name = attr(el, NS.STYLE, \"name\") ?? \"\";\n if (!this.dataStyles.has(name)) this.dataStyles.set(name, el);\n }\n }\n\n /** The style and its ancestors, nearest first, ending with the default style. */\n private chain(name: string): XmlNode[] {\n const chain: XmlNode[] = [];\n const seen = new Set<string>();\n // The cell's own style is normally automatic; a parent is always common.\n let el = this.automatic.get(name) ?? this.common.get(name);\n while (el !== undefined && !seen.has(name)) {\n seen.add(name);\n chain.push(el);\n name = attr(el, NS.STYLE, \"parent-style-name\") ?? \"\";\n el = name === \"\" ? undefined : this.common.get(name) ?? this.automatic.get(name);\n }\n if (this.defaultStyle) chain.push(this.defaultStyle);\n return chain;\n }\n\n private properties(name: string): Resolved {\n const cached = this.resolved.get(name);\n if (cached) return cached;\n\n const chain = this.chain(name);\n const weight = first(chain, \"text-properties\", NS.FO, \"font-weight\");\n const style = first(chain, \"text-properties\", NS.FO, \"font-style\");\n const size = first(chain, \"text-properties\", NS.FO, \"font-size\");\n\n let dataStyle: string | null = null;\n for (const el of chain) {\n const candidate = attr(el, NS.STYLE, \"data-style-name\") ?? \"\";\n if (candidate !== \"\") {\n dataStyle = candidate;\n break;\n }\n }\n\n const sizeMatch = size !== null ? /^([0-9]*\\.?[0-9]+)pt$/.exec(size) : null;\n const resolved: Resolved = {\n bold: weight !== null && (weight === \"bold\" || (phpIsNumeric(weight) && phpInt(weight) >= 600)),\n italic: style === \"italic\" || style === \"oblique\",\n textAlign: textAlign(chain),\n color: color(chain),\n backgroundColor: background(chain),\n fontSize: sizeMatch ? Math.trunc(parseFloat(sizeMatch[1]!)) : null,\n borderTop: border(chain, \"top\"),\n borderRight: border(chain, \"right\"),\n borderBottom: border(chain, \"bottom\"),\n borderLeft: border(chain, \"left\"),\n data: this.dataFormat(dataStyle, 0),\n };\n this.resolved.set(name, resolved);\n return resolved;\n }\n\n /** A data style -> displayFormat, decimals, currency. */\n private dataFormat(name: string | null, depth: number): DataFormat | null {\n if (name === null || depth > 4) return null;\n const el = this.dataStyles.get(name);\n if (!el) return null;\n\n // LibreOffice writes a signed format as the NEGATIVE sub-format with a map\n // to the positive one; the positive one is the format as authored.\n for (const map of childrenIn(el, NS.STYLE)) {\n if (map.name !== \"map\") continue;\n const condition = (attr(map, NS.STYLE, \"condition\") ?? \"\").replace(/[ \\t\\n\\r\\f\\v]+/g, \"\");\n if (condition === \"value()>=0\" || condition === \"value()>0\") {\n const mapped = this.dataFormat(attr(map, NS.STYLE, \"apply-style-name\") ?? \"\", depth + 1);\n if (mapped !== null) return mapped;\n }\n }\n\n const parts = childrenIn(el, NS.NUMBER);\n const has = (local: string): boolean => parts.some((p) => p.name === local);\n const number = parts.find((p) => p.name === \"number\");\n let decimals: number | null = null;\n if (number) {\n const places = attr(number, NS.NUMBER, \"decimal-places\") ?? attr(number, NS.NUMBER, \"min-decimal-places\");\n decimals = places !== undefined ? phpInt(places) : null;\n }\n\n switch (el.name) {\n case \"number-style\": {\n if (has(\"scientific-number\") || has(\"fraction\")) return null;\n // A currency written as literal text around a number: \"$#,##0.00\"\n // converted from xlsx arrives this way, not as a currency-style.\n for (const text of parts.filter((p) => p.name === \"text\")) {\n const iso = currencyCode(ownText(text).replace(/[-()\"\\u00A0]/g, \"\"));\n if (iso !== null) return { displayFormat: \"currency\", decimals: decimals ?? 0, currency: iso };\n }\n if (!number) return null;\n // A number with no decimal places set is \"General\".\n return decimals === null ? { displayFormat: \"auto\" } : { displayFormat: \"number\", decimals };\n }\n case \"percentage-style\":\n return { displayFormat: \"percentage\", decimals: decimals ?? 0 };\n case \"currency-style\": {\n const out: DataFormat = { displayFormat: \"currency\", decimals: decimals ?? 0 };\n const symbol = parts.find((p) => p.name === \"currency-symbol\");\n const iso = symbol ? currencyCode(ownText(symbol)) : null;\n if (iso !== null) out.currency = iso;\n return out;\n }\n case \"date-style\":\n return [\"hours\", \"minutes\", \"seconds\", \"am-pm\"].some(has) ? { displayFormat: \"datetime\" } : { displayFormat: \"date\" };\n case \"time-style\":\n return { displayFormat: \"datetime\" };\n case \"text-style\":\n return { displayFormat: \"text\" };\n default: // boolean-style, and anything newer than this reader\n return null;\n }\n }\n}\n\n/** The nearest value of one property attribute. */\nfunction first(chain: XmlNode[], properties: string, ns: string, name: string): string | null {\n for (const el of chain) {\n const props = child(el, NS.STYLE, properties);\n const value = attr(props, ns, name);\n if (value !== undefined) return phpTrim(value);\n }\n return null;\n}\n\nfunction color(chain: XmlNode[]): string | null {\n for (const el of chain) {\n const props = child(el, NS.STYLE, \"text-properties\");\n if (!props) continue;\n // \"Automatic\" colour: whatever the viewer's window text is. No fixed colour.\n if (attr(props, NS.STYLE, \"use-window-font-color\") === \"true\") return null;\n const value = attr(props, NS.FO, \"color\");\n if (value !== undefined) return hex(value);\n }\n return null;\n}\n\nfunction background(chain: XmlNode[]): string | null {\n const value = first(chain, \"table-cell-properties\", NS.FO, \"background-color\");\n return value === null || value === \"transparent\" ? null : hex(value);\n}\n\nfunction border(chain: XmlNode[], side: string): string | null {\n for (const el of chain) {\n const props = child(el, NS.STYLE, \"table-cell-properties\");\n if (!props) continue;\n const raw = attr(props, NS.FO, `border-${side}`) ?? attr(props, NS.FO, \"border\");\n if (raw === undefined) continue;\n\n const value = asciiLower(phpTrim(raw));\n if (value === \"\" || /\\b(none|hidden)\\b/.test(value)) return null;\n const m = /#([0-9a-f]{6})\\b/.exec(value);\n return m ? \"#\" + m[1]!.toUpperCase() : \"#000000\";\n }\n return null;\n}\n\nfunction textAlign(chain: XmlNode[]): string | null {\n // text-align-source=\"value-type\" means \"align by what the value is\": the\n // stored fo:text-align is not in effect.\n if (first(chain, \"table-cell-properties\", NS.STYLE, \"text-align-source\") === \"value-type\") return null;\n\n const align = first(chain, \"paragraph-properties\", NS.FO, \"text-align\");\n if (align === null || align === \"\") return null;\n if (align === \"start\") return \"left\";\n if (align === \"end\") return \"right\";\n return align;\n}\n\nfunction hex(value: string): string | null {\n const m = /^#([0-9a-fA-F]{6})$/.exec(phpTrim(value));\n return m ? \"#\" + m[1]!.toUpperCase() : null;\n}\n\nfunction currencyCode(symbol: string): string | null {\n const s = phpTrim(symbol);\n if (s === \"\") return null;\n if (/^[A-Z]{3}$/.test(s)) return s;\n return SYMBOL_TO_ISO[s] ?? null;\n}\n","import type { XmlNode } from \"../xml\";\nimport { NS } from \"./ns\";\n\n/**\n * The text of a cell or annotation: its paragraphs, one line each. Mirrors PHP\n * `Reader\\Ods\\OdsText`.\n *\n * A paragraph is mixed content — runs, links, `text:s` for extra spaces,\n * `text:tab`, `text:line-break` — and its meaning depends on ORDER, so it is\n * walked through `content`. Inside a paragraph, elements are matched by local\n * name, as the PHP reader matches them.\n *\n * White space follows ODF 1.3 §6.1.2, the way LibreOffice applies it: a run of\n * space, tab, CR and LF characters is ONE space, and white space at the start of\n * a paragraph or straight after another collapsed space is dropped. `text:s` is\n * never collapsed.\n */\n\n/** Elements whose text is not part of the paragraph (a note, a comment). */\nconst SKIPPED = new Set([\"annotation\", \"note\"]);\n\ninterface State {\n out: string;\n ignoreSpace: boolean;\n}\n\n/** The `text:p` / `text:h` children joined with \"\\n\", or null when there are none. */\nexport function paragraphs(node: XmlNode): string | null {\n const lines: string[] = [];\n for (const c of node.children) {\n if (c.ns === NS.TEXT && (c.name === \"p\" || c.name === \"h\")) lines.push(paragraph(c));\n }\n return lines.length === 0 ? null : lines.join(\"\\n\");\n}\n\nexport function paragraph(p: XmlNode): string {\n const state: State = { out: \"\", ignoreSpace: true };\n walk(p, state);\n return state.out;\n}\n\nfunction walk(node: XmlNode, state: State): void {\n for (const item of node.content ?? []) {\n if (typeof item === \"string\") {\n appendCharacters(state, item);\n continue;\n }\n if (SKIPPED.has(item.name)) continue;\n\n if (item.name === \"s\") {\n const c = item.attrs[\"c\"];\n const count = c !== undefined && /^\\d+$/.test(c) ? parseInt(c, 10) : 1;\n state.out += \" \".repeat(Math.max(1, count));\n state.ignoreSpace = false;\n } else if (item.name === \"tab\") {\n state.out += \"\\t\";\n state.ignoreSpace = false;\n } else if (item.name === \"line-break\") {\n state.out += \"\\n\";\n state.ignoreSpace = false;\n }\n walk(item, state);\n }\n}\n\nfunction appendCharacters(state: State, chars: string): void {\n for (let i = 0; i < chars.length; i++) {\n const c = chars[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n if (!state.ignoreSpace) {\n state.out += \" \";\n state.ignoreSpace = true;\n }\n continue;\n }\n state.out += c;\n state.ignoreSpace = false;\n }\n}\n","/** Excel serial → ISO-8601 string. Mirrors PHP `Reader\\Format\\DateInverter`. */\nexport const DateInverter = {\n toIso(serial: number, includeTime = false): string {\n const epoch = Date.UTC(1899, 11, 30, 0, 0, 0);\n const ms = epoch + Math.round(serial * 86400) * 1000;\n const d = new Date(ms);\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const date = `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;\n if (!includeTime) return date;\n return `${date}T${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}Z`;\n },\n};\n","import { isNumericString } from \"../util\";\nimport type { Cell } from \"../workbook/cell\";\nimport type { CellComment } from \"../workbook/cell-comment\";\nimport type { CellFormat } from \"../workbook/cell-format\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { DateInverter } from \"./format/date-inverter\";\n\n/**\n * A read `Workbook` -> the Holy Sheet schema `describe()` returns. Mirrors PHP\n * `Reader\\WorkbookSchema`.\n *\n * Shared by every reader (xlsx, ods) so the output shape cannot drift between\n * formats: key order, which empty things are dropped, and how a date-formatted\n * serial becomes an ISO string are decided here and only here.\n */\nexport const WorkbookSchema = {\n fromWorkbook(workbook: Workbook): Record<string, unknown> {\n const schema: Record<string, unknown> = { sheets: workbook.sheets.map(sheetToSchema) };\n if (Object.keys(workbook.meta).length > 0) schema[\"meta\"] = workbook.meta;\n return schema;\n },\n};\n\nfunction sheetToSchema(sheet: Sheet): Record<string, unknown> {\n const cells: Record<string, unknown> = {};\n for (const [address, cell] of sheet.cells) {\n const cellSchema = cellToSchema(cell);\n if (cellSchema === null) continue;\n cells[address] = cellSchema;\n }\n\n const out: Record<string, unknown> = { name: sheet.name, cells };\n if (sheet.mergedRegions.length > 0) {\n out[\"mergedRegions\"] = sheet.mergedRegions.map((m) => ({ start: m.start, end: m.end }));\n }\n if (sheet.columnWidths.size > 0) {\n const widths: Record<number, number> = {};\n for (const [k, v] of sheet.columnWidths) widths[k] = v;\n out[\"columnWidths\"] = widths;\n }\n if (sheet.frozenRows > 0) out[\"frozenRows\"] = sheet.frozenRows;\n if (sheet.frozenCols > 0) out[\"frozenCols\"] = sheet.frozenCols;\n return out;\n}\n\nfunction cellToSchema(cell: Cell): Record<string, unknown> | null {\n let value = cell.value;\n const format = cell.format;\n\n if (\n format !== null &&\n (format.displayFormat === \"date\" || format.displayFormat === \"datetime\") &&\n isNumericString(value as never)\n ) {\n value = DateInverter.toIso(Number(value), format.displayFormat === \"datetime\");\n }\n\n const out: Record<string, unknown> = { value };\n if (cell.formula !== null) out[\"formula\"] = cell.formula;\n if (cell.cachedValue !== null) out[\"computedValue\"] = cell.cachedValue;\n if (format !== null && !format.isEmpty()) out[\"format\"] = formatToObject(format);\n if (cell.comment !== null) out[\"comment\"] = commentToObject(cell.comment);\n\n if (Object.keys(out).length === 1 && out[\"value\"] === null) return null;\n return out;\n}\n\nfunction formatToObject(f: CellFormat): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (f.bold) out[\"bold\"] = true;\n if (f.italic) out[\"italic\"] = true;\n if (f.textAlign !== null) out[\"textAlign\"] = f.textAlign;\n if (f.displayFormat !== null) out[\"displayFormat\"] = f.displayFormat;\n if (f.decimals !== null) out[\"decimals\"] = f.decimals;\n if (f.color !== null) out[\"color\"] = f.color;\n if (f.backgroundColor !== null) out[\"backgroundColor\"] = f.backgroundColor;\n if (f.fontSize !== null) out[\"fontSize\"] = f.fontSize;\n if (f.borderTop !== null) out[\"borderTop\"] = f.borderTop;\n if (f.borderRight !== null) out[\"borderRight\"] = f.borderRight;\n if (f.borderBottom !== null) out[\"borderBottom\"] = f.borderBottom;\n if (f.borderLeft !== null) out[\"borderLeft\"] = f.borderLeft;\n if (f.currency !== null) out[\"currency\"] = f.currency;\n return out;\n}\n\nfunction commentToObject(c: CellComment): Record<string, unknown> {\n const out: Record<string, unknown> = { text: c.text };\n if (c.author !== null) out[\"author\"] = c.author;\n if (c.color !== null) out[\"color\"] = c.color;\n return out;\n}\n","/**\n * Tiny isomorphic XML parser — enough to read OOXML and OpenDocument parts\n * (replacing PHP's SimpleXML). Namespace prefixes are stripped so nodes and\n * attributes are queried by local name, matching how the PHP reader accesses\n * SimpleXML.\n *\n * `parseXml(src, { namespaces: true })` additionally resolves namespaces and\n * keeps mixed content in order, which OpenDocument needs and OOXML does not:\n *\n * - `ns` on every element, the namespace URI its prefix is bound to;\n * - `nsAttrs`, attributes keyed `{uri}local` (plain `local` when unprefixed),\n * because ODS puts `office:value-type` and `calcext:value-type` on the same\n * cell and local names alone collide;\n * - `content`, text runs and child elements in document order, because a\n * paragraph's meaning depends on where its `text:s` falls between the text.\n *\n * Attribute values in that mode get XML attribute-value normalisation (a\n * literal tab, CR or LF is a space), as libxml and expat apply it. Without the\n * option nothing changes, so the xlsx path parses exactly as it always has.\n */\n\nexport interface XmlNode {\n name: string;\n attrs: Record<string, string>;\n children: XmlNode[];\n text: string;\n /** Namespace URI. Only with `{ namespaces: true }`. */\n ns?: string;\n /** Attributes keyed `{uri}local`, or `local` when unprefixed. Only with `{ namespaces: true }`. */\n nsAttrs?: Record<string, string>;\n /** Text runs and child elements in document order. Only with `{ namespaces: true }`. */\n content?: Array<XmlNode | string>;\n}\n\nexport interface ParseXmlOptions {\n namespaces?: boolean;\n}\n\nconst XML_NS = \"http://www.w3.org/XML/1998/namespace\";\n\nfunction localName(name: string): string {\n const idx = name.indexOf(\":\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\n\nfunction unescapeXml(s: string): string {\n if (s.indexOf(\"&\") < 0) return s;\n return s.replace(/&(#x?[0-9a-fA-F]+|\\w+);/g, (m, ent: string) => {\n switch (ent) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return '\"';\n case \"apos\":\n return \"'\";\n default:\n if (ent[0] === \"#\") {\n const code = ent[1] === \"x\" || ent[1] === \"X\" ? parseInt(ent.slice(2), 16) : parseInt(ent.slice(1), 10);\n return Number.isFinite(code) ? String.fromCodePoint(code) : m;\n }\n return m;\n }\n });\n}\n\nfunction findTagEnd(src: string, from: number): number {\n let quote = \"\";\n for (let i = from; i < src.length; i++) {\n const ch = src[i]!;\n if (quote) {\n if (ch === quote) quote = \"\";\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (ch === \">\") {\n return i;\n }\n }\n return src.length;\n}\n\nconst ATTR_RE = /([^\\s=/]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n\ninterface RawTag {\n name: string;\n attrs: Record<string, string>;\n raw: Array<[string, string]>;\n}\n\nfunction parseTag(inner: string): RawTag {\n const trimmed = inner.trim();\n let i = 0;\n while (i < trimmed.length && !/\\s/.test(trimmed[i]!)) i++;\n const name = trimmed.slice(0, i);\n const attrs: Record<string, string> = {};\n const raw: Array<[string, string]> = [];\n const rest = trimmed.slice(i);\n for (const m of rest.matchAll(ATTR_RE)) {\n const rawValue = m[3] ?? m[4] ?? \"\";\n attrs[localName(m[1]!)] = unescapeXml(rawValue);\n raw.push([m[1]!, rawValue]);\n }\n return { name, attrs, raw };\n}\n\nexport function parseXml(src: string, options: ParseXmlOptions = {}): XmlNode | null {\n const namespaces = options.namespaces === true;\n let i = 0;\n const n = src.length;\n const root: XmlNode = { name: \"#root\", attrs: {}, children: [], text: \"\" };\n if (namespaces) root.content = [];\n const stack: XmlNode[] = [root];\n const scopes: Array<Record<string, string>> = [{ xml: XML_NS }];\n\n const appendText = (text: string): void => {\n const top = stack[stack.length - 1]!;\n top.text += text;\n if (namespaces && text !== \"\") top.content!.push(text);\n };\n\n while (i < n) {\n if (src[i] === \"<\") {\n if (src.startsWith(\"<!--\", i)) {\n const end = src.indexOf(\"-->\", i);\n i = end < 0 ? n : end + 3;\n continue;\n }\n if (src.startsWith(\"<![CDATA[\", i)) {\n const end = src.indexOf(\"]]>\", i);\n appendText(src.slice(i + 9, end < 0 ? n : end));\n i = end < 0 ? n : end + 3;\n continue;\n }\n if (src.startsWith(\"<?\", i)) {\n const end = src.indexOf(\"?>\", i);\n i = end < 0 ? n : end + 2;\n continue;\n }\n if (src.startsWith(\"<!\", i)) {\n const end = src.indexOf(\">\", i);\n i = end < 0 ? n : end + 1;\n continue;\n }\n if (src[i + 1] === \"/\") {\n const end = src.indexOf(\">\", i);\n if (stack.length > 1) {\n stack.pop();\n if (namespaces) scopes.pop();\n }\n i = end < 0 ? n : end + 1;\n continue;\n }\n const end = findTagEnd(src, i + 1);\n const tagContent = src.slice(i + 1, end);\n const selfClosing = tagContent.endsWith(\"/\");\n const { name, attrs, raw } = parseTag(selfClosing ? tagContent.slice(0, -1) : tagContent);\n const node: XmlNode = { name: localName(name), attrs, children: [], text: \"\" };\n const parent = stack[stack.length - 1]!;\n parent.children.push(node);\n\n let scope: Record<string, string> | undefined;\n if (namespaces) {\n scope = resolveNamespaces(node, name, raw, scopes[scopes.length - 1]!);\n parent.content!.push(node);\n }\n if (!selfClosing) {\n stack.push(node);\n if (scope) scopes.push(scope);\n }\n i = end + 1;\n } else {\n const next = src.indexOf(\"<\", i);\n const stop = next < 0 ? n : next;\n appendText(unescapeXml(src.slice(i, stop)));\n i = stop;\n }\n }\n\n return root.children[0] ?? null;\n}\n\nfunction resolveNamespaces(\n node: XmlNode,\n qname: string,\n raw: Array<[string, string]>,\n parentScope: Record<string, string>,\n): Record<string, string> {\n let scope = parentScope;\n for (const [key, value] of raw) {\n if (key === \"xmlns\" || key.startsWith(\"xmlns:\")) {\n if (scope === parentScope) scope = { ...parentScope };\n scope[key === \"xmlns\" ? \"\" : key.slice(6)] = unescapeXml(value);\n }\n }\n\n const colon = qname.indexOf(\":\");\n node.ns = scope[colon >= 0 ? qname.slice(0, colon) : \"\"] ?? \"\";\n node.content = [];\n\n const nsAttrs: Record<string, string> = {};\n for (const [key, value] of raw) {\n if (key === \"xmlns\" || key.startsWith(\"xmlns:\")) continue;\n const idx = key.indexOf(\":\");\n const normalised = unescapeXml(value.replace(/[\\t\\n\\r]/g, \" \"));\n if (idx < 0) {\n nsAttrs[key] = normalised;\n } else {\n nsAttrs[`{${scope[key.slice(0, idx)] ?? \"\"}}${key.slice(idx + 1)}`] = normalised;\n }\n }\n node.nsAttrs = nsAttrs;\n\n return scope;\n}\n\n/** First child element with the given local name. */\nexport function el(node: XmlNode | null | undefined, name: string): XmlNode | undefined {\n return node?.children.find((c) => c.name === name);\n}\n\n/** All child elements with the given local name. */\nexport function els(node: XmlNode | null | undefined, name: string): XmlNode[] {\n return node ? node.children.filter((c) => c.name === name) : [];\n}\n\n/** Attribute by local name, or undefined. */\nexport function at(node: XmlNode | null | undefined, name: string): string | undefined {\n return node?.attrs[name];\n}\n","import { unzipSync } from \"../zip\";\nimport { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport { CellComment } from \"../workbook/cell-comment\";\nimport { MergedRegion } from \"../workbook/merged-region\";\nimport { Sheet } from \"../workbook/sheet\";\nimport { Workbook } from \"../workbook/workbook\";\nimport type { CellPrimitive } from \"../schema/types\";\nimport { NS, asciiLower, attr, child, phpInt, phpIsNumeric, phpTrim } from \"./ods/ns\";\nimport { odsFormulaToA1 } from \"./ods/ods-formula\";\nimport { OdsStyles } from \"./ods/ods-styles\";\nimport { paragraphs } from \"./ods/ods-text\";\nimport { WorkbookSchema } from \"./workbook-schema\";\nimport { parseXml, type XmlNode } from \"./xml\";\n\n/** Sheet bounds. A repeat past them is padding, and is not followed. */\nconst MAX_ROWS = 1048576;\nconst MAX_COLUMNS = 16384;\n\n/** Days from the spreadsheet epoch (1899-12-30) to the Unix epoch. */\nconst UNIX_EPOCH_SERIAL = 25569;\n\nconst decoder = new TextDecoder();\n\ntype ColumnStyle = [first: number, last: number, style: string];\n\ninterface ReadCell {\n value: CellPrimitive;\n formula: string | null;\n cached: CellPrimitive;\n type: string | null;\n currency: string | null;\n dateHasTime: boolean;\n comment: CellComment | null;\n /** A date or time value as Unix seconds (UTC), until the format decides date or datetime. */\n seconds: number | null;\n}\n\ninterface SheetState {\n row: number;\n cells: Map<string, Cell>;\n merges: MergedRegion[];\n}\n\n/**\n * OpenDocument Spreadsheet (.ods) reader — bytes → Holy Sheet schema, the same\n * schema the xlsx reader returns. Mirrors PHP `Reader\\OdsReader`, where what is\n * and is not mapped is documented.\n */\nexport class OdsReader {\n describe(bytes: Uint8Array): Record<string, unknown> {\n return WorkbookSchema.fromWorkbook(this.readWorkbook(bytes));\n }\n\n readWorkbook(bytes: Uint8Array): Workbook {\n return this.readFiles(unzipSync(bytes));\n }\n\n /** Read an already-unzipped package (name -> bytes). */\n readFiles(files: Record<string, Uint8Array>): Workbook {\n const getText = (name: string): string | null => (files[name] ? decoder.decode(files[name]) : null);\n\n const content = getText(\"content.xml\");\n if (content === null) throw new Error(\"[holy-sheet] missing content.xml\");\n const contentDoc = parseXml(content, { namespaces: true });\n if (!contentDoc) throw new Error(\"[holy-sheet] failed to parse content.xml\");\n const stylesText = getText(\"styles.xml\");\n const stylesDoc = stylesText === null ? null : parseXml(stylesText, { namespaces: true });\n\n const styles = new OdsStyles(contentDoc, stylesDoc);\n\n const sheets: Sheet[] = [];\n const spreadsheet = child(child(contentDoc, NS.OFFICE, \"body\"), NS.OFFICE, \"spreadsheet\");\n for (const table of spreadsheet?.children ?? []) {\n if (table.ns === NS.TABLE && table.name === \"table\") sheets.push(this.readSheet(table, styles));\n }\n\n const meta = getText(\"meta.xml\");\n return new Workbook(sheets, meta === null ? {} : readMeta(meta));\n }\n\n private readSheet(table: XmlNode, styles: OdsStyles): Sheet {\n const columns: ColumnStyle[] = [];\n collectColumns(table, columns, { next: 0 });\n\n const state: SheetState = { row: 0, cells: new Map(), merges: [] };\n this.walkRows(table, styles, columns, state);\n\n return new Sheet(attr(table, NS.TABLE, \"name\") ?? \"\", state.cells, state.merges);\n }\n\n private walkRows(container: XmlNode, styles: OdsStyles, columns: ColumnStyle[], state: SheetState): void {\n for (const el of container.children) {\n if (state.row >= MAX_ROWS) return;\n if (el.ns !== NS.TABLE) continue;\n\n if (el.name === \"table-row\") {\n this.readRow(el, styles, columns, state);\n } else if (el.name === \"table-header-rows\" || el.name === \"table-rows\" || el.name === \"table-row-group\") {\n this.walkRows(el, styles, columns, state);\n }\n }\n }\n\n private readRow(row: XmlNode, styles: OdsStyles, columns: ColumnStyle[], state: SheetState): void {\n const repeat = Math.max(1, phpInt(attr(row, NS.TABLE, \"number-rows-repeated\") ?? \"1\"));\n const rowStyle = attr(row, NS.TABLE, \"default-cell-style-name\") ?? \"\";\n\n // One pass over the cells, reading each one that holds anything ONCE,\n // however many columns and rows it repeats across.\n const entries: Array<[number, ReadCell | null, [number, number], string]> = [];\n let column = 0;\n for (const cell of row.children) {\n if (cell.ns !== NS.TABLE || (cell.name !== \"table-cell\" && cell.name !== \"covered-table-cell\")) continue;\n\n const span: [number, number] =\n cell.name === \"table-cell\"\n ? [\n Math.max(1, phpInt(attr(cell, NS.TABLE, \"number-columns-spanned\") ?? \"1\")),\n Math.max(1, phpInt(attr(cell, NS.TABLE, \"number-rows-spanned\") ?? \"1\")),\n ]\n : [1, 1];\n const read = hasContent(cell) ? readCell(cell) : null;\n\n const count = Math.max(1, phpInt(attr(cell, NS.TABLE, \"number-columns-repeated\") ?? \"1\"));\n if (read !== null || span[0] !== 1 || span[1] !== 1) {\n const style = attr(cell, NS.TABLE, \"style-name\") ?? \"\";\n for (let i = 0; i < count && column + i < MAX_COLUMNS; i++) {\n entries.push([column + i, read, span, style]);\n }\n }\n\n column += count;\n if (column >= MAX_COLUMNS) break;\n }\n\n if (entries.length === 0) {\n state.row += repeat;\n return;\n }\n\n for (let r = 0; r < repeat && state.row < MAX_ROWS; r++) {\n const rowNumber = state.row + 1;\n for (const [col, read, span, style] of entries) {\n const address = CellAddress.letter(col) + rowNumber;\n\n if (span[0] !== 1 || span[1] !== 1) {\n state.merges.push(\n new MergedRegion(\n address,\n CellAddress.letter(Math.min(col + span[0], MAX_COLUMNS) - 1) + Math.min(rowNumber + span[1] - 1, MAX_ROWS),\n ),\n );\n }\n if (read === null) continue;\n\n const styleName = style !== \"\" ? style : rowStyle !== \"\" ? rowStyle : columnStyle(columns, col);\n const format = styles.cellFormat(styleName, read.type, read.currency, read.dateHasTime);\n let value = read.value;\n if (read.seconds !== null) {\n // A date or time value always has a date or datetime format by now.\n value = isoFromSeconds(read.seconds, format?.displayFormat !== \"date\");\n }\n state.cells.set(address, new Cell(address, value, read.formula, format, read.comment, read.cached));\n }\n state.row++;\n }\n }\n}\n\n/** Column default cell styles as [first index, last index, style name]. */\nfunction collectColumns(container: XmlNode, columns: ColumnStyle[], cursor: { next: number }): void {\n for (const el of container.children) {\n if (el.ns === NS.TABLE && el.name === \"table-column\") {\n const repeat = Math.max(1, phpInt(attr(el, NS.TABLE, \"number-columns-repeated\") ?? \"1\"));\n const style = attr(el, NS.TABLE, \"default-cell-style-name\") ?? \"\";\n if (style !== \"\") columns.push([cursor.next, cursor.next + repeat - 1, style]);\n cursor.next += repeat;\n } else if (\n el.ns === NS.TABLE &&\n (el.name === \"table-columns\" || el.name === \"table-header-columns\" || el.name === \"table-column-group\")\n ) {\n collectColumns(el, columns, cursor);\n }\n if (cursor.next >= MAX_COLUMNS) return;\n }\n}\n\nfunction columnStyle(columns: ColumnStyle[], column: number): string {\n for (const [first, last, style] of columns) {\n if (column >= first && column <= last) return style;\n }\n return \"Default\";\n}\n\n/**\n * A cell holds something when it has a value type, a formula, a comment, or\n * text. A cell with only a style is formatting over nothing, as in xlsx.\n */\nfunction hasContent(cell: XmlNode): boolean {\n if (attr(cell, NS.OFFICE, \"value-type\") !== undefined) return true;\n if (attr(cell, NS.TABLE, \"formula\") !== undefined) return true;\n if (child(cell, NS.OFFICE, \"annotation\") !== undefined) return true;\n return (paragraphs(cell) ?? \"\") !== \"\";\n}\n\n/** Everything about a cell that does not depend on where it is. */\nfunction readCell(cell: XmlNode): ReadCell {\n const type = attr(cell, NS.OFFICE, \"value-type\") ?? null;\n const text = paragraphs(cell);\n\n let value: CellPrimitive = null;\n let seconds: number | null = null;\n let dateHasTime = false;\n switch (type) {\n case \"float\":\n case \"percentage\":\n case \"currency\":\n value = toNumber(attr(cell, NS.OFFICE, \"value\") ?? \"\");\n break;\n case \"boolean\": {\n const b = asciiLower(phpTrim(attr(cell, NS.OFFICE, \"boolean-value\") ?? \"\"));\n value = b === \"true\" || b === \"1\";\n break;\n }\n case \"date\": {\n const raw = phpTrim(attr(cell, NS.OFFICE, \"date-value\") ?? \"\");\n seconds = dateSeconds(raw);\n dateHasTime = raw.includes(\"T\");\n break;\n }\n case \"time\": {\n const duration = durationSeconds(attr(cell, NS.OFFICE, \"time-value\") ?? \"\");\n seconds = duration === null ? null : duration - UNIX_EPOCH_SERIAL * 86400;\n break;\n }\n case \"string\": {\n const error = attr(cell, NS.CALCEXT, \"value-type\") === \"error\";\n const stored = attr(cell, NS.OFFICE, \"string-value\");\n value = stored !== undefined && !error ? stored : (text ?? \"\");\n break;\n }\n default:\n value = text !== null && text !== \"\" ? text : null;\n }\n\n let formula: string | null = null;\n let cached: CellPrimitive = null;\n const formulaAttr = attr(cell, NS.TABLE, \"formula\");\n if (formulaAttr !== undefined) {\n const translated = odsFormulaToA1(formulaAttr);\n const literalBoolean = type === \"boolean\" && /^[ \\t\\n\\r\\f\\v]*(TRUE|FALSE)\\(\\)[ \\t\\n\\r\\f\\v]*$/i.test(translated);\n if (!literalBoolean) {\n formula = translated;\n cached = seconds !== null ? serial(seconds) : value;\n value = null;\n seconds = null;\n }\n }\n\n let comment: CellComment | null = null;\n const annotation = child(cell, NS.OFFICE, \"annotation\");\n if (annotation) {\n const creator = child(annotation, NS.DC, \"creator\");\n const author = creator ? phpTrim(creator.text) : \"\";\n comment = new CellComment(paragraphs(annotation) ?? \"\", author === \"\" ? null : author);\n }\n\n const currency = attr(cell, NS.OFFICE, \"currency\");\n return {\n value,\n formula,\n cached,\n type,\n currency: currency !== undefined ? phpTrim(currency) : null,\n dateHasTime,\n comment,\n seconds,\n };\n}\n\n/** `office:value` as the xlsx reader coerces `<v>`. */\nfunction toNumber(raw: string): number | null {\n const s = phpTrim(raw);\n if (s === \"\") return null;\n if (/^-?\\d+$/.test(s)) return parseInt(s, 10);\n return phpIsNumeric(s) ? Number(s) : null;\n}\n\n/** `office:date-value` -> whole seconds since the Unix epoch, in UTC. */\nfunction dateSeconds(raw: string): number | null {\n const m = /^(-?\\d{4,})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(\\.\\d+)?)?)?(Z|[+-]\\d{2}:?\\d{2})?$/.exec(raw);\n if (!m) return null;\n\n const days = daysFromCivil(parseInt(m[1]!, 10), parseInt(m[2]!, 10), parseInt(m[3]!, 10));\n let seconds = days * 86400 + phpInt(m[4] ?? \"0\") * 3600 + phpInt(m[5] ?? \"0\") * 60 + phpInt(m[6] ?? \"0\");\n const fraction = m[7] !== undefined && m[7] !== \"\" ? Number(\"0\" + m[7]) : 0;\n\n const zone = m[8] ?? \"\";\n if (zone !== \"\" && zone !== \"Z\") {\n const digits = zone.slice(1).replace(\":\", \"\");\n const offset = phpInt(digits.slice(0, 2)) * 3600 + phpInt(digits.slice(2, 4)) * 60;\n seconds -= zone[0] === \"-\" ? -offset : offset;\n }\n\n return seconds + Math.round(fraction);\n}\n\n/** `office:time-value` (`PT10H30M00S`, `P1DT2H`, `-PT1H`) -> whole seconds. */\nfunction durationSeconds(raw: string): number | null {\n const m = /^(-)?P(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/.exec(phpTrim(raw));\n if (!m) return null;\n\n const total =\n phpInt(m[2] ?? \"0\") * 86400 + phpInt(m[3] ?? \"0\") * 3600 + phpInt(m[4] ?? \"0\") * 60 + (m[5] ? Number(m[5]) : 0);\n const seconds = Math.round(total);\n return m[1] === \"-\" ? -seconds : seconds;\n}\n\n/** Days since 1970-01-01 in the proleptic Gregorian calendar (Hinnant's algorithm). */\nfunction daysFromCivil(year: number, month: number, day: number): number {\n year -= month <= 2 ? 1 : 0;\n const era = Math.trunc((year >= 0 ? year : year - 399) / 400);\n const yoe = year - era * 400;\n const doy = Math.trunc((153 * (month + (month > 2 ? -3 : 9)) + 2) / 5) + day - 1;\n const doe = yoe * 365 + Math.trunc(yoe / 4) - Math.trunc(yoe / 100) + doy;\n return era * 146097 + doe - 719468;\n}\n\n/** Unix seconds -> spreadsheet serial. */\nfunction serial(seconds: number): number {\n return (seconds + UNIX_EPOCH_SERIAL * 86400) / 86400;\n}\n\n/** PHP `gmdate('Y-m-d')` / `gmdate('Y-m-d\\TH:i:s\\Z')`. */\nfunction isoFromSeconds(seconds: number, withTime: boolean): string {\n const d = new Date(seconds * 1000);\n const pad = (n: number, width = 2): string => String(n).padStart(width, \"0\");\n const date = `${pad(d.getUTCFullYear(), 4)}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;\n if (!withTime) return date;\n return `${date}T${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}Z`;\n}\n\nfunction readMeta(xml: string): Record<string, string> {\n const doc = parseXml(xml, { namespaces: true });\n const meta = child(doc, NS.OFFICE, \"meta\");\n if (!meta) return {};\n\n const out: Record<string, string> = {};\n const creator = child(meta, NS.META, \"initial-creator\") ?? child(meta, NS.DC, \"creator\");\n if (creator && phpTrim(creator.text) !== \"\") out[\"creator\"] = phpTrim(creator.text);\n const created = child(meta, NS.META, \"creation-date\");\n if (created && phpTrim(created.text) !== \"\") {\n const value = phpTrim(created.text);\n // ODF dates carry no zone unless one is written; the schema's are UTC.\n out[\"created\"] = /(Z|[+-]\\d{2}:?\\d{2})$/.test(value) ? value : value + \"Z\";\n }\n return out;\n}\n","import { CellComment } from \"../workbook/cell-comment\";\nimport { el, els, parseXml, type XmlNode } from \"./xml\";\n\n/** Parses xl/commentsN.xml → address → CellComment. Mirrors PHP `CommentsParser`. */\nexport const CommentsParser = {\n parse(commentsXml: string): Record<string, CellComment> {\n const xml = parseXml(commentsXml);\n if (!xml) return {};\n\n const authors: string[] = els(el(xml, \"authors\"), \"author\").map((a) => a.text);\n\n const out: Record<string, CellComment> = {};\n for (const c of els(el(xml, \"commentList\"), \"comment\")) {\n const ref = c.attrs[\"ref\"] ?? \"\";\n const authorIdx = c.attrs[\"authorId\"] !== undefined ? parseInt(c.attrs[\"authorId\"], 10) : -1;\n const author = authors[authorIdx] ?? null;\n out[ref] = new CellComment(extractText(el(c, \"text\")), author);\n }\n return out;\n },\n};\n\nfunction extractText(textNode: XmlNode | undefined): string {\n if (!textNode) return \"\";\n const parts: string[] = [];\n for (const r of els(textNode, \"r\")) parts.push(el(r, \"t\")?.text ?? \"\");\n for (const t of els(textNode, \"t\")) parts.push(t.text);\n return parts.join(\"\");\n}\n","import { els, parseXml } from \"./xml\";\n\nexport interface Rel {\n Target: string;\n Type: string;\n}\n\n/** Parses OOXML *.rels files → rId → {Target, Type}. Mirrors PHP `RelsParser`. */\nexport const RelsParser = {\n parse(relsXml: string): Record<string, Rel> {\n const xml = parseXml(relsXml);\n if (!xml) return {};\n const rels: Record<string, Rel> = {};\n for (const rel of els(xml, \"Relationship\")) {\n const id = rel.attrs[\"Id\"] ?? \"\";\n rels[id] = { Target: rel.attrs[\"Target\"] ?? \"\", Type: rel.attrs[\"Type\"] ?? \"\" };\n }\n return rels;\n },\n\n byType(rels: Record<string, Rel>, typeUriContains: string): Record<string, Rel> {\n const out: Record<string, Rel> = {};\n for (const [id, rel] of Object.entries(rels)) {\n if (rel.Type.includes(typeUriContains)) out[id] = rel;\n }\n return out;\n },\n};\n","import { el, els, parseXml, type XmlNode } from \"./xml\";\n\n/** Parses xl/sharedStrings.xml → string[] by index. Mirrors PHP `SharedStringsParser`. */\nexport const SharedStringsParser = {\n parse(xml: string): string[] {\n const doc = parseXml(xml);\n if (!doc) return [];\n return els(doc, \"si\").map(renderSi);\n },\n};\n\nfunction renderSi(si: XmlNode): string {\n const t = el(si, \"t\");\n if (t) return t.text;\n return els(si, \"r\")\n .map((run) => el(run, \"t\")?.text ?? \"\")\n .join(\"\");\n}\n","import { CellFormat } from \"../workbook/cell-format\";\nimport { NumFmtParser, type NumFmtParsed } from \"./format/num-fmt-parser\";\nimport { at, el, els, parseXml, type XmlNode } from \"./xml\";\n\ninterface FontRec {\n bold: boolean;\n italic: boolean;\n size: number;\n color: string | null;\n}\ninterface BorderRec {\n top: string | null;\n right: string | null;\n bottom: string | null;\n left: string | null;\n}\n\n/** Parses xl/styles.xml → (CellFormat | null)[] by xf id. Mirrors PHP `StylesParser`. */\nexport const StylesParser = {\n parse(stylesXml: string): (CellFormat | null)[] {\n const xml = parseXml(stylesXml);\n if (!xml) return [];\n\n const numFmts = parseNumFmts(xml);\n const fonts = parseFonts(xml);\n const fills = parseFills(xml);\n const borders = parseBorders(xml);\n\n const xfs: (CellFormat | null)[] = [];\n for (const xf of els(el(xml, \"cellXfs\"), \"xf\")) {\n const fontId = xf.attrs[\"fontId\"] !== undefined ? parseInt(xf.attrs[\"fontId\"], 10) : 0;\n const fillId = xf.attrs[\"fillId\"] !== undefined ? parseInt(xf.attrs[\"fillId\"], 10) : 0;\n const borderId = xf.attrs[\"borderId\"] !== undefined ? parseInt(xf.attrs[\"borderId\"], 10) : 0;\n const numFmtId = xf.attrs[\"numFmtId\"] !== undefined ? parseInt(xf.attrs[\"numFmtId\"], 10) : 0;\n\n const alignment = el(xf, \"alignment\");\n const align = alignment && alignment.attrs[\"horizontal\"] !== undefined ? alignment.attrs[\"horizontal\"] : null;\n\n const font = fonts[fontId] ?? null;\n const fill = fills[fillId] ?? null;\n const border = borders[borderId] ?? null;\n const customCode = numFmts[numFmtId];\n const numFmtParsed =\n customCode !== undefined ? NumFmtParser.parse(customCode) : NumFmtParser.parseBuiltin(numFmtId);\n\n if (xfs.length === 0 && font === null && fill === null && border === null && !numFmtParsed && align === null) {\n xfs.push(null);\n continue;\n }\n\n xfs.push(buildCellFormat(font, fill, border, numFmtParsed, align));\n }\n\n return xfs;\n },\n};\n\nfunction parseNumFmts(xml: XmlNode): Record<number, string> {\n const map: Record<number, string> = {};\n for (const nf of els(el(xml, \"numFmts\"), \"numFmt\")) {\n map[parseInt(nf.attrs[\"numFmtId\"] ?? \"0\", 10)] = nf.attrs[\"formatCode\"] ?? \"\";\n }\n return map;\n}\n\nfunction parseFonts(xml: XmlNode): FontRec[] {\n return els(el(xml, \"fonts\"), \"font\").map((f) => {\n const sz = el(f, \"sz\");\n const color = el(f, \"color\");\n return {\n bold: !!el(f, \"b\"),\n italic: !!el(f, \"i\"),\n size: sz ? Math.trunc(Number(at(sz, \"val\"))) : 11,\n color: color && at(color, \"rgb\") !== undefined ? argbToHex(at(color, \"rgb\")!) : null,\n };\n });\n}\n\nfunction parseFills(xml: XmlNode): (string | null)[] {\n return els(el(xml, \"fills\"), \"fill\").map((fill) => {\n const pf = el(fill, \"patternFill\");\n const pattern = pf ? (at(pf, \"patternType\") ?? \"\") : \"none\";\n if (pattern !== \"solid\") return null;\n const fg = el(pf, \"fgColor\");\n return fg && at(fg, \"rgb\") !== undefined ? argbToHex(at(fg, \"rgb\")!) : null;\n });\n}\n\nfunction parseBorders(xml: XmlNode): BorderRec[] {\n return els(el(xml, \"borders\"), \"border\").map((b) => {\n const rec: BorderRec = { top: null, right: null, bottom: null, left: null };\n for (const side of [\"top\", \"right\", \"bottom\", \"left\"] as const) {\n const sideEl = el(b, side);\n const color = el(sideEl, \"color\");\n if (sideEl && at(sideEl, \"style\") !== undefined && at(sideEl, \"style\") !== \"\" && color && at(color, \"rgb\") !== undefined) {\n rec[side] = argbToHex(at(color, \"rgb\")!);\n }\n }\n return rec;\n });\n}\n\nfunction buildCellFormat(\n font: FontRec | null,\n fill: string | null,\n border: BorderRec | null,\n numFmt: NumFmtParsed | null,\n align: string | null,\n): CellFormat {\n return new CellFormat({\n bold: font?.bold ?? false,\n italic: font?.italic ?? false,\n textAlign: align,\n displayFormat: numFmt?.displayFormat ?? null,\n decimals: numFmt?.decimals ?? null,\n color: font?.color ?? null,\n backgroundColor: fill,\n fontSize: font && font.size !== 11 ? font.size : null,\n borderTop: border?.top ?? null,\n borderRight: border?.right ?? null,\n borderBottom: border?.bottom ?? null,\n borderLeft: border?.left ?? null,\n currency: numFmt?.currency ?? null,\n });\n}\n\nfunction argbToHex(argb: string): string {\n const a = argb.toUpperCase();\n if (a.length === 8) return \"#\" + a.slice(2);\n if (a.length === 6) return \"#\" + a;\n return \"#000000\";\n}\n","import { Cell } from \"../workbook/cell\";\nimport type { CellComment } from \"../workbook/cell-comment\";\nimport type { CellFormat } from \"../workbook/cell-format\";\nimport type { CellPrimitive } from \"../schema/types\";\nimport { MergedRegion } from \"../workbook/merged-region\";\nimport { Sheet } from \"../workbook/sheet\";\nimport { at, el, els, parseXml, type XmlNode } from \"./xml\";\n\n/** Parses one xl/worksheets/sheetN.xml → Sheet. Mirrors PHP `WorksheetParser`. */\nexport const WorksheetParser = {\n parse(\n worksheetXml: string,\n name: string,\n stylesIndex: (CellFormat | null)[],\n comments: Record<string, CellComment> = {},\n sharedStrings: string[] = [],\n ): Sheet {\n const xml = parseXml(worksheetXml);\n if (!xml) return new Sheet(name);\n\n const cells = parseCells(xml, stylesIndex, comments, sharedStrings);\n const merges = parseMerges(xml);\n const columnWidths = parseColumnWidths(xml);\n const [frozenRows, frozenCols] = parseFrozen(xml);\n\n return new Sheet(name, cells, merges, columnWidths, frozenRows, frozenCols);\n },\n};\n\nfunction parseCells(\n xml: XmlNode,\n stylesIndex: (CellFormat | null)[],\n comments: Record<string, CellComment>,\n sharedStrings: string[],\n): Map<string, Cell> {\n const cells = new Map<string, Cell>();\n const sheetData = el(xml, \"sheetData\");\n if (!sheetData) return cells;\n\n for (const row of els(sheetData, \"row\")) {\n for (const c of els(row, \"c\")) {\n const address = c.attrs[\"r\"] ?? \"\";\n if (address === \"\") continue;\n\n const type = c.attrs[\"t\"] ?? \"n\";\n const styleIdx = c.attrs[\"s\"] !== undefined ? parseInt(c.attrs[\"s\"], 10) : 0;\n const format = stylesIndex[styleIdx] ?? null;\n\n let formula: string | null = null;\n let cachedValue: CellPrimitive = null;\n let value: CellPrimitive = null;\n\n const f = el(c, \"f\");\n const v = el(c, \"v\");\n if (f) {\n formula = f.text;\n cachedValue = v ? coerceValue(v.text, type) : null;\n } else if (type === \"inlineStr\" && el(c, \"is\") && el(el(c, \"is\"), \"t\")) {\n value = el(el(c, \"is\"), \"t\")!.text;\n } else if (type === \"s\" && v) {\n const idx = parseInt(v.text, 10);\n value = sharedStrings[idx] ?? \"\";\n } else if (v) {\n value = coerceValue(v.text, type);\n }\n\n const comment = comments[address] ?? null;\n cells.set(address, new Cell(address, value, formula, format, comment, cachedValue));\n }\n }\n return cells;\n}\n\nfunction coerceValue(raw: string, type: string): CellPrimitive {\n if (type === \"b\") return raw === \"1\" || raw === \"true\" || raw === \"TRUE\";\n if (type === \"str\") return raw;\n if (type === \"inlineStr\") return raw;\n if (raw === \"\") return null;\n if (/^-?\\d+$/.test(raw)) return parseInt(raw, 10);\n if (/^\\s*[+-]?(\\d+(\\.\\d+)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(raw)) return parseFloat(raw);\n return raw;\n}\n\nfunction parseMerges(xml: XmlNode): MergedRegion[] {\n const out: MergedRegion[] = [];\n for (const m of els(el(xml, \"mergeCells\"), \"mergeCell\")) {\n const ref = m.attrs[\"ref\"] ?? \"\";\n if (ref.includes(\":\")) {\n const [start, end] = ref.split(\":\", 2) as [string, string];\n out.push(new MergedRegion(start, end));\n }\n }\n return out;\n}\n\nfunction parseColumnWidths(xml: XmlNode): Map<number, number> {\n const out = new Map<number, number>();\n for (const col of els(el(xml, \"cols\"), \"col\")) {\n if (col.attrs[\"customWidth\"] === undefined) continue;\n const min = parseInt(col.attrs[\"min\"] ?? \"0\", 10);\n const max = parseInt(col.attrs[\"max\"] ?? \"0\", 10);\n const excelWidth = Number(col.attrs[\"width\"] ?? \"0\");\n const px = excelWidth * 7 + 5;\n for (let i = min; i <= max; i++) out.set(i - 1, Math.round(px));\n }\n return out;\n}\n\nfunction parseFrozen(xml: XmlNode): [number, number] {\n for (const view of els(el(xml, \"sheetViews\"), \"sheetView\")) {\n const pane = el(view, \"pane\");\n if (!pane) continue;\n const rows = at(pane, \"ySplit\") !== undefined ? parseInt(at(pane, \"ySplit\")!, 10) : 0;\n const cols = at(pane, \"xSplit\") !== undefined ? parseInt(at(pane, \"xSplit\")!, 10) : 0;\n return [rows, cols];\n }\n return [0, 0];\n}\n","import type { CellComment } from \"../workbook/cell-comment\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport { Workbook } from \"../workbook/workbook\";\nimport { unzipSync } from \"../zip\";\nimport { CommentsParser } from \"./comments-parser\";\nimport { RelsParser } from \"./rels-parser\";\nimport { SharedStringsParser } from \"./shared-strings-parser\";\nimport { StylesParser } from \"./styles-parser\";\nimport { WorkbookSchema } from \"./workbook-schema\";\nimport { WorksheetParser } from \"./worksheet-parser\";\nimport { at, el, els, parseXml } from \"./xml\";\n\nconst decoder = new TextDecoder();\n\n/** XLSX reader — bytes → Holy Sheet schema. Mirrors PHP `Reader\\XlsxReader`. */\nexport class XlsxReader {\n describe(bytes: Uint8Array): Record<string, unknown> {\n return WorkbookSchema.fromWorkbook(this.readWorkbook(bytes));\n }\n\n readWorkbook(bytes: Uint8Array): Workbook {\n return this.readFiles(unzipSync(bytes));\n }\n\n /** Read an already-unzipped package (name -> bytes), so a caller that sniffed it does not unzip twice. */\n readFiles(files: Record<string, Uint8Array>): Workbook {\n const getText = (name: string): string | null => (files[name] ? decoder.decode(files[name]) : null);\n\n const stylesXml = getText(\"xl/styles.xml\");\n const stylesIndex = stylesXml ? StylesParser.parse(stylesXml) : [];\n\n const sharedStringsXml = getText(\"xl/sharedStrings.xml\");\n const sharedStrings = sharedStringsXml ? SharedStringsParser.parse(sharedStringsXml) : [];\n\n const workbookXml = getText(\"xl/workbook.xml\");\n if (workbookXml === null) throw new Error(\"[holy-sheet] missing xl/workbook.xml\");\n\n const workbookRelsXml = getText(\"xl/_rels/workbook.xml.rels\");\n const workbookRels = workbookRelsXml ? RelsParser.parse(workbookRelsXml) : {};\n\n const workbookDoc = parseXml(workbookXml);\n if (!workbookDoc) throw new Error(\"[holy-sheet] failed to parse xl/workbook.xml\");\n\n const sheets: Sheet[] = [];\n let i = 0;\n for (const sheetEl of els(el(workbookDoc, \"sheets\"), \"sheet\")) {\n const name = at(sheetEl, \"name\") ?? \"\";\n const rId = at(sheetEl, \"id\") ?? \"\"; // r:id → local \"id\"\n const target = workbookRels[rId]?.Target;\n if (target == null) continue;\n\n const sheetPath = \"xl/\" + target.replace(/^\\//, \"\");\n const worksheetXml = getText(sheetPath);\n if (worksheetXml === null) continue;\n\n const sheetNum = i + 1;\n const sheetRelsXml = getText(`xl/worksheets/_rels/sheet${sheetNum}.xml.rels`);\n let comments: Record<string, CellComment> = {};\n if (sheetRelsXml) {\n const sheetRels = RelsParser.parse(sheetRelsXml);\n for (const cr of Object.values(RelsParser.byType(sheetRels, \"/comments\"))) {\n const commentsPath = resolveRelativePath(sheetPath, cr.Target);\n const commentsXml = getText(commentsPath);\n if (commentsXml) comments = { ...comments, ...CommentsParser.parse(commentsXml) };\n }\n }\n\n sheets.push(WorksheetParser.parse(worksheetXml, name, stylesIndex, comments, sharedStrings));\n i++;\n }\n\n const meta = this.parseDocProps(getText(\"docProps/core.xml\"));\n return new Workbook(sheets, meta);\n }\n\n private parseDocProps(coreXml: string | null): Record<string, unknown> {\n if (coreXml === null) return {};\n const core = parseXml(coreXml);\n if (!core) return {};\n const meta: Record<string, unknown> = {};\n const creator = el(core, \"creator\");\n if (creator) meta[\"creator\"] = creator.text;\n const created = el(core, \"created\");\n if (created) meta[\"created\"] = created.text;\n return meta;\n }\n}\n\nfunction resolveRelativePath(base: string, target: string): string {\n const baseDir = base.includes(\"/\") ? base.slice(0, base.lastIndexOf(\"/\")) : \".\";\n const combined = baseDir + \"/\" + target;\n const parts: string[] = [];\n for (const segment of combined.split(\"/\")) {\n if (segment === \"..\") parts.pop();\n else if (segment !== \"\" && segment !== \".\") parts.push(segment);\n }\n return parts.join(\"/\");\n}\n","/**\n * XML escaping, matching the PHP writer's `escape()`:\n * strips disallowed control characters, then escapes the 5 XML metacharacters\n * (`htmlspecialchars(..., ENT_XML1 | ENT_QUOTES)`).\n */\n\n// PHP: /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/u — control chars not permitted in XML 1.0.\nconst CONTROL_CHARS = new RegExp(\"[\\\\x00-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F]\", \"g\");\n\nexport function xmlEscape(s: string): string {\n return s\n .replace(CONTROL_CHARS, \"\")\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n","import type { CellFormat } from \"../../workbook/cell-format\";\n\n/**\n * Builds the Excel number-format code for a CellFormat. Returns null when no\n * numFmt is needed. Mirrors PHP `Writer\\Format\\NumFmtBuilder`.\n */\nexport const NumFmtBuilder = {\n build(format: CellFormat): string | null {\n const df = format.displayFormat;\n const decimals = format.decimals;\n\n if (df === null || df === \"auto\" || df === \"text\") return null;\n\n switch (df) {\n case \"number\":\n return numberFormat(decimals);\n case \"percentage\":\n return percentFormat(decimals);\n case \"currency\":\n return currencyFormat(format.currency, decimals);\n case \"date\":\n return \"yyyy-mm-dd\";\n case \"datetime\":\n return \"yyyy-mm-dd hh:mm:ss\";\n default:\n return null;\n }\n },\n};\n\nfunction numberFormat(decimals: number | null): string {\n if (decimals === null || decimals <= 0) return \"#,##0\";\n return \"#,##0.\" + \"0\".repeat(decimals);\n}\n\nfunction percentFormat(decimals: number | null): string {\n const d = decimals ?? 1;\n if (d <= 0) return \"0%\";\n return \"0.\" + \"0\".repeat(d) + \"%\";\n}\n\nfunction currencyFormat(currency: string | null, decimals: number | null): string {\n const symbol = currencySymbol(currency ?? \"USD\");\n const d = decimals ?? 2;\n const body = d <= 0 ? \"#,##0\" : \"#,##0.\" + \"0\".repeat(d);\n return `\"${symbol}\"${body};-\"${symbol}\"${body}`;\n}\n\nfunction currencySymbol(iso: string): string {\n switch (iso.toUpperCase()) {\n case \"USD\":\n return \"$\";\n case \"EUR\":\n return \"€\";\n case \"GBP\":\n return \"£\";\n case \"JPY\":\n return \"¥\";\n case \"CNY\":\n return \"¥\";\n case \"INR\":\n return \"₹\";\n case \"AUD\":\n return \"A$\";\n case \"CAD\":\n return \"C$\";\n case \"CHF\":\n return \"CHF\";\n case \"KRW\":\n return \"₩\";\n default:\n return iso + \" \";\n }\n}\n","import type { CellFormat } from \"../workbook/cell-format\";\nimport { xmlEscape } from \"../xml\";\nimport { NumFmtBuilder } from \"./format/num-fmt-builder\";\n\ninterface Xf {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n align: string | null;\n}\ninterface FontRec {\n size: number;\n name: string;\n color: string | null;\n bold: boolean;\n italic: boolean;\n}\ninterface BorderRec {\n top: string | null;\n right: string | null;\n bottom: string | null;\n left: string | null;\n}\n\n/**\n * Deduplicates fonts/fills/borders/numFmts and the cellXfs that combine them.\n * Mirrors PHP `Writer\\StylesRegistry` (style index 0 = the unformatted base).\n */\nexport class StylesRegistry {\n private xfIndex = new Map<string, number>([[\"__default__\", 0]]);\n private xfs: Xf[] = [{ fontId: 0, fillId: 0, borderId: 0, numFmtId: 0, align: null }];\n\n private fontIndex = new Map<string, number>([[\"__default__\", 0]]);\n private fonts: FontRec[] = [{ size: 11, name: \"Calibri\", color: null, bold: false, italic: false }];\n\n private fillIndex = new Map<string, number>([\n [\"__none__\", 0],\n [\"__gray125__\", 1],\n ]);\n private fills: ({ type: \"none\" } | { type: \"gray125\" } | { type: \"solid\"; fg: string })[] = [\n { type: \"none\" },\n { type: \"gray125\" },\n ];\n\n private borderIndex = new Map<string, number>([[\"__default__\", 0]]);\n private borders: BorderRec[] = [{ top: null, right: null, bottom: null, left: null }];\n\n private numFmtIndex = new Map<string, number>();\n private numFmts = new Map<number, string>();\n private nextNumFmtId = 164;\n\n register(format: CellFormat | null): number {\n if (format === null || format.isEmpty()) return 0;\n\n const key = format.key();\n const existing = this.xfIndex.get(key);\n if (existing !== undefined) return existing;\n\n const fontId = this.fontFor(format);\n const fillId = this.fillFor(format);\n const borderId = this.borderFor(format);\n const numFmtId = this.numFmtFor(format);\n\n this.xfs.push({ fontId, fillId, borderId, numFmtId, align: format.textAlign });\n const idx = this.xfs.length - 1;\n this.xfIndex.set(key, idx);\n return idx;\n }\n\n private fontFor(f: CellFormat): number {\n const rec: FontRec = {\n size: f.fontSize ?? 11,\n name: \"Calibri\",\n color: f.color,\n bold: f.bold,\n italic: f.italic,\n };\n const key = JSON.stringify(rec);\n const existing = this.fontIndex.get(key);\n if (existing !== undefined) return existing;\n this.fonts.push(rec);\n const idx = this.fonts.length - 1;\n this.fontIndex.set(key, idx);\n return idx;\n }\n\n private fillFor(f: CellFormat): number {\n if (f.backgroundColor === null) return 0;\n const key = f.backgroundColor.toUpperCase();\n const existing = this.fillIndex.get(key);\n if (existing !== undefined) return existing;\n this.fills.push({ type: \"solid\", fg: key });\n const idx = this.fills.length - 1;\n this.fillIndex.set(key, idx);\n return idx;\n }\n\n private borderFor(f: CellFormat): number {\n if (!f.borderTop && !f.borderRight && !f.borderBottom && !f.borderLeft) return 0;\n const rec: BorderRec = {\n top: f.borderTop,\n right: f.borderRight,\n bottom: f.borderBottom,\n left: f.borderLeft,\n };\n const key = JSON.stringify(rec);\n const existing = this.borderIndex.get(key);\n if (existing !== undefined) return existing;\n this.borders.push(rec);\n const idx = this.borders.length - 1;\n this.borderIndex.set(key, idx);\n return idx;\n }\n\n private numFmtFor(f: CellFormat): number {\n const code = NumFmtBuilder.build(f);\n if (code === null) return 0;\n const existing = this.numFmtIndex.get(code);\n if (existing !== undefined) return existing;\n const id = this.nextNumFmtId++;\n this.numFmts.set(id, code);\n this.numFmtIndex.set(code, id);\n return id;\n }\n\n toXml(): string {\n let numFmtsXml = \"\";\n if (this.numFmts.size > 0) {\n let records = \"\";\n for (const [id, code] of this.numFmts) {\n records += `<numFmt numFmtId=\"${id}\" formatCode=\"${xmlEscape(code)}\"/>`;\n }\n numFmtsXml = `<numFmts count=\"${this.numFmts.size}\">${records}</numFmts>`;\n }\n\n let fontsXml = `<fonts count=\"${this.fonts.length}\">`;\n for (const f of this.fonts) {\n fontsXml += \"<font>\";\n fontsXml += `<sz val=\"${Number(f.size)}\"/>`;\n if (f.bold) fontsXml += \"<b/>\";\n if (f.italic) fontsXml += \"<i/>\";\n if (f.color) fontsXml += `<color rgb=\"${hexToArgb(f.color)}\"/>`;\n fontsXml += `<name val=\"${xmlEscape(f.name)}\"/>`;\n fontsXml += \"</font>\";\n }\n fontsXml += \"</fonts>\";\n\n let fillsXml = `<fills count=\"${this.fills.length}\">`;\n for (const fill of this.fills) {\n if (fill.type === \"none\") {\n fillsXml += '<fill><patternFill patternType=\"none\"/></fill>';\n } else if (fill.type === \"gray125\") {\n fillsXml += '<fill><patternFill patternType=\"gray125\"/></fill>';\n } else {\n fillsXml += `<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${hexToArgb(fill.fg)}\"/></patternFill></fill>`;\n }\n }\n fillsXml += \"</fills>\";\n\n let bordersXml = `<borders count=\"${this.borders.length}\">`;\n for (const b of this.borders) {\n bordersXml += \"<border>\";\n for (const side of [\"left\", \"right\", \"top\", \"bottom\"] as const) {\n const color = b[side];\n if (!color) {\n bordersXml += `<${side}/>`;\n } else {\n bordersXml += `<${side} style=\"thin\"><color rgb=\"${hexToArgb(color)}\"/></${side}>`;\n }\n }\n bordersXml += \"<diagonal/></border>\";\n }\n bordersXml += \"</borders>\";\n\n let cellXfsXml = `<cellXfs count=\"${this.xfs.length}\">`;\n for (const xf of this.xfs) {\n let apply = \"\";\n if (xf.fontId > 0) apply += ' applyFont=\"1\"';\n if (xf.fillId > 0) apply += ' applyFill=\"1\"';\n if (xf.borderId > 0) apply += ' applyBorder=\"1\"';\n if (xf.numFmtId > 0) apply += ' applyNumberFormat=\"1\"';\n if (xf.align) apply += ' applyAlignment=\"1\"';\n cellXfsXml += `<xf numFmtId=\"${xf.numFmtId}\" fontId=\"${xf.fontId}\" fillId=\"${xf.fillId}\" borderId=\"${xf.borderId}\" xfId=\"0\"${apply}>`;\n if (xf.align) cellXfsXml += `<alignment horizontal=\"${xmlEscape(xf.align)}\"/>`;\n cellXfsXml += \"</xf>\";\n }\n cellXfsXml += \"</cellXfs>\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n numFmtsXml +\n fontsXml +\n fillsXml +\n bordersXml +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n cellXfsXml +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '<dxfs count=\"0\"/><tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>' +\n \"</styleSheet>\"\n );\n }\n}\n\n/** \"#RRGGBB\" → \"FFRRGGBB\" (Excel ARGB). */\nfunction hexToArgb(hex: string): string {\n const h = hex.replace(/^#/, \"\");\n if (h.length === 6) return \"FF\" + h.toUpperCase();\n if (h.length === 8) return h.toUpperCase();\n return \"FF000000\";\n}\n","import { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { xmlEscape } from \"../xml\";\nimport { formatFloat } from \"../util\";\nimport { zipSync, type ZipFile } from \"../zip\";\nimport { StylesRegistry } from \"./styles-registry\";\n\nconst encoder = new TextEncoder();\n\n/**\n * XLSX writer — emits a complete OOXML SpreadsheetML package as bytes.\n * Mirrors PHP `Writer\\XlsxWriter` (file I/O moved to the Agent for isomorphism).\n */\nexport class XlsxWriter {\n toBytes(workbook: Workbook): Uint8Array {\n const styles = new StylesRegistry();\n\n // Pre-render sheet xml so styles register before we serialize styles.xml.\n const sheetXmls: string[] = workbook.sheets.map((sheet) => this.sheetXml(sheet, styles));\n\n const sheetsWithComments: number[] = [];\n workbook.sheets.forEach((sheet, i) => {\n if (sheet.hasComments()) sheetsWithComments.push(i);\n });\n\n const files: ZipFile[] = [];\n const add = (name: string, xml: string): void => {\n files.push({ name, data: encoder.encode(xml) });\n };\n\n add(\"[Content_Types].xml\", this.contentTypesXml(workbook, sheetsWithComments));\n add(\"_rels/.rels\", this.rootRelsXml());\n add(\"xl/workbook.xml\", this.workbookXml(workbook));\n add(\"xl/_rels/workbook.xml.rels\", this.workbookRelsXml(workbook));\n add(\"xl/styles.xml\", styles.toXml());\n add(\"docProps/core.xml\", this.coreXml(workbook));\n add(\"docProps/app.xml\", this.appXml());\n\n workbook.sheets.forEach((sheet, i) => {\n const n = i + 1;\n add(`xl/worksheets/sheet${n}.xml`, sheetXmls[i]!);\n if (sheet.hasComments()) {\n add(`xl/worksheets/_rels/sheet${n}.xml.rels`, this.sheetRelsXml(n));\n add(`xl/comments${n}.xml`, this.commentsXml(sheet));\n add(`xl/drawings/vmlDrawing${n}.vml`, this.vmlDrawingXml(sheet));\n }\n });\n\n return zipSync(files);\n }\n\n private contentTypesXml(workbook: Workbook, sheetsWithComments: number[]): string {\n let overrides =\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>';\n\n workbook.sheets.forEach((_, i) => {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/worksheets/sheet${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n });\n\n for (const i of sheetsWithComments) {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/comments${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"/>`;\n }\n\n let defaults =\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>';\n if (sheetsWithComments.length > 0) {\n defaults += '<Default Extension=\"vml\" ContentType=\"application/vnd.openxmlformats-officedocument.vmlDrawing\"/>';\n }\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n defaults +\n overrides +\n \"</Types>\"\n );\n }\n\n private rootRelsXml(): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n '<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>' +\n \"</Relationships>\"\n );\n }\n\n private workbookXml(workbook: Workbook): string {\n let sheets = \"\";\n workbook.sheets.forEach((sheet, i) => {\n const name = this.escape(sheet.name);\n const sheetId = i + 1;\n const rId = \"rId\" + (i + 1);\n sheets += `<sheet name=\"${name}\" sheetId=\"${sheetId}\" r:id=\"${rId}\"/>`;\n });\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<sheets>${sheets}</sheets>` +\n \"</workbook>\"\n );\n }\n\n private workbookRelsXml(workbook: Workbook): string {\n let rels = \"\";\n workbook.sheets.forEach((_, i) => {\n const rId = \"rId\" + (i + 1);\n rels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${i + 1}.xml\"/>`;\n });\n rels += `<Relationship Id=\"rId${workbook.sheets.length + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n rels +\n \"</Relationships>\"\n );\n }\n\n private sheetRelsXml(sheetNum: number): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\" Target=\"../drawings/vmlDrawing${sheetNum}.vml\"/>` +\n `<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\" Target=\"../comments${sheetNum}.xml\"/>` +\n \"</Relationships>\"\n );\n }\n\n private sheetXml(sheet: Sheet, styles: StylesRegistry): string {\n let sheetViewsXml = \"\";\n if (sheet.frozenRows > 0 || sheet.frozenCols > 0) {\n const topLeft = CellAddress.letter(sheet.frozenCols) + (sheet.frozenRows + 1);\n const pane =\n \"<pane\" +\n (sheet.frozenCols > 0 ? ` xSplit=\"${sheet.frozenCols}\"` : \"\") +\n (sheet.frozenRows > 0 ? ` ySplit=\"${sheet.frozenRows}\"` : \"\") +\n ` topLeftCell=\"${topLeft}\" activePane=\"bottomRight\" state=\"frozen\"/>`;\n sheetViewsXml = `<sheetViews><sheetView workbookViewId=\"0\">${pane}</sheetView></sheetViews>`;\n }\n\n let colsXml = \"\";\n if (sheet.columnWidths.size > 0) {\n colsXml = \"<cols>\";\n for (const [colIdx, px] of sheet.columnWidths) {\n const excelWidth = Math.max(1.0, (px - 5) / 7);\n const colNum = colIdx + 1;\n colsXml += `<col min=\"${colNum}\" max=\"${colNum}\" width=\"${excelWidth.toFixed(4)}\" customWidth=\"1\"/>`;\n }\n colsXml += \"</cols>\";\n }\n\n let rowsXml = \"\";\n for (const [rowIndex, row] of sheet.rows()) {\n let cellsXml = \"\";\n const sortedCols = [...row.keys()].sort();\n for (const col of sortedCols) {\n cellsXml += this.cellXml(row.get(col)!, styles);\n }\n rowsXml += `<row r=\"${rowIndex}\">${cellsXml}</row>`;\n }\n\n let mergesXml = \"\";\n if (sheet.mergedRegions.length > 0) {\n mergesXml = `<mergeCells count=\"${sheet.mergedRegions.length}\">`;\n for (const merge of sheet.mergedRegions) mergesXml += `<mergeCell ref=\"${merge.ref()}\"/>`;\n mergesXml += \"</mergeCells>\";\n }\n\n const legacyDrawing = sheet.hasComments() ? '<legacyDrawing r:id=\"rId1\"/>' : \"\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n sheetViewsXml +\n colsXml +\n `<sheetData>${rowsXml}</sheetData>` +\n mergesXml +\n legacyDrawing +\n \"</worksheet>\"\n );\n }\n\n private cellXml(cell: Cell, styles: StylesRegistry): string {\n const ref = cell.address;\n const type = cell.excelType();\n const styleIdx = styles.register(cell.format);\n const sAttr = styleIdx > 0 ? ` s=\"${styleIdx}\"` : \"\";\n\n if (cell.formula !== null) {\n const f = this.escape(cell.formula.replace(/^=+/, \"\"));\n const cached = cell.cachedValue ?? cell.value;\n const v = cached !== null ? `<v>${this.escape(String(cached))}</v>` : \"\";\n return `<c r=\"${ref}\"${sAttr}><f>${f}</f>${v}</c>`;\n }\n\n if (type === \"inlineStr\") {\n const t = this.escape(String(cell.value));\n return `<c r=\"${ref}\"${sAttr} t=\"inlineStr\"><is><t xml:space=\"preserve\">${t}</t></is></c>`;\n }\n\n if (type === \"b\") {\n const v = cell.value === true ? \"1\" : \"0\";\n return `<c r=\"${ref}\"${sAttr} t=\"b\"><v>${v}</v></c>`;\n }\n\n if (cell.value === null) {\n return `<c r=\"${ref}\"${sAttr}/>`;\n }\n\n let v: string;\n if (typeof cell.value === \"number\") {\n // This mirrors PHP's `is_float($v) ? number_format(...) : (string) $v`,\n // but the mirror leaks: a PHP int never stringifies exponentially, while\n // in JS an INTEGER-VALUED double does above 1e21 — `String(1e21)` is\n // \"1e+21\" and `String(1e300)` is \"1e+300\". Both are integers by\n // `Number.isInteger`, so they took the String() branch and went into the\n // sheet as `<v>1e+21</v>`, which is not valid cell content.\n //\n // formatFloat handles that range exactly (via BigInt) and also maps\n // NaN/Infinity — neither of which is an integer — to 0.\n v =\n Number.isInteger(cell.value) && Math.abs(cell.value) < 1e21\n ? String(cell.value)\n : formatFloat(cell.value);\n } else {\n v = String(cell.value);\n }\n if (v === \"\") v = \"0\";\n return `<c r=\"${ref}\"${sAttr}><v>${v}</v></c>`;\n }\n\n private commentsXml(sheet: Sheet): string {\n const authors: string[] = [];\n let commentList = \"\";\n for (const entry of sheet.comments()) {\n const author = entry.comment.author ?? \"Author\";\n if (!authors.includes(author)) authors.push(author);\n const authorIdx = authors.indexOf(author);\n const text = this.escape(entry.comment.text);\n commentList +=\n `<comment ref=\"${entry.address}\" authorId=\"${authorIdx}\">` +\n `<text><r><t xml:space=\"preserve\">${text}</t></r></text>` +\n \"</comment>\";\n }\n let authorsXml = \"<authors>\";\n for (const a of authors) authorsXml += `<author>${this.escape(a)}</author>`;\n authorsXml += \"</authors>\";\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n authorsXml +\n `<commentList>${commentList}</commentList>` +\n \"</comments>\"\n );\n }\n\n private vmlDrawingXml(sheet: Sheet): string {\n let shapes = \"\";\n let shapeId = 1024;\n for (const entry of sheet.comments()) {\n const m = /^([A-Z]+)(\\d+)$/.exec(entry.address)!;\n const col = CellAddress.index(m[1]!);\n const row = parseInt(m[2]!, 10) - 1;\n shapeId++;\n shapes +=\n `<v:shape id=\"_x0000_s${shapeId}\" type=\"#_x0000_t202\" ` +\n 'style=\"position:absolute;margin-left:60pt;margin-top:5pt;width:108pt;height:60pt;z-index:1;visibility:hidden\" ' +\n 'fillcolor=\"#ffffe1\" o:insetmode=\"auto\">' +\n '<v:fill color2=\"#ffffe1\"/>' +\n '<v:shadow on=\"t\" color=\"black\" obscured=\"t\"/>' +\n '<v:path o:connecttype=\"none\"/>' +\n '<v:textbox><div style=\"text-align:left\"></div></v:textbox>' +\n '<x:ClientData ObjectType=\"Note\">' +\n \"<x:MoveWithCells/>\" +\n \"<x:SizeWithCells/>\" +\n `<x:Anchor>${col + 1}, 15, ${row}, 10, ${col + 3}, 31, ${row + 4}, 18</x:Anchor>` +\n \"<x:AutoFill>False</x:AutoFill>\" +\n `<x:Row>${row}</x:Row>` +\n `<x:Column>${col}</x:Column>` +\n \"</x:ClientData>\" +\n \"</v:shape>\";\n }\n return (\n '<xml xmlns:v=\"urn:schemas-microsoft-com:vml\" ' +\n 'xmlns:o=\"urn:schemas-microsoft-com:office:office\" ' +\n 'xmlns:x=\"urn:schemas-microsoft-com:office:excel\">' +\n '<o:shapelayout v:ext=\"edit\"><o:idmap v:ext=\"edit\" data=\"1\"/></o:shapelayout>' +\n '<v:shapetype id=\"_x0000_t202\" coordsize=\"21600,21600\" o:spt=\"202\" path=\"m,l,21600r21600,l21600,xe\">' +\n '<v:stroke joinstyle=\"miter\"/><v:path gradientshapeok=\"t\" o:connecttype=\"rect\"/></v:shapetype>' +\n shapes +\n \"</xml>\"\n );\n }\n\n private coreXml(workbook: Workbook): string {\n const now = (workbook.meta[\"created\"] as string | undefined) ?? gmDateZ();\n const creator = this.escape(String(workbook.meta[\"creator\"] ?? \"Holy Sheet\"));\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n `<dc:creator>${creator}</dc:creator>` +\n `<cp:lastModifiedBy>${creator}</cp:lastModifiedBy>` +\n `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>` +\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>` +\n \"</cp:coreProperties>\"\n );\n }\n\n private appXml(): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n \"<Application>Holy Sheet</Application>\" +\n \"<DocSecurity>0</DocSecurity>\" +\n \"<ScaleCrop>false</ScaleCrop>\" +\n \"<SharedDoc>false</SharedDoc>\" +\n \"<HyperlinksChanged>false</HyperlinksChanged>\" +\n \"<AppVersion>1.0</AppVersion>\" +\n \"</Properties>\"\n );\n }\n\n private escape(s: string): string {\n return xmlEscape(s);\n }\n}\n\n/** PHP gmdate('Y-m-d\\TH:i:s\\Z') — current UTC time, seconds precision. */\nfunction gmDateZ(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n","import { CellAddress } from \"../workbook/cell-address\";\n\n/**\n * The few PHP array and cast semantics the op reducer and diff depend on, in one\n * place so `sheet-reducer.ts` and `sheet-diff.ts` read like the PHP they mirror.\n *\n * PHP has one array type for lists and maps; a JSON object and a JSON array both\n * decode to it. `isArr` is PHP's `is_array` over parsed JSON: any object or array.\n * A key whose value is `undefined` is treated as absent, as JSON would.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Any = any;\nexport type Obj = Record<string, Any>;\n\n/** PHP `is_array`: a JSON object or a JSON array. */\nexport function isArr(value: unknown): value is Obj {\n return typeof value === \"object\" && value !== null;\n}\n\n/** PHP `array_key_exists` (a null value counts; `undefined` is absent). */\nexport function has(value: unknown, key: string): boolean {\n return isArr(value) && Object.prototype.hasOwnProperty.call(value, key) && value[key] !== undefined;\n}\n\n/** PHP `$value[$key] ?? null`. */\nexport function get(value: unknown, key: string): Any {\n return has(value, key) ? ((value as Obj)[key] ?? null) : null;\n}\n\n/** PHP `$value === []`: an empty array or an empty object. */\nexport function isEmptyArr(value: unknown): boolean {\n return isArr(value) && Object.keys(value).every((k) => value[k] === undefined);\n}\n\n/** PHP `array_values`. */\nexport function valuesOf(value: unknown): Any[] {\n if (Array.isArray(value)) return value.slice();\n if (isArr(value)) return Object.keys(value).filter((k) => value[k] !== undefined).map((k) => value[k]);\n return [];\n}\n\n/** `foreach ($value as $key => $item)`. */\nexport function entriesOf(value: unknown): [string, Any][] {\n if (Array.isArray(value)) return value.map((item, i) => [String(i), item]);\n if (isArr(value)) return Object.keys(value).filter((k) => value[k] !== undefined).map((k) => [k, value[k]]);\n return [];\n}\n\n/** PHP `(int)` cast. */\nexport function phpInt(value: unknown): number {\n if (value === null || value === undefined) return 0;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (typeof value === \"number\") return Number.isFinite(value) ? Math.trunc(value) || 0 : 0;\n if (typeof value === \"string\") {\n const m = /^[ \\t\\n\\r\\v\\f]*[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?/.exec(value);\n if (!m) return 0;\n const n = Number(m[0].trim());\n return Number.isFinite(n) ? Math.trunc(n) || 0 : 0;\n }\n if (isArr(value)) return isEmptyArr(value) ? 0 : 1;\n return 0;\n}\n\n/** PHP `(string)` cast. */\nexport function phpString(value: unknown): string {\n if (value === null || value === undefined || value === false) return \"\";\n if (value === true) return \"1\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (isArr(value)) return \"Array\";\n return String(value);\n}\n\n/** PHP `trim` with its default set: space, tab, LF, CR, NUL and vertical tab. Not `String#trim`, which strips NBSP and more. */\nexport function phpTrim(value: string): string {\n return value.replace(/^[ \\t\\n\\r\\x00\\x0B]+|[ \\t\\n\\r\\x00\\x0B]+$/g, \"\");\n}\n\n/**\n * PHP `SheetReducer::integer()`: an int, or a string of digits (`ctype_digit`);\n * anything else is null.\n *\n * One divergence cannot be removed: PHP decodes `2.0` as a float and refuses it,\n * but `JSON.parse` gives the number 2, which is accepted here. An integer past\n * PHP's int range is refused, as PHP would have decoded it as a float too.\n */\nexport function phpInteger(value: unknown): number | null {\n if (typeof value === \"number\") {\n return Number.isInteger(value) && Math.abs(value) <= 2 ** 63 ? value || 0 : null;\n }\n return typeof value === \"string\" && /^[0-9]+$/.test(value) ? phpInt(value) : null;\n}\n\n/**\n * Whether PHP reads `$key` of a `foreach` over `columnWidths` as a column index:\n * an int key (a canonical decimal string PHP stores as an int, `-1` included) or\n * a string of digits (`ctype_digit`, so `\"007\"`). `\"abc\"`, `\"1.5\"`, `\"\"` and\n * `\"-0\"` are not.\n */\nexport function isIndexKey(key: string): boolean {\n return /^[0-9]+$/.test(key) || (/^-[1-9][0-9]*$/.test(key) && BigInt(key) >= -(2n ** 63n));\n}\n\n/** PHP `strtoupper` (ASCII only since PHP 8.2, unlike `toUpperCase`). */\nexport function asciiUpper(value: string): string {\n return value.replace(/[a-z]+/g, (s) => s.toUpperCase());\n}\n\n/**\n * PHP `CellAddress::parse`: `[columnIndex, rowNumber]` or null. Written out\n * rather than reusing this port's `CellAddress.parse`, whose `trim` and\n * `toUpperCase` are Unicode-aware where PHP's are ASCII.\n */\nexport function parseAddress(address: string): [number, number] | null {\n const m = /^([A-Z]+)(\\d+)$/.exec(asciiUpper(phpTrim(address)));\n if (!m) return null;\n return [CellAddress.index(m[1]!), parseInt(m[2]!, 10)];\n}\n\nexport const letter = CellAddress.letter;\n","/**\n * JSON Schema for one sheet op — validate ops on the wire, or register the op\n * vocabulary as an LLM tool. Mirrors PHP `HolySheet\\Ops\\SheetOpSchema`, key for\n * key (pinned byte-for-byte against the PHP package by\n * `tests/sheet-ops-parity.test.ts`).\n *\n * `set_cell`, `set_range` and `set_workbook` are fancy-sheets' `SheetOp`\n * variants, same `type` and same fields, so a stored op stream can drive a live\n * `useSheetSync` session. One difference: `set_workbook.data` here is a Holy\n * Sheet schema, not fancy-sheets' `WorkbookData`.\n */\nexport const SheetOpSchema = {\n /** Every op type, in the order the variants are listed. */\n TYPES: [\n \"set_cell\",\n \"set_range\",\n \"set_workbook\",\n \"clear_cell\",\n \"insert_rows\",\n \"delete_rows\",\n \"insert_columns\",\n \"delete_columns\",\n \"add_sheet\",\n \"remove_sheet\",\n \"rename_sheet\",\n \"move_sheet\",\n \"replace_sheet\",\n \"set_merged_regions\",\n \"set_column_widths\",\n \"set_frozen\",\n \"set_meta\",\n ] as const,\n\n /** A fresh object on every call, so a caller editing it changes nothing here. */\n jsonSchema(): Record<string, unknown> {\n const address = () => ({ type: \"string\", pattern: \"^[A-Za-z]+[0-9]+$\" });\n const sheet = () => ({ type: \"string\", minLength: 1 });\n const count = () => ({ type: \"integer\", minimum: 1 });\n const position = () => ({ type: \"integer\", minimum: 1 });\n const object = () => ({ type: \"object\" });\n const nullableObject = () => ({ type: [\"object\", \"null\"] });\n const value = () => ({ type: [\"string\", \"number\", \"boolean\", \"null\"] });\n\n const variants = [\n variant(\n \"set_cell\",\n { sheet: sheet(), address: address(), value: value(), formula: { type: \"string\" }, computedValue: value(), format: nullableObject(), comment: nullableObject() },\n [\"sheet\", \"address\"],\n \"Write one cell. Omitting formula or computedValue clears it; omitting format or comment keeps it; null clears it.\",\n ),\n variant(\n \"set_range\",\n { sheet: sheet(), start: address(), end: address(), values: { type: \"array\", items: { type: \"array\", items: value() } } },\n [\"sheet\", \"start\", \"values\"],\n \"Write a block of values row-major from start, each as a set_cell with no formula.\",\n ),\n variant(\"set_workbook\", { data: object() }, [\"data\"], \"Replace the whole workbook schema.\"),\n variant(\"clear_cell\", { sheet: sheet(), address: address() }, [\"sheet\", \"address\"], \"Remove one cell.\"),\n variant(\"insert_rows\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Insert rows before 1-based row `at`; cells, merges below move down.\"),\n variant(\"delete_rows\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Delete rows starting at 1-based row `at`; cells, merges below move up.\"),\n variant(\"insert_columns\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Insert columns before 1-based column `at` (A = 1); cells, merges and widths move right.\"),\n variant(\"delete_columns\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Delete columns starting at 1-based column `at`; cells, merges and widths move left.\"),\n variant(\"add_sheet\", { index: { type: \"integer\", minimum: 0 }, sheet: object() }, [\"index\", \"sheet\"], \"Insert a sheet at a 0-based position.\"),\n variant(\"remove_sheet\", { sheet: sheet() }, [\"sheet\"], \"Remove a sheet by name.\"),\n variant(\"rename_sheet\", { sheet: sheet(), name: sheet() }, [\"sheet\", \"name\"], \"Rename a sheet.\"),\n variant(\"move_sheet\", { sheet: sheet(), toIndex: { type: \"integer\", minimum: 0 } }, [\"sheet\", \"toIndex\"], \"Move a sheet to a 0-based position.\"),\n variant(\"replace_sheet\", { sheet: sheet(), data: object() }, [\"sheet\", \"data\"], \"Replace one sheet whole.\"),\n variant(\n \"set_merged_regions\",\n { sheet: sheet(), mergedRegions: { type: \"array\", items: { type: \"object\", required: [\"start\", \"end\"], properties: { start: address(), end: address() } } } },\n [\"sheet\", \"mergedRegions\"],\n \"Set every merged region of a sheet.\",\n ),\n // A LIST too, as PHP 2.3.2 declares. PHP encodes a map whose keys run\n // 0..n-1 as a JSON list, so widths for columns A, B and C arrive as\n // `[120, 80, 140]` and no widths as `[]`; this port passes such a list\n // through a diff unchanged. A list's position is the column index.\n variant(\n \"set_column_widths\",\n {\n sheet: sheet(),\n columnWidths: {\n type: [\"object\", \"array\"],\n items: { type: \"number\", minimum: 0 },\n additionalProperties: { type: \"number\", minimum: 0 },\n },\n },\n [\"sheet\", \"columnWidths\"],\n \"Set every column width of a sheet (0-based column index to pixels; a list is indexed by position); empty removes them.\",\n ),\n variant(\n \"set_frozen\",\n { sheet: sheet(), rows: { type: \"integer\", minimum: 0 }, cols: { type: \"integer\", minimum: 0 } },\n [\"sheet\", \"rows\", \"cols\"],\n \"Set frozen rows and columns.\",\n ),\n variant(\"set_meta\", { meta: nullableObject() }, [\"meta\"], \"Replace the workbook meta, or remove it with null.\"),\n ];\n\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: \"Holy Sheet op\",\n description: \"One op from Agent::diff, applied by Agent::reduce.\",\n oneOf: variants,\n };\n },\n};\n\nfunction variant(\n type: string,\n properties: Record<string, unknown>,\n required: string[],\n description: string,\n): Record<string, unknown> {\n return {\n type: \"object\",\n description,\n required: [\"type\", ...required],\n additionalProperties: false,\n properties: { type: { const: type }, ...properties },\n };\n}\n","import {\n type Any,\n type Obj,\n asciiUpper,\n entriesOf,\n get,\n has,\n isArr,\n isEmptyArr,\n isIndexKey,\n letter,\n parseAddress,\n phpInt,\n phpInteger,\n phpString,\n phpTrim,\n valuesOf,\n} from \"./php\";\nimport { SheetOpSchema } from \"./sheet-op-schema\";\n\n/**\n * Apply `SheetOpSchema` ops to a Holy Sheet schema, returning a new schema.\n * Mirrors PHP `HolySheet\\Ops\\SheetReducer`, op for op.\n *\n * Pure: the input is never modified. An op naming a sheet or cell that is not\n * there is skipped, as fancy-sheets' `reduceWorkbook` skips an unknown sheet, so\n * a replayed history degrades rather than throws. Unchanged parts of the input\n * are shared with the result rather than copied, as in any immutable reducer:\n * nothing here mutates either, but a caller that mutates a result in place\n * reaches into the input too.\n *\n * `set_cell`, `set_range` and `set_workbook` keep fancy-sheets' shapes and\n * semantics — a `set_cell` without `formula` clears the formula and keeps the\n * format and comment; a null write to an absent cell does nothing — so the same\n * ops can drive a live `useSheetSync` session. Everything else is holy-sheet's:\n * the structure fancy-sheets has no op for (sheets, rows, columns, merges, widths,\n * panes, meta) and the cell parts it does not carry (`computedValue`, `format`,\n * `comment`).\n *\n * The row and column ops move cells, merged regions and column widths. They do\n * not rewrite formula text: a formula that should follow an inserted row is a\n * change to that cell, and a diff records it as one.\n */\nexport const SheetReducer = {\n /** Sheet keys the granular ops address. A sheet with any other key is authored form. */\n CELL_FORM_KEYS: [\"name\", \"cells\", \"mergedRegions\", \"columnWidths\", \"frozenRows\", \"frozenCols\"] as readonly string[],\n\n applyAll(schema: Any, ops: readonly Any[]): Any {\n for (const op of ops) {\n schema = SheetReducer.apply(schema, op);\n }\n return schema;\n },\n\n apply(schema: Any, op: Any): Any {\n const type = get(op, \"type\");\n\n // A string naming an op type, compared strictly (PHP 2.3.2, where a loose\n // `switch` let `type: true` remove a sheet). This port's switch was strict.\n if (typeof type !== \"string\" || !(SheetOpSchema.TYPES as readonly string[]).includes(type)) {\n return schema;\n }\n\n if (type === \"set_workbook\") {\n return isArr(get(op, \"data\")) ? op.data : schema;\n }\n\n if (type === \"set_meta\") {\n const out: Obj = { ...schema };\n if (get(op, \"meta\") === null) {\n delete out[\"meta\"];\n } else {\n out[\"meta\"] = op.meta;\n }\n return out;\n }\n\n const sheets: Any[] = isArr(get(schema, \"sheets\")) ? valuesOf(schema.sheets) : [];\n\n if (type === \"add_sheet\") {\n if (!isArr(get(op, \"sheet\"))) {\n return schema;\n }\n const index = has(op, \"index\") ? phpInteger(op.index) : sheets.length;\n if (index === null) {\n return schema;\n }\n sheets.splice(Math.max(0, Math.min(sheets.length, index)), 0, op.sheet);\n return { ...schema, sheets };\n }\n\n const at = find(sheets, phpString(get(op, \"sheet\") ?? \"\"));\n\n if (at === null) {\n return schema;\n }\n\n // Positions and counts are ints or digit strings (PHP 2.3.3). A present\n // value that is neither skips the op: `(int)` read junk as 0, which moved a\n // sheet to the front, inserted one there, or unfroze panes.\n for (const field of POSITION_FIELDS) {\n if (has(op, field) && phpInteger(op[field]) === null) {\n return schema;\n }\n }\n\n switch (type) {\n case \"remove_sheet\":\n sheets.splice(at, 1);\n break;\n\n case \"rename_sheet\":\n sheets[at] = { ...sheets[at], name: phpString(get(op, \"name\") ?? sheets[at].name) };\n break;\n\n case \"move_sheet\": {\n const [moved] = sheets.splice(at, 1);\n const to = Math.max(0, Math.min(sheets.length, phpInteger(get(op, \"toIndex\") ?? at) ?? at));\n sheets.splice(to, 0, moved);\n break;\n }\n\n case \"replace_sheet\":\n if (isArr(get(op, \"data\"))) {\n sheets[at] = op.data;\n }\n break;\n\n case \"set_merged_regions\":\n sheets[at] = setOrUnset(sheets[at], \"mergedRegions\", get(op, \"mergedRegions\") ?? [], EMPTY);\n break;\n\n case \"set_column_widths\":\n sheets[at] = setOrUnset(sheets[at], \"columnWidths\", get(op, \"columnWidths\") ?? [], EMPTY);\n break;\n\n case \"set_frozen\":\n sheets[at] = setOrUnset(sheets[at], \"frozenRows\", phpInteger(get(op, \"rows\") ?? 0) ?? 0, 0);\n sheets[at] = setOrUnset(sheets[at], \"frozenCols\", phpInteger(get(op, \"cols\") ?? 0) ?? 0, 0);\n break;\n\n case \"set_cell\":\n sheets[at] = setCell(sheets[at], op);\n break;\n\n case \"set_range\":\n sheets[at] = setRange(sheets[at], op);\n break;\n\n case \"clear_cell\": {\n const address = asciiUpper(phpTrim(phpString(get(op, \"address\") ?? \"\")));\n const cells = sheets[at].cells;\n // PHP's `unset($sheet['cells'][$address])` creates nothing when the key is absent.\n if (isArr(cells) && !Array.isArray(cells) && has(cells, address)) {\n const copy: Obj = { ...cells };\n delete copy[address];\n sheets[at] = { ...sheets[at], cells: copy };\n }\n break;\n }\n\n case \"insert_rows\":\n sheets[at] = shiftRows(sheets[at], position(op, \"at\"), Math.max(0, position(op, \"count\")));\n break;\n\n case \"delete_rows\":\n sheets[at] = shiftRows(sheets[at], position(op, \"at\"), -Math.max(0, position(op, \"count\")));\n break;\n\n case \"insert_columns\":\n sheets[at] = shiftColumns(sheets[at], position(op, \"at\"), Math.max(0, position(op, \"count\")));\n break;\n\n case \"delete_columns\":\n sheets[at] = shiftColumns(sheets[at], position(op, \"at\"), -Math.max(0, position(op, \"count\")));\n break;\n\n default:\n return schema;\n }\n\n return { ...schema, sheets };\n },\n};\n\n/** Op fields that hold a position or a count. */\nconst POSITION_FIELDS = [\"index\", \"toIndex\", \"rows\", \"cols\", \"at\", \"count\"] as const;\n\n/** PHP `self::integer($op[$key] ?? 0) ?? 0`, for a field the guard in apply() has checked. */\nfunction position(op: Obj, key: string): number {\n return phpInteger(get(op, key) ?? 0) ?? 0;\n}\n\n/** The `[]` a map or list key is removed at. */\nconst EMPTY = Symbol(\"empty\");\n\nfunction find(sheets: Any[], name: string): number | null {\n for (let i = 0; i < sheets.length; i++) {\n if (get(sheets[i], \"name\") === name) {\n return i;\n }\n }\n return null;\n}\n\nfunction setOrUnset(sheet: Obj, key: string, value: Any, empty: typeof EMPTY | 0): Obj {\n const out: Obj = { ...sheet };\n if (value === null || (empty === EMPTY ? isEmptyArr(value) : value === empty)) {\n delete out[key];\n } else {\n out[key] = value;\n }\n return out;\n}\n\n/**\n * fancy-sheets' `set_cell`, plus the parts of a cell it does not carry.\n *\n * - `value` is written; `formula` and `computedValue` are REPLACED — absent\n * in the op means absent in the cell, as fancy-sheets clears `formula`.\n * - `format` and `comment` are KEPT when the op omits them, replaced when it\n * carries one, and removed when it carries null.\n * - A null write to an absent cell, carrying nothing else, does nothing.\n */\nfunction setCell(sheet: Obj, op: Obj): Obj {\n // Trimmed as it is validated (PHP 2.3.2): `\" a1 \"` is A1, not a key of its own.\n const address = asciiUpper(phpTrim(phpString(get(op, \"address\") ?? \"\")));\n\n if (parseAddress(address) === null) {\n return sheet;\n }\n\n const cells: Obj = isArr(get(sheet, \"cells\")) ? { ...sheet.cells } : {};\n const existing = get(cells, address);\n const value = get(op, \"value\");\n\n const carries = (key: string): boolean => has(op, key) && op[key] !== null;\n\n if (\n existing === null &&\n value === null &&\n !carries(\"formula\") &&\n !carries(\"computedValue\") &&\n !carries(\"format\") &&\n !carries(\"comment\")\n ) {\n return sheet;\n }\n\n // `value` is optional in a CellData ({\"formula\": \"SUM(A1:A3)\"} is a whole\n // cell), so an op without one writes a cell without one.\n const cell: Obj = has(op, \"value\") ? { value } : {};\n\n for (const key of [\"formula\", \"computedValue\"]) {\n if (carries(key)) {\n cell[key] = op[key];\n }\n }\n\n for (const key of [\"format\", \"comment\"]) {\n if (has(op, key)) {\n if (op[key] !== null) {\n cell[key] = op[key];\n }\n } else if (isArr(existing) && has(existing, key)) {\n cell[key] = existing[key];\n }\n }\n\n if (Object.keys(cell).length === 0) {\n delete cells[address];\n } else {\n cells[address] = cell;\n }\n\n return { ...sheet, cells };\n}\n\n/**\n * fancy-sheets' `set_range`: values row-major from `start`, each written as a\n * `set_cell` with no formula. `end` is accepted and, as there, not read.\n */\nfunction setRange(sheet: Obj, op: Obj): Obj {\n const start = parseAddress(phpString(get(op, \"start\") ?? \"\"));\n\n if (start === null || !isArr(get(op, \"values\"))) {\n return sheet;\n }\n\n const [col0, row0] = start;\n const rows = valuesOf(op.values);\n\n for (let r = 0; r < rows.length; r++) {\n const row = valuesOf(isArr(rows[r]) ? rows[r] : []);\n for (let c = 0; c < row.length; c++) {\n sheet = setCell(sheet, { address: letter(col0 + c) + String(row0 + r), value: row[c] === undefined ? null : row[c] });\n }\n }\n\n return sheet;\n}\n\n/** Insert (`delta` > 0) or delete (`delta` < 0) rows at 1-based row `at`. */\nfunction shiftRows(sheet: Obj, at: number, delta: number): Obj {\n if (at < 1 || delta === 0) {\n return sheet;\n }\n\n sheet = remapCells(sheet, (col, row) => {\n if (row < at) {\n return [col, row];\n }\n if (delta < 0 && row < at - delta) {\n return null;\n }\n return [col, row + delta];\n });\n\n return remapMerges(sheet, \"row\", at, delta);\n}\n\n/** Insert or delete columns at 1-based column `at` (A = 1). */\nfunction shiftColumns(sheet: Obj, at: number, delta: number): Obj {\n if (at < 1 || delta === 0) {\n return sheet;\n }\n\n sheet = remapCells(sheet, (col, row) => {\n const number = col + 1;\n if (number < at) {\n return [col, row];\n }\n if (delta < 0 && number < at - delta) {\n return null;\n }\n return [col + delta, row];\n });\n\n if (isArr(get(sheet, \"columnWidths\"))) {\n const widths = new Map<number, Any>();\n for (const [index, width] of entriesOf(sheet.columnWidths)) {\n // A key that is not a column index is dropped (PHP 2.3.2), not read as\n // column 0: `(int) \"abc\"` overwrote column A's width.\n if (!isIndexKey(index)) {\n continue;\n }\n const i = phpInt(index);\n const number = i + 1;\n if (number < at) {\n widths.set(i, width);\n } else if (delta > 0 || number >= at - delta) {\n widths.set(i + delta, width);\n }\n }\n // ksort\n const sorted: Obj = {};\n for (const [index, width] of [...widths.entries()].sort((x, y) => x[0] - y[0])) {\n sorted[index] = width;\n }\n sheet = setOrUnset(sheet, \"columnWidths\", sorted, EMPTY);\n }\n\n return remapMerges(sheet, \"col\", at, delta);\n}\n\n/**\n * Move a 1-based span [start, end] for an insert or delete at `at`. Null when a\n * delete removes the whole span; a span the delete cuts into shrinks.\n */\nfunction shiftSpan(start: number, end: number, at: number, delta: number): [number, number] | null {\n if (delta > 0) {\n return [start >= at ? start + delta : start, end >= at ? end + delta : end];\n }\n\n const last = at - delta - 1; // the last deleted index\n const newStart = start < at ? start : start > last ? start + delta : at;\n const newEnd = end < at ? end : end > last ? end + delta : at - 1;\n\n return newEnd < newStart ? null : [newStart, newEnd];\n}\n\nfunction remapCells(sheet: Obj, move: (col: number, row: number) => [number, number] | null): Obj {\n if (!isArr(get(sheet, \"cells\"))) {\n return sheet;\n }\n\n const placed: [number, number, string, Any][] = [];\n\n for (const [address, cell] of entriesOf(sheet.cells)) {\n const parsed = parseAddress(address);\n\n if (parsed === null) {\n continue;\n }\n\n const to = move(parsed[0], parsed[1]);\n\n if (to !== null) {\n placed.push([to[1], to[0], letter(to[0]) + String(to[1]), cell]);\n }\n }\n\n // Row-major, the order describe() reads cells in. Array#sort is stable, as PHP 8's usort is.\n placed.sort((x, y) => x[0] - y[0] || x[1] - y[1]);\n\n const cells: Obj = {};\n for (const [, , address, cell] of placed) {\n cells[address] = cell;\n }\n\n return { ...sheet, cells };\n}\n\nfunction remapMerges(sheet: Obj, axis: \"row\" | \"col\", at: number, delta: number): Obj {\n if (!isArr(get(sheet, \"mergedRegions\"))) {\n return sheet;\n }\n\n const regions: Any[] = [];\n\n for (const region of valuesOf(sheet.mergedRegions)) {\n const start = parseAddress(phpString(get(region, \"start\") ?? \"\"));\n const end = parseAddress(phpString(get(region, \"end\") ?? \"\"));\n\n if (start === null || end === null) {\n regions.push(region);\n continue;\n }\n\n if (axis === \"row\") {\n const moved = shiftSpan(start[1], end[1], at, delta);\n if (moved === null) {\n continue;\n }\n regions.push({ start: letter(start[0]) + String(moved[0]), end: letter(end[0]) + String(moved[1]) });\n } else {\n const moved = shiftSpan(start[0] + 1, end[0] + 1, at, delta);\n if (moved === null) {\n continue;\n }\n regions.push({ start: letter(moved[0] - 1) + String(start[1]), end: letter(moved[1] - 1) + String(end[1]) });\n }\n }\n\n return setOrUnset(sheet, \"mergedRegions\", regions, EMPTY);\n}\n","import { Agent } from \"../agent\";\nimport { type Any, type Obj, entriesOf, get, has, isArr, isEmptyArr, parseAddress, phpString, valuesOf } from \"./php\";\nimport { SheetReducer } from \"./sheet-reducer\";\nimport type { SheetOp } from \"./types\";\n\n/**\n * The op list that turns one Holy Sheet schema into another. Mirrors PHP\n * `HolySheet\\Ops\\SheetDiff`: the same algorithm, so the same inputs give the\n * same ops in the same order in both runtimes (pinned against the PHP package\n * by `tests/sheet-ops-parity.test.ts`).\n *\n * ## Two guarantees, and where each applies\n *\n * 1. **Same workbook, no ops.** When `a` and `b` write the same workbook —\n * compared as `read(toBytes(...))`, so a columns/rows sheet and the cell\n * map it becomes are the same, and the timestamp the writer stamps on a\n * schema that names none is not a change — the diff is `[]`. This is what\n * makes `diff(s, read(toBytes(s)))` `[]`: saving without a change records\n * nothing.\n * 2. **Otherwise, exact.** `reduce(a, diff(a, b))` equals `b`, key order\n * aside. The ops are computed on the schemas as given and VERIFIED by\n * replaying them through `SheetReducer`; a sheet whose granular ops do not\n * reproduce it is replaced whole, and a workbook that still does not match\n * is replaced whole. Correct first, small second.\n *\n * ## Small edits stay small\n *\n * Rows and columns are ALIGNED before cells are compared (a longest common\n * subsequence over each row's, then each column's, contents), so inserting a row\n * above a hundred others is one `insert_rows` plus the new row's cells, not a\n * hundred rewritten cells. One changed cell is one `set_cell`.\n *\n * Granular ops apply to sheets in CELL form — the form `read()` returns. A sheet\n * authored as columns/rows/theme/totals, on either side, is replaced whole when\n * it changes: those keys expand at write time into cells an op could not\n * address without re-deriving the writer.\n *\n * ## Determinism\n *\n * Alignment ties break toward deleting first, and the alignment is skipped (the\n * changed middle treated as rows changed in place) past `ALIGN_LIMIT` cells of\n * work.\n */\nexport const SheetDiff = {\n /** Above this many LCS cells (after trimming the common prefix and suffix), rows or columns are not aligned. */\n ALIGN_LIMIT: 250_000,\n\n diff(a: Any, b: Any): SheetOp[] {\n if (SheetDiff.same(a, b) || SheetDiff.equivalent(a, b)) {\n return [];\n }\n\n const ops = granular(a, b);\n\n if (SheetDiff.same(SheetReducer.applyAll(a, ops), b)) {\n return ops;\n }\n\n return [{ type: \"set_workbook\", data: b }];\n },\n\n /**\n * Whether two schemas write the same workbook.\n *\n * Both are written and read back. `meta.created` is compared only when both\n * schemas name one: the writer stamps the current time on a schema that\n * does not, and that timestamp is not an edit.\n */\n equivalent(a: Any, b: Any): boolean {\n let describedA = described(a);\n let describedB = described(b);\n\n if (!namesCreated(a) || !namesCreated(b)) {\n describedA = withoutCreated(describedA);\n describedB = withoutCreated(describedB);\n }\n\n return SheetDiff.same(describedA, describedB);\n },\n\n /**\n * Structural equality with map key order ignored and list order kept.\n *\n * Equality is on values, never on insertion order — a JS object cannot keep\n * the order of integer-like keys anyway (`columnWidths`). It follows PHP's\n * canonical form, where lists and maps are one array type: `{}` equals `[]`,\n * and an object keyed exactly \"0\"..\"n-1\" equals the list of its values.\n *\n * Two divergences from the PHP `same()` cannot be removed, because the\n * distinctions do not exist in JS values:\n *\n * - PHP encodes the float `1.0` as `1.0` and the int `1` as `1`, so it calls\n * them different; JS has one number, so here they are the same. A PHP diff\n * can therefore emit a `set_cell` that rewrites `1` as `1.0` where this one\n * emits nothing. Parsed JSON gives PHP a float only for a literal written\n * with a fraction or exponent.\n * - PHP treats an int-keyed array whose keys are 0..n-1 but out of order (for\n * example `columnWidths` decoded from `{\"1\":140,\"0\":120}`) as a map, not a\n * list, and so as different from the same widths in order. A JS object has\n * no such order to compare.\n *\n * Throws a `TypeError` on a value JSON cannot hold, as PHP 2.3.2 throws\n * `JsonException`, rather than calling two such values the same:\n *\n * - a non-finite number (PHP: NAN, INF);\n * - a lone UTF-16 surrogate in a string or a key, which is this runtime's\n * invalid UTF-8 (a JS string cannot hold invalid UTF-8, and PHP's own\n * `json_decode` refuses a lone surrogate);\n * - a function or a symbol, which `JSON.stringify` would silently drop\n * (a bigint already throws there);\n * - nesting deeper than PHP's `json_encode` depth of 4096, where every object\n * and array is a level, an empty one included. The walk is iterative, so\n * this is PHP's limit and not the call stack's.\n *\n * `undefined` stays what JSON makes it: an absent key, and `null` in a list.\n */\n same(a: unknown, b: unknown): boolean {\n return canon(a) === canon(b);\n },\n\n /**\n * Hunks of a longest-common-subsequence alignment: [start in a, deleted, inserted].\n *\n * Ties break toward deleting first. Past `ALIGN_LIMIT` the changed middle is\n * one hunk.\n */\n hunks(a: readonly string[], b: readonly string[]): [number, number, number][] {\n const n = a.length;\n const m = b.length;\n let prefix = 0;\n\n while (prefix < n && prefix < m && a[prefix] === b[prefix]) {\n prefix++;\n }\n\n let suffix = 0;\n\n while (suffix < n - prefix && suffix < m - prefix && a[n - 1 - suffix] === b[m - 1 - suffix]) {\n suffix++;\n }\n\n const midA = a.slice(prefix, n - suffix);\n const midB = b.slice(prefix, m - suffix);\n const rows = midA.length;\n const cols = midB.length;\n\n if (rows === 0 && cols === 0) {\n return [];\n }\n\n if (rows * cols > SheetDiff.ALIGN_LIMIT) {\n return [[prefix, rows, cols]];\n }\n\n // lengths[i][j] = LCS of midA[i..] and midB[j..]\n const lengths: Int32Array[] = [];\n for (let i = 0; i <= rows; i++) {\n lengths.push(new Int32Array(cols + 1));\n }\n\n for (let i = rows - 1; i >= 0; i--) {\n for (let j = cols - 1; j >= 0; j--) {\n lengths[i]![j] =\n midA[i] === midB[j] ? lengths[i + 1]![j + 1]! + 1 : Math.max(lengths[i + 1]![j]!, lengths[i]![j + 1]!);\n }\n }\n\n const hunks: [number, number, number][] = [];\n let open: [number, number, number] | null = null;\n let i = 0;\n let j = 0;\n\n while (i < rows || j < cols) {\n if (i < rows && j < cols && midA[i] === midB[j]) {\n if (open !== null) {\n hunks.push(open);\n open = null;\n }\n i++;\n j++;\n continue;\n }\n\n open ??= [prefix + i, 0, 0];\n\n if (j >= cols || (i < rows && lengths[i + 1]![j]! >= lengths[i]![j + 1]!)) {\n open[1]++;\n i++;\n } else {\n open[2]++;\n j++;\n }\n }\n\n if (open !== null) {\n hunks.push(open);\n }\n\n return hunks;\n },\n};\n\n/** PHP `isset($schema['meta']['created'])`. */\nfunction namesCreated(schema: unknown): boolean {\n return get(get(schema, \"meta\"), \"created\") !== null;\n}\n\nfunction withoutCreated(schema: Obj): Obj {\n const out: Obj = { ...schema };\n if (isArr(out[\"meta\"]) && !Array.isArray(out[\"meta\"])) {\n const meta: Obj = { ...out[\"meta\"] };\n delete meta[\"created\"];\n out[\"meta\"] = meta;\n }\n if (has(out, \"meta\") && isEmptyArr(out[\"meta\"])) {\n delete out[\"meta\"];\n }\n return out;\n}\n\nfunction described(schema: Any): Obj {\n return Agent.read(Agent.toBytes(schema));\n}\n\nfunction sheetName(sheet: unknown): string {\n return phpString(get(sheet, \"name\") ?? \"\");\n}\n\nfunction granular(a: Any, b: Any): SheetOp[] {\n const sheetsA: Any[] = isArr(get(a, \"sheets\")) ? valuesOf(a.sheets) : [];\n const sheetsB: Any[] = isArr(get(b, \"sheets\")) ? valuesOf(b.sheets) : [];\n const namesA = sheetsA.map(sheetName);\n const namesB = sheetsB.map(sheetName);\n\n // Sheets are addressed by name. Two with one name cannot be told apart.\n if (new Set(namesA).size !== namesA.length || new Set(namesB).size !== namesB.length) {\n return [{ type: \"set_workbook\", data: b }];\n }\n\n const ops: SheetOp[] = [];\n\n if (!SheetDiff.same(get(a, \"meta\"), get(b, \"meta\"))) {\n ops.push({ type: \"set_meta\", meta: get(b, \"meta\") });\n }\n\n const removed = namesA.filter((name) => !namesB.includes(name));\n const added = namesB.filter((name) => !namesA.includes(name));\n const renames = new Map<string, string>();\n const renamedTo = (name: string): boolean => [...renames.values()].includes(name);\n\n // A sheet whose contents are unchanged under a new name is a rename.\n for (const old of removed) {\n for (const name of added) {\n if (renamedTo(name)) {\n continue;\n }\n if (\n SheetDiff.same(withoutName(sheetsA[namesA.indexOf(old)]), withoutName(sheetsB[namesB.indexOf(name)]))\n ) {\n renames.set(old, name);\n break;\n }\n }\n }\n\n // One sheet gone and one arrived is a rename, possibly with edits.\n let unmatchedRemoved = removed.filter((name) => !renames.has(name));\n let unmatchedAdded = added.filter((name) => !renamedTo(name));\n\n if (unmatchedRemoved.length === 1 && unmatchedAdded.length === 1) {\n renames.set(unmatchedRemoved[0]!, unmatchedAdded[0]!);\n unmatchedRemoved = [];\n unmatchedAdded = [];\n }\n\n for (const name of unmatchedRemoved) {\n ops.push({ type: \"remove_sheet\", sheet: name });\n }\n\n for (const name of namesA) {\n if (renames.has(name)) {\n ops.push({ type: \"rename_sheet\", sheet: name, name: renames.get(name)! });\n }\n }\n\n namesB.forEach((name, index) => {\n if (unmatchedAdded.includes(name)) {\n ops.push({ type: \"add_sheet\", index, sheet: sheetsB[index] });\n }\n });\n\n // Put the sheets in b's order.\n let state = SheetReducer.applyAll(a, ops);\n namesB.forEach((name, index) => {\n const current = new Map(entriesOf(get(state, \"sheets\") ?? []).map(([key, sheet]) => [key, sheetName(sheet)]));\n if ((current.get(String(index)) ?? null) !== name) {\n const op: SheetOp = { type: \"move_sheet\", sheet: name, toIndex: index };\n ops.push(op);\n state = SheetReducer.apply(state, op);\n }\n });\n\n sheetsB.forEach((target, index) => {\n const current = state.sheets[index];\n\n if (SheetDiff.same(current, target)) {\n return;\n }\n\n for (const op of sheetOps(current, target)) {\n ops.push(op);\n }\n });\n\n return ops;\n}\n\nfunction sheetOps(sheet: Obj, target: Obj): SheetOp[] {\n const name = phpString(target[\"name\"]);\n const replace: SheetOp[] = [{ type: \"replace_sheet\", sheet: name, data: target }];\n\n if (!isCellForm(sheet) || !isCellForm(target)) {\n return replace;\n }\n\n const ops: SheetOp[] = [];\n let work = sheet;\n\n for (const axis of [\"row\", \"col\"] as const) {\n const structural = structuralOps(name, work, target, axis);\n for (const op of structural) {\n ops.push(op);\n work = applyToSheet(work, op);\n }\n }\n\n const cellsW: Obj = isArr(get(work, \"cells\")) ? work[\"cells\"] : {};\n const cellsT: Obj = isArr(get(target, \"cells\")) ? target[\"cells\"] : {};\n const addresses = [...new Set([...entriesOf(cellsW), ...entriesOf(cellsT)].map(([address]) => address))];\n\n for (const address of rowMajor(addresses)) {\n if (!has(cellsT, address)) {\n ops.push({ type: \"clear_cell\", sheet: name, address });\n continue;\n }\n\n const was = get(cellsW, address);\n\n if (was !== null && SheetDiff.same(was, cellsT[address])) {\n continue;\n }\n\n ops.push(setCellOp(name, address, isArr(was) ? was : null, isArr(cellsT[address]) ? cellsT[address] : {}));\n }\n\n if (!SheetDiff.same(get(work, \"mergedRegions\") ?? [], get(target, \"mergedRegions\") ?? [])) {\n ops.push({ type: \"set_merged_regions\", sheet: name, mergedRegions: get(target, \"mergedRegions\") ?? [] });\n }\n\n if (!SheetDiff.same(get(work, \"columnWidths\") ?? [], get(target, \"columnWidths\") ?? [])) {\n // PHP emits its empty array here, which JSON-encodes as `[]`; `{}` is the\n // same value (both reducers read either as empty) in the map shape the op\n // schema declares.\n ops.push({ type: \"set_column_widths\", sheet: name, columnWidths: get(target, \"columnWidths\") ?? {} });\n }\n\n if (\n !identical(get(work, \"frozenRows\") ?? 0, get(target, \"frozenRows\") ?? 0) ||\n !identical(get(work, \"frozenCols\") ?? 0, get(target, \"frozenCols\") ?? 0)\n ) {\n ops.push({\n type: \"set_frozen\",\n sheet: name,\n rows: get(target, \"frozenRows\") ?? 0,\n cols: get(target, \"frozenCols\") ?? 0,\n });\n }\n\n // Verified per sheet, so one sheet the granular ops cannot reproduce is\n // replaced without costing the rest of the workbook its small diff.\n let result = sheet;\n for (const op of ops) {\n result = applyToSheet(result, op);\n }\n\n return SheetDiff.same(result, target) ? ops : replace;\n}\n\n/** PHP `===`: primitives by value and type; arrays structurally. */\nfunction identical(x: unknown, y: unknown): boolean {\n return isArr(x) || isArr(y) ? SheetDiff.same(x, y) : x === y;\n}\n\nfunction setCellOp(sheet: string, address: string, was: Obj | null, cell: Obj): SheetOp {\n const op: Obj = { type: \"set_cell\", sheet, address };\n\n if (has(cell, \"value\")) {\n op[\"value\"] = cell[\"value\"];\n }\n\n for (const key of [\"formula\", \"computedValue\"]) {\n if (has(cell, key)) {\n op[key] = cell[key];\n }\n }\n\n for (const key of [\"format\", \"comment\"]) {\n if (!SheetDiff.same(get(was, key), get(cell, key))) {\n op[key] = get(cell, key);\n }\n }\n\n return op as SheetOp;\n}\n\n/**\n * Row (or column) inserts and deletes, found by aligning contents.\n *\n * Emitted from the bottom (or right) up, so each op's position is still the\n * position in the sheet as it was.\n */\nfunction structuralOps(name: string, sheet: Obj, target: Obj, axis: \"row\" | \"col\"): SheetOp[] {\n const sheetLines = lines(sheet, axis);\n const targetLines = lines(target, axis);\n const ops: SheetOp[] = [];\n\n for (const [start, deleted, inserted] of SheetDiff.hunks(sheetLines, targetLines).reverse()) {\n const kept = Math.min(deleted, inserted);\n const at = start + kept + 1;\n\n if (deleted > inserted) {\n ops.push({ type: axis === \"row\" ? \"delete_rows\" : \"delete_columns\", sheet: name, at, count: deleted - inserted });\n } else if (inserted > deleted && at <= sheetLines.length) {\n // Past the last row there is nothing to move down.\n ops.push({ type: axis === \"row\" ? \"insert_rows\" : \"insert_columns\", sheet: name, at, count: inserted - deleted });\n }\n }\n\n return ops;\n}\n\n/** Each row's (or column's) contents, as a comparable string, index 0 = row 1. */\nfunction lines(sheet: Obj, axis: \"row\" | \"col\"): string[] {\n const grouped = new Map<number, Map<number, Any>>();\n let max = 0;\n\n for (const [address, cell] of entriesOf(isArr(get(sheet, \"cells\")) ? sheet[\"cells\"] : {})) {\n const parsed = parseAddress(address);\n if (parsed === null) {\n continue;\n }\n const [col, row] = parsed;\n const line = axis === \"row\" ? row : col + 1;\n const position = axis === \"row\" ? col : row;\n let group = grouped.get(line);\n if (group === undefined) {\n group = new Map();\n grouped.set(line, group);\n }\n group.set(position, cell);\n max = Math.max(max, line);\n }\n\n const out: string[] = [];\n for (let i = 1; i <= max; i++) {\n const positions = [...(grouped.get(i) ?? new Map<number, Any>()).entries()].sort((x, y) => x[0] - y[0]);\n out.push(canonEntries(positions.map(([position, cell]) => [String(position), cell])));\n }\n\n return out;\n}\n\nfunction applyToSheet(sheet: Obj, op: SheetOp): Obj {\n return SheetReducer.apply({ sheets: [sheet] }, op).sheets[0];\n}\n\nfunction isCellForm(sheet: Obj): boolean {\n return entriesOf(sheet).every(([key]) => SheetReducer.CELL_FORM_KEYS.includes(key));\n}\n\nfunction withoutName(sheet: Obj): Obj {\n const out: Obj = isArr(sheet) ? { ...sheet } : {};\n delete out[\"name\"];\n return out;\n}\n\nfunction rowMajor(addresses: readonly string[]): string[] {\n const parsed: [number, number, string][] = [];\n\n for (const address of addresses) {\n const cell = parseAddress(address);\n if (cell !== null) {\n parsed.push([cell[1], cell[0], address]);\n }\n }\n\n parsed.sort((x, y) => x[0] - y[0] || x[1] - y[1]);\n\n return parsed.map(([, , address]) => address);\n}\n\n/**\n * PHP's canonical JSON, for equality only: map keys sorted, list order kept, and\n * an array keyed exactly 0..n-1 (every empty one included) written as a list.\n * The key order and escaping differ from PHP's bytes; which values compare\n * equal does not (see `same()` for the two exceptions, and for what throws).\n */\nfunction canon(value: unknown): string {\n return isArr(value) ? canonEntries(entriesFor(value)) : scalar(value);\n}\n\n/** `SheetDiff::canon()` passes `json_encode` this depth explicitly. */\nconst JSON_DEPTH = 4096;\n\ntype Frame = { key: string; entries: [string, unknown][]; list: boolean; next: number; parts: string[] };\n\n/**\n * `canon()` of an array given as its entries. A loop over an explicit stack, not\n * recursion: the call stack runs out before PHP's 4096 levels do.\n */\nfunction canonEntries(root: [string, unknown][]): string {\n const stack: Frame[] = [];\n\n const open = (key: string, entries: [string, unknown][]): void => {\n if (stack.length === JSON_DEPTH) {\n throw unencodable(\"Maximum stack depth exceeded\");\n }\n const list = entries.every(([k], i) => k === String(i));\n if (!list) {\n entries = entries.slice().sort((x, y) => (x[0] < y[0] ? -1 : x[0] > y[0] ? 1 : 0));\n }\n stack.push({ key, entries, list, next: 0, parts: [] });\n };\n\n open(\"\", root);\n\n for (;;) {\n const top = stack[stack.length - 1]!;\n\n if (top.next < top.entries.length) {\n const [key, item] = top.entries[top.next++]!;\n if (isArr(item)) {\n open(key, entriesFor(item));\n } else {\n top.parts.push(member(top, key, scalar(item)));\n }\n continue;\n }\n\n stack.pop();\n const text = top.list ? \"[\" + top.parts.join(\",\") + \"]\" : \"{\" + top.parts.join(\",\") + \"}\";\n const parent = stack[stack.length - 1];\n if (parent === undefined) {\n return text;\n }\n parent.parts.push(member(parent, top.key, text));\n }\n}\n\n/** An array is always a list, as JSON writes it; an object lists its defined keys. */\nfunction entriesFor(value: Obj): [string, unknown][] {\n return Array.isArray(value) ? Array.from(value, (item, i): [string, unknown] => [String(i), item]) : entriesOf(value);\n}\n\nfunction member(frame: Frame, key: string, text: string): string {\n return frame.list ? text : quote(key) + \":\" + text;\n}\n\nfunction scalar(value: unknown): string {\n switch (typeof value) {\n case \"number\":\n if (!Number.isFinite(value)) {\n throw unencodable(\"Inf and NaN cannot be JSON encoded\");\n }\n break;\n case \"string\":\n return quote(value);\n case \"function\":\n case \"symbol\":\n throw unencodable(`a ${typeof value} cannot be JSON encoded`);\n }\n // A bigint throws here, as JSON.stringify's own TypeError; undefined is null.\n return JSON.stringify(value) ?? \"null\";\n}\n\nconst LONE_SURROGATE = /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/;\n\nfunction quote(text: string): string {\n if (LONE_SURROGATE.test(text)) {\n throw unencodable(\"Single unpaired UTF-16 surrogate\");\n }\n return JSON.stringify(text);\n}\n\nfunction unencodable(reason: string): TypeError {\n return new TypeError(`[holy-sheet] cannot compare a value JSON cannot hold: ${reason}`);\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://github.com/Particle-Academy/holy-sheet/skills/holy-sheet.schema.json\",\n \"title\": \"Holy Sheet workbook schema\",\n \"description\": \"Input format for HolySheet\\\\Agent::write(). Describes a multi-sheet xlsx workbook agentically. Everything in this schema is SUPPORTED NOW: values, formulas, per-column types and number formats, per-cell styling, themes, merges, frozen panes, column widths, totals and comments. A workbook is judged by how it READS, not only by whether the numbers are right — money should render as money and a header row should look like one, so prefer a typed column over a raw number and set the presentation the document needs.\",\n \"type\": \"object\",\n \"required\": [\n \"sheets\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"sheets\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"description\": \"One or more sheets. The first sheet is shown when the file opens.\",\n \"items\": {\n \"$ref\": \"#/definitions/Sheet\"\n }\n },\n \"meta\": {\n \"type\": \"object\",\n \"description\": \"Optional workbook metadata surfaced in Excel's File → Info pane.\",\n \"properties\": {\n \"creator\": {\n \"type\": \"string\"\n },\n \"created\": {\n \"type\": \"string\",\n \"description\": \"ISO-8601 datetime. Defaults to now().\"\n }\n },\n \"additionalProperties\": true\n }\n },\n \"definitions\": {\n \"Sheet\": {\n \"type\": \"object\",\n \"required\": [\n \"name\"\n ],\n \"additionalProperties\": false,\n \"oneOf\": [\n {\n \"required\": [\n \"columns\",\n \"rows\"\n ],\n \"description\": \"Row-oriented (agent-ergonomic).\"\n },\n {\n \"required\": [\n \"cells\"\n ],\n \"description\": \"Sparse A1-keyed map (fancy-sheets passthrough).\"\n }\n ],\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 31,\n \"description\": \"Tab label in Excel. Excel limits to 31 chars and forbids /\\\\?*[]:\"\n },\n \"columns\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/Column\"\n },\n \"description\": \"When present, the first row is the header row. Column types are applied to every row in that column.\"\n },\n \"rows\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"array\",\n \"description\": \"One row of cell values, in column order. Use null for missing values.\",\n \"items\": {\n \"$ref\": \"#/definitions/CellValue\"\n }\n }\n },\n \"cells\": {\n \"type\": \"object\",\n \"description\": \"Sparse cells keyed by A1 address, for anything the row/column model does not cover — a title band, a callout, a note. May be used ALONGSIDE columns/rows: the explicit cell wins at its address and inherits that column's format for anything it does not set.\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/CellData\"\n },\n \"patternProperties\": {\n \"^[A-Z]+[1-9][0-9]*$\": {\n \"$ref\": \"#/definitions/CellData\"\n }\n }\n },\n \"totals\": {\n \"type\": \"object\",\n \"description\": \"Symbolic aggregations appended below the data. Key = column header; value = one of sum, avg, count, min, max. These become real FORMULAS, so a total updates when a figure above it is edited — a row of typed numbers looks identical and is wrong the moment anyone changes anything.\",\n \"additionalProperties\": {\n \"type\": \"string\",\n \"enum\": [\n \"sum\",\n \"avg\",\n \"count\",\n \"min\",\n \"max\"\n ]\n }\n },\n \"theme\": {\n \"type\": \"string\",\n \"enum\": [\n \"default\",\n \"minimal\",\n \"plain\",\n \"business\"\n ],\n \"default\": \"default\",\n \"description\": \"Pre-baked style preset applied to headers, banding and totals. The cheapest way to make a sheet look deliberate: set it unless you are styling every cell yourself.\"\n },\n \"mergedRegions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"start\",\n \"end\"\n ],\n \"properties\": {\n \"start\": {\n \"type\": \"string\",\n \"description\": \"A1 ref of top-left.\"\n },\n \"end\": {\n \"type\": \"string\",\n \"description\": \"A1 ref of bottom-right.\"\n }\n }\n },\n \"description\": \"Cells to merge, as [{start, end}] — e.g. [{\\\"start\\\": \\\"A1\\\", \\\"end\\\": \\\"D1\\\"}]. Use it for a title band spanning the table.\"\n },\n \"columnWidths\": {\n \"type\": \"object\",\n \"description\": \"Override widths in pixels. Keys are 0-based column indexes. Set these when a header or a formatted number would otherwise be cut off or shown as ####.\",\n \"additionalProperties\": {\n \"type\": \"number\",\n \"minimum\": 0\n }\n },\n \"frozenRows\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"How many rows stay visible while the sheet scrolls. Set to 1 whenever there is a header row, so the reader can still see what the columns are further down.\"\n },\n \"frozenCols\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"How many columns stay visible while the sheet scrolls sideways. Set to 1 when the first column is the label for the row.\"\n }\n }\n },\n \"Column\": {\n \"type\": \"object\",\n \"required\": [\n \"header\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"header\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"auto\",\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"date\",\n \"datetime\",\n \"currency\",\n \"percent\",\n \"formula\"\n ],\n \"default\": \"auto\",\n \"description\": \"Cell type applied to every value in this column, and the main thing deciding whether the sheet reads as a document or as a dump. Use 'currency' for money, 'percent' for rates and 'date' for dates — 'auto' infers a plain number and leaves 1250000.5 looking like 1250000.5.\"\n },\n \"currency\": {\n \"type\": \"string\",\n \"description\": \"ISO currency code for a 'currency' column, e.g. USD. Pair it with decimals: 2.\"\n },\n \"decimals\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 10,\n \"description\": \"Decimal places for a numeric, currency or percent column. Money is normally 2; a growth rate is normally 1.\"\n },\n \"format\": {\n \"type\": \"string\",\n \"description\": \"Custom Excel number format string. Overrides type-derived format. Power-user escape hatch.\"\n },\n \"width\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"Column width in pixels. Same as columnWidths but per-column.\"\n }\n }\n },\n \"CellValue\": {\n \"description\": \"A primitive value, null, or an object {value, formula, format, comment} for per-cell control.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n },\n {\n \"$ref\": \"#/definitions/CellData\"\n }\n ]\n },\n \"CellData\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"value\": {\n \"description\": \"Raw cell value.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"formula\": {\n \"type\": \"string\",\n \"description\": \"Formula without leading '='. e.g. 'SUM(A1:A10)' or 'Sheet2!B5+1'.\"\n },\n \"computedValue\": {\n \"description\": \"Cached value from a previous evaluation. When present, Excel shows it without recomputing on open.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"format\": {\n \"$ref\": \"#/definitions/CellFormat\"\n },\n \"comment\": {\n \"$ref\": \"#/definitions/CellComment\"\n }\n }\n },\n \"CellFormat\": {\n \"type\": \"object\",\n \"description\": \"Per-cell presentation: bold, italic, font size, text and background colour, alignment, borders and number format. Use it for the things a column type cannot express — a title band, a highlighted figure, a ruled callout.\",\n \"additionalProperties\": false,\n \"properties\": {\n \"bold\": {\n \"type\": \"boolean\"\n },\n \"italic\": {\n \"type\": \"boolean\"\n },\n \"textAlign\": {\n \"type\": \"string\",\n \"enum\": [\n \"left\",\n \"center\",\n \"right\"\n ]\n },\n \"displayFormat\": {\n \"type\": \"string\",\n \"enum\": [\n \"auto\",\n \"text\",\n \"number\",\n \"date\",\n \"datetime\",\n \"percentage\",\n \"currency\"\n ]\n },\n \"decimals\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 10\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Hex color (#RRGGBB) for text.\"\n },\n \"backgroundColor\": {\n \"type\": \"string\",\n \"description\": \"Hex color for cell fill.\"\n },\n \"fontSize\": {\n \"type\": \"integer\",\n \"minimum\": 6,\n \"maximum\": 72\n },\n \"borderTop\": {\n \"type\": \"string\"\n },\n \"borderRight\": {\n \"type\": \"string\"\n },\n \"borderBottom\": {\n \"type\": \"string\"\n },\n \"borderLeft\": {\n \"type\": \"string\"\n }\n }\n },\n \"CellComment\": {\n \"type\": \"object\",\n \"description\": \"A reviewer note attached to a cell. Accepts a plain string, or an object with text/author/color.\",\n \"required\": [\n \"text\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n },\n \"author\": {\n \"type\": \"string\"\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Hex color for the corner triangle indicator.\"\n }\n }\n }\n }\n}\n","import { ArrayBuilder } from \"./helpers/array-builder\";\nimport { CsvBuilder } from \"./helpers/csv-builder\";\nimport { FormulaLinter } from \"./schema/formula-linter\";\nimport { Normalizer } from \"./schema/normalizer\";\nimport { Validator } from \"./schema/validator\";\nimport type {\n BuilderOptions,\n FormulaProblem,\n HolySheetSchema,\n RepairResult,\n ValidationError,\n WriteResult,\n} from \"./schema/types\";\nimport { FormatSniffer } from \"./reader/format-sniffer\";\nimport { OdsReader } from \"./reader/ods-reader\";\nimport { WorkbookSchema } from \"./reader/workbook-schema\";\nimport { XlsxReader } from \"./reader/xlsx-reader\";\nimport { XlsxWriter } from \"./writer/xlsx-writer\";\nimport { SheetDiff } from \"./ops/sheet-diff\";\nimport { SheetOpSchema } from \"./ops/sheet-op-schema\";\nimport { SheetReducer } from \"./ops/sheet-reducer\";\nimport type { SheetOp } from \"./ops/types\";\nimport toolSchema from \"./holy-sheet.schema.json\";\n\n/** This package's own version, pinned to package.json by `version.test.ts`. */\nexport const VERSION = \"2.4.2\";\n\ntype Any = any;\n\nfunction toU8(input: Uint8Array | ArrayBuffer): Uint8Array {\n return input instanceof Uint8Array ? input : new Uint8Array(input);\n}\n\nfunction readSpreadsheet(bytes: Uint8Array, path: string | null): Record<string, unknown> {\n const { format, files } = FormatSniffer.sniff(bytes, path);\n const workbook = format === \"ods\" ? new OdsReader().readFiles(files) : new XlsxReader().readFiles(files);\n return WorkbookSchema.fromWorkbook(workbook);\n}\n\n/**\n * Agent — the structured-tool surface for Holy Sheet. Mirrors PHP `Agent`.\n * Universal methods are synchronous; file-touching methods (`write`,\n * `describe`-from-path) are async and Node-only (browsers have no sync FS).\n */\nexport const Agent = {\n /** Validate a schema without writing. Empty array = valid. */\n validate(schema: Any): ValidationError[] {\n return new Validator().validate(schema);\n },\n\n /** xlsx bytes without touching disk. Universal. Throws SchemaException if invalid. */\n toBytes(schema: Any): Uint8Array {\n new Validator().assert(schema);\n const workbook = new Normalizer().normalize(schema);\n return new XlsxWriter().toBytes(workbook);\n },\n\n /** Write a workbook to disk (Node only). Throws SchemaException if invalid. */\n async write(schema: Any, path: string): Promise<WriteResult> {\n new Validator().assert(schema);\n const workbook = new Normalizer().normalize(schema);\n const bytes = new XlsxWriter().toBytes(workbook);\n const fs = await import(\"node:fs\");\n fs.writeFileSync(path, bytes);\n return { path, bytes: bytes.length, sheets: workbook.sheets.length };\n },\n\n /** JSON Schema for LLM tool-use. */\n toolDefinition(): Record<string, unknown> {\n return toolSchema as Record<string, unknown>;\n },\n\n /**\n * Round-trip xlsx or ods bytes back to a schema. Universal. The format is\n * told apart by content, never by name, and both describe to the same\n * schema. Throws `UnsupportedFormatException` for anything else.\n */\n read(input: Uint8Array | ArrayBuffer): Record<string, unknown> {\n return readSpreadsheet(toU8(input), null);\n },\n\n /** Round-trip an xlsx or ods file on disk back to a schema (Node only). */\n async describe(path: string): Promise<Record<string, unknown>> {\n const fs = await import(\"node:fs\");\n if (!fs.existsSync(path)) return { error: \"not_found\", path };\n const bytes = fs.readFileSync(path);\n return readSpreadsheet(new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength), path);\n },\n\n /** Validate + conservative repairs in one call. */\n validateAndRepair(schema: Any): RepairResult {\n return new Validator().validateAndRepair(schema);\n },\n\n /** Build a schema from a flat array of rows (+ optional headers). */\n fromArray(\n rows: Any[][],\n headers: string[] | null = null,\n sheetName = \"Sheet 1\",\n options: BuilderOptions = {},\n ): HolySheetSchema {\n return ArrayBuilder.build(rows, headers, sheetName, options);\n },\n\n /** Build a schema from CSV content (read files yourself in Node). */\n fromCsv(csv: string, options: BuilderOptions = {}): HolySheetSchema {\n return CsvBuilder.build(csv, options);\n },\n\n /** Evaluate every formula and report Excel-style errors. Empty array = clean. */\n lint(schema: Any): FormulaProblem[] {\n return new FormulaLinter().lint(schema);\n },\n\n /**\n * The ops that turn schema `a` into schema `b`. Mirrors PHP `Agent::diff`, and\n * gives the same ops in the same order for the same inputs.\n *\n * - `reduce(a, diff(a, b))` equals `b` (key order aside).\n * - Schemas that write the same workbook diff to `[]`, so\n * `diff(s, read(toBytes(s)))` is `[]`: a save without a change records\n * nothing.\n * - One changed cell is one `set_cell`; an inserted row is one\n * `insert_rows` plus its cells.\n *\n * Store `diff(newer, older)` to keep a version as the ops that restore it.\n * Both schemas must be valid: the \"same workbook\" check writes them.\n */\n diff(a: Any, b: Any): SheetOp[] {\n return SheetDiff.diff(a, b);\n },\n\n /**\n * Apply one op, or a list of them, to a schema; returns a new schema and never\n * modifies the input. An op naming a sheet that is not there is skipped.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reduce(schema: Any, opOrOps: SheetOp | readonly SheetOp[]): Record<string, any> {\n return SheetReducer.applyAll(schema, isOpList(opOrOps) ? Object.values(opOrOps) : [opOrOps]);\n },\n\n /**\n * JSON Schema for one op. `set_cell`, `set_range` and `set_workbook` are\n * fancy-sheets' `SheetOp` shapes.\n */\n opSchema(): Record<string, unknown> {\n return SheetOpSchema.jsonSchema();\n },\n\n /**\n * Whether two schemas write the same workbook: a columns/rows sheet and the\n * cell map it becomes are equivalent, and so are a schema without\n * `meta.created` and its written copy.\n */\n equivalent(a: Any, b: Any): boolean {\n return SheetDiff.equivalent(a, b);\n },\n\n version(): string {\n return VERSION;\n },\n};\n\n/**\n * PHP's `$opOrOps === [] || array_is_list($opOrOps)`: an array, or an object\n * keyed exactly \"0\"..\"n-1\" (which is how PHP sees `{}` too).\n */\nfunction isOpList(opOrOps: unknown): boolean {\n if (Array.isArray(opOrOps)) return true;\n if (typeof opOrOps !== \"object\" || opOrOps === null) return false;\n return Object.keys(opOrOps).every((key, i) => key === String(i));\n}\n","import { Agent, VERSION } from \"./agent\";\nimport type {\n BuilderOptions,\n FormulaProblem,\n HolySheetSchema,\n RepairResult,\n ValidationError,\n WriteResult,\n} from \"./schema/types\";\n\ntype Any = any;\n\n/**\n * Holy Sheet — instance entry point mirroring PHP `HolySheet`. Thin wrappers\n * over `Agent`. Provided for parity / DI ergonomics; most callers use `Agent`.\n */\nexport class HolySheet {\n static readonly VERSION = VERSION;\n\n validate(schema: Any): ValidationError[] {\n return Agent.validate(schema);\n }\n toBytes(schema: Any): Uint8Array {\n return Agent.toBytes(schema);\n }\n write(schema: Any, path: string): Promise<WriteResult> {\n return Agent.write(schema, path);\n }\n toolDefinition(): Record<string, unknown> {\n return Agent.toolDefinition();\n }\n read(input: Uint8Array | ArrayBuffer): Record<string, unknown> {\n return Agent.read(input);\n }\n describe(path: string): Promise<Record<string, unknown>> {\n return Agent.describe(path);\n }\n validateAndRepair(schema: Any): RepairResult {\n return Agent.validateAndRepair(schema);\n }\n fromArray(\n rows: Any[][],\n headers: string[] | null = null,\n sheetName = \"Sheet 1\",\n options: BuilderOptions = {},\n ): HolySheetSchema {\n return Agent.fromArray(rows, headers, sheetName, options);\n }\n fromCsv(csv: string, options: BuilderOptions = {}): HolySheetSchema {\n return Agent.fromCsv(csv, options);\n }\n lint(schema: Any): FormulaProblem[] {\n return Agent.lint(schema);\n }\n getVersion(): string {\n return VERSION;\n }\n\n static version(): string {\n return VERSION;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/util.ts","../src/schema/inference.ts","../src/helpers/array-builder.ts","../src/helpers/csv-builder.ts","../src/workbook/cell-address.ts","../src/workbook/cell.ts","../src/schema/column-widths.ts","../src/workbook/cell-comment.ts","../src/workbook/cell-format.ts","../src/workbook/merged-region.ts","../src/workbook/sheet.ts","../src/workbook/workbook.ts","../src/writer/format/date-converter.ts","../src/schema/theme.ts","../src/schema/normalizer.ts","../src/schema/formula-linter.ts","../src/exceptions.ts","../src/schema/repairer.ts","../src/schema/validator.ts","../src/zip/crc32.ts","../src/zip/zip-writer.ts","../src/zip/inflate.ts","../src/zip/zip-reader.ts","../src/reader/ods/ns.ts","../src/reader/format-sniffer.ts","../src/reader/ods/ods-formula.ts","../src/reader/format/num-fmt-parser.ts","../src/reader/ods/ods-styles.ts","../src/reader/ods/ods-text.ts","../src/reader/format/date-inverter.ts","../src/reader/workbook-schema.ts","../src/reader/xml.ts","../src/reader/ods-reader.ts","../src/reader/comments-parser.ts","../src/reader/rels-parser.ts","../src/reader/shared-strings-parser.ts","../src/reader/styles-parser.ts","../src/reader/worksheet-parser.ts","../src/reader/xlsx-reader.ts","../src/xml.ts","../src/writer/format/num-fmt-builder.ts","../src/writer/styles-registry.ts","../src/writer/xlsx-writer.ts","../src/ops/php.ts","../src/ops/sheet-op-schema.ts","../src/ops/sheet-reducer.ts","../src/ops/sheet-diff.ts","../src/holy-sheet.schema.json","../src/agent.ts","../src/holy-sheet.ts"],"names":["sheetName","quote","color","error","first","ISO_DATE","VALID_THEMES","part","decoder","el","has","lines","serial","end","border","hex","encoder","v","phpInt","phpTrim","position","at","i","j"],"mappings":"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","file":"index.js","sourcesContent":["/** Shared low-level helpers that mirror PHP's loose numeric semantics. */\n\n/** PHP `is_numeric` (approx): optional leading whitespace, sign, int/float, exponent. */\nexport function isNumericString(v: unknown): boolean {\n if (typeof v === \"number\") return Number.isFinite(v);\n if (typeof v !== \"string\") return false;\n return /^\\s*[+-]?(\\d+(\\.\\d+)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(v);\n}\n\n/**\n * Coerce a numeric string the way PHP does.\n *\n * This used to be `v.includes(\".\") ? parseFloat(v) : parseInt(v, 10)`, on the\n * theory that it mirrored PHP's `(float)`/`(int)`. It does not. `parseInt`\n * stops at the first character that is not a digit, so it reads \"1e5\" as 1 and\n * throws the exponent away, while PHP has parsed exponent notation in numeric\n * strings since PHP 7 and says 100000. Every value written as \"1e5\", \"2E-3\" or\n * \"1.5e3\" therefore landed in the sheet as a different number depending on\n * which backend wrote it.\n *\n * `Number` is what the rest of this package already uses for exactly this\n * (see `FormulaLinter.coerceNumber`) — the two disagreed with each other, not\n * just with PHP.\n *\n * The float path is deliberate for integers too: PHP's `(int)` cast CLAMPS at\n * PHP_INT_MAX, so `(int) \"1e21\"` is 9223372036854775807 — a number nobody\n * wrote. Both engines now take the float path and both say 1e21. The emitted\n * `<v>` is unchanged for integral values, because `formatFloat` trims the\n * fraction away.\n */\nexport function numericStringToNumber(v: string): number {\n return Number(v);\n}\n\n/**\n * Serialize a float the way the PHP writer does:\n * `rtrim(rtrim(number_format($v, 14, '.', ''), '0'), '.')`.\n *\n * `toFixed` alone cannot do this. It switches to exponential notation at 1e21,\n * and the trailing-zero trim then chewed on the EXPONENT rather than a\n * fraction:\n *\n * (1e300).toFixed(14) === \"1e+300\"\n * \"1e+300\".replace(/0+$/, \"\") === \"1e+3\"\n *\n * so 1e300 was written to the sheet as 1e3. Not a crash and not invalid XML —\n * simply a different number, silently, in a file someone opens later and\n * believes. At 1e21 exactly it produced `<v>1e+21</v>`, which is not valid cell\n * content at all. PHP's `number_format` has no exponential mode and was right\n * throughout.\n *\n * Above 1e21 every double is an integer, so `BigInt` gives the exact digits\n * PHP prints — verified against it, including that 1e300 expands to\n * 1000000000000000052504760… and not to a 1 with 300 zeros.\n */\nexport function formatFloat(v: number): string {\n // NaN and Infinity have no `<v>` representation; \"NaN\" in a cell is a\n // corrupt sheet. PHP's number_format yields 0 for both, so match it.\n if (!Number.isFinite(v)) return \"0\";\n\n let s = Math.abs(v) >= 1e21 ? BigInt(v).toString() : v.toFixed(14);\n\n // Only ever trim a FRACTION. The old unconditional /0+$/ is what turned an\n // exponent into a smaller exponent, and it would equally have eaten the\n // trailing zeros of an integer like 1200 had toFixed not always emitted a\n // decimal point.\n if (s.includes(\".\")) s = s.replace(/0+$/, \"\").replace(/\\.$/, \"\");\n\n return s === \"\" || s === \"-0\" ? \"0\" : s;\n}\n\n/** PHP-style debug type name, used by the validator's `got` field. */\nexport function typeOf(value: unknown): string {\n if (value === null || value === undefined) return \"null\";\n if (Array.isArray(value)) return \"array\";\n switch (typeof value) {\n case \"object\":\n return \"object\";\n case \"boolean\":\n return \"bool\";\n case \"number\":\n return Number.isInteger(value) ? \"int\" : \"float\";\n case \"string\":\n return \"string\";\n default:\n return typeof value;\n }\n}\n\n/**\n * True for a plain object map (sparse cells / CellData), false for arrays/primitives.\n * Narrows to `Record<string, any>` because the input is loose agent JSON — the\n * Validator, not the type system, is the gate.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isPlainObject(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { isNumericString } from \"../util\";\nimport type { BuilderOptions, ColumnSchema } from \"./types\";\n\n/** Type inference for tabular data → column types. Mirrors PHP `Schema\\Inference`. */\nconst SAMPLE_SIZE = 50;\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst ISO_DATETIME = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?$/;\nconst HEADER_INTEGER = /(^|[\\s_])(count|qty|quantity|num|number|id|n)([\\s_]|$)/i;\nconst HEADER_CURRENCY = /(price|amount|cost|revenue|fee|total|salary|budget|balance)/i;\nconst HEADER_PERCENT = /(rate|percent|growth|yoy|margin|share|ratio)/i;\n\ntype Any = any;\n\nexport const Inference = {\n detect(columnValues: unknown[], headerName: string, options: BuilderOptions = {}): ColumnSchema {\n const sample = nonNullSample(columnValues);\n\n if (sample.length === 0) return { header: headerName, type: \"auto\" };\n\n if (allBoolean(sample)) return { header: headerName, type: \"boolean\" };\n\n const allNum = allNumeric(sample);\n const allInRange = allNum && allInRange01(sample);\n const allInt = allNum && allInteger(sample);\n const allDate = allMatch(sample, ISO_DATE);\n const allDateTime = allMatch(sample, ISO_DATETIME);\n\n if (allDate) return { header: headerName, type: \"date\" };\n if (allDateTime) return { header: headerName, type: \"datetime\" };\n\n if (allNum) {\n if (HEADER_PERCENT.test(headerName) && allInRange) {\n return { header: headerName, type: \"percent\", decimals: detectDecimals(sample) || 1 };\n }\n if (HEADER_CURRENCY.test(headerName)) {\n return {\n header: headerName,\n type: \"currency\",\n currency: options.currency ?? \"USD\",\n decimals: detectDecimals(sample) ?? undefined,\n } as ColumnSchema;\n }\n if (HEADER_INTEGER.test(headerName) && allInt) {\n return { header: headerName, type: \"integer\" };\n }\n if (allInt) return { header: headerName, type: \"integer\" };\n\n const col: ColumnSchema = { header: headerName, type: \"number\" };\n const decimals = detectDecimals(sample);\n if (decimals !== null && decimals > 0) col.decimals = decimals;\n return col;\n }\n\n if (allStringish(sample)) return { header: headerName, type: \"string\" };\n\n return { header: headerName, type: \"auto\" };\n },\n};\n\nfunction nonNullSample(values: unknown[]): unknown[] {\n const out: unknown[] = [];\n for (const v of values) {\n if (v === null || v === undefined) continue;\n out.push(v);\n if (out.length >= SAMPLE_SIZE) break;\n }\n return out;\n}\n\nfunction allBoolean(sample: unknown[]): boolean {\n return sample.every((v) => typeof v === \"boolean\");\n}\n\nfunction allNumeric(sample: unknown[]): boolean {\n return sample.every((v) => {\n if (typeof v === \"boolean\") return false;\n if (typeof v === \"number\") return Number.isFinite(v);\n return typeof v === \"string\" && isNumericString(v);\n });\n}\n\nfunction allInteger(sample: unknown[]): boolean {\n return sample.every((v) => {\n if (typeof v === \"number\") return Number.isInteger(v);\n return typeof v === \"string\" && /^-?\\d+$/.test(v);\n });\n}\n\nfunction allInRange01(sample: unknown[]): boolean {\n return sample.every((v) => {\n const f = Number(v as Any);\n return f >= 0 && f <= 1;\n });\n}\n\nfunction detectDecimals(sample: unknown[]): number | null {\n let max = 0;\n let sawFloat = false;\n for (const v of sample) {\n const s = typeof v === \"string\" ? v : String(v);\n if (s.includes(\".\")) {\n sawFloat = true;\n const frac = (s.split(\".\", 2)[1] ?? \"\").replace(/0+$/, \"\");\n if (frac.length > max) max = frac.length;\n }\n }\n if (!sawFloat) return 0;\n return Math.max(max, 2);\n}\n\nfunction allMatch(sample: unknown[], regex: RegExp): boolean {\n return sample.every((v) => typeof v === \"string\" && regex.test(v));\n}\n\nfunction allStringish(sample: unknown[]): boolean {\n return sample.every((v) => typeof v === \"string\");\n}\n","import { Inference } from \"../schema/inference\";\nimport type { BuilderOptions, ColumnSchema, HolySheetSchema, SheetSchema } from \"../schema/types\";\n\ntype Any = any;\n\n/**\n * Flat rows (+ optional headers) → Holy Sheet schema with inferred column types.\n * Mirrors PHP `Helpers\\ArrayBuilder`.\n */\nexport const ArrayBuilder = {\n build(\n rows: Any[][],\n headers: string[] | null = null,\n sheetName = \"Sheet 1\",\n options: BuilderOptions = {},\n ): HolySheetSchema {\n let hdrs = headers;\n let data = rows;\n if (hdrs === null) {\n if (rows.length === 0) return wrap([], [], sheetName, options);\n hdrs = (rows[0] ?? []).map((v) => String(v));\n data = rows.slice(1);\n }\n const columns = inferColumns(data, hdrs, options);\n return wrap(columns, data, sheetName, options);\n },\n};\n\nfunction inferColumns(rows: Any[][], headers: string[], options: BuilderOptions): ColumnSchema[] {\n return headers.map((headerName, i) => {\n const columnValues = rows.map((row) => row[i] ?? null);\n return Inference.detect(columnValues, String(headerName), options);\n });\n}\n\nfunction wrap(\n columns: ColumnSchema[],\n rows: Any[][],\n sheetName: string,\n options: BuilderOptions,\n): HolySheetSchema {\n const sheet: SheetSchema = { name: sheetName, columns, rows };\n if (options.theme !== undefined) sheet.theme = options.theme;\n if (options.totals && typeof options.totals === \"object\") sheet.totals = options.totals;\n if (options.frozenRows !== undefined) sheet.frozenRows = Math.trunc(Number(options.frozenRows));\n if (options.frozenCols !== undefined) sheet.frozenCols = Math.trunc(Number(options.frozenCols));\n return { sheets: [sheet] };\n}\n","import { isNumericString, numericStringToNumber } from \"../util\";\nimport type { BuilderOptions, HolySheetSchema } from \"../schema/types\";\nimport { ArrayBuilder } from \"./array-builder\";\n\n/**\n * CSV string → Holy Sheet schema. Mirrors PHP `Helpers\\CsvBuilder`, but takes\n * CSV *content* (isomorphic). To convert a file in Node, read it yourself and\n * pass the string. First row is treated as headers.\n */\nexport const CsvBuilder = {\n build(csv: string, options: BuilderOptions = {}): HolySheetSchema {\n const delimiter = options.delimiter ?? \",\";\n const enclosure = options.enclosure ?? '\"';\n const sheetName = options.sheetName ?? \"Sheet 1\";\n\n const rows = parseRows(csv, delimiter, enclosure);\n\n if (rows.length === 0) {\n return { sheets: [{ name: sheetName, columns: [], rows: [] }] };\n }\n\n const headers = rows[0]!.map((v) => String(v));\n const dataRows: (string | number)[][] = rows.slice(1).map((row) =>\n row.map((cell) => (isNumericString(cell) ? numericStringToNumber(cell) : cell)),\n );\n\n return ArrayBuilder.build(dataRows, headers, sheetName, options);\n },\n};\n\n/** RFC-4180-ish CSV parser: quoted fields, doubled quotes, embedded newlines. */\nfunction parseRows(csv: string, delimiter: string, quote: string): string[][] {\n const rows: string[][] = [];\n let field = \"\";\n let row: string[] = [];\n let inQuotes = false;\n let started = false; // did this row have any content/field?\n\n const pushField = (): void => {\n row.push(field);\n field = \"\";\n started = true;\n };\n const pushRow = (): void => {\n pushField();\n rows.push(row);\n row = [];\n started = false;\n };\n\n for (let i = 0; i < csv.length; i++) {\n const ch = csv[i]!;\n if (inQuotes) {\n if (ch === quote) {\n if (csv[i + 1] === quote) {\n field += quote;\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n field += ch;\n }\n continue;\n }\n if (ch === quote) {\n inQuotes = true;\n started = true;\n continue;\n }\n if (ch === delimiter) {\n pushField();\n continue;\n }\n if (ch === \"\\r\") {\n if (csv[i + 1] === \"\\n\") i++;\n pushRow();\n continue;\n }\n if (ch === \"\\n\") {\n pushRow();\n continue;\n }\n field += ch;\n started = true;\n }\n // trailing field/row (skip a purely-empty trailing line)\n if (field !== \"\" || row.length > 0 || started) pushRow();\n\n // Drop blank lines (a single empty field), matching fgetcsv's blank-line skip.\n return rows.filter((r) => !(r.length === 1 && r[0] === \"\"));\n}\n","/**\n * A1 cell address utilities — column-letter ↔ 0-based index conversion,\n * address parsing. Mirrors PHP `Workbook\\CellAddress`.\n */\nexport const CellAddress = {\n /** 0-based column index → Excel-style letters. */\n letter(index: number): string {\n if (index < 0) {\n throw new Error(`[holy-sheet] column index must be ≥ 0, got ${index}`);\n }\n let letters = \"\";\n let n = index;\n do {\n letters = String.fromCharCode(65 + (n % 26)) + letters;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return letters;\n },\n\n /** Column-letters → 0-based index. */\n index(letters: string): number {\n const up = letters.trim().toUpperCase();\n if (up === \"\" || !/^[A-Z]+$/.test(up)) {\n throw new Error(`[holy-sheet] invalid column letters: '${up}'`);\n }\n let idx = 0;\n for (let i = 0; i < up.length; i++) {\n idx = idx * 26 + (up.charCodeAt(i) - 64);\n }\n return idx - 1;\n },\n\n /** Parse an A1 address into [columnIndex, rowNumber] (1-based row), or null. */\n parse(address: string): [number, number] | null {\n const m = /^([A-Z]+)(\\d+)$/.exec(address.trim().toUpperCase());\n if (!m) return null;\n return [CellAddress.index(m[1]!), parseInt(m[2]!, 10)];\n },\n};\n","import type { CellPrimitive } from \"../schema/types\";\nimport type { CellComment } from \"./cell-comment\";\nimport type { CellFormat } from \"./cell-format\";\n\nexport type ExcelType = \"str\" | \"inlineStr\" | \"b\" | \"n\";\n\n/** A single cell. Mirrors PHP `Workbook\\Cell`. */\nexport class Cell {\n constructor(\n readonly address: string,\n readonly value: CellPrimitive,\n readonly formula: string | null = null,\n readonly format: CellFormat | null = null,\n readonly comment: CellComment | null = null,\n readonly cachedValue: CellPrimitive = null,\n ) {}\n\n excelType(): ExcelType {\n if (this.formula !== null) return \"str\";\n if (typeof this.value === \"string\") return \"inlineStr\";\n if (typeof this.value === \"boolean\") return \"b\";\n return \"n\";\n }\n}\n","import { CellAddress } from \"../workbook/cell-address\";\n\n/**\n * What a `columnWidths` entry may be — one rule for the validator, the repairer\n * and the normalizer, and the same rule as PHP `HolySheet\\Schema\\ColumnWidths`\n * (holy-sheet 2.3.4) and the Python port.\n *\n * - A KEY is a 0-based column index, 0 to {@link ColumnWidths.MAX_INDEX}\n * (Excel's last column, XFD): a string of one to five digits. JavaScript object\n * keys are always strings; an integer key from an array reads as its digits.\n * - A WIDTH is a non-negative finite number, or a string of digits with an\n * optional decimal part (`\"120\"`, `\"80.5\"`).\n *\n * Before 2.4.3 this writer turned a key `\"abc\"` into `NaN` with `parseInt` and\n * wrote a NaN column; PHP overwrote column A and Python raised.\n */\nexport const ColumnWidths = {\n MAX_INDEX: 16383,\n\n index(key: unknown): number | null {\n if (typeof key === \"number\") {\n return Number.isInteger(key) && key >= 0 && key <= ColumnWidths.MAX_INDEX ? key : null;\n }\n if (typeof key === \"string\" && /^[0-9]{1,5}$/.test(key)) {\n const index = parseInt(key, 10);\n return index <= ColumnWidths.MAX_INDEX ? index : null;\n }\n return null;\n },\n\n width(px: unknown): number | null {\n if (typeof px === \"number\") {\n return Number.isFinite(px) && px >= 0 ? px : null;\n }\n if (typeof px === \"string\" && /^[0-9]+(\\.[0-9]+)?$/.test(px)) {\n return Number(px);\n }\n return null;\n },\n\n /**\n * A column letter key (`\"B\"`, `\"aa\"`) as an index, for repair only. One or two\n * letters (A to ZZ): a longer run like `\"abc\"` is more likely a mistake than\n * column ABC, and a repair must not guess.\n */\n fromLetters(key: unknown): number | null {\n if (typeof key !== \"string\" || !/^[A-Za-z]{1,2}$/.test(key.trim())) return null;\n return CellAddress.index(key.trim());\n },\n};\n","export class CellComment {\n constructor(\n readonly text: string,\n readonly author: string | null = null,\n readonly color: string | null = null,\n ) {}\n}\n","import type { CellFormatInput, DisplayFormat } from \"../schema/types\";\n\nexport interface CellFormatProps {\n bold?: boolean;\n italic?: boolean;\n textAlign?: string | null;\n displayFormat?: DisplayFormat | null;\n decimals?: number | null;\n color?: string | null;\n backgroundColor?: string | null;\n fontSize?: number | null;\n borderTop?: string | null;\n borderRight?: string | null;\n borderBottom?: string | null;\n borderLeft?: string | null;\n currency?: string | null;\n}\n\n/**\n * Per-cell format. The writer's StylesRegistry deduplicates equal formats.\n * Mirrors PHP `Workbook\\CellFormat` (PHP named args → an options object here).\n */\nexport class CellFormat {\n readonly bold: boolean;\n readonly italic: boolean;\n readonly textAlign: string | null;\n readonly displayFormat: DisplayFormat | null;\n readonly decimals: number | null;\n readonly color: string | null;\n readonly backgroundColor: string | null;\n readonly fontSize: number | null;\n readonly borderTop: string | null;\n readonly borderRight: string | null;\n readonly borderBottom: string | null;\n readonly borderLeft: string | null;\n readonly currency: string | null;\n\n constructor(p: CellFormatProps = {}) {\n this.bold = p.bold ?? false;\n this.italic = p.italic ?? false;\n this.textAlign = p.textAlign ?? null;\n this.displayFormat = p.displayFormat ?? null;\n this.decimals = p.decimals ?? null;\n this.color = p.color ?? null;\n this.backgroundColor = p.backgroundColor ?? null;\n this.fontSize = p.fontSize ?? null;\n this.borderTop = p.borderTop ?? null;\n this.borderRight = p.borderRight ?? null;\n this.borderBottom = p.borderBottom ?? null;\n this.borderLeft = p.borderLeft ?? null;\n this.currency = p.currency ?? null;\n }\n\n /** Stable dedup key (JSON of ordered fields — replaces PHP md5(serialize)). */\n key(): string {\n return JSON.stringify([\n this.bold,\n this.italic,\n this.textAlign,\n this.displayFormat,\n this.decimals,\n this.color,\n this.backgroundColor,\n this.fontSize,\n this.borderTop,\n this.borderRight,\n this.borderBottom,\n this.borderLeft,\n this.currency,\n ]);\n }\n\n isEmpty(): boolean {\n return (\n !this.bold &&\n !this.italic &&\n this.textAlign === null &&\n this.displayFormat === null &&\n this.decimals === null &&\n this.color === null &&\n this.backgroundColor === null &&\n this.fontSize === null &&\n this.borderTop === null &&\n this.borderRight === null &&\n this.borderBottom === null &&\n this.borderLeft === null &&\n this.currency === null\n );\n }\n\n static fromInput(a: CellFormatInput): CellFormat {\n return new CellFormat({\n bold: Boolean(a.bold ?? false),\n italic: Boolean(a.italic ?? false),\n textAlign: a.textAlign ?? null,\n displayFormat: a.displayFormat ?? null,\n decimals: a.decimals != null ? Math.trunc(a.decimals) : null,\n color: a.color ?? null,\n backgroundColor: a.backgroundColor ?? null,\n fontSize: a.fontSize != null ? Math.trunc(a.fontSize) : null,\n borderTop: a.borderTop ?? null,\n borderRight: a.borderRight ?? null,\n borderBottom: a.borderBottom ?? null,\n borderLeft: a.borderLeft ?? null,\n currency: a.currency ?? null,\n });\n }\n\n /** Merge another format on top of this one (other wins where set). */\n mergeWith(other: CellFormat | null): CellFormat {\n if (other === null) return this;\n return new CellFormat({\n bold: other.bold || this.bold,\n italic: other.italic || this.italic,\n textAlign: other.textAlign ?? this.textAlign,\n displayFormat: other.displayFormat ?? this.displayFormat,\n decimals: other.decimals ?? this.decimals,\n color: other.color ?? this.color,\n backgroundColor: other.backgroundColor ?? this.backgroundColor,\n fontSize: other.fontSize ?? this.fontSize,\n borderTop: other.borderTop ?? this.borderTop,\n borderRight: other.borderRight ?? this.borderRight,\n borderBottom: other.borderBottom ?? this.borderBottom,\n borderLeft: other.borderLeft ?? this.borderLeft,\n currency: other.currency ?? this.currency,\n });\n }\n}\n","export class MergedRegion {\n constructor(\n readonly start: string,\n readonly end: string,\n ) {}\n\n ref(): string {\n return `${this.start}:${this.end}`;\n }\n}\n","import type { Cell } from \"./cell\";\nimport type { CellComment } from \"./cell-comment\";\nimport type { MergedRegion } from \"./merged-region\";\n\n/** A worksheet. Mirrors PHP `Workbook\\Sheet`. Cells are an A1-keyed map. */\nexport class Sheet {\n constructor(\n readonly name: string,\n readonly cells: Map<string, Cell> = new Map(),\n readonly mergedRegions: MergedRegion[] = [],\n readonly columnWidths: Map<number, number> = new Map(),\n readonly frozenRows: number = 0,\n readonly frozenCols: number = 0,\n ) {}\n\n /** rowNumber → (colLetter → Cell), sorted by ascending row number. */\n rows(): Map<number, Map<string, Cell>> {\n const rows = new Map<number, Map<string, Cell>>();\n for (const [address, cell] of this.cells) {\n const m = /^([A-Z]+)(\\d+)$/.exec(address);\n if (!m) continue;\n const rowNum = parseInt(m[2]!, 10);\n let row = rows.get(rowNum);\n if (!row) {\n row = new Map();\n rows.set(rowNum, row);\n }\n row.set(m[1]!, cell);\n }\n return new Map([...rows.entries()].sort((a, b) => a[0] - b[0]));\n }\n\n hasComments(): boolean {\n for (const c of this.cells.values()) if (c.comment !== null) return true;\n return false;\n }\n\n comments(): { address: string; comment: CellComment }[] {\n const out: { address: string; comment: CellComment }[] = [];\n for (const c of this.cells.values()) {\n if (c.comment !== null) out.push({ address: c.address, comment: c.comment });\n }\n return out;\n }\n}\n","import type { Sheet } from \"./sheet\";\n\n/** Internal canonical workbook value object. Mirrors PHP `Workbook\\Workbook`. */\nexport class Workbook {\n constructor(\n readonly sheets: Sheet[],\n readonly meta: Record<string, unknown> = {},\n ) {}\n}\n","/**\n * ISO string / Date → Excel serial number. Mirrors PHP `Writer\\Format\\DateConverter`.\n * Excel epoch is anchored to 1899-12-30 (accommodating the legacy 1900 leap-year bug).\n */\n\nfunction parseToUtcMs(value: string): number | null {\n const s = value.trim();\n if (s === \"\") return null;\n const m =\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2})(?::(\\d{1,2})(?:\\.\\d+)?)?)?\\s*(Z|[+-]\\d{2}:?\\d{2})?$/.exec(\n s,\n );\n if (m) {\n const [, y, mo, d, h, mi, se, tz] = m;\n let ms = Date.UTC(+y!, +mo! - 1, +d!, h ? +h : 0, mi ? +mi : 0, se ? +se : 0);\n if (tz && tz !== \"Z\") {\n const sign = tz[0] === \"-\" ? -1 : 1;\n const clean = tz.slice(1).replace(\":\", \"\");\n const offMin = sign * (parseInt(clean.slice(0, 2), 10) * 60 + parseInt(clean.slice(2, 4) || \"0\", 10));\n ms -= offMin * 60000;\n }\n return ms;\n }\n const fallback = Date.parse(s);\n return Number.isNaN(fallback) ? null : fallback;\n}\n\nexport const DateConverter = {\n toSerial(value: string | Date, includeTime = false): number {\n const ts = value instanceof Date ? value.getTime() : parseToUtcMs(value);\n if (ts === null) return 0;\n const epoch = Date.UTC(1899, 11, 30, 0, 0, 0);\n let days = (ts - epoch) / 86400000;\n if (!includeTime) days = Math.floor(days);\n return days;\n },\n};\n","import { CellFormat } from \"../workbook/cell-format\";\n\n/** Theme presets — pre-baked CellFormat sets. Mirrors PHP `Schema\\Theme`. */\nexport class Theme {\n constructor(readonly key: string) {}\n\n headerFormat(): CellFormat | null {\n switch (this.key) {\n case \"default\":\n case \"business\":\n return new CellFormat({\n bold: true,\n color: \"#FFFFFF\",\n backgroundColor: this.key === \"business\" ? \"#1F2937\" : \"#374151\",\n });\n case \"minimal\":\n return new CellFormat({ bold: true, borderBottom: \"#000000\" });\n default:\n return null;\n }\n }\n\n dataFormat(rowIndexZeroBased: number): CellFormat | null {\n if ((this.key === \"default\" || this.key === \"business\") && rowIndexZeroBased % 2 === 1) {\n return new CellFormat({ backgroundColor: \"#F3F4F6\" });\n }\n return null;\n }\n\n totalsFormat(): CellFormat | null {\n switch (this.key) {\n case \"default\":\n case \"business\":\n case \"minimal\":\n return new CellFormat({ bold: true, borderTop: \"#000000\" });\n default:\n return null;\n }\n }\n}\n","import { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport { ColumnWidths } from \"./column-widths\";\nimport { CellComment } from \"../workbook/cell-comment\";\nimport { CellFormat } from \"../workbook/cell-format\";\nimport { MergedRegion } from \"../workbook/merged-region\";\nimport { Sheet } from \"../workbook/sheet\";\nimport { Workbook } from \"../workbook/workbook\";\nimport { DateConverter } from \"../writer/format/date-converter\";\nimport { isNumericString, isPlainObject, numericStringToNumber } from \"../util\";\nimport type { CellPrimitive } from \"./types\";\nimport { Theme } from \"./theme\";\n\ntype Any = any; // input is loose agent JSON\n\n/** Schema → canonical Workbook. Mirrors PHP `Schema\\Normalizer`. */\nexport class Normalizer {\n normalize(schema: Any): Workbook {\n const sheets: Sheet[] = [];\n for (const sheetSchema of schema.sheets as Any[]) {\n sheets.push(this.normalizeSheet(sheetSchema));\n }\n return new Workbook(sheets, (schema.meta as Record<string, unknown>) ?? {});\n }\n\n private normalizeSheet(sheet: Any): Sheet {\n const name = String(sheet.name);\n\n // NOTE: there is no separate \"cells-only\" path. A sheet with no columns\n // and no rows builds an empty table below and then takes the overlay, which\n // is the same code the combined case runs.\n //\n // It USED to return here the moment `cells` was set, and that early return\n // silently discarded `columns`, `rows`, `totals` and `theme` — a four-row\n // table with one styled title cell wrote a one-cell workbook, while\n // `validate()` reported no errors because the validator explicitly permits\n // both together. The PHP twin had the identical bug in the identical place;\n // see `Schema/Normalizer.php`.\n const cells = new Map<string, Cell>();\n const columns: Any[] = sheet.columns ?? [];\n const rows: Any[] = sheet.rows ?? [];\n const themeKey = sheet.theme ?? \"default\";\n const theme = new Theme(themeKey);\n let headerOffset = 0;\n\n const columnFormats = new Map<number, CellFormat | null>();\n const columnByHeader = new Map<string, number>();\n columns.forEach((columnDef, colIdx) => {\n columnFormats.set(colIdx, this.columnFormat(columnDef));\n if (isPlainObject(columnDef) && columnDef.header !== undefined) {\n columnByHeader.set(String(columnDef.header), colIdx);\n }\n });\n\n if (columns.length > 0) {\n columns.forEach((columnDef, col) => {\n const address = CellAddress.letter(col) + \"1\";\n const header = isPlainObject(columnDef) ? (columnDef.header ?? \"\") : String(columnDef);\n cells.set(address, new Cell(address, String(header), null, theme.headerFormat()));\n });\n headerOffset = 1;\n }\n\n rows.forEach((row: Any[], r) => {\n row.forEach((value, c) => {\n const address = CellAddress.letter(c) + (r + 1 + headerOffset);\n const columnFormat = columnFormats.get(c) ?? null;\n const rowBand = theme.dataFormat(r);\n const merged =\n rowBand !== null ? (columnFormat ? columnFormat.mergeWith(rowBand) : rowBand) : columnFormat;\n cells.set(address, this.buildCell(address, value, merged));\n });\n });\n\n if (\n sheet.totals &&\n isPlainObject(sheet.totals) &&\n Object.keys(sheet.totals).length > 0 &&\n rows.length > 0 &&\n columns.length > 0\n ) {\n const totalsRow = rows.length + 1 + headerOffset;\n const totalsTheme = theme.totalsFormat();\n const labelAddr = CellAddress.letter(0) + totalsRow;\n cells.set(labelAddr, new Cell(labelAddr, \"Total\", null, totalsTheme));\n\n for (const [headerKey, aggOp] of Object.entries(sheet.totals as Record<string, Any>)) {\n if (!columnByHeader.has(headerKey)) continue;\n const colIdx = columnByHeader.get(headerKey)!;\n const colLetter = CellAddress.letter(colIdx);\n const rangeStart = colLetter + (headerOffset + 1);\n const rangeEnd = colLetter + (rows.length + headerOffset);\n const func = String(aggOp).toUpperCase();\n if (![\"SUM\", \"AVG\", \"COUNT\", \"MIN\", \"MAX\"].includes(func)) continue;\n const excelFunc = func === \"AVG\" ? \"AVERAGE\" : func;\n const address = colLetter + totalsRow;\n const colFmt = columnFormats.get(colIdx) ?? null;\n const combined = colFmt ? colFmt.mergeWith(totalsTheme) : totalsTheme;\n cells.set(address, new Cell(address, null, `${excelFunc}(${rangeStart}:${rangeEnd})`, combined));\n }\n }\n\n // The overlay. Explicit cells win at their address; a format is MERGED\n // rather than swapped, so a cell that only sets `bold` keeps the theme's\n // banding and the column's currency format instead of dropping to bare.\n if (sheet.cells != null) {\n for (const [address, cell] of this.normalizeCellMap(sheet.cells)) {\n const beneath = cells.get(address);\n\n cells.set(\n address,\n beneath?.format\n ? new Cell(\n cell.address,\n cell.value,\n cell.formula,\n beneath.format.mergeWith(cell.format),\n cell.comment,\n cell.cachedValue,\n )\n : cell,\n );\n }\n }\n\n return new Sheet(\n name,\n cells,\n this.normalizeMerges(sheet.mergedRegions ?? []),\n this.normalizeColumnWidths(sheet.columnWidths ?? {}),\n toInt(sheet.frozenRows ?? 0),\n toInt(sheet.frozenCols ?? 0),\n );\n }\n\n private normalizeCellMap(map: Record<string, Any>): Map<string, Cell> {\n const cells = new Map<string, Cell>();\n for (const [address, cellData] of Object.entries(map)) {\n // A bare scalar cell, e.g. {A1: 42} or {A1: \"=SUM(B1:B5)\"}.\n //\n // Without this branch every non-object cell read as EMPTY: `cellData.value`\n // on a number is `undefined`, so `{A1: 42}` wrote a blank cell and a bare\n // formula string vanished outright — no error, just a hole in the sheet.\n // PHP has always had this branch; the port dropped it.\n if (!isPlainObject(cellData)) {\n const [bare, formula] = promoteFormula(cellData);\n cells.set(\n address,\n new Cell(address, formula !== null ? null : this.coerceValue(bare, null), formula),\n );\n continue;\n }\n\n const format = isPlainObject(cellData.format) ? CellFormat.fromInput(cellData.format) : null;\n // `comment` takes either a string or an object. The string form was\n // accepted by the validator and dropped here — the same silent-drop shape.\n const comment = isPlainObject(cellData.comment)\n ? new CellComment(\n String(cellData.comment.text ?? \"\"),\n cellData.comment.author ?? null,\n cellData.comment.color ?? null,\n )\n : typeof cellData.comment === \"string\"\n ? new CellComment(cellData.comment)\n : null;\n const rawValue = cellData?.value ?? null;\n cells.set(\n address,\n new Cell(\n address,\n this.coerceValue(rawValue, format),\n cellData?.formula ?? null,\n format,\n comment,\n cellData?.computedValue ?? null,\n ),\n );\n }\n return cells;\n }\n\n private normalizeMerges(list: Any[]): MergedRegion[] {\n const out: MergedRegion[] = [];\n for (const m of list) {\n if (m && m.start !== undefined && m.end !== undefined) {\n out.push(new MergedRegion(String(m.start), String(m.end)));\n }\n }\n return out;\n }\n\n private normalizeColumnWidths(widths: Record<string, Any>): Map<number, number> {\n const out = new Map<number, number>();\n for (const [key, px] of Object.entries(widths)) {\n // An entry that is not a column index and a width is skipped. `parseInt`\n // turned \"abc\" into NaN and wrote a NaN column (PHP 2.3.4 skips it too).\n const index = ColumnWidths.index(key);\n const width = ColumnWidths.width(px);\n if (index === null || width === null) continue;\n out.set(index, width);\n }\n return out;\n }\n\n private columnFormat(columnDef: Any): CellFormat | null {\n if (typeof columnDef === \"string\") return null;\n const type = columnDef.type ?? \"auto\";\n const decimals = columnDef.decimals != null ? toInt(columnDef.decimals) : null;\n const currency = columnDef.currency ?? null;\n\n switch (type) {\n case \"integer\":\n return new CellFormat({ displayFormat: \"number\", decimals: 0 });\n case \"number\":\n return decimals !== null ? new CellFormat({ displayFormat: \"number\", decimals }) : null;\n case \"percent\":\n return new CellFormat({ displayFormat: \"percentage\", decimals: decimals ?? 1 });\n case \"currency\":\n return new CellFormat({ displayFormat: \"currency\", decimals: decimals ?? 2, currency });\n case \"date\":\n return new CellFormat({ displayFormat: \"date\" });\n case \"datetime\":\n return new CellFormat({ displayFormat: \"datetime\" });\n default:\n return null;\n }\n }\n\n private buildCell(address: string, value: Any, columnFormat: CellFormat | null): Cell {\n if (isPlainObject(value)) {\n const cellFormat = isPlainObject(value.format) ? CellFormat.fromInput(value.format) : null;\n const merged = columnFormat ? columnFormat.mergeWith(cellFormat) : cellFormat;\n const comment = isPlainObject(value.comment)\n ? new CellComment(\n String(value.comment.text ?? \"\"),\n value.comment.author ?? null,\n value.comment.color ?? null,\n )\n : null;\n const rawValue = value.value ?? null;\n return new Cell(\n address,\n this.coerceValue(rawValue, merged),\n value.formula ?? null,\n merged,\n comment,\n value.computedValue ?? null,\n );\n }\n\n const [bare, formula] = promoteFormula(value);\n\n return new Cell(\n address,\n formula !== null ? null : this.coerceValue(bare, columnFormat),\n formula,\n columnFormat,\n );\n }\n\n private coerceValue(value: Any, format: CellFormat | null): CellPrimitive {\n if (value === null || value === undefined) return null;\n\n const df = format?.displayFormat;\n if (df === \"date\" || df === \"datetime\") {\n if (value instanceof Date || (typeof value === \"string\" && value.trim() !== \"\")) {\n return DateConverter.toSerial(value, df === \"datetime\");\n }\n }\n\n if (typeof value === \"string\" && isNumericString(value)) {\n return numericStringToNumber(value);\n }\n\n if (value instanceof Date) {\n return DateConverter.toSerial(value, true);\n }\n\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return String(value);\n }\n\n return value;\n }\n}\n\n/**\n * A bare string cell value beginning with \"=\" (e.g. \"=SUM(B2:B10)\") is an Excel\n * formula, not literal text — promote it to a real formula cell.\n *\n * Only *bare* strings promote. An object cell ({value: \"=x\"} or {formula: \"x\"})\n * is always taken as the caller's explicit intent, so {value: \"=literal\"} is the\n * escape hatch for a genuine leading-\"=\" string. Mirrors PHP\n * `Normalizer::promoteFormula`, which the port had omitted entirely: the same\n * schema produced a formula in PHP and the literal text \"=SUM(B2:B10)\" in Node.\n */\nfunction promoteFormula(value: Any): [Any, string | null] {\n if (typeof value === \"string\" && value.length > 1 && value[0] === \"=\") {\n return [null, value.slice(1)];\n }\n return [value, null];\n}\n\nfunction toInt(v: unknown): number {\n const n = Math.trunc(Number(v));\n return Number.isFinite(n) ? n : 0;\n}\n","import type { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { isNumericString } from \"../util\";\nimport { Normalizer } from \"./normalizer\";\nimport type { FormulaProblem } from \"./types\";\n\nconst ERR_VALUE = \"#VALUE!\";\nconst ERR_REF = \"#REF!\";\nconst ERR_NAME = \"#NAME?\";\nconst ERR_DIV0 = \"#DIV/0!\";\nconst ERR_CIRC = \"#CIRC!\";\n\n/**\n * A sheet qualifier, quoted ('My Sheet'!) or bare (Sheet2!). Group 1 is the name\n * as written, quotes included.\n */\nconst SHEET_QUALIFIER = \"('(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!\";\n\nclass LinterError extends Error {\n constructor(public errorCode: string) {\n super(errorCode);\n }\n}\n\ninterface Token {\n type: \"NUMBER\" | \"STRING\" | \"IDENT\" | \"SHEET\" | \"OP\";\n value: string;\n}\ninterface Cursor {\n tokens: Token[];\n pos: number;\n}\n\ntype Val = number | string | boolean | null | Val[];\n\n/**\n * Evaluates every formula and reports Excel-style errors. Mirrors PHP\n * `Schema\\FormulaLinter` rule-for-rule.\n */\nexport class FormulaLinter {\n private index = new Map<string, Cell>();\n private cache = new Map<string, Val>();\n /**\n * Every sheet name, keyed by its lower-cased form. Excel matches sheet names\n * without regard to case, and a reference to a sheet that is not here is\n * `#REF!` rather than a range of blanks.\n */\n private sheetNames = new Map<string, string>();\n\n lint(schema: unknown): FormulaProblem[] {\n const workbook = new Normalizer().normalize(schema);\n this.sheetNames = new Map(workbook.sheets.map((sheet) => [sheet.name.toLowerCase(), sheet.name]));\n this.index = this.buildIndex(workbook);\n this.cache = new Map();\n const issues: FormulaProblem[] = [];\n\n for (const sheet of workbook.sheets) {\n for (const [address, cell] of sheet.cells) {\n if (cell.formula === null) continue;\n const key = sheet.name + \"!\" + address;\n const result = this.evaluate(cell.formula, sheet.name, [key]);\n this.cache.set(key, result);\n\n if (this.isError(result)) {\n issues.push({\n sheet: sheet.name,\n address,\n formula: cell.formula,\n error: result as string,\n hint: this.hint(result as string, cell.formula, sheet.name),\n });\n }\n }\n }\n return issues;\n }\n\n private buildIndex(wb: Workbook): Map<string, Cell> {\n const index = new Map<string, Cell>();\n for (const sheet of wb.sheets) {\n for (const [address, cell] of sheet.cells) {\n index.set(sheet.name + \"!\" + address, cell);\n }\n }\n return index;\n }\n\n private isError(v: Val): boolean {\n return typeof v === \"string\" && v.length > 0 && v[0] === \"#\";\n }\n\n private evaluate(formula: string, defaultSheet: string, stack: string[]): Val {\n try {\n const c: Cursor = { tokens: this.tokenize(formula), pos: 0 };\n const result = this.parseExpr(c, defaultSheet, stack);\n if (c.pos < c.tokens.length) return ERR_NAME;\n return result;\n } catch (e) {\n if (e instanceof LinterError) return e.errorCode;\n return ERR_NAME;\n }\n }\n\n // ---- Tokenizer ----\n\n private tokenize(src: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n const len = src.length;\n const isSpace = (ch: string) => /\\s/.test(ch);\n const isDigit = (ch: string) => ch >= \"0\" && ch <= \"9\";\n const isAlpha = (ch: string) => /[A-Za-z]/.test(ch);\n const isAlnum = (ch: string) => /[A-Za-z0-9]/.test(ch);\n\n while (i < len) {\n const ch = src[i]!;\n if (isSpace(ch)) {\n i++;\n continue;\n }\n if (isDigit(ch) || (ch === \".\" && i + 1 < len && isDigit(src[i + 1]!))) {\n const start = i;\n while (i < len && (isDigit(src[i]!) || src[i] === \".\")) i++;\n tokens.push({ type: \"NUMBER\", value: src.slice(start, i) });\n continue;\n }\n if (ch === '\"') {\n i++;\n const start = i;\n while (i < len && src[i] !== '\"') i++;\n const value = src.slice(start, i);\n i++; // closing quote\n tokens.push({ type: \"STRING\", value });\n continue;\n }\n // Quoted sheet name: 'My Sheet', with Excel's '' for a literal quote.\n // Kept with its quotes; cleanSheetName() unwraps it. A quote that never\n // closes is a syntax error, not a name running to the end.\n if (ch === \"'\") {\n const start = i;\n i++;\n for (;;) {\n if (i >= len) throw new LinterError(ERR_NAME);\n if (src[i] === \"'\") {\n if (i + 1 < len && src[i + 1] === \"'\") {\n i += 2;\n continue;\n }\n i++;\n break;\n }\n i++;\n }\n tokens.push({ type: \"SHEET\", value: src.slice(start, i) });\n continue;\n }\n if (isAlpha(ch) || ch === \"_\" || ch === \"$\") {\n const start = i;\n while (i < len && (isAlnum(src[i]!) || src[i] === \"_\" || src[i] === \"$\" || src[i] === \".\")) i++;\n tokens.push({ type: \"IDENT\", value: src.slice(start, i) });\n continue;\n }\n if (i + 1 < len) {\n const two = src.slice(i, i + 2);\n if (two === \"<=\" || two === \">=\" || two === \"<>\") {\n tokens.push({ type: \"OP\", value: two });\n i += 2;\n continue;\n }\n }\n if (\"+-*/^%&=<>(),:!\".includes(ch)) {\n tokens.push({ type: \"OP\", value: ch });\n i++;\n continue;\n }\n throw new LinterError(ERR_NAME);\n }\n return tokens;\n }\n\n // ---- Parser (recursive descent) ----\n\n private peek(c: Cursor): Token | undefined {\n return c.tokens[c.pos];\n }\n private isOp(c: Cursor, ...vals: string[]): boolean {\n const t = c.tokens[c.pos];\n return !!t && t.type === \"OP\" && vals.includes(t.value);\n }\n\n private parseExpr(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseConcat(c, sheet, stack);\n while (this.isOp(c, \"=\", \"<\", \">\", \"<=\", \">=\", \"<>\")) {\n const op = c.tokens[c.pos]!.value;\n c.pos++;\n const right = this.parseConcat(c, sheet, stack);\n left = this.compare(left, right, op);\n }\n return left;\n }\n\n private parseConcat(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseArith(c, sheet, stack);\n while (this.isOp(c, \"&\")) {\n c.pos++;\n const right = this.parseArith(c, sheet, stack);\n left = this.coerceString(left) + this.coerceString(right);\n }\n return left;\n }\n\n private parseArith(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseTerm(c, sheet, stack);\n while (this.isOp(c, \"+\", \"-\")) {\n const op = c.tokens[c.pos]!.value;\n c.pos++;\n const right = this.parseTerm(c, sheet, stack);\n const a = this.coerceNumber(left);\n const b = this.coerceNumber(right);\n left = op === \"+\" ? a + b : a - b;\n }\n return left;\n }\n\n private parseTerm(c: Cursor, sheet: string, stack: string[]): Val {\n let left = this.parseUnary(c, sheet, stack);\n while (this.isOp(c, \"*\", \"/\", \"%\", \"^\")) {\n const op = c.tokens[c.pos]!.value;\n c.pos++;\n const right = this.parseUnary(c, sheet, stack);\n const a = this.coerceNumber(left);\n const b = this.coerceNumber(right);\n switch (op) {\n case \"*\":\n left = a * b;\n break;\n case \"/\":\n if (b === 0) throw new LinterError(ERR_DIV0);\n left = a / b;\n break;\n case \"%\":\n left = (a / 100.0) * b;\n break;\n case \"^\":\n left = a ** b;\n break;\n }\n }\n return left;\n }\n\n private parseUnary(c: Cursor, sheet: string, stack: string[]): Val {\n if (this.isOp(c, \"-\")) {\n c.pos++;\n const v = this.parseUnary(c, sheet, stack);\n return -this.coerceNumber(v);\n }\n if (this.isOp(c, \"+\")) {\n c.pos++;\n return this.parseUnary(c, sheet, stack);\n }\n return this.parsePrimary(c, sheet, stack);\n }\n\n private parsePrimary(c: Cursor, sheet: string, stack: string[]): Val {\n const tok = this.peek(c);\n if (!tok) throw new LinterError(ERR_NAME);\n\n if (tok.type === \"OP\" && tok.value === \"(\") {\n c.pos++;\n const val = this.parseExpr(c, sheet, stack);\n this.expectOp(c, \")\");\n return val;\n }\n\n if (tok.type === \"NUMBER\") {\n c.pos++;\n return parseFloat(tok.value);\n }\n if (tok.type === \"STRING\") {\n c.pos++;\n return tok.value;\n }\n\n // A quoted name is only ever a sheet qualifier. On its own it is not a\n // value, so it falls through to #NAME? below.\n if (tok.type === \"SHEET\" || tok.type === \"IDENT\") {\n const next = c.tokens[c.pos + 1];\n const next2 = c.tokens[c.pos + 2];\n // Sheet!Ref: (SHEET | IDENT) '!' IDENT\n if (next && next.type === \"OP\" && next.value === \"!\" && next2 && next2.type === \"IDENT\") {\n const sheetName = this.sheetNames.get(this.cleanSheetName(tok.value).toLowerCase());\n if (sheetName === undefined) throw new LinterError(ERR_REF);\n c.pos += 2;\n const startTok = c.tokens[c.pos]!.value;\n c.pos++;\n return this.resolveRefOrRange(startTok, sheetName, c, stack);\n }\n if (tok.type === \"SHEET\") throw new LinterError(ERR_NAME);\n // Function call\n if (next && next.type === \"OP\" && next.value === \"(\") {\n const name = tok.value.toUpperCase();\n c.pos += 2;\n const args: Val[] = [];\n if (!this.isOp(c, \")\")) {\n for (;;) {\n args.push(this.parseExpr(c, sheet, stack));\n if (this.isOp(c, \",\")) {\n c.pos++;\n continue;\n }\n break;\n }\n }\n this.expectOp(c, \")\");\n return this.callFunction(name, args);\n }\n // Boolean literals\n const upper = tok.value.toUpperCase();\n if (upper === \"TRUE\" || upper === \"FALSE\") {\n c.pos++;\n return upper === \"TRUE\";\n }\n // Bare cell reference\n c.pos++;\n return this.resolveRefOrRange(tok.value, sheet, c, stack);\n }\n\n throw new LinterError(ERR_NAME);\n }\n\n private resolveRefOrRange(startRef: string, defaultSheet: string, c: Cursor, stack: string[]): Val {\n const cleanStart = this.cleanRef(startRef);\n if (cleanStart === null) throw new LinterError(ERR_REF);\n\n const next = c.tokens[c.pos + 1];\n if (this.isOp(c, \":\") && next && next.type === \"IDENT\") {\n const endRef = next.value;\n c.pos += 2;\n const cleanEnd = this.cleanRef(endRef);\n if (cleanEnd === null) throw new LinterError(ERR_REF);\n return this.resolveRange(defaultSheet, cleanStart, cleanEnd, stack);\n }\n return this.resolveCell(defaultSheet, cleanStart, stack);\n }\n\n private cleanRef(ref: string): string | null {\n const r = ref.replace(/\\$/g, \"\").toUpperCase();\n return /^[A-Z]+\\d+$/.test(r) ? r : null;\n }\n\n /**\n * Unwrap the single quotes Excel puts around a sheet name that needs them,\n * and turn its doubled quote back into one: 'Q3 ''Final''' is Q3 'Final'.\n */\n private cleanSheetName(name: string): string {\n if (name.length >= 2 && name[0] === \"'\" && name[name.length - 1] === \"'\") {\n // split/join rather than replaceAll: the package targets a lib before ES2021.\n return name.slice(1, -1).split(\"''\").join(\"'\");\n }\n return name;\n }\n\n private resolveCell(sheet: string, a1: string, stack: string[]): Val {\n const key = sheet + \"!\" + a1;\n if (stack.includes(key)) return ERR_CIRC;\n if (this.cache.has(key)) return this.cache.get(key)!;\n const cell = this.index.get(key);\n if (!cell) return null;\n if (cell.formula !== null) {\n const result = this.evaluate(cell.formula, sheet, [...stack, key]);\n this.cache.set(key, result);\n return result;\n }\n return cell.value;\n }\n\n private resolveRange(sheet: string, start: string, end: string, stack: string[]): Val[] {\n const a = CellAddress.parse(start);\n const b = CellAddress.parse(end);\n if (a === null || b === null) throw new LinterError(ERR_REF);\n const col1 = Math.min(a[0], b[0]);\n const row1 = Math.min(a[1], b[1]);\n const col2 = Math.max(a[0], b[0]);\n const row2 = Math.max(a[1], b[1]);\n\n const values: Val[] = [];\n for (let r = row1; r <= row2; r++) {\n for (let col = col1; col <= col2; col++) {\n values.push(this.resolveCell(sheet, CellAddress.letter(col) + r, stack));\n }\n }\n return values;\n }\n\n private expectOp(c: Cursor, op: string): void {\n const t = c.tokens[c.pos];\n if (!t || t.type !== \"OP\" || t.value !== op) throw new LinterError(ERR_NAME);\n c.pos++;\n }\n\n // ---- Coercion / comparison / functions ----\n\n private coerceNumber(v: Val): number {\n if (this.isError(v)) throw new LinterError(v as string);\n if (Array.isArray(v)) {\n for (const item of v) {\n if (typeof item === \"number\") return item;\n if (typeof item === \"string\" && isNumericString(item)) return Number(item);\n }\n throw new LinterError(ERR_VALUE);\n }\n if (typeof v === \"number\") return v;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (v === null) return 0;\n if (typeof v === \"string\" && isNumericString(v)) return Number(v);\n throw new LinterError(ERR_VALUE);\n }\n\n private coerceString(v: Val): string {\n if (this.isError(v)) throw new LinterError(v as string);\n if (v === null) return \"\";\n if (typeof v === \"boolean\") return v ? \"TRUE\" : \"FALSE\";\n if (Array.isArray(v)) return v.map((x) => this.coerceString(x)).join(\"\");\n return String(v);\n }\n\n private compare(a: Val, b: Val, op: string): boolean {\n const cmp = this.cmpVal(a, b);\n switch (op) {\n case \"=\":\n return cmp === 0;\n case \"<>\":\n return cmp !== 0;\n case \"<\":\n return cmp < 0;\n case \">\":\n return cmp > 0;\n case \"<=\":\n return cmp <= 0;\n case \">=\":\n return cmp >= 0;\n default:\n return false;\n }\n }\n\n private cmpVal(a: Val, b: Val): number {\n const an = typeof a === \"number\" || (typeof a === \"string\" && isNumericString(a));\n const bn = typeof b === \"number\" || (typeof b === \"string\" && isNumericString(b));\n if (an && bn) {\n const x = Number(a);\n const y = Number(b);\n return x < y ? -1 : x > y ? 1 : 0;\n }\n const sa = String(a);\n const sb = String(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n\n private callFunction(name: string, args: Val[]): Val {\n const flat = this.flatten(args);\n switch (name) {\n case \"SUM\":\n return flat.filter((v) => this.isNumericLike(v)).reduce((s: number, v) => s + this.maybeNum(v), 0);\n case \"AVERAGE\":\n case \"AVG\":\n return this.avg(flat);\n case \"COUNT\":\n return flat.filter((v) => this.isNumericLike(v)).length;\n case \"COUNTA\":\n return flat.filter((v) => v !== null && v !== \"\").length;\n case \"MIN\":\n return this.minMax(flat, true);\n case \"MAX\":\n return this.minMax(flat, false);\n case \"IF\":\n return this.ifFn(args);\n case \"ROUND\":\n return phpRound(this.coerceNumber(args[0] ?? 0), Math.trunc(this.coerceNumber(args[1] ?? 0)));\n case \"ABS\":\n return Math.abs(this.coerceNumber(args[0] ?? 0));\n case \"LEN\":\n return this.coerceString(args[0] ?? \"\").length;\n case \"UPPER\":\n return this.coerceString(args[0] ?? \"\").toUpperCase();\n case \"LOWER\":\n return this.coerceString(args[0] ?? \"\").toLowerCase();\n case \"CONCAT\":\n case \"CONCATENATE\":\n return flat.map((v) => this.coerceString(v)).join(\"\");\n case \"TRUE\":\n return true;\n case \"FALSE\":\n return false;\n default:\n return ERR_NAME;\n }\n }\n\n private flatten(args: Val[]): Val[] {\n const out: Val[] = [];\n for (const a of args) {\n if (Array.isArray(a)) for (const x of a) out.push(x);\n else out.push(a);\n }\n return out;\n }\n\n private isNumericLike(v: Val): boolean {\n return (\n typeof v === \"number\" ||\n (typeof v === \"string\" && isNumericString(v)) ||\n typeof v === \"boolean\"\n );\n }\n\n private maybeNum(v: Val): number {\n return typeof v === \"boolean\" ? (v ? 1 : 0) : Number(v);\n }\n\n private avg(flat: Val[]): number | string {\n const nums = flat.filter((v) => this.isNumericLike(v));\n if (nums.length === 0) return ERR_DIV0;\n return nums.reduce((s: number, v) => s + this.maybeNum(v), 0) / nums.length;\n }\n\n private minMax(flat: Val[], min: boolean): number {\n const nums = flat.filter((v) => this.isNumericLike(v));\n if (nums.length === 0) return 0;\n const vals = nums.map((v) => this.maybeNum(v));\n return min ? Math.min(...vals) : Math.max(...vals);\n }\n\n private ifFn(args: Val[]): Val {\n if (args.length < 2) return ERR_VALUE;\n const cond = args[0]!;\n const truthy =\n typeof cond === \"boolean\"\n ? cond\n : cond !== null && cond !== 0 && cond !== \"\" && cond !== \"FALSE\";\n return truthy ? args[1]! : (args[2] ?? false);\n }\n\n // ---- Hints ----\n\n private hint(error: string, formula: string, sheet: string): string {\n switch (error) {\n case ERR_VALUE:\n return this.hintValue(formula, sheet);\n case ERR_REF:\n return this.hintRef(formula);\n case ERR_NAME:\n return \"The formula references an unknown function or has a syntax error. Holy Sheet supports: SUM, AVERAGE, COUNT, COUNTA, MIN, MAX, IF, ROUND, ABS, LEN, UPPER, LOWER, CONCAT.\";\n case ERR_DIV0:\n return \"Division by zero — the divisor evaluated to 0.\";\n case ERR_CIRC:\n return \"Circular reference — the formula directly or transitively depends on its own cell.\";\n default:\n return \"Formula evaluation failed.\";\n }\n }\n\n private hintRef(formula: string): string {\n // Name the sheet when that is what is missing. \"A cell doesn't exist\" sends\n // an agent to check column letters in a sheet it never created.\n for (const m of formula.matchAll(new RegExp(SHEET_QUALIFIER, \"g\"))) {\n const name = this.cleanSheetName(m[1]!);\n if (!this.sheetNames.has(name.toLowerCase())) {\n return `The formula refers to a sheet named '${name}', and this workbook has no such sheet. Its sheets are: ${[...this.sheetNames.values()].join(\", \")}. Quote a name that contains spaces or punctuation: 'My Sheet'!A1.`;\n }\n }\n return \"A cell reference points to a cell that doesn't exist in the workbook. Check column letters and row numbers.\";\n }\n\n private hintValue(formula: string, sheet: string): string {\n const re = new RegExp(`(?:${SHEET_QUALIFIER})?\\\\$?([A-Z]+)\\\\$?(\\\\d+)`, \"gi\");\n const offenders: string[] = [];\n for (const m of formula.matchAll(re)) {\n const sheetName = m[1]\n ? (this.sheetNames.get(this.cleanSheetName(m[1]).toLowerCase()) ?? this.cleanSheetName(m[1]))\n : sheet;\n const a1 = m[2]!.toUpperCase() + m[3]!;\n const key = sheetName + \"!\" + a1;\n const cell = this.index.get(key);\n if (!cell) continue;\n const value = this.cache.has(key)\n ? this.cache.get(key)!\n : cell.formula !== null\n ? null\n : cell.value;\n if (typeof value === \"string\" && !isNumericString(value) && value !== \"\") {\n const row = parseInt(m[3]!, 10);\n const col = m[2]!;\n const next = sheetName + \"!\" + col.toUpperCase() + (row + 1);\n const nextCell = this.index.get(next);\n let suggestion = \"\";\n if (nextCell && isNumericString(nextCell.value as never)) {\n suggestion = ` Did you mean ${col.toUpperCase()}${row + 1}? (it holds ${String(nextCell.value)})`;\n }\n offenders.push(`${a1} = \"${value}\" (string)${suggestion}`);\n }\n }\n if (offenders.length > 0) {\n return \"Arithmetic on a non-numeric cell: \" + offenders.join(\"; \");\n }\n return \"A non-numeric value was used in arithmetic. Check that all referenced cells contain numbers.\";\n }\n}\n\n/** PHP round() — half away from zero. */\nfunction phpRound(x: number, n: number): number {\n const factor = 10 ** n;\n return (Math.sign(x) * Math.round(Math.abs(x) * factor)) / factor;\n}\n","import type { ValidationError } from \"./schema/types\";\n\n/** Thrown when a Holy Sheet schema fails validation. Mirrors PHP `SchemaException`. */\nexport class SchemaException extends Error {\n readonly errors: ValidationError[];\n\n constructor(errors: ValidationError[], message?: string) {\n super(message ?? summarize(errors));\n this.name = \"SchemaException\";\n this.errors = errors;\n Object.setPrototypeOf(this, SchemaException.prototype);\n }\n\n static fromErrors(errors: ValidationError[]): SchemaException {\n return new SchemaException(errors);\n }\n\n getErrors(): ValidationError[] {\n return this.errors;\n }\n}\n\nfunction summarize(errors: ValidationError[]): string {\n if (errors.length === 1) {\n const e = errors[0]!;\n return `[holy-sheet] schema invalid at ${e.path}: expected ${e.expected}, got ${e.got}`;\n }\n const first = errors[0]!;\n const rest = errors.length - 1;\n return `[holy-sheet] schema invalid at ${first.path}: expected ${first.expected}, got ${first.got} (+${rest} more)`;\n}\n\n/**\n * Thrown by `Agent.read()` / `Agent.describe()` for a file that is neither an\n * xlsx workbook nor an OpenDocument spreadsheet. Mirrors PHP\n * `UnsupportedFormatException`.\n *\n * It extends Error, which is what an unreadable file threw before it existed,\n * so an existing catch still catches it. `mimetype` carries what the package\n * declared about itself when it declared anything (an OpenDocument TEXT file,\n * say), so a caller can say \"that is a document, not a spreadsheet\".\n */\nexport class UnsupportedFormatException extends Error {\n readonly path: string | null;\n readonly mimetype: string | null;\n\n constructor(message: string, path: string | null = null, mimetype: string | null = null) {\n super(message);\n this.name = \"UnsupportedFormatException\";\n this.path = path;\n this.mimetype = mimetype;\n Object.setPrototypeOf(this, UnsupportedFormatException.prototype);\n }\n\n static notAZip(path: string | null = null): UnsupportedFormatException {\n return new UnsupportedFormatException(\n `[holy-sheet] cannot read ${path ?? \"this file\"}: it is not a zip archive, and xlsx and ods both are`,\n path,\n );\n }\n\n static unknownPackage(path: string | null, mimetype: string | null): UnsupportedFormatException {\n const what =\n mimetype !== null && mimetype !== \"\"\n ? `its mimetype is ${mimetype}`\n : \"it has neither xl/workbook.xml nor an OpenDocument mimetype\";\n return new UnsupportedFormatException(\n `[holy-sheet] cannot read ${path ?? \"this file\"}: ${what}. Supported: xlsx, ods`,\n path,\n mimetype !== \"\" ? mimetype : null,\n );\n }\n}\n","import { isNumericString, isPlainObject, numericStringToNumber } from \"../util\";\nimport { ColumnWidths } from \"./column-widths\";\n\nconst VALID_THEMES = [\"default\", \"minimal\", \"plain\", \"business\"];\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\nconst NUMERIC_TYPES = [\"number\", \"integer\", \"currency\", \"percent\"];\n\ntype Any = any;\n\n/**\n * Conservative, high-confidence schema repairs. Mirrors PHP `Schema\\Repairer`.\n * Returns [repairedSchema, repairs].\n */\nexport class Repairer {\n private repairs: string[] = [];\n\n repair(schema: Any): [Record<string, unknown>, string[]] {\n this.repairs = [];\n let s = clone(schema);\n s = this.repairTopLevel(s);\n\n if (Array.isArray(s.sheets)) {\n s.sheets = s.sheets.map((sheet: Any, i: number) => this.repairSheet(sheet, `sheets[${i}]`));\n }\n\n return [s, this.repairs];\n }\n\n private repairTopLevel(schema: Any): Any {\n if (schema.sheets == null && schema.sheet != null) {\n const value = schema.sheet;\n delete schema.sheet;\n schema.sheets = Array.isArray(value) ? value : [value];\n this.repairs.push(\"renamed top-level 'sheet' → 'sheets'\");\n }\n return schema;\n }\n\n private repairSheet(sheet: Any, path: string): Any {\n if (!isPlainObject(sheet)) return sheet;\n\n // 'row' → 'rows'\n if (sheet.rows == null && sheet.row != null) {\n sheet.rows = sheet.row;\n delete sheet.row;\n this.repairs.push(`renamed '${path}.row' → '${path}.rows'`);\n }\n\n // Object-as-list: rows is {0:[],1:[],2:[]} → indexed array\n if (sheet.rows != null && isPlainObject(sheet.rows)) {\n const keys = Object.keys(sheet.rows);\n const allIntegerKeys = keys.every((k) => /^\\d+$/.test(k));\n if (allIntegerKeys) {\n sheet.rows = Object.values(sheet.rows);\n this.repairs.push(`converted '${path}.rows' from integer-keyed object to indexed list`);\n }\n }\n\n // Unknown theme → 'default'\n if (sheet.theme != null && !VALID_THEMES.includes(sheet.theme)) {\n const original = sheet.theme;\n sheet.theme = \"default\";\n this.repairs.push(`changed '${path}.theme' from '${original}' to 'default' (unknown theme)`);\n }\n\n // Column widths: a letter key becomes its index; an entry that is still not\n // a column index and a width is dropped, and said (PHP 2.3.4).\n if (sheet.columnWidths != null && (isPlainObject(sheet.columnWidths) || Array.isArray(sheet.columnWidths))) {\n const widths: Record<string, unknown> = {};\n let changed = false;\n for (const [key, px] of Object.entries(sheet.columnWidths as Record<string, unknown>)) {\n let index = ColumnWidths.index(key);\n if (index === null) {\n const letters = ColumnWidths.fromLetters(key);\n if (letters !== null) {\n index = letters;\n this.repairs.push(`converted '${path}.columnWidths.${key}' to column index ${index}`);\n changed = true;\n }\n }\n if (index === null || ColumnWidths.width(px) === null) {\n this.repairs.push(`dropped '${path}.columnWidths.${key}' (not a column index and a width)`);\n changed = true;\n continue;\n }\n widths[String(index)] = px;\n }\n if (changed) {\n sheet.columnWidths = widths;\n }\n }\n\n // Trim whitespace in sparse-cell A1 addresses\n if (sheet.cells != null && isPlainObject(sheet.cells)) {\n const cleaned: Record<string, unknown> = {};\n let changed = false;\n for (const [addr, data] of Object.entries(sheet.cells)) {\n const trimmed = addr.trim();\n if (trimmed !== addr) changed = true;\n cleaned[trimmed] = data;\n }\n if (changed) {\n sheet.cells = cleaned;\n this.repairs.push(`trimmed whitespace from cell addresses in '${path}.cells'`);\n }\n }\n\n // Column-driven repairs\n if (sheet.columns != null && sheet.rows != null && Array.isArray(sheet.columns) && Array.isArray(sheet.rows)) {\n this.repairColumnTypeInference(sheet, path);\n this.repairStringifiedNumerics(sheet);\n }\n\n return sheet;\n }\n\n private repairColumnTypeInference(sheet: Any, path: string): void {\n sheet.columns.forEach((col: Any, colIdx: number) => {\n if (!isPlainObject(col)) return;\n if (col.type !== undefined && col.type !== \"auto\") return;\n\n const values: unknown[] = [];\n for (const row of sheet.rows as Any[]) {\n if (Array.isArray(row) && colIdx < row.length) values.push(row[colIdx]);\n }\n const nonNull = values.filter((v) => v !== null && v !== undefined);\n if (nonNull.length === 0) return;\n\n const allDateLike = nonNull.every((v) => typeof v === \"string\" && ISO_DATE.test(v));\n if (allDateLike) {\n const type = String(nonNull[0]).includes(\"T\") ? \"datetime\" : \"date\";\n sheet.columns[colIdx].type = type;\n this.repairs.push(`inferred '${path}.columns[${colIdx}].type' = '${type}' from row values`);\n }\n });\n }\n\n private repairStringifiedNumerics(sheet: Any): void {\n sheet.columns.forEach((col: Any, colIdx: number) => {\n if (!isPlainObject(col)) return;\n const type = col.type ?? \"auto\";\n if (!NUMERIC_TYPES.includes(type)) return;\n\n (sheet.rows as Any[]).forEach((row) => {\n if (!Array.isArray(row)) return;\n const value = row[colIdx];\n if (typeof value === \"string\" && isNumericString(value)) {\n row[colIdx] = numericStringToNumber(value);\n }\n });\n });\n }\n}\n\nfunction clone<T>(v: T): T {\n return typeof structuredClone === \"function\"\n ? structuredClone(v)\n : (JSON.parse(JSON.stringify(v)) as T);\n}\n","import { SchemaException } from \"../exceptions\";\nimport { isPlainObject, typeOf } from \"../util\";\nimport { ColumnWidths } from \"./column-widths\";\nimport { Repairer } from \"./repairer\";\nimport type { RepairResult, ValidationError } from \"./types\";\n\nconst VALID_THEMES = [\"default\", \"minimal\", \"plain\", \"business\"];\nconst ALLOWED_TYPES = [\n \"auto\",\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"date\",\n \"datetime\",\n \"currency\",\n \"percent\",\n \"formula\",\n];\n\ntype Any = any;\n\n/** Hand-rolled schema validator. Mirrors PHP `Schema\\Validator`. */\nexport class Validator {\n validate(schema: Any): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (schema == null || !Array.isArray(schema.sheets)) {\n errors.push(\n error(\n \"sheets\",\n \"array\",\n typeOf(schema?.sheets ?? null),\n schema?.sheets ?? null,\n 'Top-level \"sheets\" must be an array of sheet definitions.',\n ),\n );\n return errors;\n }\n\n if (schema.sheets.length === 0) {\n errors.push(\n error(\"sheets\", \"non-empty array\", \"empty array\", [], \"A workbook must contain at least one sheet.\"),\n );\n return errors;\n }\n\n schema.sheets.forEach((sheet: Any, i: number) => {\n errors.push(...this.validateSheet(sheet, `sheets[${i}]`));\n });\n\n return errors;\n }\n\n assert(schema: Any): void {\n const errors = this.validate(schema);\n if (errors.length > 0) throw SchemaException.fromErrors(errors);\n }\n\n validateAndRepair(schema: Any): RepairResult {\n const [repairedSchema, repairs] = new Repairer().repair(schema);\n const errors = this.validate(repairedSchema);\n return { schema: repairedSchema, errors, repairs };\n }\n\n private validateSheet(sheet: Any, path: string): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (!isPlainObject(sheet)) {\n return [\n error(\n path,\n \"object\",\n typeOf(sheet),\n sheet,\n 'Each sheet must be an object with at least a \"name\" key.',\n ),\n ];\n }\n\n if (typeof sheet.name !== \"string\" || sheet.name.trim() === \"\") {\n errors.push(\n error(\n `${path}.name`,\n \"non-empty string\",\n typeOf(sheet.name ?? null),\n sheet.name ?? null,\n \"Sheet name is required and visible in Excel's tab strip.\",\n ),\n );\n }\n\n const hasColumnsRows = sheet.rows != null || sheet.columns != null;\n const hasCells = sheet.cells != null;\n\n if (!hasColumnsRows && !hasCells) {\n errors.push(\n error(\n path,\n \"object with rows OR cells\",\n \"object without either\",\n sheet,\n \"A sheet needs either {columns, rows} (row-oriented) or {cells} (sparse A1-keyed) data.\",\n ),\n );\n }\n\n if (sheet.columns != null) {\n if (!Array.isArray(sheet.columns)) {\n errors.push(\n error(\n `${path}.columns`,\n \"array\",\n typeOf(sheet.columns),\n sheet.columns,\n \"Columns must be an array of column definitions.\",\n ),\n );\n } else {\n sheet.columns.forEach((col: Any, j: number) => {\n errors.push(...this.validateColumn(col, `${path}.columns[${j}]`));\n });\n }\n }\n\n if (sheet.rows != null) {\n if (!Array.isArray(sheet.rows)) {\n errors.push(\n error(`${path}.rows`, \"array\", typeOf(sheet.rows), sheet.rows, \"Rows must be an array of arrays.\"),\n );\n } else {\n sheet.rows.forEach((row: Any, j: number) => {\n if (!Array.isArray(row)) {\n errors.push(\n error(\n `${path}.rows[${j}]`,\n \"array\",\n typeOf(row),\n row,\n \"Each row is an array of cell values, in column order.\",\n ),\n );\n }\n });\n }\n }\n\n if (sheet.cells != null) {\n // `[]` is an empty map in PHP terms: PHP's describe() reports a sheet with\n // no cells that way, so rejecting it broke describe() -> write().\n const emptyList = Array.isArray(sheet.cells) && sheet.cells.length === 0;\n if (!isPlainObject(sheet.cells) && !emptyList) {\n errors.push(\n error(\n `${path}.cells`,\n \"object keyed by A1 address\",\n typeOf(sheet.cells),\n sheet.cells,\n 'Cells must be an object/map keyed by A1 references like \"A1\", \"B2\".',\n ),\n );\n }\n }\n\n if (sheet.theme != null && !VALID_THEMES.includes(sheet.theme)) {\n errors.push(\n error(\n `${path}.theme`,\n \"one of: default, minimal, plain, business\",\n \"unknown\",\n sheet.theme,\n \"Pick a built-in theme or omit for default.\",\n ),\n );\n }\n\n if (sheet.columnWidths != null) {\n if (!isPlainObject(sheet.columnWidths) && !Array.isArray(sheet.columnWidths)) {\n errors.push(\n error(\n `${path}.columnWidths`,\n \"object keyed by 0-based column index\",\n typeOf(sheet.columnWidths),\n sheet.columnWidths,\n 'Column widths map a 0-based column index to pixels: {\"0\": 120, \"1\": 80}.',\n ),\n );\n } else {\n for (const [key, px] of Object.entries(sheet.columnWidths as Record<string, unknown>)) {\n if (ColumnWidths.index(key) === null) {\n errors.push(\n error(\n `${path}.columnWidths.${key}`,\n `a 0-based column index from 0 to ${ColumnWidths.MAX_INDEX}`,\n typeOf(key),\n key,\n 'Keys are 0-based column indexes: \"0\" is column A, \"1\" is column B. Use the index, not the letter.',\n ),\n );\n } else if (ColumnWidths.width(px) === null) {\n errors.push(\n error(\n `${path}.columnWidths.${key}`,\n \"a non-negative number of pixels\",\n typeOf(px),\n px,\n \"A width is a number of pixels, like 120.\",\n ),\n );\n }\n }\n }\n }\n\n return errors;\n }\n\n private validateColumn(col: Any, path: string): ValidationError[] {\n if (!isPlainObject(col)) {\n return [\n error(path, \"object\", typeOf(col), col, 'Each column is an object with at least a \"header\" key.'),\n ];\n }\n\n const errors: ValidationError[] = [];\n if (typeof col.header !== \"string\") {\n errors.push(\n error(\n `${path}.header`,\n \"string\",\n typeOf(col.header ?? null),\n col.header ?? null,\n \"Column header is the visible label in row 1.\",\n ),\n );\n }\n\n if (col.type !== undefined && !ALLOWED_TYPES.includes(col.type)) {\n errors.push(\n error(\n `${path}.type`,\n \"one of: \" + ALLOWED_TYPES.join(\", \"),\n \"unknown\",\n col.type,\n 'Pick a supported type or omit for \"auto\" (inferred per cell).',\n ),\n );\n }\n\n return errors;\n }\n}\n\nfunction error(\n path: string,\n expected: string,\n got: string,\n value: unknown,\n hint: string,\n): ValidationError {\n return { path, expected, got, value, hint };\n}\n","/**\n * CRC-32 (IEEE 802.3) over a byte array — used for ZIP local/central headers.\n * Table-based, zero-dependency.\n */\n\nconst TABLE = /* @__PURE__ */ (() => {\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++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nexport function crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i++) {\n crc = TABLE[(crc ^ bytes[i]!) & 0xff]! ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n","/**\n * Minimal ZIP writer using the STORE method (no compression). Valid OOXML\n * containers don't require compression, so this stays tiny, deterministic, and\n * isomorphic. Filenames are UTF-8 (general-purpose bit 11 set).\n */\nimport { crc32 } from \"./crc32\";\n\nexport interface ZipFile {\n name: string;\n data: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\n\n// Fixed DOS timestamp (1980-01-01 00:00:00) for deterministic, reproducible output.\nconst DOS_TIME = 0;\nconst DOS_DATE = 0x0021;\n\nexport function zipSync(files: ZipFile[]): Uint8Array {\n const localParts: Uint8Array[] = [];\n const centralParts: Uint8Array[] = [];\n let offset = 0;\n\n for (const f of files) {\n const nameBytes = encoder.encode(f.name);\n const crc = crc32(f.data);\n const size = f.data.length;\n\n const lh = new Uint8Array(30 + nameBytes.length);\n const ldv = new DataView(lh.buffer);\n ldv.setUint32(0, 0x04034b50, true);\n ldv.setUint16(4, 20, true); // version needed to extract\n ldv.setUint16(6, 0x0800, true); // flags: UTF-8 filename\n ldv.setUint16(8, 0, true); // method: STORE\n ldv.setUint16(10, DOS_TIME, true);\n ldv.setUint16(12, DOS_DATE, true);\n ldv.setUint32(14, crc, true);\n ldv.setUint32(18, size, true); // compressed size\n ldv.setUint32(22, size, true); // uncompressed size\n ldv.setUint16(26, nameBytes.length, true);\n ldv.setUint16(28, 0, true); // extra length\n lh.set(nameBytes, 30);\n localParts.push(lh, f.data);\n\n const cd = new Uint8Array(46 + nameBytes.length);\n const cdv = new DataView(cd.buffer);\n cdv.setUint32(0, 0x02014b50, true);\n cdv.setUint16(4, 20, true); // version made by\n cdv.setUint16(6, 20, true); // version needed\n cdv.setUint16(8, 0x0800, true);\n cdv.setUint16(10, 0, true); // method\n cdv.setUint16(12, DOS_TIME, true);\n cdv.setUint16(14, DOS_DATE, true);\n cdv.setUint32(16, crc, true);\n cdv.setUint32(20, size, true);\n cdv.setUint32(24, size, true);\n cdv.setUint16(28, nameBytes.length, true);\n cdv.setUint16(30, 0, true); // extra length\n cdv.setUint16(32, 0, true); // comment length\n cdv.setUint16(34, 0, true); // disk number start\n cdv.setUint16(36, 0, true); // internal attrs\n cdv.setUint32(38, 0, true); // external attrs\n cdv.setUint32(42, offset, true); // local header offset\n cd.set(nameBytes, 46);\n centralParts.push(cd);\n\n offset += lh.length + f.data.length;\n }\n\n const localSize = offset;\n const centralSize = centralParts.reduce((s, c) => s + c.length, 0);\n\n const eocd = new Uint8Array(22);\n const edv = new DataView(eocd.buffer);\n edv.setUint32(0, 0x06054b50, true);\n edv.setUint16(4, 0, true); // this disk\n edv.setUint16(6, 0, true); // disk with central dir\n edv.setUint16(8, files.length, true);\n edv.setUint16(10, files.length, true);\n edv.setUint32(12, centralSize, true);\n edv.setUint32(16, localSize, true); // central dir offset\n edv.setUint16(20, 0, true); // comment length\n\n const out = new Uint8Array(localSize + centralSize + 22);\n let p = 0;\n for (const part of localParts) {\n out.set(part, p);\n p += part.length;\n }\n for (const part of centralParts) {\n out.set(part, p);\n p += part.length;\n }\n out.set(eocd, p);\n return out;\n}\n","/**\n * Raw DEFLATE (RFC 1951) decompression — `inflateRaw`.\n *\n * Office documents (.xlsx/.pptx) authored by Excel/PowerPoint store their parts\n * with DEFLATE compression, so the reader must inflate them. Our own writer uses\n * the STORE method (no compression), so this is only exercised when reading\n * externally-authored files. Decompress-only, zero-dependency, isomorphic.\n *\n * Algorithm adapted from the public-domain \"tinf\" inflate (Jørgen Ibsen).\n */\n\nclass Tree {\n // number of codes with a given bit length\n readonly table = new Uint16Array(16);\n // symbols sorted by code\n readonly trans = new Uint16Array(288);\n}\n\nconst LENGTH_BITS = new Uint8Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5,\n 5, 5, 0,\n]);\nconst LENGTH_BASE = new Uint16Array([\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67,\n 83, 99, 115, 131, 163, 195, 227, 258,\n]);\nconst DIST_BITS = new Uint8Array([\n 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11,\n 11, 12, 12, 13, 13,\n]);\nconst DIST_BASE = new Uint16Array([\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769,\n 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577,\n]);\n// order in which code-length-code lengths are stored\nconst CLC_INDEX = new Uint8Array([\n 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15,\n]);\n\nfunction buildFixedTrees(lt: Tree, dt: Tree): void {\n let i: number;\n for (i = 0; i < 7; i++) lt.table[i] = 0;\n lt.table[7] = 24;\n lt.table[8] = 152;\n lt.table[9] = 112;\n for (i = 0; i < 24; i++) lt.trans[i] = 256 + i;\n for (i = 0; i < 144; i++) lt.trans[24 + i] = i;\n for (i = 0; i < 8; i++) lt.trans[24 + 144 + i] = 280 + i;\n for (i = 0; i < 112; i++) lt.trans[24 + 144 + 8 + i] = 144 + i;\n for (i = 0; i < 5; i++) dt.table[i] = 0;\n dt.table[5] = 32;\n for (i = 0; i < 32; i++) dt.trans[i] = i;\n}\n\nconst OFFS = new Uint16Array(16);\n\nfunction buildTree(t: Tree, lengths: Uint8Array, off: number, num: number): void {\n let i: number;\n let sum = 0;\n for (i = 0; i < 16; i++) t.table[i] = 0;\n for (i = 0; i < num; i++) t.table[lengths[off + i]!]!++;\n t.table[0] = 0;\n for (i = 0; i < 16; i++) {\n OFFS[i] = sum;\n sum += t.table[i]!;\n }\n for (i = 0; i < num; i++) {\n const len = lengths[off + i]!;\n if (len) t.trans[OFFS[len]!++] = i;\n }\n}\n\nclass Reader {\n source: Uint8Array;\n index = 0;\n tag = 0;\n bitcount = 0;\n constructor(source: Uint8Array) {\n this.source = source;\n }\n}\n\nfunction getBit(d: Reader): number {\n if (d.bitcount-- === 0) {\n d.tag = d.source[d.index++]!;\n d.bitcount = 7;\n }\n const bit = d.tag & 1;\n d.tag >>>= 1;\n return bit;\n}\n\nfunction readBits(d: Reader, num: number, base: number): number {\n if (!num) return base;\n let val = 0;\n for (let i = 0; i < num; i++) val |= getBit(d) << i;\n return val + base;\n}\n\nfunction decodeSymbol(d: Reader, t: Tree): number {\n let sum = 0;\n let cur = 0;\n let len = 0;\n do {\n cur = 2 * cur + getBit(d);\n len++;\n sum += t.table[len]!;\n cur -= t.table[len]!;\n } while (cur >= 0);\n return t.trans[sum + cur]!;\n}\n\nfunction decodeTrees(d: Reader, lt: Tree, dt: Tree): void {\n const lengths = new Uint8Array(288 + 32);\n const hlit = readBits(d, 5, 257);\n const hdist = readBits(d, 5, 1);\n const hclen = readBits(d, 4, 4);\n let i: number;\n for (i = 0; i < 19; i++) lengths[i] = 0;\n for (i = 0; i < hclen; i++) {\n const clen = readBits(d, 3, 0);\n lengths[CLC_INDEX[i]!] = clen;\n }\n const codeTree = new Tree();\n buildTree(codeTree, lengths, 0, 19);\n for (let num = 0; num < hlit + hdist; ) {\n const sym = decodeSymbol(d, codeTree);\n switch (sym) {\n case 16: {\n const prev = lengths[num - 1]!;\n for (let length = readBits(d, 2, 3); length; length--) lengths[num++] = prev;\n break;\n }\n case 17:\n for (let length = readBits(d, 3, 3); length; length--) lengths[num++] = 0;\n break;\n case 18:\n for (let length = readBits(d, 7, 11); length; length--) lengths[num++] = 0;\n break;\n default:\n lengths[num++] = sym;\n break;\n }\n }\n buildTree(lt, lengths, 0, hlit);\n buildTree(dt, lengths, hlit, hdist);\n}\n\nclass Out {\n buf = new Uint8Array(1024);\n len = 0;\n push(b: number): void {\n if (this.len >= this.buf.length) {\n const next = new Uint8Array(this.buf.length * 2);\n next.set(this.buf);\n this.buf = next;\n }\n this.buf[this.len++] = b;\n }\n}\n\nfunction inflateBlockData(d: Reader, out: Out, lt: Tree, dt: Tree): void {\n for (;;) {\n const sym = decodeSymbol(d, lt);\n if (sym === 256) return;\n if (sym < 256) {\n out.push(sym);\n } else {\n const lengthSym = sym - 257;\n const length = readBits(d, LENGTH_BITS[lengthSym]!, LENGTH_BASE[lengthSym]!);\n const distSym = decodeSymbol(d, dt);\n const dist = readBits(d, DIST_BITS[distSym]!, DIST_BASE[distSym]!);\n const offs = out.len - dist;\n for (let i = 0; i < length; i++) out.push(out.buf[offs + i]!);\n }\n }\n}\n\nfunction inflateUncompressedBlock(d: Reader, out: Out): void {\n // discard remaining bits in the current (partial) byte\n d.bitcount = 0;\n let length = d.source[d.index + 1]! * 256 + d.source[d.index]!;\n d.index += 4; // skip LEN + NLEN\n for (; length; length--) out.push(d.source[d.index++]!);\n}\n\nexport function inflateRaw(source: Uint8Array): Uint8Array {\n const d = new Reader(source);\n const out = new Out();\n const lt = new Tree();\n const dt = new Tree();\n let bfinal: number;\n do {\n bfinal = getBit(d);\n const btype = readBits(d, 2, 0);\n if (btype === 0) {\n inflateUncompressedBlock(d, out);\n } else if (btype === 1) {\n buildFixedTrees(lt, dt);\n inflateBlockData(d, out, lt, dt);\n } else if (btype === 2) {\n decodeTrees(d, lt, dt);\n inflateBlockData(d, out, lt, dt);\n } else {\n throw new Error(\"holy-sheet: invalid DEFLATE block type\");\n }\n } while (!bfinal);\n return out.buf.subarray(0, out.len);\n}\n","/**\n * Minimal ZIP reader. Parses the central directory and returns a name → bytes\n * map. Supports STORE (method 0) and DEFLATE (method 8, via `inflateRaw`) so it\n * reads both our own output and Excel/PowerPoint-authored files. Zip64 is not\n * handled (OOXML parts are well under 4 GB).\n */\nimport { inflateRaw } from \"./inflate\";\n\nconst decoder = new TextDecoder();\n\nexport function unzipSync(data: Uint8Array): Record<string, Uint8Array> {\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Locate the End Of Central Directory record (scan backward; it may carry a comment).\n let eocd = -1;\n for (let i = data.length - 22; i >= 0; i--) {\n if (dv.getUint32(i, true) === 0x06054b50) {\n eocd = i;\n break;\n }\n }\n if (eocd < 0) throw new Error(\"holy-sheet: not a zip archive (no EOCD record)\");\n\n const count = dv.getUint16(eocd + 10, true);\n let cd = dv.getUint32(eocd + 16, true);\n const result: Record<string, Uint8Array> = {};\n\n for (let n = 0; n < count; n++) {\n if (dv.getUint32(cd, true) !== 0x02014b50) break;\n const method = dv.getUint16(cd + 10, true);\n const compSize = dv.getUint32(cd + 20, true);\n const nameLen = dv.getUint16(cd + 28, true);\n const extraLen = dv.getUint16(cd + 30, true);\n const commentLen = dv.getUint16(cd + 32, true);\n const localOffset = dv.getUint32(cd + 42, true);\n const name = decoder.decode(data.subarray(cd + 46, cd + 46 + nameLen));\n\n const lhNameLen = dv.getUint16(localOffset + 26, true);\n const lhExtraLen = dv.getUint16(localOffset + 28, true);\n const dataStart = localOffset + 30 + lhNameLen + lhExtraLen;\n const raw = data.subarray(dataStart, dataStart + compSize);\n\n let content: Uint8Array;\n if (method === 0) content = raw.slice();\n else if (method === 8) content = inflateRaw(raw);\n else throw new Error(`holy-sheet: unsupported zip method ${method} for \"${name}\"`);\n\n result[name] = content;\n cd += 46 + nameLen + extraLen + commentLen;\n }\n\n return result;\n}\n","import type { XmlNode } from \"../xml\";\n\n/**\n * OpenDocument namespace URIs, and lookups by URI. Mirrors PHP `Reader\\Ods\\Ns`.\n *\n * Elements and attributes are matched by URI, never by prefix: `table:` is a\n * convention every producer happens to follow, not something the format\n * promises. Parse with `parseXml(src, { namespaces: true })`.\n */\nexport const NS = {\n OFFICE: \"urn:oasis:names:tc:opendocument:xmlns:office:1.0\",\n TABLE: \"urn:oasis:names:tc:opendocument:xmlns:table:1.0\",\n TEXT: \"urn:oasis:names:tc:opendocument:xmlns:text:1.0\",\n STYLE: \"urn:oasis:names:tc:opendocument:xmlns:style:1.0\",\n FO: \"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\",\n NUMBER: \"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\",\n DC: \"http://purl.org/dc/elements/1.1/\",\n META: \"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\",\n /** LibreOffice's extension namespace; carries `value-type=\"error\"` for a formula error. */\n CALCEXT: \"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0\",\n} as const;\n\n/** The first child element with this namespace and local name. */\nexport function child(node: XmlNode | null | undefined, ns: string, name: string): XmlNode | undefined {\n return node?.children.find((c) => c.ns === ns && c.name === name);\n}\n\n/** Child elements in this namespace, in document order. */\nexport function childrenIn(node: XmlNode | null | undefined, ns: string): XmlNode[] {\n return node ? node.children.filter((c) => c.ns === ns) : [];\n}\n\n/** A namespaced attribute, or undefined when absent. */\nexport function attr(node: XmlNode | null | undefined, ns: string, name: string): string | undefined {\n return node?.nsAttrs?.[`{${ns}}${name}`];\n}\n\n/** An element's own text: its direct text runs, as SimpleXML's `(string)` cast reads it. */\nexport function ownText(node: XmlNode | null | undefined): string {\n return node ? node.text : \"\";\n}\n\n// ─── PHP semantics the reference reader relies on ──────────────────────────\n//\n// The PHP reader is the reference, and several of its primitives are narrower\n// than their JavaScript look-alikes. `trim` and `strtolower` are ASCII-only;\n// `(int)` reads a leading integer and gives 0 for anything else. Using the\n// JavaScript versions would agree on every fixture and disagree on the first\n// file with a narrow no-break space in a currency format.\n\n/** PHP `trim()`: space, tab, LF, CR, NUL and vertical tab only. */\nexport function phpTrim(s: string): string {\n return s.replace(/^[ \\t\\n\\r\\0\\x0B]+|[ \\t\\n\\r\\0\\x0B]+$/g, \"\");\n}\n\n/** PHP 8 `strtolower()`: ASCII letters only. */\nexport function asciiLower(s: string): string {\n return s.replace(/[A-Z]/g, (c) => c.toLowerCase());\n}\n\n/** PHP `(int) $string`: the leading integer, 0 when there is none. */\nexport function phpInt(s: string): number {\n const m = /^[ \\t\\n\\r\\v\\f]*([+-]?\\d+)/.exec(s);\n return m ? parseInt(m[1]!, 10) : 0;\n}\n\n/** PHP 8 `is_numeric()` on a string. */\nexport function phpIsNumeric(s: string): boolean {\n return /^[ \\t\\n\\r\\v\\f]*[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?[ \\t\\n\\r\\v\\f]*$/.test(s);\n}\n","import { UnsupportedFormatException } from \"../exceptions\";\nimport { unzipSync } from \"../zip\";\nimport { phpTrim } from \"./ods/ns\";\n\nexport type SpreadsheetFormat = \"xlsx\" | \"ods\";\n\n/** The spreadsheet media types, and the template variant (.ots) which is read the same way. */\nconst ODS_MIMETYPES = new Set([\n \"application/vnd.oasis.opendocument.spreadsheet\",\n \"application/vnd.oasis.opendocument.spreadsheet-template\",\n]);\n\nconst decoder = new TextDecoder();\n\n/**\n * Which reader a file needs, decided from its contents, never its extension.\n * Mirrors PHP `Reader\\FormatSniffer`.\n *\n * An OpenDocument package names itself in its `mimetype` entry; an xlsx has no\n * such entry and is recognised by `xl/workbook.xml`. Anything else is refused\n * by name. The unzipped entries are returned so the reader does not unzip again.\n */\nexport const FormatSniffer = {\n sniff(\n bytes: Uint8Array,\n path: string | null = null,\n ): { format: SpreadsheetFormat; files: Record<string, Uint8Array> } {\n let files: Record<string, Uint8Array>;\n try {\n files = unzipSync(bytes);\n } catch (e) {\n // A real zip this reader cannot inflate is a different failure; say so.\n if (e instanceof Error && e.message.includes(\"unsupported zip method\")) throw e;\n throw UnsupportedFormatException.notAZip(path);\n }\n\n const mimetype = files[\"mimetype\"] ? phpTrim(decoder.decode(files[\"mimetype\"])) : null;\n if (mimetype !== null && ODS_MIMETYPES.has(mimetype)) return { format: \"ods\", files };\n if (files[\"xl/workbook.xml\"]) return { format: \"xlsx\", files };\n\n throw UnsupportedFormatException.unknownPackage(path, mimetype);\n },\n};\n","/**\n * An OpenDocument `table:formula` -> the A1 syntax the xlsx reader returns.\n * Mirrors PHP `Reader\\Ods\\OdsFormula`; the full list of what is and is not\n * translated is documented there.\n *\n * `of:=SUM([.A1:.B2];[$'Other Sheet'.C3])` becomes `SUM(A1:B2,'Other Sheet'!C3)`.\n */\nexport function odsFormulaToA1(formula: string): string {\n let grammar = \"of\";\n const m = /^(of|oooc|msoxl):/i.exec(formula);\n if (m) {\n grammar = m[1]!.toLowerCase();\n formula = formula.slice(m[0].length);\n }\n if (formula.startsWith(\"=\")) formula = formula.slice(1);\n\n return grammar === \"msoxl\" ? formula : translate(formula);\n}\n\nfunction translate(s: string): string {\n let out = \"\";\n const length = s.length;\n let arrayDepth = 0;\n\n for (let i = 0; i < length; i++) {\n let c = s[i]!;\n\n if (c === '\"') {\n let end = i + 1;\n while (end < length) {\n if (s[end] === '\"') {\n if (end + 1 < length && s[end + 1] === '\"') {\n end += 2;\n continue;\n }\n break;\n }\n end++;\n }\n out += s.slice(i, end + 1);\n i = end;\n continue;\n }\n\n if (c === \"[\") {\n let end = i + 1;\n let quoted = false;\n while (end < length && (quoted || s[end] !== \"]\")) {\n if (s[end] === \"'\") quoted = !quoted;\n end++;\n }\n out += reference(s.slice(i + 1, end));\n i = end;\n continue;\n }\n\n if (c === \"{\") {\n arrayDepth++;\n } else if (c === \"}\") {\n arrayDepth = Math.max(0, arrayDepth - 1);\n } else if (c === \";\") {\n c = \",\";\n } else if (c === \"|\" && arrayDepth > 0) {\n c = \";\";\n }\n out += c;\n }\n\n return out;\n}\n\n/** The inside of one `[...]`. */\nfunction reference(ref: string): string {\n const parts: string[] = [];\n let start = 0;\n let quoted = false;\n for (let i = 0; i < ref.length; i++) {\n if (ref[i] === \"'\") {\n quoted = !quoted;\n } else if (ref[i] === \":\" && !quoted) {\n parts.push(ref.slice(start, i));\n start = i + 1;\n }\n }\n parts.push(ref.slice(start));\n\n const parsed = parts.length <= 2 ? parts.map(part) : [null];\n if (parsed.some((p) => p === null)) {\n return ref.includes(\"#REF!\") ? \"#REF!\" : `[${ref}]`;\n }\n\n const [sheet, address] = parsed[0]!;\n if (parsed.length === 1) return sheetPrefix(sheet) + address;\n\n const [sheet2, address2] = parsed[1]!;\n if (sheet2 === null || sheet2 === sheet) return sheetPrefix(sheet) + address + \":\" + address2;\n if (sheet === null) return address + \":\" + sheetPrefix(sheet2) + address2;\n\n // A range across sheets: one prefix naming both, quoted as a whole.\n const both =\n needsQuotes(sheet) || needsQuotes(sheet2)\n ? \"'\" + sheet.replace(/'/g, \"''\") + \":\" + sheet2.replace(/'/g, \"''\") + \"'\"\n : sheet + \":\" + sheet2;\n\n return both + \"!\" + address + \":\" + address2;\n}\n\n/** One end of a reference: `$'Sheet'.$A$1`, `Sheet.A1`, `.A1`, `.A`, `.1`. */\nfunction part(p: string): [string | null, string] | null {\n const length = p.length;\n let i = 0;\n if (i < length && p[i] === \"$\") i++;\n\n let sheet: string | null = null;\n if (i < length && p[i] === \"'\") {\n sheet = \"\";\n i++;\n for (;;) {\n if (i >= length) return null;\n if (p[i] === \"'\") {\n if (i + 1 < length && p[i + 1] === \"'\") {\n sheet += \"'\";\n i += 2;\n continue;\n }\n i++;\n break;\n }\n sheet += p[i++];\n }\n if (i >= length || p[i] !== \".\") return null;\n i++;\n } else {\n const dot = p.indexOf(\".\", i);\n if (dot < 0) return null;\n if (dot > i) sheet = p.slice(i, dot);\n i = dot + 1;\n }\n\n const address = p.slice(i);\n if (!/^(\\$?[A-Za-z]{1,3}\\$?[0-9]+|\\$?[A-Za-z]{1,3}|\\$?[0-9]+)$/.test(address)) return null;\n\n return [sheet, address];\n}\n\nfunction sheetPrefix(sheet: string | null): string {\n if (sheet === null) return \"\";\n return (needsQuotes(sheet) ? \"'\" + sheet.replace(/'/g, \"''\") + \"'\" : sheet) + \"!\";\n}\n\n/** Whether Excel needs the sheet name quoted. Over-quoting is still valid. */\nfunction needsQuotes(sheet: string): boolean {\n return (\n !/^[A-Za-z_][A-Za-z0-9_.]*$/.test(sheet) ||\n /^[A-Za-z]{1,3}[0-9]+$/.test(sheet) ||\n /^[Rr]([0-9]+)?[Cc]([0-9]+)?$/.test(sheet)\n );\n}\n","import type { DisplayFormat } from \"../../schema/types\";\n\nexport interface NumFmtParsed {\n displayFormat: DisplayFormat;\n decimals?: number;\n currency?: string;\n}\n\n/** Reverse of NumFmtBuilder. Mirrors PHP `Reader\\Format\\NumFmtParser`. */\nconst BUILTIN: Record<number, string> = {\n 0: \"General\",\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"mm-dd-yy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yy h:mm\",\n 37: \"#,##0 ;(#,##0)\",\n 38: \"#,##0 ;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mmss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\",\n};\n\nexport const SYMBOL_TO_ISO: Record<string, string> = {\n $: \"USD\",\n \"€\": \"EUR\",\n \"£\": \"GBP\",\n \"¥\": \"JPY\",\n \"₹\": \"INR\",\n \"₩\": \"KRW\",\n};\n\nexport const NumFmtParser = {\n parse(formatCode: string | null): NumFmtParsed | null {\n if (formatCode === null) return null;\n const code = formatCode;\n\n if (code === \"\" || code === \"General\" || code === \"@\") {\n return { displayFormat: code === \"@\" ? \"text\" : \"auto\" };\n }\n\n if (looksLikeDate(code)) {\n return { displayFormat: hasTimeComponent(code) ? \"datetime\" : \"date\" };\n }\n\n if (code.includes(\"%\")) {\n return { displayFormat: \"percentage\", decimals: decimalsAfter(code) };\n }\n\n const m = /^\"([^\"]+)\"/u.exec(code);\n if (m) {\n const iso = SYMBOL_TO_ISO[m[1]!];\n const result: NumFmtParsed = { displayFormat: \"currency\", decimals: decimalsAfter(code) };\n if (iso !== undefined) result.currency = iso;\n return result;\n }\n\n if (/^#?,?#?#?0(\\.0+)?$/.test(code.split(\";\")[0]!)) {\n return { displayFormat: \"number\", decimals: decimalsAfter(code) };\n }\n\n return null;\n },\n\n parseBuiltin(id: number): NumFmtParsed | null {\n const code = BUILTIN[id];\n if (code === undefined) return null;\n return NumFmtParser.parse(code);\n },\n};\n\nfunction looksLikeDate(code: string): boolean {\n const stripped = code.replace(/\"[^\"]*\"|\\[[^\\]]*\\]/gu, \"\");\n return /[ymd]/i.test(stripped);\n}\n\nfunction hasTimeComponent(code: string): boolean {\n const stripped = code.replace(/\"[^\"]*\"|\\[[^\\]]*\\]/gu, \"\");\n return /[hHsS]/.test(stripped) || stripped.toLowerCase().includes(\"mm:\");\n}\n\nfunction decimalsAfter(code: string): number {\n const section = code.split(\";\")[0]!;\n const m = /0\\.(0+)/.exec(section);\n return m ? m[1]!.length : 0;\n}\n","import { CellFormat } from \"../../workbook/cell-format\";\nimport type { DisplayFormat } from \"../../schema/types\";\nimport { SYMBOL_TO_ISO } from \"../format/num-fmt-parser\";\nimport type { XmlNode } from \"../xml\";\nimport { NS, asciiLower, attr, child, childrenIn, ownText, phpInt, phpIsNumeric, phpTrim } from \"./ns\";\n\ninterface DataFormat {\n displayFormat: DisplayFormat;\n decimals?: number;\n currency?: string;\n}\n\ninterface Resolved {\n bold: boolean;\n italic: boolean;\n textAlign: string | null;\n color: string | null;\n backgroundColor: string | null;\n fontSize: number | null;\n borderTop: string | null;\n borderRight: string | null;\n borderBottom: string | null;\n borderLeft: string | null;\n data: DataFormat | null;\n}\n\n/**\n * Cell styles and data styles -> `CellFormat`. Mirrors PHP `Reader\\Ods\\OdsStyles`,\n * where what is and is not mapped is documented.\n *\n * A cell's style is found in content.xml's automatic styles, then styles.xml's\n * common styles, and inherits along `style:parent-style-name` down to the\n * table-cell `style:default-style`. The nearest style that sets a property wins.\n */\nexport class OdsStyles {\n private readonly automatic = new Map<string, XmlNode>();\n private readonly common = new Map<string, XmlNode>();\n private defaultStyle: XmlNode | null = null;\n private readonly dataStyles = new Map<string, XmlNode>();\n private readonly resolved = new Map<string, Resolved>();\n private readonly defaultFontSize: number | null;\n\n constructor(content: XmlNode | null, styles: XmlNode | null) {\n if (content) this.index(child(content, NS.OFFICE, \"automatic-styles\"), this.automatic);\n if (styles) {\n this.index(child(styles, NS.OFFICE, \"styles\"), this.common);\n this.index(child(styles, NS.OFFICE, \"automatic-styles\"), this.common);\n }\n this.defaultFontSize = this.properties(\"Default\").fontSize;\n }\n\n /**\n * The format of one cell.\n *\n * @param styleName the cell's effective style (cell, row default, column default, or \"Default\")\n * @param valueType office:value-type\n * @param currency office:currency, the ISO code a currency value carries\n * @param dateHasTime whether an office:date-value carries a time of day\n */\n cellFormat(styleName: string, valueType: string | null, currency: string | null, dateHasTime: boolean): CellFormat | null {\n const p = this.properties(styleName);\n let data: DataFormat | null = p.data;\n const display = data?.displayFormat ?? null;\n\n // The value type says what the value IS; the data style only says how it is shown.\n switch (valueType) {\n case \"date\":\n data = { displayFormat: display === \"date\" || display === \"datetime\" ? display : dateHasTime ? \"datetime\" : \"date\" };\n break;\n case \"time\":\n data = { displayFormat: \"datetime\" };\n break;\n case \"percentage\":\n if (display !== \"percentage\") {\n data = { displayFormat: \"percentage\", ...(data?.decimals !== undefined ? { decimals: data.decimals } : {}) };\n }\n break;\n case \"currency\":\n if (display !== \"currency\") {\n data = { displayFormat: \"currency\", ...(data?.decimals !== undefined ? { decimals: data.decimals } : {}) };\n } else {\n data = { ...data! };\n }\n if (currency !== null && currency !== \"\") data.currency = currency;\n break;\n }\n\n const format = new CellFormat({\n bold: p.bold,\n italic: p.italic,\n textAlign: p.textAlign,\n displayFormat: data?.displayFormat ?? null,\n decimals: data?.decimals ?? null,\n color: p.color,\n backgroundColor: p.backgroundColor,\n fontSize: p.fontSize !== null && p.fontSize !== this.defaultFontSize ? p.fontSize : null,\n borderTop: p.borderTop,\n borderRight: p.borderRight,\n borderBottom: p.borderBottom,\n borderLeft: p.borderLeft,\n currency: data?.currency ?? null,\n });\n\n return format.isEmpty() ? null : format;\n }\n\n private index(container: XmlNode | undefined, into: Map<string, XmlNode>): void {\n if (!container) return;\n\n for (const el of childrenIn(container, NS.STYLE)) {\n const family = attr(el, NS.STYLE, \"family\") ?? \"\";\n if (el.name === \"default-style\" && family === \"table-cell\") {\n this.defaultStyle ??= el;\n } else if (el.name === \"style\" && family === \"table-cell\") {\n const name = attr(el, NS.STYLE, \"name\") ?? \"\";\n if (!into.has(name)) into.set(name, el);\n }\n }\n for (const el of childrenIn(container, NS.NUMBER)) {\n const name = attr(el, NS.STYLE, \"name\") ?? \"\";\n if (!this.dataStyles.has(name)) this.dataStyles.set(name, el);\n }\n }\n\n /** The style and its ancestors, nearest first, ending with the default style. */\n private chain(name: string): XmlNode[] {\n const chain: XmlNode[] = [];\n const seen = new Set<string>();\n // The cell's own style is normally automatic; a parent is always common.\n let el = this.automatic.get(name) ?? this.common.get(name);\n while (el !== undefined && !seen.has(name)) {\n seen.add(name);\n chain.push(el);\n name = attr(el, NS.STYLE, \"parent-style-name\") ?? \"\";\n el = name === \"\" ? undefined : this.common.get(name) ?? this.automatic.get(name);\n }\n if (this.defaultStyle) chain.push(this.defaultStyle);\n return chain;\n }\n\n private properties(name: string): Resolved {\n const cached = this.resolved.get(name);\n if (cached) return cached;\n\n const chain = this.chain(name);\n const weight = first(chain, \"text-properties\", NS.FO, \"font-weight\");\n const style = first(chain, \"text-properties\", NS.FO, \"font-style\");\n const size = first(chain, \"text-properties\", NS.FO, \"font-size\");\n\n let dataStyle: string | null = null;\n for (const el of chain) {\n const candidate = attr(el, NS.STYLE, \"data-style-name\") ?? \"\";\n if (candidate !== \"\") {\n dataStyle = candidate;\n break;\n }\n }\n\n const sizeMatch = size !== null ? /^([0-9]*\\.?[0-9]+)pt$/.exec(size) : null;\n const resolved: Resolved = {\n bold: weight !== null && (weight === \"bold\" || (phpIsNumeric(weight) && phpInt(weight) >= 600)),\n italic: style === \"italic\" || style === \"oblique\",\n textAlign: textAlign(chain),\n color: color(chain),\n backgroundColor: background(chain),\n fontSize: sizeMatch ? Math.trunc(parseFloat(sizeMatch[1]!)) : null,\n borderTop: border(chain, \"top\"),\n borderRight: border(chain, \"right\"),\n borderBottom: border(chain, \"bottom\"),\n borderLeft: border(chain, \"left\"),\n data: this.dataFormat(dataStyle, 0),\n };\n this.resolved.set(name, resolved);\n return resolved;\n }\n\n /** A data style -> displayFormat, decimals, currency. */\n private dataFormat(name: string | null, depth: number): DataFormat | null {\n if (name === null || depth > 4) return null;\n const el = this.dataStyles.get(name);\n if (!el) return null;\n\n // LibreOffice writes a signed format as the NEGATIVE sub-format with a map\n // to the positive one; the positive one is the format as authored.\n for (const map of childrenIn(el, NS.STYLE)) {\n if (map.name !== \"map\") continue;\n const condition = (attr(map, NS.STYLE, \"condition\") ?? \"\").replace(/[ \\t\\n\\r\\f\\v]+/g, \"\");\n if (condition === \"value()>=0\" || condition === \"value()>0\") {\n const mapped = this.dataFormat(attr(map, NS.STYLE, \"apply-style-name\") ?? \"\", depth + 1);\n if (mapped !== null) return mapped;\n }\n }\n\n const parts = childrenIn(el, NS.NUMBER);\n const has = (local: string): boolean => parts.some((p) => p.name === local);\n const number = parts.find((p) => p.name === \"number\");\n let decimals: number | null = null;\n if (number) {\n const places = attr(number, NS.NUMBER, \"decimal-places\") ?? attr(number, NS.NUMBER, \"min-decimal-places\");\n decimals = places !== undefined ? phpInt(places) : null;\n }\n\n switch (el.name) {\n case \"number-style\": {\n if (has(\"scientific-number\") || has(\"fraction\")) return null;\n // A currency written as literal text around a number: \"$#,##0.00\"\n // converted from xlsx arrives this way, not as a currency-style.\n for (const text of parts.filter((p) => p.name === \"text\")) {\n const iso = currencyCode(ownText(text).replace(/[-()\"\\u00A0]/g, \"\"));\n if (iso !== null) return { displayFormat: \"currency\", decimals: decimals ?? 0, currency: iso };\n }\n if (!number) return null;\n // A number with no decimal places set is \"General\".\n return decimals === null ? { displayFormat: \"auto\" } : { displayFormat: \"number\", decimals };\n }\n case \"percentage-style\":\n return { displayFormat: \"percentage\", decimals: decimals ?? 0 };\n case \"currency-style\": {\n const out: DataFormat = { displayFormat: \"currency\", decimals: decimals ?? 0 };\n const symbol = parts.find((p) => p.name === \"currency-symbol\");\n const iso = symbol ? currencyCode(ownText(symbol)) : null;\n if (iso !== null) out.currency = iso;\n return out;\n }\n case \"date-style\":\n return [\"hours\", \"minutes\", \"seconds\", \"am-pm\"].some(has) ? { displayFormat: \"datetime\" } : { displayFormat: \"date\" };\n case \"time-style\":\n return { displayFormat: \"datetime\" };\n case \"text-style\":\n return { displayFormat: \"text\" };\n default: // boolean-style, and anything newer than this reader\n return null;\n }\n }\n}\n\n/** The nearest value of one property attribute. */\nfunction first(chain: XmlNode[], properties: string, ns: string, name: string): string | null {\n for (const el of chain) {\n const props = child(el, NS.STYLE, properties);\n const value = attr(props, ns, name);\n if (value !== undefined) return phpTrim(value);\n }\n return null;\n}\n\nfunction color(chain: XmlNode[]): string | null {\n for (const el of chain) {\n const props = child(el, NS.STYLE, \"text-properties\");\n if (!props) continue;\n // \"Automatic\" colour: whatever the viewer's window text is. No fixed colour.\n if (attr(props, NS.STYLE, \"use-window-font-color\") === \"true\") return null;\n const value = attr(props, NS.FO, \"color\");\n if (value !== undefined) return hex(value);\n }\n return null;\n}\n\nfunction background(chain: XmlNode[]): string | null {\n const value = first(chain, \"table-cell-properties\", NS.FO, \"background-color\");\n return value === null || value === \"transparent\" ? null : hex(value);\n}\n\nfunction border(chain: XmlNode[], side: string): string | null {\n for (const el of chain) {\n const props = child(el, NS.STYLE, \"table-cell-properties\");\n if (!props) continue;\n const raw = attr(props, NS.FO, `border-${side}`) ?? attr(props, NS.FO, \"border\");\n if (raw === undefined) continue;\n\n const value = asciiLower(phpTrim(raw));\n if (value === \"\" || /\\b(none|hidden)\\b/.test(value)) return null;\n const m = /#([0-9a-f]{6})\\b/.exec(value);\n return m ? \"#\" + m[1]!.toUpperCase() : \"#000000\";\n }\n return null;\n}\n\nfunction textAlign(chain: XmlNode[]): string | null {\n // text-align-source=\"value-type\" means \"align by what the value is\": the\n // stored fo:text-align is not in effect.\n if (first(chain, \"table-cell-properties\", NS.STYLE, \"text-align-source\") === \"value-type\") return null;\n\n const align = first(chain, \"paragraph-properties\", NS.FO, \"text-align\");\n if (align === null || align === \"\") return null;\n if (align === \"start\") return \"left\";\n if (align === \"end\") return \"right\";\n return align;\n}\n\nfunction hex(value: string): string | null {\n const m = /^#([0-9a-fA-F]{6})$/.exec(phpTrim(value));\n return m ? \"#\" + m[1]!.toUpperCase() : null;\n}\n\nfunction currencyCode(symbol: string): string | null {\n const s = phpTrim(symbol);\n if (s === \"\") return null;\n if (/^[A-Z]{3}$/.test(s)) return s;\n return SYMBOL_TO_ISO[s] ?? null;\n}\n","import type { XmlNode } from \"../xml\";\nimport { NS } from \"./ns\";\n\n/**\n * The text of a cell or annotation: its paragraphs, one line each. Mirrors PHP\n * `Reader\\Ods\\OdsText`.\n *\n * A paragraph is mixed content — runs, links, `text:s` for extra spaces,\n * `text:tab`, `text:line-break` — and its meaning depends on ORDER, so it is\n * walked through `content`. Inside a paragraph, elements are matched by local\n * name, as the PHP reader matches them.\n *\n * White space follows ODF 1.3 §6.1.2, the way LibreOffice applies it: a run of\n * space, tab, CR and LF characters is ONE space, and white space at the start of\n * a paragraph or straight after another collapsed space is dropped. `text:s` is\n * never collapsed.\n */\n\n/** Elements whose text is not part of the paragraph (a note, a comment). */\nconst SKIPPED = new Set([\"annotation\", \"note\"]);\n\ninterface State {\n out: string;\n ignoreSpace: boolean;\n}\n\n/** The `text:p` / `text:h` children joined with \"\\n\", or null when there are none. */\nexport function paragraphs(node: XmlNode): string | null {\n const lines: string[] = [];\n for (const c of node.children) {\n if (c.ns === NS.TEXT && (c.name === \"p\" || c.name === \"h\")) lines.push(paragraph(c));\n }\n return lines.length === 0 ? null : lines.join(\"\\n\");\n}\n\nexport function paragraph(p: XmlNode): string {\n const state: State = { out: \"\", ignoreSpace: true };\n walk(p, state);\n return state.out;\n}\n\nfunction walk(node: XmlNode, state: State): void {\n for (const item of node.content ?? []) {\n if (typeof item === \"string\") {\n appendCharacters(state, item);\n continue;\n }\n if (SKIPPED.has(item.name)) continue;\n\n if (item.name === \"s\") {\n const c = item.attrs[\"c\"];\n const count = c !== undefined && /^\\d+$/.test(c) ? parseInt(c, 10) : 1;\n state.out += \" \".repeat(Math.max(1, count));\n state.ignoreSpace = false;\n } else if (item.name === \"tab\") {\n state.out += \"\\t\";\n state.ignoreSpace = false;\n } else if (item.name === \"line-break\") {\n state.out += \"\\n\";\n state.ignoreSpace = false;\n }\n walk(item, state);\n }\n}\n\nfunction appendCharacters(state: State, chars: string): void {\n for (let i = 0; i < chars.length; i++) {\n const c = chars[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n if (!state.ignoreSpace) {\n state.out += \" \";\n state.ignoreSpace = true;\n }\n continue;\n }\n state.out += c;\n state.ignoreSpace = false;\n }\n}\n","/** Excel serial → ISO-8601 string. Mirrors PHP `Reader\\Format\\DateInverter`. */\nexport const DateInverter = {\n toIso(serial: number, includeTime = false): string {\n const epoch = Date.UTC(1899, 11, 30, 0, 0, 0);\n const ms = epoch + Math.round(serial * 86400) * 1000;\n const d = new Date(ms);\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const date = `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;\n if (!includeTime) return date;\n return `${date}T${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}Z`;\n },\n};\n","import { isNumericString } from \"../util\";\nimport type { Cell } from \"../workbook/cell\";\nimport type { CellComment } from \"../workbook/cell-comment\";\nimport type { CellFormat } from \"../workbook/cell-format\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { DateInverter } from \"./format/date-inverter\";\n\n/**\n * A read `Workbook` -> the Holy Sheet schema `describe()` returns. Mirrors PHP\n * `Reader\\WorkbookSchema`.\n *\n * Shared by every reader (xlsx, ods) so the output shape cannot drift between\n * formats: key order, which empty things are dropped, and how a date-formatted\n * serial becomes an ISO string are decided here and only here.\n */\nexport const WorkbookSchema = {\n fromWorkbook(workbook: Workbook): Record<string, unknown> {\n const schema: Record<string, unknown> = { sheets: workbook.sheets.map(sheetToSchema) };\n if (Object.keys(workbook.meta).length > 0) schema[\"meta\"] = workbook.meta;\n return schema;\n },\n};\n\nfunction sheetToSchema(sheet: Sheet): Record<string, unknown> {\n const cells: Record<string, unknown> = {};\n for (const [address, cell] of sheet.cells) {\n const cellSchema = cellToSchema(cell);\n if (cellSchema === null) continue;\n cells[address] = cellSchema;\n }\n\n const out: Record<string, unknown> = { name: sheet.name, cells };\n if (sheet.mergedRegions.length > 0) {\n out[\"mergedRegions\"] = sheet.mergedRegions.map((m) => ({ start: m.start, end: m.end }));\n }\n if (sheet.columnWidths.size > 0) {\n const widths: Record<number, number> = {};\n for (const [k, v] of sheet.columnWidths) widths[k] = v;\n out[\"columnWidths\"] = widths;\n }\n if (sheet.frozenRows > 0) out[\"frozenRows\"] = sheet.frozenRows;\n if (sheet.frozenCols > 0) out[\"frozenCols\"] = sheet.frozenCols;\n return out;\n}\n\nfunction cellToSchema(cell: Cell): Record<string, unknown> | null {\n let value = cell.value;\n const format = cell.format;\n\n if (\n format !== null &&\n (format.displayFormat === \"date\" || format.displayFormat === \"datetime\") &&\n isNumericString(value as never)\n ) {\n value = DateInverter.toIso(Number(value), format.displayFormat === \"datetime\");\n }\n\n const out: Record<string, unknown> = { value };\n if (cell.formula !== null) out[\"formula\"] = cell.formula;\n if (cell.cachedValue !== null) out[\"computedValue\"] = cell.cachedValue;\n if (format !== null && !format.isEmpty()) out[\"format\"] = formatToObject(format);\n if (cell.comment !== null) out[\"comment\"] = commentToObject(cell.comment);\n\n if (Object.keys(out).length === 1 && out[\"value\"] === null) return null;\n return out;\n}\n\nfunction formatToObject(f: CellFormat): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (f.bold) out[\"bold\"] = true;\n if (f.italic) out[\"italic\"] = true;\n if (f.textAlign !== null) out[\"textAlign\"] = f.textAlign;\n if (f.displayFormat !== null) out[\"displayFormat\"] = f.displayFormat;\n if (f.decimals !== null) out[\"decimals\"] = f.decimals;\n if (f.color !== null) out[\"color\"] = f.color;\n if (f.backgroundColor !== null) out[\"backgroundColor\"] = f.backgroundColor;\n if (f.fontSize !== null) out[\"fontSize\"] = f.fontSize;\n if (f.borderTop !== null) out[\"borderTop\"] = f.borderTop;\n if (f.borderRight !== null) out[\"borderRight\"] = f.borderRight;\n if (f.borderBottom !== null) out[\"borderBottom\"] = f.borderBottom;\n if (f.borderLeft !== null) out[\"borderLeft\"] = f.borderLeft;\n if (f.currency !== null) out[\"currency\"] = f.currency;\n return out;\n}\n\nfunction commentToObject(c: CellComment): Record<string, unknown> {\n const out: Record<string, unknown> = { text: c.text };\n if (c.author !== null) out[\"author\"] = c.author;\n if (c.color !== null) out[\"color\"] = c.color;\n return out;\n}\n","/**\n * Tiny isomorphic XML parser — enough to read OOXML and OpenDocument parts\n * (replacing PHP's SimpleXML). Namespace prefixes are stripped so nodes and\n * attributes are queried by local name, matching how the PHP reader accesses\n * SimpleXML.\n *\n * `parseXml(src, { namespaces: true })` additionally resolves namespaces and\n * keeps mixed content in order, which OpenDocument needs and OOXML does not:\n *\n * - `ns` on every element, the namespace URI its prefix is bound to;\n * - `nsAttrs`, attributes keyed `{uri}local` (plain `local` when unprefixed),\n * because ODS puts `office:value-type` and `calcext:value-type` on the same\n * cell and local names alone collide;\n * - `content`, text runs and child elements in document order, because a\n * paragraph's meaning depends on where its `text:s` falls between the text.\n *\n * Attribute values in that mode get XML attribute-value normalisation (a\n * literal tab, CR or LF is a space), as libxml and expat apply it. Without the\n * option nothing changes, so the xlsx path parses exactly as it always has.\n */\n\nexport interface XmlNode {\n name: string;\n attrs: Record<string, string>;\n children: XmlNode[];\n text: string;\n /** Namespace URI. Only with `{ namespaces: true }`. */\n ns?: string;\n /** Attributes keyed `{uri}local`, or `local` when unprefixed. Only with `{ namespaces: true }`. */\n nsAttrs?: Record<string, string>;\n /** Text runs and child elements in document order. Only with `{ namespaces: true }`. */\n content?: Array<XmlNode | string>;\n}\n\nexport interface ParseXmlOptions {\n namespaces?: boolean;\n}\n\nconst XML_NS = \"http://www.w3.org/XML/1998/namespace\";\n\nfunction localName(name: string): string {\n const idx = name.indexOf(\":\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\n\nfunction unescapeXml(s: string): string {\n if (s.indexOf(\"&\") < 0) return s;\n return s.replace(/&(#x?[0-9a-fA-F]+|\\w+);/g, (m, ent: string) => {\n switch (ent) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return '\"';\n case \"apos\":\n return \"'\";\n default:\n if (ent[0] === \"#\") {\n const code = ent[1] === \"x\" || ent[1] === \"X\" ? parseInt(ent.slice(2), 16) : parseInt(ent.slice(1), 10);\n return Number.isFinite(code) ? String.fromCodePoint(code) : m;\n }\n return m;\n }\n });\n}\n\nfunction findTagEnd(src: string, from: number): number {\n let quote = \"\";\n for (let i = from; i < src.length; i++) {\n const ch = src[i]!;\n if (quote) {\n if (ch === quote) quote = \"\";\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (ch === \">\") {\n return i;\n }\n }\n return src.length;\n}\n\nconst ATTR_RE = /([^\\s=/]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n\ninterface RawTag {\n name: string;\n attrs: Record<string, string>;\n raw: Array<[string, string]>;\n}\n\nfunction parseTag(inner: string): RawTag {\n const trimmed = inner.trim();\n let i = 0;\n while (i < trimmed.length && !/\\s/.test(trimmed[i]!)) i++;\n const name = trimmed.slice(0, i);\n const attrs: Record<string, string> = {};\n const raw: Array<[string, string]> = [];\n const rest = trimmed.slice(i);\n for (const m of rest.matchAll(ATTR_RE)) {\n const rawValue = m[3] ?? m[4] ?? \"\";\n attrs[localName(m[1]!)] = unescapeXml(rawValue);\n raw.push([m[1]!, rawValue]);\n }\n return { name, attrs, raw };\n}\n\nexport function parseXml(src: string, options: ParseXmlOptions = {}): XmlNode | null {\n const namespaces = options.namespaces === true;\n let i = 0;\n const n = src.length;\n const root: XmlNode = { name: \"#root\", attrs: {}, children: [], text: \"\" };\n if (namespaces) root.content = [];\n const stack: XmlNode[] = [root];\n const scopes: Array<Record<string, string>> = [{ xml: XML_NS }];\n\n const appendText = (text: string): void => {\n const top = stack[stack.length - 1]!;\n top.text += text;\n if (namespaces && text !== \"\") top.content!.push(text);\n };\n\n while (i < n) {\n if (src[i] === \"<\") {\n if (src.startsWith(\"<!--\", i)) {\n const end = src.indexOf(\"-->\", i);\n i = end < 0 ? n : end + 3;\n continue;\n }\n if (src.startsWith(\"<![CDATA[\", i)) {\n const end = src.indexOf(\"]]>\", i);\n appendText(src.slice(i + 9, end < 0 ? n : end));\n i = end < 0 ? n : end + 3;\n continue;\n }\n if (src.startsWith(\"<?\", i)) {\n const end = src.indexOf(\"?>\", i);\n i = end < 0 ? n : end + 2;\n continue;\n }\n if (src.startsWith(\"<!\", i)) {\n const end = src.indexOf(\">\", i);\n i = end < 0 ? n : end + 1;\n continue;\n }\n if (src[i + 1] === \"/\") {\n const end = src.indexOf(\">\", i);\n if (stack.length > 1) {\n stack.pop();\n if (namespaces) scopes.pop();\n }\n i = end < 0 ? n : end + 1;\n continue;\n }\n const end = findTagEnd(src, i + 1);\n const tagContent = src.slice(i + 1, end);\n const selfClosing = tagContent.endsWith(\"/\");\n const { name, attrs, raw } = parseTag(selfClosing ? tagContent.slice(0, -1) : tagContent);\n const node: XmlNode = { name: localName(name), attrs, children: [], text: \"\" };\n const parent = stack[stack.length - 1]!;\n parent.children.push(node);\n\n let scope: Record<string, string> | undefined;\n if (namespaces) {\n scope = resolveNamespaces(node, name, raw, scopes[scopes.length - 1]!);\n parent.content!.push(node);\n }\n if (!selfClosing) {\n stack.push(node);\n if (scope) scopes.push(scope);\n }\n i = end + 1;\n } else {\n const next = src.indexOf(\"<\", i);\n const stop = next < 0 ? n : next;\n appendText(unescapeXml(src.slice(i, stop)));\n i = stop;\n }\n }\n\n return root.children[0] ?? null;\n}\n\nfunction resolveNamespaces(\n node: XmlNode,\n qname: string,\n raw: Array<[string, string]>,\n parentScope: Record<string, string>,\n): Record<string, string> {\n let scope = parentScope;\n for (const [key, value] of raw) {\n if (key === \"xmlns\" || key.startsWith(\"xmlns:\")) {\n if (scope === parentScope) scope = { ...parentScope };\n scope[key === \"xmlns\" ? \"\" : key.slice(6)] = unescapeXml(value);\n }\n }\n\n const colon = qname.indexOf(\":\");\n node.ns = scope[colon >= 0 ? qname.slice(0, colon) : \"\"] ?? \"\";\n node.content = [];\n\n const nsAttrs: Record<string, string> = {};\n for (const [key, value] of raw) {\n if (key === \"xmlns\" || key.startsWith(\"xmlns:\")) continue;\n const idx = key.indexOf(\":\");\n const normalised = unescapeXml(value.replace(/[\\t\\n\\r]/g, \" \"));\n if (idx < 0) {\n nsAttrs[key] = normalised;\n } else {\n nsAttrs[`{${scope[key.slice(0, idx)] ?? \"\"}}${key.slice(idx + 1)}`] = normalised;\n }\n }\n node.nsAttrs = nsAttrs;\n\n return scope;\n}\n\n/** First child element with the given local name. */\nexport function el(node: XmlNode | null | undefined, name: string): XmlNode | undefined {\n return node?.children.find((c) => c.name === name);\n}\n\n/** All child elements with the given local name. */\nexport function els(node: XmlNode | null | undefined, name: string): XmlNode[] {\n return node ? node.children.filter((c) => c.name === name) : [];\n}\n\n/** Attribute by local name, or undefined. */\nexport function at(node: XmlNode | null | undefined, name: string): string | undefined {\n return node?.attrs[name];\n}\n","import { unzipSync } from \"../zip\";\nimport { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport { CellComment } from \"../workbook/cell-comment\";\nimport { MergedRegion } from \"../workbook/merged-region\";\nimport { Sheet } from \"../workbook/sheet\";\nimport { Workbook } from \"../workbook/workbook\";\nimport type { CellPrimitive } from \"../schema/types\";\nimport { NS, asciiLower, attr, child, phpInt, phpIsNumeric, phpTrim } from \"./ods/ns\";\nimport { odsFormulaToA1 } from \"./ods/ods-formula\";\nimport { OdsStyles } from \"./ods/ods-styles\";\nimport { paragraphs } from \"./ods/ods-text\";\nimport { WorkbookSchema } from \"./workbook-schema\";\nimport { parseXml, type XmlNode } from \"./xml\";\n\n/** Sheet bounds. A repeat past them is padding, and is not followed. */\nconst MAX_ROWS = 1048576;\nconst MAX_COLUMNS = 16384;\n\n/** Days from the spreadsheet epoch (1899-12-30) to the Unix epoch. */\nconst UNIX_EPOCH_SERIAL = 25569;\n\nconst decoder = new TextDecoder();\n\ntype ColumnStyle = [first: number, last: number, style: string];\n\ninterface ReadCell {\n value: CellPrimitive;\n formula: string | null;\n cached: CellPrimitive;\n type: string | null;\n currency: string | null;\n dateHasTime: boolean;\n comment: CellComment | null;\n /** A date or time value as Unix seconds (UTC), until the format decides date or datetime. */\n seconds: number | null;\n}\n\ninterface SheetState {\n row: number;\n cells: Map<string, Cell>;\n merges: MergedRegion[];\n}\n\n/**\n * OpenDocument Spreadsheet (.ods) reader — bytes → Holy Sheet schema, the same\n * schema the xlsx reader returns. Mirrors PHP `Reader\\OdsReader`, where what is\n * and is not mapped is documented.\n */\nexport class OdsReader {\n describe(bytes: Uint8Array): Record<string, unknown> {\n return WorkbookSchema.fromWorkbook(this.readWorkbook(bytes));\n }\n\n readWorkbook(bytes: Uint8Array): Workbook {\n return this.readFiles(unzipSync(bytes));\n }\n\n /** Read an already-unzipped package (name -> bytes). */\n readFiles(files: Record<string, Uint8Array>): Workbook {\n const getText = (name: string): string | null => (files[name] ? decoder.decode(files[name]) : null);\n\n const content = getText(\"content.xml\");\n if (content === null) throw new Error(\"[holy-sheet] missing content.xml\");\n const contentDoc = parseXml(content, { namespaces: true });\n if (!contentDoc) throw new Error(\"[holy-sheet] failed to parse content.xml\");\n const stylesText = getText(\"styles.xml\");\n const stylesDoc = stylesText === null ? null : parseXml(stylesText, { namespaces: true });\n\n const styles = new OdsStyles(contentDoc, stylesDoc);\n\n const sheets: Sheet[] = [];\n const spreadsheet = child(child(contentDoc, NS.OFFICE, \"body\"), NS.OFFICE, \"spreadsheet\");\n for (const table of spreadsheet?.children ?? []) {\n if (table.ns === NS.TABLE && table.name === \"table\") sheets.push(this.readSheet(table, styles));\n }\n\n const meta = getText(\"meta.xml\");\n return new Workbook(sheets, meta === null ? {} : readMeta(meta));\n }\n\n private readSheet(table: XmlNode, styles: OdsStyles): Sheet {\n const columns: ColumnStyle[] = [];\n collectColumns(table, columns, { next: 0 });\n\n const state: SheetState = { row: 0, cells: new Map(), merges: [] };\n this.walkRows(table, styles, columns, state);\n\n return new Sheet(attr(table, NS.TABLE, \"name\") ?? \"\", state.cells, state.merges);\n }\n\n private walkRows(container: XmlNode, styles: OdsStyles, columns: ColumnStyle[], state: SheetState): void {\n for (const el of container.children) {\n if (state.row >= MAX_ROWS) return;\n if (el.ns !== NS.TABLE) continue;\n\n if (el.name === \"table-row\") {\n this.readRow(el, styles, columns, state);\n } else if (el.name === \"table-header-rows\" || el.name === \"table-rows\" || el.name === \"table-row-group\") {\n this.walkRows(el, styles, columns, state);\n }\n }\n }\n\n private readRow(row: XmlNode, styles: OdsStyles, columns: ColumnStyle[], state: SheetState): void {\n const repeat = Math.max(1, phpInt(attr(row, NS.TABLE, \"number-rows-repeated\") ?? \"1\"));\n const rowStyle = attr(row, NS.TABLE, \"default-cell-style-name\") ?? \"\";\n\n // One pass over the cells, reading each one that holds anything ONCE,\n // however many columns and rows it repeats across.\n const entries: Array<[number, ReadCell | null, [number, number], string]> = [];\n let column = 0;\n for (const cell of row.children) {\n if (cell.ns !== NS.TABLE || (cell.name !== \"table-cell\" && cell.name !== \"covered-table-cell\")) continue;\n\n const span: [number, number] =\n cell.name === \"table-cell\"\n ? [\n Math.max(1, phpInt(attr(cell, NS.TABLE, \"number-columns-spanned\") ?? \"1\")),\n Math.max(1, phpInt(attr(cell, NS.TABLE, \"number-rows-spanned\") ?? \"1\")),\n ]\n : [1, 1];\n const read = hasContent(cell) ? readCell(cell) : null;\n\n const count = Math.max(1, phpInt(attr(cell, NS.TABLE, \"number-columns-repeated\") ?? \"1\"));\n if (read !== null || span[0] !== 1 || span[1] !== 1) {\n const style = attr(cell, NS.TABLE, \"style-name\") ?? \"\";\n for (let i = 0; i < count && column + i < MAX_COLUMNS; i++) {\n entries.push([column + i, read, span, style]);\n }\n }\n\n column += count;\n if (column >= MAX_COLUMNS) break;\n }\n\n if (entries.length === 0) {\n state.row += repeat;\n return;\n }\n\n for (let r = 0; r < repeat && state.row < MAX_ROWS; r++) {\n const rowNumber = state.row + 1;\n for (const [col, read, span, style] of entries) {\n const address = CellAddress.letter(col) + rowNumber;\n\n if (span[0] !== 1 || span[1] !== 1) {\n state.merges.push(\n new MergedRegion(\n address,\n CellAddress.letter(Math.min(col + span[0], MAX_COLUMNS) - 1) + Math.min(rowNumber + span[1] - 1, MAX_ROWS),\n ),\n );\n }\n if (read === null) continue;\n\n const styleName = style !== \"\" ? style : rowStyle !== \"\" ? rowStyle : columnStyle(columns, col);\n const format = styles.cellFormat(styleName, read.type, read.currency, read.dateHasTime);\n let value = read.value;\n if (read.seconds !== null) {\n // A date or time value always has a date or datetime format by now.\n value = isoFromSeconds(read.seconds, format?.displayFormat !== \"date\");\n }\n state.cells.set(address, new Cell(address, value, read.formula, format, read.comment, read.cached));\n }\n state.row++;\n }\n }\n}\n\n/** Column default cell styles as [first index, last index, style name]. */\nfunction collectColumns(container: XmlNode, columns: ColumnStyle[], cursor: { next: number }): void {\n for (const el of container.children) {\n if (el.ns === NS.TABLE && el.name === \"table-column\") {\n const repeat = Math.max(1, phpInt(attr(el, NS.TABLE, \"number-columns-repeated\") ?? \"1\"));\n const style = attr(el, NS.TABLE, \"default-cell-style-name\") ?? \"\";\n if (style !== \"\") columns.push([cursor.next, cursor.next + repeat - 1, style]);\n cursor.next += repeat;\n } else if (\n el.ns === NS.TABLE &&\n (el.name === \"table-columns\" || el.name === \"table-header-columns\" || el.name === \"table-column-group\")\n ) {\n collectColumns(el, columns, cursor);\n }\n if (cursor.next >= MAX_COLUMNS) return;\n }\n}\n\nfunction columnStyle(columns: ColumnStyle[], column: number): string {\n for (const [first, last, style] of columns) {\n if (column >= first && column <= last) return style;\n }\n return \"Default\";\n}\n\n/**\n * A cell holds something when it has a value type, a formula, a comment, or\n * text. A cell with only a style is formatting over nothing, as in xlsx.\n */\nfunction hasContent(cell: XmlNode): boolean {\n if (attr(cell, NS.OFFICE, \"value-type\") !== undefined) return true;\n if (attr(cell, NS.TABLE, \"formula\") !== undefined) return true;\n if (child(cell, NS.OFFICE, \"annotation\") !== undefined) return true;\n return (paragraphs(cell) ?? \"\") !== \"\";\n}\n\n/** Everything about a cell that does not depend on where it is. */\nfunction readCell(cell: XmlNode): ReadCell {\n const type = attr(cell, NS.OFFICE, \"value-type\") ?? null;\n const text = paragraphs(cell);\n\n let value: CellPrimitive = null;\n let seconds: number | null = null;\n let dateHasTime = false;\n switch (type) {\n case \"float\":\n case \"percentage\":\n case \"currency\":\n value = toNumber(attr(cell, NS.OFFICE, \"value\") ?? \"\");\n break;\n case \"boolean\": {\n const b = asciiLower(phpTrim(attr(cell, NS.OFFICE, \"boolean-value\") ?? \"\"));\n value = b === \"true\" || b === \"1\";\n break;\n }\n case \"date\": {\n const raw = phpTrim(attr(cell, NS.OFFICE, \"date-value\") ?? \"\");\n seconds = dateSeconds(raw);\n dateHasTime = raw.includes(\"T\");\n break;\n }\n case \"time\": {\n const duration = durationSeconds(attr(cell, NS.OFFICE, \"time-value\") ?? \"\");\n seconds = duration === null ? null : duration - UNIX_EPOCH_SERIAL * 86400;\n break;\n }\n case \"string\": {\n const error = attr(cell, NS.CALCEXT, \"value-type\") === \"error\";\n const stored = attr(cell, NS.OFFICE, \"string-value\");\n value = stored !== undefined && !error ? stored : (text ?? \"\");\n break;\n }\n default:\n value = text !== null && text !== \"\" ? text : null;\n }\n\n let formula: string | null = null;\n let cached: CellPrimitive = null;\n const formulaAttr = attr(cell, NS.TABLE, \"formula\");\n if (formulaAttr !== undefined) {\n const translated = odsFormulaToA1(formulaAttr);\n const literalBoolean = type === \"boolean\" && /^[ \\t\\n\\r\\f\\v]*(TRUE|FALSE)\\(\\)[ \\t\\n\\r\\f\\v]*$/i.test(translated);\n if (!literalBoolean) {\n formula = translated;\n cached = seconds !== null ? serial(seconds) : value;\n value = null;\n seconds = null;\n }\n }\n\n let comment: CellComment | null = null;\n const annotation = child(cell, NS.OFFICE, \"annotation\");\n if (annotation) {\n const creator = child(annotation, NS.DC, \"creator\");\n const author = creator ? phpTrim(creator.text) : \"\";\n comment = new CellComment(paragraphs(annotation) ?? \"\", author === \"\" ? null : author);\n }\n\n const currency = attr(cell, NS.OFFICE, \"currency\");\n return {\n value,\n formula,\n cached,\n type,\n currency: currency !== undefined ? phpTrim(currency) : null,\n dateHasTime,\n comment,\n seconds,\n };\n}\n\n/** `office:value` as the xlsx reader coerces `<v>`. */\nfunction toNumber(raw: string): number | null {\n const s = phpTrim(raw);\n if (s === \"\") return null;\n if (/^-?\\d+$/.test(s)) return parseInt(s, 10);\n return phpIsNumeric(s) ? Number(s) : null;\n}\n\n/** `office:date-value` -> whole seconds since the Unix epoch, in UTC. */\nfunction dateSeconds(raw: string): number | null {\n const m = /^(-?\\d{4,})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(\\.\\d+)?)?)?(Z|[+-]\\d{2}:?\\d{2})?$/.exec(raw);\n if (!m) return null;\n\n const days = daysFromCivil(parseInt(m[1]!, 10), parseInt(m[2]!, 10), parseInt(m[3]!, 10));\n let seconds = days * 86400 + phpInt(m[4] ?? \"0\") * 3600 + phpInt(m[5] ?? \"0\") * 60 + phpInt(m[6] ?? \"0\");\n const fraction = m[7] !== undefined && m[7] !== \"\" ? Number(\"0\" + m[7]) : 0;\n\n const zone = m[8] ?? \"\";\n if (zone !== \"\" && zone !== \"Z\") {\n const digits = zone.slice(1).replace(\":\", \"\");\n const offset = phpInt(digits.slice(0, 2)) * 3600 + phpInt(digits.slice(2, 4)) * 60;\n seconds -= zone[0] === \"-\" ? -offset : offset;\n }\n\n return seconds + Math.round(fraction);\n}\n\n/** `office:time-value` (`PT10H30M00S`, `P1DT2H`, `-PT1H`) -> whole seconds. */\nfunction durationSeconds(raw: string): number | null {\n const m = /^(-)?P(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/.exec(phpTrim(raw));\n if (!m) return null;\n\n const total =\n phpInt(m[2] ?? \"0\") * 86400 + phpInt(m[3] ?? \"0\") * 3600 + phpInt(m[4] ?? \"0\") * 60 + (m[5] ? Number(m[5]) : 0);\n const seconds = Math.round(total);\n return m[1] === \"-\" ? -seconds : seconds;\n}\n\n/** Days since 1970-01-01 in the proleptic Gregorian calendar (Hinnant's algorithm). */\nfunction daysFromCivil(year: number, month: number, day: number): number {\n year -= month <= 2 ? 1 : 0;\n const era = Math.trunc((year >= 0 ? year : year - 399) / 400);\n const yoe = year - era * 400;\n const doy = Math.trunc((153 * (month + (month > 2 ? -3 : 9)) + 2) / 5) + day - 1;\n const doe = yoe * 365 + Math.trunc(yoe / 4) - Math.trunc(yoe / 100) + doy;\n return era * 146097 + doe - 719468;\n}\n\n/** Unix seconds -> spreadsheet serial. */\nfunction serial(seconds: number): number {\n return (seconds + UNIX_EPOCH_SERIAL * 86400) / 86400;\n}\n\n/** PHP `gmdate('Y-m-d')` / `gmdate('Y-m-d\\TH:i:s\\Z')`. */\nfunction isoFromSeconds(seconds: number, withTime: boolean): string {\n const d = new Date(seconds * 1000);\n const pad = (n: number, width = 2): string => String(n).padStart(width, \"0\");\n const date = `${pad(d.getUTCFullYear(), 4)}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;\n if (!withTime) return date;\n return `${date}T${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}Z`;\n}\n\nfunction readMeta(xml: string): Record<string, string> {\n const doc = parseXml(xml, { namespaces: true });\n const meta = child(doc, NS.OFFICE, \"meta\");\n if (!meta) return {};\n\n const out: Record<string, string> = {};\n const creator = child(meta, NS.META, \"initial-creator\") ?? child(meta, NS.DC, \"creator\");\n if (creator && phpTrim(creator.text) !== \"\") out[\"creator\"] = phpTrim(creator.text);\n const created = child(meta, NS.META, \"creation-date\");\n if (created && phpTrim(created.text) !== \"\") {\n const value = phpTrim(created.text);\n // ODF dates carry no zone unless one is written; the schema's are UTC.\n out[\"created\"] = /(Z|[+-]\\d{2}:?\\d{2})$/.test(value) ? value : value + \"Z\";\n }\n return out;\n}\n","import { CellComment } from \"../workbook/cell-comment\";\nimport { el, els, parseXml, type XmlNode } from \"./xml\";\n\n/** Parses xl/commentsN.xml → address → CellComment. Mirrors PHP `CommentsParser`. */\nexport const CommentsParser = {\n parse(commentsXml: string): Record<string, CellComment> {\n const xml = parseXml(commentsXml);\n if (!xml) return {};\n\n const authors: string[] = els(el(xml, \"authors\"), \"author\").map((a) => a.text);\n\n const out: Record<string, CellComment> = {};\n for (const c of els(el(xml, \"commentList\"), \"comment\")) {\n const ref = c.attrs[\"ref\"] ?? \"\";\n const authorIdx = c.attrs[\"authorId\"] !== undefined ? parseInt(c.attrs[\"authorId\"], 10) : -1;\n const author = authors[authorIdx] ?? null;\n out[ref] = new CellComment(extractText(el(c, \"text\")), author);\n }\n return out;\n },\n};\n\nfunction extractText(textNode: XmlNode | undefined): string {\n if (!textNode) return \"\";\n const parts: string[] = [];\n for (const r of els(textNode, \"r\")) parts.push(el(r, \"t\")?.text ?? \"\");\n for (const t of els(textNode, \"t\")) parts.push(t.text);\n return parts.join(\"\");\n}\n","import { els, parseXml } from \"./xml\";\n\nexport interface Rel {\n Target: string;\n Type: string;\n}\n\n/** Parses OOXML *.rels files → rId → {Target, Type}. Mirrors PHP `RelsParser`. */\nexport const RelsParser = {\n parse(relsXml: string): Record<string, Rel> {\n const xml = parseXml(relsXml);\n if (!xml) return {};\n const rels: Record<string, Rel> = {};\n for (const rel of els(xml, \"Relationship\")) {\n const id = rel.attrs[\"Id\"] ?? \"\";\n rels[id] = { Target: rel.attrs[\"Target\"] ?? \"\", Type: rel.attrs[\"Type\"] ?? \"\" };\n }\n return rels;\n },\n\n byType(rels: Record<string, Rel>, typeUriContains: string): Record<string, Rel> {\n const out: Record<string, Rel> = {};\n for (const [id, rel] of Object.entries(rels)) {\n if (rel.Type.includes(typeUriContains)) out[id] = rel;\n }\n return out;\n },\n};\n","import { el, els, parseXml, type XmlNode } from \"./xml\";\n\n/** Parses xl/sharedStrings.xml → string[] by index. Mirrors PHP `SharedStringsParser`. */\nexport const SharedStringsParser = {\n parse(xml: string): string[] {\n const doc = parseXml(xml);\n if (!doc) return [];\n return els(doc, \"si\").map(renderSi);\n },\n};\n\nfunction renderSi(si: XmlNode): string {\n const t = el(si, \"t\");\n if (t) return t.text;\n return els(si, \"r\")\n .map((run) => el(run, \"t\")?.text ?? \"\")\n .join(\"\");\n}\n","import { CellFormat } from \"../workbook/cell-format\";\nimport { NumFmtParser, type NumFmtParsed } from \"./format/num-fmt-parser\";\nimport { at, el, els, parseXml, type XmlNode } from \"./xml\";\n\ninterface FontRec {\n bold: boolean;\n italic: boolean;\n size: number;\n color: string | null;\n}\ninterface BorderRec {\n top: string | null;\n right: string | null;\n bottom: string | null;\n left: string | null;\n}\n\n/** Parses xl/styles.xml → (CellFormat | null)[] by xf id. Mirrors PHP `StylesParser`. */\nexport const StylesParser = {\n parse(stylesXml: string): (CellFormat | null)[] {\n const xml = parseXml(stylesXml);\n if (!xml) return [];\n\n const numFmts = parseNumFmts(xml);\n const fonts = parseFonts(xml);\n const fills = parseFills(xml);\n const borders = parseBorders(xml);\n\n const xfs: (CellFormat | null)[] = [];\n for (const xf of els(el(xml, \"cellXfs\"), \"xf\")) {\n const fontId = xf.attrs[\"fontId\"] !== undefined ? parseInt(xf.attrs[\"fontId\"], 10) : 0;\n const fillId = xf.attrs[\"fillId\"] !== undefined ? parseInt(xf.attrs[\"fillId\"], 10) : 0;\n const borderId = xf.attrs[\"borderId\"] !== undefined ? parseInt(xf.attrs[\"borderId\"], 10) : 0;\n const numFmtId = xf.attrs[\"numFmtId\"] !== undefined ? parseInt(xf.attrs[\"numFmtId\"], 10) : 0;\n\n const alignment = el(xf, \"alignment\");\n const align = alignment && alignment.attrs[\"horizontal\"] !== undefined ? alignment.attrs[\"horizontal\"] : null;\n\n const font = fonts[fontId] ?? null;\n const fill = fills[fillId] ?? null;\n const border = borders[borderId] ?? null;\n const customCode = numFmts[numFmtId];\n const numFmtParsed =\n customCode !== undefined ? NumFmtParser.parse(customCode) : NumFmtParser.parseBuiltin(numFmtId);\n\n if (xfs.length === 0 && font === null && fill === null && border === null && !numFmtParsed && align === null) {\n xfs.push(null);\n continue;\n }\n\n xfs.push(buildCellFormat(font, fill, border, numFmtParsed, align));\n }\n\n return xfs;\n },\n};\n\nfunction parseNumFmts(xml: XmlNode): Record<number, string> {\n const map: Record<number, string> = {};\n for (const nf of els(el(xml, \"numFmts\"), \"numFmt\")) {\n map[parseInt(nf.attrs[\"numFmtId\"] ?? \"0\", 10)] = nf.attrs[\"formatCode\"] ?? \"\";\n }\n return map;\n}\n\nfunction parseFonts(xml: XmlNode): FontRec[] {\n return els(el(xml, \"fonts\"), \"font\").map((f) => {\n const sz = el(f, \"sz\");\n const color = el(f, \"color\");\n return {\n bold: !!el(f, \"b\"),\n italic: !!el(f, \"i\"),\n size: sz ? Math.trunc(Number(at(sz, \"val\"))) : 11,\n color: color && at(color, \"rgb\") !== undefined ? argbToHex(at(color, \"rgb\")!) : null,\n };\n });\n}\n\nfunction parseFills(xml: XmlNode): (string | null)[] {\n return els(el(xml, \"fills\"), \"fill\").map((fill) => {\n const pf = el(fill, \"patternFill\");\n const pattern = pf ? (at(pf, \"patternType\") ?? \"\") : \"none\";\n if (pattern !== \"solid\") return null;\n const fg = el(pf, \"fgColor\");\n return fg && at(fg, \"rgb\") !== undefined ? argbToHex(at(fg, \"rgb\")!) : null;\n });\n}\n\nfunction parseBorders(xml: XmlNode): BorderRec[] {\n return els(el(xml, \"borders\"), \"border\").map((b) => {\n const rec: BorderRec = { top: null, right: null, bottom: null, left: null };\n for (const side of [\"top\", \"right\", \"bottom\", \"left\"] as const) {\n const sideEl = el(b, side);\n const color = el(sideEl, \"color\");\n if (sideEl && at(sideEl, \"style\") !== undefined && at(sideEl, \"style\") !== \"\" && color && at(color, \"rgb\") !== undefined) {\n rec[side] = argbToHex(at(color, \"rgb\")!);\n }\n }\n return rec;\n });\n}\n\nfunction buildCellFormat(\n font: FontRec | null,\n fill: string | null,\n border: BorderRec | null,\n numFmt: NumFmtParsed | null,\n align: string | null,\n): CellFormat {\n return new CellFormat({\n bold: font?.bold ?? false,\n italic: font?.italic ?? false,\n textAlign: align,\n displayFormat: numFmt?.displayFormat ?? null,\n decimals: numFmt?.decimals ?? null,\n color: font?.color ?? null,\n backgroundColor: fill,\n fontSize: font && font.size !== 11 ? font.size : null,\n borderTop: border?.top ?? null,\n borderRight: border?.right ?? null,\n borderBottom: border?.bottom ?? null,\n borderLeft: border?.left ?? null,\n currency: numFmt?.currency ?? null,\n });\n}\n\nfunction argbToHex(argb: string): string {\n const a = argb.toUpperCase();\n if (a.length === 8) return \"#\" + a.slice(2);\n if (a.length === 6) return \"#\" + a;\n return \"#000000\";\n}\n","import { Cell } from \"../workbook/cell\";\nimport type { CellComment } from \"../workbook/cell-comment\";\nimport type { CellFormat } from \"../workbook/cell-format\";\nimport type { CellPrimitive } from \"../schema/types\";\nimport { MergedRegion } from \"../workbook/merged-region\";\nimport { Sheet } from \"../workbook/sheet\";\nimport { at, el, els, parseXml, type XmlNode } from \"./xml\";\n\n/** Parses one xl/worksheets/sheetN.xml → Sheet. Mirrors PHP `WorksheetParser`. */\nexport const WorksheetParser = {\n parse(\n worksheetXml: string,\n name: string,\n stylesIndex: (CellFormat | null)[],\n comments: Record<string, CellComment> = {},\n sharedStrings: string[] = [],\n ): Sheet {\n const xml = parseXml(worksheetXml);\n if (!xml) return new Sheet(name);\n\n const cells = parseCells(xml, stylesIndex, comments, sharedStrings);\n const merges = parseMerges(xml);\n const columnWidths = parseColumnWidths(xml);\n const [frozenRows, frozenCols] = parseFrozen(xml);\n\n return new Sheet(name, cells, merges, columnWidths, frozenRows, frozenCols);\n },\n};\n\nfunction parseCells(\n xml: XmlNode,\n stylesIndex: (CellFormat | null)[],\n comments: Record<string, CellComment>,\n sharedStrings: string[],\n): Map<string, Cell> {\n const cells = new Map<string, Cell>();\n const sheetData = el(xml, \"sheetData\");\n if (!sheetData) return cells;\n\n for (const row of els(sheetData, \"row\")) {\n for (const c of els(row, \"c\")) {\n const address = c.attrs[\"r\"] ?? \"\";\n if (address === \"\") continue;\n\n const type = c.attrs[\"t\"] ?? \"n\";\n const styleIdx = c.attrs[\"s\"] !== undefined ? parseInt(c.attrs[\"s\"], 10) : 0;\n const format = stylesIndex[styleIdx] ?? null;\n\n let formula: string | null = null;\n let cachedValue: CellPrimitive = null;\n let value: CellPrimitive = null;\n\n const f = el(c, \"f\");\n const v = el(c, \"v\");\n if (f) {\n formula = f.text;\n cachedValue = v ? coerceValue(v.text, type) : null;\n } else if (type === \"inlineStr\" && el(c, \"is\") && el(el(c, \"is\"), \"t\")) {\n value = el(el(c, \"is\"), \"t\")!.text;\n } else if (type === \"s\" && v) {\n const idx = parseInt(v.text, 10);\n value = sharedStrings[idx] ?? \"\";\n } else if (v) {\n value = coerceValue(v.text, type);\n }\n\n const comment = comments[address] ?? null;\n cells.set(address, new Cell(address, value, formula, format, comment, cachedValue));\n }\n }\n return cells;\n}\n\nfunction coerceValue(raw: string, type: string): CellPrimitive {\n if (type === \"b\") return raw === \"1\" || raw === \"true\" || raw === \"TRUE\";\n if (type === \"str\") return raw;\n if (type === \"inlineStr\") return raw;\n if (raw === \"\") return null;\n if (/^-?\\d+$/.test(raw)) return parseInt(raw, 10);\n if (/^\\s*[+-]?(\\d+(\\.\\d+)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(raw)) return parseFloat(raw);\n return raw;\n}\n\nfunction parseMerges(xml: XmlNode): MergedRegion[] {\n const out: MergedRegion[] = [];\n for (const m of els(el(xml, \"mergeCells\"), \"mergeCell\")) {\n const ref = m.attrs[\"ref\"] ?? \"\";\n if (ref.includes(\":\")) {\n const [start, end] = ref.split(\":\", 2) as [string, string];\n out.push(new MergedRegion(start, end));\n }\n }\n return out;\n}\n\nfunction parseColumnWidths(xml: XmlNode): Map<number, number> {\n const out = new Map<number, number>();\n for (const col of els(el(xml, \"cols\"), \"col\")) {\n if (col.attrs[\"customWidth\"] === undefined) continue;\n const min = parseInt(col.attrs[\"min\"] ?? \"0\", 10);\n const max = parseInt(col.attrs[\"max\"] ?? \"0\", 10);\n const excelWidth = Number(col.attrs[\"width\"] ?? \"0\");\n const px = excelWidth * 7 + 5;\n for (let i = min; i <= max; i++) out.set(i - 1, Math.round(px));\n }\n return out;\n}\n\nfunction parseFrozen(xml: XmlNode): [number, number] {\n for (const view of els(el(xml, \"sheetViews\"), \"sheetView\")) {\n const pane = el(view, \"pane\");\n if (!pane) continue;\n const rows = at(pane, \"ySplit\") !== undefined ? parseInt(at(pane, \"ySplit\")!, 10) : 0;\n const cols = at(pane, \"xSplit\") !== undefined ? parseInt(at(pane, \"xSplit\")!, 10) : 0;\n return [rows, cols];\n }\n return [0, 0];\n}\n","import type { CellComment } from \"../workbook/cell-comment\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport { Workbook } from \"../workbook/workbook\";\nimport { unzipSync } from \"../zip\";\nimport { CommentsParser } from \"./comments-parser\";\nimport { RelsParser } from \"./rels-parser\";\nimport { SharedStringsParser } from \"./shared-strings-parser\";\nimport { StylesParser } from \"./styles-parser\";\nimport { WorkbookSchema } from \"./workbook-schema\";\nimport { WorksheetParser } from \"./worksheet-parser\";\nimport { at, el, els, parseXml } from \"./xml\";\n\nconst decoder = new TextDecoder();\n\n/** XLSX reader — bytes → Holy Sheet schema. Mirrors PHP `Reader\\XlsxReader`. */\nexport class XlsxReader {\n describe(bytes: Uint8Array): Record<string, unknown> {\n return WorkbookSchema.fromWorkbook(this.readWorkbook(bytes));\n }\n\n readWorkbook(bytes: Uint8Array): Workbook {\n return this.readFiles(unzipSync(bytes));\n }\n\n /** Read an already-unzipped package (name -> bytes), so a caller that sniffed it does not unzip twice. */\n readFiles(files: Record<string, Uint8Array>): Workbook {\n const getText = (name: string): string | null => (files[name] ? decoder.decode(files[name]) : null);\n\n const stylesXml = getText(\"xl/styles.xml\");\n const stylesIndex = stylesXml ? StylesParser.parse(stylesXml) : [];\n\n const sharedStringsXml = getText(\"xl/sharedStrings.xml\");\n const sharedStrings = sharedStringsXml ? SharedStringsParser.parse(sharedStringsXml) : [];\n\n const workbookXml = getText(\"xl/workbook.xml\");\n if (workbookXml === null) throw new Error(\"[holy-sheet] missing xl/workbook.xml\");\n\n const workbookRelsXml = getText(\"xl/_rels/workbook.xml.rels\");\n const workbookRels = workbookRelsXml ? RelsParser.parse(workbookRelsXml) : {};\n\n const workbookDoc = parseXml(workbookXml);\n if (!workbookDoc) throw new Error(\"[holy-sheet] failed to parse xl/workbook.xml\");\n\n const sheets: Sheet[] = [];\n let i = 0;\n for (const sheetEl of els(el(workbookDoc, \"sheets\"), \"sheet\")) {\n const name = at(sheetEl, \"name\") ?? \"\";\n const rId = at(sheetEl, \"id\") ?? \"\"; // r:id → local \"id\"\n const target = workbookRels[rId]?.Target;\n if (target == null) continue;\n\n const sheetPath = \"xl/\" + target.replace(/^\\//, \"\");\n const worksheetXml = getText(sheetPath);\n if (worksheetXml === null) continue;\n\n const sheetNum = i + 1;\n const sheetRelsXml = getText(`xl/worksheets/_rels/sheet${sheetNum}.xml.rels`);\n let comments: Record<string, CellComment> = {};\n if (sheetRelsXml) {\n const sheetRels = RelsParser.parse(sheetRelsXml);\n for (const cr of Object.values(RelsParser.byType(sheetRels, \"/comments\"))) {\n const commentsPath = resolveRelativePath(sheetPath, cr.Target);\n const commentsXml = getText(commentsPath);\n if (commentsXml) comments = { ...comments, ...CommentsParser.parse(commentsXml) };\n }\n }\n\n sheets.push(WorksheetParser.parse(worksheetXml, name, stylesIndex, comments, sharedStrings));\n i++;\n }\n\n const meta = this.parseDocProps(getText(\"docProps/core.xml\"));\n return new Workbook(sheets, meta);\n }\n\n private parseDocProps(coreXml: string | null): Record<string, unknown> {\n if (coreXml === null) return {};\n const core = parseXml(coreXml);\n if (!core) return {};\n const meta: Record<string, unknown> = {};\n const creator = el(core, \"creator\");\n if (creator) meta[\"creator\"] = creator.text;\n const created = el(core, \"created\");\n if (created) meta[\"created\"] = created.text;\n return meta;\n }\n}\n\nfunction resolveRelativePath(base: string, target: string): string {\n const baseDir = base.includes(\"/\") ? base.slice(0, base.lastIndexOf(\"/\")) : \".\";\n const combined = baseDir + \"/\" + target;\n const parts: string[] = [];\n for (const segment of combined.split(\"/\")) {\n if (segment === \"..\") parts.pop();\n else if (segment !== \"\" && segment !== \".\") parts.push(segment);\n }\n return parts.join(\"/\");\n}\n","/**\n * XML escaping, matching the PHP writer's `escape()`:\n * strips disallowed control characters, then escapes the 5 XML metacharacters\n * (`htmlspecialchars(..., ENT_XML1 | ENT_QUOTES)`).\n */\n\n// PHP: /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/u — control chars not permitted in XML 1.0.\nconst CONTROL_CHARS = new RegExp(\"[\\\\x00-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F]\", \"g\");\n\nexport function xmlEscape(s: string): string {\n return s\n .replace(CONTROL_CHARS, \"\")\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n","import type { CellFormat } from \"../../workbook/cell-format\";\n\n/**\n * Builds the Excel number-format code for a CellFormat. Returns null when no\n * numFmt is needed. Mirrors PHP `Writer\\Format\\NumFmtBuilder`.\n */\nexport const NumFmtBuilder = {\n build(format: CellFormat): string | null {\n const df = format.displayFormat;\n const decimals = format.decimals;\n\n if (df === null || df === \"auto\" || df === \"text\") return null;\n\n switch (df) {\n case \"number\":\n return numberFormat(decimals);\n case \"percentage\":\n return percentFormat(decimals);\n case \"currency\":\n return currencyFormat(format.currency, decimals);\n case \"date\":\n return \"yyyy-mm-dd\";\n case \"datetime\":\n return \"yyyy-mm-dd hh:mm:ss\";\n default:\n return null;\n }\n },\n};\n\nfunction numberFormat(decimals: number | null): string {\n if (decimals === null || decimals <= 0) return \"#,##0\";\n return \"#,##0.\" + \"0\".repeat(decimals);\n}\n\nfunction percentFormat(decimals: number | null): string {\n const d = decimals ?? 1;\n if (d <= 0) return \"0%\";\n return \"0.\" + \"0\".repeat(d) + \"%\";\n}\n\nfunction currencyFormat(currency: string | null, decimals: number | null): string {\n const symbol = currencySymbol(currency ?? \"USD\");\n const d = decimals ?? 2;\n const body = d <= 0 ? \"#,##0\" : \"#,##0.\" + \"0\".repeat(d);\n return `\"${symbol}\"${body};-\"${symbol}\"${body}`;\n}\n\nfunction currencySymbol(iso: string): string {\n switch (iso.toUpperCase()) {\n case \"USD\":\n return \"$\";\n case \"EUR\":\n return \"€\";\n case \"GBP\":\n return \"£\";\n case \"JPY\":\n return \"¥\";\n case \"CNY\":\n return \"¥\";\n case \"INR\":\n return \"₹\";\n case \"AUD\":\n return \"A$\";\n case \"CAD\":\n return \"C$\";\n case \"CHF\":\n return \"CHF\";\n case \"KRW\":\n return \"₩\";\n default:\n return iso + \" \";\n }\n}\n","import type { CellFormat } from \"../workbook/cell-format\";\nimport { xmlEscape } from \"../xml\";\nimport { NumFmtBuilder } from \"./format/num-fmt-builder\";\n\ninterface Xf {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n align: string | null;\n}\ninterface FontRec {\n size: number;\n name: string;\n color: string | null;\n bold: boolean;\n italic: boolean;\n}\ninterface BorderRec {\n top: string | null;\n right: string | null;\n bottom: string | null;\n left: string | null;\n}\n\n/**\n * Deduplicates fonts/fills/borders/numFmts and the cellXfs that combine them.\n * Mirrors PHP `Writer\\StylesRegistry` (style index 0 = the unformatted base).\n */\nexport class StylesRegistry {\n private xfIndex = new Map<string, number>([[\"__default__\", 0]]);\n private xfs: Xf[] = [{ fontId: 0, fillId: 0, borderId: 0, numFmtId: 0, align: null }];\n\n private fontIndex = new Map<string, number>([[\"__default__\", 0]]);\n private fonts: FontRec[] = [{ size: 11, name: \"Calibri\", color: null, bold: false, italic: false }];\n\n private fillIndex = new Map<string, number>([\n [\"__none__\", 0],\n [\"__gray125__\", 1],\n ]);\n private fills: ({ type: \"none\" } | { type: \"gray125\" } | { type: \"solid\"; fg: string })[] = [\n { type: \"none\" },\n { type: \"gray125\" },\n ];\n\n private borderIndex = new Map<string, number>([[\"__default__\", 0]]);\n private borders: BorderRec[] = [{ top: null, right: null, bottom: null, left: null }];\n\n private numFmtIndex = new Map<string, number>();\n private numFmts = new Map<number, string>();\n private nextNumFmtId = 164;\n\n register(format: CellFormat | null): number {\n if (format === null || format.isEmpty()) return 0;\n\n const key = format.key();\n const existing = this.xfIndex.get(key);\n if (existing !== undefined) return existing;\n\n const fontId = this.fontFor(format);\n const fillId = this.fillFor(format);\n const borderId = this.borderFor(format);\n const numFmtId = this.numFmtFor(format);\n\n this.xfs.push({ fontId, fillId, borderId, numFmtId, align: format.textAlign });\n const idx = this.xfs.length - 1;\n this.xfIndex.set(key, idx);\n return idx;\n }\n\n private fontFor(f: CellFormat): number {\n const rec: FontRec = {\n size: f.fontSize ?? 11,\n name: \"Calibri\",\n color: f.color,\n bold: f.bold,\n italic: f.italic,\n };\n const key = JSON.stringify(rec);\n const existing = this.fontIndex.get(key);\n if (existing !== undefined) return existing;\n this.fonts.push(rec);\n const idx = this.fonts.length - 1;\n this.fontIndex.set(key, idx);\n return idx;\n }\n\n private fillFor(f: CellFormat): number {\n if (f.backgroundColor === null) return 0;\n const key = f.backgroundColor.toUpperCase();\n const existing = this.fillIndex.get(key);\n if (existing !== undefined) return existing;\n this.fills.push({ type: \"solid\", fg: key });\n const idx = this.fills.length - 1;\n this.fillIndex.set(key, idx);\n return idx;\n }\n\n private borderFor(f: CellFormat): number {\n if (!f.borderTop && !f.borderRight && !f.borderBottom && !f.borderLeft) return 0;\n const rec: BorderRec = {\n top: f.borderTop,\n right: f.borderRight,\n bottom: f.borderBottom,\n left: f.borderLeft,\n };\n const key = JSON.stringify(rec);\n const existing = this.borderIndex.get(key);\n if (existing !== undefined) return existing;\n this.borders.push(rec);\n const idx = this.borders.length - 1;\n this.borderIndex.set(key, idx);\n return idx;\n }\n\n private numFmtFor(f: CellFormat): number {\n const code = NumFmtBuilder.build(f);\n if (code === null) return 0;\n const existing = this.numFmtIndex.get(code);\n if (existing !== undefined) return existing;\n const id = this.nextNumFmtId++;\n this.numFmts.set(id, code);\n this.numFmtIndex.set(code, id);\n return id;\n }\n\n toXml(): string {\n let numFmtsXml = \"\";\n if (this.numFmts.size > 0) {\n let records = \"\";\n for (const [id, code] of this.numFmts) {\n records += `<numFmt numFmtId=\"${id}\" formatCode=\"${xmlEscape(code)}\"/>`;\n }\n numFmtsXml = `<numFmts count=\"${this.numFmts.size}\">${records}</numFmts>`;\n }\n\n let fontsXml = `<fonts count=\"${this.fonts.length}\">`;\n for (const f of this.fonts) {\n fontsXml += \"<font>\";\n fontsXml += `<sz val=\"${Number(f.size)}\"/>`;\n if (f.bold) fontsXml += \"<b/>\";\n if (f.italic) fontsXml += \"<i/>\";\n if (f.color) fontsXml += `<color rgb=\"${hexToArgb(f.color)}\"/>`;\n fontsXml += `<name val=\"${xmlEscape(f.name)}\"/>`;\n fontsXml += \"</font>\";\n }\n fontsXml += \"</fonts>\";\n\n let fillsXml = `<fills count=\"${this.fills.length}\">`;\n for (const fill of this.fills) {\n if (fill.type === \"none\") {\n fillsXml += '<fill><patternFill patternType=\"none\"/></fill>';\n } else if (fill.type === \"gray125\") {\n fillsXml += '<fill><patternFill patternType=\"gray125\"/></fill>';\n } else {\n fillsXml += `<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${hexToArgb(fill.fg)}\"/></patternFill></fill>`;\n }\n }\n fillsXml += \"</fills>\";\n\n let bordersXml = `<borders count=\"${this.borders.length}\">`;\n for (const b of this.borders) {\n bordersXml += \"<border>\";\n for (const side of [\"left\", \"right\", \"top\", \"bottom\"] as const) {\n const color = b[side];\n if (!color) {\n bordersXml += `<${side}/>`;\n } else {\n bordersXml += `<${side} style=\"thin\"><color rgb=\"${hexToArgb(color)}\"/></${side}>`;\n }\n }\n bordersXml += \"<diagonal/></border>\";\n }\n bordersXml += \"</borders>\";\n\n let cellXfsXml = `<cellXfs count=\"${this.xfs.length}\">`;\n for (const xf of this.xfs) {\n let apply = \"\";\n if (xf.fontId > 0) apply += ' applyFont=\"1\"';\n if (xf.fillId > 0) apply += ' applyFill=\"1\"';\n if (xf.borderId > 0) apply += ' applyBorder=\"1\"';\n if (xf.numFmtId > 0) apply += ' applyNumberFormat=\"1\"';\n if (xf.align) apply += ' applyAlignment=\"1\"';\n cellXfsXml += `<xf numFmtId=\"${xf.numFmtId}\" fontId=\"${xf.fontId}\" fillId=\"${xf.fillId}\" borderId=\"${xf.borderId}\" xfId=\"0\"${apply}>`;\n if (xf.align) cellXfsXml += `<alignment horizontal=\"${xmlEscape(xf.align)}\"/>`;\n cellXfsXml += \"</xf>\";\n }\n cellXfsXml += \"</cellXfs>\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n numFmtsXml +\n fontsXml +\n fillsXml +\n bordersXml +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n cellXfsXml +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '<dxfs count=\"0\"/><tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>' +\n \"</styleSheet>\"\n );\n }\n}\n\n/** \"#RRGGBB\" → \"FFRRGGBB\" (Excel ARGB). */\nfunction hexToArgb(hex: string): string {\n const h = hex.replace(/^#/, \"\");\n if (h.length === 6) return \"FF\" + h.toUpperCase();\n if (h.length === 8) return h.toUpperCase();\n return \"FF000000\";\n}\n","import { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { xmlEscape } from \"../xml\";\nimport { formatFloat } from \"../util\";\nimport { zipSync, type ZipFile } from \"../zip\";\nimport { StylesRegistry } from \"./styles-registry\";\n\nconst encoder = new TextEncoder();\n\n/**\n * XLSX writer — emits a complete OOXML SpreadsheetML package as bytes.\n * Mirrors PHP `Writer\\XlsxWriter` (file I/O moved to the Agent for isomorphism).\n */\nexport class XlsxWriter {\n toBytes(workbook: Workbook): Uint8Array {\n const styles = new StylesRegistry();\n\n // Pre-render sheet xml so styles register before we serialize styles.xml.\n const sheetXmls: string[] = workbook.sheets.map((sheet) => this.sheetXml(sheet, styles));\n\n const sheetsWithComments: number[] = [];\n workbook.sheets.forEach((sheet, i) => {\n if (sheet.hasComments()) sheetsWithComments.push(i);\n });\n\n const files: ZipFile[] = [];\n const add = (name: string, xml: string): void => {\n files.push({ name, data: encoder.encode(xml) });\n };\n\n add(\"[Content_Types].xml\", this.contentTypesXml(workbook, sheetsWithComments));\n add(\"_rels/.rels\", this.rootRelsXml());\n add(\"xl/workbook.xml\", this.workbookXml(workbook));\n add(\"xl/_rels/workbook.xml.rels\", this.workbookRelsXml(workbook));\n add(\"xl/styles.xml\", styles.toXml());\n add(\"docProps/core.xml\", this.coreXml(workbook));\n add(\"docProps/app.xml\", this.appXml());\n\n workbook.sheets.forEach((sheet, i) => {\n const n = i + 1;\n add(`xl/worksheets/sheet${n}.xml`, sheetXmls[i]!);\n if (sheet.hasComments()) {\n add(`xl/worksheets/_rels/sheet${n}.xml.rels`, this.sheetRelsXml(n));\n add(`xl/comments${n}.xml`, this.commentsXml(sheet));\n add(`xl/drawings/vmlDrawing${n}.vml`, this.vmlDrawingXml(sheet));\n }\n });\n\n return zipSync(files);\n }\n\n private contentTypesXml(workbook: Workbook, sheetsWithComments: number[]): string {\n let overrides =\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>';\n\n workbook.sheets.forEach((_, i) => {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/worksheets/sheet${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n });\n\n for (const i of sheetsWithComments) {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/comments${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"/>`;\n }\n\n let defaults =\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>';\n if (sheetsWithComments.length > 0) {\n defaults += '<Default Extension=\"vml\" ContentType=\"application/vnd.openxmlformats-officedocument.vmlDrawing\"/>';\n }\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n defaults +\n overrides +\n \"</Types>\"\n );\n }\n\n private rootRelsXml(): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n '<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>' +\n \"</Relationships>\"\n );\n }\n\n private workbookXml(workbook: Workbook): string {\n let sheets = \"\";\n workbook.sheets.forEach((sheet, i) => {\n const name = this.escape(sheet.name);\n const sheetId = i + 1;\n const rId = \"rId\" + (i + 1);\n sheets += `<sheet name=\"${name}\" sheetId=\"${sheetId}\" r:id=\"${rId}\"/>`;\n });\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<sheets>${sheets}</sheets>` +\n \"</workbook>\"\n );\n }\n\n private workbookRelsXml(workbook: Workbook): string {\n let rels = \"\";\n workbook.sheets.forEach((_, i) => {\n const rId = \"rId\" + (i + 1);\n rels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${i + 1}.xml\"/>`;\n });\n rels += `<Relationship Id=\"rId${workbook.sheets.length + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n rels +\n \"</Relationships>\"\n );\n }\n\n private sheetRelsXml(sheetNum: number): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\" Target=\"../drawings/vmlDrawing${sheetNum}.vml\"/>` +\n `<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\" Target=\"../comments${sheetNum}.xml\"/>` +\n \"</Relationships>\"\n );\n }\n\n private sheetXml(sheet: Sheet, styles: StylesRegistry): string {\n let sheetViewsXml = \"\";\n if (sheet.frozenRows > 0 || sheet.frozenCols > 0) {\n const topLeft = CellAddress.letter(sheet.frozenCols) + (sheet.frozenRows + 1);\n const pane =\n \"<pane\" +\n (sheet.frozenCols > 0 ? ` xSplit=\"${sheet.frozenCols}\"` : \"\") +\n (sheet.frozenRows > 0 ? ` ySplit=\"${sheet.frozenRows}\"` : \"\") +\n ` topLeftCell=\"${topLeft}\" activePane=\"bottomRight\" state=\"frozen\"/>`;\n sheetViewsXml = `<sheetViews><sheetView workbookViewId=\"0\">${pane}</sheetView></sheetViews>`;\n }\n\n let colsXml = \"\";\n if (sheet.columnWidths.size > 0) {\n colsXml = \"<cols>\";\n for (const [colIdx, px] of sheet.columnWidths) {\n const excelWidth = Math.max(1.0, (px - 5) / 7);\n const colNum = colIdx + 1;\n colsXml += `<col min=\"${colNum}\" max=\"${colNum}\" width=\"${excelWidth.toFixed(4)}\" customWidth=\"1\"/>`;\n }\n colsXml += \"</cols>\";\n }\n\n let rowsXml = \"\";\n for (const [rowIndex, row] of sheet.rows()) {\n let cellsXml = \"\";\n const sortedCols = [...row.keys()].sort();\n for (const col of sortedCols) {\n cellsXml += this.cellXml(row.get(col)!, styles);\n }\n rowsXml += `<row r=\"${rowIndex}\">${cellsXml}</row>`;\n }\n\n let mergesXml = \"\";\n if (sheet.mergedRegions.length > 0) {\n mergesXml = `<mergeCells count=\"${sheet.mergedRegions.length}\">`;\n for (const merge of sheet.mergedRegions) mergesXml += `<mergeCell ref=\"${merge.ref()}\"/>`;\n mergesXml += \"</mergeCells>\";\n }\n\n const legacyDrawing = sheet.hasComments() ? '<legacyDrawing r:id=\"rId1\"/>' : \"\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n sheetViewsXml +\n colsXml +\n `<sheetData>${rowsXml}</sheetData>` +\n mergesXml +\n legacyDrawing +\n \"</worksheet>\"\n );\n }\n\n private cellXml(cell: Cell, styles: StylesRegistry): string {\n const ref = cell.address;\n const type = cell.excelType();\n const styleIdx = styles.register(cell.format);\n const sAttr = styleIdx > 0 ? ` s=\"${styleIdx}\"` : \"\";\n\n if (cell.formula !== null) {\n const f = this.escape(cell.formula.replace(/^=+/, \"\"));\n const cached = cell.cachedValue ?? cell.value;\n const v = cached !== null ? `<v>${this.escape(String(cached))}</v>` : \"\";\n return `<c r=\"${ref}\"${sAttr}><f>${f}</f>${v}</c>`;\n }\n\n if (type === \"inlineStr\") {\n const t = this.escape(String(cell.value));\n return `<c r=\"${ref}\"${sAttr} t=\"inlineStr\"><is><t xml:space=\"preserve\">${t}</t></is></c>`;\n }\n\n if (type === \"b\") {\n const v = cell.value === true ? \"1\" : \"0\";\n return `<c r=\"${ref}\"${sAttr} t=\"b\"><v>${v}</v></c>`;\n }\n\n if (cell.value === null) {\n return `<c r=\"${ref}\"${sAttr}/>`;\n }\n\n let v: string;\n if (typeof cell.value === \"number\") {\n // This mirrors PHP's `is_float($v) ? number_format(...) : (string) $v`,\n // but the mirror leaks: a PHP int never stringifies exponentially, while\n // in JS an INTEGER-VALUED double does above 1e21 — `String(1e21)` is\n // \"1e+21\" and `String(1e300)` is \"1e+300\". Both are integers by\n // `Number.isInteger`, so they took the String() branch and went into the\n // sheet as `<v>1e+21</v>`, which is not valid cell content.\n //\n // formatFloat handles that range exactly (via BigInt) and also maps\n // NaN/Infinity — neither of which is an integer — to 0.\n v =\n Number.isInteger(cell.value) && Math.abs(cell.value) < 1e21\n ? String(cell.value)\n : formatFloat(cell.value);\n } else {\n v = String(cell.value);\n }\n if (v === \"\") v = \"0\";\n return `<c r=\"${ref}\"${sAttr}><v>${v}</v></c>`;\n }\n\n private commentsXml(sheet: Sheet): string {\n const authors: string[] = [];\n let commentList = \"\";\n for (const entry of sheet.comments()) {\n const author = entry.comment.author ?? \"Author\";\n if (!authors.includes(author)) authors.push(author);\n const authorIdx = authors.indexOf(author);\n const text = this.escape(entry.comment.text);\n commentList +=\n `<comment ref=\"${entry.address}\" authorId=\"${authorIdx}\">` +\n `<text><r><t xml:space=\"preserve\">${text}</t></r></text>` +\n \"</comment>\";\n }\n let authorsXml = \"<authors>\";\n for (const a of authors) authorsXml += `<author>${this.escape(a)}</author>`;\n authorsXml += \"</authors>\";\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n authorsXml +\n `<commentList>${commentList}</commentList>` +\n \"</comments>\"\n );\n }\n\n private vmlDrawingXml(sheet: Sheet): string {\n let shapes = \"\";\n let shapeId = 1024;\n for (const entry of sheet.comments()) {\n const m = /^([A-Z]+)(\\d+)$/.exec(entry.address)!;\n const col = CellAddress.index(m[1]!);\n const row = parseInt(m[2]!, 10) - 1;\n shapeId++;\n shapes +=\n `<v:shape id=\"_x0000_s${shapeId}\" type=\"#_x0000_t202\" ` +\n 'style=\"position:absolute;margin-left:60pt;margin-top:5pt;width:108pt;height:60pt;z-index:1;visibility:hidden\" ' +\n 'fillcolor=\"#ffffe1\" o:insetmode=\"auto\">' +\n '<v:fill color2=\"#ffffe1\"/>' +\n '<v:shadow on=\"t\" color=\"black\" obscured=\"t\"/>' +\n '<v:path o:connecttype=\"none\"/>' +\n '<v:textbox><div style=\"text-align:left\"></div></v:textbox>' +\n '<x:ClientData ObjectType=\"Note\">' +\n \"<x:MoveWithCells/>\" +\n \"<x:SizeWithCells/>\" +\n `<x:Anchor>${col + 1}, 15, ${row}, 10, ${col + 3}, 31, ${row + 4}, 18</x:Anchor>` +\n \"<x:AutoFill>False</x:AutoFill>\" +\n `<x:Row>${row}</x:Row>` +\n `<x:Column>${col}</x:Column>` +\n \"</x:ClientData>\" +\n \"</v:shape>\";\n }\n return (\n '<xml xmlns:v=\"urn:schemas-microsoft-com:vml\" ' +\n 'xmlns:o=\"urn:schemas-microsoft-com:office:office\" ' +\n 'xmlns:x=\"urn:schemas-microsoft-com:office:excel\">' +\n '<o:shapelayout v:ext=\"edit\"><o:idmap v:ext=\"edit\" data=\"1\"/></o:shapelayout>' +\n '<v:shapetype id=\"_x0000_t202\" coordsize=\"21600,21600\" o:spt=\"202\" path=\"m,l,21600r21600,l21600,xe\">' +\n '<v:stroke joinstyle=\"miter\"/><v:path gradientshapeok=\"t\" o:connecttype=\"rect\"/></v:shapetype>' +\n shapes +\n \"</xml>\"\n );\n }\n\n private coreXml(workbook: Workbook): string {\n const now = (workbook.meta[\"created\"] as string | undefined) ?? gmDateZ();\n const creator = this.escape(String(workbook.meta[\"creator\"] ?? \"Holy Sheet\"));\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n `<dc:creator>${creator}</dc:creator>` +\n `<cp:lastModifiedBy>${creator}</cp:lastModifiedBy>` +\n `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>` +\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>` +\n \"</cp:coreProperties>\"\n );\n }\n\n private appXml(): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n \"<Application>Holy Sheet</Application>\" +\n \"<DocSecurity>0</DocSecurity>\" +\n \"<ScaleCrop>false</ScaleCrop>\" +\n \"<SharedDoc>false</SharedDoc>\" +\n \"<HyperlinksChanged>false</HyperlinksChanged>\" +\n \"<AppVersion>1.0</AppVersion>\" +\n \"</Properties>\"\n );\n }\n\n private escape(s: string): string {\n return xmlEscape(s);\n }\n}\n\n/** PHP gmdate('Y-m-d\\TH:i:s\\Z') — current UTC time, seconds precision. */\nfunction gmDateZ(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n","import { CellAddress } from \"../workbook/cell-address\";\n\n/**\n * The few PHP array and cast semantics the op reducer and diff depend on, in one\n * place so `sheet-reducer.ts` and `sheet-diff.ts` read like the PHP they mirror.\n *\n * PHP has one array type for lists and maps; a JSON object and a JSON array both\n * decode to it. `isArr` is PHP's `is_array` over parsed JSON: any object or array.\n * A key whose value is `undefined` is treated as absent, as JSON would.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Any = any;\nexport type Obj = Record<string, Any>;\n\n/** PHP `is_array`: a JSON object or a JSON array. */\nexport function isArr(value: unknown): value is Obj {\n return typeof value === \"object\" && value !== null;\n}\n\n/** PHP `array_key_exists` (a null value counts; `undefined` is absent). */\nexport function has(value: unknown, key: string): boolean {\n return isArr(value) && Object.prototype.hasOwnProperty.call(value, key) && value[key] !== undefined;\n}\n\n/** PHP `$value[$key] ?? null`. */\nexport function get(value: unknown, key: string): Any {\n return has(value, key) ? ((value as Obj)[key] ?? null) : null;\n}\n\n/** PHP `$value === []`: an empty array or an empty object. */\nexport function isEmptyArr(value: unknown): boolean {\n return isArr(value) && Object.keys(value).every((k) => value[k] === undefined);\n}\n\n/** PHP `array_values`. */\nexport function valuesOf(value: unknown): Any[] {\n if (Array.isArray(value)) return value.slice();\n if (isArr(value)) return Object.keys(value).filter((k) => value[k] !== undefined).map((k) => value[k]);\n return [];\n}\n\n/** `foreach ($value as $key => $item)`. */\nexport function entriesOf(value: unknown): [string, Any][] {\n if (Array.isArray(value)) return value.map((item, i) => [String(i), item]);\n if (isArr(value)) return Object.keys(value).filter((k) => value[k] !== undefined).map((k) => [k, value[k]]);\n return [];\n}\n\n/** PHP `(int)` cast. */\nexport function phpInt(value: unknown): number {\n if (value === null || value === undefined) return 0;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (typeof value === \"number\") return Number.isFinite(value) ? Math.trunc(value) || 0 : 0;\n if (typeof value === \"string\") {\n const m = /^[ \\t\\n\\r\\v\\f]*[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?/.exec(value);\n if (!m) return 0;\n const n = Number(m[0].trim());\n return Number.isFinite(n) ? Math.trunc(n) || 0 : 0;\n }\n if (isArr(value)) return isEmptyArr(value) ? 0 : 1;\n return 0;\n}\n\n/** PHP `(string)` cast. */\nexport function phpString(value: unknown): string {\n if (value === null || value === undefined || value === false) return \"\";\n if (value === true) return \"1\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (isArr(value)) return \"Array\";\n return String(value);\n}\n\n/** PHP `trim` with its default set: space, tab, LF, CR, NUL and vertical tab. Not `String#trim`, which strips NBSP and more. */\nexport function phpTrim(value: string): string {\n return value.replace(/^[ \\t\\n\\r\\x00\\x0B]+|[ \\t\\n\\r\\x00\\x0B]+$/g, \"\");\n}\n\n/**\n * PHP `SheetReducer::integer()`: an int, or a string of digits (`ctype_digit`);\n * anything else is null.\n *\n * One divergence cannot be removed: PHP decodes `2.0` as a float and refuses it,\n * but `JSON.parse` gives the number 2, which is accepted here. An integer past\n * PHP's int range is refused, as PHP would have decoded it as a float too.\n */\nexport function phpInteger(value: unknown): number | null {\n if (typeof value === \"number\") {\n return Number.isInteger(value) && Math.abs(value) <= 2 ** 63 ? value || 0 : null;\n }\n return typeof value === \"string\" && /^[0-9]+$/.test(value) ? phpInt(value) : null;\n}\n\n/**\n * Whether PHP reads `$key` of a `foreach` over `columnWidths` as a column index:\n * an int key (a canonical decimal string PHP stores as an int, `-1` included) or\n * a string of digits (`ctype_digit`, so `\"007\"`). `\"abc\"`, `\"1.5\"`, `\"\"` and\n * `\"-0\"` are not.\n */\nexport function isIndexKey(key: string): boolean {\n return /^[0-9]+$/.test(key) || (/^-[1-9][0-9]*$/.test(key) && BigInt(key) >= -(2n ** 63n));\n}\n\n/** PHP `strtoupper` (ASCII only since PHP 8.2, unlike `toUpperCase`). */\nexport function asciiUpper(value: string): string {\n return value.replace(/[a-z]+/g, (s) => s.toUpperCase());\n}\n\n/**\n * PHP `CellAddress::parse`: `[columnIndex, rowNumber]` or null. Written out\n * rather than reusing this port's `CellAddress.parse`, whose `trim` and\n * `toUpperCase` are Unicode-aware where PHP's are ASCII.\n */\nexport function parseAddress(address: string): [number, number] | null {\n const m = /^([A-Z]+)(\\d+)$/.exec(asciiUpper(phpTrim(address)));\n if (!m) return null;\n return [CellAddress.index(m[1]!), parseInt(m[2]!, 10)];\n}\n\nexport const letter = CellAddress.letter;\n","/**\n * JSON Schema for one sheet op — validate ops on the wire, or register the op\n * vocabulary as an LLM tool. Mirrors PHP `HolySheet\\Ops\\SheetOpSchema`, key for\n * key (pinned byte-for-byte against the PHP package by\n * `tests/sheet-ops-parity.test.ts`).\n *\n * `set_cell`, `set_range` and `set_workbook` are fancy-sheets' `SheetOp`\n * variants, same `type` and same fields, so a stored op stream can drive a live\n * `useSheetSync` session. One difference: `set_workbook.data` here is a Holy\n * Sheet schema, not fancy-sheets' `WorkbookData`.\n */\nexport const SheetOpSchema = {\n /** Every op type, in the order the variants are listed. */\n TYPES: [\n \"set_cell\",\n \"set_range\",\n \"set_workbook\",\n \"clear_cell\",\n \"insert_rows\",\n \"delete_rows\",\n \"insert_columns\",\n \"delete_columns\",\n \"add_sheet\",\n \"remove_sheet\",\n \"rename_sheet\",\n \"move_sheet\",\n \"replace_sheet\",\n \"set_merged_regions\",\n \"set_column_widths\",\n \"set_frozen\",\n \"set_meta\",\n ] as const,\n\n /** A fresh object on every call, so a caller editing it changes nothing here. */\n jsonSchema(): Record<string, unknown> {\n const address = () => ({ type: \"string\", pattern: \"^[A-Za-z]+[0-9]+$\" });\n const sheet = () => ({ type: \"string\", minLength: 1 });\n const count = () => ({ type: \"integer\", minimum: 1 });\n const position = () => ({ type: \"integer\", minimum: 1 });\n const object = () => ({ type: \"object\" });\n const nullableObject = () => ({ type: [\"object\", \"null\"] });\n const value = () => ({ type: [\"string\", \"number\", \"boolean\", \"null\"] });\n\n const variants = [\n variant(\n \"set_cell\",\n { sheet: sheet(), address: address(), value: value(), formula: { type: \"string\" }, computedValue: value(), format: nullableObject(), comment: nullableObject() },\n [\"sheet\", \"address\"],\n \"Write one cell. Omitting formula or computedValue clears it; omitting format or comment keeps it; null clears it.\",\n ),\n variant(\n \"set_range\",\n { sheet: sheet(), start: address(), end: address(), values: { type: \"array\", items: { type: \"array\", items: value() } } },\n [\"sheet\", \"start\", \"values\"],\n \"Write a block of values row-major from start, each as a set_cell with no formula.\",\n ),\n variant(\"set_workbook\", { data: object() }, [\"data\"], \"Replace the whole workbook schema.\"),\n variant(\"clear_cell\", { sheet: sheet(), address: address() }, [\"sheet\", \"address\"], \"Remove one cell.\"),\n variant(\"insert_rows\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Insert rows before 1-based row `at`; cells, merges below move down.\"),\n variant(\"delete_rows\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Delete rows starting at 1-based row `at`; cells, merges below move up.\"),\n variant(\"insert_columns\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Insert columns before 1-based column `at` (A = 1); cells, merges and widths move right.\"),\n variant(\"delete_columns\", { sheet: sheet(), at: position(), count: count() }, [\"sheet\", \"at\", \"count\"], \"Delete columns starting at 1-based column `at`; cells, merges and widths move left.\"),\n variant(\"add_sheet\", { index: { type: \"integer\", minimum: 0 }, sheet: object() }, [\"index\", \"sheet\"], \"Insert a sheet at a 0-based position.\"),\n variant(\"remove_sheet\", { sheet: sheet() }, [\"sheet\"], \"Remove a sheet by name.\"),\n variant(\"rename_sheet\", { sheet: sheet(), name: sheet() }, [\"sheet\", \"name\"], \"Rename a sheet.\"),\n variant(\"move_sheet\", { sheet: sheet(), toIndex: { type: \"integer\", minimum: 0 } }, [\"sheet\", \"toIndex\"], \"Move a sheet to a 0-based position.\"),\n variant(\"replace_sheet\", { sheet: sheet(), data: object() }, [\"sheet\", \"data\"], \"Replace one sheet whole.\"),\n variant(\n \"set_merged_regions\",\n { sheet: sheet(), mergedRegions: { type: \"array\", items: { type: \"object\", required: [\"start\", \"end\"], properties: { start: address(), end: address() } } } },\n [\"sheet\", \"mergedRegions\"],\n \"Set every merged region of a sheet.\",\n ),\n // A LIST too, as PHP 2.3.2 declares. PHP encodes a map whose keys run\n // 0..n-1 as a JSON list, so widths for columns A, B and C arrive as\n // `[120, 80, 140]` and no widths as `[]`; this port passes such a list\n // through a diff unchanged. A list's position is the column index.\n variant(\n \"set_column_widths\",\n {\n sheet: sheet(),\n columnWidths: {\n type: [\"object\", \"array\"],\n items: { type: \"number\", minimum: 0 },\n additionalProperties: { type: \"number\", minimum: 0 },\n },\n },\n [\"sheet\", \"columnWidths\"],\n \"Set every column width of a sheet (0-based column index to pixels; a list is indexed by position); empty removes them.\",\n ),\n variant(\n \"set_frozen\",\n { sheet: sheet(), rows: { type: \"integer\", minimum: 0 }, cols: { type: \"integer\", minimum: 0 } },\n [\"sheet\", \"rows\", \"cols\"],\n \"Set frozen rows and columns.\",\n ),\n variant(\"set_meta\", { meta: nullableObject() }, [\"meta\"], \"Replace the workbook meta, or remove it with null.\"),\n ];\n\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: \"Holy Sheet op\",\n description: \"One op from Agent::diff, applied by Agent::reduce.\",\n oneOf: variants,\n };\n },\n};\n\nfunction variant(\n type: string,\n properties: Record<string, unknown>,\n required: string[],\n description: string,\n): Record<string, unknown> {\n return {\n type: \"object\",\n description,\n required: [\"type\", ...required],\n additionalProperties: false,\n properties: { type: { const: type }, ...properties },\n };\n}\n","import {\n type Any,\n type Obj,\n asciiUpper,\n entriesOf,\n get,\n has,\n isArr,\n isEmptyArr,\n isIndexKey,\n letter,\n parseAddress,\n phpInt,\n phpInteger,\n phpString,\n phpTrim,\n valuesOf,\n} from \"./php\";\nimport { SheetOpSchema } from \"./sheet-op-schema\";\n\n/**\n * Apply `SheetOpSchema` ops to a Holy Sheet schema, returning a new schema.\n * Mirrors PHP `HolySheet\\Ops\\SheetReducer`, op for op.\n *\n * Pure: the input is never modified. An op naming a sheet or cell that is not\n * there is skipped, as fancy-sheets' `reduceWorkbook` skips an unknown sheet, so\n * a replayed history degrades rather than throws. Unchanged parts of the input\n * are shared with the result rather than copied, as in any immutable reducer:\n * nothing here mutates either, but a caller that mutates a result in place\n * reaches into the input too.\n *\n * `set_cell`, `set_range` and `set_workbook` keep fancy-sheets' shapes and\n * semantics — a `set_cell` without `formula` clears the formula and keeps the\n * format and comment; a null write to an absent cell does nothing — so the same\n * ops can drive a live `useSheetSync` session. Everything else is holy-sheet's:\n * the structure fancy-sheets has no op for (sheets, rows, columns, merges, widths,\n * panes, meta) and the cell parts it does not carry (`computedValue`, `format`,\n * `comment`).\n *\n * The row and column ops move cells, merged regions and column widths. They do\n * not rewrite formula text: a formula that should follow an inserted row is a\n * change to that cell, and a diff records it as one.\n */\nexport const SheetReducer = {\n /** Sheet keys the granular ops address. A sheet with any other key is authored form. */\n CELL_FORM_KEYS: [\"name\", \"cells\", \"mergedRegions\", \"columnWidths\", \"frozenRows\", \"frozenCols\"] as readonly string[],\n\n applyAll(schema: Any, ops: readonly Any[]): Any {\n for (const op of ops) {\n schema = SheetReducer.apply(schema, op);\n }\n return schema;\n },\n\n apply(schema: Any, op: Any): Any {\n const type = get(op, \"type\");\n\n // A string naming an op type, compared strictly (PHP 2.3.2, where a loose\n // `switch` let `type: true` remove a sheet). This port's switch was strict.\n if (typeof type !== \"string\" || !(SheetOpSchema.TYPES as readonly string[]).includes(type)) {\n return schema;\n }\n\n if (type === \"set_workbook\") {\n return isArr(get(op, \"data\")) ? op.data : schema;\n }\n\n if (type === \"set_meta\") {\n const out: Obj = { ...schema };\n if (get(op, \"meta\") === null) {\n delete out[\"meta\"];\n } else {\n out[\"meta\"] = op.meta;\n }\n return out;\n }\n\n const sheets: Any[] = isArr(get(schema, \"sheets\")) ? valuesOf(schema.sheets) : [];\n\n if (type === \"add_sheet\") {\n if (!isArr(get(op, \"sheet\"))) {\n return schema;\n }\n const index = has(op, \"index\") ? phpInteger(op.index) : sheets.length;\n if (index === null) {\n return schema;\n }\n sheets.splice(Math.max(0, Math.min(sheets.length, index)), 0, op.sheet);\n return { ...schema, sheets };\n }\n\n const at = find(sheets, phpString(get(op, \"sheet\") ?? \"\"));\n\n if (at === null) {\n return schema;\n }\n\n // Positions and counts are ints or digit strings (PHP 2.3.3). A present\n // value that is neither skips the op: `(int)` read junk as 0, which moved a\n // sheet to the front, inserted one there, or unfroze panes.\n for (const field of POSITION_FIELDS) {\n if (has(op, field) && phpInteger(op[field]) === null) {\n return schema;\n }\n }\n\n switch (type) {\n case \"remove_sheet\":\n sheets.splice(at, 1);\n break;\n\n case \"rename_sheet\":\n sheets[at] = { ...sheets[at], name: phpString(get(op, \"name\") ?? sheets[at].name) };\n break;\n\n case \"move_sheet\": {\n const [moved] = sheets.splice(at, 1);\n const to = Math.max(0, Math.min(sheets.length, phpInteger(get(op, \"toIndex\") ?? at) ?? at));\n sheets.splice(to, 0, moved);\n break;\n }\n\n case \"replace_sheet\":\n if (isArr(get(op, \"data\"))) {\n sheets[at] = op.data;\n }\n break;\n\n case \"set_merged_regions\":\n sheets[at] = setOrUnset(sheets[at], \"mergedRegions\", get(op, \"mergedRegions\") ?? [], EMPTY);\n break;\n\n case \"set_column_widths\":\n sheets[at] = setOrUnset(sheets[at], \"columnWidths\", get(op, \"columnWidths\") ?? [], EMPTY);\n break;\n\n case \"set_frozen\":\n sheets[at] = setOrUnset(sheets[at], \"frozenRows\", phpInteger(get(op, \"rows\") ?? 0) ?? 0, 0);\n sheets[at] = setOrUnset(sheets[at], \"frozenCols\", phpInteger(get(op, \"cols\") ?? 0) ?? 0, 0);\n break;\n\n case \"set_cell\":\n sheets[at] = setCell(sheets[at], op);\n break;\n\n case \"set_range\":\n sheets[at] = setRange(sheets[at], op);\n break;\n\n case \"clear_cell\": {\n const address = asciiUpper(phpTrim(phpString(get(op, \"address\") ?? \"\")));\n const cells = sheets[at].cells;\n // PHP's `unset($sheet['cells'][$address])` creates nothing when the key is absent.\n if (isArr(cells) && !Array.isArray(cells) && has(cells, address)) {\n const copy: Obj = { ...cells };\n delete copy[address];\n sheets[at] = { ...sheets[at], cells: copy };\n }\n break;\n }\n\n case \"insert_rows\":\n sheets[at] = shiftRows(sheets[at], position(op, \"at\"), Math.max(0, position(op, \"count\")));\n break;\n\n case \"delete_rows\":\n sheets[at] = shiftRows(sheets[at], position(op, \"at\"), -Math.max(0, position(op, \"count\")));\n break;\n\n case \"insert_columns\":\n sheets[at] = shiftColumns(sheets[at], position(op, \"at\"), Math.max(0, position(op, \"count\")));\n break;\n\n case \"delete_columns\":\n sheets[at] = shiftColumns(sheets[at], position(op, \"at\"), -Math.max(0, position(op, \"count\")));\n break;\n\n default:\n return schema;\n }\n\n return { ...schema, sheets };\n },\n};\n\n/** Op fields that hold a position or a count. */\nconst POSITION_FIELDS = [\"index\", \"toIndex\", \"rows\", \"cols\", \"at\", \"count\"] as const;\n\n/** PHP `self::integer($op[$key] ?? 0) ?? 0`, for a field the guard in apply() has checked. */\nfunction position(op: Obj, key: string): number {\n return phpInteger(get(op, key) ?? 0) ?? 0;\n}\n\n/** The `[]` a map or list key is removed at. */\nconst EMPTY = Symbol(\"empty\");\n\nfunction find(sheets: Any[], name: string): number | null {\n for (let i = 0; i < sheets.length; i++) {\n if (get(sheets[i], \"name\") === name) {\n return i;\n }\n }\n return null;\n}\n\nfunction setOrUnset(sheet: Obj, key: string, value: Any, empty: typeof EMPTY | 0): Obj {\n const out: Obj = { ...sheet };\n if (value === null || (empty === EMPTY ? isEmptyArr(value) : value === empty)) {\n delete out[key];\n } else {\n out[key] = value;\n }\n return out;\n}\n\n/**\n * fancy-sheets' `set_cell`, plus the parts of a cell it does not carry.\n *\n * - `value` is written; `formula` and `computedValue` are REPLACED — absent\n * in the op means absent in the cell, as fancy-sheets clears `formula`.\n * - `format` and `comment` are KEPT when the op omits them, replaced when it\n * carries one, and removed when it carries null.\n * - A null write to an absent cell, carrying nothing else, does nothing.\n */\nfunction setCell(sheet: Obj, op: Obj): Obj {\n // Trimmed as it is validated (PHP 2.3.2): `\" a1 \"` is A1, not a key of its own.\n const address = asciiUpper(phpTrim(phpString(get(op, \"address\") ?? \"\")));\n\n if (parseAddress(address) === null) {\n return sheet;\n }\n\n const cells: Obj = isArr(get(sheet, \"cells\")) ? { ...sheet.cells } : {};\n const existing = get(cells, address);\n const value = get(op, \"value\");\n\n const carries = (key: string): boolean => has(op, key) && op[key] !== null;\n\n if (\n existing === null &&\n value === null &&\n !carries(\"formula\") &&\n !carries(\"computedValue\") &&\n !carries(\"format\") &&\n !carries(\"comment\")\n ) {\n return sheet;\n }\n\n // `value` is optional in a CellData ({\"formula\": \"SUM(A1:A3)\"} is a whole\n // cell), so an op without one writes a cell without one.\n const cell: Obj = has(op, \"value\") ? { value } : {};\n\n for (const key of [\"formula\", \"computedValue\"]) {\n if (carries(key)) {\n cell[key] = op[key];\n }\n }\n\n for (const key of [\"format\", \"comment\"]) {\n if (has(op, key)) {\n if (op[key] !== null) {\n cell[key] = op[key];\n }\n } else if (isArr(existing) && has(existing, key)) {\n cell[key] = existing[key];\n }\n }\n\n if (Object.keys(cell).length === 0) {\n delete cells[address];\n } else {\n cells[address] = cell;\n }\n\n return { ...sheet, cells };\n}\n\n/**\n * fancy-sheets' `set_range`: values row-major from `start`, each written as a\n * `set_cell` with no formula. `end` is accepted and, as there, not read.\n */\nfunction setRange(sheet: Obj, op: Obj): Obj {\n const start = parseAddress(phpString(get(op, \"start\") ?? \"\"));\n\n if (start === null || !isArr(get(op, \"values\"))) {\n return sheet;\n }\n\n const [col0, row0] = start;\n const rows = valuesOf(op.values);\n\n for (let r = 0; r < rows.length; r++) {\n const row = valuesOf(isArr(rows[r]) ? rows[r] : []);\n for (let c = 0; c < row.length; c++) {\n sheet = setCell(sheet, { address: letter(col0 + c) + String(row0 + r), value: row[c] === undefined ? null : row[c] });\n }\n }\n\n return sheet;\n}\n\n/** Insert (`delta` > 0) or delete (`delta` < 0) rows at 1-based row `at`. */\nfunction shiftRows(sheet: Obj, at: number, delta: number): Obj {\n if (at < 1 || delta === 0) {\n return sheet;\n }\n\n sheet = remapCells(sheet, (col, row) => {\n if (row < at) {\n return [col, row];\n }\n if (delta < 0 && row < at - delta) {\n return null;\n }\n return [col, row + delta];\n });\n\n return remapMerges(sheet, \"row\", at, delta);\n}\n\n/** Insert or delete columns at 1-based column `at` (A = 1). */\nfunction shiftColumns(sheet: Obj, at: number, delta: number): Obj {\n if (at < 1 || delta === 0) {\n return sheet;\n }\n\n sheet = remapCells(sheet, (col, row) => {\n const number = col + 1;\n if (number < at) {\n return [col, row];\n }\n if (delta < 0 && number < at - delta) {\n return null;\n }\n return [col + delta, row];\n });\n\n if (isArr(get(sheet, \"columnWidths\"))) {\n const widths = new Map<number, Any>();\n for (const [index, width] of entriesOf(sheet.columnWidths)) {\n // A key that is not a column index is dropped (PHP 2.3.2), not read as\n // column 0: `(int) \"abc\"` overwrote column A's width.\n if (!isIndexKey(index)) {\n continue;\n }\n const i = phpInt(index);\n const number = i + 1;\n if (number < at) {\n widths.set(i, width);\n } else if (delta > 0 || number >= at - delta) {\n widths.set(i + delta, width);\n }\n }\n // ksort\n const sorted: Obj = {};\n for (const [index, width] of [...widths.entries()].sort((x, y) => x[0] - y[0])) {\n sorted[index] = width;\n }\n sheet = setOrUnset(sheet, \"columnWidths\", sorted, EMPTY);\n }\n\n return remapMerges(sheet, \"col\", at, delta);\n}\n\n/**\n * Move a 1-based span [start, end] for an insert or delete at `at`. Null when a\n * delete removes the whole span; a span the delete cuts into shrinks.\n */\nfunction shiftSpan(start: number, end: number, at: number, delta: number): [number, number] | null {\n if (delta > 0) {\n return [start >= at ? start + delta : start, end >= at ? end + delta : end];\n }\n\n const last = at - delta - 1; // the last deleted index\n const newStart = start < at ? start : start > last ? start + delta : at;\n const newEnd = end < at ? end : end > last ? end + delta : at - 1;\n\n return newEnd < newStart ? null : [newStart, newEnd];\n}\n\nfunction remapCells(sheet: Obj, move: (col: number, row: number) => [number, number] | null): Obj {\n if (!isArr(get(sheet, \"cells\"))) {\n return sheet;\n }\n\n const placed: [number, number, string, Any][] = [];\n\n for (const [address, cell] of entriesOf(sheet.cells)) {\n const parsed = parseAddress(address);\n\n if (parsed === null) {\n continue;\n }\n\n const to = move(parsed[0], parsed[1]);\n\n if (to !== null) {\n placed.push([to[1], to[0], letter(to[0]) + String(to[1]), cell]);\n }\n }\n\n // Row-major, the order describe() reads cells in. Array#sort is stable, as PHP 8's usort is.\n placed.sort((x, y) => x[0] - y[0] || x[1] - y[1]);\n\n const cells: Obj = {};\n for (const [, , address, cell] of placed) {\n cells[address] = cell;\n }\n\n return { ...sheet, cells };\n}\n\nfunction remapMerges(sheet: Obj, axis: \"row\" | \"col\", at: number, delta: number): Obj {\n if (!isArr(get(sheet, \"mergedRegions\"))) {\n return sheet;\n }\n\n const regions: Any[] = [];\n\n for (const region of valuesOf(sheet.mergedRegions)) {\n const start = parseAddress(phpString(get(region, \"start\") ?? \"\"));\n const end = parseAddress(phpString(get(region, \"end\") ?? \"\"));\n\n if (start === null || end === null) {\n regions.push(region);\n continue;\n }\n\n if (axis === \"row\") {\n const moved = shiftSpan(start[1], end[1], at, delta);\n if (moved === null) {\n continue;\n }\n regions.push({ start: letter(start[0]) + String(moved[0]), end: letter(end[0]) + String(moved[1]) });\n } else {\n const moved = shiftSpan(start[0] + 1, end[0] + 1, at, delta);\n if (moved === null) {\n continue;\n }\n regions.push({ start: letter(moved[0] - 1) + String(start[1]), end: letter(moved[1] - 1) + String(end[1]) });\n }\n }\n\n return setOrUnset(sheet, \"mergedRegions\", regions, EMPTY);\n}\n","import { Agent } from \"../agent\";\nimport { type Any, type Obj, entriesOf, get, has, isArr, isEmptyArr, parseAddress, phpString, valuesOf } from \"./php\";\nimport { SheetReducer } from \"./sheet-reducer\";\nimport type { SheetOp } from \"./types\";\n\n/**\n * The op list that turns one Holy Sheet schema into another. Mirrors PHP\n * `HolySheet\\Ops\\SheetDiff`: the same algorithm, so the same inputs give the\n * same ops in the same order in both runtimes (pinned against the PHP package\n * by `tests/sheet-ops-parity.test.ts`).\n *\n * ## Two guarantees, and where each applies\n *\n * 1. **Same workbook, no ops.** When `a` and `b` write the same workbook —\n * compared as `read(toBytes(...))`, so a columns/rows sheet and the cell\n * map it becomes are the same, and the timestamp the writer stamps on a\n * schema that names none is not a change — the diff is `[]`. This is what\n * makes `diff(s, read(toBytes(s)))` `[]`: saving without a change records\n * nothing.\n * 2. **Otherwise, exact.** `reduce(a, diff(a, b))` equals `b`, key order\n * aside. The ops are computed on the schemas as given and VERIFIED by\n * replaying them through `SheetReducer`; a sheet whose granular ops do not\n * reproduce it is replaced whole, and a workbook that still does not match\n * is replaced whole. Correct first, small second.\n *\n * ## Small edits stay small\n *\n * Rows and columns are ALIGNED before cells are compared (a longest common\n * subsequence over each row's, then each column's, contents), so inserting a row\n * above a hundred others is one `insert_rows` plus the new row's cells, not a\n * hundred rewritten cells. One changed cell is one `set_cell`.\n *\n * Granular ops apply to sheets in CELL form — the form `read()` returns. A sheet\n * authored as columns/rows/theme/totals, on either side, is replaced whole when\n * it changes: those keys expand at write time into cells an op could not\n * address without re-deriving the writer.\n *\n * ## Determinism\n *\n * Alignment ties break toward deleting first, and the alignment is skipped (the\n * changed middle treated as rows changed in place) past `ALIGN_LIMIT` cells of\n * work.\n */\nexport const SheetDiff = {\n /** Above this many LCS cells (after trimming the common prefix and suffix), rows or columns are not aligned. */\n ALIGN_LIMIT: 250_000,\n\n diff(a: Any, b: Any): SheetOp[] {\n if (SheetDiff.same(a, b) || SheetDiff.equivalent(a, b)) {\n return [];\n }\n\n const ops = granular(a, b);\n\n if (SheetDiff.same(SheetReducer.applyAll(a, ops), b)) {\n return ops;\n }\n\n return [{ type: \"set_workbook\", data: b }];\n },\n\n /**\n * Whether two schemas write the same workbook.\n *\n * Both are written and read back. `meta.created` is compared only when both\n * schemas name one: the writer stamps the current time on a schema that\n * does not, and that timestamp is not an edit.\n */\n equivalent(a: Any, b: Any): boolean {\n let describedA = described(a);\n let describedB = described(b);\n\n if (!namesCreated(a) || !namesCreated(b)) {\n describedA = withoutCreated(describedA);\n describedB = withoutCreated(describedB);\n }\n\n return SheetDiff.same(describedA, describedB);\n },\n\n /**\n * Structural equality with map key order ignored and list order kept.\n *\n * Equality is on values, never on insertion order — a JS object cannot keep\n * the order of integer-like keys anyway (`columnWidths`). It follows PHP's\n * canonical form, where lists and maps are one array type: `{}` equals `[]`,\n * and an object keyed exactly \"0\"..\"n-1\" equals the list of its values.\n *\n * Two divergences from the PHP `same()` cannot be removed, because the\n * distinctions do not exist in JS values:\n *\n * - PHP encodes the float `1.0` as `1.0` and the int `1` as `1`, so it calls\n * them different; JS has one number, so here they are the same. A PHP diff\n * can therefore emit a `set_cell` that rewrites `1` as `1.0` where this one\n * emits nothing. Parsed JSON gives PHP a float only for a literal written\n * with a fraction or exponent.\n * - PHP treats an int-keyed array whose keys are 0..n-1 but out of order (for\n * example `columnWidths` decoded from `{\"1\":140,\"0\":120}`) as a map, not a\n * list, and so as different from the same widths in order. A JS object has\n * no such order to compare.\n *\n * Throws a `TypeError` on a value JSON cannot hold, as PHP 2.3.2 throws\n * `JsonException`, rather than calling two such values the same:\n *\n * - a non-finite number (PHP: NAN, INF);\n * - a lone UTF-16 surrogate in a string or a key, which is this runtime's\n * invalid UTF-8 (a JS string cannot hold invalid UTF-8, and PHP's own\n * `json_decode` refuses a lone surrogate);\n * - a function or a symbol, which `JSON.stringify` would silently drop\n * (a bigint already throws there);\n * - nesting deeper than PHP's `json_encode` depth of 4096, where every object\n * and array is a level, an empty one included. The walk is iterative, so\n * this is PHP's limit and not the call stack's.\n *\n * `undefined` stays what JSON makes it: an absent key, and `null` in a list.\n */\n same(a: unknown, b: unknown): boolean {\n return canon(a) === canon(b);\n },\n\n /**\n * Hunks of a longest-common-subsequence alignment: [start in a, deleted, inserted].\n *\n * Ties break toward deleting first. Past `ALIGN_LIMIT` the changed middle is\n * one hunk.\n */\n hunks(a: readonly string[], b: readonly string[]): [number, number, number][] {\n const n = a.length;\n const m = b.length;\n let prefix = 0;\n\n while (prefix < n && prefix < m && a[prefix] === b[prefix]) {\n prefix++;\n }\n\n let suffix = 0;\n\n while (suffix < n - prefix && suffix < m - prefix && a[n - 1 - suffix] === b[m - 1 - suffix]) {\n suffix++;\n }\n\n const midA = a.slice(prefix, n - suffix);\n const midB = b.slice(prefix, m - suffix);\n const rows = midA.length;\n const cols = midB.length;\n\n if (rows === 0 && cols === 0) {\n return [];\n }\n\n if (rows * cols > SheetDiff.ALIGN_LIMIT) {\n return [[prefix, rows, cols]];\n }\n\n // lengths[i][j] = LCS of midA[i..] and midB[j..]\n const lengths: Int32Array[] = [];\n for (let i = 0; i <= rows; i++) {\n lengths.push(new Int32Array(cols + 1));\n }\n\n for (let i = rows - 1; i >= 0; i--) {\n for (let j = cols - 1; j >= 0; j--) {\n lengths[i]![j] =\n midA[i] === midB[j] ? lengths[i + 1]![j + 1]! + 1 : Math.max(lengths[i + 1]![j]!, lengths[i]![j + 1]!);\n }\n }\n\n const hunks: [number, number, number][] = [];\n let open: [number, number, number] | null = null;\n let i = 0;\n let j = 0;\n\n while (i < rows || j < cols) {\n if (i < rows && j < cols && midA[i] === midB[j]) {\n if (open !== null) {\n hunks.push(open);\n open = null;\n }\n i++;\n j++;\n continue;\n }\n\n open ??= [prefix + i, 0, 0];\n\n if (j >= cols || (i < rows && lengths[i + 1]![j]! >= lengths[i]![j + 1]!)) {\n open[1]++;\n i++;\n } else {\n open[2]++;\n j++;\n }\n }\n\n if (open !== null) {\n hunks.push(open);\n }\n\n return hunks;\n },\n};\n\n/** PHP `isset($schema['meta']['created'])`. */\nfunction namesCreated(schema: unknown): boolean {\n return get(get(schema, \"meta\"), \"created\") !== null;\n}\n\nfunction withoutCreated(schema: Obj): Obj {\n const out: Obj = { ...schema };\n if (isArr(out[\"meta\"]) && !Array.isArray(out[\"meta\"])) {\n const meta: Obj = { ...out[\"meta\"] };\n delete meta[\"created\"];\n out[\"meta\"] = meta;\n }\n if (has(out, \"meta\") && isEmptyArr(out[\"meta\"])) {\n delete out[\"meta\"];\n }\n return out;\n}\n\nfunction described(schema: Any): Obj {\n return Agent.read(Agent.toBytes(schema));\n}\n\nfunction sheetName(sheet: unknown): string {\n return phpString(get(sheet, \"name\") ?? \"\");\n}\n\nfunction granular(a: Any, b: Any): SheetOp[] {\n const sheetsA: Any[] = isArr(get(a, \"sheets\")) ? valuesOf(a.sheets) : [];\n const sheetsB: Any[] = isArr(get(b, \"sheets\")) ? valuesOf(b.sheets) : [];\n const namesA = sheetsA.map(sheetName);\n const namesB = sheetsB.map(sheetName);\n\n // Sheets are addressed by name. Two with one name cannot be told apart.\n if (new Set(namesA).size !== namesA.length || new Set(namesB).size !== namesB.length) {\n return [{ type: \"set_workbook\", data: b }];\n }\n\n const ops: SheetOp[] = [];\n\n if (!SheetDiff.same(get(a, \"meta\"), get(b, \"meta\"))) {\n ops.push({ type: \"set_meta\", meta: get(b, \"meta\") });\n }\n\n const removed = namesA.filter((name) => !namesB.includes(name));\n const added = namesB.filter((name) => !namesA.includes(name));\n const renames = new Map<string, string>();\n const renamedTo = (name: string): boolean => [...renames.values()].includes(name);\n\n // A sheet whose contents are unchanged under a new name is a rename.\n for (const old of removed) {\n for (const name of added) {\n if (renamedTo(name)) {\n continue;\n }\n if (\n SheetDiff.same(withoutName(sheetsA[namesA.indexOf(old)]), withoutName(sheetsB[namesB.indexOf(name)]))\n ) {\n renames.set(old, name);\n break;\n }\n }\n }\n\n // One sheet gone and one arrived is a rename, possibly with edits.\n let unmatchedRemoved = removed.filter((name) => !renames.has(name));\n let unmatchedAdded = added.filter((name) => !renamedTo(name));\n\n if (unmatchedRemoved.length === 1 && unmatchedAdded.length === 1) {\n renames.set(unmatchedRemoved[0]!, unmatchedAdded[0]!);\n unmatchedRemoved = [];\n unmatchedAdded = [];\n }\n\n for (const name of unmatchedRemoved) {\n ops.push({ type: \"remove_sheet\", sheet: name });\n }\n\n for (const name of namesA) {\n if (renames.has(name)) {\n ops.push({ type: \"rename_sheet\", sheet: name, name: renames.get(name)! });\n }\n }\n\n namesB.forEach((name, index) => {\n if (unmatchedAdded.includes(name)) {\n ops.push({ type: \"add_sheet\", index, sheet: sheetsB[index] });\n }\n });\n\n // Put the sheets in b's order.\n let state = SheetReducer.applyAll(a, ops);\n namesB.forEach((name, index) => {\n const current = new Map(entriesOf(get(state, \"sheets\") ?? []).map(([key, sheet]) => [key, sheetName(sheet)]));\n if ((current.get(String(index)) ?? null) !== name) {\n const op: SheetOp = { type: \"move_sheet\", sheet: name, toIndex: index };\n ops.push(op);\n state = SheetReducer.apply(state, op);\n }\n });\n\n sheetsB.forEach((target, index) => {\n const current = state.sheets[index];\n\n if (SheetDiff.same(current, target)) {\n return;\n }\n\n for (const op of sheetOps(current, target)) {\n ops.push(op);\n }\n });\n\n return ops;\n}\n\nfunction sheetOps(sheet: Obj, target: Obj): SheetOp[] {\n const name = phpString(target[\"name\"]);\n const replace: SheetOp[] = [{ type: \"replace_sheet\", sheet: name, data: target }];\n\n if (!isCellForm(sheet) || !isCellForm(target)) {\n return replace;\n }\n\n const ops: SheetOp[] = [];\n let work = sheet;\n\n for (const axis of [\"row\", \"col\"] as const) {\n const structural = structuralOps(name, work, target, axis);\n for (const op of structural) {\n ops.push(op);\n work = applyToSheet(work, op);\n }\n }\n\n const cellsW: Obj = isArr(get(work, \"cells\")) ? work[\"cells\"] : {};\n const cellsT: Obj = isArr(get(target, \"cells\")) ? target[\"cells\"] : {};\n const addresses = [...new Set([...entriesOf(cellsW), ...entriesOf(cellsT)].map(([address]) => address))];\n\n for (const address of rowMajor(addresses)) {\n if (!has(cellsT, address)) {\n ops.push({ type: \"clear_cell\", sheet: name, address });\n continue;\n }\n\n const was = get(cellsW, address);\n\n if (was !== null && SheetDiff.same(was, cellsT[address])) {\n continue;\n }\n\n ops.push(setCellOp(name, address, isArr(was) ? was : null, isArr(cellsT[address]) ? cellsT[address] : {}));\n }\n\n if (!SheetDiff.same(get(work, \"mergedRegions\") ?? [], get(target, \"mergedRegions\") ?? [])) {\n ops.push({ type: \"set_merged_regions\", sheet: name, mergedRegions: get(target, \"mergedRegions\") ?? [] });\n }\n\n if (!SheetDiff.same(get(work, \"columnWidths\") ?? [], get(target, \"columnWidths\") ?? [])) {\n // PHP emits its empty array here, which JSON-encodes as `[]`; `{}` is the\n // same value (both reducers read either as empty) in the map shape the op\n // schema declares.\n ops.push({ type: \"set_column_widths\", sheet: name, columnWidths: get(target, \"columnWidths\") ?? {} });\n }\n\n if (\n !identical(get(work, \"frozenRows\") ?? 0, get(target, \"frozenRows\") ?? 0) ||\n !identical(get(work, \"frozenCols\") ?? 0, get(target, \"frozenCols\") ?? 0)\n ) {\n ops.push({\n type: \"set_frozen\",\n sheet: name,\n rows: get(target, \"frozenRows\") ?? 0,\n cols: get(target, \"frozenCols\") ?? 0,\n });\n }\n\n // Verified per sheet, so one sheet the granular ops cannot reproduce is\n // replaced without costing the rest of the workbook its small diff.\n let result = sheet;\n for (const op of ops) {\n result = applyToSheet(result, op);\n }\n\n return SheetDiff.same(result, target) ? ops : replace;\n}\n\n/** PHP `===`: primitives by value and type; arrays structurally. */\nfunction identical(x: unknown, y: unknown): boolean {\n return isArr(x) || isArr(y) ? SheetDiff.same(x, y) : x === y;\n}\n\nfunction setCellOp(sheet: string, address: string, was: Obj | null, cell: Obj): SheetOp {\n const op: Obj = { type: \"set_cell\", sheet, address };\n\n if (has(cell, \"value\")) {\n op[\"value\"] = cell[\"value\"];\n }\n\n for (const key of [\"formula\", \"computedValue\"]) {\n if (has(cell, key)) {\n op[key] = cell[key];\n }\n }\n\n for (const key of [\"format\", \"comment\"]) {\n if (!SheetDiff.same(get(was, key), get(cell, key))) {\n op[key] = get(cell, key);\n }\n }\n\n return op as SheetOp;\n}\n\n/**\n * Row (or column) inserts and deletes, found by aligning contents.\n *\n * Emitted from the bottom (or right) up, so each op's position is still the\n * position in the sheet as it was.\n */\nfunction structuralOps(name: string, sheet: Obj, target: Obj, axis: \"row\" | \"col\"): SheetOp[] {\n const sheetLines = lines(sheet, axis);\n const targetLines = lines(target, axis);\n const ops: SheetOp[] = [];\n\n for (const [start, deleted, inserted] of SheetDiff.hunks(sheetLines, targetLines).reverse()) {\n const kept = Math.min(deleted, inserted);\n const at = start + kept + 1;\n\n if (deleted > inserted) {\n ops.push({ type: axis === \"row\" ? \"delete_rows\" : \"delete_columns\", sheet: name, at, count: deleted - inserted });\n } else if (inserted > deleted && at <= sheetLines.length) {\n // Past the last row there is nothing to move down.\n ops.push({ type: axis === \"row\" ? \"insert_rows\" : \"insert_columns\", sheet: name, at, count: inserted - deleted });\n }\n }\n\n return ops;\n}\n\n/** Each row's (or column's) contents, as a comparable string, index 0 = row 1. */\nfunction lines(sheet: Obj, axis: \"row\" | \"col\"): string[] {\n const grouped = new Map<number, Map<number, Any>>();\n let max = 0;\n\n for (const [address, cell] of entriesOf(isArr(get(sheet, \"cells\")) ? sheet[\"cells\"] : {})) {\n const parsed = parseAddress(address);\n if (parsed === null) {\n continue;\n }\n const [col, row] = parsed;\n const line = axis === \"row\" ? row : col + 1;\n const position = axis === \"row\" ? col : row;\n let group = grouped.get(line);\n if (group === undefined) {\n group = new Map();\n grouped.set(line, group);\n }\n group.set(position, cell);\n max = Math.max(max, line);\n }\n\n const out: string[] = [];\n for (let i = 1; i <= max; i++) {\n const positions = [...(grouped.get(i) ?? new Map<number, Any>()).entries()].sort((x, y) => x[0] - y[0]);\n out.push(canonEntries(positions.map(([position, cell]) => [String(position), cell])));\n }\n\n return out;\n}\n\nfunction applyToSheet(sheet: Obj, op: SheetOp): Obj {\n return SheetReducer.apply({ sheets: [sheet] }, op).sheets[0];\n}\n\nfunction isCellForm(sheet: Obj): boolean {\n return entriesOf(sheet).every(([key]) => SheetReducer.CELL_FORM_KEYS.includes(key));\n}\n\nfunction withoutName(sheet: Obj): Obj {\n const out: Obj = isArr(sheet) ? { ...sheet } : {};\n delete out[\"name\"];\n return out;\n}\n\nfunction rowMajor(addresses: readonly string[]): string[] {\n const parsed: [number, number, string][] = [];\n\n for (const address of addresses) {\n const cell = parseAddress(address);\n if (cell !== null) {\n parsed.push([cell[1], cell[0], address]);\n }\n }\n\n parsed.sort((x, y) => x[0] - y[0] || x[1] - y[1]);\n\n return parsed.map(([, , address]) => address);\n}\n\n/**\n * PHP's canonical JSON, for equality only: map keys sorted, list order kept, and\n * an array keyed exactly 0..n-1 (every empty one included) written as a list.\n * The key order and escaping differ from PHP's bytes; which values compare\n * equal does not (see `same()` for the two exceptions, and for what throws).\n */\nfunction canon(value: unknown): string {\n return isArr(value) ? canonEntries(entriesFor(value)) : scalar(value);\n}\n\n/** `SheetDiff::canon()` passes `json_encode` this depth explicitly. */\nconst JSON_DEPTH = 4096;\n\ntype Frame = { key: string; entries: [string, unknown][]; list: boolean; next: number; parts: string[] };\n\n/**\n * `canon()` of an array given as its entries. A loop over an explicit stack, not\n * recursion: the call stack runs out before PHP's 4096 levels do.\n */\nfunction canonEntries(root: [string, unknown][]): string {\n const stack: Frame[] = [];\n\n const open = (key: string, entries: [string, unknown][]): void => {\n if (stack.length === JSON_DEPTH) {\n throw unencodable(\"Maximum stack depth exceeded\");\n }\n const list = entries.every(([k], i) => k === String(i));\n if (!list) {\n entries = entries.slice().sort((x, y) => (x[0] < y[0] ? -1 : x[0] > y[0] ? 1 : 0));\n }\n stack.push({ key, entries, list, next: 0, parts: [] });\n };\n\n open(\"\", root);\n\n for (;;) {\n const top = stack[stack.length - 1]!;\n\n if (top.next < top.entries.length) {\n const [key, item] = top.entries[top.next++]!;\n if (isArr(item)) {\n open(key, entriesFor(item));\n } else {\n top.parts.push(member(top, key, scalar(item)));\n }\n continue;\n }\n\n stack.pop();\n const text = top.list ? \"[\" + top.parts.join(\",\") + \"]\" : \"{\" + top.parts.join(\",\") + \"}\";\n const parent = stack[stack.length - 1];\n if (parent === undefined) {\n return text;\n }\n parent.parts.push(member(parent, top.key, text));\n }\n}\n\n/** An array is always a list, as JSON writes it; an object lists its defined keys. */\nfunction entriesFor(value: Obj): [string, unknown][] {\n return Array.isArray(value) ? Array.from(value, (item, i): [string, unknown] => [String(i), item]) : entriesOf(value);\n}\n\nfunction member(frame: Frame, key: string, text: string): string {\n return frame.list ? text : quote(key) + \":\" + text;\n}\n\nfunction scalar(value: unknown): string {\n switch (typeof value) {\n case \"number\":\n if (!Number.isFinite(value)) {\n throw unencodable(\"Inf and NaN cannot be JSON encoded\");\n }\n break;\n case \"string\":\n return quote(value);\n case \"function\":\n case \"symbol\":\n throw unencodable(`a ${typeof value} cannot be JSON encoded`);\n }\n // A bigint throws here, as JSON.stringify's own TypeError; undefined is null.\n return JSON.stringify(value) ?? \"null\";\n}\n\nconst LONE_SURROGATE = /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/;\n\nfunction quote(text: string): string {\n if (LONE_SURROGATE.test(text)) {\n throw unencodable(\"Single unpaired UTF-16 surrogate\");\n }\n return JSON.stringify(text);\n}\n\nfunction unencodable(reason: string): TypeError {\n return new TypeError(`[holy-sheet] cannot compare a value JSON cannot hold: ${reason}`);\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://github.com/Particle-Academy/holy-sheet/skills/holy-sheet.schema.json\",\n \"title\": \"Holy Sheet workbook schema\",\n \"description\": \"Input format for HolySheet\\\\Agent::write(). Describes a multi-sheet xlsx workbook agentically. Everything in this schema is SUPPORTED NOW: values, formulas, per-column types and number formats, per-cell styling, themes, merges, frozen panes, column widths, totals and comments. A workbook is judged by how it READS, not only by whether the numbers are right — money should render as money and a header row should look like one, so prefer a typed column over a raw number and set the presentation the document needs.\",\n \"type\": \"object\",\n \"required\": [\n \"sheets\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"sheets\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"description\": \"One or more sheets. The first sheet is shown when the file opens.\",\n \"items\": {\n \"$ref\": \"#/definitions/Sheet\"\n }\n },\n \"meta\": {\n \"type\": \"object\",\n \"description\": \"Optional workbook metadata surfaced in Excel's File → Info pane.\",\n \"properties\": {\n \"creator\": {\n \"type\": \"string\"\n },\n \"created\": {\n \"type\": \"string\",\n \"description\": \"ISO-8601 datetime. Defaults to now().\"\n }\n },\n \"additionalProperties\": true\n }\n },\n \"definitions\": {\n \"Sheet\": {\n \"type\": \"object\",\n \"required\": [\n \"name\"\n ],\n \"additionalProperties\": false,\n \"oneOf\": [\n {\n \"required\": [\n \"columns\",\n \"rows\"\n ],\n \"description\": \"Row-oriented (agent-ergonomic).\"\n },\n {\n \"required\": [\n \"cells\"\n ],\n \"description\": \"Sparse A1-keyed map (fancy-sheets passthrough).\"\n }\n ],\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 31,\n \"description\": \"Tab label in Excel. Excel limits to 31 chars and forbids /\\\\?*[]:\"\n },\n \"columns\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/Column\"\n },\n \"description\": \"When present, the first row is the header row. Column types are applied to every row in that column.\"\n },\n \"rows\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"array\",\n \"description\": \"One row of cell values, in column order. Use null for missing values.\",\n \"items\": {\n \"$ref\": \"#/definitions/CellValue\"\n }\n }\n },\n \"cells\": {\n \"type\": \"object\",\n \"description\": \"Sparse cells keyed by A1 address, for anything the row/column model does not cover — a title band, a callout, a note. May be used ALONGSIDE columns/rows: the explicit cell wins at its address and inherits that column's format for anything it does not set.\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/CellData\"\n },\n \"patternProperties\": {\n \"^[A-Z]+[1-9][0-9]*$\": {\n \"$ref\": \"#/definitions/CellData\"\n }\n }\n },\n \"totals\": {\n \"type\": \"object\",\n \"description\": \"Symbolic aggregations appended below the data. Key = column header; value = one of sum, avg, count, min, max. These become real FORMULAS, so a total updates when a figure above it is edited — a row of typed numbers looks identical and is wrong the moment anyone changes anything.\",\n \"additionalProperties\": {\n \"type\": \"string\",\n \"enum\": [\n \"sum\",\n \"avg\",\n \"count\",\n \"min\",\n \"max\"\n ]\n }\n },\n \"theme\": {\n \"type\": \"string\",\n \"enum\": [\n \"default\",\n \"minimal\",\n \"plain\",\n \"business\"\n ],\n \"default\": \"default\",\n \"description\": \"Pre-baked style preset applied to headers, banding and totals. The cheapest way to make a sheet look deliberate: set it unless you are styling every cell yourself.\"\n },\n \"mergedRegions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"start\",\n \"end\"\n ],\n \"properties\": {\n \"start\": {\n \"type\": \"string\",\n \"description\": \"A1 ref of top-left.\"\n },\n \"end\": {\n \"type\": \"string\",\n \"description\": \"A1 ref of bottom-right.\"\n }\n }\n },\n \"description\": \"Cells to merge, as [{start, end}] — e.g. [{\\\"start\\\": \\\"A1\\\", \\\"end\\\": \\\"D1\\\"}]. Use it for a title band spanning the table.\"\n },\n \"columnWidths\": {\n \"type\": \"object\",\n \"description\": \"Override widths in pixels. Keys are 0-based column indexes. Set these when a header or a formatted number would otherwise be cut off or shown as ####.\",\n \"additionalProperties\": {\n \"type\": \"number\",\n \"minimum\": 0\n }\n },\n \"frozenRows\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"How many rows stay visible while the sheet scrolls. Set to 1 whenever there is a header row, so the reader can still see what the columns are further down.\"\n },\n \"frozenCols\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"How many columns stay visible while the sheet scrolls sideways. Set to 1 when the first column is the label for the row.\"\n }\n }\n },\n \"Column\": {\n \"type\": \"object\",\n \"required\": [\n \"header\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"header\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"auto\",\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"date\",\n \"datetime\",\n \"currency\",\n \"percent\",\n \"formula\"\n ],\n \"default\": \"auto\",\n \"description\": \"Cell type applied to every value in this column, and the main thing deciding whether the sheet reads as a document or as a dump. Use 'currency' for money, 'percent' for rates and 'date' for dates — 'auto' infers a plain number and leaves 1250000.5 looking like 1250000.5.\"\n },\n \"currency\": {\n \"type\": \"string\",\n \"description\": \"ISO currency code for a 'currency' column, e.g. USD. Pair it with decimals: 2.\"\n },\n \"decimals\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 10,\n \"description\": \"Decimal places for a numeric, currency or percent column. Money is normally 2; a growth rate is normally 1.\"\n },\n \"format\": {\n \"type\": \"string\",\n \"description\": \"Custom Excel number format string. Overrides type-derived format. Power-user escape hatch.\"\n },\n \"width\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"Column width in pixels. Same as columnWidths but per-column.\"\n }\n }\n },\n \"CellValue\": {\n \"description\": \"A primitive value, null, or an object {value, formula, format, comment} for per-cell control.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n },\n {\n \"$ref\": \"#/definitions/CellData\"\n }\n ]\n },\n \"CellData\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"value\": {\n \"description\": \"Raw cell value.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"formula\": {\n \"type\": \"string\",\n \"description\": \"Formula without leading '='. e.g. 'SUM(A1:A10)' or 'Sheet2!B5+1'.\"\n },\n \"computedValue\": {\n \"description\": \"Cached value from a previous evaluation. When present, Excel shows it without recomputing on open.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"format\": {\n \"$ref\": \"#/definitions/CellFormat\"\n },\n \"comment\": {\n \"$ref\": \"#/definitions/CellComment\"\n }\n }\n },\n \"CellFormat\": {\n \"type\": \"object\",\n \"description\": \"Per-cell presentation: bold, italic, font size, text and background colour, alignment, borders and number format. Use it for the things a column type cannot express — a title band, a highlighted figure, a ruled callout.\",\n \"additionalProperties\": false,\n \"properties\": {\n \"bold\": {\n \"type\": \"boolean\"\n },\n \"italic\": {\n \"type\": \"boolean\"\n },\n \"textAlign\": {\n \"type\": \"string\",\n \"enum\": [\n \"left\",\n \"center\",\n \"right\"\n ]\n },\n \"displayFormat\": {\n \"type\": \"string\",\n \"enum\": [\n \"auto\",\n \"text\",\n \"number\",\n \"date\",\n \"datetime\",\n \"percentage\",\n \"currency\"\n ]\n },\n \"decimals\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 10\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Hex color (#RRGGBB) for text.\"\n },\n \"backgroundColor\": {\n \"type\": \"string\",\n \"description\": \"Hex color for cell fill.\"\n },\n \"fontSize\": {\n \"type\": \"integer\",\n \"minimum\": 6,\n \"maximum\": 72\n },\n \"borderTop\": {\n \"type\": \"string\"\n },\n \"borderRight\": {\n \"type\": \"string\"\n },\n \"borderBottom\": {\n \"type\": \"string\"\n },\n \"borderLeft\": {\n \"type\": \"string\"\n }\n }\n },\n \"CellComment\": {\n \"type\": \"object\",\n \"description\": \"A reviewer note attached to a cell. Accepts a plain string, or an object with text/author/color.\",\n \"required\": [\n \"text\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n },\n \"author\": {\n \"type\": \"string\"\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Hex color for the corner triangle indicator.\"\n }\n }\n }\n }\n}\n","import { ArrayBuilder } from \"./helpers/array-builder\";\nimport { CsvBuilder } from \"./helpers/csv-builder\";\nimport { FormulaLinter } from \"./schema/formula-linter\";\nimport { Normalizer } from \"./schema/normalizer\";\nimport { Validator } from \"./schema/validator\";\nimport type {\n BuilderOptions,\n FormulaProblem,\n HolySheetSchema,\n RepairResult,\n ValidationError,\n WriteResult,\n} from \"./schema/types\";\nimport { FormatSniffer } from \"./reader/format-sniffer\";\nimport { OdsReader } from \"./reader/ods-reader\";\nimport { WorkbookSchema } from \"./reader/workbook-schema\";\nimport { XlsxReader } from \"./reader/xlsx-reader\";\nimport { XlsxWriter } from \"./writer/xlsx-writer\";\nimport { SheetDiff } from \"./ops/sheet-diff\";\nimport { SheetOpSchema } from \"./ops/sheet-op-schema\";\nimport { SheetReducer } from \"./ops/sheet-reducer\";\nimport type { SheetOp } from \"./ops/types\";\nimport toolSchema from \"./holy-sheet.schema.json\";\n\n/** This package's own version, pinned to package.json by `version.test.ts`. */\nexport const VERSION = \"2.4.3\";\n\ntype Any = any;\n\nfunction toU8(input: Uint8Array | ArrayBuffer): Uint8Array {\n return input instanceof Uint8Array ? input : new Uint8Array(input);\n}\n\nfunction readSpreadsheet(bytes: Uint8Array, path: string | null): Record<string, unknown> {\n const { format, files } = FormatSniffer.sniff(bytes, path);\n const workbook = format === \"ods\" ? new OdsReader().readFiles(files) : new XlsxReader().readFiles(files);\n return WorkbookSchema.fromWorkbook(workbook);\n}\n\n/**\n * Agent — the structured-tool surface for Holy Sheet. Mirrors PHP `Agent`.\n * Universal methods are synchronous; file-touching methods (`write`,\n * `describe`-from-path) are async and Node-only (browsers have no sync FS).\n */\nexport const Agent = {\n /** Validate a schema without writing. Empty array = valid. */\n validate(schema: Any): ValidationError[] {\n return new Validator().validate(schema);\n },\n\n /** xlsx bytes without touching disk. Universal. Throws SchemaException if invalid. */\n toBytes(schema: Any): Uint8Array {\n new Validator().assert(schema);\n const workbook = new Normalizer().normalize(schema);\n return new XlsxWriter().toBytes(workbook);\n },\n\n /** Write a workbook to disk (Node only). Throws SchemaException if invalid. */\n async write(schema: Any, path: string): Promise<WriteResult> {\n new Validator().assert(schema);\n const workbook = new Normalizer().normalize(schema);\n const bytes = new XlsxWriter().toBytes(workbook);\n const fs = await import(\"node:fs\");\n fs.writeFileSync(path, bytes);\n return { path, bytes: bytes.length, sheets: workbook.sheets.length };\n },\n\n /** JSON Schema for LLM tool-use. */\n toolDefinition(): Record<string, unknown> {\n return toolSchema as Record<string, unknown>;\n },\n\n /**\n * Round-trip xlsx or ods bytes back to a schema. Universal. The format is\n * told apart by content, never by name, and both describe to the same\n * schema. Throws `UnsupportedFormatException` for anything else.\n */\n read(input: Uint8Array | ArrayBuffer): Record<string, unknown> {\n return readSpreadsheet(toU8(input), null);\n },\n\n /** Round-trip an xlsx or ods file on disk back to a schema (Node only). */\n async describe(path: string): Promise<Record<string, unknown>> {\n const fs = await import(\"node:fs\");\n if (!fs.existsSync(path)) return { error: \"not_found\", path };\n const bytes = fs.readFileSync(path);\n return readSpreadsheet(new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength), path);\n },\n\n /** Validate + conservative repairs in one call. */\n validateAndRepair(schema: Any): RepairResult {\n return new Validator().validateAndRepair(schema);\n },\n\n /** Build a schema from a flat array of rows (+ optional headers). */\n fromArray(\n rows: Any[][],\n headers: string[] | null = null,\n sheetName = \"Sheet 1\",\n options: BuilderOptions = {},\n ): HolySheetSchema {\n return ArrayBuilder.build(rows, headers, sheetName, options);\n },\n\n /** Build a schema from CSV content (read files yourself in Node). */\n fromCsv(csv: string, options: BuilderOptions = {}): HolySheetSchema {\n return CsvBuilder.build(csv, options);\n },\n\n /** Evaluate every formula and report Excel-style errors. Empty array = clean. */\n lint(schema: Any): FormulaProblem[] {\n return new FormulaLinter().lint(schema);\n },\n\n /**\n * The ops that turn schema `a` into schema `b`. Mirrors PHP `Agent::diff`, and\n * gives the same ops in the same order for the same inputs.\n *\n * - `reduce(a, diff(a, b))` equals `b` (key order aside).\n * - Schemas that write the same workbook diff to `[]`, so\n * `diff(s, read(toBytes(s)))` is `[]`: a save without a change records\n * nothing.\n * - One changed cell is one `set_cell`; an inserted row is one\n * `insert_rows` plus its cells.\n *\n * Store `diff(newer, older)` to keep a version as the ops that restore it.\n * Both schemas must be valid: the \"same workbook\" check writes them.\n */\n diff(a: Any, b: Any): SheetOp[] {\n return SheetDiff.diff(a, b);\n },\n\n /**\n * Apply one op, or a list of them, to a schema; returns a new schema and never\n * modifies the input. An op naming a sheet that is not there is skipped.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reduce(schema: Any, opOrOps: SheetOp | readonly SheetOp[]): Record<string, any> {\n return SheetReducer.applyAll(schema, isOpList(opOrOps) ? Object.values(opOrOps) : [opOrOps]);\n },\n\n /**\n * JSON Schema for one op. `set_cell`, `set_range` and `set_workbook` are\n * fancy-sheets' `SheetOp` shapes.\n */\n opSchema(): Record<string, unknown> {\n return SheetOpSchema.jsonSchema();\n },\n\n /**\n * Whether two schemas write the same workbook: a columns/rows sheet and the\n * cell map it becomes are equivalent, and so are a schema without\n * `meta.created` and its written copy.\n */\n equivalent(a: Any, b: Any): boolean {\n return SheetDiff.equivalent(a, b);\n },\n\n version(): string {\n return VERSION;\n },\n};\n\n/**\n * PHP's `$opOrOps === [] || array_is_list($opOrOps)`: an array, or an object\n * keyed exactly \"0\"..\"n-1\" (which is how PHP sees `{}` too).\n */\nfunction isOpList(opOrOps: unknown): boolean {\n if (Array.isArray(opOrOps)) return true;\n if (typeof opOrOps !== \"object\" || opOrOps === null) return false;\n return Object.keys(opOrOps).every((key, i) => key === String(i));\n}\n","import { Agent, VERSION } from \"./agent\";\nimport type {\n BuilderOptions,\n FormulaProblem,\n HolySheetSchema,\n RepairResult,\n ValidationError,\n WriteResult,\n} from \"./schema/types\";\n\ntype Any = any;\n\n/**\n * Holy Sheet — instance entry point mirroring PHP `HolySheet`. Thin wrappers\n * over `Agent`. Provided for parity / DI ergonomics; most callers use `Agent`.\n */\nexport class HolySheet {\n static readonly VERSION = VERSION;\n\n validate(schema: Any): ValidationError[] {\n return Agent.validate(schema);\n }\n toBytes(schema: Any): Uint8Array {\n return Agent.toBytes(schema);\n }\n write(schema: Any, path: string): Promise<WriteResult> {\n return Agent.write(schema, path);\n }\n toolDefinition(): Record<string, unknown> {\n return Agent.toolDefinition();\n }\n read(input: Uint8Array | ArrayBuffer): Record<string, unknown> {\n return Agent.read(input);\n }\n describe(path: string): Promise<Record<string, unknown>> {\n return Agent.describe(path);\n }\n validateAndRepair(schema: Any): RepairResult {\n return Agent.validateAndRepair(schema);\n }\n fromArray(\n rows: Any[][],\n headers: string[] | null = null,\n sheetName = \"Sheet 1\",\n options: BuilderOptions = {},\n ): HolySheetSchema {\n return Agent.fromArray(rows, headers, sheetName, options);\n }\n fromCsv(csv: string, options: BuilderOptions = {}): HolySheetSchema {\n return Agent.fromCsv(csv, options);\n }\n lint(schema: Any): FormulaProblem[] {\n return Agent.lint(schema);\n }\n getVersion(): string {\n return VERSION;\n }\n\n static version(): string {\n return VERSION;\n }\n}\n"]}