@particle-academy/holy-sheet 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -1
- package/dist/index.cjs +1245 -270
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +59 -8
- package/dist/index.d.ts +59 -8
- package/dist/index.js +1243 -271
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/xml.ts","../src/reader/comments-parser.ts","../src/reader/format/date-inverter.ts","../src/reader/rels-parser.ts","../src/reader/shared-strings-parser.ts","../src/reader/format/num-fmt-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/holy-sheet.schema.json","../src/agent.ts","../src/holy-sheet.ts"],"names":["error","ISO_DATE","VALID_THEMES","end","decoder","encoder","v"],"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\nclass LinterError extends Error {\n constructor(public errorCode: string) {\n super(errorCode);\n }\n}\n\ninterface Token {\n type: \"NUMBER\" | \"STRING\" | \"IDENT\" | \"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 lint(schema: unknown): FormulaProblem[] {\n const workbook = new Normalizer().normalize(schema);\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 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 if (tok.type === \"IDENT\") {\n const next = c.tokens[c.pos + 1];\n const next2 = c.tokens[c.pos + 2];\n // Sheet!Ref\n if (next && next.type === \"OP\" && next.value === \"!\" && next2 && next2.type === \"IDENT\") {\n const sheetName = this.cleanSheetName(tok.value);\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 // 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 private cleanSheetName(name: string): string {\n if (name.length >= 2 && name[0] === \"'\" && name[name.length - 1] === \"'\") {\n return name.slice(1, -1);\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 \"A cell reference points to a cell that doesn't exist in the workbook. Check column letters and row numbers.\";\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 hintValue(formula: string, sheet: string): string {\n const re = /(?:([A-Za-z][A-Za-z0-9_]*)!)?\\$?([A-Z]+)\\$?(\\d+)/gi;\n const offenders: string[] = [];\n for (const m of formula.matchAll(re)) {\n const sheetName = m[1] ? m[1] : 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","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 if (!isPlainObject(sheet.cells)) {\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","/**\n * Tiny isomorphic XML parser — enough to read OOXML parts (replacing PHP's\n * SimpleXML). Namespace prefixes are stripped so nodes/attributes are queried\n * by local name, matching how the PHP reader accesses SimpleXML.\n */\n\nexport interface XmlNode {\n name: string;\n attrs: Record<string, string>;\n children: XmlNode[];\n text: string;\n}\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\nfunction parseTag(inner: string): { name: string; attrs: Record<string, string> } {\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 rest = trimmed.slice(i);\n for (const m of rest.matchAll(ATTR_RE)) {\n const key = localName(m[1]!);\n const value = unescapeXml(m[3] ?? m[4] ?? \"\");\n attrs[key] = value;\n }\n return { name, attrs };\n}\n\nexport function parseXml(src: string): XmlNode | null {\n let i = 0;\n const n = src.length;\n const root: XmlNode = { name: \"#root\", attrs: {}, children: [], text: \"\" };\n const stack: XmlNode[] = [root];\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 stack[stack.length - 1]!.text += 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) stack.pop();\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 } = parseTag(selfClosing ? tagContent.slice(0, -1) : tagContent);\n const node: XmlNode = { name: localName(name), attrs, children: [], text: \"\" };\n stack[stack.length - 1]!.children.push(node);\n if (!selfClosing) stack.push(node);\n i = end + 1;\n } else {\n const next = src.indexOf(\"<\", i);\n const stop = next < 0 ? n : next;\n stack[stack.length - 1]!.text += unescapeXml(src.slice(i, stop));\n i = stop;\n }\n }\n\n return root.children[0] ?? null;\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 { 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","/** 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 { 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 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\nconst 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 { 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 { 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 { Workbook } from \"../workbook/workbook\";\nimport { unzipSync } from \"../zip\";\nimport { CommentsParser } from \"./comments-parser\";\nimport { DateInverter } from \"./format/date-inverter\";\nimport { RelsParser } from \"./rels-parser\";\nimport { SharedStringsParser } from \"./shared-strings-parser\";\nimport { StylesParser } from \"./styles-parser\";\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 this.workbookToSchema(this.readWorkbook(bytes));\n }\n\n readWorkbook(bytes: Uint8Array): Workbook {\n const files = unzipSync(bytes);\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 private workbookToSchema(workbook: Workbook): Record<string, unknown> {\n const schema: Record<string, unknown> = { sheets: workbook.sheets.map((s) => this.sheetToSchema(s)) };\n if (Object.keys(workbook.meta).length > 0) schema[\"meta\"] = workbook.meta;\n return schema;\n }\n\n private sheetToSchema(sheet: Sheet): Record<string, unknown> {\n const cells: Record<string, unknown> = {};\n for (const [address, cell] of sheet.cells) {\n const cellSchema = this.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\n private 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}\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\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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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","{\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. v0.2.0 supports scalar values, formulas (cached), and multiple sheets. Styles, formats, comments, merges land in subsequent minors.\",\n \"type\": \"object\",\n \"required\": [\"sheets\"],\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\": { \"$ref\": \"#/definitions/Sheet\" }\n },\n \"meta\": {\n \"type\": \"object\",\n \"description\": \"Optional workbook metadata surfaced in Excel's File → Info pane.\",\n \"properties\": {\n \"creator\": { \"type\": \"string\" },\n \"created\": { \"type\": \"string\", \"description\": \"ISO-8601 datetime. Defaults to now().\" }\n },\n \"additionalProperties\": true\n }\n },\n \"definitions\": {\n \"Sheet\": {\n \"type\": \"object\",\n \"required\": [\"name\"],\n \"additionalProperties\": false,\n \"oneOf\": [\n { \"required\": [\"columns\", \"rows\"], \"description\": \"Row-oriented (agent-ergonomic).\" },\n { \"required\": [\"cells\"], \"description\": \"Sparse A1-keyed map (fancy-sheets passthrough).\" }\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\": { \"$ref\": \"#/definitions/Column\" },\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\": { \"$ref\": \"#/definitions/CellValue\" }\n }\n },\n \"cells\": {\n \"type\": \"object\",\n \"description\": \"Sparse A1-keyed map. Use this shape when exporting from <Spreadsheet>.\",\n \"additionalProperties\": { \"$ref\": \"#/definitions/CellData\" },\n \"patternProperties\": {\n \"^[A-Z]+[1-9][0-9]*$\": { \"$ref\": \"#/definitions/CellData\" }\n }\n },\n \"totals\": {\n \"type\": \"object\",\n \"description\": \"Symbolic aggregations appended below the data. Key = column header; value = aggregation. Lands in 0.7.\",\n \"additionalProperties\": {\n \"type\": \"string\",\n \"enum\": [\"sum\", \"avg\", \"count\", \"min\", \"max\"]\n }\n },\n \"theme\": {\n \"type\": \"string\",\n \"enum\": [\"default\", \"minimal\", \"plain\", \"business\"],\n \"default\": \"default\",\n \"description\": \"Pre-baked style preset. Lands in 0.3.\"\n },\n \"mergedRegions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"start\", \"end\"],\n \"properties\": {\n \"start\": { \"type\": \"string\", \"description\": \"A1 ref of top-left.\" },\n \"end\": { \"type\": \"string\", \"description\": \"A1 ref of bottom-right.\" }\n }\n },\n \"description\": \"Cells to merge. Lands in 0.5.\"\n },\n \"columnWidths\": {\n \"type\": \"object\",\n \"description\": \"Override widths in pixels. Keys are 0-based column indexes. Lands in 0.5.\",\n \"additionalProperties\": { \"type\": \"number\", \"minimum\": 0 }\n },\n \"frozenRows\": { \"type\": \"integer\", \"minimum\": 0, \"description\": \"Lands in 0.5.\" },\n \"frozenCols\": { \"type\": \"integer\", \"minimum\": 0, \"description\": \"Lands in 0.5.\" }\n }\n },\n \"Column\": {\n \"type\": \"object\",\n \"required\": [\"header\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"header\": { \"type\": \"string\" },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"auto\", \"string\", \"number\", \"integer\", \"boolean\", \"date\", \"datetime\", \"currency\", \"percent\", \"formula\"],\n \"default\": \"auto\",\n \"description\": \"Cell type applied to every value in this column. 'auto' infers per cell.\"\n },\n \"currency\": {\n \"type\": \"string\",\n \"description\": \"ISO-4217 code (USD, EUR, JPY, ...) when type=currency. Defaults to config('holy-sheet.locale').\"\n },\n \"decimals\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 10,\n \"description\": \"Display decimals for number/currency/percent. Default 2 for currency, 1 for percent, 0 for integer, none for number.\"\n },\n \"format\": {\n \"type\": \"string\",\n \"description\": \"Custom Excel number format string. Overrides type-derived format. Power-user escape hatch.\"\n },\n \"width\": { \"type\": \"number\", \"minimum\": 0, \"description\": \"Column width in pixels. Same as columnWidths but per-column.\" }\n }\n },\n \"CellValue\": {\n \"description\": \"A primitive value, null, or an object {value, formula, format, comment} for per-cell control.\",\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" },\n { \"type\": \"boolean\" },\n { \"type\": \"null\" },\n { \"$ref\": \"#/definitions/CellData\" }\n ]\n },\n \"CellData\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"value\": {\n \"description\": \"Raw cell value.\",\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" },\n { \"type\": \"boolean\" },\n { \"type\": \"null\" }\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\": [{ \"type\": \"string\" }, { \"type\": \"number\" }, { \"type\": \"boolean\" }, { \"type\": \"null\" }]\n },\n \"format\": { \"$ref\": \"#/definitions/CellFormat\" },\n \"comment\": { \"$ref\": \"#/definitions/CellComment\" }\n }\n },\n \"CellFormat\": {\n \"type\": \"object\",\n \"description\": \"Per-cell format. Lands in 0.3.\",\n \"additionalProperties\": false,\n \"properties\": {\n \"bold\": { \"type\": \"boolean\" },\n \"italic\": { \"type\": \"boolean\" },\n \"textAlign\": { \"type\": \"string\", \"enum\": [\"left\", \"center\", \"right\"] },\n \"displayFormat\": {\n \"type\": \"string\",\n \"enum\": [\"auto\", \"text\", \"number\", \"date\", \"datetime\", \"percentage\", \"currency\"]\n },\n \"decimals\": { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 10 },\n \"color\": { \"type\": \"string\", \"description\": \"Hex color (#RRGGBB) for text.\" },\n \"backgroundColor\": { \"type\": \"string\", \"description\": \"Hex color for cell fill.\" },\n \"fontSize\": { \"type\": \"integer\", \"minimum\": 6, \"maximum\": 72 },\n \"borderTop\": { \"type\": \"string\" },\n \"borderRight\": { \"type\": \"string\" },\n \"borderBottom\": { \"type\": \"string\" },\n \"borderLeft\": { \"type\": \"string\" }\n }\n },\n \"CellComment\": {\n \"type\": \"object\",\n \"description\": \"Lands in 0.6.\",\n \"required\": [\"text\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"text\": { \"type\": \"string\" },\n \"author\": { \"type\": \"string\" },\n \"color\": { \"type\": \"string\", \"description\": \"Hex color for the corner triangle indicator.\" }\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 { XlsxReader } from \"./reader/xlsx-reader\";\nimport { XlsxWriter } from \"./writer/xlsx-writer\";\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.2.1\";\n\ntype Any = any;\n\nfunction toU8(input: Uint8Array | ArrayBuffer): Uint8Array {\n return input instanceof Uint8Array ? input : new Uint8Array(input);\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 /** Round-trip xlsx bytes back to a schema. Universal. */\n read(input: Uint8Array | ArrayBuffer): Record<string, unknown> {\n return new XlsxReader().describe(toU8(input));\n },\n\n /** Round-trip an xlsx 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 new XlsxReader().describe(new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength));\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 version(): string {\n return VERSION;\n },\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/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/holy-sheet.schema.json","../src/agent.ts","../src/holy-sheet.ts"],"names":["color","error","first","ISO_DATE","VALID_THEMES","part","decoder","el","serial","end","border","hex","encoder","v"],"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\nclass LinterError extends Error {\n constructor(public errorCode: string) {\n super(errorCode);\n }\n}\n\ninterface Token {\n type: \"NUMBER\" | \"STRING\" | \"IDENT\" | \"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 lint(schema: unknown): FormulaProblem[] {\n const workbook = new Normalizer().normalize(schema);\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 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 if (tok.type === \"IDENT\") {\n const next = c.tokens[c.pos + 1];\n const next2 = c.tokens[c.pos + 2];\n // Sheet!Ref\n if (next && next.type === \"OP\" && next.value === \"!\" && next2 && next2.type === \"IDENT\") {\n const sheetName = this.cleanSheetName(tok.value);\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 // 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 private cleanSheetName(name: string): string {\n if (name.length >= 2 && name[0] === \"'\" && name[name.length - 1] === \"'\") {\n return name.slice(1, -1);\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 \"A cell reference points to a cell that doesn't exist in the workbook. Check column letters and row numbers.\";\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 hintValue(formula: string, sheet: string): string {\n const re = /(?:([A-Za-z][A-Za-z0-9_]*)!)?\\$?([A-Z]+)\\$?(\\d+)/gi;\n const offenders: string[] = [];\n for (const m of formula.matchAll(re)) {\n const sheetName = m[1] ? m[1] : 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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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","{\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 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.3.0\";\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 version(): string {\n return VERSION;\n },\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"]}
|