@opengeni/artifact-tool 0.2.10 → 0.3.4-canary.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.
Files changed (57) hide show
  1. package/dist/{chunk-ZCJYRJGB.js → chunk-4XJE7NRA.js} +2 -2
  2. package/dist/{chunk-N2IHNWBS.js → chunk-4YYYUZQH.js} +15 -6
  3. package/dist/chunk-4YYYUZQH.js.map +1 -0
  4. package/dist/{chunk-U5G2BKM2.js → chunk-LMLPFF3S.js} +12 -6
  5. package/dist/{chunk-U5G2BKM2.js.map → chunk-LMLPFF3S.js.map} +1 -1
  6. package/dist/{chunk-B2ZJRZDA.js → chunk-LVPFJH2Z.js} +7 -5
  7. package/dist/chunk-LVPFJH2Z.js.map +1 -0
  8. package/dist/{chunk-QZI5POCC.js → chunk-OVXX4G35.js} +2 -2
  9. package/dist/{chunk-6PBM7FKI.js → chunk-QA3NXBAG.js} +8 -7
  10. package/dist/chunk-QA3NXBAG.js.map +1 -0
  11. package/dist/{chunk-XT2EJFCU.js → chunk-SYFNJGH5.js} +30 -8
  12. package/dist/chunk-SYFNJGH5.js.map +1 -0
  13. package/dist/{chunk-RU5G3HNF.js → chunk-XAZTHG6W.js} +20 -9
  14. package/dist/chunk-XAZTHG6W.js.map +1 -0
  15. package/dist/index.js +4 -4
  16. package/dist/kernel.d.ts +0 -19
  17. package/dist/materializer-cli-entry.js +7 -7
  18. package/dist/materializer-cli.d.ts +4 -3
  19. package/dist/materializer-cli.js +7 -7
  20. package/dist/native.d.ts +1 -1
  21. package/dist/native.js +2 -2
  22. package/dist/office-import.d.ts +15 -5
  23. package/dist/office-import.js +25 -8
  24. package/dist/office-import.js.map +1 -1
  25. package/dist/production-document.js +4 -4
  26. package/dist/production-presentation.js +4 -4
  27. package/dist/production-spreadsheet.js +4 -4
  28. package/dist/reference.js +1 -365
  29. package/dist/reference.js.map +1 -1
  30. package/dist/runtime-cli-entry.js +3 -3
  31. package/dist/runtime-cli.js +2 -2
  32. package/dist/runtime-development.js +3 -3
  33. package/dist/runtime-receipt.d.ts +3 -2
  34. package/dist/runtime.d.ts +8 -6
  35. package/dist/runtime.js +1 -1
  36. package/dist/snapshot.d.ts +13 -6
  37. package/dist/snapshot.js +23 -11
  38. package/dist/snapshot.js.map +1 -1
  39. package/dist/spreadsheet-xlsx-codec.js +2 -2
  40. package/dist/spreadsheet.js +1 -1
  41. package/package.json +5 -5
  42. package/src/kernel.ts +1 -397
  43. package/src/materializer-cli.ts +20 -9
  44. package/src/native.ts +7 -5
  45. package/src/office-import.ts +47 -18
  46. package/src/production-spreadsheet-native.ts +4 -3
  47. package/src/runtime-receipt.ts +16 -5
  48. package/src/runtime.ts +22 -10
  49. package/src/snapshot.ts +39 -17
  50. package/src/spreadsheet-formula.ts +35 -7
  51. package/dist/chunk-6PBM7FKI.js.map +0 -1
  52. package/dist/chunk-B2ZJRZDA.js.map +0 -1
  53. package/dist/chunk-N2IHNWBS.js.map +0 -1
  54. package/dist/chunk-RU5G3HNF.js.map +0 -1
  55. package/dist/chunk-XT2EJFCU.js.map +0 -1
  56. /package/dist/{chunk-ZCJYRJGB.js.map → chunk-4XJE7NRA.js.map} +0 -0
  57. /package/dist/{chunk-QZI5POCC.js.map → chunk-OVXX4G35.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spreadsheet-formula.ts","../src/spreadsheet.ts"],"sourcesContent":["import {\n EXCEL_MAX_COLUMNS,\n EXCEL_MAX_ROWS,\n columnIndexToName,\n columnNameToIndex,\n formatCellAddress,\n parseCellAddress,\n type CellAddress,\n} from \"./spreadsheet-address\";\nimport { ArtifactLimitError } from \"./errors\";\nimport type { FormulaErrorValue, FormulaResult } from \"./spreadsheet-types\";\n\ntype Scalar = FormulaResult;\ntype Matrix = Scalar[][];\ntype Evaluated = Scalar | Matrix;\ntype FormulaPunctuation = \"(\" | \")\" | \",\" | \":\" | \"!\";\n\nexport type FormulaReference = {\n sheetName: string | null;\n start: CellAddress;\n end: CellAddress;\n};\nexport type FormulaEvaluationContext = {\n currentSheetName: string;\n getCell: (sheetName: string, address: CellAddress) => FormulaResult;\n /** Reuse one budget across recursively evaluated dependency formulas. */\n budget?: FormulaEvaluationBudget;\n /** Applied only when `budget` is omitted. */\n limits?: Partial<FormulaEvaluationLimits>;\n};\n\nexport type FormulaEvaluationLimits = {\n maxFormulaBytes: number;\n maxTokens: number;\n maxNestingDepth: number;\n maxFunctionArguments: number;\n maxRangeCells: number;\n maxCellReads: number;\n maxOperations: number;\n maxDependencyDepth: number;\n maxResultStringChars: number;\n};\n\n/** Conservative reference-engine boundaries. Native kernels must enforce equivalent or tighter caps. */\nexport const DEFAULT_FORMULA_LIMITS: Readonly<FormulaEvaluationLimits> = Object.freeze({\n maxFormulaBytes: 8_192,\n maxTokens: 4_096,\n maxNestingDepth: 64,\n maxFunctionArguments: 255,\n maxRangeCells: 100_000,\n maxCellReads: 100_000,\n maxOperations: 100_000,\n maxDependencyDepth: 256,\n maxResultStringChars: 32_767,\n});\n\nconst activeFormulaBudgets = new WeakSet<FormulaEvaluationBudget>();\n\n/**\n * Functions implemented by the bounded reference evaluator. Office codecs use the same\n * allowlist so an imported/exported formula cannot become an execution channel that OpenGeni\n * itself never parsed (for example HYPERLINK, DDE, external-workbook, or data-fetch functions).\n */\nconst SUPPORTED_FORMULA_FUNCTIONS = new Set([\n \"SUM\",\n \"AVERAGE\",\n \"MIN\",\n \"MAX\",\n \"COUNT\",\n \"COUNTA\",\n \"IF\",\n \"IFERROR\",\n \"AND\",\n \"OR\",\n \"NOT\",\n \"ABS\",\n \"ROUND\",\n \"ROUNDUP\",\n \"ROUNDDOWN\",\n \"POWER\",\n \"SQRT\",\n \"LEN\",\n \"LOWER\",\n \"UPPER\",\n \"TRIM\",\n \"LEFT\",\n \"RIGHT\",\n \"MID\",\n \"CONCAT\",\n \"DATE\",\n \"YEAR\",\n \"MONTH\",\n \"DAY\",\n \"INDEX\",\n \"MATCH\",\n \"XLOOKUP\",\n]);\n\n/** Explicit, shareable fuel for one root formula evaluation. */\nexport class FormulaEvaluationBudget {\n readonly limits: Readonly<FormulaEvaluationLimits>;\n private operationsUsed = 0;\n private cellReadsUsed = 0;\n\n constructor(overrides: Partial<FormulaEvaluationLimits> = {}) {\n for (const name of Object.keys(overrides)) {\n if (!Object.hasOwn(DEFAULT_FORMULA_LIMITS, name)) {\n throw new TypeError(`Unknown formula limit: ${name}`);\n }\n }\n const limits = { ...DEFAULT_FORMULA_LIMITS, ...overrides };\n for (const [name, value] of Object.entries(limits)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n const hardMaximum = DEFAULT_FORMULA_LIMITS[name as keyof FormulaEvaluationLimits];\n if (value > hardMaximum) {\n throw new TypeError(`${name} cannot exceed the hard maximum (${hardMaximum})`);\n }\n }\n this.limits = Object.freeze(limits);\n }\n\n consumeOperations(count = 1): void {\n const next = checkedFuelTotal(this.operationsUsed, count);\n if (next > this.limits.maxOperations) {\n throw new ArtifactLimitError(\n \"formula evaluation operations\",\n next,\n this.limits.maxOperations,\n );\n }\n this.operationsUsed = next;\n }\n\n consumeCellReads(count: number): void {\n const next = checkedFuelTotal(this.cellReadsUsed, count);\n if (next > this.limits.maxCellReads) {\n throw new ArtifactLimitError(\"formula dependency reads\", next, this.limits.maxCellReads);\n }\n this.cellReadsUsed = next;\n }\n\n assertDependencyDepth(depth: number): void {\n if (depth > this.limits.maxDependencyDepth) {\n throw new ArtifactLimitError(\n \"formula dependency depth\",\n depth,\n this.limits.maxDependencyDepth,\n );\n }\n }\n\n get usage(): Readonly<{ operations: number; cellReads: number }> {\n return { operations: this.operationsUsed, cellReads: this.cellReadsUsed };\n }\n\n get operationCount(): number {\n return this.operationsUsed;\n }\n\n get cellReadCount(): number {\n return this.cellReadsUsed;\n }\n\n /**\n * Reuse this meter for one independent root without exposing a reset primitive. Re-entry is\n * rejected, including from a hostile `getCell` callback during `evaluateFormula`.\n */\n runIsolatedRoot<T>(evaluate: (budget: FormulaEvaluationBudget) => T): T {\n if (activeFormulaBudgets.has(this)) {\n throw new Error(\"Cannot reset formula fuel during an active root evaluation\");\n }\n this.operationsUsed = 0;\n this.cellReadsUsed = 0;\n activeFormulaBudgets.add(this);\n try {\n return evaluate(this);\n } finally {\n activeFormulaBudgets.delete(this);\n }\n }\n\n /**\n * Activate one trusted batch while retaining an independent fuel counter for every root.\n * The scoped runner expires with the batch and cannot be used for active-root re-entry.\n */\n runIsolatedRoots<T>(\n evaluateBatch: (runRoot: <R>(evaluate: (budget: FormulaEvaluationBudget) => R) => R) => T,\n ): T {\n if (activeFormulaBudgets.has(this)) {\n throw new Error(\"Cannot reset formula fuel during an active root evaluation\");\n }\n let open = true;\n let rootActive = false;\n activeFormulaBudgets.add(this);\n const runRoot = <R>(evaluate: (budget: FormulaEvaluationBudget) => R): R => {\n if (!open || !activeFormulaBudgets.has(this)) {\n throw new Error(\"Formula root batch is no longer active\");\n }\n if (rootActive) {\n throw new Error(\"Cannot reset formula fuel during an active root evaluation\");\n }\n this.operationsUsed = 0;\n this.cellReadsUsed = 0;\n rootActive = true;\n try {\n return evaluate(this);\n } finally {\n rootActive = false;\n }\n };\n try {\n return evaluateBatch(runRoot);\n } finally {\n open = false;\n activeFormulaBudgets.delete(this);\n }\n }\n}\n\nclass FormulaFault extends Error {\n readonly code: FormulaErrorValue;\n\n constructor(code: FormulaErrorValue) {\n super(code);\n this.code = code;\n }\n}\n\ntype Token =\n | { type: \"number\"; value: number }\n | { type: \"string\"; value: string }\n | { type: \"word\"; value: string }\n | { type: \"cell\"; value: string }\n | { type: \"error\"; value: FormulaErrorValue }\n | { type: \"operator\"; value: string }\n | { type: \"punctuation\"; value: FormulaPunctuation };\n\nexport function evaluateFormula(formula: string, context: FormulaEvaluationContext): FormulaResult {\n const budget = context.budget ?? new FormulaEvaluationBudget(context.limits);\n const ownsBudgetActivation = !activeFormulaBudgets.has(budget);\n if (ownsBudgetActivation) activeFormulaBudgets.add(budget);\n try {\n const parser = new FormulaParser(formula, context, budget);\n return boundedScalar(scalar(parser.parse()), budget.limits.maxResultStringChars);\n } catch (cause) {\n if (cause instanceof FormulaFault) return cause.code;\n if (cause instanceof ArtifactLimitError) throw cause;\n return \"#VALUE!\";\n } finally {\n if (ownsBudgetActivation) activeFormulaBudgets.delete(budget);\n }\n}\n\n/** Validate resource bounds without materializing ranges or reading workbook cells. */\nexport function validateFormulaLimits(\n formula: string,\n limits: Partial<FormulaEvaluationLimits> = {},\n): void {\n const budget = new FormulaEvaluationBudget(limits);\n try {\n new FormulaParser(\n formula,\n { currentSheetName: \"Validation\", getCell: () => null },\n budget,\n true,\n ).parse();\n } catch (cause) {\n // Spreadsheet syntax faults remain ordinary formula values; resource-limit faults do not.\n if (cause instanceof FormulaFault) return;\n throw cause;\n }\n}\n\n/**\n * Fail closed unless the complete formula is valid reference-engine syntax and every function\n * belongs to the explicit bounded allowlist. Unlike `validateFormulaLimits`, syntax faults are\n * rejected instead of being treated as ordinary spreadsheet error values.\n */\nexport function validateSupportedFormula(\n formula: string,\n limits: Partial<FormulaEvaluationLimits> = {},\n): void {\n const budget = new FormulaEvaluationBudget(limits);\n try {\n new FormulaParser(\n formula,\n { currentSheetName: \"Validation\", getCell: () => null },\n budget,\n true,\n true,\n ).parse();\n } catch (cause) {\n if (cause instanceof ArtifactLimitError) throw cause;\n throw new TypeError(\"Formula contains unsupported syntax or functions\", { cause });\n }\n}\n\nexport function referencesInFormula(formula: string): FormulaReference[] {\n assertFormulaByteLimit(formula, DEFAULT_FORMULA_LIMITS.maxFormulaBytes);\n const references: FormulaReference[] = [];\n const expression = formula.startsWith(\"=\") ? formula.slice(1) : formula;\n forEachFormulaCode(expression, (code) => {\n const pattern =\n /(^|[^A-Za-z0-9_.])(?:(?:'((?:[^']|'')+)'|([A-Za-z_][A-Za-z0-9_.]*))!)?(\\$?[A-Za-z]{1,3}\\$?[1-9]\\d*)(?::(\\$?[A-Za-z]{1,3}\\$?[1-9]\\d*))?(?![A-Za-z0-9_.(])/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(code))) {\n try {\n const start = parseCellAddress(match[4]!);\n const end = match[5] ? parseCellAddress(match[5]) : start;\n references.push({\n sheetName: match[2]?.replaceAll(\"''\", \"'\") ?? match[3] ?? null,\n start: {\n row: Math.min(start.row, end.row),\n col: Math.min(start.col, end.col),\n },\n end: {\n row: Math.max(start.row, end.row),\n col: Math.max(start.col, end.col),\n },\n });\n } catch {\n // Invalid/out-of-bounds A1-like identifiers are not valid precedents.\n }\n }\n });\n return references;\n}\n\nexport function translateFormula(formula: string, rowDelta: number, colDelta: number): string {\n assertFormulaByteLimit(formula, DEFAULT_FORMULA_LIMITS.maxFormulaBytes);\n const translated = mapFormulaCode(formula, (code) =>\n code.replace(\n /(^|[^A-Za-z0-9_.])((?:'(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!)?(\\$?)([A-Za-z]{1,3})(\\$?)([1-9]\\d*)(?![A-Za-z0-9_.(])/g,\n (\n _full,\n leading: string,\n sheetPrefix: string | undefined,\n absoluteCol: string,\n colName: string,\n absoluteRow: string,\n rowText: string,\n ) => {\n const col = columnNameToIndex(colName);\n const row = Number(rowText) - 1;\n const nextCol = absoluteCol ? col : col + colDelta;\n const nextRow = absoluteRow ? row : row + rowDelta;\n if (\n nextCol < 0 ||\n nextCol >= EXCEL_MAX_COLUMNS ||\n nextRow < 0 ||\n nextRow >= EXCEL_MAX_ROWS\n ) {\n return `${leading}#REF!`;\n }\n return `${leading}${sheetPrefix ?? \"\"}${absoluteCol}${columnIndexToName(nextCol)}${absoluteRow}${nextRow + 1}`;\n },\n ),\n );\n assertFormulaByteLimit(translated, DEFAULT_FORMULA_LIMITS.maxFormulaBytes);\n return translated;\n}\n\nexport function formulaFromR1C1(formula: string, anchor: CellAddress): string {\n assertFormulaByteLimit(formula, DEFAULT_FORMULA_LIMITS.maxFormulaBytes);\n const translated = mapFormulaCode(formula, (code) =>\n code.replace(\n /(^|[^A-Za-z0-9_.])((?:'(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!)?R(?:\\[(-?\\d+)\\]|([1-9]\\d*))?C(?:\\[(-?\\d+)\\]|([1-9]\\d*))?(?![A-Za-z0-9_.])/gi,\n (\n _full,\n leading: string,\n sheetPrefix: string | undefined,\n relativeRow: string | undefined,\n absoluteRow: string | undefined,\n relativeCol: string | undefined,\n absoluteCol: string | undefined,\n ) => {\n const row =\n absoluteRow === undefined\n ? anchor.row + Number(relativeRow ?? 0)\n : Number(absoluteRow) - 1;\n const col =\n absoluteCol === undefined\n ? anchor.col + Number(relativeCol ?? 0)\n : Number(absoluteCol) - 1;\n if (row < 0 || row >= EXCEL_MAX_ROWS || col < 0 || col >= EXCEL_MAX_COLUMNS) {\n throw new Error(\n `R1C1 reference resolves outside worksheet bounds at ${formatCellAddress(anchor)}`,\n );\n }\n return `${leading}${sheetPrefix ?? \"\"}${absoluteCol === undefined ? \"\" : \"$\"}${columnIndexToName(col)}${absoluteRow === undefined ? \"\" : \"$\"}${row + 1}`;\n },\n ),\n );\n assertFormulaByteLimit(translated, DEFAULT_FORMULA_LIMITS.maxFormulaBytes);\n return translated;\n}\n\nexport function formulaToR1C1(formula: string, anchor: CellAddress): string {\n assertFormulaByteLimit(formula, DEFAULT_FORMULA_LIMITS.maxFormulaBytes);\n const translated = mapFormulaCode(formula, (code) =>\n code.replace(\n /(^|[^A-Za-z0-9_.])((?:'(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!)?(\\$?)([A-Za-z]{1,3})(\\$?)([1-9]\\d*)(?![A-Za-z0-9_.(])/g,\n (\n _full,\n leading: string,\n sheetPrefix: string | undefined,\n absoluteCol: string,\n colName: string,\n absoluteRow: string,\n rowText: string,\n ) => {\n const row = Number(rowText) - 1;\n const col = columnNameToIndex(colName);\n const rowReference = absoluteRow\n ? `R${row + 1}`\n : row === anchor.row\n ? \"R\"\n : `R[${row - anchor.row}]`;\n const colReference = absoluteCol\n ? `C${col + 1}`\n : col === anchor.col\n ? \"C\"\n : `C[${col - anchor.col}]`;\n return `${leading}${sheetPrefix ?? \"\"}${rowReference}${colReference}`;\n },\n ),\n );\n assertFormulaByteLimit(translated, DEFAULT_FORMULA_LIMITS.maxFormulaBytes);\n return translated;\n}\n\nclass FormulaParser {\n private readonly tokens: Token[];\n private index = 0;\n private nestingDepth = 0;\n\n constructor(\n formula: string,\n private readonly context: FormulaEvaluationContext,\n private readonly budget: FormulaEvaluationBudget,\n private readonly validateOnly = false,\n private readonly requireSupportedSyntax = false,\n ) {\n assertFormulaByteLimit(formula, budget.limits.maxFormulaBytes);\n this.tokens = tokenize(\n formula.startsWith(\"=\") ? formula.slice(1) : formula,\n budget.limits.maxTokens,\n );\n }\n\n parse(): Evaluated {\n const value = this.comparison();\n if (this.peek()) throw new FormulaFault(\"#VALUE!\");\n return value;\n }\n\n private comparison(): Evaluated {\n let left = this.concat();\n while (this.isOperator(\"=\", \"<>\", \"<\", \">\", \"<=\", \">=\")) {\n const operator = (this.consume() as { value: string }).value;\n const right = this.concat();\n left = calculate(left, right, (a, b) => compare(a, b, operator));\n }\n return left;\n }\n\n private concat(): Evaluated {\n let left = this.additive();\n while (this.isOperator(\"&\")) {\n this.consume();\n const right = this.additive();\n left = calculate(left, right, (a, b) =>\n concatenateText([text(a, this.budget), text(b, this.budget)], this.budget),\n );\n }\n return left;\n }\n\n private additive(): Evaluated {\n let left = this.multiplicative();\n while (this.isOperator(\"+\", \"-\")) {\n const operator = (this.consume() as { value: string }).value;\n const right = this.multiplicative();\n left = calculate(left, right, (a, b) =>\n operator === \"+\" ? numeric(a) + numeric(b) : numeric(a) - numeric(b),\n );\n }\n return left;\n }\n\n private multiplicative(): Evaluated {\n let left = this.power();\n while (this.isOperator(\"*\", \"/\")) {\n const operator = (this.consume() as { value: string }).value;\n const right = this.power();\n left = calculate(left, right, (a, b) => {\n const divisor = numeric(b);\n if (operator === \"/\" && divisor === 0) throw new FormulaFault(\"#DIV/0!\");\n return operator === \"*\" ? numeric(a) * divisor : numeric(a) / divisor;\n });\n }\n return left;\n }\n\n private power(): Evaluated {\n let left = this.unary();\n if (this.isOperator(\"^\")) {\n this.consume();\n const right = this.withNesting(() => this.power());\n left = calculate(left, right, (a, b) =>\n finiteNumber(deterministicIntegerPower(numeric(a), numeric(b))),\n );\n }\n return left;\n }\n\n private unary(): Evaluated {\n if (this.isOperator(\"+\")) {\n this.consume();\n return calculateUnary(\n this.withNesting(() => this.unary()),\n numeric,\n );\n }\n if (this.isOperator(\"-\")) {\n this.consume();\n return calculateUnary(\n this.withNesting(() => this.unary()),\n (value) => -numeric(value),\n );\n }\n const value = this.primary();\n if (this.isOperator(\"%\")) {\n this.consume();\n return calculateUnary(value, (item) => numeric(item) / 100);\n }\n return value;\n }\n\n private primary(): Evaluated {\n const token = this.consume();\n if (!token) throw new FormulaFault(\"#VALUE!\");\n if (token.type === \"number\" || token.type === \"string\" || token.type === \"error\")\n return boundedScalar(token.value, this.budget.limits.maxResultStringChars);\n if (token.type === \"punctuation\" && token.value === \"(\") {\n const value = this.withNesting(() => this.comparison());\n this.expectPunctuation(\")\");\n return value;\n }\n if (token.type === \"word\") {\n if (this.isPunctuation(\"!\")) {\n if (\n this.requireSupportedSyntax &&\n (token.value.length > 31 ||\n [...token.value].some((character) => \"[]:*?/\\\\\".includes(character)))\n ) {\n throw new FormulaFault(\"#REF!\");\n }\n this.consume();\n const cell = this.consume();\n if (!cell || cell.type !== \"cell\") throw new FormulaFault(\"#REF!\");\n return this.reference(token.value, cell.value);\n }\n if (this.isPunctuation(\"(\")) return this.functionCall(token.value);\n const upper = token.value.toUpperCase();\n if (upper === \"TRUE\") return true;\n if (upper === \"FALSE\") return false;\n if (this.requireSupportedSyntax) throw new FormulaFault(\"#NAME?\");\n return \"#NAME?\";\n }\n if (token.type === \"cell\") return this.reference(this.context.currentSheetName, token.value);\n throw new FormulaFault(\"#VALUE!\");\n }\n\n private reference(sheetName: string, startAddress: string): Evaluated {\n let start: CellAddress;\n try {\n start = parseCellAddress(startAddress);\n } catch {\n return \"#REF!\";\n }\n if (!this.isPunctuation(\":\")) {\n if (this.validateOnly) return null;\n this.budget.consumeCellReads(1);\n return boundedScalar(\n this.context.getCell(sheetName, start),\n this.budget.limits.maxResultStringChars,\n );\n }\n this.consume();\n const endToken = this.consume();\n if (!endToken || endToken.type !== \"cell\") throw new FormulaFault(\"#REF!\");\n let end: CellAddress;\n try {\n end = parseCellAddress(endToken.value);\n } catch {\n return \"#REF!\";\n }\n const startRow = Math.min(start.row, end.row);\n const endRow = Math.max(start.row, end.row);\n const startCol = Math.min(start.col, end.col);\n const endCol = Math.max(start.col, end.col);\n const rowCount = endRow - startRow + 1;\n const colCount = endCol - startCol + 1;\n const rangeCells = rowCount * colCount;\n if (rangeCells > this.budget.limits.maxRangeCells) {\n throw new ArtifactLimitError(\n \"formula range cells\",\n rangeCells,\n this.budget.limits.maxRangeCells,\n );\n }\n if (this.validateOnly) return null;\n // Charge the complete range before allocating a matrix or invoking even one dependency read.\n this.budget.consumeCellReads(rangeCells);\n const values: Matrix = [];\n for (let row = startRow; row <= endRow; row += 1) {\n const rowValues: Scalar[] = [];\n for (let col = startCol; col <= endCol; col += 1) {\n rowValues.push(\n boundedScalar(\n this.context.getCell(sheetName, { row, col }),\n this.budget.limits.maxResultStringChars,\n ),\n );\n }\n values.push(rowValues);\n }\n return values;\n }\n\n private functionCall(name: string): Evaluated {\n this.expectPunctuation(\"(\");\n const args: Evaluated[] = [];\n if (!this.isPunctuation(\")\")) {\n do {\n const argumentCount = args.length + 1;\n if (argumentCount > this.budget.limits.maxFunctionArguments) {\n throw new ArtifactLimitError(\n \"formula function arguments\",\n argumentCount,\n this.budget.limits.maxFunctionArguments,\n );\n }\n args.push(this.withNesting(() => this.comparison()));\n if (!this.isPunctuation(\",\")) break;\n this.consume();\n } while (!this.isPunctuation(\")\"));\n }\n this.expectPunctuation(\")\");\n const normalizedName = name.toUpperCase();\n if (this.requireSupportedSyntax && !SUPPORTED_FORMULA_FUNCTIONS.has(normalizedName)) {\n throw new FormulaFault(\"#NAME?\");\n }\n try {\n if (this.validateOnly) return null;\n return boundEvaluated(\n callFunction(normalizedName, args, this.budget),\n this.budget.limits.maxResultStringChars,\n );\n } catch (cause) {\n if (cause instanceof FormulaFault) return cause.code;\n throw cause;\n }\n }\n\n private peek(): Token | undefined {\n return this.tokens[this.index];\n }\n\n private consume(): Token | undefined {\n const token = this.tokens[this.index++];\n if (token) this.budget.consumeOperations();\n return token;\n }\n\n private isOperator(\n first: string,\n second?: string,\n third?: string,\n fourth?: string,\n fifth?: string,\n sixth?: string,\n ): boolean {\n const token = this.peek();\n if (token?.type !== \"operator\") return false;\n const value = token.value;\n return (\n value === first ||\n value === second ||\n value === third ||\n value === fourth ||\n value === fifth ||\n value === sixth\n );\n }\n\n private isPunctuation(value: FormulaPunctuation): boolean {\n const token = this.peek();\n return token?.type === \"punctuation\" && token.value === value;\n }\n\n private expectPunctuation(value: FormulaPunctuation): void {\n const token = this.consume();\n if (token?.type !== \"punctuation\" || token.value !== value) throw new FormulaFault(\"#VALUE!\");\n }\n\n private withNesting<T>(callback: () => T): T {\n const nextDepth = this.nestingDepth + 1;\n if (nextDepth > this.budget.limits.maxNestingDepth) {\n throw new ArtifactLimitError(\n \"formula nesting depth\",\n nextDepth,\n this.budget.limits.maxNestingDepth,\n );\n }\n this.nestingDepth = nextDepth;\n try {\n return callback();\n } finally {\n this.nestingDepth -= 1;\n }\n }\n}\n\nfunction tokenize(input: string, maxTokens: number): Token[] {\n const tokens: Token[] = [];\n const push = (token: Token): void => {\n const tokenCount = tokens.length + 1;\n if (tokenCount > maxTokens) {\n throw new ArtifactLimitError(\"formula tokens\", tokenCount, maxTokens);\n }\n tokens.push(token);\n };\n let index = 0;\n while (index < input.length) {\n const character = input[index]!;\n if (/\\s/.test(character)) {\n index += 1;\n continue;\n }\n if (character === '\"') {\n let value = \"\";\n let terminated = false;\n index += 1;\n while (index < input.length) {\n if (input[index] === '\"' && input[index + 1] === '\"') {\n value += '\"';\n index += 2;\n } else if (input[index] === '\"') {\n index += 1;\n terminated = true;\n break;\n } else {\n value += input[index++];\n }\n }\n if (!terminated) throw new FormulaFault(\"#VALUE!\");\n push({ type: \"string\", value });\n continue;\n }\n if (character === \"'\") {\n let value = \"\";\n let terminated = false;\n index += 1;\n while (index < input.length) {\n if (input[index] === \"'\" && input[index + 1] === \"'\") {\n value += \"'\";\n index += 2;\n } else if (input[index] === \"'\") {\n index += 1;\n terminated = true;\n break;\n } else {\n value += input[index++];\n }\n }\n if (!terminated) throw new FormulaFault(\"#VALUE!\");\n push({ type: \"word\", value });\n continue;\n }\n const errorMatch = /^#(?:DIV\\/0!|N\\/A|NAME\\?|NUM!|REF!|VALUE!|CYCLE!)/i.exec(\n input.slice(index),\n );\n if (errorMatch) {\n push({\n type: \"error\",\n value: errorMatch[0]!.toUpperCase() as FormulaErrorValue,\n });\n index += errorMatch[0]!.length;\n continue;\n }\n const numberMatch = /^(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[Ee][+-]?\\d+)?/.exec(input.slice(index));\n if (numberMatch) {\n push({ type: \"number\", value: Number(numberMatch[0]) });\n index += numberMatch[0].length;\n continue;\n }\n const cellMatch = /^\\$?[A-Za-z]{1,3}\\$?[1-9]\\d*(?![A-Za-z0-9_.])/.exec(input.slice(index));\n if (cellMatch && input[index + cellMatch[0].length] !== \"!\") {\n push({ type: \"cell\", value: cellMatch[0] });\n index += cellMatch[0].length;\n continue;\n }\n const wordMatch = /^[A-Za-z_][A-Za-z0-9_.]*/.exec(input.slice(index));\n if (wordMatch) {\n push({ type: \"word\", value: wordMatch[0]! });\n index += wordMatch[0]!.length;\n continue;\n }\n const doubleOperator = input.slice(index, index + 2);\n if ([\"<=\", \">=\", \"<>\"].includes(doubleOperator)) {\n push({ type: \"operator\", value: doubleOperator });\n index += 2;\n continue;\n }\n if ([\"+\", \"-\", \"*\", \"/\", \"^\", \"&\", \"=\", \"<\", \">\", \"%\"].includes(character)) {\n push({ type: \"operator\", value: character });\n index += 1;\n continue;\n }\n if ([\"(\", \")\", \",\", \":\", \"!\"].includes(character)) {\n push({ type: \"punctuation\", value: character as FormulaPunctuation });\n index += 1;\n continue;\n }\n throw new FormulaFault(\"#VALUE!\");\n }\n return tokens;\n}\n\nfunction scalar(value: Evaluated): Scalar {\n if (Array.isArray(value)) return value[0]?.[0] ?? null;\n return value;\n}\n\nfunction calculate(\n left: Evaluated,\n right: Evaluated,\n operation: (left: Scalar, right: Scalar) => Scalar,\n): Scalar {\n const leftValue = scalar(left);\n const rightValue = scalar(right);\n if (isFormulaError(leftValue)) return leftValue;\n if (isFormulaError(rightValue)) return rightValue;\n try {\n return operation(leftValue, rightValue);\n } catch (cause) {\n if (cause instanceof FormulaFault) return cause.code;\n throw cause;\n }\n}\n\nfunction calculateUnary(value: Evaluated, operation: (value: Scalar) => Scalar): Scalar {\n const item = scalar(value);\n if (isFormulaError(item)) return item;\n try {\n return operation(item);\n } catch (cause) {\n if (cause instanceof FormulaFault) return cause.code;\n throw cause;\n }\n}\n\nfunction flatten(values: Evaluated[]): Scalar[] {\n return values.flatMap((value) => (Array.isArray(value) ? value.flat() : [value]));\n}\n\nfunction numeric(value: Evaluated): number {\n const item = scalar(value);\n if (isFormulaError(item)) throw new FormulaFault(item);\n if (item instanceof Date) return item.getTime() / 86_400_000 + 25_569;\n if (item === null || item === false) return 0;\n if (item === true) return 1;\n const number = typeof item === \"number\" ? item : Number(item);\n if (!Number.isFinite(number)) throw new FormulaFault(\"#VALUE!\");\n return number;\n}\n\nfunction numbers(values: Evaluated[]): number[] {\n const output: number[] = [];\n for (const value of flatten(values)) {\n if (isFormulaError(value)) throw new FormulaFault(value);\n if (value === null || typeof value === \"boolean\") continue;\n const number = value instanceof Date ? numeric(value) : Number(value);\n if (Number.isFinite(number)) output.push(number);\n }\n return output;\n}\n\nfunction text(value: Scalar, budget: FormulaEvaluationBudget): string {\n if (isFormulaError(value)) throw new FormulaFault(value);\n if (value === null) return \"\";\n const result = value instanceof Date ? value.toISOString() : String(value);\n return boundedText(result, budget.limits.maxResultStringChars);\n}\n\nfunction truthy(value: Evaluated): boolean {\n const item = scalar(value);\n if (isFormulaError(item)) throw new FormulaFault(item);\n return Boolean(item);\n}\n\nfunction compare(a: Scalar, b: Scalar, operator: string): boolean {\n if (isFormulaError(a)) throw new FormulaFault(a);\n if (isFormulaError(b)) throw new FormulaFault(b);\n const left = a instanceof Date ? a.getTime() : typeof a === \"string\" ? a.toLowerCase() : a;\n const right = b instanceof Date ? b.getTime() : typeof b === \"string\" ? b.toLowerCase() : b;\n switch (operator) {\n case \"=\":\n return left === right;\n case \"<>\":\n return left !== right;\n case \"<\":\n return (left as number) < (right as number);\n case \">\":\n return (left as number) > (right as number);\n case \"<=\":\n return (left as number) <= (right as number);\n case \">=\":\n return (left as number) >= (right as number);\n default:\n return false;\n }\n}\n\nfunction callFunction(name: string, args: Evaluated[], budget: FormulaEvaluationBudget): Evaluated {\n const numericArgs = () => numbers(args);\n switch (name) {\n case \"SUM\":\n return numericArgs().reduce((sum, value) => sum + value, 0);\n case \"AVERAGE\": {\n const values = numericArgs();\n if (values.length === 0) throw new FormulaFault(\"#DIV/0!\");\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n }\n case \"MIN\": {\n const values = numericArgs();\n if (values.length === 0) return 0;\n let minimum = values[0]!;\n for (let index = 1; index < values.length; index += 1)\n minimum = Math.min(minimum, values[index]!);\n return minimum;\n }\n case \"MAX\": {\n const values = numericArgs();\n if (values.length === 0) return 0;\n let maximum = values[0]!;\n for (let index = 1; index < values.length; index += 1)\n maximum = Math.max(maximum, values[index]!);\n return maximum;\n }\n case \"COUNT\":\n return numericArgs().length;\n case \"COUNTA\":\n return flatten(args).filter((value) => value !== null && value !== \"\").length;\n case \"IF\":\n return truthy(args[0] ?? false) ? (args[1] ?? true) : (args[2] ?? false);\n case \"IFERROR\": {\n const value = scalar(args[0] ?? null);\n return isFormulaError(value) ? (args[1] ?? null) : value;\n }\n case \"AND\": {\n const values = args.map(truthy);\n return values.every(Boolean);\n }\n case \"OR\": {\n const values = args.map(truthy);\n return values.some(Boolean);\n }\n case \"NOT\":\n return !truthy(args[0] ?? false);\n case \"ABS\":\n return Math.abs(numeric(args[0] ?? 0));\n case \"ROUND\": {\n const digits = numeric(args[1] ?? 0);\n const factor = deterministicIntegerPower(10, digits);\n const value = numeric(args[0] ?? 0) * factor;\n return (Math.sign(value) * Math.round(Math.abs(value))) / factor;\n }\n case \"ROUNDUP\": {\n const digits = numeric(args[1] ?? 0);\n const factor = deterministicIntegerPower(10, digits);\n const value = numeric(args[0] ?? 0) * factor;\n return (Math.sign(value) * Math.ceil(Math.abs(value))) / factor;\n }\n case \"ROUNDDOWN\": {\n const digits = numeric(args[1] ?? 0);\n const factor = deterministicIntegerPower(10, digits);\n const value = numeric(args[0] ?? 0) * factor;\n return (Math.sign(value) * Math.floor(Math.abs(value))) / factor;\n }\n case \"POWER\":\n return finiteNumber(deterministicIntegerPower(numeric(args[0] ?? 0), numeric(args[1] ?? 0)));\n case \"SQRT\": {\n const value = numeric(args[0] ?? 0);\n if (value < 0) throw new FormulaFault(\"#NUM!\");\n return Math.sqrt(value);\n }\n case \"LEN\":\n return text(scalar(args[0] ?? null), budget).length;\n case \"LOWER\":\n return text(scalar(args[0] ?? null), budget).toLowerCase();\n case \"UPPER\":\n return text(scalar(args[0] ?? null), budget).toUpperCase();\n case \"TRIM\":\n return text(scalar(args[0] ?? null), budget)\n .trim()\n .replace(/\\s+/g, \" \");\n case \"LEFT\":\n return text(scalar(args[0] ?? null), budget).slice(0, numeric(args[1] ?? 1));\n case \"RIGHT\":\n return text(scalar(args[0] ?? null), budget).slice(-numeric(args[1] ?? 1));\n case \"MID\":\n return text(scalar(args[0] ?? null), budget).slice(\n numeric(args[1] ?? 1) - 1,\n numeric(args[1] ?? 1) - 1 + numeric(args[2] ?? 0),\n );\n case \"CONCAT\":\n return concatenateText(\n flatten(args).map((value) => text(value, budget)),\n budget,\n );\n case \"DATE\":\n return new Date(\n Date.UTC(numeric(args[0] ?? 1900), numeric(args[1] ?? 1) - 1, numeric(args[2] ?? 1)),\n );\n case \"YEAR\":\n return dateValue(args[0]).getUTCFullYear();\n case \"MONTH\":\n return dateValue(args[0]).getUTCMonth() + 1;\n case \"DAY\":\n return dateValue(args[0]).getUTCDate();\n case \"INDEX\": {\n const matrix = Array.isArray(args[0]) ? args[0] : [[scalar(args[0] ?? null)]];\n const row = numeric(args[1] ?? 1) - 1;\n const col = numeric(args[2] ?? 1) - 1;\n return matrix[row]?.[col] ?? \"#REF!\";\n }\n case \"MATCH\": {\n const wanted = scalar(args[0] ?? null);\n const haystack = flatten([args[1] ?? []]);\n const index = haystack.findIndex((item) => compare(item, wanted, \"=\"));\n return index < 0 ? \"#N/A\" : index + 1;\n }\n case \"XLOOKUP\": {\n const wanted = scalar(args[0] ?? null);\n const keys = flatten([args[1] ?? []]);\n const values = flatten([args[2] ?? []]);\n const index = keys.findIndex((item) => compare(item, wanted, \"=\"));\n return index < 0 ? scalar(args[3] ?? \"#N/A\") : (values[index] ?? \"#N/A\");\n }\n default:\n throw new FormulaFault(\"#NAME?\");\n }\n}\n\nfunction dateValue(value: Evaluated | undefined): Date {\n const item = scalar(value ?? null);\n if (isFormulaError(item)) throw new FormulaFault(item);\n if (item instanceof Date) return item;\n if (typeof item === \"number\") return new Date((item - 25_569) * 86_400_000);\n const date = new Date(String(item));\n if (Number.isNaN(date.getTime())) throw new FormulaFault(\"#VALUE!\");\n return date;\n}\n\nfunction finiteNumber(value: number): number {\n if (!Number.isFinite(value)) throw new FormulaFault(\"#NUM!\");\n return value === 0 ? 0 : value;\n}\n\n/** Mirrors the kernel's explicitly ordered path for exact integer exponents. */\nfunction deterministicIntegerPower(base: number, exponent: number): number {\n if (\n Number.isFinite(exponent) &&\n Number.isInteger(exponent) &&\n Math.abs(exponent) <= Number.MAX_SAFE_INTEGER\n ) {\n const reciprocal = exponent < 0;\n let remaining = Math.abs(exponent);\n // Match the kernel at underflow boundaries: forming the positive power\n // first can overflow before a representable reciprocal is taken.\n let factor = reciprocal ? 1 / base : base;\n let result = 1;\n while (remaining !== 0) {\n if (remaining % 2 === 1) result *= factor;\n remaining = Math.floor(remaining / 2);\n if (remaining !== 0) factor *= factor;\n }\n return result;\n }\n return Math.pow(base, exponent);\n}\n\nfunction boundedText(value: string, maximum: number): string {\n if (value.length > maximum) {\n throw new ArtifactLimitError(\"formula result characters\", value.length, maximum);\n }\n return value;\n}\n\nfunction boundedScalar(value: Scalar, maximum: number): Scalar {\n if (typeof value === \"string\") return boundedText(value, maximum);\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new FormulaFault(\"#NUM!\");\n return value === 0 ? 0 : value;\n }\n return value;\n}\n\nfunction boundEvaluated(value: Evaluated, maximum: number): Evaluated {\n if (!Array.isArray(value)) return boundedScalar(value, maximum);\n for (const row of value) {\n for (const cell of row) boundedScalar(cell, maximum);\n }\n return value;\n}\n\nfunction concatenateText(parts: readonly string[], budget: FormulaEvaluationBudget): string {\n let characters = 0;\n for (const part of parts) {\n characters = checkedFuelTotal(characters, part.length);\n if (characters > budget.limits.maxResultStringChars) {\n throw new ArtifactLimitError(\n \"formula result characters\",\n characters,\n budget.limits.maxResultStringChars,\n );\n }\n }\n return parts.join(\"\");\n}\n\nfunction checkedFuelTotal(current: number, count: number): number {\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new ArtifactLimitError(\"formula fuel increment\", count, Number.MAX_SAFE_INTEGER);\n }\n const next = current + count;\n if (!Number.isSafeInteger(next)) {\n throw new ArtifactLimitError(\"formula fuel\", Number.MAX_SAFE_INTEGER, current);\n }\n return next;\n}\n\nfunction assertFormulaByteLimit(formula: string, maximum: number): void {\n // UTF-16 length is a lower bound on UTF-8 bytes. This O(1) gate rejects giant ASCII inputs\n // without scanning them; the bounded path below computes the exact byte count without allocation.\n if (formula.length > maximum) {\n throw new ArtifactLimitError(\"formula bytes\", formula.length, maximum);\n }\n let bytes = 0;\n for (let index = 0; index < formula.length; index += 1) {\n const codePoint = formula.codePointAt(index)!;\n if (codePoint <= 0x7f) bytes += 1;\n else if (codePoint <= 0x7ff) bytes += 2;\n else if (codePoint <= 0xffff) bytes += 3;\n else {\n bytes += 4;\n index += 1;\n }\n if (bytes > maximum) {\n throw new ArtifactLimitError(\"formula bytes\", bytes, maximum);\n }\n }\n}\n\nfunction isFormulaError(value: Scalar): value is FormulaErrorValue {\n return typeof value === \"string\" && FORMULA_ERRORS.has(value as FormulaErrorValue);\n}\n\nconst FORMULA_ERRORS = new Set<FormulaErrorValue>([\n \"#DIV/0!\",\n \"#N/A\",\n \"#NAME?\",\n \"#NUM!\",\n \"#REF!\",\n \"#VALUE!\",\n \"#CYCLE!\",\n]);\n\nfunction forEachFormulaCode(formula: string, callback: (code: string) => void): void {\n mapFormulaCode(formula, (code) => {\n callback(code);\n return code;\n });\n}\n\nfunction mapFormulaCode(formula: string, transform: (code: string) => string): string {\n let result = \"\";\n let codeStart = 0;\n let index = 0;\n while (index < formula.length) {\n // A quoted worksheet qualifier is formula code, not a string literal. Skip over the complete\n // identifier while looking for double-quoted literals so a legal `\"` in its name cannot split\n // the qualifier and hide or corrupt the following cell reference.\n if (formula[index] === \"'\") {\n index += 1;\n while (index < formula.length) {\n if (formula[index] !== \"'\") {\n index += 1;\n continue;\n }\n if (formula[index + 1] === \"'\") {\n index += 2;\n continue;\n }\n index += 1;\n break;\n }\n continue;\n }\n if (formula[index] !== '\"') {\n index += 1;\n continue;\n }\n\n result += transform(formula.slice(codeStart, index));\n const stringStart = index;\n index += 1;\n while (index < formula.length) {\n if (formula[index] !== '\"') {\n index += 1;\n continue;\n }\n if (formula[index + 1] === '\"') {\n index += 2;\n continue;\n }\n index += 1;\n break;\n }\n result += formula.slice(stringStart, index);\n codeStart = index;\n }\n result += transform(formula.slice(codeStart));\n return result;\n}\n","import {\n EXCEL_MAX_COLUMNS,\n EXCEL_MAX_ROWS,\n assertRange,\n cellKey,\n formatCellAddress,\n formatRangeAddress,\n parseRangeAddress,\n type CellAddress,\n type RangeAddress,\n} from \"./spreadsheet-address\";\nimport { ArtifactLimitError, UnsupportedArtifactFeatureError } from \"./errors\";\nimport { boundInspectionRecords, defineHelpEntries, filterHelpEntries } from \"./inspection\";\nimport { normalizeSpreadsheetImageConfig } from \"./spreadsheet-image\";\nimport {\n FormulaEvaluationBudget,\n evaluateFormula,\n formulaFromR1C1,\n formulaToR1C1,\n referencesInFormula,\n translateFormula,\n validateFormulaLimits,\n type FormulaEvaluationLimits,\n} from \"./spreadsheet-formula\";\nimport type {\n CellData,\n CellFormat,\n CellValue,\n ConditionalFormatConfig,\n DataValidationConfig,\n FormulaResult,\n HelpOptions,\n InspectOptions,\n InspectResult,\n RenderSpreadsheetOptions,\n SpreadsheetChartConfig,\n SpreadsheetChartSeriesConfig,\n SpreadsheetChartType,\n SpreadsheetImageConfig,\n SpreadsheetSparklineAxisOptions,\n SpreadsheetSparklineMarkersOptions,\n SpreadsheetSparklineOptions,\n SpreadsheetSparklineType,\n} from \"./spreadsheet-types\";\nimport type { FileBlob } from \"./file-blob\";\nimport { boundedUtf8ByteLength } from \"./raster-image\";\n\nexport { InvalidSpreadsheetImageError } from \"./spreadsheet-image\";\n\nconst DEFAULT_CELL: Readonly<CellData> = Object.freeze({\n value: null,\n formula: null,\n format: Object.freeze({}),\n});\nconst normalizedCellFormats = new WeakSet<object>();\nnormalizedCellFormats.add(DEFAULT_CELL.format);\nconst STORED_CELL_ENTRIES = Symbol(\"storedCellEntries\");\nconst CONNECT_CHART_POINT_COUNTER = Symbol(\"connectChartPointCounter\");\nconst RESERVE_WORKBOOK_RESOURCE = Symbol(\"reserveWorkbookResource\");\nconst RELEASE_WORKBOOK_RESOURCE = Symbol(\"releaseWorkbookResource\");\nconst DEFAULT_COLUMN_WIDTH = 96;\nconst DEFAULT_ROW_HEIGHT = 24;\n\ntype Matrix<T> = T[][];\ntype WorkbookChangeListener = (change: WorkbookChange) => void;\n\nexport type WorkbookOptions = {\n formulaLimits?: Partial<FormulaEvaluationLimits>;\n recalculationLimits?: Partial<SpreadsheetRecalculationLimits>;\n};\n\nexport type SpreadsheetRecalculationLimits = {\n maxCellReads: number;\n maxOperations: number;\n};\n\nexport type RangeWritePayload =\n | { values: Matrix<CellValue>; formulas?: never; formulasR1C1?: never }\n | { values?: never; formulas: Matrix<string | null>; formulasR1C1?: never }\n | { values?: never; formulas?: never; formulasR1C1: Matrix<string | null> };\n\nexport type SparklineConfig = SpreadsheetSparklineOptions & {\n type: SpreadsheetSparklineType;\n targetRange: Range | string;\n sourceData: Range | string;\n dateAxisRange?: Range | string;\n};\n\nexport type RangeSparklineConfig = SpreadsheetSparklineOptions & {\n dateAxisRange?: Range | string;\n};\n\nexport type WorkbookChange = {\n revision: number;\n sheetIds: readonly string[];\n reason: \"content\" | \"format\" | \"structure\" | \"drawing\" | \"comment\" | \"dimension\";\n};\n\nexport type SerializedWorkbook = {\n version: 1;\n worksheets: SerializedWorksheet[];\n comments: SerializedCommentThread[];\n};\n\n/** Hard, non-relaxable resource limits for untrusted workbook snapshots. */\nexport const SPREADSHEET_SNAPSHOT_LIMITS = Object.freeze({\n sheets: 1_024,\n cellsPerSheet: 1_000_000,\n cellsTotal: 1_000_000,\n mergesPerSheet: 100_000,\n mergesTotal: 100_000,\n dimensionOverridesPerSheet: 1_000_000,\n dimensionOverridesTotal: 1_000_000,\n tablesPerSheet: 1_024,\n tablesTotal: 10_000,\n chartsPerSheet: 1_024,\n chartsTotal: 10_000,\n chartSeriesTotal: 100_000,\n chartPointsTotal: 1_000_000,\n sparklineGroupsPerSheet: 1_024,\n sparklineGroupsTotal: 10_000,\n sparklineCellsPerSheet: 100_000,\n sparklineCellsTotal: 100_000,\n sparklinePointsPerSheet: 1_000_000,\n sparklinePointsTotal: 1_000_000,\n dataValidationsPerSheet: 100_000,\n dataValidationsTotal: 100_000,\n conditionalFormatsPerSheet: 100_000,\n conditionalFormatsTotal: 100_000,\n configNodesTotal: 1_000_000,\n imagesPerSheet: 10_000,\n imagesTotal: 10_000,\n imageBytesEach: 32 * 1024 * 1024,\n imageDataUrlBytesEach: 48 * 1024 * 1024,\n imageBytesTotal: 128 * 1024 * 1024,\n imageDataUrlBytesTotal: 192 * 1024 * 1024,\n commentThreads: 100_000,\n commentsPerThread: 1_000,\n commentsTotal: 500_000,\n dimensionValueMinimum: 1,\n dimensionValue: 1_000_000,\n imageOffsetPx: 1_000_000,\n imageExtentPx: 1_000_000,\n fontSize: 4_096,\n borderWeight: 4_096,\n stringBytesEach: 1024 * 1024,\n stringBytesTotal: 128 * 1024 * 1024,\n});\n\ntype WorkbookResource =\n | \"cells\"\n | \"merges\"\n | \"dimensionOverrides\"\n | \"tables\"\n | \"charts\"\n | \"chartSeries\"\n | \"chartPoints\"\n | \"sparklineGroups\"\n | \"sparklineCells\"\n | \"sparklinePoints\"\n | \"dataValidations\"\n | \"conditionalFormats\"\n | \"images\"\n | \"imageBytes\"\n | \"imageDataUrlBytes\"\n | \"commentThreads\"\n | \"comments\";\n\nconst WORKBOOK_RESOURCE_LIMITS: Readonly<Record<WorkbookResource, number>> = {\n cells: SPREADSHEET_SNAPSHOT_LIMITS.cellsTotal,\n merges: SPREADSHEET_SNAPSHOT_LIMITS.mergesTotal,\n dimensionOverrides: SPREADSHEET_SNAPSHOT_LIMITS.dimensionOverridesTotal,\n tables: SPREADSHEET_SNAPSHOT_LIMITS.tablesTotal,\n charts: SPREADSHEET_SNAPSHOT_LIMITS.chartsTotal,\n chartSeries: SPREADSHEET_SNAPSHOT_LIMITS.chartSeriesTotal,\n chartPoints: SPREADSHEET_SNAPSHOT_LIMITS.chartPointsTotal,\n sparklineGroups: SPREADSHEET_SNAPSHOT_LIMITS.sparklineGroupsTotal,\n sparklineCells: SPREADSHEET_SNAPSHOT_LIMITS.sparklineCellsTotal,\n sparklinePoints: SPREADSHEET_SNAPSHOT_LIMITS.sparklinePointsTotal,\n dataValidations: SPREADSHEET_SNAPSHOT_LIMITS.dataValidationsTotal,\n conditionalFormats: SPREADSHEET_SNAPSHOT_LIMITS.conditionalFormatsTotal,\n images: SPREADSHEET_SNAPSHOT_LIMITS.imagesTotal,\n imageBytes: SPREADSHEET_SNAPSHOT_LIMITS.imageBytesTotal,\n imageDataUrlBytes: SPREADSHEET_SNAPSHOT_LIMITS.imageDataUrlBytesTotal,\n commentThreads: SPREADSHEET_SNAPSHOT_LIMITS.commentThreads,\n comments: SPREADSHEET_SNAPSHOT_LIMITS.commentsTotal,\n};\n\n/** Aggregate fuel for one full Workbook.recalculate() transaction. */\nexport const SPREADSHEET_RECALCULATION_LIMITS = Object.freeze({\n maxCellReads: 5_000_000,\n maxOperations: 10_000_000,\n}) satisfies Readonly<SpreadsheetRecalculationLimits>;\n\ntype SerializedWorksheet = {\n id: string;\n name: string;\n showGridLines: boolean;\n freezePanes: { rows: number; columns: number };\n cells: Array<{\n row: number;\n col: number;\n value: SerializedCellValue;\n formula: string | null;\n format: CellFormat;\n }>;\n merges: RangeAddress[];\n columnWidths: Array<[number, number]>;\n rowHeights: Array<[number, number]>;\n tables: SerializedTable[];\n charts: SerializedChart[];\n sparklines: SerializedSparklineGroup[];\n dataValidations: SerializedDataValidation[];\n conditionalFormattings: SerializedConditionalFormatting[];\n images: SpreadsheetImageConfig[];\n};\n\ntype SerializedCellValue = Exclude<CellValue, Date> | { type: \"date\"; value: string };\n\ntype SerializedTable = {\n id: string;\n name: string;\n range: RangeAddress;\n hasHeaders: boolean;\n style: string;\n showHeaders: boolean;\n showTotals: boolean;\n showBandedColumns: boolean;\n showFilterButton: boolean;\n};\n\ntype SerializedChart = {\n id: string;\n name: string;\n type: SpreadsheetChartType;\n title: string;\n hasLegend: boolean;\n sourceRange: RangeAddress | null;\n series: SpreadsheetChartSeriesConfig[];\n position: { from: RangeAddress; to: RangeAddress } | null;\n};\n\ntype SerializedRangeReference = {\n sheetId: string;\n address: RangeAddress;\n};\n\ntype SerializedSparklineGroup = {\n id: string;\n type: SpreadsheetSparklineType;\n targetRange: RangeAddress;\n sourceData: SerializedRangeReference;\n dateAxisRange: SerializedRangeReference | null;\n lineWeight: number;\n displayHidden: boolean;\n displayEmptyCellsAs: 0 | 1 | 2;\n seriesColor: string | null;\n negativeColor: string | null;\n axisColor: string | null;\n markersColor: string | null;\n firstMarkerColor: string | null;\n lastMarkerColor: string | null;\n highMarkerColor: string | null;\n lowMarkerColor: string | null;\n markers: Required<SpreadsheetSparklineMarkersOptions>;\n axis: {\n showAxis: boolean;\n manualMin: number | null;\n manualMax: number | null;\n rightToLeft: boolean;\n };\n};\n\ntype SerializedDataValidation = {\n range: RangeAddress;\n config: DataValidationConfig;\n};\n\ntype SerializedConditionalFormatting = {\n range: RangeAddress;\n ruleType: string;\n config: ConditionalFormatConfig;\n};\n\ntype SerializedCommentThread = {\n id: string;\n sheetId: string;\n cell: CellAddress;\n resolved: boolean;\n comments: Array<{ author: string; text: string; createdAt: string }>;\n};\n\ntype SnapshotValidationState = {\n ids: Set<string>;\n worksheetIds: Set<string>;\n worksheetNames: Set<string>;\n stringBytes: number;\n imageBytes: number;\n imageDataUrlBytes: number;\n cells: number;\n merges: number;\n dimensionOverrides: number;\n tables: number;\n charts: number;\n chartSeries: number;\n chartPoints: number;\n sparklineGroups: number;\n sparklineCells: number;\n sparklinePoints: number;\n dataValidations: number;\n conditionalFormats: number;\n configNodes: number;\n sparklineSheetReferences: Array<{ id: string; path: string }>;\n images: number;\n comments: number;\n normalizedImages: SpreadsheetImageConfig[];\n};\n\n/** Validate an untrusted snapshot completely without constructing or mutating a Workbook. */\nexport function validateSerializedWorkbook(input: unknown): asserts input is SerializedWorkbook {\n validateSerializedWorkbookState(input);\n}\n\nfunction validateSerializedWorkbookState(input: unknown): SnapshotValidationState {\n const state: SnapshotValidationState = {\n ids: new Set(),\n worksheetIds: new Set(),\n worksheetNames: new Set(),\n stringBytes: 0,\n imageBytes: 0,\n imageDataUrlBytes: 0,\n cells: 0,\n merges: 0,\n dimensionOverrides: 0,\n tables: 0,\n charts: 0,\n chartSeries: 0,\n chartPoints: 0,\n sparklineGroups: 0,\n sparklineCells: 0,\n sparklinePoints: 0,\n dataValidations: 0,\n conditionalFormats: 0,\n configNodes: 0,\n sparklineSheetReferences: [],\n images: 0,\n comments: 0,\n normalizedImages: [],\n };\n const root = snapshotRecord(input, \"workbook\", [\"version\", \"worksheets\", \"comments\"]);\n if (root.version !== 1) {\n throw new Error(\"Unsupported workbook model version; expected 1\");\n }\n const worksheets = snapshotArray(\n root.worksheets,\n \"workbook.worksheets\",\n SPREADSHEET_SNAPSHOT_LIMITS.sheets,\n );\n const comments = snapshotArray(\n root.comments,\n \"workbook.comments\",\n SPREADSHEET_SNAPSHOT_LIMITS.commentThreads,\n );\n\n for (let index = 0; index < worksheets.length; index += 1) {\n validateSerializedWorksheet(worksheets[index], `workbook.worksheets[${index}]`, state);\n }\n for (const reference of state.sparklineSheetReferences) {\n if (!state.worksheetIds.has(reference.id)) {\n throw new Error(`${reference.path} references an unknown worksheet id`);\n }\n }\n for (let index = 0; index < comments.length; index += 1) {\n validateSerializedComment(comments[index], `workbook.comments[${index}]`, state);\n }\n return state;\n}\n\nfunction validateSerializedWorksheet(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const sheet = snapshotRecord(\n value,\n path,\n [\n \"id\",\n \"name\",\n \"showGridLines\",\n \"freezePanes\",\n \"cells\",\n \"merges\",\n \"columnWidths\",\n \"rowHeights\",\n \"tables\",\n \"charts\",\n \"sparklines\",\n \"images\",\n ],\n [\"dataValidations\", \"conditionalFormattings\"],\n );\n const id = snapshotId(sheet.id, `${path}.id`, \"ws\", state);\n state.worksheetIds.add(id);\n const name = snapshotString(sheet.name, `${path}.name`, state, true);\n if (name.length > 31 || name.trim() !== name || /[\\\\/?*[\\]:]/.test(name)) {\n throw new Error(`${path}.name must be a normalized worksheet name`);\n }\n const normalizedName = name.toLowerCase();\n if (state.worksheetNames.has(normalizedName)) throw new Error(`${path}.name is duplicated`);\n state.worksheetNames.add(normalizedName);\n snapshotBoolean(sheet.showGridLines, `${path}.showGridLines`);\n\n const freeze = snapshotRecord(sheet.freezePanes, `${path}.freezePanes`, [\"rows\", \"columns\"]);\n snapshotInteger(freeze.rows, `${path}.freezePanes.rows`, 0, EXCEL_MAX_ROWS);\n snapshotInteger(freeze.columns, `${path}.freezePanes.columns`, 0, EXCEL_MAX_COLUMNS);\n\n const cells = snapshotArray(\n sheet.cells,\n `${path}.cells`,\n SPREADSHEET_SNAPSHOT_LIMITS.cellsPerSheet,\n );\n state.cells = snapshotAggregate(\n \"spreadsheet snapshot cells\",\n state.cells,\n cells.length,\n SPREADSHEET_SNAPSHOT_LIMITS.cellsTotal,\n );\n const cellCoordinates = new Set<number>();\n for (let index = 0; index < cells.length; index += 1) {\n const cellPath = `${path}.cells[${index}]`;\n const cell = snapshotRecord(cells[index], cellPath, [\n \"row\",\n \"col\",\n \"value\",\n \"formula\",\n \"format\",\n ]);\n const row = snapshotInteger(cell.row, `${cellPath}.row`, 0, EXCEL_MAX_ROWS - 1);\n const col = snapshotInteger(cell.col, `${cellPath}.col`, 0, EXCEL_MAX_COLUMNS - 1);\n const key = cellKey(row, col);\n if (cellCoordinates.has(key)) throw new Error(`Duplicate cell coordinate at ${cellPath}`);\n cellCoordinates.add(key);\n validateSnapshotCellValue(cell.value, `${cellPath}.value`, state);\n if (cell.formula !== null) {\n const formula = snapshotString(cell.formula, `${cellPath}.formula`, state);\n if (!formula.startsWith(\"=\") || formula.trim() !== formula) {\n throw new Error(`${cellPath}.formula must be a canonical =-prefixed formula`);\n }\n validateFormulaLimits(formula);\n }\n validateSnapshotCellFormat(cell.format, `${cellPath}.format`, state);\n }\n\n const merges = snapshotArray(\n sheet.merges,\n `${path}.merges`,\n SPREADSHEET_SNAPSHOT_LIMITS.mergesPerSheet,\n );\n state.merges = snapshotAggregate(\n \"spreadsheet snapshot merges\",\n state.merges,\n merges.length,\n SPREADSHEET_SNAPSHOT_LIMITS.mergesTotal,\n );\n const mergeKeys = new Set<string>();\n const mergeRanges: Array<{ range: RangeAddress; path: string }> = [];\n for (let index = 0; index < merges.length; index += 1) {\n const mergePath = `${path}.merges[${index}]`;\n const range = validateSnapshotRange(merges[index], mergePath);\n const key = snapshotRangeKey(range);\n if (mergeKeys.has(key)) throw new Error(`Duplicate merge range at ${path}.merges[${index}]`);\n mergeKeys.add(key);\n mergeRanges.push({ range, path: mergePath });\n }\n assertSnapshotRangesDoNotOverlap(mergeRanges);\n\n validateSnapshotDimensions(sheet.columnWidths, `${path}.columnWidths`, true, state);\n validateSnapshotDimensions(sheet.rowHeights, `${path}.rowHeights`, false, state);\n validateSnapshotTables(sheet.tables, `${path}.tables`, state);\n validateSnapshotCharts(sheet.charts, `${path}.charts`, state);\n validateSnapshotSparklines(sheet.sparklines, `${path}.sparklines`, state);\n validateSnapshotDataValidations(sheet.dataValidations, `${path}.dataValidations`, state);\n validateSnapshotConditionalFormattings(\n sheet.conditionalFormattings,\n `${path}.conditionalFormattings`,\n state,\n );\n validateSnapshotImages(sheet.images, `${path}.images`, state);\n}\n\nfunction validateSnapshotDimensions(\n value: unknown,\n path: string,\n columns: boolean,\n state: SnapshotValidationState,\n): void {\n const entries = snapshotArray(\n value,\n path,\n SPREADSHEET_SNAPSHOT_LIMITS.dimensionOverridesPerSheet,\n );\n state.dimensionOverrides = snapshotAggregate(\n \"spreadsheet snapshot dimension overrides\",\n state.dimensionOverrides,\n entries.length,\n SPREADSHEET_SNAPSHOT_LIMITS.dimensionOverridesTotal,\n );\n const indexes = new Set<number>();\n for (let index = 0; index < entries.length; index += 1) {\n const entry = snapshotArray(entries[index], `${path}[${index}]`, 2, 2);\n const coordinate = snapshotInteger(\n entry[0],\n `${path}[${index}][0]`,\n 0,\n (columns ? EXCEL_MAX_COLUMNS : EXCEL_MAX_ROWS) - 1,\n );\n if (indexes.has(coordinate)) throw new Error(`Duplicate dimension index at ${path}[${index}]`);\n indexes.add(coordinate);\n snapshotFiniteNumber(entry[1], `${path}[${index}][1]`, {\n minimum: SPREADSHEET_SNAPSHOT_LIMITS.dimensionValueMinimum,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.dimensionValue,\n });\n }\n}\n\nfunction validateSnapshotTables(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const tables = snapshotArray(value, path, SPREADSHEET_SNAPSHOT_LIMITS.tablesPerSheet);\n state.tables = snapshotAggregate(\n \"spreadsheet snapshot tables\",\n state.tables,\n tables.length,\n SPREADSHEET_SNAPSHOT_LIMITS.tablesTotal,\n );\n const names = new Set<string>();\n const ranges: RangeAddress[] = [];\n for (let index = 0; index < tables.length; index += 1) {\n const tablePath = `${path}[${index}]`;\n const table = snapshotRecord(tables[index], tablePath, [\n \"id\",\n \"name\",\n \"range\",\n \"hasHeaders\",\n \"style\",\n \"showHeaders\",\n \"showTotals\",\n \"showBandedColumns\",\n \"showFilterButton\",\n ]);\n snapshotId(table.id, `${tablePath}.id`, \"tb\", state);\n const name = snapshotString(table.name, `${tablePath}.name`, state, true);\n const normalizedName = name.toLowerCase();\n if (names.has(normalizedName)) throw new Error(`${tablePath}.name is duplicated`);\n names.add(normalizedName);\n const range = validateSnapshotRange(table.range, `${tablePath}.range`);\n if (ranges.some((existing) => rangesOverlap(existing, range))) {\n throw new Error(`Overlapping table range at ${tablePath}.range`);\n }\n ranges.push(range);\n snapshotBoolean(table.hasHeaders, `${tablePath}.hasHeaders`);\n snapshotString(table.style, `${tablePath}.style`, state);\n snapshotBoolean(table.showHeaders, `${tablePath}.showHeaders`);\n snapshotBoolean(table.showTotals, `${tablePath}.showTotals`);\n snapshotBoolean(table.showBandedColumns, `${tablePath}.showBandedColumns`);\n snapshotBoolean(table.showFilterButton, `${tablePath}.showFilterButton`);\n }\n}\n\nconst SNAPSHOT_CHART_TYPES = new Set<SpreadsheetChartType>([\n \"bar\",\n \"line\",\n \"area\",\n \"pie\",\n \"doughnut\",\n \"scatter\",\n \"bubble\",\n \"radar\",\n \"stock\",\n \"treemap\",\n \"sunburst\",\n \"histogram\",\n \"boxWhisker\",\n \"waterfall\",\n \"funnel\",\n \"map\",\n]);\n\nfunction validateSnapshotCharts(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const charts = snapshotArray(value, path, SPREADSHEET_SNAPSHOT_LIMITS.chartsPerSheet);\n state.charts = snapshotAggregate(\n \"spreadsheet snapshot charts\",\n state.charts,\n charts.length,\n SPREADSHEET_SNAPSHOT_LIMITS.chartsTotal,\n );\n const names = new Set<string>();\n for (let index = 0; index < charts.length; index += 1) {\n const chartPath = `${path}[${index}]`;\n const chart = snapshotRecord(charts[index], chartPath, [\n \"id\",\n \"name\",\n \"type\",\n \"title\",\n \"hasLegend\",\n \"sourceRange\",\n \"series\",\n \"position\",\n ]);\n snapshotId(chart.id, `${chartPath}.id`, \"ch\", state);\n const name = snapshotString(chart.name, `${chartPath}.name`, state, true);\n const normalizedName = name.toLowerCase();\n if (names.has(normalizedName)) throw new Error(`${chartPath}.name is duplicated`);\n names.add(normalizedName);\n const type = snapshotString(chart.type, `${chartPath}.type`, state);\n if (!SNAPSHOT_CHART_TYPES.has(type as SpreadsheetChartType)) {\n throw new Error(`${chartPath}.type is unsupported`);\n }\n snapshotString(chart.title, `${chartPath}.title`, state);\n snapshotBoolean(chart.hasLegend, `${chartPath}.hasLegend`);\n if (chart.sourceRange !== null) {\n validateSnapshotRange(chart.sourceRange, `${chartPath}.sourceRange`);\n }\n validateSnapshotChartSeries(chart.series, `${chartPath}.series`, state);\n if (chart.position !== null) {\n const position = snapshotRecord(chart.position, `${chartPath}.position`, [\"from\", \"to\"]);\n validateSnapshotRange(position.from, `${chartPath}.position.from`);\n validateSnapshotRange(position.to, `${chartPath}.position.to`);\n }\n }\n}\n\nfunction validateSnapshotChartSeries(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const remaining = SPREADSHEET_SNAPSHOT_LIMITS.chartSeriesTotal - state.chartSeries;\n const series = snapshotArray(value, path, Math.max(0, remaining));\n state.chartSeries = snapshotAggregate(\n \"spreadsheet snapshot chart series\",\n state.chartSeries,\n series.length,\n SPREADSHEET_SNAPSHOT_LIMITS.chartSeriesTotal,\n );\n for (let index = 0; index < series.length; index += 1) {\n const seriesPath = `${path}[${index}]`;\n const item = snapshotRecord(\n series[index],\n seriesPath,\n [\"name\"],\n [\"formula\", \"categoryFormula\", \"values\", \"categories\", \"fill\"],\n );\n snapshotString(item.name, `${seriesPath}.name`, state);\n for (const key of [\"formula\", \"categoryFormula\"] as const) {\n if (item[key] !== undefined) {\n const formula = snapshotString(item[key], `${seriesPath}.${key}`, state);\n validateFormulaLimits(formula);\n }\n }\n if (item.fill !== undefined) snapshotString(item.fill, `${seriesPath}.fill`, state);\n\n const values =\n item.values === undefined\n ? null\n : snapshotChartPointArray(item.values, `${seriesPath}.values`, state, false);\n const categories =\n item.categories === undefined\n ? null\n : snapshotChartPointArray(item.categories, `${seriesPath}.categories`, state, true);\n if (values && categories && values.length !== categories.length) {\n throw new Error(`${seriesPath} values and categories must have equal length`);\n }\n }\n}\n\nfunction snapshotChartPointArray(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n allowStrings: boolean,\n): unknown[] {\n const remaining = SPREADSHEET_SNAPSHOT_LIMITS.chartPointsTotal - state.chartPoints;\n const points = snapshotArray(value, path, Math.max(0, remaining));\n state.chartPoints = snapshotAggregate(\n \"spreadsheet snapshot chart points\",\n state.chartPoints,\n points.length,\n SPREADSHEET_SNAPSHOT_LIMITS.chartPointsTotal,\n );\n for (let index = 0; index < points.length; index += 1) {\n const point = points[index];\n if (allowStrings && typeof point === \"string\") {\n snapshotString(point, `${path}[${index}]`, state);\n } else {\n snapshotFiniteNumber(point, `${path}[${index}]`);\n }\n }\n return points;\n}\n\nconst SNAPSHOT_SPARKLINE_TYPES = new Set<SpreadsheetSparklineType>([\"line\", \"column\", \"stacked\"]);\n\nfunction validateSnapshotSparklines(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const groups = snapshotArray(value, path, SPREADSHEET_SNAPSHOT_LIMITS.sparklineGroupsPerSheet);\n state.sparklineGroups = snapshotAggregate(\n \"spreadsheet snapshot sparkline groups\",\n state.sparklineGroups,\n groups.length,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklineGroupsTotal,\n );\n const targetRanges: Array<{ range: RangeAddress; path: string }> = [];\n let sheetCells = 0;\n let sheetPoints = 0;\n\n for (let index = 0; index < groups.length; index += 1) {\n const groupPath = `${path}[${index}]`;\n const group = snapshotRecord(groups[index], groupPath, [\n \"id\",\n \"type\",\n \"targetRange\",\n \"sourceData\",\n \"dateAxisRange\",\n \"lineWeight\",\n \"displayHidden\",\n \"displayEmptyCellsAs\",\n \"seriesColor\",\n \"negativeColor\",\n \"axisColor\",\n \"markersColor\",\n \"firstMarkerColor\",\n \"lastMarkerColor\",\n \"highMarkerColor\",\n \"lowMarkerColor\",\n \"markers\",\n \"axis\",\n ]);\n snapshotId(group.id, `${groupPath}.id`, \"sp\", state);\n const type = snapshotString(group.type, `${groupPath}.type`, state);\n if (!SNAPSHOT_SPARKLINE_TYPES.has(type as SpreadsheetSparklineType)) {\n throw new Error(`${groupPath}.type is unsupported`);\n }\n const targetRange = validateSnapshotRange(group.targetRange, `${groupPath}.targetRange`);\n const sourceData = validateSnapshotRangeReference(\n group.sourceData,\n `${groupPath}.sourceData`,\n state,\n );\n const dateAxisRange =\n group.dateAxisRange === null\n ? null\n : validateSnapshotRangeReference(group.dateAxisRange, `${groupPath}.dateAxisRange`, state);\n const dimensions = sparklineDimensions(\n targetRange,\n sourceData.address,\n dateAxisRange?.address ?? null,\n groupPath,\n );\n targetRanges.push({ range: targetRange, path: `${groupPath}.targetRange` });\n\n sheetCells = snapshotAggregate(\n \"worksheet snapshot sparkline cells\",\n sheetCells,\n dimensions.targetCells,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklineCellsPerSheet,\n );\n state.sparklineCells = snapshotAggregate(\n \"spreadsheet snapshot sparkline cells\",\n state.sparklineCells,\n dimensions.targetCells,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklineCellsTotal,\n );\n const readPoints =\n dimensions.sourcePoints + (dateAxisRange ? dimensions.pointsPerSparkline : 0);\n sheetPoints = snapshotAggregate(\n \"worksheet snapshot sparkline source points\",\n sheetPoints,\n readPoints,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklinePointsPerSheet,\n );\n state.sparklinePoints = snapshotAggregate(\n \"spreadsheet snapshot sparkline source points\",\n state.sparklinePoints,\n readPoints,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklinePointsTotal,\n );\n\n snapshotFiniteNumber(group.lineWeight, `${groupPath}.lineWeight`, {\n positive: true,\n maximum: 10,\n });\n snapshotBoolean(group.displayHidden, `${groupPath}.displayHidden`);\n snapshotInteger(group.displayEmptyCellsAs, `${groupPath}.displayEmptyCellsAs`, 0, 2);\n for (const key of [\n \"seriesColor\",\n \"negativeColor\",\n \"axisColor\",\n \"markersColor\",\n \"firstMarkerColor\",\n \"lastMarkerColor\",\n \"highMarkerColor\",\n \"lowMarkerColor\",\n ] as const) {\n if (group[key] === null) continue;\n const color = snapshotString(group[key], `${groupPath}.${key}`, state);\n if (!isCanonicalSparklineColor(color)) {\n throw new Error(`${groupPath}.${key} must be a safe hexadecimal color`);\n }\n }\n\n const markers = snapshotRecord(group.markers, `${groupPath}.markers`, [\n \"show\",\n \"high\",\n \"low\",\n \"first\",\n \"last\",\n \"negative\",\n ]);\n for (const key of [\"show\", \"high\", \"low\", \"first\", \"last\", \"negative\"] as const) {\n snapshotBoolean(markers[key], `${groupPath}.markers.${key}`);\n }\n const axis = snapshotRecord(group.axis, `${groupPath}.axis`, [\n \"showAxis\",\n \"manualMin\",\n \"manualMax\",\n \"rightToLeft\",\n ]);\n snapshotBoolean(axis.showAxis, `${groupPath}.axis.showAxis`);\n snapshotBoolean(axis.rightToLeft, `${groupPath}.axis.rightToLeft`);\n const manualMin =\n axis.manualMin === null\n ? null\n : snapshotFiniteNumber(axis.manualMin, `${groupPath}.axis.manualMin`);\n const manualMax =\n axis.manualMax === null\n ? null\n : snapshotFiniteNumber(axis.manualMax, `${groupPath}.axis.manualMax`);\n if (manualMin !== null && manualMax !== null && manualMin >= manualMax) {\n throw new Error(`${groupPath}.axis manualMin must be less than manualMax`);\n }\n }\n assertSnapshotRangesDoNotOverlap(targetRanges, \"sparkline target\");\n}\n\nfunction validateSnapshotRangeReference(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): SerializedRangeReference {\n const reference = snapshotRecord(value, path, [\"sheetId\", \"address\"]);\n const sheetId = snapshotString(reference.sheetId, `${path}.sheetId`, state, true);\n if (!sheetId.startsWith(\"ws/\") || sheetId.length === 3) {\n throw new Error(`${path}.sheetId must use the ws/ object-id namespace`);\n }\n state.sparklineSheetReferences.push({ id: sheetId, path: `${path}.sheetId` });\n return {\n sheetId,\n address: validateSnapshotRange(reference.address, `${path}.address`),\n };\n}\n\nfunction validateSnapshotDataValidations(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const entries = snapshotArray(\n value === undefined ? [] : value,\n path,\n SPREADSHEET_SNAPSHOT_LIMITS.dataValidationsPerSheet,\n );\n state.dataValidations = snapshotAggregate(\n \"spreadsheet snapshot data validations\",\n state.dataValidations,\n entries.length,\n SPREADSHEET_SNAPSHOT_LIMITS.dataValidationsTotal,\n );\n for (let index = 0; index < entries.length; index += 1) {\n const entryPath = `${path}[${index}]`;\n const entry = snapshotRecord(entries[index], entryPath, [\"range\", \"config\"]);\n validateSnapshotRange(entry.range, `${entryPath}.range`);\n const config = snapshotRecord(entry.config, `${entryPath}.config`, [\"rule\"]);\n validateSnapshotConfig(config.rule, `${entryPath}.config.rule`, state, true);\n }\n}\n\nfunction validateSnapshotConditionalFormattings(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const entries = snapshotArray(\n value === undefined ? [] : value,\n path,\n SPREADSHEET_SNAPSHOT_LIMITS.conditionalFormatsPerSheet,\n );\n state.conditionalFormats = snapshotAggregate(\n \"spreadsheet snapshot conditional formats\",\n state.conditionalFormats,\n entries.length,\n SPREADSHEET_SNAPSHOT_LIMITS.conditionalFormatsTotal,\n );\n for (let index = 0; index < entries.length; index += 1) {\n const entryPath = `${path}[${index}]`;\n const entry = snapshotRecord(entries[index], entryPath, [\"range\", \"ruleType\", \"config\"]);\n validateSnapshotRange(entry.range, `${entryPath}.range`);\n normalizeConditionalFormatRuleType(\n snapshotString(entry.ruleType, `${entryPath}.ruleType`, state, true),\n );\n validateSnapshotConfig(entry.config, `${entryPath}.config`, state, true);\n }\n}\n\nconst SPREADSHEET_CONFIG_LIMITS = Object.freeze({\n depth: 32,\n nodesEach: 100_000,\n arrayItems: 10_000,\n objectProperties: 1_024,\n stringBytesEach: 1024 * 1024,\n stringBytesEachConfig: 4 * 1024 * 1024,\n});\n\nfunction validateSnapshotConfig(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n requireRecord: boolean,\n): void {\n const usage = { nodes: 0, stringBytes: 0 };\n canonicalizeConfigValue(value, path, usage, new WeakSet(), 0, requireRecord);\n state.configNodes = snapshotAggregate(\n \"spreadsheet snapshot configuration nodes\",\n state.configNodes,\n usage.nodes,\n SPREADSHEET_SNAPSHOT_LIMITS.configNodesTotal,\n );\n state.stringBytes = snapshotAggregate(\n \"spreadsheet snapshot strings\",\n state.stringBytes,\n usage.stringBytes,\n SPREADSHEET_SNAPSHOT_LIMITS.stringBytesTotal,\n );\n}\n\nfunction normalizeConfigRecord(value: unknown, path: string): Record<string, unknown> {\n return canonicalizeConfigValue(\n value,\n path,\n { nodes: 0, stringBytes: 0 },\n new WeakSet(),\n 0,\n true,\n ) as Record<string, unknown>;\n}\n\nfunction canonicalizeConfigValue(\n value: unknown,\n path: string,\n usage: { nodes: number; stringBytes: number },\n seen: WeakSet<object>,\n depth: number,\n requireRecord = false,\n): unknown {\n usage.nodes += 1;\n if (usage.nodes > SPREADSHEET_CONFIG_LIMITS.nodesEach) {\n throw new ArtifactLimitError(`${path} nodes`, usage.nodes, SPREADSHEET_CONFIG_LIMITS.nodesEach);\n }\n if (depth > SPREADSHEET_CONFIG_LIMITS.depth) {\n throw new ArtifactLimitError(`${path} depth`, depth, SPREADSHEET_CONFIG_LIMITS.depth);\n }\n if (value === null) {\n if (requireRecord) throw new TypeError(`${path} must be a plain object`);\n return null;\n }\n if (typeof value === \"string\") {\n if (requireRecord) throw new TypeError(`${path} must be a plain object`);\n const bytes = boundedUtf8ByteLength(value, SPREADSHEET_CONFIG_LIMITS.stringBytesEach);\n if (bytes > SPREADSHEET_CONFIG_LIMITS.stringBytesEach) {\n throw new ArtifactLimitError(\n `${path} UTF-8 bytes`,\n bytes,\n SPREADSHEET_CONFIG_LIMITS.stringBytesEach,\n );\n }\n usage.stringBytes += bytes;\n if (usage.stringBytes > SPREADSHEET_CONFIG_LIMITS.stringBytesEachConfig) {\n throw new ArtifactLimitError(\n `${path} string bytes`,\n usage.stringBytes,\n SPREADSHEET_CONFIG_LIMITS.stringBytesEachConfig,\n );\n }\n return value;\n }\n if (typeof value === \"boolean\") {\n if (requireRecord) throw new TypeError(`${path} must be a plain object`);\n return value;\n }\n if (typeof value === \"number\") {\n if (requireRecord) throw new TypeError(`${path} must be a plain object`);\n if (!Number.isFinite(value)) throw new TypeError(`${path} must contain only finite numbers`);\n return Object.is(value, -0) ? 0 : value;\n }\n if (typeof value !== \"object\") {\n throw new TypeError(`${path} must contain only JSON-compatible plain data`);\n }\n if (seen.has(value)) throw new TypeError(`${path} must not contain cycles or shared aliases`);\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n if (requireRecord) throw new TypeError(`${path} must be a plain object`);\n const source = snapshotArray(value, path, SPREADSHEET_CONFIG_LIMITS.arrayItems);\n return Object.freeze(\n source.map((item, index) =>\n canonicalizeConfigValue(item, `${path}[${index}]`, usage, seen, depth + 1),\n ),\n );\n }\n const source = snapshotRecord(\n value,\n path,\n [],\n Reflect.ownKeys(value).filter((key): key is string => typeof key === \"string\"),\n );\n const keys = Object.keys(source).sort();\n if (keys.length > SPREADSHEET_CONFIG_LIMITS.objectProperties) {\n throw new ArtifactLimitError(\n `${path} properties`,\n keys.length,\n SPREADSHEET_CONFIG_LIMITS.objectProperties,\n );\n }\n const output: Record<string, unknown> = {};\n for (const key of keys) {\n const keyBytes = boundedUtf8ByteLength(key, SPREADSHEET_CONFIG_LIMITS.stringBytesEach);\n if (keyBytes === 0 || keyBytes > SPREADSHEET_CONFIG_LIMITS.stringBytesEach) {\n throw new TypeError(`${path} contains an invalid property name`);\n }\n usage.stringBytes += keyBytes;\n if (usage.stringBytes > SPREADSHEET_CONFIG_LIMITS.stringBytesEachConfig) {\n throw new ArtifactLimitError(\n `${path} string bytes`,\n usage.stringBytes,\n SPREADSHEET_CONFIG_LIMITS.stringBytesEachConfig,\n );\n }\n output[key] = canonicalizeConfigValue(source[key], `${path}.${key}`, usage, seen, depth + 1);\n }\n return Object.freeze(output);\n } finally {\n seen.delete(value);\n }\n}\n\nfunction validateSnapshotImages(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const images = snapshotArray(value, path, SPREADSHEET_SNAPSHOT_LIMITS.imagesPerSheet);\n state.images = snapshotAggregate(\n \"spreadsheet snapshot images\",\n state.images,\n images.length,\n SPREADSHEET_SNAPSHOT_LIMITS.imagesTotal,\n );\n for (let index = 0; index < images.length; index += 1) {\n const imagePath = `${path}[${index}]`;\n const image = snapshotRecord(\n images[index],\n imagePath,\n [\"anchor\"],\n [\"dataUrl\", \"blob\", \"contentType\", \"alt\"],\n );\n let imageBytes = 0;\n const hasDataUrl = image.dataUrl !== undefined;\n const hasBlob = image.blob !== undefined;\n if (hasDataUrl === hasBlob) {\n throw new TypeError(`${imagePath} must contain exactly one of dataUrl or blob`);\n }\n let detectedContentType: string | null = null;\n if (hasDataUrl) {\n if (typeof image.dataUrl !== \"string\") {\n throw new TypeError(`${imagePath}.dataUrl must be a string`);\n }\n boundedUtf8Bytes(\n image.dataUrl,\n SPREADSHEET_SNAPSHOT_LIMITS.imageDataUrlBytesEach,\n `${imagePath}.dataUrl`,\n );\n const dataUrl = image.dataUrl;\n const parsed = validateRasterDataUrl(dataUrl, `${imagePath}.dataUrl`);\n imageBytes += parsed.bytes;\n detectedContentType = parsed.contentType;\n }\n if (hasBlob) {\n if (\n !(image.blob instanceof ArrayBuffer) ||\n Object.getPrototypeOf(image.blob) !== ArrayBuffer.prototype ||\n Reflect.ownKeys(image.blob).length !== 0\n ) {\n throw new TypeError(`${imagePath}.blob must be an ArrayBuffer`);\n }\n imageBytes += image.blob.byteLength;\n }\n snapshotLimit(\n \"spreadsheet snapshot image bytes\",\n imageBytes,\n SPREADSHEET_SNAPSHOT_LIMITS.imageBytesEach,\n );\n state.imageBytes = snapshotAggregate(\n \"spreadsheet snapshot image bytes\",\n state.imageBytes,\n imageBytes,\n SPREADSHEET_SNAPSHOT_LIMITS.imageBytesTotal,\n );\n if (image.contentType === undefined) {\n if (hasBlob) throw new TypeError(`${imagePath}.contentType is required for blob images`);\n } else {\n const contentType = snapshotString(image.contentType, `${imagePath}.contentType`, state);\n if (!SNAPSHOT_RASTER_CONTENT_TYPES.has(contentType)) {\n throw new TypeError(`${imagePath}.contentType must identify a supported raster image`);\n }\n if (detectedContentType && contentType !== detectedContentType) {\n throw new TypeError(`${imagePath}.contentType does not match its dataUrl`);\n }\n }\n if (image.alt !== undefined) snapshotString(image.alt, `${imagePath}.alt`, state);\n\n const anchor = snapshotRecord(image.anchor, `${imagePath}.anchor`, [\"from\", \"extent\"]);\n const from = snapshotRecord(\n anchor.from,\n `${imagePath}.anchor.from`,\n [\"row\", \"col\"],\n [\"rowOffsetPx\", \"colOffsetPx\"],\n );\n snapshotInteger(from.row, `${imagePath}.anchor.from.row`, 0, EXCEL_MAX_ROWS - 1);\n snapshotInteger(from.col, `${imagePath}.anchor.from.col`, 0, EXCEL_MAX_COLUMNS - 1);\n for (const key of [\"rowOffsetPx\", \"colOffsetPx\"] as const) {\n if (from[key] !== undefined) {\n snapshotFiniteNumber(from[key], `${imagePath}.anchor.from.${key}`, {\n nonNegative: true,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.imageOffsetPx,\n });\n }\n }\n const extent = snapshotRecord(anchor.extent, `${imagePath}.anchor.extent`, [\n \"widthPx\",\n \"heightPx\",\n ]);\n snapshotFiniteNumber(extent.widthPx, `${imagePath}.anchor.extent.widthPx`, {\n positive: true,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.imageExtentPx,\n });\n snapshotFiniteNumber(extent.heightPx, `${imagePath}.anchor.extent.heightPx`, {\n positive: true,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.imageExtentPx,\n });\n\n // Decode and verify the actual raster signature during preflight. This guarantees malformed\n // media fails before Workbook construction, while the canonical copy can be reused by restore.\n const normalized = normalizeSpreadsheetImageConfig(image as unknown as SpreadsheetImageConfig);\n const canonicalDataUrlBytes = boundedUtf8Bytes(\n normalized.dataUrl!,\n SPREADSHEET_SNAPSHOT_LIMITS.imageDataUrlBytesEach,\n `${imagePath}.dataUrl`,\n );\n state.imageDataUrlBytes = snapshotAggregate(\n \"spreadsheet snapshot canonical image data URL bytes\",\n state.imageDataUrlBytes,\n canonicalDataUrlBytes,\n SPREADSHEET_SNAPSHOT_LIMITS.imageDataUrlBytesTotal,\n );\n state.normalizedImages.push(normalized);\n }\n}\n\nfunction validateSerializedComment(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const thread = snapshotRecord(value, path, [\"id\", \"sheetId\", \"cell\", \"resolved\", \"comments\"]);\n snapshotId(thread.id, `${path}.id`, \"th\", state);\n const sheetId = snapshotString(thread.sheetId, `${path}.sheetId`, state, true);\n if (!state.worksheetIds.has(sheetId)) throw new Error(`${path}.sheetId references no worksheet`);\n validateSnapshotCellAddress(thread.cell, `${path}.cell`);\n snapshotBoolean(thread.resolved, `${path}.resolved`);\n const comments = snapshotArray(\n thread.comments,\n `${path}.comments`,\n SPREADSHEET_SNAPSHOT_LIMITS.commentsPerThread,\n 1,\n );\n state.comments = snapshotAggregate(\n \"spreadsheet snapshot comments\",\n state.comments,\n comments.length,\n SPREADSHEET_SNAPSHOT_LIMITS.commentsTotal,\n );\n for (let index = 0; index < comments.length; index += 1) {\n const commentPath = `${path}.comments[${index}]`;\n const comment = snapshotRecord(comments[index], commentPath, [\"author\", \"text\", \"createdAt\"]);\n snapshotString(comment.author, `${commentPath}.author`, state);\n snapshotString(comment.text, `${commentPath}.text`, state);\n const createdAt = snapshotString(comment.createdAt, `${commentPath}.createdAt`, state);\n const timestamp = new Date(createdAt);\n if (!Number.isFinite(timestamp.getTime()) || timestamp.toISOString() !== createdAt)\n throw new Error(`${commentPath}.createdAt must be canonical ISO-8601 UTC`);\n }\n}\n\nfunction validateSnapshotCellValue(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n if (value === null || typeof value === \"boolean\") return;\n if (typeof value === \"string\") {\n snapshotString(value, path, state);\n return;\n }\n if (typeof value === \"number\") {\n snapshotFiniteNumber(value, path);\n return;\n }\n if (value !== null && typeof value === \"object\") {\n const tagged = snapshotRecord(value, path, [\"type\", \"value\"]);\n if (tagged.type !== \"date\") {\n throw new TypeError(`${path}.type must be date`);\n }\n const iso = snapshotString(tagged.value, `${path}.value`, state);\n const timestamp = new Date(iso);\n if (!Number.isFinite(timestamp.getTime()) || timestamp.toISOString() !== iso) {\n throw new TypeError(`${path}.value must be canonical ISO-8601 UTC`);\n }\n return;\n }\n throw new TypeError(`${path} must be a finite spreadsheet cell value`);\n}\n\nfunction validateSnapshotCellFormat(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const format = snapshotRecord(\n value,\n path,\n [],\n [\n \"fill\",\n \"font\",\n \"numberFormat\",\n \"borders\",\n \"horizontalAlignment\",\n \"verticalAlignment\",\n \"wrapText\",\n ],\n );\n if (format.fill !== undefined) snapshotString(format.fill, `${path}.fill`, state);\n if (format.numberFormat !== undefined) {\n snapshotString(format.numberFormat, `${path}.numberFormat`, state);\n }\n if (format.wrapText !== undefined) snapshotBoolean(format.wrapText, `${path}.wrapText`);\n if (format.horizontalAlignment !== undefined) {\n snapshotEnum(format.horizontalAlignment, `${path}.horizontalAlignment`, [\n \"left\",\n \"center\",\n \"right\",\n \"justify\",\n ]);\n }\n if (format.verticalAlignment !== undefined) {\n snapshotEnum(format.verticalAlignment, `${path}.verticalAlignment`, [\n \"top\",\n \"center\",\n \"bottom\",\n ]);\n }\n if (format.font !== undefined) validateSnapshotFont(format.font, `${path}.font`, state);\n if (format.borders !== undefined) {\n validateSnapshotBorders(format.borders, `${path}.borders`, state);\n }\n}\n\nfunction validateSnapshotFont(value: unknown, path: string, state: SnapshotValidationState): void {\n const font = snapshotRecord(\n value,\n path,\n [],\n [\"name\", \"size\", \"bold\", \"italic\", \"underline\", \"color\"],\n );\n for (const key of [\"name\", \"color\"] as const) {\n if (font[key] !== undefined) snapshotString(font[key], `${path}.${key}`, state);\n }\n if (font.size !== undefined) {\n snapshotFiniteNumber(font.size, `${path}.size`, {\n positive: true,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.fontSize,\n });\n }\n for (const key of [\"bold\", \"italic\", \"underline\"] as const) {\n if (font[key] !== undefined) snapshotBoolean(font[key], `${path}.${key}`);\n }\n}\n\nfunction validateSnapshotBorders(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n): void {\n const borders = snapshotRecord(\n value,\n path,\n [],\n [\n \"preset\",\n \"style\",\n \"color\",\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"insideHorizontal\",\n \"insideVertical\",\n ],\n );\n if (borders.preset !== undefined) {\n snapshotEnum(borders.preset, `${path}.preset`, [\n \"none\",\n \"outside\",\n \"inside\",\n \"all\",\n \"doubleBottom\",\n ]);\n }\n for (const key of [\"style\", \"color\"] as const) {\n if (borders[key] !== undefined) snapshotString(borders[key], `${path}.${key}`, state);\n }\n for (const key of [\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"insideHorizontal\",\n \"insideVertical\",\n ] as const) {\n if (borders[key] === undefined) continue;\n const border = snapshotRecord(borders[key], `${path}.${key}`, [], [\"style\", \"color\", \"weight\"]);\n if (border.style !== undefined) snapshotString(border.style, `${path}.${key}.style`, state);\n if (border.color !== undefined) snapshotString(border.color, `${path}.${key}.color`, state);\n if (border.weight !== undefined) {\n snapshotFiniteNumber(border.weight, `${path}.${key}.weight`, {\n nonNegative: true,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.borderWeight,\n });\n }\n }\n}\n\nfunction validateSnapshotRange(value: unknown, path: string): RangeAddress {\n const range = snapshotRecord(value, path, [\"row\", \"col\", \"rowCount\", \"colCount\"]);\n const result = {\n row: snapshotInteger(range.row, `${path}.row`, 0, EXCEL_MAX_ROWS - 1),\n col: snapshotInteger(range.col, `${path}.col`, 0, EXCEL_MAX_COLUMNS - 1),\n rowCount: snapshotInteger(range.rowCount, `${path}.rowCount`, 1, EXCEL_MAX_ROWS),\n colCount: snapshotInteger(range.colCount, `${path}.colCount`, 1, EXCEL_MAX_COLUMNS),\n };\n try {\n assertRange(result);\n } catch (cause) {\n throw new Error(`${path} exceeds XLSX bounds`, { cause });\n }\n return result;\n}\n\nfunction validateSnapshotCellAddress(value: unknown, path: string): CellAddress {\n const address = snapshotRecord(value, path, [\"row\", \"col\"]);\n return {\n row: snapshotInteger(address.row, `${path}.row`, 0, EXCEL_MAX_ROWS - 1),\n col: snapshotInteger(address.col, `${path}.col`, 0, EXCEL_MAX_COLUMNS - 1),\n };\n}\n\nfunction snapshotRecord(\n value: unknown,\n path: string,\n required: readonly string[],\n optional: readonly string[] = [],\n): Record<string, unknown> {\n if (\n value === null ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.getPrototypeOf(value) !== Object.prototype\n ) {\n throw new TypeError(`${path} must be a plain object`);\n }\n const record = value as Record<string, unknown>;\n for (const key of Reflect.ownKeys(record)) {\n if (typeof key !== \"string\" || (!required.includes(key) && !optional.includes(key))) {\n throw new TypeError(`${path} contains an unknown property`);\n }\n const descriptor = Object.getOwnPropertyDescriptor(record, key);\n if (!descriptor || !(\"value\" in descriptor)) {\n throw new TypeError(`${path}.${key} must be a plain data property`);\n }\n }\n for (const key of required) {\n if (!Object.hasOwn(record, key)) throw new TypeError(`${path}.${key} is required`);\n }\n return record;\n}\n\nfunction snapshotArray(value: unknown, path: string, maximum: number, minimum = 0): unknown[] {\n if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype) {\n throw new TypeError(`${path} must be an array`);\n }\n snapshotLimit(`${path} length`, value.length, maximum);\n if (value.length < minimum) throw new TypeError(`${path} must contain ${minimum} items`);\n const ownKeys = Reflect.ownKeys(value);\n if (ownKeys.length !== value.length + 1 || ownKeys.some((key) => typeof key === \"symbol\")) {\n throw new TypeError(`${path} must be a dense plain array`);\n }\n for (let index = 0; index < value.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !(\"value\" in descriptor)) {\n throw new TypeError(`${path}[${index}] must be a plain data element`);\n }\n }\n return value;\n}\n\nfunction snapshotId(\n value: unknown,\n path: string,\n prefix: \"ws\" | \"tb\" | \"ch\" | \"sp\" | \"th\",\n state: SnapshotValidationState,\n): string {\n const id = snapshotString(value, path, state, true);\n if (!id.startsWith(`${prefix}/`) || id.length === prefix.length + 1) {\n throw new Error(`${path} must use the ${prefix}/ object-id namespace`);\n }\n if (state.ids.has(id)) throw new Error(`${path} duplicates another object id`);\n state.ids.add(id);\n return id;\n}\n\nfunction snapshotString(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n nonEmpty = false,\n): string {\n return snapshotStringWithLimit(\n value,\n path,\n state,\n SPREADSHEET_SNAPSHOT_LIMITS.stringBytesEach,\n nonEmpty,\n );\n}\n\nfunction snapshotStringWithLimit(\n value: unknown,\n path: string,\n state: SnapshotValidationState,\n maximum: number,\n nonEmpty = false,\n): string {\n if (typeof value !== \"string\") throw new TypeError(`${path} must be a string`);\n if (nonEmpty && value.length === 0) throw new TypeError(`${path} must not be empty`);\n const bytes = boundedUtf8Bytes(value, maximum, path);\n state.stringBytes = snapshotAggregate(\n \"spreadsheet snapshot string bytes\",\n state.stringBytes,\n bytes,\n SPREADSHEET_SNAPSHOT_LIMITS.stringBytesTotal,\n );\n return value;\n}\n\nfunction boundedUtf8Bytes(value: string, maximum: number, label: string): number {\n const bytes = boundedUtf8ByteLength(value, maximum);\n if (bytes > maximum) {\n throw new ArtifactLimitError(`${label} UTF-8 bytes`, bytes, maximum);\n }\n return bytes;\n}\n\nfunction snapshotAggregate(label: string, current: number, added: number, maximum: number): number {\n if (!Number.isSafeInteger(added) || added < 0 || current > Number.MAX_SAFE_INTEGER - added) {\n throw new ArtifactLimitError(label, Number.MAX_SAFE_INTEGER, maximum);\n }\n const total = current + added;\n snapshotLimit(label, total, maximum);\n return total;\n}\n\nfunction snapshotLimit(label: string, actual: number, maximum: number): void {\n if (actual > maximum) throw new ArtifactLimitError(label, actual, maximum);\n}\n\nfunction snapshotInteger(value: unknown, path: string, minimum: number, maximum: number): number {\n if (!Number.isInteger(value) || (value as number) < minimum || (value as number) > maximum) {\n throw new TypeError(`${path} must be an integer between ${minimum} and ${maximum}`);\n }\n return value as number;\n}\n\nfunction snapshotFiniteNumber(\n value: unknown,\n path: string,\n options: {\n positive?: boolean;\n nonNegative?: boolean;\n minimum?: number;\n maximum?: number;\n } = {},\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(`${path} must be a finite number`);\n }\n if (options.positive && value <= 0) throw new TypeError(`${path} must be positive`);\n if (options.nonNegative && value < 0) throw new TypeError(`${path} must be non-negative`);\n if (options.minimum !== undefined && value < options.minimum) {\n throw new TypeError(`${path} must be at least ${options.minimum}`);\n }\n if (options.maximum !== undefined && value > options.maximum) {\n throw new TypeError(`${path} must not exceed ${options.maximum}`);\n }\n return value;\n}\n\nfunction snapshotBoolean(value: unknown, path: string): boolean {\n if (typeof value !== \"boolean\") throw new TypeError(`${path} must be a boolean`);\n return value;\n}\n\nfunction snapshotEnum(value: unknown, path: string, allowed: readonly string[]): string {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new TypeError(`${path} must be one of: ${allowed.join(\", \")}`);\n }\n return value;\n}\n\nfunction snapshotRangeKey(range: RangeAddress): string {\n return `${range.row}:${range.col}:${range.rowCount}:${range.colCount}`;\n}\n\n/**\n * Reject overlapping merge rectangles in O(n log C), where C is the fixed XLSX column bound.\n * Row-end events run before row-start events so merely adjacent ranges remain valid.\n */\nfunction assertSnapshotRangesDoNotOverlap(\n ranges: readonly { range: RangeAddress; path: string }[],\n label = \"merge\",\n): void {\n if (ranges.length < 2) return;\n const events: Array<{\n row: number;\n delta: -1 | 1;\n col: number;\n endCol: number;\n path: string;\n }> = [];\n for (const { range, path } of ranges) {\n events.push({\n row: range.row,\n delta: 1,\n col: range.col,\n endCol: range.col + range.colCount - 1,\n path,\n });\n events.push({\n row: range.row + range.rowCount,\n delta: -1,\n col: range.col,\n endCol: range.col + range.colCount - 1,\n path,\n });\n }\n events.sort((left, right) => left.row - right.row || left.delta - right.delta);\n\n let treeSize = 1;\n while (treeSize < EXCEL_MAX_COLUMNS) treeSize *= 2;\n const maximum = new Int32Array(treeSize * 2);\n const lazy = new Int32Array(treeSize * 2);\n\n const add = (\n node: number,\n nodeStart: number,\n nodeEnd: number,\n start: number,\n end: number,\n delta: number,\n ): void => {\n if (start <= nodeStart && nodeEnd <= end) {\n maximum[node] = maximum[node]! + delta;\n lazy[node] = lazy[node]! + delta;\n return;\n }\n const middle = (nodeStart + nodeEnd) >>> 1;\n if (start <= middle) add(node * 2, nodeStart, middle, start, end, delta);\n if (end > middle) add(node * 2 + 1, middle + 1, nodeEnd, start, end, delta);\n maximum[node] = lazy[node]! + Math.max(maximum[node * 2]!, maximum[node * 2 + 1]!);\n };\n\n const query = (\n node: number,\n nodeStart: number,\n nodeEnd: number,\n start: number,\n end: number,\n inherited: number,\n ): number => {\n if (start <= nodeStart && nodeEnd <= end) return inherited + maximum[node]!;\n const nextInherited = inherited + lazy[node]!;\n const middle = (nodeStart + nodeEnd) >>> 1;\n let result = 0;\n if (start <= middle) result = query(node * 2, nodeStart, middle, start, end, nextInherited);\n if (end > middle) {\n result = Math.max(\n result,\n query(node * 2 + 1, middle + 1, nodeEnd, start, end, nextInherited),\n );\n }\n return result;\n };\n\n for (const event of events) {\n if (event.delta === 1 && query(1, 0, treeSize - 1, event.col, event.endCol, 0) > 0) {\n throw new Error(`Overlapping ${label} range at ${event.path}`);\n }\n add(1, 0, treeSize - 1, event.col, event.endCol, event.delta);\n }\n}\n\nconst SNAPSHOT_RASTER_CONTENT_TYPES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nfunction validateRasterDataUrl(\n dataUrl: string,\n path: string,\n): { contentType: string; bytes: number } {\n const comma = dataUrl.indexOf(\",\");\n if (comma < 0) throw new TypeError(`${path} must be a base64 raster data URL`);\n const prefix = dataUrl.slice(0, comma);\n const contentType = prefix.slice(\"data:\".length, -\";base64\".length).toLowerCase();\n if (\n !prefix.toLowerCase().endsWith(\";base64\") ||\n !prefix.toLowerCase().startsWith(\"data:image/\") ||\n !SNAPSHOT_RASTER_CONTENT_TYPES.has(contentType)\n ) {\n throw new TypeError(`${path} must be a supported base64 raster data URL`);\n }\n const payload = dataUrl.slice(comma + 1);\n if (payload.length === 0 || payload.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(payload)) {\n throw new TypeError(`${path} contains invalid base64 image data`);\n }\n const padding = payload.endsWith(\"==\") ? 2 : payload.endsWith(\"=\") ? 1 : 0;\n return { contentType, bytes: (payload.length / 4) * 3 - padding };\n}\n\nfunction canonicalImageUsage(config: SpreadsheetImageConfig): {\n imageBytes: number;\n dataUrlBytes: number;\n} {\n const dataUrl = config.dataUrl!;\n const comma = dataUrl.indexOf(\",\");\n const payloadLength = dataUrl.length - comma - 1;\n const padding = dataUrl.endsWith(\"==\") ? 2 : dataUrl.endsWith(\"=\") ? 1 : 0;\n return {\n imageBytes: (payloadLength / 4) * 3 - padding,\n // Canonical raster URLs contain ASCII only, so code units equal UTF-8 bytes.\n dataUrlBytes: dataUrl.length,\n };\n}\n\n/**\n * Skill-compatible TypeScript reference workbook used by conformance tests,\n * codecs, and local development. It is not selected as a production kernel\n * fallback; production editing must use the native or Worker/WASM session.\n */\nexport class Workbook {\n readonly worksheets: WorksheetCollection;\n readonly comments: WorkbookComments;\n private revisionValue = 0;\n private transactionDepth = 0;\n private changedSheets = new Set<string>();\n private pendingReason: WorkbookChange[\"reason\"] = \"content\";\n private readonly listeners = new Set<WorkbookChangeListener>();\n private calculationRevision = -1;\n private readonly calculationCache = new Map<Worksheet, Map<number, FormulaResult>>();\n private readonly calculationStack = new Map<Worksheet, Set<number>>();\n private readonly objects = new Map<string, unknown>();\n private nextObjectId = 1;\n private readonly resourceCounts: Record<WorkbookResource, number> = {\n cells: 0,\n merges: 0,\n dimensionOverrides: 0,\n tables: 0,\n charts: 0,\n chartSeries: 0,\n chartPoints: 0,\n sparklineGroups: 0,\n sparklineCells: 0,\n sparklinePoints: 0,\n dataValidations: 0,\n conditionalFormats: 0,\n images: 0,\n imageBytes: 0,\n imageDataUrlBytes: 0,\n commentThreads: 0,\n comments: 0,\n };\n readonly formulaLimits: Readonly<FormulaEvaluationLimits>;\n readonly recalculationLimits: Readonly<SpreadsheetRecalculationLimits>;\n\n private constructor(options: WorkbookOptions = {}) {\n this.formulaLimits = new FormulaEvaluationBudget(options.formulaLimits).limits;\n this.recalculationLimits = resolveRecalculationLimits(options.recalculationLimits);\n this.worksheets = new WorksheetCollection(this);\n this.comments = new WorkbookComments(this);\n }\n\n static create(options: WorkbookOptions = {}): Workbook {\n return new Workbook(options);\n }\n\n static async fromCSV(\n csvText: string,\n options: { sheetName?: string; delimiter?: string } = {},\n ): Promise<Workbook> {\n const workbook = Workbook.create();\n const sheet = workbook.worksheets.add(options.sheetName ?? \"Sheet1\");\n const rows = parseCsv(csvText, options.delimiter ?? \",\");\n if (rows.length > 0) sheet.getRange(\"A1\").writeValues(rectangularize(rows, null));\n return workbook;\n }\n\n get revision(): number {\n return this.revisionValue;\n }\n\n transact<T>(callback: () => T): T {\n this.transactionDepth += 1;\n try {\n return callback();\n } finally {\n this.transactionDepth -= 1;\n if (this.transactionDepth === 0 && this.changedSheets.size > 0) this.commit();\n }\n }\n\n onChange(listener: WorkbookChangeListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n recalculate(): void {\n this.calculationCache.clear();\n this.calculationStack.clear();\n this.calculationRevision = this.revisionValue;\n // These are independent root evaluations. Reuse their scratch state while resetting fuel so\n // every root retains exactly the same limits as a freshly allocated budget and stack.\n const budget = new FormulaEvaluationBudget(this.formulaLimits);\n let rootSheet: Worksheet | undefined;\n const rootAddress: CellAddress = { row: 0, col: 0 };\n const evaluateRoot = (rootBudget: FormulaEvaluationBudget): FormulaResult =>\n this.evaluateCell(rootSheet!, rootAddress, rootBudget, 0);\n let calculationOperations = 0;\n let calculationCellReads = 0;\n try {\n budget.runIsolatedRoots((runRoot) => {\n for (const sheet of this.worksheets.items) {\n for (const [key, data] of sheet[STORED_CELL_ENTRIES]()) {\n if (data.formula) {\n rootSheet = sheet;\n const row = Math.floor(key / EXCEL_MAX_COLUMNS);\n rootAddress.row = row;\n rootAddress.col = key - row * EXCEL_MAX_COLUMNS;\n runRoot(evaluateRoot);\n calculationOperations += budget.operationCount;\n calculationCellReads += budget.cellReadCount;\n if (calculationOperations > this.recalculationLimits.maxOperations) {\n throw new ArtifactLimitError(\n \"spreadsheet recalculation operations\",\n calculationOperations,\n this.recalculationLimits.maxOperations,\n );\n }\n if (calculationCellReads > this.recalculationLimits.maxCellReads) {\n throw new ArtifactLimitError(\n \"spreadsheet recalculation cell reads\",\n calculationCellReads,\n this.recalculationLimits.maxCellReads,\n );\n }\n }\n }\n }\n });\n } catch (cause) {\n // Derived values are one transaction: never retain dependency cache writes from a failed\n // root or let repeated retries launder work around the fuel limits.\n this.calculationCache.clear();\n this.calculationStack.clear();\n this.calculationRevision = -1;\n throw cause;\n }\n }\n\n trace(reference: string): {\n root: string;\n nodes: Array<Record<string, unknown>>;\n } {\n const separator = reference.lastIndexOf(\"!\");\n const sheetName =\n separator >= 0\n ? unquoteSheetName(reference.slice(0, separator))\n : this.worksheets.getActiveWorksheet().name;\n const addressText = separator >= 0 ? reference.slice(separator + 1) : reference;\n const rootSheet = this.worksheets.getItem(sheetName);\n const rootAddress = parseRangeAddress(addressText);\n const root = `${quoteSheetName(rootSheet.name)}!${formatCellAddress(rootAddress)}`;\n const nodes: Array<Record<string, unknown>> = [];\n const visited = new Set<string>();\n const budget = new FormulaEvaluationBudget(this.formulaLimits);\n\n const visit = (sheet: Worksheet, address: CellAddress, depth: number): void => {\n budget.assertDependencyDepth(depth);\n const id = `${sheet.id}:${address.row}:${address.col}`;\n if (visited.has(id)) return;\n visited.add(id);\n const data = sheet.cellData(address.row, address.col);\n const ref = `${quoteSheetName(sheet.name)}!${formatCellAddress(address)}`;\n nodes.push({\n id: ref,\n depth,\n formula: data.formula,\n value: this.valueAt(sheet, address),\n });\n if (!data.formula) return;\n for (const dependency of referencesInFormula(data.formula)) {\n const dependencySheet = dependency.sheetName\n ? this.worksheets.getItem(dependency.sheetName)\n : sheet;\n const dependencyCells =\n (dependency.end.row - dependency.start.row + 1) *\n (dependency.end.col - dependency.start.col + 1);\n budget.consumeCellReads(dependencyCells);\n for (let row = dependency.start.row; row <= dependency.end.row; row += 1) {\n for (let col = dependency.start.col; col <= dependency.end.col; col += 1) {\n visit(dependencySheet, { row, col }, depth + 1);\n }\n }\n }\n };\n\n visit(rootSheet, rootAddress, 0);\n return { root, nodes };\n }\n\n async inspect(options: InspectOptions): Promise<InspectResult> {\n const kinds = new Set(\n options.kind\n .split(\",\")\n .map((kind) => kind.trim())\n .filter(Boolean),\n );\n const records: Array<Record<string, unknown>> = [];\n const selectedRange = options.range ? parseQualifiedRange(options.range) : null;\n const selectedSheet = options.sheetId\n ? this.worksheets.getItem(options.sheetId)\n : selectedRange?.sheetName\n ? this.worksheets.getItem(selectedRange.sheetName)\n : null;\n if (\n selectedSheet &&\n selectedRange?.sheetName &&\n selectedSheet.name.toLowerCase() !== selectedRange.sheetName.toLowerCase()\n ) {\n throw new Error(\n `Inspect range sheet ${selectedRange.sheetName} conflicts with sheetId ${options.sheetId}`,\n );\n }\n const sheets = selectedSheet ? [selectedSheet] : this.worksheets.items;\n const maxResults = options.options?.maxResults ?? options.maxResults ?? 1_000;\n const search = options.search?.toLowerCase();\n const includes = new Set(\n (options.include ?? \"values\")\n .split(\",\")\n .map((include) => include.trim())\n .filter(Boolean),\n );\n\n if (kinds.has(\"workbook\")) {\n records.push({\n kind: \"workbook\",\n revision: this.revisionValue,\n sheetCount: this.worksheets.items.length,\n formulaCount: this.worksheets.items.reduce(\n (count, sheet) => count + sheet.formulaCount(),\n 0,\n ),\n });\n }\n for (const sheet of sheets) {\n if (records.length >= maxResults) break;\n if (kinds.has(\"sheet\")) {\n const used = sheet.usedRangeAddress();\n records.push({\n kind: \"sheet\",\n id: sheet.id,\n name: sheet.name,\n usedRange: used ? formatRangeAddress(used) : null,\n });\n }\n if (kinds.has(\"region\") || kinds.has(\"table\")) {\n const address = selectedRange?.address ?? sheet.usedRangeAddress();\n if (address) {\n const tableMaxRows = Math.min(address.rowCount, options.tableMaxRows ?? 20);\n const tableMaxCols = Math.min(address.colCount, options.tableMaxCols ?? 20);\n const inspectedRange = sheet.getRangeByIndexes(\n address.row,\n address.col,\n tableMaxRows,\n tableMaxCols,\n );\n const values = inspectedRange.values.map((row) =>\n row.map((value) => truncateCell(value, options.tableMaxCellChars ?? 200)),\n );\n const record: Record<string, unknown> = {\n kind: kinds.has(\"table\") ? \"table\" : \"region\",\n sheetId: sheet.id,\n sheetName: sheet.name,\n range: formatRangeAddress(address),\n };\n if (includes.has(\"values\")) record.values = values;\n if (includes.has(\"formulas\")) record.formulas = inspectedRange.formulas;\n records.push(record);\n }\n if (kinds.has(\"table\") && !selectedRange) {\n for (const table of sheet.tables.items) records.push(table.inspectRecord());\n }\n }\n if (kinds.has(\"formula\") || kinds.has(\"computedStyle\") || kinds.has(\"match\")) {\n const bounded = selectedRange?.address ?? sheet.usedRangeAddress();\n if (bounded) {\n for (let row = bounded.row; row < bounded.row + bounded.rowCount; row += 1) {\n for (let col = bounded.col; col < bounded.col + bounded.colCount; col += 1) {\n if (records.length >= maxResults) break;\n const data = sheet.cellData(row, col);\n const value = this.valueAt(sheet, { row, col });\n const haystack = `${data.formula ?? \"\"} ${String(value ?? \"\")}`.toLowerCase();\n if (search && !haystack.includes(search)) continue;\n const address = formatCellAddress({ row, col });\n if (kinds.has(\"formula\") && data.formula) {\n records.push({\n kind: \"formula\",\n sheetId: sheet.id,\n sheetName: sheet.name,\n address,\n formula: data.formula,\n value,\n });\n }\n if (kinds.has(\"computedStyle\") && Object.keys(data.format).length > 0) {\n records.push({\n kind: \"computedStyle\",\n sheetId: sheet.id,\n sheetName: sheet.name,\n address,\n format: data.format,\n });\n }\n if (kinds.has(\"match\") && (search || haystack.trim())) {\n records.push({\n kind: \"match\",\n sheetId: sheet.id,\n sheetName: sheet.name,\n address,\n formula: data.formula,\n value,\n });\n }\n }\n }\n }\n }\n if (kinds.has(\"drawing\")) {\n for (const chart of sheet.charts.items) records.push(chart.inspectRecord());\n for (const sparkline of sheet.sparklineGroups.items)\n records.push(sparkline.inspectRecord());\n for (const image of sheet.images.items) records.push(image.inspectRecord());\n }\n if (kinds.has(\"sparkline\") && !kinds.has(\"drawing\")) {\n for (const sparkline of sheet.sparklineGroups.items)\n records.push(sparkline.inspectRecord());\n }\n }\n if (kinds.has(\"thread\")) {\n for (const thread of this.comments.items) records.push(thread.inspectRecord());\n }\n\n const filtered = options.target\n ? records.filter((record) => record.id === options.target?.id)\n : records;\n const bounded = boundInspectionRecords(filtered, options.maxChars ?? 20_000);\n return bounded;\n }\n\n help(query: string, options: HelpOptions = {}): InspectResult {\n const entries = filterHelpEntries(HELP_ENTRIES, query, options.search, \"fx.\");\n return boundInspectionRecords(entries, options.maxChars ?? 6_000);\n }\n\n async render(options: RenderSpreadsheetOptions = {}): Promise<FileBlob> {\n const { renderWorkbook } = await import(\"@opengeni/artifact-tool/spreadsheet/render\");\n return await renderWorkbook(this, options);\n }\n\n resolve(id: string): unknown {\n const value = this.objects.get(id);\n if (!value) throw new Error(`Unknown workbook object id: ${id}`);\n return value;\n }\n\n toJSON(): SerializedWorkbook {\n return structuredClone({\n version: 1,\n worksheets: this.worksheets.items.map((sheet) => sheet.serialize()),\n comments: this.comments.items.map((thread) => thread.serialize()),\n });\n }\n\n static fromJSON(input: unknown): Workbook {\n const validation = validateSerializedWorkbookState(input);\n const accepted = input as SerializedWorkbook;\n // Images were already copied into canonical, deeply frozen configs during preflight. Excluding\n // caller blobs from this clone avoids a second full raw-image allocation during restoration.\n const snapshot = structuredClone({\n version: accepted.version,\n worksheets: accepted.worksheets.map((worksheet) => ({\n ...worksheet,\n images: [],\n })),\n comments: accepted.comments,\n }) as SerializedWorkbook;\n let imageIndex = 0;\n for (let worksheetIndex = 0; worksheetIndex < snapshot.worksheets.length; worksheetIndex += 1) {\n snapshot.worksheets[worksheetIndex]!.images = accepted.worksheets[worksheetIndex]!.images.map(\n () => validation.normalizedImages[imageIndex++]!,\n );\n }\n const workbook = Workbook.create();\n workbook.transact(() => {\n for (const serialized of snapshot.worksheets) workbook.worksheets.restore(serialized);\n for (const serialized of snapshot.worksheets) {\n workbook.worksheets.getItem(serialized.id).restoreSparklines(serialized.sparklines);\n }\n for (const thread of snapshot.comments) workbook.comments.restore(thread);\n });\n return workbook;\n }\n\n valueAt(sheet: Worksheet, address: CellAddress): FormulaResult {\n if (this.calculationRevision !== this.revisionValue) {\n this.calculationCache.clear();\n this.calculationStack.clear();\n this.calculationRevision = this.revisionValue;\n }\n try {\n return detachCellValue(\n this.evaluateCell(sheet, address, new FormulaEvaluationBudget(this.formulaLimits), 0),\n );\n } catch (cause) {\n this.calculationCache.clear();\n this.calculationStack.clear();\n this.calculationRevision = -1;\n throw cause;\n }\n }\n\n markChanged(sheetId: string, reason: WorkbookChange[\"reason\"]): void {\n this.changedSheets.add(sheetId);\n if (REASON_PRIORITY[reason] > REASON_PRIORITY[this.pendingReason]) this.pendingReason = reason;\n if (this.transactionDepth === 0) this.commit();\n }\n\n allocateId(prefix: string, value: unknown): string {\n const id = `${prefix}/${this.nextObjectId++}`;\n this.objects.set(id, value);\n return id;\n }\n\n registerId(id: string, value: unknown): void {\n if (this.objects.has(id)) throw new Error(`Duplicate workbook object id: ${id}`);\n this.objects.set(id, value);\n const suffix = id.slice(id.lastIndexOf(\"/\") + 1);\n const numeric = suffix.length <= 16 && /^\\d+$/.test(suffix) ? Number(suffix) : NaN;\n if (Number.isSafeInteger(numeric)) {\n this.nextObjectId = Math.max(this.nextObjectId, numeric + 1);\n }\n }\n\n [RESERVE_WORKBOOK_RESOURCE](resource: WorkbookResource, count = 1): void {\n const current = this.resourceCounts[resource];\n const maximum = WORKBOOK_RESOURCE_LIMITS[resource];\n if (!Number.isSafeInteger(count) || count < 0 || current > Number.MAX_SAFE_INTEGER - count) {\n throw new ArtifactLimitError(`workbook ${resource}`, Number.MAX_SAFE_INTEGER, maximum);\n }\n const next = current + count;\n if (next > maximum) {\n throw new ArtifactLimitError(`workbook ${resource}`, next, maximum);\n }\n this.resourceCounts[resource] = next;\n }\n\n [RELEASE_WORKBOOK_RESOURCE](resource: WorkbookResource, count = 1): void {\n const next = this.resourceCounts[resource] - count;\n if (!Number.isSafeInteger(count) || count < 0 || next < 0) {\n throw new Error(`Workbook ${resource} accounting underflow`);\n }\n this.resourceCounts[resource] = next;\n }\n\n private evaluateCell(\n sheet: Worksheet,\n address: CellAddress,\n budget: FormulaEvaluationBudget,\n depth: number,\n ): FormulaResult {\n const key = cellKey(address.row, address.col);\n budget.assertDependencyDepth(depth);\n const data = sheet.cellData(address.row, address.col);\n const sheetCache = this.calculationCache.get(sheet);\n const cached = sheetCache?.get(key);\n // Dependency formulas must be traversed under this root. Reusing a result computed at a\n // shallower depth would hide structural depth and launder the root's evaluation fuel.\n if (cached !== undefined && (depth === 0 || !data.formula)) return cached;\n let activeCells = this.calculationStack.get(sheet);\n if (activeCells?.has(key)) return \"#CYCLE!\";\n if (!data.formula) return data.value;\n if (!activeCells) {\n activeCells = new Set();\n this.calculationStack.set(sheet, activeCells);\n }\n activeCells.add(key);\n let result: FormulaResult;\n try {\n result = evaluateFormula(data.formula, {\n currentSheetName: sheet.name,\n budget,\n getCell: (sheetName, dependencyAddress) => {\n let dependencySheet: Worksheet;\n if (sheetName === sheet.name) {\n dependencySheet = sheet;\n } else {\n try {\n dependencySheet = this.worksheets.getItem(sheetName);\n } catch {\n return \"#REF!\";\n }\n }\n return this.evaluateCell(dependencySheet, dependencyAddress, budget, depth + 1);\n },\n });\n } finally {\n activeCells.delete(key);\n }\n if (sheetCache) sheetCache.set(key, result);\n else this.calculationCache.set(sheet, new Map([[key, result]]));\n return result;\n }\n\n private commit(): void {\n this.revisionValue += 1;\n this.calculationRevision = -1;\n const change: WorkbookChange = {\n revision: this.revisionValue,\n sheetIds: [...this.changedSheets].sort(),\n reason: this.pendingReason,\n };\n this.changedSheets.clear();\n this.pendingReason = \"content\";\n for (const listener of this.listeners) listener(change);\n }\n}\n\nconst REASON_PRIORITY: Record<WorkbookChange[\"reason\"], number> = {\n content: 0,\n format: 1,\n comment: 2,\n drawing: 3,\n dimension: 4,\n structure: 5,\n};\n\nexport class WorksheetCollection {\n readonly items: Worksheet[] = [];\n private activeIndex = 0;\n\n constructor(private readonly workbook: Workbook) {}\n\n add(name: string): Worksheet {\n snapshotLimit(\n \"workbook worksheet count\",\n this.items.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.sheets,\n );\n const normalized = validateSheetName(name);\n if (this.items.some((sheet) => sheet.name.toLowerCase() === normalized.toLowerCase())) {\n throw new Error(`Worksheet already exists: ${name}`);\n }\n const sheet = new Worksheet(this.workbook, normalized);\n this.items.push(sheet);\n this.workbook.markChanged(sheet.id, \"structure\");\n return sheet;\n }\n\n getItem(nameOrId: string): Worksheet {\n const item = this.items.find(\n (sheet) => sheet.id === nameOrId || sheet.name.toLowerCase() === nameOrId.toLowerCase(),\n );\n if (!item) throw new Error(`Worksheet not found: ${nameOrId}`);\n return item;\n }\n\n getOrAdd(name: string, options: { renameFirstIfOnlyNewSpreadsheet?: boolean } = {}): Worksheet {\n const existing = this.items.find((sheet) => sheet.name.toLowerCase() === name.toLowerCase());\n if (existing) return existing;\n if (\n options.renameFirstIfOnlyNewSpreadsheet &&\n this.items.length === 1 &&\n this.items[0]?.usedRangeAddress() === null\n ) {\n this.items[0]!.name = validateSheetName(name);\n return this.items[0]!;\n }\n return this.add(name);\n }\n\n getItemAt(index: number): Worksheet {\n const sheet = this.items[index];\n if (!sheet) throw new Error(`Worksheet index out of range: ${index}`);\n return sheet;\n }\n\n getActiveWorksheet(): Worksheet {\n const sheet = this.items[this.activeIndex];\n if (!sheet) throw new Error(\"Workbook has no worksheets\");\n return sheet;\n }\n\n setActiveWorksheet(sheet: Worksheet): void {\n const index = this.items.indexOf(sheet);\n if (index < 0) throw new Error(\"Worksheet belongs to another workbook\");\n this.activeIndex = index;\n }\n\n restore(serialized: SerializedWorksheet): Worksheet {\n if (this.items.some((sheet) => sheet.name.toLowerCase() === serialized.name.toLowerCase())) {\n throw new Error(`Worksheet already exists: ${serialized.name}`);\n }\n const sheet = new Worksheet(this.workbook, serialized.name, serialized.id);\n this.items.push(sheet);\n sheet.restore(serialized);\n this.workbook.markChanged(sheet.id, \"structure\");\n return sheet;\n }\n}\n\nexport class Worksheet {\n readonly id: string;\n showGridLines = true;\n readonly freezePanes: FreezePanes;\n readonly tables: TableCollection;\n readonly charts: ChartCollection;\n readonly sparklineGroups: SparklineGroupCollection;\n /** Skill-compatible alias. */\n readonly sparklines: SparklineGroupCollection;\n readonly shapes: ShapeCollection;\n readonly images: ImageCollection;\n readonly dataValidations: DataValidationCollection;\n readonly conditionalFormattings: ConditionalFormattingCollection;\n private readonly cells = new Map<number, CellData>();\n private readonly merges: RangeAddress[] = [];\n private readonly columnWidths = new Map<number, number>();\n private readonly rowHeights = new Map<number, number>();\n private nameValue: string;\n\n constructor(\n readonly workbook: Workbook,\n name: string,\n existingId?: string,\n ) {\n this.nameValue = validateSheetName(name);\n this.id = existingId ?? workbook.allocateId(\"ws\", this);\n if (existingId) workbook.registerId(existingId, this);\n this.freezePanes = new FreezePanes(this);\n this.tables = new TableCollection(this);\n this.charts = new ChartCollection(this);\n this.sparklineGroups = new SparklineGroupCollection(this);\n this.sparklines = this.sparklineGroups;\n this.shapes = new ShapeCollection(this);\n this.images = new ImageCollection(this);\n this.dataValidations = new DataValidationCollection(this);\n this.conditionalFormattings = new ConditionalFormattingCollection(this);\n }\n\n get name(): string {\n return this.nameValue;\n }\n\n set name(name: string) {\n const normalized = validateSheetName(name);\n if (\n this.workbook.worksheets.items.some(\n (sheet) => sheet !== this && sheet.name.toLowerCase() === normalized.toLowerCase(),\n )\n ) {\n throw new Error(`Worksheet already exists: ${normalized}`);\n }\n if (normalized === this.nameValue) return;\n this.nameValue = normalized;\n this.workbook.markChanged(this.id, \"structure\");\n }\n\n getRange(address: string): Range {\n return new Range(this, parseRangeAddress(address));\n }\n\n getRangeByIndexes(startRow: number, startCol: number, rowCount: number, colCount: number): Range {\n const address = { row: startRow, col: startCol, rowCount, colCount };\n assertRange(address);\n return new Range(this, address);\n }\n\n getCell(row: number, col: number): Range {\n return this.getRangeByIndexes(row, col, 1, 1);\n }\n\n getUsedRange(valuesOnly = false): Range | null {\n const address = this.usedRangeAddress(valuesOnly);\n return address ? new Range(this, address) : null;\n }\n\n mergeCells(address: string): void {\n this.getRange(address).merge();\n }\n\n unmergeCells(address: string): void {\n this.getRange(address).unmerge();\n }\n\n deleteAllDrawings(): void {\n this.workbook.transact(() => {\n this.charts.deleteAll();\n this.shapes.deleteAll();\n this.images.deleteAll();\n });\n }\n\n async fromCSV(\n csvText: string,\n options: { sheetName?: string; delimiter?: string } = {},\n ): Promise<void> {\n if (options.sheetName && options.sheetName !== this.name)\n this.name = validateSheetName(options.sheetName);\n const rows = parseCsv(csvText, options.delimiter ?? \",\");\n if (rows.length > 0) this.getRange(\"A1\").writeValues(rectangularize(rows, null));\n }\n\n cellData(row: number, col: number): Readonly<CellData> {\n return detachCellData(this.cells.get(cellKey(row, col)) ?? DEFAULT_CELL);\n }\n\n setCell(\n row: number,\n col: number,\n update: Partial<CellData>,\n reason: WorkbookChange[\"reason\"],\n ): void {\n snapshotInteger(row, \"cell row\", 0, EXCEL_MAX_ROWS - 1);\n snapshotInteger(col, \"cell column\", 0, EXCEL_MAX_COLUMNS - 1);\n const key = cellKey(row, col);\n const current = this.cells.get(key) ?? DEFAULT_CELL;\n const next = Object.freeze({\n value: update.value === undefined ? current.value : normalizeCellValue(update.value),\n formula:\n update.formula === undefined\n ? current.formula\n : update.formula === null\n ? null\n : normalizeFormula(update.formula, this.workbook.formulaLimits),\n format: update.format === undefined ? current.format : normalizeCellFormat(update.format),\n }) satisfies CellData;\n const empty =\n next.value === null &&\n next.formula === null &&\n (next.format === DEFAULT_CELL.format || Object.keys(next.format).length === 0);\n if (!empty && !this.cells.has(key)) {\n if (this.cells.size >= SPREADSHEET_SNAPSHOT_LIMITS.cellsPerSheet) {\n throw new ArtifactLimitError(\n \"worksheet cell count\",\n this.cells.size + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.cellsPerSheet,\n );\n }\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"cells\");\n }\n if (empty) {\n if (this.cells.delete(key)) {\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"cells\");\n }\n } else this.cells.set(key, next);\n this.workbook.markChanged(this.id, reason);\n }\n\n *cellEntries(): IterableIterator<{\n row: number;\n col: number;\n data: CellData;\n }> {\n for (const [key, data] of this.cells) {\n yield {\n row: Math.floor(key / 16_384),\n col: key % 16_384,\n data: detachCellData(data),\n };\n }\n }\n\n [STORED_CELL_ENTRIES](): IterableIterator<[number, CellData]> {\n return this.cells.entries();\n }\n\n usedRangeAddress(valuesOnly = false): RangeAddress | null {\n let minRow = Number.POSITIVE_INFINITY;\n let minCol = Number.POSITIVE_INFINITY;\n let maxRow = -1;\n let maxCol = -1;\n for (const { row, col, data } of this.cellEntries()) {\n if (valuesOnly && data.value === null && data.formula === null) continue;\n minRow = Math.min(minRow, row);\n minCol = Math.min(minCol, col);\n maxRow = Math.max(maxRow, row);\n maxCol = Math.max(maxCol, col);\n }\n if (maxRow < 0) return null;\n return {\n row: minRow,\n col: minCol,\n rowCount: maxRow - minRow + 1,\n colCount: maxCol - minCol + 1,\n };\n }\n\n formulaCount(): number {\n let count = 0;\n for (const { data } of this.cellEntries()) if (data.formula) count += 1;\n return count;\n }\n\n addMerge(address: RangeAddress): void {\n assertRange(address);\n snapshotLimit(\n \"worksheet merge count\",\n this.merges.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.mergesPerSheet,\n );\n if (this.merges.some((merge) => rangesOverlap(merge, address))) {\n throw new Error(`Merge overlaps an existing merge: ${formatRangeAddress(address)}`);\n }\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"merges\");\n this.merges.push({ ...address });\n this.workbook.markChanged(this.id, \"structure\");\n }\n\n removeMergesOverlapping(address: RangeAddress): void {\n let write = 0;\n for (const merge of this.merges) {\n if (!rangesOverlap(merge, address)) this.merges[write++] = merge;\n }\n if (write !== this.merges.length) {\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"merges\", this.merges.length - write);\n this.merges.length = write;\n this.workbook.markChanged(this.id, \"structure\");\n }\n }\n\n mergeRegions(): readonly RangeAddress[] {\n return this.merges.map((merge) => ({ ...merge }));\n }\n\n setColumnWidth(col: number, width: number): void {\n snapshotInteger(col, \"column index\", 0, EXCEL_MAX_COLUMNS - 1);\n snapshotFiniteNumber(width, \"column width\", {\n minimum: SPREADSHEET_SNAPSHOT_LIMITS.dimensionValueMinimum,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.dimensionValue,\n });\n if (!this.columnWidths.has(col)) this.assertDimensionCapacity();\n this.columnWidths.set(col, width);\n this.workbook.markChanged(this.id, \"dimension\");\n }\n\n columnWidth(col: number): number {\n return this.columnWidths.get(col) ?? DEFAULT_COLUMN_WIDTH;\n }\n\n get defaultColumnWidth(): number {\n return DEFAULT_COLUMN_WIDTH;\n }\n\n *columnWidthEntries(): IterableIterator<readonly [number, number]> {\n for (const [col, width] of this.columnWidths) yield [col, width] as const;\n }\n\n setRowHeight(row: number, height: number): void {\n snapshotInteger(row, \"row index\", 0, EXCEL_MAX_ROWS - 1);\n snapshotFiniteNumber(height, \"row height\", {\n minimum: SPREADSHEET_SNAPSHOT_LIMITS.dimensionValueMinimum,\n maximum: SPREADSHEET_SNAPSHOT_LIMITS.dimensionValue,\n });\n if (!this.rowHeights.has(row)) this.assertDimensionCapacity();\n this.rowHeights.set(row, height);\n this.workbook.markChanged(this.id, \"dimension\");\n }\n\n rowHeight(row: number): number {\n return this.rowHeights.get(row) ?? DEFAULT_ROW_HEIGHT;\n }\n\n get defaultRowHeight(): number {\n return DEFAULT_ROW_HEIGHT;\n }\n\n *rowHeightEntries(): IterableIterator<readonly [number, number]> {\n for (const [row, height] of this.rowHeights) yield [row, height] as const;\n }\n\n private assertDimensionCapacity(): void {\n snapshotLimit(\n \"worksheet dimension override count\",\n this.columnWidths.size + this.rowHeights.size + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.dimensionOverridesPerSheet,\n );\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"dimensionOverrides\");\n }\n\n serialize(): SerializedWorksheet {\n return {\n id: this.id,\n name: this.name,\n showGridLines: this.showGridLines,\n freezePanes: this.freezePanes.snapshot(),\n cells: [...this.cellEntries()].map(({ row, col, data }) => ({\n row,\n col,\n value: serializeCellValue(data.value),\n formula: data.formula,\n format: data.format,\n })),\n merges: this.merges.map((merge) => ({ ...merge })),\n columnWidths: [...this.columnWidths],\n rowHeights: [...this.rowHeights],\n tables: this.tables.items.map((table) => table.serialize()),\n charts: this.charts.items.map((chart) => chart.serialize()),\n sparklines: this.sparklineGroups.items.map((group) => group.serialize()),\n dataValidations: this.dataValidations.serialize(),\n conditionalFormattings: this.conditionalFormattings.serialize(),\n images: this.images.items.map((image) => image.config),\n };\n }\n\n restore(serialized: SerializedWorksheet): void {\n this.showGridLines = serialized.showGridLines;\n this.freezePanes.restore(serialized.freezePanes);\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"cells\", serialized.cells.length);\n for (const cell of serialized.cells) {\n this.cells.set(\n cellKey(cell.row, cell.col),\n Object.freeze({\n value: reviveValue(cell.value),\n formula: cell.formula\n ? normalizeFormula(cell.formula, this.workbook.formulaLimits)\n : null,\n format: normalizeCellFormat(cell.format),\n }),\n );\n }\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"merges\", serialized.merges.length);\n this.merges.push(...serialized.merges.map((merge) => ({ ...merge })));\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\n \"dimensionOverrides\",\n serialized.columnWidths.length + serialized.rowHeights.length,\n );\n for (const [col, width] of serialized.columnWidths) this.columnWidths.set(col, width);\n for (const [row, height] of serialized.rowHeights) this.rowHeights.set(row, height);\n for (const table of serialized.tables) this.tables.restore(table);\n for (const chart of serialized.charts) this.charts.restore(chart);\n this.dataValidations.restore(serialized.dataValidations ?? []);\n this.conditionalFormattings.restore(serialized.conditionalFormattings ?? []);\n for (const image of serialized.images) this.images.add(image);\n }\n\n restoreSparklines(serialized: readonly SerializedSparklineGroup[]): void {\n for (const group of serialized) this.sparklineGroups.restore(group);\n }\n}\n\nexport class Range {\n readonly address: RangeAddress;\n readonly conditionalFormats: RangeConditionalFormats;\n readonly sparklines: RangeSparklines;\n\n constructor(\n readonly worksheet: Worksheet,\n address: RangeAddress,\n ) {\n assertRange(address);\n this.address = Object.freeze({ ...address });\n this.conditionalFormats = new RangeConditionalFormats(this);\n this.sparklines = new RangeSparklines(this);\n }\n\n get values(): Matrix<FormulaResult> {\n return matrix(this.address.rowCount, this.address.colCount, (relativeRow, relativeCol) =>\n this.worksheet.workbook.valueAt(this.worksheet, {\n row: this.address.row + relativeRow,\n col: this.address.col + relativeCol,\n }),\n );\n }\n\n set values(values: Matrix<CellValue>) {\n assertMatrixShape(values, this.address.rowCount, this.address.colCount);\n // Validate the complete batch before mutation. Stored values are copied again at the boundary,\n // avoiding a second full matrix allocation for large primitive writes.\n for (const row of values) {\n for (const value of row) normalizeCellValue(value);\n }\n this.worksheet.workbook.transact(() => {\n eachCell(this.address, (row, col, relativeRow, relativeCol) => {\n this.worksheet.setCell(\n row,\n col,\n {\n value: values[relativeRow]![relativeCol]!,\n formula: null,\n },\n \"content\",\n );\n });\n });\n }\n\n get formulas(): Matrix<string | null> {\n return matrix(\n this.address.rowCount,\n this.address.colCount,\n (relativeRow, relativeCol) =>\n this.worksheet.cellData(this.address.row + relativeRow, this.address.col + relativeCol)\n .formula,\n );\n }\n\n set formulas(formulas: Matrix<string | null>) {\n assertMatrixShape(formulas, this.address.rowCount, this.address.colCount);\n // Validate the full batch before the first mutation so a later rejected formula cannot leave\n // a partially written range.\n const normalized = formulas.map((row) =>\n row.map((formula) =>\n formula ? normalizeFormula(formula, this.worksheet.workbook.formulaLimits) : null,\n ),\n );\n this.worksheet.workbook.transact(() => {\n eachCell(this.address, (row, col, relativeRow, relativeCol) => {\n const formula = normalized[relativeRow]![relativeCol]!;\n this.worksheet.setCell(row, col, { formula, value: null }, \"content\");\n });\n });\n }\n\n get formulasR1C1(): Matrix<string | null> {\n return this.formulas.map((row, relativeRow) =>\n row.map((formula, relativeCol) =>\n formula\n ? formulaToR1C1(formula, {\n row: this.address.row + relativeRow,\n col: this.address.col + relativeCol,\n })\n : null,\n ),\n );\n }\n\n set formulasR1C1(formulas: Matrix<string | null>) {\n assertMatrixShape(formulas, this.address.rowCount, this.address.colCount);\n const converted = formulas.map((row, relativeRow) =>\n row.map((formula, relativeCol) =>\n formula\n ? formulaFromR1C1(formula, {\n row: this.address.row + relativeRow,\n col: this.address.col + relativeCol,\n })\n : null,\n ),\n );\n this.formulas = converted;\n }\n\n get displayFormulas(): Matrix<string | null> {\n return this.formulas;\n }\n\n get formulaInfos(): Matrix<Record<string, unknown> | null> {\n return this.formulas.map((row) =>\n row.map((formula) =>\n formula ? { formula, references: referencesInFormula(formula) } : null,\n ),\n );\n }\n\n get format(): RangeFormat {\n return new RangeFormat(this);\n }\n\n set format(value: CellFormat) {\n this.applyFormat(value);\n }\n\n get dataValidation(): DataValidationConfig | null {\n return this.worksheet.dataValidations.get(this.address);\n }\n\n set dataValidation(config: DataValidationConfig | null) {\n if (config)\n this.worksheet.dataValidations.add({\n range: formatRangeAddress(this.address),\n rule: config.rule,\n });\n else this.worksheet.dataValidations.remove(this.address);\n }\n\n write(input: Matrix<CellValue> | RangeWritePayload): Range {\n if (Array.isArray(input)) return this.writeValues(input);\n const fields = ([\"values\", \"formulas\", \"formulasR1C1\"] as const).filter(\n (field) => input[field] !== undefined,\n );\n if (fields.length !== 1) {\n throw new Error(\"Range.write expects exactly one of: values, formulas, formulasR1C1\");\n }\n const field = fields[0]!;\n const data = input[field]!;\n const rowCount = data.length;\n const colCount = assertRectangularMatrix(data);\n if (rowCount === 0 || colCount === 0) return this;\n const target = this.resize(rowCount, colCount);\n if (field === \"values\") target.values = data as Matrix<CellValue>;\n else if (field === \"formulas\") target.formulas = data as Matrix<string | null>;\n else target.formulasR1C1 = data as Matrix<string | null>;\n return target;\n }\n\n writeValues(values: Matrix<CellValue>): Range {\n const colCount = assertRectangularMatrix(values);\n if (values.length === 0 || colCount === 0) return this;\n const target = this.resize(values.length, colCount);\n target.values = values;\n return target;\n }\n\n fillDown(): void {\n this.worksheet.workbook.transact(() => {\n for (let col = 0; col < this.address.colCount; col += 1) {\n const source = this.worksheet.cellData(this.address.row, this.address.col + col);\n for (let row = 1; row < this.address.rowCount; row += 1) {\n this.worksheet.setCell(\n this.address.row + row,\n this.address.col + col,\n {\n value: source.formula ? null : source.value,\n formula: source.formula ? translateFormula(source.formula, row, 0) : null,\n format: structuredClone(source.format),\n },\n \"content\",\n );\n }\n }\n });\n }\n\n fillRight(): void {\n this.worksheet.workbook.transact(() => {\n for (let row = 0; row < this.address.rowCount; row += 1) {\n const source = this.worksheet.cellData(this.address.row + row, this.address.col);\n for (let col = 1; col < this.address.colCount; col += 1) {\n this.worksheet.setCell(\n this.address.row + row,\n this.address.col + col,\n {\n value: source.formula ? null : source.value,\n formula: source.formula ? translateFormula(source.formula, 0, col) : null,\n format: structuredClone(source.format),\n },\n \"content\",\n );\n }\n }\n });\n }\n\n clear(options: { applyTo?: \"contents\" | \"formats\" | \"all\" } = {}): void {\n const applyTo = options.applyTo ?? \"all\";\n this.worksheet.workbook.transact(() => {\n eachCell(this.address, (row, col) => {\n const data = this.worksheet.cellData(row, col);\n this.worksheet.setCell(\n row,\n col,\n {\n value: applyTo === \"formats\" ? data.value : null,\n formula: applyTo === \"formats\" ? data.formula : null,\n format: applyTo === \"contents\" ? data.format : {},\n },\n applyTo === \"formats\" ? \"format\" : \"content\",\n );\n });\n });\n }\n\n copyFrom(source: Range, mode: \"values\" | \"formulas\" | \"all\" = \"all\"): void {\n assertSameShape(this.address, source.address);\n const sourceCells = matrix(\n this.address.rowCount,\n this.address.colCount,\n (relativeRow, relativeCol) =>\n source.worksheet.cellData(\n source.address.row + relativeRow,\n source.address.col + relativeCol,\n ),\n );\n const sourceValues =\n mode === \"values\"\n ? matrix(this.address.rowCount, this.address.colCount, (relativeRow, relativeCol) =>\n source.worksheet.workbook.valueAt(source.worksheet, {\n row: source.address.row + relativeRow,\n col: source.address.col + relativeCol,\n }),\n )\n : null;\n const rowDelta = this.address.row - source.address.row;\n const colDelta = this.address.col - source.address.col;\n this.worksheet.workbook.transact(() => {\n eachCell(this.address, (row, col, relativeRow, relativeCol) => {\n const sourceCell = sourceCells[relativeRow]![relativeCol]!;\n const current = this.worksheet.cellData(row, col);\n const translatedFormula = sourceCell.formula\n ? translateFormula(sourceCell.formula, rowDelta, colDelta)\n : null;\n this.worksheet.setCell(\n row,\n col,\n mode === \"values\"\n ? {\n value: sourceValues![relativeRow]![relativeCol]!,\n formula: null,\n }\n : mode === \"formulas\"\n ? {\n value: translatedFormula ? null : current.value,\n formula: translatedFormula,\n }\n : {\n value: sourceCell.value,\n formula: translatedFormula,\n format: structuredClone(sourceCell.format),\n },\n mode === \"all\" ? \"format\" : \"content\",\n );\n });\n });\n }\n\n copyTo(destination: Range, mode: \"values\" | \"formulas\" | \"all\" = \"all\"): void {\n destination.copyFrom(this, mode);\n }\n\n offset(rowOffset: number, colOffset: number): Range {\n return this.worksheet.getRangeByIndexes(\n this.address.row + rowOffset,\n this.address.col + colOffset,\n this.address.rowCount,\n this.address.colCount,\n );\n }\n\n resize(rowCount: number, colCount: number): Range {\n return this.worksheet.getRangeByIndexes(this.address.row, this.address.col, rowCount, colCount);\n }\n\n getCurrentRegion(): Range {\n const used = this.worksheet.usedRangeAddress();\n return used ? new Range(this.worksheet, used) : this;\n }\n\n getRow(index: number): Range {\n return this.worksheet.getRangeByIndexes(\n this.address.row + index,\n this.address.col,\n 1,\n this.address.colCount,\n );\n }\n\n getColumn(index: number): Range {\n return this.worksheet.getRangeByIndexes(\n this.address.row,\n this.address.col + index,\n this.address.rowCount,\n 1,\n );\n }\n\n getRangeByIndexes(startRow: number, startCol: number, rowCount: number, colCount: number): Range {\n return this.worksheet.getRangeByIndexes(\n this.address.row + startRow,\n this.address.col + startCol,\n rowCount,\n colCount,\n );\n }\n\n getCell(row: number, col: number): Range {\n return this.getRangeByIndexes(row, col, 1, 1);\n }\n\n merge(across = false): void {\n if (!across) {\n this.worksheet.addMerge(this.address);\n return;\n }\n this.worksheet.workbook.transact(() => {\n for (let row = 0; row < this.address.rowCount; row += 1) {\n this.worksheet.addMerge({\n row: this.address.row + row,\n col: this.address.col,\n rowCount: 1,\n colCount: this.address.colCount,\n });\n }\n });\n }\n\n unmerge(): void {\n this.worksheet.removeMergesOverlapping(this.address);\n }\n\n setNumberFormat(format: string): void {\n this.format.numberFormat = format;\n }\n\n applyFormat(format: CellFormat): void {\n this.worksheet.workbook.transact(() => {\n eachCell(this.address, (row, col) => {\n const current = this.worksheet.cellData(row, col);\n this.worksheet.setCell(\n row,\n col,\n { format: mergeCellFormat(current.format, format) },\n \"format\",\n );\n });\n });\n }\n}\n\nexport class RangeFormat {\n constructor(private readonly range: Range) {}\n\n set fill(value: string | undefined) {\n this.range.applyFormat(value === undefined ? {} : { fill: value });\n }\n set font(value: CellFormat[\"font\"]) {\n this.range.applyFormat(value === undefined ? {} : { font: value });\n }\n set numberFormat(value: string | Matrix<string>) {\n if (typeof value === \"string\") {\n this.range.applyFormat({ numberFormat: value });\n return;\n }\n assertMatrixShape(value, this.range.address.rowCount, this.range.address.colCount);\n this.range.worksheet.workbook.transact(() => {\n eachCell(this.range.address, (row, col, relativeRow, relativeCol) => {\n const data = this.range.worksheet.cellData(row, col);\n this.range.worksheet.setCell(\n row,\n col,\n {\n format: mergeCellFormat(data.format, {\n numberFormat: value[relativeRow]![relativeCol]!,\n }),\n },\n \"format\",\n );\n });\n });\n }\n set borders(value: CellFormat[\"borders\"]) {\n this.range.applyFormat(value === undefined ? {} : { borders: value });\n }\n set horizontalAlignment(value: CellFormat[\"horizontalAlignment\"]) {\n this.range.applyFormat(value === undefined ? {} : { horizontalAlignment: value });\n }\n set verticalAlignment(value: CellFormat[\"verticalAlignment\"]) {\n this.range.applyFormat(value === undefined ? {} : { verticalAlignment: value });\n }\n set wrapText(value: boolean | undefined) {\n this.range.applyFormat(value === undefined ? {} : { wrapText: value });\n }\n\n set columnWidth(value: number) {\n for (\n let col = this.range.address.col;\n col < this.range.address.col + this.range.address.colCount;\n col += 1\n ) {\n this.range.worksheet.setColumnWidth(col, value * 7);\n }\n }\n\n set columnWidthPx(value: number) {\n for (\n let col = this.range.address.col;\n col < this.range.address.col + this.range.address.colCount;\n col += 1\n ) {\n this.range.worksheet.setColumnWidth(col, value);\n }\n }\n\n set rowHeight(value: number) {\n for (\n let row = this.range.address.row;\n row < this.range.address.row + this.range.address.rowCount;\n row += 1\n ) {\n this.range.worksheet.setRowHeight(row, value * (4 / 3));\n }\n }\n\n set rowHeightPx(value: number) {\n for (\n let row = this.range.address.row;\n row < this.range.address.row + this.range.address.rowCount;\n row += 1\n ) {\n this.range.worksheet.setRowHeight(row, value);\n }\n }\n\n autofitColumns(): void {\n for (\n let col = this.range.address.col;\n col < this.range.address.col + this.range.address.colCount;\n col += 1\n ) {\n let maxLength = 1;\n for (\n let row = this.range.address.row;\n row < this.range.address.row + this.range.address.rowCount;\n row += 1\n ) {\n const value = this.range.worksheet.workbook.valueAt(this.range.worksheet, { row, col });\n maxLength = Math.max(maxLength, String(value ?? \"\").length);\n }\n this.range.worksheet.setColumnWidth(col, Math.min(480, Math.max(48, maxLength * 7.6 + 20)));\n }\n }\n\n autofitRows(): void {\n for (\n let row = this.range.address.row;\n row < this.range.address.row + this.range.address.rowCount;\n row += 1\n ) {\n this.range.worksheet.setRowHeight(row, 24);\n }\n }\n}\n\nexport class FreezePanes {\n private rows = 0;\n private columns = 0;\n constructor(private readonly worksheet: Worksheet) {}\n freezeRows(count: number): void {\n this.rows = snapshotInteger(count, \"frozen row count\", 0, EXCEL_MAX_ROWS);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n freezeColumns(count: number): void {\n this.columns = snapshotInteger(count, \"frozen column count\", 0, EXCEL_MAX_COLUMNS);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n unfreeze(): void {\n this.rows = 0;\n this.columns = 0;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n snapshot(): { rows: number; columns: number } {\n return { rows: this.rows, columns: this.columns };\n }\n restore(value: { rows: number; columns: number }): void {\n this.rows = snapshotInteger(value.rows, \"restored frozen row count\", 0, EXCEL_MAX_ROWS);\n this.columns = snapshotInteger(\n value.columns,\n \"restored frozen column count\",\n 0,\n EXCEL_MAX_COLUMNS,\n );\n }\n}\n\nexport class TableCollection {\n readonly items: Table[] = [];\n constructor(private readonly worksheet: Worksheet) {}\n add(range: string | Range, hasHeaders: boolean, name: string): Table {\n snapshotLimit(\n \"worksheet table count\",\n this.items.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.tablesPerSheet,\n );\n const normalizedName = validateTableName(name);\n const address = typeof range === \"string\" ? parseRangeAddress(range) : range.address;\n if (this.items.some((table) => rangesOverlap(table.range.address, address)))\n throw new Error(\"Table overlaps an existing table\");\n if (this.items.some((table) => table.name.toLowerCase() === normalizedName.toLowerCase()))\n throw new Error(`Duplicate table name: ${normalizedName}`);\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"tables\");\n let table: Table;\n try {\n table = new Table(this.worksheet, normalizedName, address, hasHeaders);\n } catch (cause) {\n this.worksheet.workbook[RELEASE_WORKBOOK_RESOURCE](\"tables\");\n throw cause;\n }\n this.items.push(table);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n return table;\n }\n remove(table: Table): void {\n const index = this.items.indexOf(table);\n if (index >= 0) {\n this.items.splice(index, 1);\n this.worksheet.workbook[RELEASE_WORKBOOK_RESOURCE](\"tables\");\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n }\n restore(serialized: SerializedTable): void {\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"tables\");\n this.items.push(\n new Table(\n this.worksheet,\n serialized.name,\n serialized.range,\n serialized.hasHeaders,\n serialized,\n ),\n );\n }\n}\n\nexport class Table {\n readonly id: string;\n private rangeValue: Range;\n private nameValue: string;\n private styleValue = \"TableStyleMedium2\";\n showHeaders = true;\n showTotals = false;\n showBandedColumns = false;\n showFilterButton = true;\n readonly rows: {\n add: (index: number | null, rows: Matrix<CellValue>) => void;\n };\n\n constructor(\n private readonly worksheet: Worksheet,\n name: string,\n address: RangeAddress,\n readonly hasHeaders: boolean,\n restore?: SerializedTable,\n ) {\n this.nameValue = validateTableName(name);\n this.rangeValue = new Range(worksheet, address);\n this.id = restore?.id ?? worksheet.workbook.allocateId(\"tb\", this);\n if (restore) {\n worksheet.workbook.registerId(restore.id, this);\n this.styleValue = normalizeLiveString(restore.style, \"table style\");\n this.showHeaders = restore.showHeaders;\n this.showTotals = restore.showTotals;\n this.showBandedColumns = restore.showBandedColumns;\n this.showFilterButton = restore.showFilterButton;\n }\n this.rows = { add: (_index, rows) => this.addRows(rows) };\n }\n\n get name(): string {\n return this.nameValue;\n }\n set name(value: string) {\n const normalized = validateTableName(value);\n if (\n this.worksheet.tables.items.some(\n (table) => table !== this && table.name.toLowerCase() === normalized.toLowerCase(),\n )\n ) {\n throw new Error(`Duplicate table name: ${normalized}`);\n }\n if (normalized === this.nameValue) return;\n this.nameValue = normalized;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n get range(): Range {\n return this.rangeValue;\n }\n set range(value: Range) {\n if (!(value instanceof Range) || value.worksheet !== this.worksheet) {\n throw new Error(\"Table range must belong to its worksheet\");\n }\n if (\n this.worksheet.tables.items.some(\n (table) => table !== this && rangesOverlap(table.range.address, value.address),\n )\n ) {\n throw new Error(\"Table overlaps an existing table\");\n }\n this.rangeValue = value;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n get style(): string {\n return this.styleValue;\n }\n set style(value: string) {\n const normalized = normalizeLiveString(value, \"table style\");\n if (normalized === this.styleValue) return;\n this.styleValue = normalized;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"format\");\n }\n\n getDataRows(): Range {\n const headerRows = this.hasHeaders ? 1 : 0;\n const totalRows = this.showTotals ? 1 : 0;\n return this.worksheet.getRangeByIndexes(\n this.range.address.row + headerRows,\n this.range.address.col,\n Math.max(1, this.range.address.rowCount - headerRows - totalRows),\n this.range.address.colCount,\n );\n }\n getHeaderRowRange(): Range {\n return this.worksheet.getRangeByIndexes(\n this.range.address.row,\n this.range.address.col,\n 1,\n this.range.address.colCount,\n );\n }\n delete(): void {\n this.worksheet.tables.remove(this);\n }\n inspectRecord(): Record<string, unknown> {\n return {\n kind: \"table\",\n id: this.id,\n sheetId: this.worksheet.id,\n name: this.name,\n range: formatRangeAddress(this.range.address),\n style: this.style,\n };\n }\n serialize(): SerializedTable {\n return {\n id: this.id,\n name: this.name,\n range: this.range.address,\n hasHeaders: this.hasHeaders,\n style: this.style,\n showHeaders: this.showHeaders,\n showTotals: this.showTotals,\n showBandedColumns: this.showBandedColumns,\n showFilterButton: this.showFilterButton,\n };\n }\n private addRows(rows: Matrix<CellValue>): void {\n if (rows.length === 0) return;\n assertMatrixShape(rows, rows.length, this.range.address.colCount);\n const insertionRow =\n this.range.address.row + this.range.address.rowCount - (this.showTotals ? 1 : 0);\n this.worksheet.getRangeByIndexes(\n insertionRow,\n this.range.address.col,\n rows.length,\n this.range.address.colCount,\n ).values = rows;\n this.rangeValue = this.worksheet.getRangeByIndexes(\n this.range.address.row,\n this.range.address.col,\n this.range.address.rowCount + rows.length,\n this.range.address.colCount,\n );\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n}\n\nexport class ChartCollection {\n readonly items: SpreadsheetChart[] = [];\n constructor(private readonly worksheet: Worksheet) {}\n add(\n type: SpreadsheetChartType,\n sourceOrConfig?: Range | SpreadsheetChartConfig,\n ): SpreadsheetChart {\n snapshotLimit(\n \"worksheet chart count\",\n this.items.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.chartsPerSheet,\n );\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"charts\");\n let chart: SpreadsheetChart;\n try {\n chart = new SpreadsheetChart(this.worksheet, type, sourceOrConfig);\n chart.series.attach();\n } catch (cause) {\n this.worksheet.workbook[RELEASE_WORKBOOK_RESOURCE](\"charts\");\n throw cause;\n }\n this.items.push(chart);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n return chart;\n }\n getItemOrNullObject(name: string): SpreadsheetChart | null {\n return this.items.find((chart) => chart.name === name) ?? null;\n }\n deleteAll(): void {\n if (this.items.length > 0) {\n for (const chart of this.items) chart.series.detach();\n this.worksheet.workbook[RELEASE_WORKBOOK_RESOURCE](\"charts\", this.items.length);\n this.items.length = 0;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n }\n restore(serialized: SerializedChart): void {\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"charts\");\n const chart = new SpreadsheetChart(this.worksheet, serialized.type, serialized);\n chart.series.attach();\n this.items.push(chart);\n }\n}\n\nexport class SpreadsheetChart {\n readonly id: string;\n readonly name: string;\n type: SpreadsheetChartType;\n private titleValue = \"\";\n hasLegend = true;\n xAxis: Record<string, unknown> = {};\n yAxis: Record<string, unknown> = {};\n readonly titleTextStyle: Record<string, unknown> = {};\n readonly series: ChartSeriesCollection;\n sourceRange: Range | null = null;\n private positionValue: {\n from: RangeAddress;\n to: RangeAddress;\n } | null = null;\n\n constructor(\n private readonly worksheet: Worksheet,\n type: SpreadsheetChartType,\n sourceOrConfig?: Range | SpreadsheetChartConfig | SerializedChart,\n ) {\n this.type = type;\n const restored = isSerializedChart(sourceOrConfig) ? sourceOrConfig : null;\n this.id = restored?.id ?? worksheet.workbook.allocateId(\"ch\", this);\n if (restored) worksheet.workbook.registerId(restored.id, this);\n this.name = restored?.name ?? `Chart ${worksheet.charts.items.length + 1}`;\n this.series = new ChartSeriesCollection(worksheet.workbook);\n if (sourceOrConfig instanceof Range) this.setData(sourceOrConfig);\n else if (restored) {\n this.titleValue = normalizeLiveString(restored.title, \"chart title\");\n this.hasLegend = restored.hasLegend;\n this.sourceRange = restored.sourceRange ? new Range(worksheet, restored.sourceRange) : null;\n this.positionValue = normalizeChartPosition(restored.position);\n for (const series of restored.series) this.series.add(series.name, series);\n } else if (sourceOrConfig) {\n this.titleValue = normalizeLiveString(sourceOrConfig.title ?? \"\", \"chart title\");\n this.hasLegend = sourceOrConfig.hasLegend ?? true;\n for (const series of sourceOrConfig.series ?? []) this.series.add(series.name, series);\n }\n }\n\n get title(): string {\n return this.titleValue;\n }\n set title(value: string) {\n const normalized = normalizeLiveString(value, \"chart title\");\n if (normalized === this.titleValue) return;\n this.titleValue = normalized;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n get position(): { from: RangeAddress; to: RangeAddress } | null {\n return this.positionValue\n ? {\n from: { ...this.positionValue.from },\n to: { ...this.positionValue.to },\n }\n : null;\n }\n set position(value: { from: RangeAddress; to: RangeAddress } | null) {\n this.positionValue = normalizeChartPosition(value);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n\n setPosition(from: string, to: string): void {\n this.positionValue = {\n from: parseRangeAddress(from),\n to: parseRangeAddress(to),\n };\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n setData(range: Range): void {\n this.sourceRange = range;\n this.series.clear();\n this.inferSeries(range);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n inspectRecord(): Record<string, unknown> {\n return {\n kind: \"drawing\",\n objectKind: \"chart\",\n id: this.id,\n sheetId: this.worksheet.id,\n name: this.name,\n chartType: this.type,\n title: this.titleValue,\n sourceRange: this.sourceRange ? formatRangeAddress(this.sourceRange.address) : null,\n };\n }\n serialize(): SerializedChart {\n return {\n id: this.id,\n name: this.name,\n type: this.type,\n title: this.titleValue,\n hasLegend: this.hasLegend,\n sourceRange: this.sourceRange?.address ?? null,\n series: this.series.items.map((series) => series.toJSON()),\n position: this.position,\n };\n }\n\n private inferSeries(range: Range): void {\n const values = range.values;\n if (values.length < 2 || (values[0]?.length ?? 0) < 2) return;\n const firstRow = values[0]!;\n for (let col = 1; col < firstRow.length; col += 1) {\n const name = String(firstRow[col] ?? `Series ${col}`);\n const series = this.series.add(name);\n series.categoryFormula = `${quoteSheetName(range.worksheet.name)}!$${formatCellAddress({ row: range.address.row + 1, col: range.address.col }).replace(/([A-Z]+)(\\d+)/, \"$1$$$2\")}:$${formatCellAddress({ row: range.address.row + range.address.rowCount - 1, col: range.address.col }).replace(/([A-Z]+)(\\d+)/, \"$1$$$2\")}`;\n series.formula = `${quoteSheetName(range.worksheet.name)}!$${formatCellAddress({ row: range.address.row + 1, col: range.address.col + col }).replace(/([A-Z]+)(\\d+)/, \"$1$$$2\")}:$${formatCellAddress({ row: range.address.row + range.address.rowCount - 1, col: range.address.col + col }).replace(/([A-Z]+)(\\d+)/, \"$1$$$2\")}`;\n series.categories = values.slice(1).map((row) => String(row[0] ?? \"\"));\n series.values = values.slice(1).map((row) => {\n const value = Number(row[col] ?? 0);\n return Number.isFinite(value) ? value : 0;\n });\n }\n }\n}\n\nexport class ChartSeriesCollection {\n readonly items: SpreadsheetChartSeries[] = [];\n private attached = false;\n constructor(private readonly workbook: Workbook) {}\n add(name: string, config: Partial<SpreadsheetChartSeriesConfig> = {}): SpreadsheetChartSeries {\n const series = new SpreadsheetChartSeries(name, config);\n if (this.attached) {\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"chartSeries\");\n try {\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"chartPoints\", series.pointCount);\n } catch (cause) {\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"chartSeries\");\n throw cause;\n }\n }\n series[CONNECT_CHART_POINT_COUNTER]((delta) => this.adjustPoints(delta));\n this.items.push(series);\n return series;\n }\n clear(): void {\n if (this.attached && this.items.length > 0) {\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"chartSeries\", this.items.length);\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\n \"chartPoints\",\n this.items.reduce((count, series) => count + series.pointCount, 0),\n );\n }\n this.items.length = 0;\n }\n attach(): void {\n if (this.attached) return;\n const points = this.items.reduce((count, series) => count + series.pointCount, 0);\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"chartSeries\", this.items.length);\n try {\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"chartPoints\", points);\n } catch (cause) {\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"chartSeries\", this.items.length);\n throw cause;\n }\n this.attached = true;\n }\n detach(): void {\n if (!this.attached) return;\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"chartSeries\", this.items.length);\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\n \"chartPoints\",\n this.items.reduce((count, series) => count + series.pointCount, 0),\n );\n this.attached = false;\n }\n private adjustPoints(delta: number): void {\n if (!this.attached || delta === 0) return;\n if (delta > 0) {\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"chartPoints\", delta);\n } else {\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"chartPoints\", -delta);\n }\n }\n}\n\nexport class SpreadsheetChartSeries {\n private nameValue = \"\";\n private formulaValue: string | undefined;\n private categoryFormulaValue: string | undefined;\n private valuesValue: number[] | undefined;\n private categoriesValue: Array<string | number> | undefined;\n private fillValue: string | undefined;\n private onPointCountChange: (delta: number) => void = () => {};\n\n constructor(name: string, config: Partial<SpreadsheetChartSeriesConfig> = {}) {\n const record = snapshotRecord(\n config,\n \"chart series\",\n [],\n [\"name\", \"formula\", \"categoryFormula\", \"values\", \"categories\", \"fill\"],\n );\n this.name = name;\n if (record.formula !== undefined) this.formula = record.formula as string;\n if (record.categoryFormula !== undefined) {\n this.categoryFormula = record.categoryFormula as string;\n }\n if (record.values !== undefined) this.values = record.values as number[];\n if (record.categories !== undefined) {\n this.categories = record.categories as Array<string | number>;\n }\n if (record.fill !== undefined) this.fill = record.fill as string;\n }\n\n get name(): string {\n return this.nameValue;\n }\n set name(value: string) {\n this.nameValue = normalizeLiveString(value, \"chart series name\");\n }\n get formula(): string | undefined {\n return this.formulaValue;\n }\n set formula(value: string | undefined) {\n this.formulaValue = normalizeLiveFormula(value, \"chart series formula\");\n }\n get categoryFormula(): string | undefined {\n return this.categoryFormulaValue;\n }\n set categoryFormula(value: string | undefined) {\n this.categoryFormulaValue = normalizeLiveFormula(value, \"chart series category formula\");\n }\n get values(): number[] | undefined {\n return this.valuesValue?.slice();\n }\n set values(value: number[] | undefined) {\n if (value === undefined) {\n this.onPointCountChange(-(this.valuesValue?.length ?? 0));\n this.valuesValue = undefined;\n return;\n }\n const entries = snapshotArray(\n value,\n \"chart series values\",\n SPREADSHEET_SNAPSHOT_LIMITS.chartPointsTotal,\n );\n const normalized = entries.map((entry, index) =>\n snapshotFiniteNumber(entry, `chart series values[${index}]`),\n );\n if (this.categoriesValue && normalized.length !== this.categoriesValue.length) {\n throw new Error(\"Chart series values and categories must have equal length\");\n }\n this.onPointCountChange(normalized.length - (this.valuesValue?.length ?? 0));\n this.valuesValue = normalized;\n }\n get categories(): Array<string | number> | undefined {\n return this.categoriesValue?.slice();\n }\n set categories(value: Array<string | number> | undefined) {\n if (value === undefined) {\n this.onPointCountChange(-(this.categoriesValue?.length ?? 0));\n this.categoriesValue = undefined;\n return;\n }\n const entries = snapshotArray(\n value,\n \"chart series categories\",\n SPREADSHEET_SNAPSHOT_LIMITS.chartPointsTotal,\n );\n const normalized = entries.map((entry, index) => {\n if (typeof entry === \"string\") {\n return normalizeLiveString(entry, `chart series categories[${index}]`);\n }\n return snapshotFiniteNumber(entry, `chart series categories[${index}]`);\n });\n if (this.valuesValue && normalized.length !== this.valuesValue.length) {\n throw new Error(\"Chart series values and categories must have equal length\");\n }\n this.onPointCountChange(normalized.length - (this.categoriesValue?.length ?? 0));\n this.categoriesValue = normalized;\n }\n get fill(): string | undefined {\n return this.fillValue;\n }\n set fill(value: string | undefined) {\n this.fillValue =\n value === undefined ? undefined : normalizeLiveString(value, \"chart series fill\");\n }\n\n get pointCount(): number {\n return (this.valuesValue?.length ?? 0) + (this.categoriesValue?.length ?? 0);\n }\n\n [CONNECT_CHART_POINT_COUNTER](counter: (delta: number) => void): void {\n this.onPointCountChange = counter;\n }\n\n toJSON(): SpreadsheetChartSeriesConfig {\n return {\n name: this.nameValue,\n ...(this.formulaValue ? { formula: this.formulaValue } : {}),\n ...(this.categoryFormulaValue ? { categoryFormula: this.categoryFormulaValue } : {}),\n ...(this.valuesValue ? { values: [...this.valuesValue] } : {}),\n ...(this.categoriesValue ? { categories: [...this.categoriesValue] } : {}),\n ...(this.fillValue ? { fill: this.fillValue } : {}),\n };\n }\n}\n\nexport class ShapeCollection {\n readonly items: SpreadsheetShape[] = [];\n constructor(private readonly worksheet: Worksheet) {}\n add(_config: Record<string, unknown>): SpreadsheetShape {\n throw new UnsupportedArtifactFeatureError(\n \"spreadsheet\",\n \"Spreadsheet shapes\",\n \"current spreadsheet engine\",\n );\n }\n deleteAll(): void {\n if (this.items.length > 0) {\n this.items.length = 0;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n }\n}\nexport class SpreadsheetShape {\n readonly id: string;\n constructor(\n readonly worksheet: Worksheet,\n readonly config: Record<string, unknown>,\n ) {\n this.id = worksheet.workbook.allocateId(\"sh\", this);\n }\n}\n\nexport class ImageCollection {\n readonly items: SpreadsheetImage[] = [];\n constructor(private readonly worksheet: Worksheet) {}\n add(config: SpreadsheetImageConfig): SpreadsheetImage {\n snapshotLimit(\n \"worksheet image count\",\n this.items.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.imagesPerSheet,\n );\n const normalized = normalizeSpreadsheetImageConfig(config);\n const usage = canonicalImageUsage(normalized);\n const workbook = this.worksheet.workbook;\n workbook[RESERVE_WORKBOOK_RESOURCE](\"images\");\n try {\n workbook[RESERVE_WORKBOOK_RESOURCE](\"imageBytes\", usage.imageBytes);\n try {\n workbook[RESERVE_WORKBOOK_RESOURCE](\"imageDataUrlBytes\", usage.dataUrlBytes);\n } catch (cause) {\n workbook[RELEASE_WORKBOOK_RESOURCE](\"imageBytes\", usage.imageBytes);\n throw cause;\n }\n } catch (cause) {\n workbook[RELEASE_WORKBOOK_RESOURCE](\"images\");\n throw cause;\n }\n const image = new SpreadsheetImage(this.worksheet, normalized);\n this.items.push(image);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n return image;\n }\n deleteAll(): void {\n if (this.items.length > 0) {\n let imageBytes = 0;\n let dataUrlBytes = 0;\n for (const image of this.items) {\n const usage = canonicalImageUsage(image.config);\n imageBytes += usage.imageBytes;\n dataUrlBytes += usage.dataUrlBytes;\n }\n const workbook = this.worksheet.workbook;\n workbook[RELEASE_WORKBOOK_RESOURCE](\"images\", this.items.length);\n workbook[RELEASE_WORKBOOK_RESOURCE](\"imageBytes\", imageBytes);\n workbook[RELEASE_WORKBOOK_RESOURCE](\"imageDataUrlBytes\", dataUrlBytes);\n this.items.length = 0;\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n }\n}\nexport class SpreadsheetImage {\n readonly id: string;\n constructor(\n private readonly worksheet: Worksheet,\n readonly config: SpreadsheetImageConfig,\n ) {\n this.id = worksheet.workbook.allocateId(\"im\", this);\n }\n inspectRecord(): Record<string, unknown> {\n return {\n kind: \"drawing\",\n objectKind: \"image\",\n id: this.id,\n sheetId: this.worksheet.id,\n alt: this.config.alt ?? null,\n anchor: this.config.anchor,\n };\n }\n}\n\nexport class DataValidationCollection {\n private readonly entries: Array<{\n range: RangeAddress;\n config: DataValidationConfig;\n }> = [];\n constructor(private readonly worksheet: Worksheet) {}\n add(input: { range: string; rule: Record<string, unknown> }): void {\n const range = parseRangeAddress(input.range);\n const config = Object.freeze({\n rule: normalizeConfigRecord(input.rule, \"data validation rule\"),\n });\n const index = this.entries.findIndex((entry) => sameRange(entry.range, range));\n if (index < 0) {\n snapshotLimit(\n \"worksheet data validation count\",\n this.entries.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.dataValidationsPerSheet,\n );\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"dataValidations\");\n this.entries.push({ range: Object.freeze({ ...range }), config });\n } else {\n this.entries[index] = { range: Object.freeze({ ...range }), config };\n }\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n get(range: RangeAddress): DataValidationConfig | null {\n const config = this.entries.find((entry) => sameRange(entry.range, range))?.config;\n return config ? structuredClone(config) : null;\n }\n remove(range: RangeAddress): void {\n const index = this.entries.findIndex((entry) => sameRange(entry.range, range));\n if (index >= 0) {\n this.entries.splice(index, 1);\n this.worksheet.workbook[RELEASE_WORKBOOK_RESOURCE](\"dataValidations\");\n this.worksheet.workbook.markChanged(this.worksheet.id, \"structure\");\n }\n }\n all(): readonly { range: RangeAddress; config: DataValidationConfig }[] {\n return this.entries.map((entry) => ({\n range: { ...entry.range },\n config: structuredClone(entry.config),\n }));\n }\n serialize(): SerializedDataValidation[] {\n return this.entries.map((entry) => ({\n range: { ...entry.range },\n config: structuredClone(entry.config),\n }));\n }\n restore(entries: readonly SerializedDataValidation[]): void {\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"dataValidations\", entries.length);\n for (const entry of entries) {\n this.entries.push({\n range: Object.freeze({ ...entry.range }),\n config: Object.freeze({\n rule: normalizeConfigRecord(entry.config.rule, \"restored data validation rule\"),\n }),\n });\n }\n }\n}\n\nexport class ConditionalFormattingCollection {\n private readonly entries: Array<{\n range: RangeAddress;\n ruleType: string;\n config: ConditionalFormatConfig;\n }> = [];\n constructor(private readonly worksheet: Worksheet) {}\n add(range: RangeAddress, ruleType: string, config: ConditionalFormatConfig): void {\n snapshotLimit(\n \"worksheet conditional format count\",\n this.entries.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.conditionalFormatsPerSheet,\n );\n const normalizedRuleType = normalizeConditionalFormatRuleType(ruleType);\n const normalizedConfig = normalizeConfigRecord(config, \"conditional format config\");\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"conditionalFormats\");\n this.entries.push({\n range: Object.freeze({ ...range }),\n ruleType: normalizedRuleType,\n config: normalizedConfig,\n });\n this.worksheet.workbook.markChanged(this.worksheet.id, \"format\");\n }\n clear(range?: RangeAddress): void {\n let removed = 0;\n if (!range) {\n removed = this.entries.length;\n this.entries.length = 0;\n } else {\n let write = 0;\n for (const entry of this.entries)\n if (!sameRange(entry.range, range)) this.entries[write++] = entry;\n else removed += 1;\n this.entries.length = write;\n }\n if (removed === 0) return;\n this.worksheet.workbook[RELEASE_WORKBOOK_RESOURCE](\"conditionalFormats\", removed);\n this.worksheet.workbook.markChanged(this.worksheet.id, \"format\");\n }\n all(): readonly {\n range: RangeAddress;\n ruleType: string;\n config: ConditionalFormatConfig;\n }[] {\n return this.entries.map((entry) => ({\n range: { ...entry.range },\n ruleType: entry.ruleType,\n config: structuredClone(entry.config),\n }));\n }\n serialize(): SerializedConditionalFormatting[] {\n return this.entries.map((entry) => ({\n range: { ...entry.range },\n ruleType: entry.ruleType,\n config: structuredClone(entry.config),\n }));\n }\n restore(entries: readonly SerializedConditionalFormatting[]): void {\n this.worksheet.workbook[RESERVE_WORKBOOK_RESOURCE](\"conditionalFormats\", entries.length);\n for (const entry of entries) {\n this.entries.push({\n range: Object.freeze({ ...entry.range }),\n ruleType: normalizeConditionalFormatRuleType(entry.ruleType),\n config: normalizeConfigRecord(entry.config, \"restored conditional format config\"),\n });\n }\n }\n}\n\nconst CONDITIONAL_FORMAT_RULE_TYPES = new Map<string, string>([\n [\"cellis\", \"cellIs\"],\n [\"cellvalue\", \"cellIs\"],\n [\"custom\", \"expression\"],\n [\"expression\", \"expression\"],\n [\"colorscale\", \"colorScale\"],\n [\"databar\", \"dataBar\"],\n [\"iconset\", \"iconSet\"],\n [\"containstext\", \"containsText\"],\n [\"notcontainstext\", \"notContainsText\"],\n [\"beginswith\", \"beginsWith\"],\n [\"endswith\", \"endsWith\"],\n [\"containsblanks\", \"containsBlanks\"],\n [\"notcontainsblanks\", \"notContainsBlanks\"],\n [\"containserrors\", \"containsErrors\"],\n [\"notcontainserrors\", \"notContainsErrors\"],\n [\"duplicatevalues\", \"duplicateValues\"],\n [\"uniquevalues\", \"uniqueValues\"],\n [\"timeperiod\", \"timePeriod\"],\n [\"top10\", \"top10\"],\n [\"aboveaverage\", \"aboveAverage\"],\n]);\n\nfunction normalizeConditionalFormatRuleType(value: unknown): string {\n const raw = normalizeLiveString(value, \"conditional format rule type\");\n const normalized = CONDITIONAL_FORMAT_RULE_TYPES.get(raw.toLowerCase());\n if (!normalized) throw new TypeError(`Unsupported conditional format rule type: ${raw}`);\n return normalized;\n}\n\nexport class RangeConditionalFormats {\n constructor(private readonly range: Range) {}\n add(ruleType: string, config: ConditionalFormatConfig): void {\n this.range.worksheet.conditionalFormattings.add(this.range.address, ruleType, config);\n }\n addCustom(expression: string, format: ConditionalFormatConfig): void {\n this.add(\"expression\", { formula: expression, format });\n }\n deleteAll(): void {\n this.range.worksheet.conditionalFormattings.clear(this.range.address);\n }\n clear(): void {\n this.deleteAll();\n }\n}\n\nexport class RangeSparklines {\n constructor(private readonly range: Range) {}\n\n add(\n type: SpreadsheetSparklineType,\n sourceRange: Range | string,\n config: RangeSparklineConfig = {},\n ): SparklineGroup {\n return this.range.worksheet.sparklineGroups.add({\n ...config,\n type,\n targetRange: this.range,\n sourceData: sourceRange,\n });\n }\n\n deleteAll(): void {\n this.range.worksheet.sparklineGroups.removeInRange(this.range.address);\n }\n\n clear(): void {\n this.deleteAll();\n }\n}\n\nexport class SparklineGroupCollection {\n readonly items: SparklineGroup[] = [];\n private targetCellCount = 0;\n private sourcePointCount = 0;\n\n constructor(private readonly worksheet: Worksheet) {}\n\n add(config: SparklineConfig): SparklineGroup {\n const normalized = normalizeSparklineConfig(this.worksheet, config);\n return this.insert(normalized, true);\n }\n\n deleteAll(): void {\n if (this.items.length === 0) return;\n const workbook = this.worksheet.workbook;\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineGroups\", this.items.length);\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineCells\", this.targetCellCount);\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklinePoints\", this.sourcePointCount);\n this.items.length = 0;\n this.targetCellCount = 0;\n this.sourcePointCount = 0;\n workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n\n removeInRange(range: RangeAddress): void {\n const matches = this.items.filter((group) => rangesOverlap(group.targetRange.address, range));\n if (matches.length === 0) return;\n this.worksheet.workbook.transact(() => {\n for (const group of matches) this.remove(group);\n });\n }\n\n remove(group: SparklineGroup): void {\n const index = this.items.indexOf(group);\n if (index < 0) return;\n const usage = group.resourceUsage;\n this.items.splice(index, 1);\n this.targetCellCount -= usage.targetCells;\n this.sourcePointCount -= usage.readPoints;\n const workbook = this.worksheet.workbook;\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineGroups\");\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineCells\", usage.targetCells);\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklinePoints\", usage.readPoints);\n workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n\n restore(serialized: SerializedSparklineGroup): void {\n const sourceSheet = this.worksheet.workbook.worksheets.getItem(serialized.sourceData.sheetId);\n const dateAxisSheet = serialized.dateAxisRange\n ? this.worksheet.workbook.worksheets.getItem(serialized.dateAxisRange.sheetId)\n : null;\n this.insert(\n {\n existingId: serialized.id,\n type: serialized.type,\n targetRange: new Range(this.worksheet, serialized.targetRange),\n sourceData: new Range(sourceSheet, serialized.sourceData.address),\n dateAxisRange: serialized.dateAxisRange\n ? new Range(dateAxisSheet!, serialized.dateAxisRange.address)\n : null,\n lineWeight: serialized.lineWeight,\n displayHidden: serialized.displayHidden,\n displayEmptyCellsAs: serialized.displayEmptyCellsAs,\n seriesColor: serialized.seriesColor,\n negativeColor: serialized.negativeColor,\n axisColor: serialized.axisColor,\n markersColor: serialized.markersColor,\n firstMarkerColor: serialized.firstMarkerColor,\n lastMarkerColor: serialized.lastMarkerColor,\n highMarkerColor: serialized.highMarkerColor,\n lowMarkerColor: serialized.lowMarkerColor,\n markers: Object.freeze({ ...serialized.markers }),\n axis: Object.freeze({ ...serialized.axis }),\n },\n false,\n );\n }\n\n private insert(state: NormalizedSparklineGroup, markChanged: boolean): SparklineGroup {\n snapshotLimit(\n \"worksheet sparkline group count\",\n this.items.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklineGroupsPerSheet,\n );\n if (\n this.items.some((group) =>\n rangesOverlap(group.targetRange.address, state.targetRange.address),\n )\n ) {\n throw new Error(\"Sparkline target range overlaps an existing sparkline group\");\n }\n const dimensions = sparklineDimensions(\n state.targetRange.address,\n state.sourceData.address,\n state.dateAxisRange?.address ?? null,\n \"sparkline\",\n );\n const readPoints =\n dimensions.sourcePoints + (state.dateAxisRange ? dimensions.pointsPerSparkline : 0);\n snapshotLimit(\n \"worksheet sparkline cell count\",\n this.targetCellCount + dimensions.targetCells,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklineCellsPerSheet,\n );\n snapshotLimit(\n \"worksheet sparkline source point count\",\n this.sourcePointCount + readPoints,\n SPREADSHEET_SNAPSHOT_LIMITS.sparklinePointsPerSheet,\n );\n\n const workbook = this.worksheet.workbook;\n workbook[RESERVE_WORKBOOK_RESOURCE](\"sparklineGroups\");\n try {\n workbook[RESERVE_WORKBOOK_RESOURCE](\"sparklineCells\", dimensions.targetCells);\n try {\n workbook[RESERVE_WORKBOOK_RESOURCE](\"sparklinePoints\", readPoints);\n } catch (cause) {\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineCells\", dimensions.targetCells);\n throw cause;\n }\n } catch (cause) {\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineGroups\");\n throw cause;\n }\n\n let group: SparklineGroup;\n try {\n group = new SparklineGroup(this, this.worksheet, state, {\n targetCells: dimensions.targetCells,\n readPoints,\n pointsPerSparkline: dimensions.pointsPerSparkline,\n });\n } catch (cause) {\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineGroups\");\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklineCells\", dimensions.targetCells);\n workbook[RELEASE_WORKBOOK_RESOURCE](\"sparklinePoints\", readPoints);\n throw cause;\n }\n this.items.push(group);\n this.targetCellCount += dimensions.targetCells;\n this.sourcePointCount += readPoints;\n if (markChanged) workbook.markChanged(this.worksheet.id, \"drawing\");\n return group;\n }\n}\n\ntype NormalizedSparklineGroup = {\n existingId?: string;\n type: SpreadsheetSparklineType;\n targetRange: Range;\n sourceData: Range;\n dateAxisRange: Range | null;\n lineWeight: number;\n displayHidden: boolean;\n displayEmptyCellsAs: 0 | 1 | 2;\n seriesColor: string | null;\n negativeColor: string | null;\n axisColor: string | null;\n markersColor: string | null;\n firstMarkerColor: string | null;\n lastMarkerColor: string | null;\n highMarkerColor: string | null;\n lowMarkerColor: string | null;\n markers: Readonly<Required<SpreadsheetSparklineMarkersOptions>>;\n axis: Readonly<{\n showAxis: boolean;\n manualMin: number | null;\n manualMax: number | null;\n rightToLeft: boolean;\n }>;\n};\n\nexport class SparklineGroup {\n readonly id: string;\n readonly targetRange: Range;\n readonly sourceData: Range;\n readonly dateAxisRange: Range | null;\n readonly resourceUsage: Readonly<{\n targetCells: number;\n readPoints: number;\n pointsPerSparkline: number;\n }>;\n private typeValue: SpreadsheetSparklineType;\n private lineWeightValue: number;\n private displayHiddenValue: boolean;\n private displayEmptyCellsAsValue: 0 | 1 | 2;\n private seriesColorValue: string | null;\n private negativeColorValue: string | null;\n private axisColorValue: string | null;\n private markersColorValue: string | null;\n private firstMarkerColorValue: string | null;\n private lastMarkerColorValue: string | null;\n private highMarkerColorValue: string | null;\n private lowMarkerColorValue: string | null;\n private markersValue: Readonly<Required<SpreadsheetSparklineMarkersOptions>>;\n private axisValue: Readonly<{\n showAxis: boolean;\n manualMin: number | null;\n manualMax: number | null;\n rightToLeft: boolean;\n }>;\n\n constructor(\n private readonly collection: SparklineGroupCollection,\n private readonly worksheet: Worksheet,\n state: NormalizedSparklineGroup,\n usage: { targetCells: number; readPoints: number; pointsPerSparkline: number },\n ) {\n this.id = state.existingId ?? worksheet.workbook.allocateId(\"sp\", this);\n if (state.existingId) worksheet.workbook.registerId(state.existingId, this);\n this.typeValue = state.type;\n this.targetRange = state.targetRange;\n this.sourceData = state.sourceData;\n this.dateAxisRange = state.dateAxisRange;\n this.lineWeightValue = state.lineWeight;\n this.displayHiddenValue = state.displayHidden;\n this.displayEmptyCellsAsValue = state.displayEmptyCellsAs;\n this.seriesColorValue = state.seriesColor;\n this.negativeColorValue = state.negativeColor;\n this.axisColorValue = state.axisColor;\n this.markersColorValue = state.markersColor;\n this.firstMarkerColorValue = state.firstMarkerColor;\n this.lastMarkerColorValue = state.lastMarkerColor;\n this.highMarkerColorValue = state.highMarkerColor;\n this.lowMarkerColorValue = state.lowMarkerColor;\n this.markersValue = state.markers;\n this.axisValue = state.axis;\n this.resourceUsage = Object.freeze({ ...usage });\n }\n\n get type(): SpreadsheetSparklineType {\n return this.typeValue;\n }\n set type(value: SpreadsheetSparklineType) {\n const normalized = normalizeSparklineType(value);\n if (normalized === this.typeValue) return;\n this.typeValue = normalized;\n this.changed();\n }\n get lineWeight(): number {\n return this.lineWeightValue;\n }\n set lineWeight(value: number) {\n const normalized = normalizeSparklineLineWeight(value);\n if (normalized === this.lineWeightValue) return;\n this.lineWeightValue = normalized;\n this.changed();\n }\n get displayHidden(): boolean {\n return this.displayHiddenValue;\n }\n set displayHidden(value: boolean) {\n if (typeof value !== \"boolean\") throw new TypeError(\"sparkline displayHidden must be boolean\");\n if (value === this.displayHiddenValue) return;\n this.displayHiddenValue = value;\n this.changed();\n }\n get displayEmptyCellsAs(): 0 | 1 | 2 {\n return this.displayEmptyCellsAsValue;\n }\n set displayEmptyCellsAs(value: 0 | 1 | 2) {\n const normalized = snapshotInteger(value, \"sparkline displayEmptyCellsAs\", 0, 2) as 0 | 1 | 2;\n if (normalized === this.displayEmptyCellsAsValue) return;\n this.displayEmptyCellsAsValue = normalized;\n this.changed();\n }\n\n get seriesColor(): string | undefined {\n return this.seriesColorValue ?? undefined;\n }\n set seriesColor(value: string | undefined) {\n this.setColor(\"seriesColorValue\", value, \"series color\");\n }\n get negativeColor(): string | undefined {\n return this.negativeColorValue ?? undefined;\n }\n set negativeColor(value: string | undefined) {\n this.setColor(\"negativeColorValue\", value, \"negative color\");\n }\n get axisColor(): string | undefined {\n return this.axisColorValue ?? undefined;\n }\n set axisColor(value: string | undefined) {\n this.setColor(\"axisColorValue\", value, \"axis color\");\n }\n get markersColor(): string | undefined {\n return this.markersColorValue ?? undefined;\n }\n set markersColor(value: string | undefined) {\n this.setColor(\"markersColorValue\", value, \"markers color\");\n }\n get firstMarkerColor(): string | undefined {\n return this.firstMarkerColorValue ?? undefined;\n }\n set firstMarkerColor(value: string | undefined) {\n this.setColor(\"firstMarkerColorValue\", value, \"first marker color\");\n }\n get lastMarkerColor(): string | undefined {\n return this.lastMarkerColorValue ?? undefined;\n }\n set lastMarkerColor(value: string | undefined) {\n this.setColor(\"lastMarkerColorValue\", value, \"last marker color\");\n }\n get highMarkerColor(): string | undefined {\n return this.highMarkerColorValue ?? undefined;\n }\n set highMarkerColor(value: string | undefined) {\n this.setColor(\"highMarkerColorValue\", value, \"high marker color\");\n }\n get lowMarkerColor(): string | undefined {\n return this.lowMarkerColorValue ?? undefined;\n }\n set lowMarkerColor(value: string | undefined) {\n this.setColor(\"lowMarkerColorValue\", value, \"low marker color\");\n }\n get markers(): Readonly<Required<SpreadsheetSparklineMarkersOptions>> {\n return this.markersValue;\n }\n set markers(value: SpreadsheetSparklineMarkersOptions) {\n this.markersValue = normalizeSparklineMarkers(value);\n this.changed();\n }\n get axis(): Readonly<SpreadsheetSparklineAxisOptions> {\n return Object.freeze({\n showAxis: this.axisValue.showAxis,\n ...(this.axisValue.manualMin === null ? {} : { manualMin: this.axisValue.manualMin }),\n ...(this.axisValue.manualMax === null ? {} : { manualMax: this.axisValue.manualMax }),\n rightToLeft: this.axisValue.rightToLeft,\n });\n }\n set axis(value: SpreadsheetSparklineAxisOptions) {\n this.axisValue = normalizeSparklineAxis(value);\n this.changed();\n }\n\n delete(): void {\n this.collection.remove(this);\n }\n\n valuesForTargetCell(row: number, col: number): readonly (number | null)[] {\n const target = this.targetRange.address;\n if (\n row < target.row ||\n col < target.col ||\n row >= target.row + target.rowCount ||\n col >= target.col + target.colCount\n ) {\n return [];\n }\n const source = this.sourceData.address;\n const targetIndex =\n target.rowCount > 1 ? row - target.row : target.colCount > 1 ? col - target.col : 0;\n const values: Array<number | null> = [];\n if (this.resourceUsage.targetCells === 1) {\n if (source.rowCount === 1) {\n for (let offset = 0; offset < source.colCount; offset += 1) {\n values.push(this.numericValueAt(source.row, source.col + offset));\n }\n } else {\n for (let offset = 0; offset < source.rowCount; offset += 1) {\n values.push(this.numericValueAt(source.row + offset, source.col));\n }\n }\n } else if (target.rowCount > 1) {\n for (let offset = 0; offset < source.colCount; offset += 1) {\n values.push(this.numericValueAt(source.row + targetIndex, source.col + offset));\n }\n } else {\n for (let offset = 0; offset < source.rowCount; offset += 1) {\n values.push(this.numericValueAt(source.row + offset, source.col + targetIndex));\n }\n }\n if (this.displayEmptyCellsAsValue === 1) {\n return values.map((value) => value ?? 0);\n }\n return values;\n }\n\n dateAxisValues(): readonly (number | null)[] | null {\n if (!this.dateAxisRange) return null;\n const address = this.dateAxisRange.address;\n const values: Array<number | null> = [];\n const append = (row: number, col: number): void => {\n const value = this.dateAxisRange!.worksheet.workbook.valueAt(this.dateAxisRange!.worksheet, {\n row,\n col,\n });\n values.push(\n typeof value === \"number\" && Number.isFinite(value)\n ? value\n : value instanceof Date\n ? Date.prototype.getTime.call(value)\n : null,\n );\n };\n if (address.rowCount === 1) {\n for (let offset = 0; offset < address.colCount; offset += 1)\n append(address.row, address.col + offset);\n } else {\n for (let offset = 0; offset < address.rowCount; offset += 1)\n append(address.row + offset, address.col);\n }\n return values;\n }\n\n inspectRecord(): Record<string, unknown> {\n return {\n kind: \"drawing\",\n objectKind: \"sparklineGroup\",\n id: this.id,\n sheetId: this.worksheet.id,\n type: this.typeValue,\n targetRange: formatRangeAddress(this.targetRange.address),\n sourceData: {\n sheetId: this.sourceData.worksheet.id,\n sheetName: this.sourceData.worksheet.name,\n range: formatRangeAddress(this.sourceData.address),\n },\n dateAxisRange: this.dateAxisRange\n ? {\n sheetId: this.dateAxisRange.worksheet.id,\n sheetName: this.dateAxisRange.worksheet.name,\n range: formatRangeAddress(this.dateAxisRange.address),\n }\n : null,\n targetCells: this.resourceUsage.targetCells,\n pointsPerSparkline: this.resourceUsage.pointsPerSparkline,\n lineWeight: this.lineWeightValue,\n displayHidden: this.displayHiddenValue,\n displayEmptyCellsAs: this.displayEmptyCellsAsValue,\n colors: {\n series: this.seriesColorValue,\n negative: this.negativeColorValue,\n axis: this.axisColorValue,\n markers: this.markersColorValue,\n first: this.firstMarkerColorValue,\n last: this.lastMarkerColorValue,\n high: this.highMarkerColorValue,\n low: this.lowMarkerColorValue,\n },\n markers: this.markersValue,\n axis: this.axis,\n };\n }\n\n serialize(): SerializedSparklineGroup {\n return {\n id: this.id,\n type: this.typeValue,\n targetRange: { ...this.targetRange.address },\n sourceData: {\n sheetId: this.sourceData.worksheet.id,\n address: { ...this.sourceData.address },\n },\n dateAxisRange: this.dateAxisRange\n ? {\n sheetId: this.dateAxisRange.worksheet.id,\n address: { ...this.dateAxisRange.address },\n }\n : null,\n lineWeight: this.lineWeightValue,\n displayHidden: this.displayHiddenValue,\n displayEmptyCellsAs: this.displayEmptyCellsAsValue,\n seriesColor: this.seriesColorValue,\n negativeColor: this.negativeColorValue,\n axisColor: this.axisColorValue,\n markersColor: this.markersColorValue,\n firstMarkerColor: this.firstMarkerColorValue,\n lastMarkerColor: this.lastMarkerColorValue,\n highMarkerColor: this.highMarkerColorValue,\n lowMarkerColor: this.lowMarkerColorValue,\n markers: { ...this.markersValue },\n axis: { ...this.axisValue },\n };\n }\n\n private numericValueAt(row: number, col: number): number | null {\n const value = this.sourceData.worksheet.workbook.valueAt(this.sourceData.worksheet, {\n row,\n col,\n });\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n }\n\n private setColor(\n key:\n | \"seriesColorValue\"\n | \"negativeColorValue\"\n | \"axisColorValue\"\n | \"markersColorValue\"\n | \"firstMarkerColorValue\"\n | \"lastMarkerColorValue\"\n | \"highMarkerColorValue\"\n | \"lowMarkerColorValue\",\n value: string | undefined,\n label: string,\n ): void {\n const normalized = value === undefined ? null : normalizeSparklineColor(value, label);\n if (this[key] === normalized) return;\n this[key] = normalized;\n this.changed();\n }\n\n private changed(): void {\n this.worksheet.workbook.markChanged(this.worksheet.id, \"drawing\");\n }\n}\n\nexport class WorkbookComments {\n readonly items: CommentThread[] = [];\n private displayName = \"User\";\n constructor(private readonly workbook: Workbook) {}\n setSelf(input: { displayName: string }): void {\n const name = normalizeLiveString(input.displayName, \"comment display name\").trim();\n if (!name) throw new Error(\"Comment display name is required\");\n this.displayName = name;\n }\n addThread(target: { cell: Range }, text: string): CommentThread {\n const normalizedText = normalizeLiveString(text, \"comment text\");\n snapshotLimit(\n \"workbook comment thread count\",\n this.items.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.commentThreads,\n );\n if (target.cell.worksheet.workbook !== this.workbook) {\n throw new Error(\"Comment target belongs to another workbook\");\n }\n if (target.cell.address.rowCount !== 1 || target.cell.address.colCount !== 1)\n throw new Error(\"Comments must target one cell\");\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"commentThreads\");\n try {\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"comments\");\n } catch (cause) {\n this.workbook[RELEASE_WORKBOOK_RESOURCE](\"commentThreads\");\n throw cause;\n }\n const thread = new CommentThread(\n this.workbook,\n target.cell.worksheet,\n { row: target.cell.address.row, col: target.cell.address.col },\n this.displayName,\n normalizedText,\n );\n this.items.push(thread);\n this.workbook.markChanged(target.cell.worksheet.id, \"comment\");\n return thread;\n }\n restore(serialized: SerializedCommentThread): void {\n const worksheet = this.workbook.worksheets.getItem(serialized.sheetId);\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"commentThreads\");\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"comments\", serialized.comments.length);\n this.items.push(CommentThread.restore(this.workbook, worksheet, serialized));\n }\n}\n\nexport class CommentThread {\n readonly id: string;\n private resolvedValue = false;\n readonly comments: Array<{\n author: string;\n text: string;\n createdAt: string;\n }> = [];\n private readonly cell: CellAddress;\n constructor(\n private readonly workbook: Workbook,\n private readonly worksheet: Worksheet,\n cell: CellAddress,\n author: string,\n text: string,\n existingId?: string,\n ) {\n this.cell = { row: cell.row, col: cell.col };\n this.id = existingId ?? workbook.allocateId(\"th\", this);\n if (existingId) workbook.registerId(existingId, this);\n this.comments.push({\n author: normalizeLiveString(author, \"comment author\"),\n text: normalizeLiveString(text, \"comment text\"),\n createdAt: new Date().toISOString(),\n });\n }\n addReply(text: string): void {\n snapshotLimit(\n \"comment thread reply count\",\n this.comments.length + 1,\n SPREADSHEET_SNAPSHOT_LIMITS.commentsPerThread,\n );\n this.workbook[RESERVE_WORKBOOK_RESOURCE](\"comments\");\n this.comments.push({\n author: \"User\",\n text: normalizeLiveString(text, \"comment reply\"),\n createdAt: new Date().toISOString(),\n });\n this.workbook.markChanged(this.worksheet.id, \"comment\");\n }\n resolve(): void {\n this.resolvedValue = true;\n this.workbook.markChanged(this.worksheet.id, \"comment\");\n }\n reopen(): void {\n this.resolvedValue = false;\n this.workbook.markChanged(this.worksheet.id, \"comment\");\n }\n inspectRecord(): Record<string, unknown> {\n return {\n kind: \"thread\",\n id: this.id,\n sheetId: this.worksheet.id,\n cell: formatCellAddress(this.cell),\n resolved: this.resolvedValue,\n comments: this.comments,\n };\n }\n serialize(): SerializedCommentThread {\n return {\n id: this.id,\n sheetId: this.worksheet.id,\n cell: this.cell,\n resolved: this.resolvedValue,\n comments: this.comments.map((comment) => ({ ...comment })),\n };\n }\n static restore(\n workbook: Workbook,\n worksheet: Worksheet,\n serialized: SerializedCommentThread,\n ): CommentThread {\n const first = serialized.comments[0] ?? {\n author: \"User\",\n text: \"\",\n createdAt: new Date(0).toISOString(),\n };\n const thread = new CommentThread(\n workbook,\n worksheet,\n serialized.cell,\n first.author,\n first.text,\n serialized.id,\n );\n thread.comments.length = 0;\n thread.comments.push(...serialized.comments.map((comment) => ({ ...comment })));\n thread.resolvedValue = serialized.resolved;\n return thread;\n }\n}\n\nfunction normalizeCellValue(value: CellValue | undefined): CellValue {\n if (value === undefined || value === null || typeof value === \"boolean\") {\n return value ?? null;\n }\n if (typeof value === \"string\") return normalizeLiveString(value, \"cell value\");\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new TypeError(\"Cell numbers must be finite\");\n return value;\n }\n if (value instanceof Date) {\n const timestamp = Date.prototype.getTime.call(value);\n if (!Number.isFinite(timestamp)) throw new TypeError(\"Cell dates must be valid\");\n return new Date(timestamp);\n }\n throw new TypeError(\"Unsupported spreadsheet cell value\");\n}\n\nfunction normalizeLiveString(value: unknown, label: string): string {\n if (typeof value !== \"string\") throw new TypeError(`${label} must be a string`);\n boundedUtf8Bytes(value, SPREADSHEET_SNAPSHOT_LIMITS.stringBytesEach, label);\n return value;\n}\n\nfunction normalizeSparklineConfig(\n worksheet: Worksheet,\n input: SparklineConfig,\n): NormalizedSparklineGroup {\n const config = snapshotRecord(\n input,\n \"sparkline config\",\n [\"type\", \"targetRange\", \"sourceData\"],\n [\n \"dateAxisRange\",\n \"lineWeight\",\n \"displayHidden\",\n \"displayEmptyCellsAs\",\n \"seriesColor\",\n \"negativeColor\",\n \"axisColor\",\n \"markersColor\",\n \"firstMarkerColor\",\n \"lastMarkerColor\",\n \"highMarkerColor\",\n \"lowMarkerColor\",\n \"markers\",\n \"axis\",\n ],\n );\n const targetRange = resolveSparklineRange(worksheet, config.targetRange, \"sparkline targetRange\");\n if (targetRange.worksheet !== worksheet) {\n throw new Error(\"Sparkline targetRange must belong to the target worksheet\");\n }\n const sourceData = resolveSparklineRange(worksheet, config.sourceData, \"sparkline sourceData\");\n const dateAxisRange =\n config.dateAxisRange === undefined\n ? null\n : resolveSparklineRange(worksheet, config.dateAxisRange, \"sparkline dateAxisRange\");\n sparklineDimensions(\n targetRange.address,\n sourceData.address,\n dateAxisRange?.address ?? null,\n \"sparkline config\",\n );\n\n return {\n type: normalizeSparklineType(config.type),\n targetRange,\n sourceData,\n dateAxisRange,\n lineWeight:\n config.lineWeight === undefined ? 1 : normalizeSparklineLineWeight(config.lineWeight),\n displayHidden:\n config.displayHidden === undefined\n ? false\n : snapshotBoolean(config.displayHidden, \"sparkline displayHidden\"),\n displayEmptyCellsAs:\n config.displayEmptyCellsAs === undefined\n ? 0\n : (snapshotInteger(config.displayEmptyCellsAs, \"sparkline displayEmptyCellsAs\", 0, 2) as\n | 0\n | 1\n | 2),\n seriesColor: normalizeOptionalSparklineColor(config.seriesColor, \"sparkline series color\"),\n negativeColor: normalizeOptionalSparklineColor(\n config.negativeColor,\n \"sparkline negative color\",\n ),\n axisColor: normalizeOptionalSparklineColor(config.axisColor, \"sparkline axis color\"),\n markersColor: normalizeOptionalSparklineColor(config.markersColor, \"sparkline markers color\"),\n firstMarkerColor: normalizeOptionalSparklineColor(\n config.firstMarkerColor,\n \"sparkline first marker color\",\n ),\n lastMarkerColor: normalizeOptionalSparklineColor(\n config.lastMarkerColor,\n \"sparkline last marker color\",\n ),\n highMarkerColor: normalizeOptionalSparklineColor(\n config.highMarkerColor,\n \"sparkline high marker color\",\n ),\n lowMarkerColor: normalizeOptionalSparklineColor(\n config.lowMarkerColor,\n \"sparkline low marker color\",\n ),\n markers: normalizeSparklineMarkers(config.markers),\n axis: normalizeSparklineAxis(config.axis),\n };\n}\n\nfunction resolveSparklineRange(defaultWorksheet: Worksheet, value: unknown, label: string): Range {\n if (value instanceof Range) {\n if (value.worksheet.workbook !== defaultWorksheet.workbook) {\n throw new Error(`${label} belongs to another workbook`);\n }\n return new Range(value.worksheet, value.address);\n }\n const input = normalizeLiveString(value, label);\n const parsed = parseQualifiedRange(input);\n const worksheet = parsed.sheetName\n ? defaultWorksheet.workbook.worksheets.getItem(parsed.sheetName)\n : defaultWorksheet;\n return new Range(worksheet, parsed.address);\n}\n\nfunction normalizeSparklineType(value: unknown): SpreadsheetSparklineType {\n if (value === \"line\" || value === \"column\" || value === \"stacked\") return value;\n throw new TypeError(\"sparkline type must be line, column, or stacked\");\n}\n\nfunction normalizeSparklineLineWeight(value: unknown): number {\n return snapshotFiniteNumber(value, \"sparkline lineWeight\", {\n positive: true,\n maximum: 10,\n });\n}\n\nfunction normalizeSparklineMarkers(\n value: unknown,\n): Readonly<Required<SpreadsheetSparklineMarkersOptions>> {\n const markers =\n value === undefined\n ? {}\n : snapshotRecord(\n value,\n \"sparkline markers\",\n [],\n [\"show\", \"high\", \"low\", \"first\", \"last\", \"negative\"],\n );\n const boolean = (key: keyof SpreadsheetSparklineMarkersOptions): boolean =>\n markers[key] === undefined ? false : snapshotBoolean(markers[key], `sparkline markers.${key}`);\n return Object.freeze({\n show: boolean(\"show\"),\n high: boolean(\"high\"),\n low: boolean(\"low\"),\n first: boolean(\"first\"),\n last: boolean(\"last\"),\n negative: boolean(\"negative\"),\n });\n}\n\nfunction normalizeSparklineAxis(value: unknown): Readonly<{\n showAxis: boolean;\n manualMin: number | null;\n manualMax: number | null;\n rightToLeft: boolean;\n}> {\n const axis =\n value === undefined\n ? {}\n : snapshotRecord(\n value,\n \"sparkline axis\",\n [],\n [\"showAxis\", \"manualMin\", \"manualMax\", \"rightToLeft\"],\n );\n const manualMin =\n axis.manualMin === undefined\n ? null\n : snapshotFiniteNumber(axis.manualMin, \"sparkline axis.manualMin\");\n const manualMax =\n axis.manualMax === undefined\n ? null\n : snapshotFiniteNumber(axis.manualMax, \"sparkline axis.manualMax\");\n if (manualMin !== null && manualMax !== null && manualMin >= manualMax) {\n throw new TypeError(\"sparkline axis.manualMin must be less than manualMax\");\n }\n return Object.freeze({\n showAxis:\n axis.showAxis === undefined\n ? false\n : snapshotBoolean(axis.showAxis, \"sparkline axis.showAxis\"),\n manualMin,\n manualMax,\n rightToLeft:\n axis.rightToLeft === undefined\n ? false\n : snapshotBoolean(axis.rightToLeft, \"sparkline axis.rightToLeft\"),\n });\n}\n\nfunction normalizeOptionalSparklineColor(value: unknown, label: string): string | null {\n return value === undefined ? null : normalizeSparklineColor(value, label);\n}\n\nfunction normalizeSparklineColor(value: unknown, label: string): string {\n const raw = normalizeLiveString(value, label);\n if (raw.trim() !== raw) throw new TypeError(`${label} must not contain surrounding whitespace`);\n const hex = raw.startsWith(\"#\") ? raw.slice(1) : raw;\n if (/^[0-9a-f]{3}$/i.test(hex)) {\n return `#${[...hex].map((character) => `${character}${character}`).join(\"\")}`.toUpperCase();\n }\n if (/^[0-9a-f]{6}$/i.test(hex)) return `#${hex.toUpperCase()}`;\n if (!raw.startsWith(\"#\") && /^[0-9a-f]{8}$/i.test(hex)) {\n return `#${hex.slice(2).toUpperCase()}`;\n }\n throw new TypeError(`${label} must be a hexadecimal RGB color`);\n}\n\nfunction isCanonicalSparklineColor(value: string): boolean {\n return /^#[0-9A-F]{6}$/.test(value);\n}\n\nfunction sparklineDimensions(\n target: RangeAddress,\n source: RangeAddress,\n dateAxis: RangeAddress | null,\n label: string,\n): {\n targetCells: number;\n sourcePoints: number;\n pointsPerSparkline: number;\n} {\n if (target.rowCount > 1 && target.colCount > 1) {\n throw new Error(`${label} targetRange must be one row or one column`);\n }\n const targetCells = target.rowCount * target.colCount;\n let pointsPerSparkline: number;\n if (targetCells === 1) {\n if (source.rowCount > 1 && source.colCount > 1) {\n throw new Error(`${label} sourceData for one sparkline must be one row or one column`);\n }\n pointsPerSparkline = source.rowCount * source.colCount;\n } else if (target.rowCount > 1) {\n if (source.rowCount !== targetCells) {\n throw new Error(`${label} sourceData must have one row for each vertical target cell`);\n }\n pointsPerSparkline = source.colCount;\n } else {\n if (source.colCount !== targetCells) {\n throw new Error(`${label} sourceData must have one column for each horizontal target cell`);\n }\n pointsPerSparkline = source.rowCount;\n }\n if (dateAxis) {\n if (dateAxis.rowCount > 1 && dateAxis.colCount > 1) {\n throw new Error(`${label} dateAxisRange must be one row or one column`);\n }\n if (dateAxis.rowCount * dateAxis.colCount !== pointsPerSparkline) {\n throw new Error(`${label} dateAxisRange must match the points per sparkline`);\n }\n }\n return {\n targetCells,\n sourcePoints: source.rowCount * source.colCount,\n pointsPerSparkline,\n };\n}\n\nfunction normalizeLiveFormula(value: unknown, label: string): string | undefined {\n if (value === undefined) return undefined;\n const formula = normalizeLiveString(value, label);\n validateFormulaLimits(formula);\n return formula;\n}\n\nfunction normalizeChartPosition(value: unknown): { from: RangeAddress; to: RangeAddress } | null {\n if (value === null) return null;\n const position = snapshotRecord(value, \"chart position\", [\"from\", \"to\"]);\n const from = Object.freeze(validateSnapshotRange(position.from, \"chart position.from\"));\n const to = Object.freeze(validateSnapshotRange(position.to, \"chart position.to\"));\n return Object.freeze({ from, to });\n}\n\nfunction detachCellValue<T extends FormulaResult>(value: T): T {\n return (value instanceof Date ? new Date(Date.prototype.getTime.call(value)) : value) as T;\n}\n\nfunction detachCellData(data: Readonly<CellData>): CellData {\n if (!(data.value instanceof Date)) return data as CellData;\n return Object.freeze({\n value: detachCellValue(data.value),\n formula: data.formula,\n format: data.format,\n });\n}\n\nfunction normalizeCellFormat(value: CellFormat): CellFormat {\n if (typeof value === \"object\" && value !== null && normalizedCellFormats.has(value)) {\n return value;\n }\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.getPrototypeOf(value) === Object.prototype &&\n Reflect.ownKeys(value).length === 0\n ) {\n return DEFAULT_CELL.format;\n }\n const state: SnapshotValidationState = {\n ids: new Set(),\n worksheetIds: new Set(),\n worksheetNames: new Set(),\n stringBytes: 0,\n imageBytes: 0,\n imageDataUrlBytes: 0,\n cells: 0,\n merges: 0,\n dimensionOverrides: 0,\n tables: 0,\n charts: 0,\n chartSeries: 0,\n chartPoints: 0,\n sparklineGroups: 0,\n sparklineCells: 0,\n sparklinePoints: 0,\n dataValidations: 0,\n conditionalFormats: 0,\n configNodes: 0,\n sparklineSheetReferences: [],\n images: 0,\n comments: 0,\n normalizedImages: [],\n };\n validateSnapshotCellFormat(value, \"cell format\", state);\n const normalized = structuredClone(value);\n if (normalized.font) Object.freeze(normalized.font);\n if (normalized.borders) {\n for (const key of [\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"insideHorizontal\",\n \"insideVertical\",\n ] as const) {\n if (normalized.borders[key]) Object.freeze(normalized.borders[key]);\n }\n Object.freeze(normalized.borders);\n }\n Object.freeze(normalized);\n normalizedCellFormats.add(normalized);\n return normalized;\n}\n\nfunction serializeCellValue(value: CellValue): SerializedCellValue {\n return value instanceof Date ? { type: \"date\", value: value.toISOString() } : value;\n}\nfunction normalizeFormula(formula: string, limits?: Partial<FormulaEvaluationLimits>): string {\n // Gate the caller-owned string before trim/prepend can allocate a second oversized copy.\n validateFormulaLimits(formula, limits);\n const trimmed = formula.trim();\n const normalized = trimmed.startsWith(\"=\") ? trimmed : `=${trimmed}`;\n validateFormulaLimits(normalized, limits);\n return normalized;\n}\nfunction resolveRecalculationLimits(\n overrides: Partial<SpreadsheetRecalculationLimits> = {},\n): Readonly<SpreadsheetRecalculationLimits> {\n for (const name of Object.keys(overrides)) {\n if (!Object.hasOwn(SPREADSHEET_RECALCULATION_LIMITS, name)) {\n throw new TypeError(`Unknown recalculation limit: ${name}`);\n }\n }\n const limits = { ...SPREADSHEET_RECALCULATION_LIMITS, ...overrides };\n for (const [name, value] of Object.entries(limits)) {\n const hardMaximum =\n SPREADSHEET_RECALCULATION_LIMITS[name as keyof SpreadsheetRecalculationLimits];\n if (!Number.isSafeInteger(value) || value <= 0 || value > hardMaximum) {\n throw new TypeError(`${name} must be a positive safe integer no greater than ${hardMaximum}`);\n }\n }\n return Object.freeze(limits);\n}\nfunction validateSheetName(name: string): string {\n const value = name.trim();\n if (!value || value.length > 31 || /[\\\\/?*[\\]:]/.test(value))\n throw new Error(`Invalid worksheet name: ${name}`);\n return value;\n}\nfunction validateTableName(name: unknown): string {\n const value = normalizeLiveString(name, \"table name\");\n if (value.length === 0) throw new TypeError(\"Table name must not be empty\");\n return value;\n}\nfunction maxColumns<T>(rows: Matrix<T>): number {\n return rows.reduce((max, row) => Math.max(max, row.length), 0);\n}\nfunction assertRectangularMatrix<T>(values: Matrix<T>): number {\n if (values.length === 0) return 0;\n const columns = values[0]?.length ?? 0;\n if (values.some((row) => row.length !== columns))\n throw new Error(\"Matrix rows must have equal length\");\n return columns;\n}\nfunction rectangularize<T>(values: Matrix<T>, fill: T): Matrix<T> {\n const columns = maxColumns(values);\n return values.map((row) => Array.from({ length: columns }, (_, col) => row[col] ?? fill));\n}\nfunction assertMatrixShape<T>(values: Matrix<T>, rows: number, columns: number): void {\n if (values.length !== rows || values.some((row) => row.length !== columns))\n throw new Error(`Matrix must be ${rows}x${columns}`);\n}\nfunction matrix<T>(\n rows: number,\n columns: number,\n getter: (rowIndex: number, colIndex: number) => T,\n): Matrix<T> {\n return Array.from({ length: rows }, (_rowValue, rowIndex) =>\n Array.from({ length: columns }, (_columnValue, colIndex) => getter(rowIndex, colIndex)),\n );\n}\nfunction eachCell(\n address: RangeAddress,\n callback: (row: number, col: number, relativeRow: number, relativeCol: number) => void,\n): void {\n for (let relativeRow = 0; relativeRow < address.rowCount; relativeRow += 1)\n for (let relativeCol = 0; relativeCol < address.colCount; relativeCol += 1)\n callback(address.row + relativeRow, address.col + relativeCol, relativeRow, relativeCol);\n}\nfunction assertSameShape(a: RangeAddress, b: RangeAddress): void {\n if (a.rowCount !== b.rowCount || a.colCount !== b.colCount)\n throw new Error(\"Source and destination ranges must have the same shape\");\n}\nfunction sameRange(a: RangeAddress, b: RangeAddress): boolean {\n return (\n a.row === b.row && a.col === b.col && a.rowCount === b.rowCount && a.colCount === b.colCount\n );\n}\nfunction rangesOverlap(a: RangeAddress, b: RangeAddress): boolean {\n return (\n a.row < b.row + b.rowCount &&\n b.row < a.row + a.rowCount &&\n a.col < b.col + b.colCount &&\n b.col < a.col + a.colCount\n );\n}\nfunction mergeCellFormat(current: CellFormat, update: CellFormat): CellFormat {\n return {\n ...current,\n ...update,\n ...(update.font ? { font: { ...current.font, ...update.font } } : {}),\n ...(update.borders ? { borders: { ...current.borders, ...update.borders } } : {}),\n };\n}\nfunction truncateCell(value: FormulaResult, maxChars: number): FormulaResult {\n if (typeof value !== \"string\" || value.length <= maxChars) return value;\n return `${value.slice(0, Math.max(0, maxChars - 1))}…`;\n}\nfunction quoteSheetName(name: string): string {\n return `'${name.replaceAll(\"'\", \"''\")}'`;\n}\nfunction unquoteSheetName(name: string): string {\n return name.startsWith(\"'\") && name.endsWith(\"'\")\n ? name.slice(1, -1).replaceAll(\"''\", \"'\")\n : name;\n}\nfunction parseQualifiedRange(input: string): {\n sheetName: string | null;\n address: RangeAddress;\n} {\n const separator = input.lastIndexOf(\"!\");\n if (separator < 0) return { sheetName: null, address: parseRangeAddress(input) };\n const sheetName = unquoteSheetName(input.slice(0, separator).trim());\n if (!sheetName) throw new Error(`Invalid sheet-qualified range: ${input}`);\n return {\n sheetName,\n address: parseRangeAddress(input.slice(separator + 1)),\n };\n}\nfunction reviveValue(value: SerializedCellValue): CellValue {\n return value !== null && typeof value === \"object\" ? new Date(value.value) : value;\n}\nfunction isSerializedChart(value: unknown): value is SerializedChart {\n return Boolean(value && typeof value === \"object\" && \"id\" in value && \"sourceRange\" in value);\n}\nfunction parseCsv(input: string, delimiter: string): Matrix<CellValue> {\n if (delimiter.length !== 1) throw new Error(\"CSV delimiter must be one character\");\n if (input.length === 0) return [];\n const rows: Matrix<CellValue> = [];\n let row: CellValue[] = [];\n let field = \"\";\n let quoted = false;\n for (let index = 0; index <= input.length; index += 1) {\n const char = input[index];\n if (quoted) {\n if (char === '\"' && input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else if (char === '\"') quoted = false;\n else if (char === undefined) throw new Error(\"Unterminated quoted CSV field\");\n else field += char;\n } else if (char === '\"' && field.length === 0) quoted = true;\n else if (char === delimiter) {\n row.push(coerceCsv(field));\n field = \"\";\n } else if (char === \"\\n\" || char === undefined) {\n row.push(coerceCsv(field.replace(/\\r$/, \"\")));\n rows.push(row);\n row = [];\n field = \"\";\n } else field += char;\n }\n if (\n rows.length > 1 &&\n rows.at(-1)?.length === 1 &&\n rows.at(-1)?.[0] === null &&\n input.endsWith(\"\\n\")\n )\n rows.pop();\n return rows;\n}\nfunction coerceCsv(value: string): CellValue {\n if (value === \"\") return null;\n if (/^-?(?:\\d+\\.?\\d*|\\.\\d+)(?:[Ee][+-]?\\d+)?$/.test(value)) return Number(value);\n if (/^(?:true|false)$/i.test(value)) return value.toLowerCase() === \"true\";\n return value;\n}\n\nconst HELP_ENTRIES = defineHelpEntries([\n [\"worksheet.getRange\", \"Create an A1-addressed rectangular range\", 'sheet.getRange(\"A1:C10\")'],\n [\"range.values\", \"Read or bulk-write a rectangular value matrix\", \"range.values = [[1, 2]]\"],\n [\"range.formulas\", \"Read or bulk-write formulas\", 'range.formulas = [[\"=A1*2\"]]'],\n [\n \"range.format\",\n \"Apply fills, fonts, formats, borders, alignment, and sizing\",\n 'range.format = { fill: \"#000\", font: { bold: true } }',\n ],\n [\n \"workbook.inspect\",\n \"Inspect workbook structure, regions, formulas, styles, drawings, and comments\",\n 'await workbook.inspect({ kind: \"sheet,formula\" })',\n ],\n [\n \"workbook.render\",\n \"Render a sheet or range to PNG or SVG\",\n 'await workbook.render({ sheetName: \"Sheet1\", format: \"png\" })',\n ],\n [\"workbook.trace\", \"Trace formula precedents from one cell\", 'workbook.trace(\"Sheet1!A1\")'],\n [\n \"chart.add\",\n \"Add a worksheet chart from a range or configuration\",\n 'sheet.charts.add(\"line\", sheet.getRange(\"A1:B4\"))',\n ],\n [\n \"sparklineGroups.add\",\n \"Add a bounded line, column, or stacked sparkline group with explicit target and source ranges\",\n 'sheet.sparklineGroups.add({ type: \"line\", targetRange: \"E2:E4\", sourceData: \"B2:D4\" })',\n 'sheet.getRange(\"E2:E4\").sparklines.add(\"line\", sheet.getRange(\"B2:D4\"))',\n ],\n [\n \"comments.addThread\",\n \"Add a threaded comment to one cell\",\n 'workbook.comments.addThread({ cell: sheet.getRange(\"A1\") }, \"Note\")',\n ],\n [\"fx.SUM\", \"Sum numeric values\", \"=SUM(A1:A10)\"],\n [\"fx.AVERAGE\", \"Average numeric values\", \"=AVERAGE(A1:A10)\"],\n [\n \"fx.XLOOKUP\",\n \"Find a key and return a corresponding value\",\n '=XLOOKUP(A1,B1:B10,C1:C10,\"Missing\")',\n ],\n]);\n"],"mappings":"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","names":["value","matrix","source","bounded","numeric","sheet","field","table","group","text"]}