@particle-academy/holy-sheet 2.0.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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.cjs","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/** Coerce a numeric string the way PHP does: `(float)` when it has a dot, else `(int)`. */\nexport function numericStringToNumber(v: string): number {\n return v.includes(\".\") ? parseFloat(v) : parseInt(v, 10);\n}\n\n/**\n * Serialize a float the way the PHP writer does:\n * `rtrim(rtrim(number_format($v, 14, '.', ''), '0'), '.')`.\n */\nexport function formatFloat(v: number): string {\n let s = v.toFixed(14);\n s = s.replace(/0+$/, \"\").replace(/\\.$/, \"\");\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 if (sheet.cells != null) {\n return new Sheet(\n name,\n this.normalizeCellMap(sheet.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 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 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 const format =\n cellData && isPlainObject(cellData.format) ? CellFormat.fromInput(cellData.format) : null;\n const comment =\n cellData && isPlainObject(cellData.comment)\n ? new CellComment(\n String(cellData.comment.text ?? \"\"),\n cellData.comment.author ?? null,\n cellData.comment.color ?? null,\n )\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 return new Cell(address, this.coerceValue(value, columnFormat), null, columnFormat);\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\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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n","import type { CellFormat } from \"../../workbook/cell-format\";\n\n/**\n * Builds the Excel number-format code for a CellFormat. Returns null when no\n * numFmt is needed. Mirrors PHP `Writer\\Format\\NumFmtBuilder`.\n */\nexport const NumFmtBuilder = {\n build(format: CellFormat): string | null {\n const df = format.displayFormat;\n const decimals = format.decimals;\n\n if (df === null || df === \"auto\" || df === \"text\") return null;\n\n switch (df) {\n case \"number\":\n return numberFormat(decimals);\n case \"percentage\":\n return percentFormat(decimals);\n case \"currency\":\n return currencyFormat(format.currency, decimals);\n case \"date\":\n return \"yyyy-mm-dd\";\n case \"datetime\":\n return \"yyyy-mm-dd hh:mm:ss\";\n default:\n return null;\n }\n },\n};\n\nfunction numberFormat(decimals: number | null): string {\n if (decimals === null || decimals <= 0) return \"#,##0\";\n return \"#,##0.\" + \"0\".repeat(decimals);\n}\n\nfunction percentFormat(decimals: number | null): string {\n const d = decimals ?? 1;\n if (d <= 0) return \"0%\";\n return \"0.\" + \"0\".repeat(d) + \"%\";\n}\n\nfunction currencyFormat(currency: string | null, decimals: number | null): string {\n const symbol = currencySymbol(currency ?? \"USD\");\n const d = decimals ?? 2;\n const body = d <= 0 ? \"#,##0\" : \"#,##0.\" + \"0\".repeat(d);\n return `\"${symbol}\"${body};-\"${symbol}\"${body}`;\n}\n\nfunction currencySymbol(iso: string): string {\n switch (iso.toUpperCase()) {\n case \"USD\":\n return \"$\";\n case \"EUR\":\n return \"€\";\n case \"GBP\":\n return \"£\";\n case \"JPY\":\n return \"¥\";\n case \"CNY\":\n return \"¥\";\n case \"INR\":\n return \"₹\";\n case \"AUD\":\n return \"A$\";\n case \"CAD\":\n return \"C$\";\n case \"CHF\":\n return \"CHF\";\n case \"KRW\":\n return \"₩\";\n default:\n return iso + \" \";\n }\n}\n","import type { CellFormat } from \"../workbook/cell-format\";\nimport { xmlEscape } from \"../xml\";\nimport { NumFmtBuilder } from \"./format/num-fmt-builder\";\n\ninterface Xf {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n align: string | null;\n}\ninterface FontRec {\n size: number;\n name: string;\n color: string | null;\n bold: boolean;\n italic: boolean;\n}\ninterface BorderRec {\n top: string | null;\n right: string | null;\n bottom: string | null;\n left: string | null;\n}\n\n/**\n * Deduplicates fonts/fills/borders/numFmts and the cellXfs that combine them.\n * Mirrors PHP `Writer\\StylesRegistry` (style index 0 = the unformatted base).\n */\nexport class StylesRegistry {\n private xfIndex = new Map<string, number>([[\"__default__\", 0]]);\n private xfs: Xf[] = [{ fontId: 0, fillId: 0, borderId: 0, numFmtId: 0, align: null }];\n\n private fontIndex = new Map<string, number>([[\"__default__\", 0]]);\n private fonts: FontRec[] = [{ size: 11, name: \"Calibri\", color: null, bold: false, italic: false }];\n\n private fillIndex = new Map<string, number>([\n [\"__none__\", 0],\n [\"__gray125__\", 1],\n ]);\n private fills: ({ type: \"none\" } | { type: \"gray125\" } | { type: \"solid\"; fg: string })[] = [\n { type: \"none\" },\n { type: \"gray125\" },\n ];\n\n private borderIndex = new Map<string, number>([[\"__default__\", 0]]);\n private borders: BorderRec[] = [{ top: null, right: null, bottom: null, left: null }];\n\n private numFmtIndex = new Map<string, number>();\n private numFmts = new Map<number, string>();\n private nextNumFmtId = 164;\n\n register(format: CellFormat | null): number {\n if (format === null || format.isEmpty()) return 0;\n\n const key = format.key();\n const existing = this.xfIndex.get(key);\n if (existing !== undefined) return existing;\n\n const fontId = this.fontFor(format);\n const fillId = this.fillFor(format);\n const borderId = this.borderFor(format);\n const numFmtId = this.numFmtFor(format);\n\n this.xfs.push({ fontId, fillId, borderId, numFmtId, align: format.textAlign });\n const idx = this.xfs.length - 1;\n this.xfIndex.set(key, idx);\n return idx;\n }\n\n private fontFor(f: CellFormat): number {\n const rec: FontRec = {\n size: f.fontSize ?? 11,\n name: \"Calibri\",\n color: f.color,\n bold: f.bold,\n italic: f.italic,\n };\n const key = JSON.stringify(rec);\n const existing = this.fontIndex.get(key);\n if (existing !== undefined) return existing;\n this.fonts.push(rec);\n const idx = this.fonts.length - 1;\n this.fontIndex.set(key, idx);\n return idx;\n }\n\n private fillFor(f: CellFormat): number {\n if (f.backgroundColor === null) return 0;\n const key = f.backgroundColor.toUpperCase();\n const existing = this.fillIndex.get(key);\n if (existing !== undefined) return existing;\n this.fills.push({ type: \"solid\", fg: key });\n const idx = this.fills.length - 1;\n this.fillIndex.set(key, idx);\n return idx;\n }\n\n private borderFor(f: CellFormat): number {\n if (!f.borderTop && !f.borderRight && !f.borderBottom && !f.borderLeft) return 0;\n const rec: BorderRec = {\n top: f.borderTop,\n right: f.borderRight,\n bottom: f.borderBottom,\n left: f.borderLeft,\n };\n const key = JSON.stringify(rec);\n const existing = this.borderIndex.get(key);\n if (existing !== undefined) return existing;\n this.borders.push(rec);\n const idx = this.borders.length - 1;\n this.borderIndex.set(key, idx);\n return idx;\n }\n\n private numFmtFor(f: CellFormat): number {\n const code = NumFmtBuilder.build(f);\n if (code === null) return 0;\n const existing = this.numFmtIndex.get(code);\n if (existing !== undefined) return existing;\n const id = this.nextNumFmtId++;\n this.numFmts.set(id, code);\n this.numFmtIndex.set(code, id);\n return id;\n }\n\n toXml(): string {\n let numFmtsXml = \"\";\n if (this.numFmts.size > 0) {\n let records = \"\";\n for (const [id, code] of this.numFmts) {\n records += `<numFmt numFmtId=\"${id}\" formatCode=\"${xmlEscape(code)}\"/>`;\n }\n numFmtsXml = `<numFmts count=\"${this.numFmts.size}\">${records}</numFmts>`;\n }\n\n let fontsXml = `<fonts count=\"${this.fonts.length}\">`;\n for (const f of this.fonts) {\n fontsXml += \"<font>\";\n fontsXml += `<sz val=\"${Number(f.size)}\"/>`;\n if (f.bold) fontsXml += \"<b/>\";\n if (f.italic) fontsXml += \"<i/>\";\n if (f.color) fontsXml += `<color rgb=\"${hexToArgb(f.color)}\"/>`;\n fontsXml += `<name val=\"${xmlEscape(f.name)}\"/>`;\n fontsXml += \"</font>\";\n }\n fontsXml += \"</fonts>\";\n\n let fillsXml = `<fills count=\"${this.fills.length}\">`;\n for (const fill of this.fills) {\n if (fill.type === \"none\") {\n fillsXml += '<fill><patternFill patternType=\"none\"/></fill>';\n } else if (fill.type === \"gray125\") {\n fillsXml += '<fill><patternFill patternType=\"gray125\"/></fill>';\n } else {\n fillsXml += `<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${hexToArgb(fill.fg)}\"/></patternFill></fill>`;\n }\n }\n fillsXml += \"</fills>\";\n\n let bordersXml = `<borders count=\"${this.borders.length}\">`;\n for (const b of this.borders) {\n bordersXml += \"<border>\";\n for (const side of [\"left\", \"right\", \"top\", \"bottom\"] as const) {\n const color = b[side];\n if (!color) {\n bordersXml += `<${side}/>`;\n } else {\n bordersXml += `<${side} style=\"thin\"><color rgb=\"${hexToArgb(color)}\"/></${side}>`;\n }\n }\n bordersXml += \"<diagonal/></border>\";\n }\n bordersXml += \"</borders>\";\n\n let cellXfsXml = `<cellXfs count=\"${this.xfs.length}\">`;\n for (const xf of this.xfs) {\n let apply = \"\";\n if (xf.fontId > 0) apply += ' applyFont=\"1\"';\n if (xf.fillId > 0) apply += ' applyFill=\"1\"';\n if (xf.borderId > 0) apply += ' applyBorder=\"1\"';\n if (xf.numFmtId > 0) apply += ' applyNumberFormat=\"1\"';\n if (xf.align) apply += ' applyAlignment=\"1\"';\n cellXfsXml += `<xf numFmtId=\"${xf.numFmtId}\" fontId=\"${xf.fontId}\" fillId=\"${xf.fillId}\" borderId=\"${xf.borderId}\" xfId=\"0\"${apply}>`;\n if (xf.align) cellXfsXml += `<alignment horizontal=\"${xmlEscape(xf.align)}\"/>`;\n cellXfsXml += \"</xf>\";\n }\n cellXfsXml += \"</cellXfs>\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n numFmtsXml +\n fontsXml +\n fillsXml +\n bordersXml +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n cellXfsXml +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '<dxfs count=\"0\"/><tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>' +\n \"</styleSheet>\"\n );\n }\n}\n\n/** \"#RRGGBB\" → \"FFRRGGBB\" (Excel ARGB). */\nfunction hexToArgb(hex: string): string {\n const h = hex.replace(/^#/, \"\");\n if (h.length === 6) return \"FF\" + h.toUpperCase();\n if (h.length === 8) return h.toUpperCase();\n return \"FF000000\";\n}\n","import { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { xmlEscape } from \"../xml\";\nimport { formatFloat } from \"../util\";\nimport { zipSync, type ZipFile } from \"../zip\";\nimport { StylesRegistry } from \"./styles-registry\";\n\nconst encoder = new TextEncoder();\n\n/**\n * XLSX writer — emits a complete OOXML SpreadsheetML package as bytes.\n * Mirrors PHP `Writer\\XlsxWriter` (file I/O moved to the Agent for isomorphism).\n */\nexport class XlsxWriter {\n toBytes(workbook: Workbook): Uint8Array {\n const styles = new StylesRegistry();\n\n // Pre-render sheet xml so styles register before we serialize styles.xml.\n const sheetXmls: string[] = workbook.sheets.map((sheet) => this.sheetXml(sheet, styles));\n\n const sheetsWithComments: number[] = [];\n workbook.sheets.forEach((sheet, i) => {\n if (sheet.hasComments()) sheetsWithComments.push(i);\n });\n\n const files: ZipFile[] = [];\n const add = (name: string, xml: string): void => {\n files.push({ name, data: encoder.encode(xml) });\n };\n\n add(\"[Content_Types].xml\", this.contentTypesXml(workbook, sheetsWithComments));\n add(\"_rels/.rels\", this.rootRelsXml());\n add(\"xl/workbook.xml\", this.workbookXml(workbook));\n add(\"xl/_rels/workbook.xml.rels\", this.workbookRelsXml(workbook));\n add(\"xl/styles.xml\", styles.toXml());\n add(\"docProps/core.xml\", this.coreXml(workbook));\n add(\"docProps/app.xml\", this.appXml());\n\n workbook.sheets.forEach((sheet, i) => {\n const n = i + 1;\n add(`xl/worksheets/sheet${n}.xml`, sheetXmls[i]!);\n if (sheet.hasComments()) {\n add(`xl/worksheets/_rels/sheet${n}.xml.rels`, this.sheetRelsXml(n));\n add(`xl/comments${n}.xml`, this.commentsXml(sheet));\n add(`xl/drawings/vmlDrawing${n}.vml`, this.vmlDrawingXml(sheet));\n }\n });\n\n return zipSync(files);\n }\n\n private contentTypesXml(workbook: Workbook, sheetsWithComments: number[]): string {\n let overrides =\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>';\n\n workbook.sheets.forEach((_, i) => {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/worksheets/sheet${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n });\n\n for (const i of sheetsWithComments) {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/comments${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"/>`;\n }\n\n let defaults =\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>';\n if (sheetsWithComments.length > 0) {\n defaults += '<Default Extension=\"vml\" ContentType=\"application/vnd.openxmlformats-officedocument.vmlDrawing\"/>';\n }\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n defaults +\n overrides +\n \"</Types>\"\n );\n }\n\n private rootRelsXml(): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n '<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>' +\n \"</Relationships>\"\n );\n }\n\n private workbookXml(workbook: Workbook): string {\n let sheets = \"\";\n workbook.sheets.forEach((sheet, i) => {\n const name = this.escape(sheet.name);\n const sheetId = i + 1;\n const rId = \"rId\" + (i + 1);\n sheets += `<sheet name=\"${name}\" sheetId=\"${sheetId}\" r:id=\"${rId}\"/>`;\n });\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<sheets>${sheets}</sheets>` +\n \"</workbook>\"\n );\n }\n\n private workbookRelsXml(workbook: Workbook): string {\n let rels = \"\";\n workbook.sheets.forEach((_, i) => {\n const rId = \"rId\" + (i + 1);\n rels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${i + 1}.xml\"/>`;\n });\n rels += `<Relationship Id=\"rId${workbook.sheets.length + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n rels +\n \"</Relationships>\"\n );\n }\n\n private sheetRelsXml(sheetNum: number): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\" Target=\"../drawings/vmlDrawing${sheetNum}.vml\"/>` +\n `<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\" Target=\"../comments${sheetNum}.xml\"/>` +\n \"</Relationships>\"\n );\n }\n\n private sheetXml(sheet: Sheet, styles: StylesRegistry): string {\n let sheetViewsXml = \"\";\n if (sheet.frozenRows > 0 || sheet.frozenCols > 0) {\n const topLeft = CellAddress.letter(sheet.frozenCols) + (sheet.frozenRows + 1);\n const pane =\n \"<pane\" +\n (sheet.frozenCols > 0 ? ` xSplit=\"${sheet.frozenCols}\"` : \"\") +\n (sheet.frozenRows > 0 ? ` ySplit=\"${sheet.frozenRows}\"` : \"\") +\n ` topLeftCell=\"${topLeft}\" activePane=\"bottomRight\" state=\"frozen\"/>`;\n sheetViewsXml = `<sheetViews><sheetView workbookViewId=\"0\">${pane}</sheetView></sheetViews>`;\n }\n\n let colsXml = \"\";\n if (sheet.columnWidths.size > 0) {\n colsXml = \"<cols>\";\n for (const [colIdx, px] of sheet.columnWidths) {\n const excelWidth = Math.max(1.0, (px - 5) / 7);\n const colNum = colIdx + 1;\n colsXml += `<col min=\"${colNum}\" max=\"${colNum}\" width=\"${excelWidth.toFixed(4)}\" customWidth=\"1\"/>`;\n }\n colsXml += \"</cols>\";\n }\n\n let rowsXml = \"\";\n for (const [rowIndex, row] of sheet.rows()) {\n let cellsXml = \"\";\n const sortedCols = [...row.keys()].sort();\n for (const col of sortedCols) {\n cellsXml += this.cellXml(row.get(col)!, styles);\n }\n rowsXml += `<row r=\"${rowIndex}\">${cellsXml}</row>`;\n }\n\n let mergesXml = \"\";\n if (sheet.mergedRegions.length > 0) {\n mergesXml = `<mergeCells count=\"${sheet.mergedRegions.length}\">`;\n for (const merge of sheet.mergedRegions) mergesXml += `<mergeCell ref=\"${merge.ref()}\"/>`;\n mergesXml += \"</mergeCells>\";\n }\n\n const legacyDrawing = sheet.hasComments() ? '<legacyDrawing r:id=\"rId1\"/>' : \"\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n sheetViewsXml +\n colsXml +\n `<sheetData>${rowsXml}</sheetData>` +\n mergesXml +\n legacyDrawing +\n \"</worksheet>\"\n );\n }\n\n private cellXml(cell: Cell, styles: StylesRegistry): string {\n const ref = cell.address;\n const type = cell.excelType();\n const styleIdx = styles.register(cell.format);\n const sAttr = styleIdx > 0 ? ` s=\"${styleIdx}\"` : \"\";\n\n if (cell.formula !== null) {\n const f = this.escape(cell.formula.replace(/^=+/, \"\"));\n const cached = cell.cachedValue ?? cell.value;\n const v = cached !== null ? `<v>${this.escape(String(cached))}</v>` : \"\";\n return `<c r=\"${ref}\"${sAttr}><f>${f}</f>${v}</c>`;\n }\n\n if (type === \"inlineStr\") {\n const t = this.escape(String(cell.value));\n return `<c r=\"${ref}\"${sAttr} t=\"inlineStr\"><is><t xml:space=\"preserve\">${t}</t></is></c>`;\n }\n\n if (type === \"b\") {\n const v = cell.value === true ? \"1\" : \"0\";\n return `<c r=\"${ref}\"${sAttr} t=\"b\"><v>${v}</v></c>`;\n }\n\n if (cell.value === null) {\n return `<c r=\"${ref}\"${sAttr}/>`;\n }\n\n let v: string;\n if (typeof cell.value === \"number\") {\n v = Number.isInteger(cell.value) ? String(cell.value) : 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/** Feature-parity baseline with PHP holy-sheet; bumped independently on npm. */\nexport const VERSION = \"1.0.0\";\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/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.cjs","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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n","import type { CellFormat } from \"../../workbook/cell-format\";\n\n/**\n * Builds the Excel number-format code for a CellFormat. Returns null when no\n * numFmt is needed. Mirrors PHP `Writer\\Format\\NumFmtBuilder`.\n */\nexport const NumFmtBuilder = {\n build(format: CellFormat): string | null {\n const df = format.displayFormat;\n const decimals = format.decimals;\n\n if (df === null || df === \"auto\" || df === \"text\") return null;\n\n switch (df) {\n case \"number\":\n return numberFormat(decimals);\n case \"percentage\":\n return percentFormat(decimals);\n case \"currency\":\n return currencyFormat(format.currency, decimals);\n case \"date\":\n return \"yyyy-mm-dd\";\n case \"datetime\":\n return \"yyyy-mm-dd hh:mm:ss\";\n default:\n return null;\n }\n },\n};\n\nfunction numberFormat(decimals: number | null): string {\n if (decimals === null || decimals <= 0) return \"#,##0\";\n return \"#,##0.\" + \"0\".repeat(decimals);\n}\n\nfunction percentFormat(decimals: number | null): string {\n const d = decimals ?? 1;\n if (d <= 0) return \"0%\";\n return \"0.\" + \"0\".repeat(d) + \"%\";\n}\n\nfunction currencyFormat(currency: string | null, decimals: number | null): string {\n const symbol = currencySymbol(currency ?? \"USD\");\n const d = decimals ?? 2;\n const body = d <= 0 ? \"#,##0\" : \"#,##0.\" + \"0\".repeat(d);\n return `\"${symbol}\"${body};-\"${symbol}\"${body}`;\n}\n\nfunction currencySymbol(iso: string): string {\n switch (iso.toUpperCase()) {\n case \"USD\":\n return \"$\";\n case \"EUR\":\n return \"€\";\n case \"GBP\":\n return \"£\";\n case \"JPY\":\n return \"¥\";\n case \"CNY\":\n return \"¥\";\n case \"INR\":\n return \"₹\";\n case \"AUD\":\n return \"A$\";\n case \"CAD\":\n return \"C$\";\n case \"CHF\":\n return \"CHF\";\n case \"KRW\":\n return \"₩\";\n default:\n return iso + \" \";\n }\n}\n","import type { CellFormat } from \"../workbook/cell-format\";\nimport { xmlEscape } from \"../xml\";\nimport { NumFmtBuilder } from \"./format/num-fmt-builder\";\n\ninterface Xf {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n align: string | null;\n}\ninterface FontRec {\n size: number;\n name: string;\n color: string | null;\n bold: boolean;\n italic: boolean;\n}\ninterface BorderRec {\n top: string | null;\n right: string | null;\n bottom: string | null;\n left: string | null;\n}\n\n/**\n * Deduplicates fonts/fills/borders/numFmts and the cellXfs that combine them.\n * Mirrors PHP `Writer\\StylesRegistry` (style index 0 = the unformatted base).\n */\nexport class StylesRegistry {\n private xfIndex = new Map<string, number>([[\"__default__\", 0]]);\n private xfs: Xf[] = [{ fontId: 0, fillId: 0, borderId: 0, numFmtId: 0, align: null }];\n\n private fontIndex = new Map<string, number>([[\"__default__\", 0]]);\n private fonts: FontRec[] = [{ size: 11, name: \"Calibri\", color: null, bold: false, italic: false }];\n\n private fillIndex = new Map<string, number>([\n [\"__none__\", 0],\n [\"__gray125__\", 1],\n ]);\n private fills: ({ type: \"none\" } | { type: \"gray125\" } | { type: \"solid\"; fg: string })[] = [\n { type: \"none\" },\n { type: \"gray125\" },\n ];\n\n private borderIndex = new Map<string, number>([[\"__default__\", 0]]);\n private borders: BorderRec[] = [{ top: null, right: null, bottom: null, left: null }];\n\n private numFmtIndex = new Map<string, number>();\n private numFmts = new Map<number, string>();\n private nextNumFmtId = 164;\n\n register(format: CellFormat | null): number {\n if (format === null || format.isEmpty()) return 0;\n\n const key = format.key();\n const existing = this.xfIndex.get(key);\n if (existing !== undefined) return existing;\n\n const fontId = this.fontFor(format);\n const fillId = this.fillFor(format);\n const borderId = this.borderFor(format);\n const numFmtId = this.numFmtFor(format);\n\n this.xfs.push({ fontId, fillId, borderId, numFmtId, align: format.textAlign });\n const idx = this.xfs.length - 1;\n this.xfIndex.set(key, idx);\n return idx;\n }\n\n private fontFor(f: CellFormat): number {\n const rec: FontRec = {\n size: f.fontSize ?? 11,\n name: \"Calibri\",\n color: f.color,\n bold: f.bold,\n italic: f.italic,\n };\n const key = JSON.stringify(rec);\n const existing = this.fontIndex.get(key);\n if (existing !== undefined) return existing;\n this.fonts.push(rec);\n const idx = this.fonts.length - 1;\n this.fontIndex.set(key, idx);\n return idx;\n }\n\n private fillFor(f: CellFormat): number {\n if (f.backgroundColor === null) return 0;\n const key = f.backgroundColor.toUpperCase();\n const existing = this.fillIndex.get(key);\n if (existing !== undefined) return existing;\n this.fills.push({ type: \"solid\", fg: key });\n const idx = this.fills.length - 1;\n this.fillIndex.set(key, idx);\n return idx;\n }\n\n private borderFor(f: CellFormat): number {\n if (!f.borderTop && !f.borderRight && !f.borderBottom && !f.borderLeft) return 0;\n const rec: BorderRec = {\n top: f.borderTop,\n right: f.borderRight,\n bottom: f.borderBottom,\n left: f.borderLeft,\n };\n const key = JSON.stringify(rec);\n const existing = this.borderIndex.get(key);\n if (existing !== undefined) return existing;\n this.borders.push(rec);\n const idx = this.borders.length - 1;\n this.borderIndex.set(key, idx);\n return idx;\n }\n\n private numFmtFor(f: CellFormat): number {\n const code = NumFmtBuilder.build(f);\n if (code === null) return 0;\n const existing = this.numFmtIndex.get(code);\n if (existing !== undefined) return existing;\n const id = this.nextNumFmtId++;\n this.numFmts.set(id, code);\n this.numFmtIndex.set(code, id);\n return id;\n }\n\n toXml(): string {\n let numFmtsXml = \"\";\n if (this.numFmts.size > 0) {\n let records = \"\";\n for (const [id, code] of this.numFmts) {\n records += `<numFmt numFmtId=\"${id}\" formatCode=\"${xmlEscape(code)}\"/>`;\n }\n numFmtsXml = `<numFmts count=\"${this.numFmts.size}\">${records}</numFmts>`;\n }\n\n let fontsXml = `<fonts count=\"${this.fonts.length}\">`;\n for (const f of this.fonts) {\n fontsXml += \"<font>\";\n fontsXml += `<sz val=\"${Number(f.size)}\"/>`;\n if (f.bold) fontsXml += \"<b/>\";\n if (f.italic) fontsXml += \"<i/>\";\n if (f.color) fontsXml += `<color rgb=\"${hexToArgb(f.color)}\"/>`;\n fontsXml += `<name val=\"${xmlEscape(f.name)}\"/>`;\n fontsXml += \"</font>\";\n }\n fontsXml += \"</fonts>\";\n\n let fillsXml = `<fills count=\"${this.fills.length}\">`;\n for (const fill of this.fills) {\n if (fill.type === \"none\") {\n fillsXml += '<fill><patternFill patternType=\"none\"/></fill>';\n } else if (fill.type === \"gray125\") {\n fillsXml += '<fill><patternFill patternType=\"gray125\"/></fill>';\n } else {\n fillsXml += `<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${hexToArgb(fill.fg)}\"/></patternFill></fill>`;\n }\n }\n fillsXml += \"</fills>\";\n\n let bordersXml = `<borders count=\"${this.borders.length}\">`;\n for (const b of this.borders) {\n bordersXml += \"<border>\";\n for (const side of [\"left\", \"right\", \"top\", \"bottom\"] as const) {\n const color = b[side];\n if (!color) {\n bordersXml += `<${side}/>`;\n } else {\n bordersXml += `<${side} style=\"thin\"><color rgb=\"${hexToArgb(color)}\"/></${side}>`;\n }\n }\n bordersXml += \"<diagonal/></border>\";\n }\n bordersXml += \"</borders>\";\n\n let cellXfsXml = `<cellXfs count=\"${this.xfs.length}\">`;\n for (const xf of this.xfs) {\n let apply = \"\";\n if (xf.fontId > 0) apply += ' applyFont=\"1\"';\n if (xf.fillId > 0) apply += ' applyFill=\"1\"';\n if (xf.borderId > 0) apply += ' applyBorder=\"1\"';\n if (xf.numFmtId > 0) apply += ' applyNumberFormat=\"1\"';\n if (xf.align) apply += ' applyAlignment=\"1\"';\n cellXfsXml += `<xf numFmtId=\"${xf.numFmtId}\" fontId=\"${xf.fontId}\" fillId=\"${xf.fillId}\" borderId=\"${xf.borderId}\" xfId=\"0\"${apply}>`;\n if (xf.align) cellXfsXml += `<alignment horizontal=\"${xmlEscape(xf.align)}\"/>`;\n cellXfsXml += \"</xf>\";\n }\n cellXfsXml += \"</cellXfs>\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n numFmtsXml +\n fontsXml +\n fillsXml +\n bordersXml +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n cellXfsXml +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '<dxfs count=\"0\"/><tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>' +\n \"</styleSheet>\"\n );\n }\n}\n\n/** \"#RRGGBB\" → \"FFRRGGBB\" (Excel ARGB). */\nfunction hexToArgb(hex: string): string {\n const h = hex.replace(/^#/, \"\");\n if (h.length === 6) return \"FF\" + h.toUpperCase();\n if (h.length === 8) return h.toUpperCase();\n return \"FF000000\";\n}\n","import { Cell } from \"../workbook/cell\";\nimport { CellAddress } from \"../workbook/cell-address\";\nimport type { Sheet } from \"../workbook/sheet\";\nimport type { Workbook } from \"../workbook/workbook\";\nimport { xmlEscape } from \"../xml\";\nimport { formatFloat } from \"../util\";\nimport { zipSync, type ZipFile } from \"../zip\";\nimport { StylesRegistry } from \"./styles-registry\";\n\nconst encoder = new TextEncoder();\n\n/**\n * XLSX writer — emits a complete OOXML SpreadsheetML package as bytes.\n * Mirrors PHP `Writer\\XlsxWriter` (file I/O moved to the Agent for isomorphism).\n */\nexport class XlsxWriter {\n toBytes(workbook: Workbook): Uint8Array {\n const styles = new StylesRegistry();\n\n // Pre-render sheet xml so styles register before we serialize styles.xml.\n const sheetXmls: string[] = workbook.sheets.map((sheet) => this.sheetXml(sheet, styles));\n\n const sheetsWithComments: number[] = [];\n workbook.sheets.forEach((sheet, i) => {\n if (sheet.hasComments()) sheetsWithComments.push(i);\n });\n\n const files: ZipFile[] = [];\n const add = (name: string, xml: string): void => {\n files.push({ name, data: encoder.encode(xml) });\n };\n\n add(\"[Content_Types].xml\", this.contentTypesXml(workbook, sheetsWithComments));\n add(\"_rels/.rels\", this.rootRelsXml());\n add(\"xl/workbook.xml\", this.workbookXml(workbook));\n add(\"xl/_rels/workbook.xml.rels\", this.workbookRelsXml(workbook));\n add(\"xl/styles.xml\", styles.toXml());\n add(\"docProps/core.xml\", this.coreXml(workbook));\n add(\"docProps/app.xml\", this.appXml());\n\n workbook.sheets.forEach((sheet, i) => {\n const n = i + 1;\n add(`xl/worksheets/sheet${n}.xml`, sheetXmls[i]!);\n if (sheet.hasComments()) {\n add(`xl/worksheets/_rels/sheet${n}.xml.rels`, this.sheetRelsXml(n));\n add(`xl/comments${n}.xml`, this.commentsXml(sheet));\n add(`xl/drawings/vmlDrawing${n}.vml`, this.vmlDrawingXml(sheet));\n }\n });\n\n return zipSync(files);\n }\n\n private contentTypesXml(workbook: Workbook, sheetsWithComments: number[]): string {\n let overrides =\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>';\n\n workbook.sheets.forEach((_, i) => {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/worksheets/sheet${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n });\n\n for (const i of sheetsWithComments) {\n const n = i + 1;\n overrides += `<Override PartName=\"/xl/comments${n}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"/>`;\n }\n\n let defaults =\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>';\n if (sheetsWithComments.length > 0) {\n defaults += '<Default Extension=\"vml\" ContentType=\"application/vnd.openxmlformats-officedocument.vmlDrawing\"/>';\n }\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n defaults +\n overrides +\n \"</Types>\"\n );\n }\n\n private rootRelsXml(): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n '<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>' +\n \"</Relationships>\"\n );\n }\n\n private workbookXml(workbook: Workbook): string {\n let sheets = \"\";\n workbook.sheets.forEach((sheet, i) => {\n const name = this.escape(sheet.name);\n const sheetId = i + 1;\n const rId = \"rId\" + (i + 1);\n sheets += `<sheet name=\"${name}\" sheetId=\"${sheetId}\" r:id=\"${rId}\"/>`;\n });\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<sheets>${sheets}</sheets>` +\n \"</workbook>\"\n );\n }\n\n private workbookRelsXml(workbook: Workbook): string {\n let rels = \"\";\n workbook.sheets.forEach((_, i) => {\n const rId = \"rId\" + (i + 1);\n rels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${i + 1}.xml\"/>`;\n });\n rels += `<Relationship Id=\"rId${workbook.sheets.length + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n rels +\n \"</Relationships>\"\n );\n }\n\n private sheetRelsXml(sheetNum: number): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\" Target=\"../drawings/vmlDrawing${sheetNum}.vml\"/>` +\n `<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\" Target=\"../comments${sheetNum}.xml\"/>` +\n \"</Relationships>\"\n );\n }\n\n private sheetXml(sheet: Sheet, styles: StylesRegistry): string {\n let sheetViewsXml = \"\";\n if (sheet.frozenRows > 0 || sheet.frozenCols > 0) {\n const topLeft = CellAddress.letter(sheet.frozenCols) + (sheet.frozenRows + 1);\n const pane =\n \"<pane\" +\n (sheet.frozenCols > 0 ? ` xSplit=\"${sheet.frozenCols}\"` : \"\") +\n (sheet.frozenRows > 0 ? ` ySplit=\"${sheet.frozenRows}\"` : \"\") +\n ` topLeftCell=\"${topLeft}\" activePane=\"bottomRight\" state=\"frozen\"/>`;\n sheetViewsXml = `<sheetViews><sheetView workbookViewId=\"0\">${pane}</sheetView></sheetViews>`;\n }\n\n let colsXml = \"\";\n if (sheet.columnWidths.size > 0) {\n colsXml = \"<cols>\";\n for (const [colIdx, px] of sheet.columnWidths) {\n const excelWidth = Math.max(1.0, (px - 5) / 7);\n const colNum = colIdx + 1;\n colsXml += `<col min=\"${colNum}\" max=\"${colNum}\" width=\"${excelWidth.toFixed(4)}\" customWidth=\"1\"/>`;\n }\n colsXml += \"</cols>\";\n }\n\n let rowsXml = \"\";\n for (const [rowIndex, row] of sheet.rows()) {\n let cellsXml = \"\";\n const sortedCols = [...row.keys()].sort();\n for (const col of sortedCols) {\n cellsXml += this.cellXml(row.get(col)!, styles);\n }\n rowsXml += `<row r=\"${rowIndex}\">${cellsXml}</row>`;\n }\n\n let mergesXml = \"\";\n if (sheet.mergedRegions.length > 0) {\n mergesXml = `<mergeCells count=\"${sheet.mergedRegions.length}\">`;\n for (const merge of sheet.mergedRegions) mergesXml += `<mergeCell ref=\"${merge.ref()}\"/>`;\n mergesXml += \"</mergeCells>\";\n }\n\n const legacyDrawing = sheet.hasComments() ? '<legacyDrawing r:id=\"rId1\"/>' : \"\";\n\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n sheetViewsXml +\n colsXml +\n `<sheetData>${rowsXml}</sheetData>` +\n mergesXml +\n legacyDrawing +\n \"</worksheet>\"\n );\n }\n\n private cellXml(cell: Cell, styles: StylesRegistry): string {\n const ref = cell.address;\n const type = cell.excelType();\n const styleIdx = styles.register(cell.format);\n const sAttr = styleIdx > 0 ? ` s=\"${styleIdx}\"` : \"\";\n\n if (cell.formula !== null) {\n const f = this.escape(cell.formula.replace(/^=+/, \"\"));\n const cached = cell.cachedValue ?? cell.value;\n const v = cached !== null ? `<v>${this.escape(String(cached))}</v>` : \"\";\n return `<c r=\"${ref}\"${sAttr}><f>${f}</f>${v}</c>`;\n }\n\n if (type === \"inlineStr\") {\n const t = this.escape(String(cell.value));\n return `<c r=\"${ref}\"${sAttr} t=\"inlineStr\"><is><t xml:space=\"preserve\">${t}</t></is></c>`;\n }\n\n if (type === \"b\") {\n const v = cell.value === true ? \"1\" : \"0\";\n return `<c r=\"${ref}\"${sAttr} t=\"b\"><v>${v}</v></c>`;\n }\n\n if (cell.value === null) {\n return `<c r=\"${ref}\"${sAttr}/>`;\n }\n\n let v: string;\n if (typeof cell.value === \"number\") {\n // This mirrors PHP's `is_float($v) ? number_format(...) : (string) $v`,\n // but the mirror leaks: a PHP int never stringifies exponentially, while\n // in JS an INTEGER-VALUED double does above 1e21 — `String(1e21)` is\n // \"1e+21\" and `String(1e300)` is \"1e+300\". Both are integers by\n // `Number.isInteger`, so they took the String() branch and went into the\n // sheet as `<v>1e+21</v>`, which is not valid cell content.\n //\n // formatFloat handles that range exactly (via BigInt) and also maps\n // NaN/Infinity — neither of which is an integer — to 0.\n v =\n Number.isInteger(cell.value) && Math.abs(cell.value) < 1e21\n ? String(cell.value)\n : formatFloat(cell.value);\n } else {\n v = String(cell.value);\n }\n if (v === \"\") v = \"0\";\n return `<c r=\"${ref}\"${sAttr}><v>${v}</v></c>`;\n }\n\n private commentsXml(sheet: Sheet): string {\n const authors: string[] = [];\n let commentList = \"\";\n for (const entry of sheet.comments()) {\n const author = entry.comment.author ?? \"Author\";\n if (!authors.includes(author)) authors.push(author);\n const authorIdx = authors.indexOf(author);\n const text = this.escape(entry.comment.text);\n commentList +=\n `<comment ref=\"${entry.address}\" authorId=\"${authorIdx}\">` +\n `<text><r><t xml:space=\"preserve\">${text}</t></r></text>` +\n \"</comment>\";\n }\n let authorsXml = \"<authors>\";\n for (const a of authors) authorsXml += `<author>${this.escape(a)}</author>`;\n authorsXml += \"</authors>\";\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n authorsXml +\n `<commentList>${commentList}</commentList>` +\n \"</comments>\"\n );\n }\n\n private vmlDrawingXml(sheet: Sheet): string {\n let shapes = \"\";\n let shapeId = 1024;\n for (const entry of sheet.comments()) {\n const m = /^([A-Z]+)(\\d+)$/.exec(entry.address)!;\n const col = CellAddress.index(m[1]!);\n const row = parseInt(m[2]!, 10) - 1;\n shapeId++;\n shapes +=\n `<v:shape id=\"_x0000_s${shapeId}\" type=\"#_x0000_t202\" ` +\n 'style=\"position:absolute;margin-left:60pt;margin-top:5pt;width:108pt;height:60pt;z-index:1;visibility:hidden\" ' +\n 'fillcolor=\"#ffffe1\" o:insetmode=\"auto\">' +\n '<v:fill color2=\"#ffffe1\"/>' +\n '<v:shadow on=\"t\" color=\"black\" obscured=\"t\"/>' +\n '<v:path o:connecttype=\"none\"/>' +\n '<v:textbox><div style=\"text-align:left\"></div></v:textbox>' +\n '<x:ClientData ObjectType=\"Note\">' +\n \"<x:MoveWithCells/>\" +\n \"<x:SizeWithCells/>\" +\n `<x:Anchor>${col + 1}, 15, ${row}, 10, ${col + 3}, 31, ${row + 4}, 18</x:Anchor>` +\n \"<x:AutoFill>False</x:AutoFill>\" +\n `<x:Row>${row}</x:Row>` +\n `<x:Column>${col}</x:Column>` +\n \"</x:ClientData>\" +\n \"</v:shape>\";\n }\n return (\n '<xml xmlns:v=\"urn:schemas-microsoft-com:vml\" ' +\n 'xmlns:o=\"urn:schemas-microsoft-com:office:office\" ' +\n 'xmlns:x=\"urn:schemas-microsoft-com:office:excel\">' +\n '<o:shapelayout v:ext=\"edit\"><o:idmap v:ext=\"edit\" data=\"1\"/></o:shapelayout>' +\n '<v:shapetype id=\"_x0000_t202\" coordsize=\"21600,21600\" o:spt=\"202\" path=\"m,l,21600r21600,l21600,xe\">' +\n '<v:stroke joinstyle=\"miter\"/><v:path gradientshapeok=\"t\" o:connecttype=\"rect\"/></v:shapetype>' +\n shapes +\n \"</xml>\"\n );\n }\n\n private coreXml(workbook: Workbook): string {\n const now = (workbook.meta[\"created\"] as string | undefined) ?? gmDateZ();\n const creator = this.escape(String(workbook.meta[\"creator\"] ?? \"Holy Sheet\"));\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n `<dc:creator>${creator}</dc:creator>` +\n `<cp:lastModifiedBy>${creator}</cp:lastModifiedBy>` +\n `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>` +\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>` +\n \"</cp:coreProperties>\"\n );\n }\n\n private appXml(): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n \"<Application>Holy Sheet</Application>\" +\n \"<DocSecurity>0</DocSecurity>\" +\n \"<ScaleCrop>false</ScaleCrop>\" +\n \"<SharedDoc>false</SharedDoc>\" +\n \"<HyperlinksChanged>false</HyperlinksChanged>\" +\n \"<AppVersion>1.0</AppVersion>\" +\n \"</Properties>\"\n );\n }\n\n private escape(s: string): string {\n return xmlEscape(s);\n }\n}\n\n/** PHP gmdate('Y-m-d\\TH:i:s\\Z') — current UTC time, seconds precision. */\nfunction gmDateZ(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n","{\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/** Feature-parity baseline with PHP holy-sheet; bumped independently on npm. */\nexport const VERSION = \"1.0.0\";\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"]}