@gridsheet/engine 3.4.0 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/lib/coords.ts","../src/lib/spatial.ts","../src/lib/time.ts","../src/formula/formula-error.ts","../src/sentinels.ts","../src/formula/evaluator.ts","../src/lib/cell.ts","../src/lib/sheet_utils.ts","../src/lib/operation.ts","../src/lib/date.ts","../src/policy/core.ts","../src/lib/filter.ts","../src/lib/reference.ts","../src/lib/sheet.ts","../src/formula/solver.ts","../src/formula/functions/__async.ts","../src/formula/functions/__utils.ts","../src/formula/functions/__base.ts","../src/formula/functions/add.ts","../src/formula/functions/minus.ts","../src/formula/functions/multiply.ts","../src/formula/functions/divide.ts","../src/formula/functions/sum.ts","../src/formula/functions/concat.ts","../src/formula/functions/eq.ts","../src/formula/functions/ne.ts","../src/formula/functions/gt.ts","../src/formula/functions/gte.ts","../src/formula/functions/lt.ts","../src/formula/functions/lte.ts","../src/formula/functions/now.ts","../src/formula/functions/and.ts","../src/formula/functions/or.ts","../src/formula/functions/if.ts","../src/formula/functions/iferror.ts","../src/formula/functions/not.ts","../src/formula/functions/count.ts","../src/formula/functions/abs.ts","../src/formula/functions/power.ts","../src/formula/functions/counta.ts","../src/formula/functions/average.ts","../src/formula/functions/max.ts","../src/formula/functions/min.ts","../src/formula/functions/len.ts","../src/formula/functions/uminus.ts","../src/formula/functions/arrayformula.ts","../src/formula/mapping.ts","../src/lib/book.ts","../src/policy/thousand_separator.ts","../src/policy/percentage.ts","../src/lib/label.ts","../src/lib/palette.ts","../src/lib/autofill.ts"],"sourcesContent":["import type { ZoneType } from './types';\n\nexport const DEFAULT_HISTORY_LIMIT = 20;\n\nexport const DEFAULT_HEIGHT = 24;\nexport const DEFAULT_WIDTH = 90;\n\nexport const SHEET_HEIGHT = 500;\nexport const SHEET_WIDTH = 1000;\n\nexport const HEADER_HEIGHT = 24;\nexport const HEADER_WIDTH = 50;\n\nexport const MIN_WIDTH = 5;\nexport const MIN_HEIGHT = 5;\n\nexport const OVERSCAN_X = 5;\nexport const OVERSCAN_Y = 10;\n\nexport const DEFAULT_ALPHABET_CACHE_SIZE = 1000;\n\nexport const SECONDS_IN_DAY = 86400;\nexport const FULLDATE_FORMAT_UTC = 'YYYY-MM-DDTHH:mm:ss.SSSZ';\n\nexport const RESET_ZONE: ZoneType = {\n startY: -1,\n startX: -1,\n endY: -1,\n endX: -1,\n};\n\n// 1900-01-01 is the base date for date serialization in Excel, and is represented as 0 in Excel's date system. However, JavaScript's Date object uses the Unix epoch (1970-01-01) as its base date. Therefore, we need to account for the difference between these two epochs when converting between Excel dates and JavaScript dates.\nexport const BASE_DATE = new Date(1900, 0, 1);\n\nexport const DEFAULT_KEY = 'default';\nexport const DEFAULT_COL_KEY = 'defaultCol';\nexport const DEFAULT_ROW_KEY = 'defaultRow';\n","import type { Address, PointType, ExtraPointType } from '../types';\nimport { DEFAULT_ALPHABET_CACHE_SIZE } from '../constants';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nconst N2C_CACHE = new Map<number, string>();\nconst C2N_CACHE = new Map<string, number>();\n\nconst getColumnLetterFromNumber = (key: number, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): string => {\n const cached = N2C_CACHE.get(--key);\n if (cached != null) {\n return cached;\n }\n if (key === 0) {\n return '';\n }\n let num = key;\n let result = '';\n do {\n result = ALPHABET[--num % 26] + result;\n num = Math.floor(num / 26);\n } while (num > 0);\n\n N2C_CACHE.set(key, result);\n const it = N2C_CACHE.keys();\n for (let st = it.next(); N2C_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n N2C_CACHE.delete(st.value);\n }\n return result;\n};\n\nconst getNumberFromColumnLetter = (key: string, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): number => {\n const cached = C2N_CACHE.get(key);\n if (cached != null) {\n return cached;\n }\n if (key === '') {\n return 0;\n }\n const alpha = key;\n let result = 0;\n for (let digit = 0; digit < alpha.length; digit++) {\n const a = alpha[alpha.length - digit - 1];\n const num = ALPHABET.indexOf(a) + 1;\n result += ALPHABET.length ** digit * num;\n }\n C2N_CACHE.set(key, result);\n const it = C2N_CACHE.keys();\n for (let st = it.next(); C2N_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n C2N_CACHE.delete(st.value);\n }\n return result;\n};\n\nexport const x2c = (x: number): string => {\n if (x === 0) {\n return '';\n }\n const c = getColumnLetterFromNumber(x + 1);\n return x < 0 ? `$${c}` : c;\n};\n\nexport const c2x = (col: string, absolute = false): number => {\n const n = getNumberFromColumnLetter(col.toUpperCase());\n return absolute ? -n : n;\n};\n\nexport const y2r = (y: number) => {\n if (y === 0) {\n return '';\n }\n return y < 0 ? `$${y}` : String(y);\n};\n\nexport const r2y = (row: number | string, absolute = false) => {\n if (typeof row === 'string') {\n row = parseInt(row, 10);\n }\n return absolute ? -row : row;\n};\n\nexport const p2a = ({ y, x, absX, absY }: Partial<ExtraPointType>) => {\n if (x === -1 && y === -1) {\n return '?';\n }\n const colPart = x === undefined ? '' : x === 0 ? '0' : `${absX ? '$' : ''}${x2c(x)}`;\n const rowPart = y === undefined ? '' : y === 0 ? '0' : `${absY ? '$' : ''}${y2r(y)}`;\n return `${colPart}${rowPart}`;\n};\n\nexport const a2p = (address: Address): ExtraPointType => {\n const m = address.match(/(\\$)?([a-zA-Z]*)(\\$)?([0-9]*)/);\n if (m == null) {\n return { y: -1, x: -1 };\n }\n const [, _absX, col, _absY, row] = m.slice();\n const [absX, absY] = [_absX != null, _absY != null];\n if (col === '' && row === '') {\n return { y: -1, x: -1, absX: false, absY: false };\n }\n return { y: r2y(row) || 0, x: c2x(col) || 0, absX, absY };\n};\n\nexport const grantAddressAbsolute = (address: Address, absCol: boolean, absRow: boolean) => {\n const m = address.match(/([A-Z]*)([0-9]*)/);\n if (m == null) {\n return address;\n }\n const [, col, row] = m.slice();\n return `${absCol ? '$' : ''}${col.toUpperCase()}${absRow ? '$' : ''}${row}`;\n};\n\n/**\n * Returns the row header cell address for a given row number by prepending `0`.\n * e.g. rh(6) → '06', rh(1) → '01'\n */\nexport const rh = (y: number): string => `0${y}`;\n\n/**\n * Returns the column header cell address for a given column letter or column index\n * (1-based, same as point.x) by appending `0`.\n * e.g. ch('A') → 'A0', ch(1) → 'A0'\n */\nexport const ch = (col: string | number): string =>\n typeof col === 'number' ? `${x2c(col)}0` : `${col.toUpperCase()}0`;\n\nexport const stripAddressAbsolute = (address: Address) => {\n return address.replace(/\\$/g, '');\n};\n\nexport const buildIdentifiedRef = (id: string, absX = false, absY = false): string => {\n return `${absX ? '$' : ''}#${id}${absY ? '$' : ''}`;\n};\n","import { DEFAULT_KEY, DEFAULT_COL_KEY, DEFAULT_ROW_KEY } from '../constants';\nimport type {\n MatrixType,\n AreaType,\n ZoneType,\n RangeType,\n PointType,\n CellsByAddressType,\n ShapeType,\n MatricesByAddress,\n CellType,\n Address,\n} from '../types';\nimport { a2p, p2a, x2c, c2x } from './coords';\n\nexport const superposeArea = (srcArea: AreaType, dstArea: AreaType): ShapeType => {\n const { rows: srcRows, cols: srcCols } = areaDiff(srcArea);\n const { rows: dstRows, cols: dstCols } = areaDiff(dstArea);\n\n // biggerRows, biggerCols\n return {\n rows: srcRows > dstRows ? srcRows : dstRows,\n cols: srcCols > dstCols ? srcCols : dstCols,\n };\n};\n\nexport const concatAreas = (area1: AreaType, area2: AreaType): AreaType => {\n const result: AreaType = { ...area1 };\n if (area2.left < area1.left) {\n result.left = area2.left;\n }\n if (area2.right > area1.right) {\n result.right = area2.right;\n }\n if (area2.top < area1.top) {\n result.top = area2.top;\n }\n if (area2.bottom > area1.bottom) {\n result.bottom = area2.bottom;\n }\n return result;\n};\n\nexport const zoneToArea = (zone: ZoneType): AreaType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { top: -1, left: -1, bottom: -1, right: -1 };\n }\n const [top, bottom] = zone.startY < zone.endY ? [zone.startY, zone.endY] : [zone.endY, zone.startY];\n const [left, right] = zone.startX < zone.endX ? [zone.startX, zone.endX] : [zone.endX, zone.startX];\n return { top, left, bottom, right };\n};\n\nexport const areaToZone = (area: AreaType): ZoneType => {\n return {\n startY: area.top,\n startX: area.left,\n endY: area.bottom,\n endX: area.right,\n };\n};\n\nexport const areaToRange = (area: AreaType): string => {\n const { top, left, bottom, right } = area;\n if (top === bottom && left === right) {\n return p2a({ y: top, x: left });\n }\n const leftTop = p2a({ y: top, x: left });\n const rightBottom = p2a({ y: bottom, x: right });\n return `${leftTop}:${rightBottom}`;\n};\n\nexport const between = (range: RangeType, index: number) => {\n if (range.start === -1 || range.end === -1) {\n return false;\n }\n return (range.start <= index && index <= range.end) || (range.end <= index && index <= range.start);\n};\n\nexport const among = (area: AreaType, point: PointType) => {\n if (area.top === -1 || area.left === -1 || area.bottom === -1 || area.right === -1) {\n return false;\n }\n const { y, x } = point;\n const { top, left, bottom, right } = area;\n return top <= y && y <= bottom && left <= x && x <= right;\n};\n\ntype ShapeExtension = { base?: number };\n\nexport const zoneDiff = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 0, cols: 0 };\n }\n return {\n rows: Math.abs(zone.startY - zone.endY),\n cols: Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const zoneShape = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 1, cols: 1 };\n }\n return {\n rows: 1 + Math.abs(zone.startY - zone.endY),\n cols: 1 + Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const areaDiff = (area: AreaType): ShapeType => {\n return {\n rows: Math.abs(area.top - area.bottom),\n cols: Math.abs(area.left - area.right),\n };\n};\n\nexport const areaShape = (area: AreaType): ShapeType => {\n return {\n rows: 1 + Math.abs(area.top - area.bottom),\n cols: 1 + Math.abs(area.left - area.right),\n };\n};\n\nexport const matrixShape = ({ base = 0, matrix }: { matrix: MatrixType } & ShapeExtension): ShapeType => {\n const h = matrix.length;\n if (h === 0) {\n return { rows: 0, cols: 0 };\n }\n return { rows: base + h, cols: base + matrix[0].length };\n};\n\nexport const makeSequence = (start: number, stop: number, step: number = 1) => {\n return Array.from({ length: (stop - start - 1) / step + 1 }, (_, i) => start + i * step);\n};\n\nexport const oa2aa = (oa: { [s: string]: any }[], fields: string[]): MatrixType => {\n const aa: any[][] = [];\n oa.forEach((o) => {\n const a: any[] = [];\n fields.forEach((field) => {\n a.push(o[field]);\n });\n aa.push(a);\n });\n return aa;\n};\n\nexport const aa2oa = (aa: MatrixType, fields: string[]): { [s: string]: any }[] => {\n const oa: { [s: string]: any }[] = [];\n aa.forEach((a) => {\n const o: { [s: string]: any } = {};\n a.forEach((v, i) => {\n if (i >= fields.length) {\n return;\n }\n const field = fields[i];\n o[field] = v;\n });\n oa.push(o);\n });\n return oa;\n};\n\nexport const createMatrix = <T = any>(numRows: number, numCols: number, fill?: T): T[][] => {\n return [...Array(numRows)].map(() => Array(numCols).fill(fill));\n};\n\nexport const buildInitialCellsFromOrigin = ({\n cells = {},\n ensured = {},\n matrix = [],\n flattenAs = 'value',\n origin = 'A1',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrix?: MatrixType;\n origin?: Address;\n}) => {\n return buildInitialCells({\n cells,\n ensured,\n matrices: { [origin]: matrix },\n flattenAs,\n });\n};\n\nexport const buildInitialCells = ({\n cells = {},\n ensured = {},\n matrices = {},\n flattenAs = 'value',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<any>;\n} = {}) => {\n const userKeys = Object.keys(cells);\n // Only eagerly build cells for small matrices. For large ones, defer to\n // Sheet._ensureCellPopulated via __matrices so we avoid creating millions\n // of dictionary entries up front.\n const totalMatrixCells = Object.values(matrices).reduce((sum, m) => sum + m.length * (m[0]?.length ?? 0), 0);\n const EAGER_THRESHOLD = 100_000;\n const deferred = totalMatrixCells > EAGER_THRESHOLD;\n if (!deferred) {\n buildCells({ cells, flattenAs, matrices });\n } else {\n // Attach matrices for lazy resolution in Sheet.initialize()\n Object.defineProperty(cells, '__matrices', { value: matrices, configurable: true });\n Object.defineProperty(cells, '__flattenAs', { value: flattenAs, configurable: true });\n }\n const { numRows, numCols } = Object.assign({ numRows: 1, numCols: 1 }, ensured);\n const rightBottom = p2a({ y: numRows, x: numCols });\n if (cells[rightBottom] == null) {\n cells[rightBottom] = {};\n }\n // Only attach __userKeys for deferred matrices. When buildCells ran eagerly,\n // all keys are already in cells so Object.keys(cells) is correct.\n if (deferred) {\n userKeys.push(rightBottom);\n Object.defineProperty(cells, '__userKeys', { value: userKeys, configurable: true });\n }\n return cells;\n};\n\nexport const buildCells = <T>({\n cells = {},\n matrices = {},\n flattenAs,\n}: {\n cells?: CellsByAddressType;\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<T>;\n}) => {\n Object.keys(matrices).forEach((baseAddress) => {\n const matrix = matrices[baseAddress];\n const { y: baseY, x: baseX } = a2p(baseAddress);\n const colLetters: string[] = [];\n for (let y = 0; y < matrix.length; y++) {\n const row = matrix[y];\n const rowStr = String(baseY + y);\n for (let x = 0; x < row.length; x++) {\n if (colLetters[x] == null) {\n colLetters[x] = x2c(baseX + x);\n }\n const id = colLetters[x] + rowStr;\n if (flattenAs) {\n const cell = cells[id];\n if (cell) {\n if (!(flattenAs in cell)) {\n (cell as Record<string, unknown>)[flattenAs] = row[x];\n }\n } else {\n cells[id] = { [flattenAs]: row[x] };\n }\n } else {\n cells[id] = row[x] as CellType;\n }\n }\n }\n });\n return cells;\n};\n\nexport const getMaxSizesFromCells = (cells: CellsByAddressType = {}, keys?: string[]) => {\n let [lastY, lastX] = [0, 0];\n (keys ?? Object.keys(cells)).forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const { y, x } = a2p(address);\n if (lastY < y) {\n lastY = y;\n }\n if (lastX < x) {\n lastX = x;\n }\n });\n return { numRows: lastY, numCols: lastX };\n};\n\nexport const range = (start: number, end: number) => {\n const list: number[] = [];\n for (let i = start; i <= end; i++) {\n list.push(i);\n }\n return list;\n};\n\nexport const complementSelectingArea = (selectingArea: AreaType, choosing: PointType) => {\n if (selectingArea.left === -1) {\n selectingArea = {\n left: choosing.x,\n top: choosing.y,\n right: choosing.x,\n bottom: choosing.y,\n };\n }\n return selectingArea;\n};\n\nexport const expandRange = (range: string): Address[] => {\n if (range.indexOf(':') === -1) {\n return [range];\n }\n\n const result: Address[] = [];\n\n const isRowRange = /^\\d+\\:\\d+$/.test(range);\n\n if (isRowRange) {\n const [startRow, endRow] = range.split(':').map(Number);\n for (let row = startRow; row <= endRow; row++) {\n result.push(`${row}`);\n }\n return result;\n }\n\n const match = range.match(/^([A-Z]*)(\\d+)?\\:([A-Z]*)(\\d+)?$/);\n if (!match) {\n console.error('Invalid range format', range);\n return [range];\n }\n\n const [, startCol, startRow, endCol, endRow] = match;\n const startColIndex = startCol ? c2x(startCol) : 1;\n const endColIndex = endCol ? c2x(endCol) : 1;\n\n for (let col = startColIndex; col <= endColIndex; col++) {\n const currentColumn = startCol || endCol ? x2c(col) : '';\n if (startRow && endRow) {\n for (let row = Number(startRow); row <= Number(endRow); row++) {\n result.push(`${currentColumn}${row}`);\n }\n } else if (!startRow && !endRow) {\n result.push(currentColumn);\n }\n }\n return result;\n};\n\n// restrictZone resets a zone if the zone consists of a single cell.\nexport const restrictZone = (zone: ZoneType): ZoneType => {\n const s = zoneDiff(zone);\n if (s.rows + s.cols === 0) {\n return { startY: -1, startX: -1, endY: -1, endX: -1 };\n }\n return { ...zone };\n};\n\nexport type BinarySearchPredicate = (mid: number) => boolean;\n\nexport const binarySearch = (\n low: number,\n high: number,\n predicate: BinarySearchPredicate,\n lessThan: boolean,\n): number => {\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (predicate(mid)) {\n if (lessThan) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n } else {\n if (lessThan) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n }\n return lessThan ? low : high;\n};\n\n/**\n * Convert a list of addresses into an array of bounding areas.\n * Adjacent cells (4-connected: up/down/left/right) are grouped into the same area.\n * Each resulting AreaType is the bounding rectangle of one connected group.\n */\nexport const addressesToAreas = (addresses: Address[]): AreaType[] => {\n if (addresses.length === 0) {\n return [];\n }\n\n const points = addresses.map((addr) => {\n const { y, x } = a2p(addr);\n return { y, x };\n });\n\n const key = (y: number, x: number) => `${y},${x}`;\n const pointSet = new Set(points.map((p) => key(p.y, p.x)));\n const visited = new Set<string>();\n const areas: AreaType[] = [];\n\n for (const p of points) {\n const k = key(p.y, p.x);\n if (visited.has(k)) {\n continue;\n }\n\n // BFS to find connected component\n let top = p.y,\n left = p.x,\n bottom = p.y,\n right = p.x;\n const queue = [p];\n visited.add(k);\n\n while (queue.length > 0) {\n const { y, x } = queue.shift()!;\n if (y < top) {\n top = y;\n }\n if (y > bottom) {\n bottom = y;\n }\n if (x < left) {\n left = x;\n }\n if (x > right) {\n right = x;\n }\n\n for (const [dy, dx] of [\n [0, 1],\n [0, -1],\n [1, 0],\n [-1, 0],\n ]) {\n const nk = key(y + dy, x + dx);\n if (pointSet.has(nk) && !visited.has(nk)) {\n visited.add(nk);\n queue.push({ y: y + dy, x: x + dx });\n }\n }\n }\n\n areas.push({ top, left, bottom, right });\n }\n\n return areas;\n};\n\n/**\n * Extract unique column indices (x) from a list of addresses, ignoring row information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToCols = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const cols: number[] = [];\n for (const addr of addresses) {\n const { x } = a2p(addr);\n if (!seen.has(x)) {\n seen.add(x);\n cols.push(x);\n }\n }\n if (asc === true) {\n cols.sort((a, b) => a - b);\n } else if (asc === false) {\n cols.sort((a, b) => b - a);\n }\n return cols;\n};\n\n/**\n * Extract unique row indices (y) from a list of addresses, ignoring column information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToRows = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const rows: number[] = [];\n for (const addr of addresses) {\n const { y } = a2p(addr);\n if (!seen.has(y)) {\n seen.add(y);\n rows.push(y);\n }\n }\n if (asc === true) {\n rows.sort((a, b) => a - b);\n } else if (asc === false) {\n rows.sort((a, b) => b - a);\n }\n return rows;\n};\n\nexport const isZoneNotSelected = (zone: ZoneType): boolean => {\n return zone.startY === -1 || zone.startX === -1 || zone.endY === -1 || zone.endX === -1;\n};\n","import { BASE_DATE } from '../constants';\n\nconst MS_PER_DAY = 86400000;\n\nexport class Time {\n public readonly __gsType = 'Time' as const;\n public readonly days: number;\n public format: string;\n\n constructor(days: number, format = 'HH:mm:ss') {\n this.days = days;\n this.format = format;\n }\n\n public add(date: Date): Date {\n return new Date(date.getTime() + this.days * MS_PER_DAY);\n }\n\n public sub(date: Date): Date {\n return new Date(date.getTime() - this.days * MS_PER_DAY);\n }\n\n public stringify(format?: string): string {\n const totalMs = this.toMilliseconds();\n const absMs = Math.abs(totalMs);\n const sign = totalMs < 0 ? '-' : '';\n\n const millis = absMs % 1000;\n let remaining = Math.floor(absMs / 1000);\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n const minutes = remaining % 60;\n const hours = Math.floor(remaining / 60);\n\n const resolvedFormat = format ?? (millis === 0 ? 'HH:mm:ss' : 'HH:mm:ss.SSS');\n\n let result = resolvedFormat;\n result = result.replace('HH', sign + String(hours).padStart(2, '0'));\n result = result.replace('H', sign + String(hours));\n result = result.replace('mm', String(minutes).padStart(2, '0'));\n result = result.replace('ss', String(seconds).padStart(2, '0'));\n result = result.replace('SSS', String(millis).padStart(3, '0'));\n result = result.replace('SS', String(millis).padStart(3, '0').substring(0, 2));\n result = result.replace('S', String(millis).padStart(3, '0').substring(0, 1));\n return result;\n }\n\n public toMilliseconds(): number {\n return this.days * MS_PER_DAY;\n }\n\n public toDate(): Date {\n return new Date(BASE_DATE.getTime() + this.days * MS_PER_DAY);\n }\n\n public toJSON(): { __gsType: 'Time'; days: number; format: string } {\n return { __gsType: 'Time', days: this.days, format: this.format };\n }\n\n public toString(): string {\n return this.stringify();\n }\n\n static create(hours = 0, minutes = 0, seconds = 0, milliseconds = 0): Time {\n const ms = hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds;\n return new Time(ms / MS_PER_DAY);\n }\n\n static fromDate(date: Date): Time {\n const timeMs =\n date.getHours() * 3600000 + date.getMinutes() * 60000 + date.getSeconds() * 1000 + date.getMilliseconds();\n return new Time(timeMs / MS_PER_DAY);\n }\n\n static fromDates(date1: Date, date2: Date): Time {\n return new Time((date1.getTime() - date2.getTime()) / MS_PER_DAY);\n }\n\n static fromObject(obj: { days: number; format?: string }): Time {\n return new Time(obj.days, obj.format);\n }\n\n static is(obj: any): boolean {\n if (obj instanceof Time) {\n return true;\n }\n if (obj?.__gsType === 'Time') {\n return true;\n }\n return false;\n }\n\n static ensure(obj: any): Time {\n if (obj instanceof Time) {\n return obj;\n }\n if (obj?.__gsType === 'Time') {\n return Time.fromObject(obj);\n }\n return Time.create();\n }\n\n static parse(value: string, format?: string, strict = false): Time | undefined {\n if (format != null) {\n const formattedMatcher = dayjsFormatToNamedRegex(format);\n const match = value.match(formattedMatcher);\n if (match?.groups) {\n return Time.create(\n Number(match.groups.HH || match.groups.H || 0),\n Number(match.groups.mm || match.groups.m || 0),\n Number(match.groups.ss || match.groups.s || 0),\n Number(match.groups.SSS || match.groups.SS || match.groups.S || 0),\n );\n }\n }\n if (strict) {\n return;\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes, seconds] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})\\.(\\d+)$/);\n if (match) {\n const [, _sign, hours, minutes, seconds, msecs] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds), sign * Number(msecs));\n }\n }\n }\n}\n\nconst tokenRegexMap: Record<string, { group: string; pattern: string }> = {\n HH: { group: 'HH', pattern: '(?<HH>\\\\d+)' },\n H: { group: 'H', pattern: '(?<HH>\\\\d+)' },\n mm: { group: 'mm', pattern: '(?<mm>[0-5]\\\\d)' },\n m: { group: 'm', pattern: '(?<m>\\\\d|[1-5]\\\\d)' },\n ss: { group: 'ss', pattern: '(?<ss>[0-5]\\\\d)' },\n s: { group: 's', pattern: '(?<s>\\\\d|[1-5]\\\\d)' },\n SSS: { group: 'SSS', pattern: '(?<SSS>\\\\d{3})' },\n SS: { group: 'SS', pattern: '(?<SS>\\\\d{2})' },\n S: { group: 'S', pattern: '(?<S>\\\\d)' },\n};\n\nfunction dayjsFormatToNamedRegex(format: string): RegExp {\n const sortedTokens = Object.keys(tokenRegexMap).sort((a, b) => b.length - a.length);\n const tokenPattern = new RegExp(sortedTokens.join('|'), 'g');\n\n const escapedFormat = format.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n const regexSource = escapedFormat.replace(tokenPattern, (match) => {\n return tokenRegexMap[match]?.pattern ?? match;\n });\n\n return new RegExp(`^${regexSource}$`);\n}\n\nexport const safeQueueMicrotask =\n typeof queueMicrotask === 'function' ? queueMicrotask : (cb: () => void) => Promise.resolve().then(cb);\n","export class FormulaError {\n public code: string;\n public message: string;\n public error?: Error;\n public readonly __gsType = 'FormulaError' as const;\n constructor(code: string, message: string, error?: Error) {\n this.code = code;\n this.message = message;\n this.error = error;\n }\n static is(obj: any): obj is FormulaError {\n return obj instanceof FormulaError || obj?.__gsType === 'FormulaError';\n }\n toString() {\n return this.code;\n }\n}\n","export class Sentinel {\n public readonly __gsType = 'Sentinel' as const;\n constructor(public readonly code: string) {}\n\n is(obj: any): obj is this {\n return Sentinel.is(obj, this.code);\n }\n\n static is(obj: any, code?: string): obj is Sentinel {\n const match = obj instanceof Sentinel || obj?.__gsType === 'Sentinel';\n if (!match) {\n return false;\n }\n return code == null || obj.code === code;\n }\n}\n\nexport const SOLVING = new Sentinel('solving');\nexport const NONE = new Sentinel('none');\n\n/**\n * Sentinel value representing an in-flight async formula computation.\n * Cells whose solved cache contains a Pending will render a loading indicator.\n * Dependent cells that encounter a Pending value also become pending.\n */\nexport class Pending<T = unknown> {\n private readonly timestamp: number;\n\n public readonly promise: Promise<T>;\n public readonly __gsType = 'Pending' as const;\n\n constructor(promise: Promise<T>) {\n this.promise = promise;\n this.timestamp = Date.now();\n }\n\n static is(obj: any): obj is Pending {\n return obj instanceof Pending || obj?.__gsType === 'Pending';\n }\n\n toString(): string {\n return `<Pending #${this.timestamp}>`;\n }\n}\n\n/**\n * Returned by functions that want to spill a 2D result into adjacent cells.\n *\n * Usage in a function:\n * return new Spilling([[1, 2], [3, 4]]);\n *\n * The solver detects Spilling via `Spilling.is()` and calls\n * `sheet.spill(origin, result.matrix)` to perform obstruction checks\n * and write values into the solvedCaches.\n */\nexport class Spilling {\n public readonly __gsType = 'Spilling' as const;\n /** The 2D matrix of resolved values. matrix[row][col] */\n public readonly matrix: any[][];\n\n constructor(matrix: any[] | any[][]) {\n this.matrix = this.ensure2D(matrix);\n }\n\n private ensure2D(matrix: any[] | any[][]): any[][] {\n if (matrix.length === 0) {\n return [];\n }\n if (Array.isArray(matrix[0])) {\n return matrix as any[][];\n }\n // 1D array is treated as a single row (horizontal expansion).\n // e.g. [1, 2, 3] → [[1, 2, 3]]\n // To expand vertically instead, use: matrix.map(v => [v])\n return [matrix as any[]];\n }\n\n static is(obj: any): obj is Spilling {\n return obj instanceof Spilling || obj?.__gsType === 'Spilling';\n }\n}\n","import { a2p, buildIdentifiedRef, grantAddressAbsolute, p2a } from '../lib/coords';\nimport { Sheet } from '../lib/sheet';\nimport { Id, PointType } from '../types';\nimport { FormulaError } from './formula-error';\n\ntype EvaluateProps = {\n sheet: Sheet;\n};\n\ntype IdentityBaseProps = {\n slideY?: number;\n slideX?: number;\n operation?: 'move' | 'removeRows' | 'removeCols';\n dependency: Id;\n};\n\nexport type ProcessFormulaProps = IdentityBaseProps & {\n idMap?: { [id: string]: string };\n};\n\nexport type IdentifyProps = IdentityBaseProps & {\n sheet: Sheet;\n};\n\nexport type DisplayProps = {\n sheet: Sheet;\n slideY?: number;\n slideX?: number;\n};\n\n// strip sharp and dollars\nconst stripId = (idString: string, stripAbsolute = true) => {\n let id = idString;\n if (stripAbsolute && id.startsWith('$')) {\n id = id.slice(1);\n }\n if (stripAbsolute && id.endsWith('$')) {\n id = id.slice(0, -1);\n }\n return id.replace('#', '');\n};\n\nclass Entity<T = any> {\n public value: T;\n public ids: string[] = [];\n constructor(value: T) {\n this.value = value;\n }\n}\n\nexport class ValueEntity extends Entity {\n public evaluate() {\n return this.value;\n }\n}\n\nexport class UnreferencedEntity extends Entity {\n public evaluate() {\n throw new FormulaError('#REF!', `Reference does not exist.`);\n }\n}\n\nexport class InvalidRefEntity extends Entity<string> {\n public evaluate() {\n throw new FormulaError('#NAME?', `Invalid ref: ${this.value}`);\n }\n}\n\nexport class RefEntity extends Entity<string> {\n constructor(value: string) {\n super(value);\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const { y, x } = a2p(parsed.addresses[0]);\n const t = parsed.sheet.trim({ top: y, left: x, bottom: y, right: x });\n return t;\n }\n\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const address = parsed.addresses[0];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids = [id];\n return `#${parsed.sheet.id}!${buildIdentifiedRef(id, absX, absY)}`;\n }\n}\n\nexport class RangeEntity extends Entity<string> {\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const area = parsed.sheet.rangeToArea(parsed.addresses.join(':'));\n const t = parsed.sheet.trim(area);\n return t;\n }\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const formulas: string[] = [];\n for (let i = 0; i < parsed.addresses.length; i++) {\n const address = parsed.addresses[i];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids.push(id);\n formulas.push(buildIdentifiedRef(id, absX, absY));\n }\n return `#${parsed.sheet.id}!${formulas.join(':')}`;\n }\n}\n\nexport class IdEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; id: string } {\n if (this.value.indexOf('!') !== -1) {\n const [sheetIdStr, id] = this.value.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, id: stripId(id, false) };\n }\n return { sheet, id: stripId(this.value, false) };\n }\n public evaluate({ sheet }: EvaluateProps) {\n const parsed = this.parse(sheet);\n if (parsed.id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const { y, x } = parsed.sheet.getPointById(parsed.id);\n const [absY, absX] = [Math.abs(y), Math.abs(x)];\n return parsed.sheet.trim({\n top: absY,\n left: absX,\n bottom: absY,\n right: absX,\n });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const address = parsed.sheet.getAddressById(parsed.id, slideY, slideX);\n if (!address) {\n return '#REF!';\n }\n if (parsed.sheet.id === sheet.id) {\n return address;\n }\n return `${parsed.sheet.sheetPrefix()}${address}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const address = this.display({ sheet, slideY, slideX });\n if (address == null || address.length < 2) {\n return '#?';\n }\n const { formula, ids } = parseRef(address, props);\n this.ids = ids;\n return formula || '#?';\n }\n}\n\nexport class IdRangeEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; ids: string[] } {\n const range = this.value;\n if (range.indexOf('!') !== -1) {\n const [sheetIdStr, idRange] = range.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, ids: idRange.split(':') };\n }\n return { sheet, ids: range.split(':') };\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = this.parse(sheet);\n const ids = parsed.ids.map((id) => stripId(id));\n const ps: PointType[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const p = parsed.sheet.getPointById(id);\n ps.push(p);\n }\n const [p1, p2] = ps;\n const [top, left, bottom, right] = [p1.y, p1.x, p2.y || parsed.sheet.numRows, p2.x || parsed.sheet.numCols];\n return parsed.sheet.trim({ top, left, bottom, right });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const range = parsed.ids\n .map((id) => stripId(id, false))\n .map((id) => parsed.sheet.getAddressById(id, slideY, slideX) || '#REF!')\n .join(':');\n if (parsed.sheet.id === sheet.id) {\n return range;\n }\n return `${parsed.sheet.sheetPrefix()}${range}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const range = this.display({ sheet, slideY, slideX });\n const { formula, ids } = parseRef(range, props);\n this.ids = ids;\n // When the range can't be resolved (e.g. an autofill slid it off-sheet so display yields\n // \"#REF!:#REF!\"), parseRef returns no formula. Fall back to the broken-reference marker\n // \"#?\" — matching RefEntity/IdEntity — instead of \"\" which would DROP the whole argument\n // (turning =F(a, C2:C6, b) into =F(a, , b) and corrupting the formula's arity).\n return formula || '#?';\n }\n}\n\nexport class FunctionEntity {\n public args: Expression[];\n public name: string;\n public precedence: number;\n private at?: Id;\n constructor(name: string, precedence = 0, args: Expression[] = [], at?: Id) {\n this.name = name;\n this.precedence = precedence;\n this.args = args;\n this.at = at;\n }\n\n public evaluate({ sheet }: EvaluateProps): any {\n const name = this.name.toLowerCase();\n const Func = sheet.getFunctionByName(name);\n if (Func == null) {\n throw new FormulaError('#NAME?', `Unknown function: ${name}`);\n }\n const func = new Func({ args: this.args, sheet, at: this.at });\n return func.call();\n }\n}\n\nexport type Expression =\n | ValueEntity\n | RefEntity\n | RangeEntity\n | IdEntity\n | IdRangeEntity\n | FunctionEntity\n | UnreferencedEntity\n | InvalidRefEntity;\n\nconst ZERO = new ValueEntity(0);\n\nexport type TokenType =\n | 'VALUE'\n | 'REF'\n | 'RANGE'\n | 'ID'\n | 'ID_RANGE'\n | 'FUNCTION'\n | 'PREFIX_OPERATOR'\n | 'INFIX_OPERATOR'\n | 'POSTFIX_OPERATOR'\n | 'OPEN'\n | 'CLOSE'\n | 'COMMA'\n | 'SPACE'\n | 'UNREFERENCED'\n | 'INVALID_REF';\n\nconst INFIX_FUNCTION_NAME_MAP = {\n '+': 'add',\n '-': 'minus',\n '/': 'divide',\n '*': 'multiply',\n '^': 'power',\n '&': 'concat',\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nconst PREFIX_FUNCTION_NAME_MAP = {\n '-': 'uminus',\n};\n\nconst WHITESPACE_CHARS = new Set([' ', '\\n', '\\r', '\\t', '\\f']);\nconst SPECIAL_CHARS = new Set([...WHITESPACE_CHARS, '+', '-', '/', '*', '^', '&', '=', '<', '>', ')', ',', '%']);\n\nexport class Token {\n type: TokenType;\n entity: any;\n precedence: number;\n closed: boolean;\n raw?: string;\n private at?: Id;\n\n constructor(type: TokenType, entity: any, precedence = 0, at?: Id, closed = true) {\n this.type = type;\n this.entity = entity;\n this.precedence = precedence;\n this.at = at;\n this.closed = closed;\n }\n\n public length() {\n if (this.type === 'VALUE' && typeof this.entity === 'string') {\n return this.entity.length + (this.closed ? 2 : 1);\n }\n return new String(this.entity).length;\n }\n\n public stringify() {\n if (this.type === 'VALUE') {\n if (typeof this.entity === 'string') {\n return this.closed ? `\"${this.entity}\"` : `\"${this.entity}`;\n }\n if (typeof this.entity === 'boolean') {\n return this.entity ? 'TRUE' : 'FALSE';\n }\n if (this.raw != null) {\n return this.raw;\n }\n }\n return this.entity as string;\n }\n\n public convert() {\n switch (this.type) {\n case 'VALUE':\n return new ValueEntity(this.entity);\n\n case 'ID':\n return new IdEntity(this.entity as string);\n\n case 'ID_RANGE':\n return new IdRangeEntity(this.entity as string);\n\n case 'REF':\n return new RefEntity(this.entity as string);\n\n case 'RANGE':\n return new RangeEntity(this.entity as string);\n\n case 'INFIX_OPERATOR': {\n const name = INFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof INFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'PREFIX_OPERATOR': {\n const name = PREFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof PREFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'FUNCTION':\n return new FunctionEntity(this.entity as string, 0, [], this.at);\n\n case 'UNREFERENCED':\n return new UnreferencedEntity(this.entity);\n\n case 'INVALID_REF':\n return new InvalidRefEntity(this.entity as string);\n }\n }\n}\n\nconst isWhiteSpace = (char: string) => {\n return WHITESPACE_CHARS.has(char);\n};\n\nconst BOOLS: { [s: string]: boolean } = { ['true']: true, ['false']: false };\n\nconst TOKEN_OPEN = new Token('OPEN', '('),\n TOKEN_CLOSE = new Token('CLOSE', ')'),\n TOKEN_COMMA = new Token('COMMA', ',');\n\nconst INFIX_OPERATOR = 'INFIX_OPERATOR';\nconst PREFIX_OPERATOR = 'PREFIX_OPERATOR';\nconst POSTFIX_OPERATOR = 'POSTFIX_OPERATOR';\n\ntype LexerOption = {\n at?: Id;\n};\n\nexport class Lexer {\n private index: number;\n private formula: string;\n public tokens: Token[] = [];\n public foreign: boolean = false;\n public identifiedFormula: string = '';\n public dependencyIds: string[] = [];\n private at?: Id;\n\n constructor(formula: string, options?: LexerOption) {\n this.formula = formula;\n this.index = 0;\n this.tokens = [];\n this.at = options?.at;\n }\n\n private isWhiteSpace() {\n return isWhiteSpace(this.formula[this.index]);\n }\n\n private next(base = 1) {\n this.index += base;\n }\n\n private get(base = 0) {\n const c = this.formula[this.index + base];\n return c;\n }\n\n private getToken(base = 0) {\n return this.tokens[this.tokens.length + base];\n }\n\n public getTokenIndexByCharPosition(pos: number): [number, boolean] {\n // return [index, edge]\n let start = 0,\n end = 0;\n\n for (let i = 0; i < this.tokens.length; i++) {\n const token = this.tokens[i];\n end = start + token.length();\n if (start <= pos && pos <= end) {\n return [i, pos === start || pos === end];\n }\n start = end;\n }\n return [-1, false];\n }\n\n public getTokenPositionRange(index: number, slide = 1): [number, number] {\n let start = 0,\n end = 0;\n for (let i = 0; i < index; i++) {\n start = end;\n end += this.tokens[i].length();\n }\n return [start + slide, end + slide];\n }\n\n public stringify() {\n return this.tokens.map((t) => t.stringify()).join('');\n }\n\n public identify(props: IdentifyProps): void {\n const parts: string[] = [];\n const ids: string[] = [];\n for (const t of this.tokens) {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n parts.push(String(t.entity));\n } else {\n parts.push(t.closed ? `\"${t.entity}\"` : `\"${t.entity}`);\n }\n break;\n case 'ID': {\n const entity = new IdEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'ID_RANGE': {\n const entity = new IdRangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'REF': {\n const entity = new RefEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'RANGE': {\n const entity = new RangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n default:\n parts.push(t.entity);\n break;\n }\n }\n this.identifiedFormula = parts.join('');\n this.dependencyIds = ids;\n }\n\n public display({ sheet }: DisplayProps) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.raw ?? t.entity;\n }\n return t.closed ? `\"${t.entity}\"` : `\"${t.entity}`;\n case 'ID':\n return new IdEntity(t.entity as string).display({ sheet });\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).display({ sheet });\n }\n return t.entity;\n })\n .join('');\n }\n\n public tokenize(idMap: { [id: Id]: Id } = {}) {\n while (this.index <= this.formula.length) {\n this.skipSpaces();\n let char = this.get();\n this.next();\n switch (char) {\n case undefined:\n return;\n case '(':\n this.tokens.push(TOKEN_OPEN);\n continue;\n case ')':\n this.tokens.push(TOKEN_CLOSE);\n continue;\n case ',':\n this.tokens.push(TOKEN_COMMA);\n continue;\n case '+':\n // TOKEN_PLUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '+', 3, this.at));\n continue;\n case '-': {\n const prev1 = this.getToken(-1)?.type;\n const prev2 = this.getToken(-2)?.type;\n if (prev1 === INFIX_OPERATOR || (prev1 === 'SPACE' && prev2 === INFIX_OPERATOR)) {\n // TOKEN_UMINUS(6)\n this.tokens.push(new Token(PREFIX_OPERATOR, '-', 6, this.at));\n } else {\n // TOKEN_MINUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '-', 3, this.at));\n }\n continue;\n }\n case '/':\n // TOKEN_DIVIDE(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '/', 4, this.at));\n continue;\n case '*':\n // TOKEN_MULTIPLY(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '*', 4, this.at));\n continue;\n case '^':\n // TOKEN_POWER(5)\n this.tokens.push(new Token(INFIX_OPERATOR, '^', 5, this.at));\n continue;\n case '&':\n // TOKEN_CONCAT(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '&', 4, this.at));\n continue;\n case '=':\n // TOKEN_EQ(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '=', 1, this.at));\n continue;\n case '>':\n if (this.get() === '=') {\n this.next();\n // TOKEN_GTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>=', 2, this.at));\n continue;\n }\n // TOKEN_GT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>', 2, this.at));\n continue;\n case '<':\n if (this.get() === '=') {\n this.next();\n // TOKEN_LTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<=', 2, this.at));\n continue;\n }\n if (this.get() === '>') {\n this.next();\n // TOKEN_NE(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '<>', 1, this.at));\n continue;\n }\n // TOKEN_LT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<', 2, this.at));\n continue;\n case '\"': {\n const { buf, closed } = this.getString('\"');\n // TOKEN_VALUE(0)\n this.tokens.push(new Token('VALUE', buf, 0, this.at, closed));\n continue;\n }\n case \"'\": {\n const { buf } = this.getString(\"'\");\n char = `'${buf}'`;\n break;\n }\n case '!': {\n this.foreign = true;\n break;\n // not continue\n }\n case '%': {\n // TOKEN_PERCENT(4)\n this.tokens.push(new Token(POSTFIX_OPERATOR, '%', 4, this.at));\n continue;\n }\n } // switch end\n let buf = char;\n\n while (true) {\n const c = this.get();\n if (c === '(') {\n // TOKEN_FUNCTION(0)\n this.tokens.push(new Token('FUNCTION', buf, 0, this.at), TOKEN_OPEN);\n this.next();\n break;\n }\n if (c == null || SPECIAL_CHARS.has(c)) {\n if (buf.length === 0) {\n break;\n }\n if (buf.match(/^[+-]?(\\d*[.])?\\d+$/)) {\n const tok = new Token('VALUE', parseFloat(buf), 0, this.at);\n tok.raw = buf;\n this.tokens.push(tok);\n } else {\n const bool = BOOLS[buf.toLowerCase()];\n if (bool != null) {\n this.tokens.push(new Token('VALUE', bool, 0, this.at));\n } else if (buf.startsWith('#')) {\n if (buf.indexOf('#REF!') !== -1) {\n this.tokens.push(new Token('UNREFERENCED', buf, 0, this.at));\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('ID_RANGE', resolveIdRange(buf, idMap), 0, this.at));\n } else {\n this.tokens.push(new Token('ID', buf, 0, this.at));\n }\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('RANGE', buf, 0, this.at));\n } else {\n // A token containing '.' alongside letters is a partial function name\n // (e.g. \"RANGE.1\" before the opening paren), not a cell reference.\n // Sheet-qualified refs are excluded: a quoted sheet name ('a.csv'!A1)\n // or any '!' means it's a cross-sheet reference, where dots are part\n // of the sheet/file name — not a function.\n const looksLikeFunctionName =\n !buf.startsWith(\"'\") && buf.indexOf('!') === -1 && buf.includes('.') && /[a-zA-Z]/.test(buf);\n if (looksLikeFunctionName || isNaN(buf[buf.length - 1] as unknown as number)) {\n this.tokens.push(new Token('INVALID_REF', buf, 0, this.at));\n } else {\n this.tokens.push(new Token('REF', buf, 0, this.at));\n }\n }\n }\n break;\n }\n buf += c;\n this.next();\n }\n }\n }\n private skipSpaces() {\n let space: string = '';\n while (this.isWhiteSpace()) {\n space += this.formula[this.index++];\n }\n if (space !== '') {\n this.tokens.push(new Token('SPACE', space, 0, this.at));\n }\n }\n\n private getString(quote = '\"'): { buf: string; closed: boolean } {\n let buf = '';\n\n while (true) {\n const c = this.get();\n this.next();\n if (c == null) {\n return { buf, closed: false };\n }\n if (c === quote) {\n if (quote === '\"' && this.get() === quote) {\n // escape for double quotes\n buf += quote;\n this.next();\n continue;\n } else if (quote === \"'\" && this.get() === quote) {\n // keep consecutive single quotes as is\n buf += c;\n continue;\n } else {\n return { buf, closed: true };\n }\n } else {\n buf += c;\n }\n }\n }\n}\n\nconst resolveIdRange = (range: string, idMap: { [id: Id]: Id }) => {\n const [sheetId, refString] = range.split('!');\n const refs = refString.split(':');\n const done = new Set<number>();\n Object.keys(idMap).forEach((before) => {\n const after = idMap[before];\n // #x -> #y, #$x -> #$y, #x$ -> #y$, #$x$ -> #$y$\n const regex = new RegExp(`(\\\\$)?#${before}\\\\b(\\\\$)?`);\n for (let i = 0; i < refs.length; i++) {\n if (done.has(i)) {\n continue;\n }\n const ref = refs[i];\n const replaced = ref.replace(regex, (_: string, prefix: string, suffix: string) => {\n return `${prefix || ''}#${after}${suffix || ''}`;\n });\n if (replaced === ref) {\n continue;\n }\n refs[i] = replaced;\n done.add(i);\n }\n });\n return `${sheetId}!${refs.join(':')}`;\n};\n\nexport class Parser {\n public index = 0;\n public depth = 0;\n public tokens: Token[];\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n public build() {\n const { expr } = this.parse(false);\n return expr;\n }\n\n private parse(underFunction: boolean) {\n const stack: Expression[] = [];\n let lastOperator: undefined | FunctionEntity;\n\n const complement = (hasNext = false) => {\n if (lastOperator) {\n const outer = stack.pop();\n lastOperator.args.push(outer!);\n }\n return { hasNext, expr: stack.shift() };\n };\n\n while (this.tokens.length > this.index) {\n const token = this.tokens[this.index++];\n if (token.type === 'SPACE') {\n continue;\n }\n if (token.type === 'COMMA') {\n if (!underFunction) {\n throw new FormulaError('#ERROR!', 'Invalid comma');\n }\n return complement(true);\n } else if (\n token.type === 'VALUE' ||\n token.type === 'ID' ||\n token.type === 'ID_RANGE' ||\n token.type === 'REF' ||\n token.type === 'RANGE' ||\n token.type === 'UNREFERENCED' ||\n token.type === 'INVALID_REF'\n ) {\n const expr = token.convert();\n stack.push(expr!);\n } else if (token.type === 'POSTFIX_OPERATOR' && token.entity === '%') {\n const expr = stack.pop();\n if (!expr) {\n throw new FormulaError('#ERROR!', 'Missing expression before %');\n }\n const divideBy100 = new FunctionEntity('divide', 4, [expr, new ValueEntity(100)]);\n stack.push(divideBy100);\n } else if (token.type === 'FUNCTION') {\n this.index++;\n this.depth++;\n const func = token.convert() as FunctionEntity;\n stack.push(func);\n\n while (true) {\n const { expr, hasNext } = this.parse(true);\n if (expr) {\n func.args.push(expr);\n }\n if (!hasNext) {\n break;\n }\n }\n } else if (token.type === 'OPEN') {\n this.depth++;\n const { expr } = this.parse(false);\n stack.push(expr!);\n } else if (token.type === 'CLOSE') {\n if (this.depth-- === 0) {\n throw new FormulaError('#ERROR!', 'Unexpected end paren');\n }\n return complement();\n } else if (token.type === 'INFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n let left = stack.pop();\n if (left == null) {\n if (operator.name === 'minus' || operator.name === 'add') {\n left = ZERO;\n } else {\n throw new FormulaError('#ERROR!', 'Missing left expression');\n }\n }\n\n if (lastOperator == null) {\n operator.args.push(left);\n stack.unshift(operator);\n } else if (operator.precedence > lastOperator.precedence) {\n operator.args.push(left);\n lastOperator.args.push(operator);\n stack.unshift(lastOperator);\n } else {\n const outer = stack.shift();\n operator.args.push(outer!);\n lastOperator.args.push(left);\n stack.unshift(operator);\n }\n lastOperator = operator;\n } else if (token.type === 'PREFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n if (lastOperator) {\n lastOperator.args.push(operator);\n } else {\n stack.unshift(operator);\n }\n lastOperator = operator;\n }\n }\n return complement();\n }\n}\n\n/** Alias for Parser, exported for external tooling (e.g. Debugger). */\nexport const FormulaParser = Parser;\n\nexport const stripSheetName = (sheetName: string) => {\n if (sheetName.charAt(0) === \"'\") {\n sheetName = sheetName.slice(1);\n }\n if (sheetName.charAt(sheetName.length - 1) === \"'\") {\n sheetName = sheetName.slice(0, -1);\n }\n return sheetName;\n};\n\nexport function splitRef(ref: string): { sheetName: string | undefined; addresses: string[] } {\n let sheetName: string | undefined = undefined;\n let addresses: string[] = [];\n\n if (ref.startsWith(\"'\")) {\n let i = 1;\n let name = '';\n\n while (i < ref.length) {\n const char = ref[i];\n const nextChar = ref[i + 1];\n\n if (char === \"'\") {\n if (nextChar === \"'\") {\n name += \"'\";\n i += 2;\n } else if (nextChar === '!') {\n i += 2;\n break;\n } else {\n return { sheetName: undefined, addresses: [] };\n }\n } else {\n name += char;\n i++;\n }\n }\n\n sheetName = name;\n const addressPart = ref.slice(i).trim();\n addresses = addressPart.split(':');\n } else {\n const excl = ref.indexOf('!');\n if (excl !== -1) {\n sheetName = ref.slice(0, excl);\n const addressPart = ref.slice(excl + 1).trim();\n addresses = addressPart.split(':');\n } else {\n addresses = ref.trim().split(':');\n }\n }\n return { sheetName, addresses };\n}\n\nexport const parseRef = (\n ref: string,\n { sheet, operation, dependency }: IdentifyProps,\n): {\n sheet: Sheet;\n sheetId?: number;\n formula?: string;\n sheetName?: string;\n addresses: string[];\n ids: string[];\n} => {\n const { sheetName, addresses } = splitRef(ref);\n const ids: string[] = [];\n if (sheetName) {\n sheet = sheet.getSheetBySheetName(sheetName)!;\n if (sheet == null) {\n return { sheet, sheetName, addresses, ids };\n }\n }\n if (addresses.length === 0) {\n return { sheet, sheetName, addresses, ids };\n }\n const refs: string[] = [];\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n const { y, x, absX, absY } = a2p(address);\n let id = sheet.getId({ y, x });\n\n // if the id is the same as the dependency by the operation,\n // we need to adjust the id based on the operation\n if (id === dependency) {\n if (operation === 'removeRows') {\n id = sheet.getId({ y: y - 1, x });\n } else if (operation === 'removeCols') {\n id = sheet.getId({ y, x: x - 1 });\n }\n }\n if (id == null) {\n refs.push(grantAddressAbsolute(address, !!absX, !!absY) || '?');\n continue;\n }\n ids.push(id);\n refs.push(`${absX ? '$' : ''}#${id}${absY ? '$' : ''}`);\n }\n let formula = `#${sheet.id}!${refs.join(':')}`;\n return {\n sheet,\n sheetName,\n addresses,\n ids,\n formula,\n };\n};\n","import type { AsyncCache, CellType, System } from '../types';\n\nexport const filterCellFields = (cell: CellType, ignoreFields: (keyof CellType)[]): CellType => {\n if (ignoreFields.length === 0) {\n return cell;\n }\n return Object.fromEntries(\n Object.entries(cell).filter(([key]) => !ignoreFields.includes(key as keyof CellType)),\n ) as CellType;\n};\n\n/**\n * Ensure that `registry.systems[id]` exists, initialising it with sensible\n * defaults when missing. Any keys present in `defaults` that are absent on\n * the existing System object are filled in.\n * Returns the (possibly freshly-created) `System` object.\n */\nexport const ensureSys = (\n registry: { systems: Record<string, System> },\n id: string,\n defaults: Partial<System> = {},\n): System => {\n if (registry.systems[id] == null) {\n registry.systems[id] = {};\n }\n const sys = registry.systems[id];\n for (const key of Object.keys(defaults) as (keyof System)[]) {\n (sys as any)[key] ??= defaults[key];\n }\n return sys;\n};\n\n/**\n * Write an `AsyncCache` entry into `cell.asyncCaches[key]`, creating the\n * `asyncCaches` record if it does not yet exist.\n */\nexport const setAsyncCache = (cell: CellType, key: string, ac: AsyncCache): void => {\n if (!cell.asyncCaches) {\n cell.asyncCaches = {};\n }\n cell.asyncCaches[key] = ac;\n};\n","import type { Address, AreaType, CellsByAddressType, CellType, Id } from '../types';\nimport type { UserSheet } from './sheet';\nimport { a2p, p2a, x2c, c2x, y2r } from './coords';\nimport { createMatrix } from './spatial';\nimport { filterCellFields } from './cell';\nimport type { CellFilter, Resolution } from '../types';\nimport type { SolveOptions } from '../formula/solver';\n\nconst noFilter: CellFilter = () => true;\n\ntype CellField = keyof CellType;\n\ntype ToProps = {\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n area?: AreaType;\n};\n\ntype ToCellProps = ToProps & {\n ignoreFields?: CellField[];\n};\n\n/**\n * @internal — used by Sheet._toValueMatrix and solver.ts; keeps resolution for internal wiring.\n */\n\nexport type ToValueMatrixProps = ToProps;\n\nexport type ToCellMatrixProps = ToCellProps;\n\nexport type ToValueObjectProps = ToProps & {\n addresses?: Address[];\n};\n\nexport type ToCellObjectProps = ToCellProps & {\n addresses?: Address[];\n};\n\nexport type ToValueRowsProps = ToProps & {\n rows?: number[];\n};\n\nexport type ToCellRowsProps = ToCellProps & {\n rows?: number[];\n};\n\nexport type ToValueColsProps = ToProps & {\n cols?: (number | string)[];\n};\n\nexport type ToCellColsProps = ToCellProps & {\n cols?: (number | string)[];\n};\n\nexport const getCellByAddress = (\n sheet: UserSheet,\n address: Address,\n options: SolveOptions = {},\n): CellType | undefined => {\n const point = a2p(address);\n return sheet.getCell(point, options);\n};\n\nexport const toValueMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, asScalar = false }: ToValueMatrixProps = {},\n): any[][] => {\n return sheet.__raw__._toValueMatrix({ area, resolution, raise, filter, asScalar });\n};\n\nexport type ToValueMatrixAsyncProps = ToValueMatrixProps & {\n /** Wall-clock budget (ms) to spend before yielding a chunk. Default 12 (≈one frame). */\n frameBudgetMs?: number;\n /** Called after each chunk with row-granular progress (and once at 0 and at 100%). */\n onProgress?: (progress: { done: number; total: number }) => void;\n /** How to yield between chunks. Pass a macrotask/rAF yielder so the UI can paint. */\n yieldControl?: () => Promise<void> | void;\n};\n\n/**\n * Async, progress-reporting, non-blocking counterpart to {@link toValueMatrix}.\n * Materializing every cell (lazy population + formula solve) is O(cells) and\n * blocks the thread; this time-slices the scan, reports progress, and yields so\n * the host stays responsive and can render a progress bar. Returns the same\n * matrix as toValueMatrix.\n */\nexport const toValueMatrixAsync = (\n sheet: UserSheet,\n {\n area,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n frameBudgetMs,\n onProgress,\n yieldControl,\n }: ToValueMatrixAsyncProps = {},\n): Promise<any[][]> => {\n return sheet.__raw__._toValueMatrixAsync({\n area,\n resolution,\n raise,\n filter,\n asScalar,\n frameBudgetMs,\n onProgress,\n yieldControl,\n });\n};\n\nexport const toValueObject = (\n sheet: UserSheet,\n {\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n addresses,\n area,\n asScalar = false,\n }: ToValueObjectProps = {},\n): { [address: Address]: any } => {\n const result: { [Address: Address]: any } = {};\n if (addresses) {\n for (const addr of addresses) {\n const point = a2p(addr);\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy(point);\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point });\n }\n result[addr] = fieldValue;\n }\n }\n return result;\n }\n const { top, left, bottom, right } = area ?? sheet.area;\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n result[p2a({ y, x })] = fieldValue;\n }\n }\n }\n return result;\n};\n\nexport const toValueRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, area, asScalar = false }: ToValueRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n row[x2c(x)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toValueCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, area, asScalar = false }: ToValueColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n col[y2r(y)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toCellMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, ignoreFields = [] }: ToCellMatrixProps = {},\n): (CellType | null)[][] => {\n const { top, left, bottom, right } = area ?? sheet.area;\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n const filteredCell = filterCellFields(cell, ignoreFields);\n matrix[y - top][x - left] = filteredCell;\n }\n }\n }\n return matrix;\n};\n\nexport const toCellObject = (\n sheet: UserSheet,\n {\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n addresses,\n area,\n ignoreFields = [],\n }: ToCellObjectProps = {},\n): CellsByAddressType => {\n const result: CellsByAddressType = {};\n if (addresses) {\n for (const addr of addresses) {\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[addr] = filterCellFields(cell, ignoreFields);\n }\n }\n return result;\n }\n const { top, left, bottom, right } = area ?? sheet.area;\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[p2a({ y, x })] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const toCellRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, area, ignoreFields = [] }: ToCellRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n row[x2c(x)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const escapeSheetName = (name: string): string => {\n const escaped = name.replace(/'/g, \"''\");\n return `'${escaped}'`;\n};\n\nexport const toSheetPrefix = (name?: string): string => {\n if (name) {\n return `${escapeSheetName(name)}!`;\n }\n return '';\n};\n\nexport const toCellCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, area, ignoreFields = [] }: ToCellColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n col[y2r(y)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n","import { OperationType as operations } from '../types';\n\nexport const RemoveRows: operations = 0b00000000000000000000000000000000000000000000000000001; // 1\nexport const RemoveCols: operations = 0b00000000000000000000000000000000000000000000000000010; // 2\nexport const InsertRowsAbove: operations = 0b00000000000000000000000000000000000000000000000000100; // 4\nexport const InsertRowsBelow: operations = 0b00000000000000000000000000000000000000000000000001000; // 8\nexport const InsertColsLeft: operations = 0b00000000000000000000000000000000000000000000000010000; // 16\nexport const InsertColsRight: operations = 0b00000000000000000000000000000000000000000000000100000; // 32\nexport const MoveFrom: operations = 0b00000000000000000000000000000000000000000000001000000; // 64\nexport const MoveTo: operations = 0b00000000000000000000000000000000000000000000010000000; // 128\nexport const Write: operations = 0b00000000000000000000000000000000000000000000100000000; // 256\nexport const Style: operations = 0b00000000000000000000000000000000000000000001000000000; // 512\nexport const Copy: operations = 0b00000000000000000000000000000000000000010000000000000; // 8192\nexport const Resize: operations = 0b00000000000000000000000000000000000000000010000000000; // 1024\nexport const SetPolicy: operations = 0b00000000000000000000000000000000000000100000000000000; // 16384\nexport const Sort: operations = 0b00000000000000000000000000000000000001000000000000000; // 32768\nexport const Filter: operations = 0b00000000000000000000000000000000000010000000000000000; // 65536\nexport const SetLabel: operations = 0b00000000000000000000000000000000000100000000000000000; // 131072\n\nexport const NoOperation: operations = 0;\n\nexport const Move: operations = MoveFrom | MoveTo; // 192\n\nexport const Update: operations = Write | Style | Copy | Resize | SetPolicy | SetLabel;\n\nexport const InsertRows: operations = InsertRowsAbove | InsertRowsBelow; // 12\n\nexport const InsertCols: operations = InsertColsLeft | InsertColsRight; // 48\n\nexport const Add: operations = InsertRows | InsertCols; // 60\n\nexport const Delete: operations = RemoveRows | RemoveCols; // 3\n\nexport const ReadOnly: operations = Update | Delete | Add | Move;\n\nexport const ColumnMenu: operations = Filter | Sort | SetLabel;\n\nexport const RowMenu: operations = 0b00000000000000000000000000000000010000000000000000000; // 524288\n\nexport const ViewOnly: operations = ReadOnly | ColumnMenu;\n\nexport const hasOperation = (operation: operations | undefined, flag: operations) => {\n if (operation === undefined) {\n return false;\n }\n return (operation & flag) === flag;\n};\n\n// Don't use this function in production\nexport const debugOperations = (prevention: operations | undefined) => {\n const operations: string[] = [];\n if (hasOperation(prevention, RemoveRows)) {\n operations.push('RemoveRow');\n }\n if (hasOperation(prevention, RemoveCols)) {\n operations.push('RemoveCol');\n }\n if (hasOperation(prevention, InsertRowsAbove)) {\n operations.push('InsertRowAbove');\n }\n if (hasOperation(prevention, InsertRowsBelow)) {\n operations.push('InsertRowBelow');\n }\n if (hasOperation(prevention, InsertColsLeft)) {\n operations.push('InsertColLeft');\n }\n if (hasOperation(prevention, InsertColsRight)) {\n operations.push('InsertColRight');\n }\n if (hasOperation(prevention, MoveFrom)) {\n operations.push('MoveFrom');\n }\n if (hasOperation(prevention, MoveTo)) {\n operations.push('MoveTo');\n }\n if (hasOperation(prevention, Write)) {\n operations.push('Write');\n }\n if (hasOperation(prevention, Style)) {\n operations.push('Style');\n }\n if (hasOperation(prevention, Resize)) {\n operations.push('Resize');\n }\n if (hasOperation(prevention, SetPolicy)) {\n operations.push('SetPolicy');\n }\n if (hasOperation(prevention, SetLabel)) {\n operations.push('SetLabel');\n }\n if (hasOperation(prevention, Sort)) {\n operations.push('Sort');\n }\n if (hasOperation(prevention, Filter)) {\n operations.push('Filter');\n }\n return operations;\n};\n","import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport timezone from 'dayjs/plugin/timezone.js';\ndayjs.extend(timezone);\ndayjs.extend(utc);\n\nconst NUMS = new Set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);\nconst NUMS_Z = new Set([...NUMS, 'Z', 'z']);\nconst JFMASOND = new Set(['J', 'F', 'M', 'A', 'S', 'O', 'N', 'D', ...NUMS]);\nconst NBRYNLGPTVC = new Set(['N', 'B', 'R', 'Y', 'N', 'L', 'G', 'P', 'T', 'V', 'C', ...NUMS_Z]);\n\n// Reject strings that contain words not typically found in date representations.\n// Date strings consist of month names, digits, separators, and timezone abbreviations.\n// If a word is purely alphabetic and not a recognized date token, it's likely not a date.\nconst DATE_WORDS = new Set([\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n 'january',\n 'february',\n 'march',\n 'april',\n 'june',\n 'july',\n 'august',\n 'september',\n 'october',\n 'november',\n 'december',\n 'mon',\n 'tue',\n 'wed',\n 'thu',\n 'fri',\n 'sat',\n 'sun',\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n 'am',\n 'pm',\n 'utc',\n 'gmt',\n 'est',\n 'cst',\n 'mst',\n 'pst',\n 'jst',\n 'cet',\n 'eet',\n 'ist',\n 'aest',\n 'edt',\n 'cdt',\n 'mdt',\n 'pdt',\n 'bst',\n 'hst',\n 'akst',\n 'akdt',\n 'nzst',\n 'nzdt',\n 't',\n 'z',\n]);\n\nexport function parseDate(value: string): Date | undefined {\n const first = value[0];\n if (first == null || !JFMASOND.has(first.toUpperCase())) {\n return;\n }\n if (!NBRYNLGPTVC.has(value[value.length - 1].toUpperCase())) {\n return;\n }\n if (value.match(/[=*&#@!?[\\]{}\"'()|%\\\\<>~+\\r\\n]/)) {\n return;\n }\n const words = value.split(/[\\s,/\\-:.]+/).filter(Boolean);\n for (const word of words) {\n if (/^[a-zA-Z]+$/.test(word) && !DATE_WORDS.has(word.toLowerCase())) {\n return;\n }\n }\n let timeZone = 'UTC';\n try {\n timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {}\n try {\n const day = dayjs.tz(value, timeZone);\n return day.toDate();\n } catch (e) {}\n}\n","import type { CellPatchType, CellType, OperationType, PointType } from '../types';\nimport type { Sheet, UserSheet } from '../lib/sheet';\nimport { isSheet } from '../formula/functions/__base';\nimport dayjs from 'dayjs';\nimport { FormulaError } from '../formula/formula-error';\nimport { Pending } from '../sentinels';\nimport { Time } from '../lib/time';\nimport { parseDate } from '../lib/date';\n\nexport type AutocompleteOption = {\n value: any;\n label?: any;\n keywords?: string[];\n tooltip?: any;\n};\n\nexport type SelectProps = {\n sheet: UserSheet;\n point: PointType;\n current?: CellType;\n next?: CellType;\n operation: OperationType;\n};\n\nexport type SerializeForClipboardProps = {\n sheet: UserSheet;\n point: PointType;\n};\n\nexport type SelectFallbackProps = {\n sheet: UserSheet;\n point: PointType;\n value: any;\n};\n\nexport type Scalar = string | number | boolean | null | undefined;\n\nexport type ScalarProps<T = any> = {\n value?: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type RenderProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n apply?: (sheet: UserSheet) => void;\n};\n\nexport type SerializeProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type PolicyMixinType = {\n // format settings\n datetimeFormat?: string;\n dateFormat?: string;\n timeFormat?: string;\n decimalPrecision?: number;\n\n // render\n render?: (props: RenderProps) => any;\n renderCallback?: (rendered: any, props: RenderProps) => any;\n renderString?: (props: RenderProps<string>) => any;\n renderNumber?: (props: RenderProps<number>) => any;\n renderBool?: (props: RenderProps<boolean>) => any;\n renderDate?: (props: RenderProps<Date>) => any;\n renderTime?: (props: RenderProps<Time>) => any;\n renderArray?: (props: RenderProps<any[]>) => any;\n renderObject?: (props: RenderProps<any>) => any;\n renderNull?: (props: RenderProps<null | undefined>) => any;\n renderSheet?: (props: RenderProps<UserSheet>) => any;\n renderRowHeaderLabel?: (n: number) => string | null;\n renderColHeaderLabel?: (n: number) => string | null;\n\n // serialize\n serialize?: (props: SerializeProps) => string;\n serializeString?: (props: SerializeProps<string>) => string;\n serializeNumber?: (props: SerializeProps<number>) => string;\n serializeBool?: (props: SerializeProps<boolean>) => string;\n serializeDate?: (props: SerializeProps<Date>) => string;\n serializeTime?: (props: SerializeProps<Time>) => string;\n serializeArray?: (props: SerializeProps<any[]>) => string;\n serializeNull?: (props: SerializeProps<null | undefined>) => string;\n serializeFormulaError?: (props: SerializeProps<FormulaError>) => string;\n serializeError?: (props: SerializeProps<Error>) => string;\n\n // deserialize\n deserialize?: (value: string, cell?: CellType) => CellType;\n deserializeRaw?: (value: any, cell?: CellType) => CellType;\n deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n // Priority slot: called before built-in deserializers when defined\n deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n // Built-in deserializers\n deserializeNumber?: (value: string, cell?: CellType) => CellPatchType<number | undefined>;\n deserializeBool?: (value: string, cell?: CellType) => CellPatchType<boolean | undefined>;\n deserializeDate?: (value: string, cell?: CellType) => CellPatchType<Date | undefined>;\n deserializeTime?: (value: string, cell?: CellType) => CellPatchType<Time | undefined>;\n deserializeAny?: (value: string, cell?: CellType) => CellPatchType<string | undefined>;\n\n // toScalar\n toScalar?: (props: ScalarProps) => Scalar;\n toScalarString?: (props: ScalarProps<string>) => Scalar;\n toScalarNumber?: (props: ScalarProps<number>) => Scalar;\n toScalarBool?: (props: ScalarProps<boolean>) => Scalar;\n toScalarDate?: (props: ScalarProps<Date>) => Scalar;\n toScalarTime?: (props: ScalarProps<Time>) => Scalar;\n toScalarArray?: (props: ScalarProps<any[]>) => Scalar;\n toScalarNull?: (props: ScalarProps<null | undefined>) => Scalar;\n\n // select\n getSelectOptions?: () => AutocompleteOption[];\n getSelectFallback?: (props: SelectFallbackProps) => CellType | undefined;\n select?: (props: SelectProps) => CellType | undefined;\n serializeForClipboard?: (props: SerializeForClipboardProps) => string;\n};\n\ntype PolicyProps = {\n mixins?: PolicyMixinType[];\n priority?: number;\n};\n\nconst BOOLS = { true: true, false: false } as { [s: string]: boolean };\n\nexport class Policy implements PolicyMixinType {\n public priority: number = 0;\n\n public datetimeFormat: string = 'YYYY-MM-DD HH:mm:ss';\n public dateFormat: string = 'YYYY-MM-DD';\n public timeFormat: string = 'HH:mm:ss';\n public decimalPrecision: number = 14;\n\n public deserializeFunctions: ((value: string, cell?: CellType) => CellPatchType<any>)[] = [];\n public deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n public deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n public renderCallback?: (rendered: any, props: RenderProps) => any;\n\n constructor(props?: PolicyProps) {\n this.priority = props?.priority ?? 1;\n this.applyMixins(props?.mixins);\n\n this.registerDeserializeFunctions();\n }\n\n private registerDeserializeFunctions(): void {\n this.deserializeFunctions = [\n ...(this.deserializeFirst ? [this.deserializeFirst.bind(this)] : []),\n this.deserializeNumber.bind(this),\n this.deserializeTime.bind(this),\n this.deserializeDate.bind(this),\n this.deserializeBool.bind(this),\n this.deserializeAny.bind(this),\n ];\n }\n\n private applyMixins(mixins?: PolicyMixinType[]) {\n if (mixins == null) {\n return;\n }\n const subclassProto = Object.getPrototypeOf(this);\n for (const mixin of mixins) {\n for (const key in mixin) {\n // Methods defined in a subclass take priority over mixins\n const overriddenBySubclass =\n subclassProto !== Policy.prototype && Object.prototype.hasOwnProperty.call(subclassProto, key);\n if (!overriddenBySubclass) {\n (this as any)[key] = (mixin as any)[key];\n }\n }\n }\n }\n\n // --- RENDER ---\n\n public render(props: RenderProps): any {\n let { value, cell } = props;\n const { sheet, point } = props;\n\n // Cell lookup: if cell not provided, resolve from sheet (entry-point usage)\n if (cell == null) {\n cell = sheet.getCell(point, { resolution: 'EVALUATED', raise: true }) ?? {};\n value = cell.value;\n }\n\n let rendered: any;\n\n if (Pending.is(value)) {\n rendered = '';\n } else if (value == null) {\n rendered = this.renderNull({ ...props, value: value as null | undefined, cell });\n } else {\n switch (typeof value) {\n case 'object':\n if (value instanceof Date) {\n rendered = this.renderDate({ ...props, value, cell });\n } else if (Time.is(value)) {\n rendered = this.renderTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n rendered = this.renderArray({ ...props, value, cell });\n } else if (FormulaError.is(value)) {\n throw value;\n } else if (isSheet(value)) {\n rendered = this.renderSheet({ ...props, value, cell });\n } else {\n rendered = this.renderObject({ ...props, value, cell });\n }\n break;\n case 'string':\n rendered = this.renderString({ ...props, value, cell });\n break;\n case 'number':\n rendered = this.renderNumber({ ...props, value, cell });\n break;\n case 'boolean':\n rendered = this.renderBool({ ...props, value, cell });\n break;\n case 'function':\n rendered = (value as () => any)();\n break;\n default:\n rendered = '';\n }\n }\n\n return this.renderCallback ? this.renderCallback(rendered, { ...props, value, cell }) : rendered;\n }\n\n public renderString({ value }: RenderProps<string>): any {\n return value!;\n }\n\n public renderBool({ value }: RenderProps<boolean>): any {\n return value ? 'TRUE' : 'FALSE';\n }\n\n public renderNumber({ value }: RenderProps<number>): any {\n if (isNaN(value!)) {\n return 'NaN';\n }\n return parseFloat(value!.toPrecision(this.decimalPrecision));\n }\n\n public renderDate({ value }: RenderProps<Date>): any {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public renderTime({ value }: RenderProps<Time>): any {\n return value!.stringify(this.timeFormat);\n }\n\n public renderArray(props: RenderProps<any[]>): any {\n let { value, cell } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.render({ ...props, value, cell });\n }\n\n public renderObject({ value }: RenderProps<any>): any {\n return JSON.stringify(value);\n }\n\n public renderNull(_props: RenderProps<null | undefined>): any {\n return '';\n }\n\n public renderSheet({ value: childSheet, ...rest }: RenderProps<UserSheet>): any {\n const at = rest.sheet.getId(rest.point);\n const stripped = childSheet.__raw__.strip({ raise: true, at });\n return this.render({ ...rest, value: stripped });\n }\n\n public renderRowHeaderLabel(_n: number): string | null {\n return null;\n }\n\n public renderColHeaderLabel(_n: number): string | null {\n return null;\n }\n\n // --- TO SCALAR ---\n\n public toScalar(props: ScalarProps): Scalar {\n const { value, cell, sheet, point } = props;\n if (Pending.is(value)) {\n return undefined;\n }\n if (value == null) {\n return this.toScalarNull({ value: value as null | undefined, cell, sheet, point });\n }\n switch (typeof value) {\n case 'string':\n return this.toScalarString({ value, cell, sheet, point });\n case 'number':\n return this.toScalarNumber({ value, cell, sheet, point });\n case 'boolean':\n return this.toScalarBool({ value, cell, sheet, point });\n case 'object':\n if (value instanceof Date) {\n return this.toScalarDate({ value, cell, sheet, point });\n } else if (Time.is(value)) {\n return this.toScalarTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n return this.toScalarArray({ value, cell, sheet, point });\n } else if (FormulaError.is(value)) {\n throw value;\n }\n return undefined;\n default:\n return undefined;\n }\n }\n\n public toScalarString({ value }: ScalarProps<string>): Scalar {\n return value;\n }\n\n public toScalarNumber({ value }: ScalarProps<number>): Scalar {\n return value?.toPrecision(this.decimalPrecision);\n }\n\n public toScalarBool({ value }: ScalarProps<boolean>): Scalar {\n return value;\n }\n\n public toScalarDate({ value }: ScalarProps<Date>): Scalar {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public toScalarTime({ value }: ScalarProps<Time>): Scalar {\n return value!.stringify(this.timeFormat);\n }\n\n public toScalarArray({ value, cell, sheet, point }: ScalarProps<any[]>): Scalar {\n let v = value?.[0];\n if (Array.isArray(v)) {\n v = v[0];\n }\n return this.toScalar({ value: v, cell, sheet, point });\n }\n\n public toScalarNull(_props: ScalarProps<null | undefined>): Scalar {\n return null;\n }\n\n // --- SERIALIZE ---\n\n public serialize({ value, cell, sheet, point }: SerializeProps): string {\n if (value === undefined) {\n value = cell?.value;\n }\n if (Pending.is(value)) {\n return '';\n }\n if (value instanceof Date) {\n return this.serializeDate({ value, cell, sheet, point } as SerializeProps<Date>);\n }\n if (Time.is(value)) {\n return this.serializeTime({ value: Time.ensure(value), cell, sheet, point } as SerializeProps<Time>);\n }\n if (value == null) {\n return this.serializeNull({ cell, sheet, point } as SerializeProps<null | undefined>);\n }\n if (Array.isArray(value)) {\n return this.serializeArray({ value, cell, sheet, point } as SerializeProps<any[]>);\n }\n if (value instanceof FormulaError) {\n return this.serializeFormulaError({ value, cell, sheet, point } as SerializeProps<FormulaError>);\n }\n if (value instanceof Error) {\n return this.serializeError({ value, cell, sheet, point } as SerializeProps<Error>);\n }\n return value.toString();\n }\n\n public serializeString({ value }: SerializeProps<string>): string {\n return value;\n }\n\n public serializeBool({ value }: SerializeProps<boolean>): string {\n return value ? 'true' : 'false';\n }\n\n public serializeNumber({ value }: SerializeProps<number>): string {\n if (isNaN(value)) {\n return 'NaN';\n }\n return parseFloat(value.toPrecision(this.decimalPrecision)).toString();\n }\n\n public serializeDate({ value }: SerializeProps<Date>): string {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public serializeTime({ value }: SerializeProps<Time>): string {\n return value.stringify(this.timeFormat);\n }\n\n public serializeArray(props: SerializeProps<any[]>): string {\n let { value } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.serialize({ ...props, value });\n }\n\n public serializeNull(_props: SerializeProps<null | undefined>): string {\n return '';\n }\n\n public serializeFormulaError({ value }: SerializeProps<FormulaError>): string {\n return value.code;\n }\n\n public serializeError(_props: SerializeProps<Error>): string {\n return '';\n }\n\n public serializeForClipboard(props: SerializeForClipboardProps): string {\n const { point, sheet } = props;\n return sheet.getSerializedValue({ point }) ?? '';\n }\n\n // --- DESERIALIZE ---\n public deserializeValue(value: any, cell: CellType): CellType {\n try {\n const parsed = typeof value !== 'string' ? this.deserializeRaw(value, cell) : this.deserialize(value, cell);\n if (this.deserializeCallback) {\n return this.deserializeCallback(parsed, cell);\n }\n return parsed;\n } catch (e) {\n return { ...cell, value: String(e) };\n }\n }\n\n public deserializeRaw(value: any, cell?: CellType): CellType {\n if (Time.is(value)) {\n value = Time.ensure(value);\n }\n return { ...cell, value };\n }\n\n public deserialize(value: string, cell?: CellType): CellPatchType<any> {\n if (value[0] === \"'\") {\n return { ...cell, value };\n }\n for (let i = 0; i < this.deserializeFunctions.length; i++) {\n const result = this.deserializeFunctions[i](value, cell);\n if (result?.value !== undefined) {\n return { ...cell, ...result };\n }\n }\n if (value === '') {\n return { ...cell, value: undefined };\n }\n return { ...cell, value };\n }\n\n public deserializeAny(value: string, _cell?: CellType): CellPatchType<string | undefined> {\n if (value == null || value === '') {\n return { value: undefined };\n }\n return { value };\n }\n\n public deserializeBool(value: string, _cell?: CellType): CellPatchType<boolean | undefined> {\n return { value: BOOLS[value.toLowerCase()] };\n }\n\n public deserializeNumber(value: string, _cell?: CellType): CellPatchType<number | undefined> {\n const m = value.match(/^-?[\\d.]+$/);\n if (m != null && value.match(/\\.$/) == null && (value.match(/\\./g) || []).length <= 1) {\n return { value: parseFloat(value) };\n }\n return { value: undefined };\n }\n\n public deserializeTime(value: string, _cell?: CellType): CellPatchType<Time | undefined> {\n if (value.length < 3 || isNaN(value[value.length - 1] as unknown as number)) {\n return { value: undefined };\n }\n return { value: Time.parse(value) };\n }\n\n public deserializeDate(value: string, _cell?: CellType): CellPatchType<Date | undefined> {\n return { value: parseDate(value) };\n }\n\n // --- SELECT ---\n\n public getSelectFallback(_props: SelectFallbackProps): any {\n return { value: null };\n }\n\n public getSelectOptions(): AutocompleteOption[] {\n return [];\n }\n\n public select(props: SelectProps): CellType | undefined {\n const { next, sheet, point } = props;\n const options = this.getSelectOptions();\n if (options.length === 0) {\n return next;\n }\n const ok = options.some((o) => o.value === next?.value);\n if (!ok) {\n return { ...next, ...this.getSelectFallback({ sheet, point, value: next?.value }) };\n }\n return next;\n }\n}\n\nexport type PolicyType = Policy;\nexport const DEFAULT_POLICY_NAME = 'default';\nexport const nonePolicy = new Policy({ priority: 0 });\n","import type { FilterCondition, FilterConditionMethod, FilterConfig } from '../types';\nimport { parseDate } from './date';\nimport { Time } from './time';\n\ntype FilterFunction = (condition: FilterCondition, cellValue: any) => boolean;\n\nconst _str = (v: any): string => (v == null ? '' : String(v));\n\ntype ValueType = 'number' | 'date' | 'time' | 'boolean' | 'string';\n\nfunction detectType(cellValue: any): ValueType {\n if (typeof cellValue === 'number') {\n return 'number';\n }\n if (cellValue instanceof Date) {\n return 'date';\n }\n if (Time.is(cellValue)) {\n return 'time';\n }\n if (typeof cellValue === 'boolean') {\n return 'boolean';\n }\n return 'string';\n}\n\nfunction parseAsType(v: string, type: ValueType): { ok: boolean; num: number } {\n switch (type) {\n case 'number': {\n let s = v.replace(/[,_]/g, '');\n let scale = 1;\n if (s.endsWith('%')) {\n s = s.slice(0, -1);\n scale = 0.01;\n }\n const n = Number(s);\n return { ok: !isNaN(n), num: n * scale };\n }\n case 'date': {\n const d = parseDate(v);\n if (!d) {\n return { ok: false, num: NaN };\n }\n return { ok: true, num: d.getTime() };\n }\n case 'time': {\n const td = Time.parse(v);\n return td ? { ok: true, num: td.toMilliseconds() } : { ok: false, num: NaN };\n }\n case 'boolean': {\n const bv = v.toLowerCase();\n if (bv === 'true') {\n return { ok: true, num: 1 };\n }\n if (bv === 'false') {\n return { ok: true, num: 0 };\n }\n return { ok: false, num: NaN };\n }\n default:\n return { ok: false, num: NaN };\n }\n}\n\nfunction toNumeric(cellValue: any, type: ValueType): number {\n switch (type) {\n case 'number':\n return cellValue as number;\n case 'date':\n return (cellValue as Date).getTime();\n case 'time':\n return Time.ensure(cellValue).toMilliseconds();\n case 'boolean':\n return cellValue ? 1 : 0;\n default:\n return NaN;\n }\n}\n\nconst filterEq: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterNe: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return !condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return !condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterGt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) > condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum > parsed.num;\n};\n\nconst filterGte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) >= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum >= parsed.num;\n};\n\nconst filterLt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) < condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum < parsed.num;\n};\n\nconst filterLte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) <= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum <= parsed.num;\n};\n\nconst filterBlank: FilterFunction = (_condition, cellValue) => {\n return cellValue == null || _str(cellValue) === '';\n};\n\nconst filterNonblank: FilterFunction = (_condition, cellValue) => {\n return cellValue != null && _str(cellValue) !== '';\n};\n\nconst filterIncludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nconst filterExcludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return !condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nexport const filterFunctions: Record<FilterConditionMethod, FilterFunction> = {\n eq: filterEq,\n ne: filterNe,\n gt: filterGt,\n gte: filterGte,\n lt: filterLt,\n lte: filterLte,\n blank: filterBlank,\n nonblank: filterNonblank,\n includes: filterIncludes,\n excludes: filterExcludes,\n};\n\nexport function evaluateFilterCondition(condition: FilterCondition, cellValue: any): boolean {\n const fn = filterFunctions[condition.method];\n return fn ? fn(condition, cellValue) : true;\n}\n\nexport function evaluateFilterConfig(filter: FilterConfig, cellValue: any): boolean {\n const mode = filter.mode ?? 'or';\n if (filter.conditions.length === 0) {\n return true;\n }\n if (mode === 'and') {\n return filter.conditions.every((c) => evaluateFilterCondition(c, cellValue));\n } else {\n return filter.conditions.some((c) => evaluateFilterCondition(c, cellValue));\n }\n}\n","import { CellsByIdType, Id } from '../types';\nimport { Sheet } from './sheet';\n\nexport class ReferencePreserver {\n public map: { [id: Id]: Id } = {};\n private sheet: Sheet;\n private dependentIds: Set<Id> = new Set<Id>();\n\n constructor(sheet: Sheet) {\n this.sheet = sheet;\n }\n\n collectDependents(...ids: Id[]) {\n ids.forEach((id) => {\n this.sheet.registry.systems[id]?.dependents?.forEach((did) => {\n this.dependentIds.add(did);\n });\n });\n }\n\n /**\n * Compare two idMatrix snapshots (`before` and `after`) and populate\n * `this.map` and collect dependents for every position where the occupying\n * cell ID changed. Works for any rearrangement (sort, move, etc.).\n */\n buildMap(before: Id[], after: Id[]) {\n for (let i = 0; i < before.length; i++) {\n const prevId = before[i];\n const currId = after[i];\n if (prevId != null && currId != null && prevId !== currId) {\n this.collectDependents(prevId, currId);\n this.map[prevId] = currId;\n }\n }\n }\n\n resolveDependents(operation?: 'move' | 'removeRows' | 'removeCols'): CellsByIdType {\n this.sheet.clearAddressCaches();\n const diffBefore: CellsByIdType = {};\n this.dependentIds.forEach((id) => {\n const dep = this.sheet.registry.data[id];\n if (dep == null) {\n return;\n }\n diffBefore[id] = { ...dep };\n this.sheet.clearDependencies(id);\n dep.value = this.sheet.processFormula(dep.value, {\n dependency: id,\n idMap: this.map,\n operation,\n });\n });\n\n return diffBefore;\n }\n}\n","import {\n Id,\n Ids,\n IdMatrix,\n AreaType,\n CellsByIdType,\n CellsByAddressType,\n PointType,\n Address,\n CellFilter,\n MatrixType,\n CellType,\n FilterConfig,\n HistoryType,\n HistorySortRowsType,\n StorePatchType,\n ShapeType,\n RectType,\n OperatorType,\n OperationType,\n RawCellType,\n ExtraPointType,\n RefLike,\n Resolution,\n MoveRelations,\n Y,\n X,\n System,\n} from '../types';\nimport { among, areaShape, createMatrix, expandRange, getMaxSizesFromCells, matrixShape } from './spatial';\nimport { a2p, x2c, c2x, p2a, y2r, grantAddressAbsolute } from './coords';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { Lexer, ProcessFormulaProps } from '../formula/evaluator';\nimport { FormulaError } from '../formula/formula-error';\nimport { solveFormula, SolveOptions, solveSheet, stripSheet } from '../formula/solver';\nimport { ensureSys, filterCellFields } from './cell';\nimport { escapeSheetName, toSheetPrefix } from './sheet_utils';\n\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n DEFAULT_HISTORY_LIMIT,\n DEFAULT_KEY,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '../constants';\nimport { Pending, SOLVING, NONE, Spilling } from '../sentinels';\nimport * as operation from './operation';\n\nconst shouldTracking = (op: string) => {\n switch (op) {\n case 'INSERT_ROWS':\n case 'INSERT_COLS':\n case 'REMOVE_ROWS':\n case 'REMOVE_COLS':\n case 'MOVE':\n case 'SORT_ROWS':\n return true;\n }\n return false;\n};\nimport { Registry, createRegistry } from './book';\nimport { nonePolicy, PolicyType, DEFAULT_POLICY_NAME, RenderProps, ScalarProps } from '../policy/core';\nimport { evaluateFilterConfig } from './filter';\nimport { ReferencePreserver } from './reference';\n\ntype CellField = keyof CellType;\n\nexport type SheetLimits = {\n minRows?: number;\n maxRows?: number;\n minCols?: number;\n maxCols?: number;\n};\n\ntype Props = {\n limits?: SheetLimits;\n functions?: FunctionMapping;\n name?: string;\n registry?: Registry;\n /** Opt into eager resolution for this sheet (see {@link Sheet.eager}). */\n eager?: boolean;\n};\n\nconst noFilter: CellFilter = () => true;\n\ntype MoveProps = {\n srcSheet?: UserSheet;\n src: AreaType;\n dst: AreaType;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n historicize?: boolean;\n};\n\nexport interface UserSheet {\n changedTime: number;\n lastChangedTime?: number;\n area: AreaType;\n top: number;\n left: number;\n bottom: number;\n right: number;\n minNumRows: number;\n maxNumRows: number;\n minNumCols: number;\n maxNumCols: number;\n headerWidth: number;\n headerHeight: number;\n name: string;\n\n /**\n * Returns the raw sheet object, which is used for internal operations.\n * This is not intended for public use and may change in future versions.\n */\n __raw__: Sheet;\n\n getRectSize(area: AreaType): RectType;\n getCell(point: PointType, options?: { resolution?: Resolution; raise?: boolean }): CellType | undefined;\n getPolicy(point: PointType): PolicyType;\n get numRows(): number;\n get numCols(): number;\n get shape(): ShapeType;\n move(args: MoveProps): UserSheet;\n copy(args: MoveProps & { onlyValue?: boolean }): UserSheet;\n update(args: {\n diff: CellsByAddressType;\n historicize?: boolean;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n writeMatrix(args: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n write(args: { point: PointType; value: string; updateChangedTime?: boolean; reflection?: StorePatchType }): UserSheet;\n insertRows(args: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeRows(args: { y: number; numRows: number; reflection?: StorePatchType }): UserSheet;\n insertCols(args: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeCols(args: { x: number; numCols: number; reflection?: StorePatchType }): UserSheet;\n undo(): {\n history: HistoryType | null;\n };\n redo(): {\n history: HistoryType | null;\n };\n histories(): HistoryType[];\n historyIndex(): number;\n historySize(): number;\n setHeaderHeight(height: number, historicize?: boolean): UserSheet;\n setHeaderWidth(width: number, historicize?: boolean): UserSheet;\n\n sortRows(args: { x: number; direction: 'asc' | 'desc' }): UserSheet;\n\n filterRows(args?: { x?: number; filter?: FilterConfig }): UserSheet;\n isRowFiltered(y: number): boolean;\n hasActiveFilters(): boolean;\n hasPendingCells(): boolean;\n waitForPending(): Promise<void>;\n resolveAll(): number;\n getLastChangedAddresses(): Address[];\n getSerializedValue(props: { point: PointType; cell?: CellType; resolution?: Resolution }): string;\n}\n\ntype InternalToValueMatrixProps = {\n area?: AreaType;\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n at?: Id;\n};\n\ntype _UpdateCtx = {\n partial: boolean;\n updateChangedTime: boolean;\n ignoreFields: CellField[];\n operator: OperatorType;\n op: OperationType;\n formulaIdentify: boolean;\n changedTime: number;\n};\n\ntype _UpdateAccum = {\n diffBefore: CellsByIdType;\n diffAfter: CellsByIdType;\n changedAddresses: Address[];\n};\n\nexport class Sheet implements UserSheet {\n /** @internal */\n public __gsType = 'Sheet';\n /** Cached result of strip (NONE = not yet stripped). */\n private _stripped: any = NONE;\n public changedTime: number;\n public lastChangedTime?: number;\n public area: AreaType = { top: 0, left: 0, bottom: 0, right: 0 };\n\n /** @internal */\n private _limits: Required<SheetLimits>;\n get minNumRows() {\n return this._limits.minRows;\n }\n get maxNumRows() {\n return this._limits.maxRows;\n }\n get minNumCols() {\n return this._limits.minCols;\n }\n get maxNumCols() {\n return this._limits.maxCols;\n }\n /** @internal */\n public id: number = 0;\n public name: string = '';\n /**\n * Opt into eager resolution for this sheet. When enabled, every formula cell\n * is solved regardless of the visible range, so off-screen async formulas fire\n * and fill in instead of staying unevaluated until scrolled into view (see\n * {@link Sheet.resolveAll}).\n *\n * OFF by default to preserve virtualization. Whether to resolve everything is a\n * property of the dataset (how many rows, how costly the async side effects),\n * not of any individual function — so it is scoped per sheet and opted into\n * explicitly rather than inferred from the formulas a sheet happens to contain.\n */\n public eager: boolean = false;\n /** @internal */\n public prevName: string = '';\n /** @internal */\n public status: 0 | 1 | 2 = 0; // 0: not initialized, 1: initialized, 2: formula absoluted\n /** @internal */\n public registry: Registry;\n /** @internal */\n public idsToBeIdentified: Id[] = [];\n /** @internal */\n public totalWidth = 0;\n /** @internal */\n public totalHeight = 0;\n /** @internal */\n public fullHeight = 0;\n /** @internal */\n public defaultColWidth: number = DEFAULT_WIDTH;\n /** @internal */\n public defaultRowHeight: number = DEFAULT_HEIGHT;\n\n /** @internal */\n private version = 0;\n /** @internal */\n private idMatrix: IdMatrix;\n /** @internal */\n private addressCaches: Map<Id, Address> = new Map();\n /**\n * @internal — scan watermark for getPointById misses: the row index up to which every\n * materialized row has been scanned through its LAST column and fully seeded into\n * addressCaches. A miss resumes from here instead of rescanning from 0. Reset to 0\n * whenever addressCaches is cleared/replaced. The row where a target is found is NOT\n * counted (its later columns stay unseeded), so it is re-scanned on the next miss.\n */\n private _addressCacheWatermark = 0;\n /** @internal */\n private lastChangedAddresses: Address[] = [];\n /** @internal — stored cell defaults from initialize() for lazy cell resolution */\n private _initCells: CellsByAddressType | null = null;\n /**\n * @internal — whether _initCells holds any explicit DATA cell (y>=1, x>=1). When false\n * (e.g. the matrices/large-dataset path, which only carries headers + defaults), the\n * per-cell _initCells lookup in peekRawValue is skipped entirely — that lookup builds a\n * fresh address string per scanned cell, and a full-column data-edge scan (Ctrl+Shift+↓)\n * over a million lazy rows would otherwise churn ~1M throwaway strings on every keypress.\n */\n private _hasExplicitCells = false;\n /** @internal — default cell config from cells['default'] / cells['*'] */\n private _common: CellType | undefined;\n /** @internal — default column config from cells['defaultCol'] / cells['*C'] */\n private _commonCol: CellType | undefined;\n /** @internal — default row config from cells['defaultRow'] / cells['*R'] */\n private _commonRow: CellType | undefined;\n /** @internal — deferred matrices from buildInitialCells (large datasets) */\n private _initMatrices: { [baseAddress: string]: any[][] } | null = null;\n /** @internal — flattenAs key for deferred matrices */\n private _initFlattenAs: string | undefined;\n /** @internal — parsed base points for each matrix key, cached once */\n private _matrixBases: { baseY: number; baseX: number; rows: number; cols: number }[] = [];\n /** @internal — raw matrix references keyed by base address for O(1) lookup */\n private _matrixByBase: { baseY: number; baseX: number; matrix: any[][] }[] = [];\n /** @internal — precomputed column letters for lazy ID row creation */\n private _colLetters: string[] = [];\n /** @internal — tracks custom row heights (row y → height) for arithmetic offset computation */\n private _rowHeightOverrides: Map<number, number> = new Map();\n /** @internal — tracks filtered rows for offset computation */\n private _filteredRows: Set<number> = new Set();\n\n constructor({ limits = {}, name, registry = createRegistry({}), eager = false }: Props) {\n this.idMatrix = [];\n this.changedTime = Date.now();\n this.eager = eager;\n this._limits = {\n minRows: limits.minRows ?? 1,\n maxRows: limits.maxRows ?? -1,\n minCols: limits.minCols ?? 1,\n maxCols: limits.maxCols ?? -1,\n };\n this.name = name || '';\n this.prevName = this.name;\n this.registry = registry;\n }\n\n static is(obj: any): obj is Sheet {\n return obj?.__gsType === 'Sheet';\n }\n\n toString() {\n return `Sheet(name=${escapeSheetName(this.name)}, top=${this.top}, left=${this.left}, bottom=${this.bottom}, right=${this.right})`;\n }\n\n get headerHeight() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.height || HEADER_HEIGHT;\n }\n\n setHeaderHeight(height: number, historicize = true) {\n return this.update({\n diff: { 0: { height } },\n partial: true,\n historicize,\n });\n }\n\n get headerWidth() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.width || HEADER_WIDTH;\n }\n\n setHeaderWidth(width: number, historicize = true) {\n return this.update({\n diff: { 0: { width } },\n partial: true,\n historicize,\n });\n }\n\n /**\n * Get the raw (mutable) cell data for a point. Unlike getCell, this returns the actual registry.data reference.\n * @internal\n */\n private _pointToRawCell({ y, x }: PointType): CellType | undefined {\n const id = this.getId({ y, x });\n if (id == null) {\n return undefined;\n }\n this._ensureCellPopulated(y, x, id);\n return this.registry.data[id];\n }\n\n public isRowFiltered(y: number): boolean {\n return !!this._pointToRawCell({ y, x: 0 })?.filtered;\n }\n\n public hasActiveFilters(): boolean {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns true if any data cell in this sheet currently holds a Pending value\n * (i.e. an async formula that hasn't resolved yet).\n */\n public hasPendingCells(): boolean {\n // Only check materialized cells — unmaterialized cells can't have Pending values\n for (const id of Object.keys(this.registry.data)) {\n const cell = this.registry.data[id];\n if (Pending.is(cell?.value)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns a Promise that resolves when all in-flight async formula computations\n * have completed and no data cells hold Pending values.\n * If nothing is pending, resolves immediately.\n * Useful for waiting before sort/filter so that cell values are fully resolved.\n */\n public waitForPending(): Promise<void> {\n const pendingMap = this.registry.asyncPending;\n // If there are in-flight promises, wait for them first\n if (pendingMap.size > 0) {\n const promises = Array.from(pendingMap.values()).map((p) => p.promise);\n return Promise.all(promises).then(() => this.waitForPending());\n }\n // Even if asyncPending is empty, cells may still hold Pending values\n // (e.g. propagated pending from dependent formulas).\n // In that case, wait for the next transmit cycle and re-check.\n if (this.hasPendingCells()) {\n return new Promise<void>((resolve) => {\n const check = () => {\n if (this.registry.asyncPending.size > 0) {\n const promises = Array.from(this.registry.asyncPending.values()).map((p) => p.promise);\n Promise.all(promises).then(check);\n } else if (this.hasPendingCells()) {\n // Still pending — wait a tick for transmit/re-render\n setTimeout(check, 50);\n } else {\n resolve();\n }\n };\n check();\n });\n }\n return Promise.resolve();\n }\n\n /**\n * Returns the addresses that were changed in the most recent `_update()` call.\n * Useful inside `onChange` to know which cells were modified.\n */\n public getLastChangedAddresses(): Address[] {\n return this.lastChangedAddresses;\n }\n\n /**\n * Eagerly fire every async formula cell in this sheet, ignoring the visible\n * range.\n *\n * GridSheet is virtualized: normally only cells the UI renders get solved, so\n * an off-screen `=…` formula that calls an async function never fires. Only\n * async cells need this — sync formulas have no side effects and resolve when\n * read (e.g. by serialization), whereas an async cell must be *fired* and given\n * time to settle before its value can be read. `resolveAll()` therefore walks\n * the async-formula index ({@link Registry.asyncFormulaCells}) and solves each\n * one, which fires it through the usual machinery: it resolves, populates the\n * per-cell async cache, and triggers a re-render via `transmit()`. Sync cells\n * that depend on those results resolve normally on the next read.\n *\n * Cells already resolved (async-cache hit) or in flight (Pending) are not\n * re-fired — solving is a cache hit for them — so repeated calls converge and\n * are cheap. After awaiting {@link waitForPending}, serialization helpers such\n * as `toValueMatrix` return resolved values for off-screen cells too.\n *\n * This is the building block behind the opt-in `eager` sheet option; call it\n * directly to resolve on demand without enabling eager mode.\n *\n * @returns the number of async formula cells visited (for diagnostics/tests).\n */\n public resolveAll(): number {\n const registry = this.registry;\n let visited = 0;\n // Snapshot: solving a cell may add new async cells (e.g. spilled formulas)\n // to the index, and we prune stale ids while iterating.\n for (const id of Array.from(registry.asyncFormulaCells)) {\n const cell = registry.data[id];\n // Prune ids that are gone or no longer hold a formula.\n if (cell == null || typeof cell.value !== 'string' || cell.value.charAt(0) !== '=') {\n registry.asyncFormulaCells.delete(id);\n continue;\n }\n // The index is registry-wide; only resolve cells owned by this sheet.\n if (registry.systems[id]?.sheetId !== this.id) {\n continue;\n }\n const { y, x } = this.getPointById(id);\n if (y < 0 || x < 0) {\n // Detached id (e.g. removed row/col not yet pruned from the index).\n registry.asyncFormulaCells.delete(id);\n continue;\n }\n // getCell(RESOLVED) fires main()/awaitAndSave on a cache miss and yields\n // the cached value / Pending otherwise, so resolved cells are not re-fired.\n this.getCell({ y, x }, { resolution: 'RESOLVED', raise: false });\n visited++;\n }\n return visited;\n }\n\n /**\n * Capture the full cell state of all filter-related header cells as a CellsByIdType snapshot.\n * @internal\n */\n private _captureFilterCellStates(): CellsByIdType {\n const snapshot: CellsByIdType = {};\n const numCols = this.numCols;\n const numRows = this.numRows;\n // Column header cells: capture the 'filter' field.\n // Use null instead of undefined so the value survives JSON serialization\n // (undefined is stripped by JSON.stringify, causing undo to silently no-op in environments\n // that serialize/deserialize state such as StackBlitz hot-reload).\n for (let col = 1; col <= numCols; col++) {\n const id = this.getId({ y: 0, x: col });\n if (id != null) {\n snapshot[id] = { filter: this.registry.data[id]?.filter ?? null };\n }\n }\n // Row header cells: capture the 'filtered' field.\n // Use false instead of undefined so the value survives JSON serialization\n // (undefined is stripped by JSON.stringify, causing undo to silently no-op in environments\n // that serialize/deserialize state such as StackBlitz hot-reload).\n for (let y = 1; y <= numRows; y++) {\n const id = this.getId({ y, x: 0 });\n if (id != null) {\n snapshot[id] = { filtered: this.registry.data[id]?.filtered ?? false };\n }\n }\n return snapshot;\n }\n\n public filterRows({\n x,\n filter,\n }: {\n x?: number;\n filter?: FilterConfig;\n } = {}) {\n const diffBefore = this._captureFilterCellStates();\n\n if (x == null) {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n delete colCell?.filter;\n }\n } else {\n const colCell = this._pointToRawCell({ y: 0, x });\n if (colCell) {\n if (filter) {\n colCell.filter = filter;\n } else {\n delete colCell.filter;\n }\n }\n }\n this._reapplyFilters();\n\n const diffAfter = this._captureFilterCellStates();\n\n // Only keep cells whose state actually changed\n const changedIds = Object.keys(diffBefore).filter(\n (id) => JSON.stringify(diffBefore[id]) !== JSON.stringify(diffAfter[id]),\n );\n\n if (changedIds.length > 0) {\n const trimmedBefore: CellsByIdType = {};\n const trimmedAfter: CellsByIdType = {};\n for (const id of changedIds) {\n trimmedBefore[id] = diffBefore[id];\n trimmedAfter[id] = diffAfter[id];\n }\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n diffBefore: trimmedBefore,\n diffAfter: trimmedAfter,\n partial: true,\n });\n }\n\n return this.refresh(false, true);\n }\n\n /** @internal */\n private _reapplyFilters() {\n // Collect active filters from column header cells\n const numCols = this.numCols;\n const activeFilters: { x: number; filter: FilterConfig }[] = [];\n const changedAddresses: Address[] = [];\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n activeFilters.push({ x: col, filter: colCell.filter });\n }\n // Track column header cells that have filter config changes\n changedAddresses.push(p2a({ y: 0, x: col }));\n }\n\n const numRows = this.numRows;\n\n // Evaluate each row and update filtered flag\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (!rowCell) {\n continue;\n }\n\n if (rowCell.filterFixed) {\n continue;\n }\n\n let shouldFilter = false;\n for (const { x: col, filter } of activeFilters) {\n const cell = this.getCell({ y, x: col }, { resolution: 'RESOLVED' });\n if (!evaluateFilterConfig(filter, cell?.value)) {\n shouldFilter = true;\n break;\n }\n }\n\n const wasFiltered = !!rowCell.filtered;\n if (shouldFilter) {\n rowCell.filtered = true;\n this._filteredRows.add(y);\n } else {\n delete rowCell.filtered;\n this._filteredRows.delete(y);\n }\n if (wasFiltered !== shouldFilter) {\n changedAddresses.push(p2a({ y, x: 0 }));\n }\n }\n\n this.lastChangedAddresses = changedAddresses;\n }\n\n public sortRows({ x, direction }: { x: number; direction: 'asc' | 'desc' }) {\n const numRows = this.numRows;\n if (numRows <= 1) {\n return this;\n }\n\n // Collect row indices (data rows: 1..numRows), separating fixed rows\n const fixedPositions = new Set<number>();\n const sortableIndices: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (rowCell?.sortFixed) {\n fixedPositions.add(y);\n } else {\n sortableIndices.push(y);\n }\n }\n\n // Sort by resolved cell value at column x\n sortableIndices.sort((a, b) => {\n const cellA = this.getCell({ y: a, x }, { resolution: 'RESOLVED' });\n const cellB = this.getCell({ y: b, x }, { resolution: 'RESOLVED' });\n const valA = cellA?.value;\n const valB = cellB?.value;\n\n // null/undefined goes to the end\n if (valA == null && valB == null) {\n return 0;\n }\n if (valA == null) {\n return 1;\n }\n if (valB == null) {\n return -1;\n }\n\n let cmp = 0;\n if (typeof valA === 'number' && typeof valB === 'number') {\n cmp = valA - valB;\n } else if (valA instanceof Date && valB instanceof Date) {\n cmp = valA.getTime() - valB.getTime();\n } else {\n cmp = String(valA).localeCompare(String(valB));\n }\n return direction === 'asc' ? cmp : -cmp;\n });\n\n // Check if order actually changed (only among sortable rows)\n // Assign sortable rows to the positions not occupied by fixed rows\n const availablePositions: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n if (!fixedPositions.has(y)) {\n availablePositions.push(y);\n }\n }\n\n let changed = false;\n for (let i = 0; i < sortableIndices.length; i++) {\n if (sortableIndices[i] !== availablePositions[i]) {\n changed = true;\n break;\n }\n }\n if (!changed) {\n return this;\n }\n\n // Build row mapping: original position -> new position\n // Fixed rows map to themselves; sortable rows map to available positions in sorted order\n const sortedRowMapping: { [beforeY: number]: number } = {};\n for (const y of fixedPositions) {\n sortedRowMapping[y] = y;\n }\n for (let i = 0; i < sortableIndices.length; i++) {\n sortedRowMapping[sortableIndices[i]] = availablePositions[i];\n }\n\n // Save row references before rearranging (rows are re-slotted, not mutated).\n this._materializeIdMatrix();\n const matrixSnapshot = this.idMatrix.slice();\n\n for (const [oldY, newY] of Object.entries(sortedRowMapping)) {\n this.idMatrix[Number(newY)] = matrixSnapshot[Number(oldY)];\n }\n this.addressCaches.clear();\n\n const preserver = new ReferencePreserver(this);\n preserver.buildMap(matrixSnapshot.flat(), this.idMatrix.flat());\n preserver.resolveDependents();\n\n this._pushHistory({\n applyed: true,\n operation: 'SORT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n sortedRowMapping,\n } as HistorySortRowsType);\n\n return this.refresh(true, true);\n }\n\n /** @internal */\n private _sortRowMapping(sortedRowMapping: { [beforeY: number]: number }, inverse = false) {\n const newOrder: number[] = new Array(this.numRows);\n\n if (inverse) {\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[oldY - 1] = newY;\n }\n } else {\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[newY - 1] = oldY;\n }\n }\n\n this._materializeIdMatrix();\n const savedRows: Ids[] = [];\n for (let i = 0; i < newOrder.length; i++) {\n savedRows.push(this.idMatrix[newOrder[i]]);\n }\n for (let i = 0; i < newOrder.length; i++) {\n this.idMatrix[i + 1] = savedRows[i];\n }\n this.addressCaches.clear();\n }\n\n get isInitialized() {\n return this.status === 2;\n }\n\n get policies() {\n return this.registry.policies;\n }\n\n /** @internal */\n public getSystem(point: PointType): System | undefined {\n const id = this.getId(point);\n if (id == null) {\n return undefined;\n }\n return this.registry.systems[id];\n }\n\n /** @internal */\n public processFormula(value: any, { idMap, ...props }: ProcessFormulaProps): any {\n if (typeof value === 'string' || value instanceof String) {\n if (value.charAt(0) === '=') {\n const lexer = new Lexer(value.substring(1));\n lexer.tokenize(idMap);\n lexer.identify({ ...props, sheet: this });\n lexer.dependencyIds.forEach((id) => this.addDependency(id, props.dependency));\n // Index this cell only if its formula calls an async function: those are\n // the cells eager resolution must fire (sync formulas resolve on read).\n if (props.dependency != null) {\n if (this._formulaHasAsync(lexer)) {\n this.registry.asyncFormulaCells.add(props.dependency);\n } else {\n this.registry.asyncFormulaCells.delete(props.dependency);\n }\n }\n return '=' + lexer.identifiedFormula;\n }\n }\n // No longer a formula (e.g. a formula cell overwritten with a literal): drop\n // it from the index so resolveAll() stops visiting it.\n if (props.dependency != null) {\n this.registry.asyncFormulaCells.delete(props.dependency);\n }\n return value;\n }\n\n /**\n * Whether a tokenized formula calls at least one async function, decided via\n * the function class's static `isAsync` flag (no instantiation). Drives the\n * async-formula index that {@link resolveAll} walks.\n * @internal\n */\n private _formulaHasAsync(lexer: Lexer): boolean {\n for (const token of lexer.tokens) {\n if (token.type === 'FUNCTION') {\n const fn = this.registry.functions[String(token.entity).toLowerCase()];\n if ((fn as unknown as { isAsync?: boolean })?.isAsync) {\n return true;\n }\n }\n }\n return false;\n }\n\n /** @internal */\n public resolveFormulas() {\n this.idsToBeIdentified.forEach((id) => {\n const cell = this.registry.data[id];\n if (this.registry.systems[id]?.sheetId == null) {\n return;\n }\n if (cell == null) {\n return;\n }\n this.clearDependencies(id);\n cell.value = this.processFormula(cell?.value, { dependency: id });\n });\n this.idsToBeIdentified = [];\n this.status = 2;\n }\n\n /** @internal */\n public getSheetBySheetName(sheetName: string) {\n const sheetId = this.registry.sheetIdsByName[sheetName];\n return this.getSheetBySheetId(sheetId);\n }\n /** @internal */\n public getSheetBySheetId(sheetId: number) {\n return this.registry.contextsBySheetId[sheetId]?.store?.sheetReactive?.current;\n }\n\n /** @internal */\n private static _stack(...cells: (CellType | undefined)[]) {\n const extension: CellType = {};\n cells.forEach((cell) => {\n if (cell?.style) {\n extension.style = { ...extension.style, ...cell.style };\n }\n if (cell?.prevention) {\n extension.prevention = (extension.prevention || 0) | cell.prevention;\n }\n });\n return extension;\n }\n\n /** @internal */\n public initialize(cells: CellsByAddressType) {\n if (this.status > 1) {\n return;\n }\n if (cells[0] == null) {\n cells[0] = { width: HEADER_WIDTH, height: HEADER_HEIGHT };\n }\n const auto = getMaxSizesFromCells(cells, (cells as any).__userKeys);\n this.area = {\n top: 1,\n left: 1,\n bottom: auto.numRows,\n right: auto.numCols,\n };\n\n // Pre-allocate idMatrix with undefined slots (O(1) — no ID generation)\n this.idMatrix = new Array(auto.numRows + 1);\n\n // Precompute column letters for lazy row creation\n this._colLetters = [];\n for (let x = 0; x <= auto.numCols; x++) {\n this._colLetters[x] = x2c(x);\n }\n\n // Expand range addresses (e.g. 'A1:C3') into individual cells.\n // Use __userKeys (set by buildInitialCells) to iterate only user-provided\n // addresses, avoiding an O(matrixCells) scan of the entire cells object.\n const addressKeys: string[] = (cells as any).__userKeys ?? Object.keys(cells);\n addressKeys.forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const range = expandRange(address);\n const data = cells[address];\n\n range.forEach((address) => {\n const origin = cells[address];\n cells[address] = {\n ...origin,\n ...data,\n ...Sheet._stack(origin, data),\n };\n });\n });\n\n // Store defaults for lazy cell resolution\n this._common = cells?.[DEFAULT_KEY];\n this._commonCol = cells?.[DEFAULT_COL_KEY];\n this._commonRow = cells?.[DEFAULT_ROW_KEY];\n this._initCells = cells;\n // Detect explicit data cells once so peekRawValue can skip its per-cell address build\n // when there are none (see _hasExplicitCells). A range key (contains ':') or any single\n // address with a row >= 1 counts; DEFAULT/header (row 0) keys do not.\n const userKeys: string[] = (cells as any)?.__userKeys ?? (cells ? Object.keys(cells) : []);\n this._hasExplicitCells = userKeys.some((k) => {\n if (k === DEFAULT_KEY || k === DEFAULT_COL_KEY || k === DEFAULT_ROW_KEY) {\n return false;\n }\n // Only a cell that actually carries a `value` can be returned by peekRawValue; empty\n // placeholders (e.g. the ensured bottom-right corner buildInitialCells inserts) don't\n // count and must not force the per-cell address build back on.\n const c = (cells as any)?.[k];\n if (c == null || !('value' in c)) {\n return false;\n }\n if (k.includes(':')) {\n return true;\n }\n return /^\\$?[A-Z]+\\$?[1-9]/.test(k);\n });\n\n // Store deferred matrices for lazy cell value lookup\n const deferredMatrices = (cells as any).__matrices;\n if (deferredMatrices) {\n this._initMatrices = deferredMatrices;\n this._initFlattenAs = (cells as any).__flattenAs;\n this._matrixByBase = [];\n for (const baseAddress of Object.keys(deferredMatrices)) {\n const { y: baseY, x: baseX } = a2p(baseAddress);\n this._matrixByBase.push({ baseY, baseX, matrix: deferredMatrices[baseAddress] });\n }\n }\n if (this._commonCol?.width != null) {\n this.defaultColWidth = this._commonCol.width;\n }\n if (this._commonRow?.height != null) {\n this.defaultRowHeight = this._commonRow.height;\n }\n\n // Eagerly populate header row (y=0) and header column (x=0) only.\n // All data cells are lazily populated on first access.\n this._ensureIdRow(0);\n for (let x = 0; x <= auto.numCols; x++) {\n const id = this.idMatrix[0][x];\n this._ensureCellPopulated(0, x, id);\n }\n\n // Eagerly populate cells that have explicit data or formulas in the input.\n // This ensures formulas are identified for resolveFormulas().\n const explicitAddresses = addressKeys;\n for (const address of explicitAddresses) {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n continue;\n }\n const point = a2p(address);\n const { y, x } = point;\n // Skip headers (already done), skip column/row-level defaults (like 'A' or '1')\n if ((y === 0 && x === 0) || y === 0 || x === 0) {\n continue;\n }\n // Skip column-only or row-only addresses (e.g. 'A' has x>0,y=0 or '1' has y>0,x=0)\n if (y <= 0 || x <= 0) {\n continue;\n }\n if (y > auto.numRows || x > auto.numCols) {\n continue;\n }\n const row = this._ensureIdRow(y);\n const id = row[x];\n if (id != null) {\n this._ensureCellPopulated(y, x, id);\n }\n }\n\n this.status = 1; // initialized\n this.registry.sheetIdsByName[this.name] = this.id;\n }\n\n /** @internal */\n private _incrementVersion() {\n this.version++;\n if (this.version >= Number.MAX_SAFE_INTEGER) {\n this.version = 1;\n }\n }\n\n /** @internal */\n private _xsheetDispatch(otherSheet: Sheet) {\n if (otherSheet === this) {\n return;\n }\n otherSheet.refresh(true);\n const context = this.registry.contextsBySheetId[otherSheet.id];\n if (context !== null) {\n const { dispatch } = context;\n requestAnimationFrame(() => {\n dispatch(this.registry.updateSheet(otherSheet));\n });\n }\n }\n\n /** @internal */\n private _generateId() {\n return (this.registry.cellHead++).toString();\n }\n\n /**\n * Lazily generate the ID row for the given y-coordinate.\n * If the row already exists, returns it immediately.\n * @internal\n */\n private _ensureIdRow(y: number): Ids {\n let row = this.idMatrix[y];\n if (row != null) {\n return row;\n }\n const numCols = this.area.right;\n row = [];\n for (let x = 0; x <= numCols; x++) {\n const id = this._generateId();\n row.push(id);\n const colLetter = this._colLetters[x] || x2c(x);\n this.addressCaches.set(id, y === 0 ? `${colLetter}0` : x === 0 ? `0${y}` : `${colLetter}${y}`);\n }\n this.idMatrix[y] = row;\n return row;\n }\n\n /**\n * Ensure that registry.data and registry.systems exist for a given cell.\n * Performs lazy cell stacking using stored initialization defaults.\n * @internal\n */\n private _ensureCellPopulated(y: number, x: number, id: Id): void {\n if (this.registry.data[id] != null) {\n return;\n }\n const cells = this._initCells;\n const changedTime = Date.now();\n let stacked: CellType;\n\n if (y === 0 && x > 0) {\n const colId = this._colLetters[x] || x2c(x);\n const colDefault = cells?.[colId];\n const { style: _cs, ...colDefaultLayout } = colDefault ?? {};\n const headerCell = cells?.[colId + '0'];\n stacked = {\n ...this._commonCol,\n ...colDefaultLayout,\n ...headerCell,\n ...Sheet._stack(this._commonCol, headerCell),\n } as CellType;\n } else if (x === 0 && y > 0) {\n const rowId = y2r(y);\n const rowDefault = cells?.[rowId];\n const { style: _rs, ...rowDefaultLayout } = rowDefault ?? {};\n const headerCell = cells?.['0' + rowId];\n stacked = {\n ...this._commonRow,\n ...rowDefaultLayout,\n ...headerCell,\n ...Sheet._stack(this._commonRow, headerCell),\n } as CellType;\n } else if (y === 0 && x === 0) {\n const cell = cells?.['0'];\n stacked = { ...cell, ...Sheet._stack(cell) } as CellType;\n } else {\n const colId = this._colLetters[x] || x2c(x);\n const rowId = y2r(y);\n const address = `${colId}${rowId}`;\n const rowDefault = cells?.[rowId];\n const colDefault = cells?.[colId];\n let cell = cells?.[address];\n // Resolve value from deferred matrices if cell has no explicit value\n if ((cell == null || !('value' in cell)) && this._matrixByBase.length > 0) {\n for (const { baseY, baseX, matrix } of this._matrixByBase) {\n const my = y - baseY;\n const mx = x - baseX;\n if (my >= 0 && my < matrix.length && mx >= 0 && mx < matrix[my].length) {\n const val = matrix[my][mx];\n let matrixCell: CellType;\n if (this._initFlattenAs) {\n matrixCell = { [this._initFlattenAs]: val };\n } else {\n matrixCell = val as CellType;\n }\n cell = cell ? { ...matrixCell, ...cell } : matrixCell;\n break;\n }\n }\n }\n stacked = {\n ...this._common,\n ...rowDefault,\n ...colDefault,\n ...cell,\n ...Sheet._stack(this._common, rowDefault, colDefault, cell),\n } as CellType;\n }\n\n if (stacked?.value?.startsWith?.('=') && (stacked?.formulaEnabled ?? true)) {\n this.idsToBeIdentified.push(id);\n }\n if (y === 0) {\n if (stacked.width == null) {\n stacked.width = DEFAULT_WIDTH;\n }\n } else if (x === 0) {\n if (stacked.height == null) {\n stacked.height = DEFAULT_HEIGHT;\n }\n // Track non-default row heights for arithmetic offset computation\n if (stacked.height !== (this.defaultRowHeight || DEFAULT_HEIGHT)) {\n this._rowHeightOverrides.set(y, stacked.height);\n }\n if (stacked.filtered) {\n this._filteredRows.add(y);\n }\n } else {\n delete stacked.height;\n delete stacked.width;\n delete stacked.label;\n }\n\n const policy = this.policies[stacked.policy ?? ''] ?? this.defaultPolicy;\n stacked = policy.deserializeValue(stacked.value, stacked) ?? {};\n // Preserve any pre-existing system entry (e.g. `spilledFrom` set by spill()\n // before this empty target cell was lazily populated). Overwriting it would\n // wipe the spill marker even though the spilled value stays cached.\n this.registry.systems[id] = { ...this.registry.systems[id], id, changedTime, sheetId: this.id };\n this.registry.data[id] = stacked;\n }\n\n /**\n * Materialize all lazy ID rows. Call this before operations that need the full\n * idMatrix (e.g. .flat(), .map(), .slice() for sort/move/undo/redo).\n * @internal\n */\n private _materializeIdMatrix(): void {\n for (let y = 0; y < this.idMatrix.length; y++) {\n if (this.idMatrix[y] == null) {\n this._ensureIdRow(y);\n }\n }\n }\n\n /**\n * Compute the absolute top offset for a given row using arithmetic + overrides.\n * Avoids iterating all rows — O(overrides) instead of O(numRows).\n * @internal\n */\n public getOffsetTop(y: number): number {\n const headerH = this.headerHeight;\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n // Base offset assuming all rows have default height\n let offset = headerH + (y - 1) * defaultH;\n // Apply overrides for rows before y\n for (const [oy, h] of this._rowHeightOverrides) {\n if (oy < y) {\n offset += h - defaultH;\n }\n }\n // Subtract filtered rows before y\n for (const fy of this._filteredRows) {\n if (fy < y) {\n const h = this._rowHeightOverrides.get(fy) ?? defaultH;\n offset -= h;\n }\n }\n return offset;\n }\n\n /**\n * Re-key the row-metadata caches after rows are removed at [y, y+numRows).\n * These maps are keyed by absolute row number, so deletions must drop the removed\n * keys and shift later keys down — otherwise stale entries corrupt getOffsetTop().\n * @internal\n */\n private _shiftRowMetaForRemove(y: number, numRows: number): void {\n const heights = new Map<number, number>();\n for (const [k, v] of this._rowHeightOverrides) {\n if (k < y) {\n heights.set(k, v);\n } else if (k >= y + numRows) {\n heights.set(k - numRows, v);\n }\n }\n this._rowHeightOverrides = heights;\n\n const filtered = new Set<number>();\n for (const k of this._filteredRows) {\n if (k < y) {\n filtered.add(k);\n } else if (k >= y + numRows) {\n filtered.add(k - numRows);\n }\n }\n this._filteredRows = filtered;\n }\n\n /**\n * Re-key the row-metadata caches after numRows are inserted at y, shifting keys >= y up.\n * @internal\n */\n private _shiftRowMetaForInsert(y: number, numRows: number): void {\n const heights = new Map<number, number>();\n for (const [k, v] of this._rowHeightOverrides) {\n heights.set(k < y ? k : k + numRows, v);\n }\n this._rowHeightOverrides = heights;\n\n const filtered = new Set<number>();\n for (const k of this._filteredRows) {\n filtered.add(k < y ? k : k + numRows);\n }\n this._filteredRows = filtered;\n }\n\n /**\n * (Re)seed row-metadata for the rows at [y, y+numRows) from their current header cells.\n * Used after rows are added (insert / undo-remove / redo-insert) so non-default heights\n * and filtered state are reflected immediately rather than only on the next lazy read.\n * @internal\n */\n private _seedRowMeta(y: number, numRows: number): void {\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n for (let i = 0; i < numRows; i++) {\n const yy = y + i;\n const id = this.getId({ y: yy, x: 0 });\n const cell = id ? this.registry.data[id] : undefined;\n if (cell?.height != null && cell.height !== defaultH) {\n this._rowHeightOverrides.set(yy, cell.height);\n } else {\n this._rowHeightOverrides.delete(yy);\n }\n if (cell?.filtered) {\n this._filteredRows.add(yy);\n } else {\n this._filteredRows.delete(yy);\n }\n }\n }\n\n public getRectSize({ top, left, bottom, right }: AreaType): RectType {\n const l = left || 1;\n const t = top || 1;\n\n // Column offsets: read from pre-computed offsetLeft on header cells\n const rw = this.registry.systems[this.getId({ y: 0, x: right })]?.offsetLeft ?? 0;\n const lw = this.registry.systems[this.getId({ y: 0, x: l })]?.offsetLeft ?? 0;\n // Row offsets: compute arithmetically\n const rh = this.getOffsetTop(bottom);\n const th = this.getOffsetTop(t);\n\n const width = Math.max(0, rw - lw);\n const height = Math.max(0, rh - th);\n return { y: t, x: l, height, width };\n }\n\n /** @internal */\n public setTotalSize() {\n const numCols = this.numCols;\n const numRows = this.numRows;\n const headerW = this.headerWidth;\n const headerH = this.headerHeight;\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n\n // Write offsetLeft into column-header cells (y=0, x=1..numCols) — small loop\n let accW = 0;\n for (let x = 1; x <= numCols; x++) {\n const cell = this.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const w = cell?.width || this.defaultColWidth || DEFAULT_WIDTH;\n const colSys = this.registry.systems[this.getId({ y: 0, x })];\n if (colSys != null) {\n colSys.offsetLeft = headerW + accW;\n }\n accW += w;\n }\n this.totalWidth = headerW + accW;\n\n // Compute totalHeight arithmetically — O(overrides) instead of O(numRows)\n let totalOverrideDiff = 0;\n let filteredHeightSum = 0;\n for (const [y, h] of this._rowHeightOverrides) {\n if (y >= 1 && y <= numRows) {\n totalOverrideDiff += h - defaultH;\n }\n }\n for (const fy of this._filteredRows) {\n if (fy >= 1 && fy <= numRows) {\n const h = this._rowHeightOverrides.get(fy) ?? defaultH;\n filteredHeightSum += h;\n }\n }\n const fullH = numRows * defaultH + totalOverrideDiff;\n this.totalHeight = headerH + fullH - filteredHeightSum;\n this.fullHeight = headerH + fullH;\n }\n\n /** @internal */\n public refresh(relocate = false, resize = false): Sheet {\n this._incrementVersion();\n this.lastChangedTime = this.changedTime;\n this.changedTime = Date.now();\n\n this.clearSolvedCaches();\n // Reset strip cache. Normally unnecessary since child Sheets in solvedCaches\n // are discarded above, but defensive against stale references.\n this._stripped = NONE;\n\n if (relocate) {\n // force reset\n this.addressCaches.clear();\n }\n if (resize) {\n this.setTotalSize();\n }\n return this;\n }\n\n /** @internal */\n public clone(relocate = false): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n copied._stripped = NONE;\n return copied.refresh(relocate);\n }\n\n /** @internal */\n public getPointById(\n id: Id,\n slideY = 0,\n slideX = 0,\n ): PointType & {\n absCol: boolean;\n absRow: boolean;\n } {\n const absCol = id.startsWith('$');\n if (absCol) {\n id = id.slice(1);\n slideX = 0;\n }\n const absRow = id.endsWith('$');\n if (absRow) {\n id = id.slice(0, -1);\n slideY = 0;\n }\n const cache = this.addressCaches.get(id);\n if (cache) {\n const p = a2p(cache);\n return { y: p.y + slideY, x: p.x + slideX, absCol, absRow };\n }\n\n // Cache miss. Resume the scan from the watermark rather than rescanning from 0, and\n // skip un-materialized rows — a valid Id only ever lives in a materialized row, and\n // such rows self-seed via _ensureIdRow when they are materialized later.\n const startWatermark = this._addressCacheWatermark;\n const hit = this._scanForIdFrom(startWatermark, id);\n if (hit != null) {\n return { y: hit.y + slideY, x: hit.x + slideX, absCol, absRow };\n }\n // Not found from the watermark. It may have advanced past a row that was inserted /\n // shifted after the last full seed (structural ops clear the cache only at their\n // terminal refresh), so fall back to a full rescan from 0 — this also re-seeds and\n // corrects any stale entries below the old watermark. Skipped when already at 0.\n if (startWatermark > 0) {\n const retry = this._scanForIdFrom(0, id);\n if (retry != null) {\n return { y: retry.y + slideY, x: retry.x + slideX, absCol, absRow };\n }\n }\n return { y: -1, x: -1, absCol, absRow };\n }\n\n /**\n * Scan materialized rows from `fromY`, seeding addressCaches as it goes. Advances the\n * watermark past every row scanned through its last column; if `id` is found mid-row,\n * leaves the watermark at that (still partially seeded) row. Returns the point or null.\n * @internal\n */\n private _scanForIdFrom(fromY: number, id: Id): PointType | null {\n let y = fromY;\n for (; y < this.idMatrix.length; y++) {\n const ids = this.idMatrix[y];\n if (ids == null) {\n continue;\n }\n for (let x = 0; x < ids.length; x++) {\n const existing = ids[x];\n this.addressCaches.set(existing, p2a({ y, x }));\n if (existing === id) {\n this._addressCacheWatermark = y;\n return { y, x };\n }\n }\n }\n this._addressCacheWatermark = y;\n return null;\n }\n\n /** @internal */\n public getAddressById(id: Id, slideY = 0, slideX = 0): string | undefined {\n const { y, x, absCol, absRow } = this.getPointById(id, slideY, slideX);\n return grantAddressAbsolute(p2a({ y, x }), absCol, absRow);\n }\n\n /** @internal */\n public clearAddressCaches() {\n this.addressCaches.clear();\n this._addressCacheWatermark = 0;\n }\n\n /** @internal */\n private _warmAddressCaches() {\n this._materializeIdMatrix();\n for (let y = 0; y < this.idMatrix.length; y++) {\n const row = this.idMatrix[y];\n for (let x = 0; x < row.length; x++) {\n this.addressCaches.set(row[x], p2a({ y, x }));\n }\n }\n // Every materialized row is now seeded through its last column.\n this._addressCacheWatermark = this.idMatrix.length;\n }\n\n /** @internal */\n public getId(point: PointType) {\n const { y, x } = point;\n if (y >= 0 && x >= 0 && y <= this.area.bottom && x <= this.area.right) {\n return this._ensureIdRow(y)[x];\n }\n // Out-of-bounds: return from raw array (undefined at runtime, preserves original type)\n return this.idMatrix[y]?.[x];\n }\n\n /** @internal */\n public getCell(point: PointType, { resolution = 'RESOLVED', raise = false }: SolveOptions = {}) {\n const { y, x } = point;\n if (y === -1 || x === -1) {\n return undefined;\n }\n const id = this.getId(point);\n if (id == null) {\n return undefined;\n }\n // Lazy cell population\n this._ensureCellPopulated(y, x, id);\n const cell = this.registry.data[id];\n if (cell == null) {\n return undefined;\n }\n let value = cell.value;\n if (resolution !== 'SYSTEM' && (cell.formulaEnabled ?? true)) {\n value = solveFormula({ value, sheet: this, point, raise, resolution, at: id });\n }\n return { ...cell, value } as CellType;\n }\n\n /**\n * Cheap raw-value peek that does NOT materialize the cell. Returns the populated\n * value if the cell already exists, otherwise reads straight from the deferred\n * matrix / init cells. Lets a full-column/row scan (e.g. Ctrl+Shift+arrow's\n * \"select to data edge\") stay O(1) per cell instead of stacking every cell it\n * walks over — a million-row scan was ~1.9s (and materialized the whole column)\n * purely because the empty-check went through getCell.\n */\n public peekRawValue({ y, x }: PointType): any {\n // Already-materialized (or user-edited) cell: registry.data is authoritative.\n const idRow = this.idMatrix[y];\n if (idRow != null) {\n const id = idRow[x];\n const cell = id != null ? this.registry.data[id] : undefined;\n if (cell != null) {\n return cell.value;\n }\n }\n if (y <= 0 || x <= 0) {\n return undefined;\n }\n // An explicit init cell (non-matrix path) wins over the matrix. Skipped entirely when\n // the sheet has no explicit data cells (the common large-dataset/matrices case), since\n // building this address string per scanned cell dominates a full-column scan's cost.\n if (this._hasExplicitCells) {\n const address = `${this._colLetters[x] || x2c(x)}${y2r(y)}`;\n const explicit = this._initCells?.[address];\n if (explicit != null && 'value' in explicit) {\n return explicit.value;\n }\n }\n // Deferred matrix (large-dataset path).\n for (const { baseY, baseX, matrix } of this._matrixByBase) {\n const my = y - baseY;\n const mx = x - baseX;\n if (my >= 0 && my < matrix.length) {\n const row = matrix[my];\n if (mx >= 0 && mx < row.length) {\n const val = row[mx];\n return this._initFlattenAs ? val : (val as any)?.value;\n }\n }\n }\n return undefined;\n }\n\n /** @internal */\n public get numRows() {\n const { top, bottom } = this.area;\n return 1 + bottom - top;\n }\n\n public get numCols() {\n const { left, right } = this.area;\n return 1 + right - left;\n }\n\n public get top() {\n return this.area.top;\n }\n public get left() {\n return this.area.left;\n }\n public get bottom() {\n return this.area.bottom;\n }\n public get right() {\n return this.area.right;\n }\n\n /**\n * Fill one matrix row (y) from cell values. Shared by the sync and async\n * _toValueMatrix so the two never diverge. Per-row (not per-cell) call, so the\n * indirection is negligible even at a million cells. @internal\n */\n private _fillValueRow(\n matrix: any[][],\n y: number,\n {\n top,\n left,\n right,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n }: InternalToValueMatrixProps & { top: number; left: number; right: number },\n ) {\n for (let x = left; x <= right; x++) {\n const id = this.getId({ y, x });\n // Only throw a circular-ref if the `at` cell is from this sheet.\n if (at === id) {\n throw new FormulaError('#REF!', 'References are circulating.');\n }\n const cell = this.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = this.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: this, point: { y, x } });\n }\n matrix[y - top][x - left] = fieldValue;\n }\n }\n }\n\n /** @internal */\n public _toValueMatrix({\n area,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n }: InternalToValueMatrixProps = {}) {\n const { top, left, bottom, right } = area ?? this.area;\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n for (let y = top; y <= bottom; y++) {\n this._fillValueRow(matrix, y, { top, left, right, at, resolution, raise, filter, asScalar });\n }\n return matrix;\n }\n\n /**\n * Async, time-sliced variant of _toValueMatrix. Reading every cell lazily\n * materializes the whole sheet (~hundreds of ms at a million cells), so doing\n * it synchronously freezes the host. This processes rows until `frameBudgetMs`\n * elapses, then reports progress and yields — leaving the UI responsive and\n * letting the caller paint a progress indicator. The caller supplies\n * `yieldControl` (a macrotask/rAF yielder so the host actually paints between\n * chunks); the default microtask only cooperates, which suffices for headless\n * callers that just want to avoid monopolizing the loop. @internal\n */\n public async _toValueMatrixAsync({\n area,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n frameBudgetMs = 12,\n onProgress,\n yieldControl,\n }: InternalToValueMatrixProps & {\n frameBudgetMs?: number;\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n } = {}): Promise<any[][]> {\n const { top, left, bottom, right } = area ?? this.area;\n const totalRows = Math.max(0, bottom - top + 1);\n const matrix = createMatrix(totalRows, right - left + 1);\n const doYield = yieldControl ?? (() => Promise.resolve());\n onProgress?.({ done: 0, total: totalRows });\n let lastYield = Date.now();\n let done = 0;\n for (let y = top; y <= bottom; y++) {\n this._fillValueRow(matrix, y, { top, left, right, at, resolution, raise, filter, asScalar });\n done++;\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done, total: totalRows });\n await doYield();\n lastYield = Date.now();\n }\n }\n onProgress?.({ done: totalRows, total: totalRows });\n return matrix;\n }\n\n /** @internal */\n private _pushHistory(history: HistoryType) {\n const book = this.registry;\n const strayedHistories = book.histories.splice(book.historyIndex + 1, book.histories.length);\n strayedHistories.forEach(this._cleanStrayed.bind(this));\n book.histories.push(history);\n book.lastHistory = book.currentHistory = history;\n if (book.histories.length > book.historyLimit) {\n const kickedOut = book.histories.splice(0, 1)[0];\n this._cleanObsolete(kickedOut);\n } else {\n book.historyIndex++;\n }\n }\n\n /** @internal */\n private _cleanObsolete(history: HistoryType) {\n if (history.operation === 'REMOVE_ROWS' || history.operation === 'REMOVE_COLS') {\n history.deleted.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n if (history.operation === 'MOVE') {\n history.moveRelations.forEach((rel) => {\n if (rel.new != null) {\n this._deleteOrphanedId(rel.new);\n }\n if (rel.lost != null) {\n this._deleteOrphanedId(rel.lost);\n }\n });\n }\n }\n\n /** @internal */\n private _cleanStrayed(history: HistoryType) {\n /**\n * Cleans up IDs that were created by a history entry that has been discarded\n * (\"strayed\") due to a new operation being pushed while the history index was\n * not at the end (i.e. after undo).\n *\n * When the user undoes one or more steps and then performs a new operation,\n * the previously-redoable future histories are removed from the history stack.\n * Any cells that were **inserted** by those discarded histories (INSERT_ROWS /\n * INSERT_COLS) have IDs that are no longer reachable from the id-matrix, so\n * their registry entries must be deleted to avoid memory leaks.\n * @internal\n */\n if (history.operation === 'INSERT_ROWS' || history.operation === 'INSERT_COLS') {\n history.idMatrix.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n }\n\n /**\n * Remove an id from registry.data and registry.dependents entirely.\n * @internal\n */\n private _deleteOrphanedId(id: Id) {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n delete this.registry.data[id];\n delete this.registry.systems[id];\n }\n\n /** @internal */\n private _copyCellLayout(cell: CellType | undefined) {\n if (cell == null) {\n return undefined;\n }\n const newCell: CellType = {};\n if (cell.style != null) {\n newCell.style = cell.style;\n }\n if (cell.justifyContent != null) {\n newCell.justifyContent = cell.justifyContent;\n }\n if (cell.alignItems != null) {\n newCell.alignItems = cell.alignItems;\n }\n if (cell.policy != null) {\n newCell.policy = cell.policy;\n }\n if (cell.width != null) {\n newCell.width = cell.width;\n }\n if (cell.height != null) {\n newCell.height = cell.height;\n }\n return newCell;\n }\n\n public move({\n srcSheet = this,\n src,\n dst,\n historicize = true,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: MoveProps) {\n const srcSheetRaw = srcSheet.__raw__;\n const moveRelations = this._createMoveRelations(srcSheetRaw, src, this, dst);\n const { diffBefore, diffAfter } = this._moveCells(srcSheetRaw, this, moveRelations, false, operator);\n\n this._xsheetDispatch(srcSheetRaw);\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'MOVE',\n srcSheetId: srcSheetRaw.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n moveRelations,\n });\n }\n\n return this.refresh(true);\n }\n\n /**\n * Build MoveRelations from src area to dst area, skipping filtered rows.\n *\n * Layout of the returned array (processed in this order by _moveCells):\n * 1. Entries where [0] is a newly-generated ID — these fill the vacated src cells (processed last in forward order)\n * 2. Entries where [0] is a src address and [1] is a dst address — the actual moves (processed first in forward order, descending)\n * Entries whose [1] is an existing ID mean the destination cell is displaced/overflowed and\n * is no longer addressable; on forward pass they are skipped; on reverse pass the ID is written back.\n */\n /** @internal */\n private _createMoveRelations(srcSheet: Sheet, src: AreaType, dstSheet: Sheet, dst: AreaType): MoveRelations {\n const { top: srcTop, left: srcLeft, bottom: srcBottom, right: srcRight } = src;\n const { top: dstTop, left: dstLeft } = dst;\n\n const dstNumRows = dstSheet.numRows;\n const dstNumCols = dstSheet.numCols;\n\n // Collect visible (non-filtered) rows for src\n const srcVisibleRows: number[] = [];\n for (let y = srcTop; y <= srcBottom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const srcNumCols = srcRight - srcLeft + 1;\n const srcNumVisibleRows = srcVisibleRows.length;\n\n // Collect corresponding visible dst rows (skip filtered rows in dst, matching count)\n const dstVisibleRows: number[] = [];\n {\n let di = 0;\n let y = dstTop;\n while (di < srcNumVisibleRows) {\n if (!dstSheet.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n di++;\n }\n y++;\n }\n }\n\n // Build sets for quick lookup\n const srcCellSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n for (let j = 0; j < srcNumCols; j++) {\n srcCellSet.add(p2a({ y: srcVisibleRows[di], x: srcLeft + j }));\n }\n }\n\n const dstAddrSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const dstX = dstLeft + j;\n if (dstY <= dstNumRows && dstX <= dstNumCols) {\n dstAddrSet.add(p2a({ y: dstY, x: dstX }));\n }\n }\n }\n\n const moveRelations: MoveRelations = [];\n\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const srcY = srcVisibleRows[di];\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const srcX = srcLeft + j;\n const dstX = dstLeft + j;\n const srcAddr = p2a({ y: srcY, x: srcX });\n const isDstInBounds = dstY <= dstNumRows && dstX <= dstNumCols;\n const dstAddr = isDstInBounds ? p2a({ y: dstY, x: dstX }) : undefined;\n\n let newId: Id | undefined;\n // Vacate: src cell is NOT covered by any dst write in the same sheet overlap\n if (!(srcSheet === dstSheet && dstAddrSet.has(srcAddr))) {\n newId = srcSheet._generateId();\n }\n\n let lostId: Id | undefined;\n if (isDstInBounds) {\n // Displace: dst cell is overwritten but was NOT part of the src area being moved\n if (!(srcSheet === dstSheet && srcCellSet.has(dstAddr!))) {\n const existingId = dstSheet.getId({ y: dstY, x: dstX });\n if (existingId != null) {\n lostId = existingId;\n }\n }\n } else {\n // Overflow: the src ID itself is pushed out of bounds and lost\n const srcId = srcSheet.getId({ y: srcY, x: srcX });\n if (srcId != null) {\n lostId = srcId;\n }\n }\n\n const srcCell = srcSheet.getCell({ y: srcY, x: srcX }, { resolution: 'SYSTEM' });\n const dstCell = isDstInBounds ? dstSheet.getCell({ y: dstY, x: dstX }, { resolution: 'SYSTEM' }) : undefined;\n\n moveRelations.push({\n before: srcCell?.policy,\n after: dstCell?.policy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n });\n }\n }\n\n return moveRelations;\n }\n\n get defaultPolicy(): PolicyType {\n return this.policies[DEFAULT_POLICY_NAME] ?? nonePolicy;\n }\n\n /**\n * Apply (or reverse) a MoveRelations list.\n *\n * Forward (reverse=false): process descending — actual ID moves happen bottom-up so\n * earlier entries don't clobber later ones; vacate entries (at front of array) are\n * applied last.\n * Reverse (reverse=true): process ascending — restores IDs in the natural order.\n *\n * On forward pass: applies policy, collects diffBefore, runs ReferencePreserver.\n * On reverse pass: only moves IDs (caller is responsible for applyDiff(diffBefore)).\n */\n /** @internal */\n private _moveCells(\n srcSheet: Sheet,\n dstSheet: Sheet,\n moveRelations: MoveRelations,\n reverse: boolean,\n operator: OperatorType = 'SYSTEM',\n ): { diffBefore: CellsByIdType; diffAfter: CellsByIdType } {\n const diffBefore: CellsByIdType = {};\n const preserver = new ReferencePreserver(dstSheet);\n\n const wireWrites: CellsByIdType = {};\n const idWritesSrc: Array<{ y: Y; x: X; id: Id }> = [];\n const idWritesDst: Array<{ y: Y; x: X; id: Id }> = [];\n\n // Forward pass: collect diffs and temporary buffer writes\n if (!reverse) {\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n const srcPoint = a2p(srcAddr);\n const srcId = srcSheet.getId(srcPoint);\n const dstPoint = dstAddr != null ? a2p(dstAddr) : undefined;\n const dstId = dstPoint != null ? dstSheet.getId(dstPoint) : undefined;\n\n const srcCell = srcId != null ? srcSheet.registry.data[srcId] : undefined;\n const dstCell = dstId != null ? dstSheet.registry.data[dstId] : undefined;\n\n if (\n operator === 'USER' &&\n (operation.hasOperation(srcCell?.prevention, operation.MoveFrom) ||\n operation.hasOperation(dstCell?.prevention, operation.MoveTo))\n ) {\n continue;\n }\n\n // Vacate\n if (newId != null) {\n const policyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const policy = srcSheet.policies[policyKey] ?? srcSheet.defaultPolicy;\n const restricted = policy.select({\n sheet: srcSheet,\n point: srcPoint,\n next: { value: null },\n current: srcCell,\n operation: operation.MoveFrom,\n });\n\n wireWrites[newId] = {\n ...restricted,\n policy: beforePolicy,\n };\n this.registry.systems[newId] = { id: newId, sheetId: srcSheet.id, changedTime: Date.now() };\n idWritesSrc.push({ y: srcPoint.y, x: srcPoint.x, id: newId });\n }\n\n // Actual Move\n if (dstId != null && dstPoint != null && dstAddr != null) {\n const dstPolicyKey = afterPolicy || DEFAULT_POLICY_NAME;\n const srcPolicyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const dstPolicyVal = dstSheet.policies[dstPolicyKey] ?? dstSheet.defaultPolicy;\n const srcPolicyVal = srcSheet.policies[srcPolicyKey] ?? srcSheet.defaultPolicy;\n const isSrcWinner = srcPolicyVal.priority > dstPolicyVal.priority;\n const policy = isSrcWinner ? srcPolicyVal : dstPolicyVal;\n\n const restricted = policy.select({\n sheet: dstSheet,\n point: dstPoint,\n next: srcCell,\n current: dstCell,\n operation: operation.MoveTo,\n });\n\n if (restricted) {\n diffBefore[srcId] = srcCell ?? {};\n wireWrites[srcId] = {\n ...srcCell,\n ...restricted,\n policy: isSrcWinner ? beforePolicy : afterPolicy,\n };\n }\n if (srcCell != null) {\n const srcSys = this.registry.systems[srcId];\n if (srcSys) {\n srcSys.changedTime = Date.now();\n }\n }\n\n idWritesDst.push({ y: dstPoint.y, x: dstPoint.x, id: srcId });\n }\n }\n } else {\n // Reverse pass: collect id buffer writes (no registry.data modification)\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n // Move ID that landed at dst back to src\n if (dstAddr != null) {\n const toPoint = a2p(dstAddr);\n const movedId = dstSheet.getId(toPoint);\n if (movedId != null) {\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: movedId });\n }\n }\n\n // Restore lost ID to where it was lost from\n if (lostId != null) {\n if (dstAddr != null) {\n // It was displaced from dst\n const toPoint = a2p(dstAddr);\n idWritesDst.push({ y: toPoint.y, x: toPoint.x, id: lostId });\n } else {\n // It overflowed from src\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: lostId });\n }\n }\n }\n }\n\n // Snapshot idMatrix before flush\n if (!reverse) {\n srcSheet._materializeIdMatrix();\n if (srcSheet !== dstSheet) {\n dstSheet._materializeIdMatrix();\n }\n }\n const srcSnapshot = !reverse ? srcSheet.idMatrix.flat() : null;\n const dstSnapshot = !reverse && srcSheet !== dstSheet ? dstSheet.idMatrix.flat() : null;\n\n // Flush registry.data writes first\n Object.assign(this.registry.data, wireWrites);\n // Then flush idMatrix writes\n for (const { y, x, id } of idWritesSrc) {\n srcSheet._ensureIdRow(y)[x] = id;\n }\n for (const { y, x, id } of idWritesDst) {\n dstSheet._ensureIdRow(y)[x] = id;\n }\n\n // Update lastChangedAddresses\n const changedAddresses: Address[] = moveRelations.filter((r) => r.dst != null).map((r) => r.dst as Address);\n const srcAddresses: Address[] = moveRelations.map((r) => r.src);\n\n if (srcSheet === dstSheet) {\n dstSheet.lastChangedAddresses = [...new Set([...srcAddresses, ...changedAddresses])];\n } else {\n dstSheet.lastChangedAddresses = changedAddresses;\n srcSheet.lastChangedAddresses = srcAddresses;\n }\n\n if (!reverse) {\n preserver.buildMap(srcSnapshot!.flat(), srcSheet.idMatrix.flat());\n if (srcSheet !== dstSheet) {\n preserver.buildMap(dstSnapshot!.flat(), dstSheet.idMatrix.flat());\n }\n const resolvedDiff = preserver.resolveDependents('move');\n Object.assign(diffBefore, resolvedDiff);\n }\n\n return { diffBefore, diffAfter: {} };\n }\n\n /** Build the paste (copy) diff without applying it. Shared by copy()/copyAsync(). @internal */\n private _buildCopyDiff({ srcSheet = this, src, dst, onlyValue = false }: MoveProps & { onlyValue?: boolean }): CellsByAddressType {\n const isXSheet = srcSheet !== this;\n const { top: topFrom, left: leftFrom, bottom: bottomFrom, right: rightFrom } = src;\n const { top: topTo, left: leftTo, bottom: bottomTo, right: rightTo } = dst;\n const diff: CellsByAddressType = {};\n const changedTime = Date.now();\n\n // Build list of visible (non-filtered) rows for src and dst\n const srcVisibleRows: number[] = [];\n for (let y = topFrom; y <= bottomFrom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const dstVisibleRows: number[] = [];\n for (let y = topTo; y <= bottomTo; y++) {\n if (y > this.numRows) {\n continue;\n }\n if (!this.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n }\n }\n\n const srcNumVisibleRows = srcVisibleRows.length;\n const srcNumCols = rightFrom - leftFrom + 1;\n const dstNumCols = rightTo - leftTo + 1;\n\n for (let di = 0; di < dstVisibleRows.length; di++) {\n const toY = dstVisibleRows[di];\n const fromY = srcVisibleRows[di % srcNumVisibleRows];\n for (let j = 0; j <= dstNumCols - 1; j++) {\n const toX = leftTo + j;\n if (toX > this.numCols) {\n continue;\n }\n const fromX = leftFrom + (j % srcNumCols);\n const slideY = isXSheet ? 0 : toY - fromY;\n const slideX = isXSheet ? 0 : toX - fromX;\n const cell: CellType = {\n ...srcSheet.getCell({ y: fromY, x: fromX }, { resolution: 'SYSTEM' }),\n };\n const dstPoint = { y: toY, x: toX };\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n const dstPolicy = this.getPolicy(dstPoint);\n const srcPoint = { y: fromY, x: fromX };\n const srcPolicy = srcSheet.getPolicy(srcPoint);\n const srcCell = srcSheet.getCell(srcPoint, { resolution: 'SYSTEM' });\n\n const isSrcWinner = srcPolicy.priority > dstPolicy.priority;\n cell.policy = isSrcWinner ? srcCell?.policy : dstCell?.policy;\n const dstIdForClear = this.getId(dstPoint);\n this.clearDependencies(dstIdForClear);\n const value =\n (cell?.formulaEnabled ?? true)\n ? this.processFormula(cell?.value, {\n dependency: dstIdForClear,\n slideY,\n slideX,\n })\n : cell?.value;\n const dstId = this.getId(dstPoint);\n const dstSys = this.registry.systems[dstId];\n if (dstSys != null) {\n dstSys.changedTime = changedTime;\n }\n const address = p2a(dstPoint);\n if (onlyValue) {\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n cell.style = dstCell?.style;\n cell.justifyContent = dstCell?.justifyContent;\n cell.alignItems = dstCell?.alignItems;\n }\n diff[address] = { ...cell, value };\n }\n }\n return diff;\n }\n\n public copy(props: MoveProps & { onlyValue?: boolean }) {\n const { operator = 'SYSTEM', undoReflection, redoReflection } = props;\n return this.update({\n diff: this._buildCopyDiff(props),\n partial: false,\n operator,\n operation: operation.Copy,\n undoReflection,\n redoReflection,\n });\n }\n\n /**\n * Async, progress-reporting counterpart to {@link copy} (large paste). Builds AND\n * applies the paste one dst-row-chunk at a time — never materializing the whole\n * diff — so progress advances throughout and peak memory stays to a chunk (the\n * full-diff build was what stalled a 2-million-cell paste at 0%). The source region\n * is snapshotted first so an overlapping paste (e.g. the copied cell is inside the\n * target) never reads an already-pasted value. @internal\n */\n public async copyAsync(\n props: MoveProps & { onlyValue?: boolean },\n opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n frameBudgetMs?: number;\n },\n ): Promise<Sheet> {\n const { srcSheet = this, src, dst, onlyValue = false, operator = 'SYSTEM', undoReflection, redoReflection } = props;\n const { onProgress, yieldControl, frameBudgetMs = 12 } = opts;\n const doYield = yieldControl ?? (() => Promise.resolve());\n\n const isXSheet = srcSheet !== this;\n const { top: topFrom, left: leftFrom, bottom: bottomFrom, right: rightFrom } = src;\n const { top: topTo, left: leftTo, bottom: bottomTo, right: rightTo } = dst;\n const changedTime = Date.now();\n\n const srcVisibleRows: number[] = [];\n for (let y = topFrom; y <= bottomFrom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const srcNumVisibleRows = srcVisibleRows.length;\n const srcNumCols = rightFrom - leftFrom + 1;\n const dstNumCols = rightTo - leftTo + 1;\n\n // Snapshot the (small) source region up front — safe against overlapping paste.\n const srcCells: (CellType | null)[][] = [];\n const srcPolicies: PolicyType[][] = [];\n for (let si = 0; si < srcNumVisibleRows; si++) {\n const fromY = srcVisibleRows[si];\n const cellRow: (CellType | null)[] = [];\n const polRow: PolicyType[] = [];\n for (let sc = 0; sc < srcNumCols; sc++) {\n const fromX = leftFrom + sc;\n cellRow.push(srcSheet.getCell({ y: fromY, x: fromX }, { resolution: 'SYSTEM' }) ?? null);\n polRow.push(srcSheet.getPolicy({ y: fromY, x: fromX }));\n }\n srcCells.push(cellRow);\n srcPolicies.push(polRow);\n }\n\n const out: _UpdateAccum = { diffBefore: {}, diffAfter: {}, changedAddresses: [] };\n const ctx: _UpdateCtx = {\n partial: false,\n updateChangedTime: true,\n ignoreFields: ['label'],\n operator,\n op: operation.Copy,\n formulaIdentify: false, // the formula is already resolved (with slide) in the loop below\n changedTime: Date.now(),\n };\n // Iterate destination rows directly (skipping filtered rows inline) instead of\n // precomputing a visible-row list — that list-building called isRowFiltered() for\n // every row, materializing a million row headers synchronously and stalling at 0%.\n // When nothing is filtered, skip the per-row check entirely.\n const noFilters = this._filteredRows.size === 0;\n const dstBottom = Math.min(bottomTo, this.numRows);\n const total = Math.max(0, dstBottom - topTo + 1);\n let resized = false;\n let lastYield = Date.now();\n let visibleDstIndex = 0;\n let done = 0;\n onProgress?.({ done: 0, total });\n\n for (let toY = topTo; toY <= dstBottom; toY++) {\n done++;\n if (!noFilters && this.isRowFiltered(toY)) {\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done, total });\n await doYield();\n lastYield = Date.now();\n }\n continue;\n }\n const si = visibleDstIndex % srcNumVisibleRows;\n const fromY = srcVisibleRows[si];\n visibleDstIndex++;\n for (let j = 0; j <= dstNumCols - 1; j++) {\n const toX = leftTo + j;\n if (toX > this.numCols) {\n continue;\n }\n const sc = j % srcNumCols;\n const fromX = leftFrom + sc;\n const slideY = isXSheet ? 0 : toY - fromY;\n const slideX = isXSheet ? 0 : toX - fromX;\n const srcCell = srcCells[si][sc];\n const dstPoint = { y: toY, x: toX };\n const dstId = this.getId(dstPoint);\n // Fetch the dst cell ONCE and derive its policy from it — getPolicy() would\n // otherwise getCell() the same point again (a second populate per cell).\n const dstCell = this.registry.data[dstId] ?? this.getCell(dstPoint, { resolution: 'SYSTEM' });\n const dstPolicy =\n dstCell?.policy == null ? this.defaultPolicy : (this.policies[dstCell.policy] ?? this.defaultPolicy);\n const srcPolicy = srcPolicies[si][sc];\n const isSrcWinner = srcPolicy.priority > dstPolicy.priority;\n this.clearDependencies(dstId);\n // Resolve the formula (with the paste offset) here; ctx.formulaIdentify is off,\n // so _applyUpdateCell won't re-run processFormula on the already-resolved value.\n // Skip processFormula entirely for non-formula values (the common bulk case) —\n // it would only tokenize a literal and hand it straight back.\n const srcValue = srcCell?.value;\n const isFormula = typeof srcValue === 'string' && srcValue.charCodeAt(0) === 61; // '='\n const value =\n isFormula && (srcCell?.formulaEnabled ?? true)\n ? this.processFormula(srcValue, { dependency: dstId, slideY, slideX })\n : srcValue;\n const dstSys = this.registry.systems[dstId];\n if (dstSys != null) {\n dstSys.changedTime = changedTime;\n }\n // Build the final cell in one spread (throwaway → _applyUpdateCell owns it).\n const next: CellType = { ...srcCell, value, policy: isSrcWinner ? srcCell?.policy : dstCell?.policy };\n if (onlyValue) {\n next.style = dstCell?.style;\n next.justifyContent = dstCell?.justifyContent;\n next.alignItems = dstCell?.alignItems;\n }\n if (this._applyUpdateCell(dstPoint, dstId, p2a(dstPoint), next, ctx, out, true)) {\n resized = true;\n }\n }\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done, total });\n await doYield();\n lastYield = Date.now();\n }\n }\n this.lastChangedAddresses = out.changedAddresses;\n onProgress?.({ done: total, total });\n\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore: out.diffBefore,\n diffAfter: out.diffAfter,\n partial: false,\n });\n return this.refresh(false, resized);\n }\n\n public getPolicy(point: PointType): PolicyType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' });\n if (cell?.policy == null) {\n return this.defaultPolicy;\n }\n return this.policies[cell.policy] ?? this.defaultPolicy;\n }\n\n /** @internal */\n private _update({\n diff,\n partial = true,\n updateChangedTime = true,\n ignoreFields = ['label'],\n operator = 'SYSTEM',\n operation: op = operation.Update,\n formulaIdentify = true,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n ignoreFields?: CellField[];\n operator?: OperatorType;\n operation?: OperationType;\n formulaIdentify?: boolean;\n }) {\n const out: _UpdateAccum = { diffBefore: {}, diffAfter: {}, changedAddresses: [] };\n const ctx: _UpdateCtx = {\n partial,\n updateChangedTime,\n ignoreFields,\n operator,\n op,\n formulaIdentify,\n changedTime: Date.now(),\n };\n\n let resized = false;\n for (const address of Object.keys(diff)) {\n const point = a2p(address);\n if (this._applyUpdateCell(point, this.getId(point), address, diff[address], ctx, out)) {\n resized = true;\n }\n }\n\n // Store the changed addresses for retrieval via getLastChangedAddresses()\n this.lastChangedAddresses = out.changedAddresses;\n\n //this.clearSolvedCaches();\n return {\n diffBefore: out.diffBefore,\n diffAfter: out.diffAfter,\n resized,\n };\n }\n\n /**\n * Apply one diff entry to registry.data, recording undo/redo state into `out`.\n * Shared by the synchronous `_update` and the chunked `updateAsync` so the two\n * never diverge. Returns whether this cell triggered a resize. @internal\n */\n private _applyUpdateCell(\n point: PointType,\n id: Id,\n address: string,\n rawNext: any,\n ctx: _UpdateCtx,\n out: _UpdateAccum,\n // When the caller hands us a throwaway object it built, mutate it in place instead\n // of copying — saves a spread per cell on the bulk paste/fill path.\n ownNext = false,\n ): boolean {\n const current = this.registry.data[id];\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Update)) {\n return false;\n }\n\n let next: Record<string, any> = ownNext ? rawNext : { ...rawNext };\n\n if (ctx.formulaIdentify && 'value' in next) {\n const formulaEnabled = next.formulaEnabled ?? current?.formulaEnabled ?? true;\n if (formulaEnabled) {\n this.clearDependencies(id);\n next.value = this.processFormula(next.value, { dependency: id });\n }\n }\n ctx.ignoreFields.forEach((key) => {\n next[key] = current?.[key];\n });\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Write)) {\n delete next.value;\n }\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Style)) {\n delete next?.style?.justifyContent;\n delete next?.style?.alignItems;\n }\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Resize)) {\n delete next?.style?.width;\n delete next?.style?.height;\n }\n let resized = false;\n if (next.width != null || next.height != null) {\n resized = true;\n }\n out.diffBefore[id] = current ?? {};\n\n const policy = this.policies[current?.policy || DEFAULT_POLICY_NAME] ?? this.defaultPolicy;\n // select() returns `next` unchanged (no select options) or a fresh object; either\n // is safe to adopt directly — no need to spread-copy it again.\n next = (policy.select({ sheet: this, point, next, current, operation: ctx.op }) ?? next) as Record<string, any>;\n if (ctx.updateChangedTime) {\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = ctx.changedTime;\n }\n }\n if (ctx.partial) {\n const merged = { ...current, ...next };\n this.registry.data[id] = merged;\n out.diffAfter[id] = merged;\n } else {\n this.registry.data[id] = next;\n out.diffAfter[id] = next;\n }\n // Keep the row-height override cache in sync when a row header's height\n // changes (e.g. a resize goes through this partial-update path, not the\n // stacking path that seeds the cache). getOffsetTop() / setTotalSize() read\n // this cache for vertical positioning, so a stale entry leaves the\n // selection/editor overlay drifting from the actual (correctly sized) cells.\n // Columns are unaffected: setTotalSize reads column widths directly.\n if (point.x === 0 && point.y >= 1) {\n const finalH = this.registry.data[id]?.height;\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n if (finalH != null && finalH !== defaultH) {\n this._rowHeightOverrides.set(point.y, finalH);\n } else {\n this._rowHeightOverrides.delete(point.y);\n }\n }\n out.changedAddresses.push(address);\n return resized;\n }\n\n public update({\n diff,\n partial = true,\n updateChangedTime = true,\n historicize = true,\n operator = 'SYSTEM',\n operation: op = operation.Update,\n ignoreFields,\n undoReflection,\n redoReflection,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n operation?: OperationType;\n ignoreFields?: CellField[];\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { diffBefore, diffAfter, resized } = this._update({\n diff,\n partial,\n operator,\n operation: op,\n updateChangedTime,\n ...(ignoreFields != null ? { ignoreFields } : {}),\n });\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n partial,\n });\n }\n return this.refresh(false, resized);\n }\n\n /**\n * Async, time-sliced counterpart to {@link update}. Applies the diff in chunks,\n * yielding + reporting progress between them, so a bulk write (fill / paste of\n * millions of cells) doesn't freeze the host and can drive a progress bar. Pushes\n * a SINGLE history entry (one undo) and produces the same result as update().\n * The caller is responsible for blocking other mutations while this runs — the\n * sheet is in an intermediate state between chunks.\n */\n public async updateAsync({\n diff,\n partial = true,\n updateChangedTime = true,\n historicize = true,\n operator = 'SYSTEM',\n operation: op = operation.Update,\n ignoreFields = ['label'],\n undoReflection,\n redoReflection,\n onProgress,\n yieldControl,\n frameBudgetMs = 12,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n operation?: OperationType;\n ignoreFields?: CellField[];\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n frameBudgetMs?: number;\n }): Promise<Sheet> {\n const out: _UpdateAccum = { diffBefore: {}, diffAfter: {}, changedAddresses: [] };\n const ctx: _UpdateCtx = {\n partial,\n updateChangedTime,\n ignoreFields,\n operator,\n op,\n formulaIdentify: true,\n changedTime: Date.now(),\n };\n const keys = Object.keys(diff);\n const total = keys.length;\n const doYield = yieldControl ?? (() => Promise.resolve());\n let resized = false;\n let lastYield = Date.now();\n onProgress?.({ done: 0, total });\n for (let i = 0; i < total; i++) {\n const address = keys[i];\n const point = a2p(address);\n if (this._applyUpdateCell(point, this.getId(point), address, diff[address], ctx, out)) {\n resized = true;\n }\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done: i + 1, total });\n await doYield();\n lastYield = Date.now();\n }\n }\n this.lastChangedAddresses = out.changedAddresses;\n onProgress?.({ done: total, total });\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore: out.diffBefore,\n diffAfter: out.diffAfter,\n partial,\n });\n }\n return this.refresh(false, resized);\n }\n\n /** @internal */\n public writeRawCellMatrix({\n point,\n matrix,\n updateChangedTime = true,\n historicize = true,\n onlyValue = false,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n point: PointType;\n matrix: MatrixType<RawCellType>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n onlyValue?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { y: baseY, x: baseX } = point;\n const diff: CellsByAddressType = {};\n\n // Build list of visible (non-filtered) rows starting from baseY\n // Map src row index (i) -> dst y, skipping filtered rows\n let srcRowIndex = 0;\n let dstY = baseY;\n while (srcRowIndex < matrix.length) {\n if (dstY > this.bottom) {\n break;\n }\n if (this.isRowFiltered(dstY)) {\n dstY++;\n continue;\n }\n const cells = matrix[srcRowIndex];\n cells.forEach((newCell, j) => {\n const x = baseX + j;\n if (x > this.right) {\n return;\n }\n const dstPoint = { y: dstY, x };\n const parsed = this.parse(dstPoint, newCell.value ?? '');\n parsed.style = { ...newCell.style, ...parsed.style };\n if (onlyValue) {\n const currentCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n parsed.style = currentCell?.style;\n parsed.justifyContent = currentCell?.justifyContent;\n parsed.alignItems = currentCell?.alignItems;\n }\n diff[p2a(dstPoint)] = parsed;\n });\n srcRowIndex++;\n dstY++;\n }\n return this.update({\n diff,\n partial: true,\n updateChangedTime,\n historicize,\n operator,\n operation: operation.Write,\n undoReflection,\n redoReflection,\n });\n }\n\n public writeMatrix(props: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const matrixWithStyle: MatrixType<RawCellType> = props.matrix.map((row) => row.map((value) => ({ value })));\n return this.writeRawCellMatrix({ ...props, matrix: matrixWithStyle });\n }\n\n public write(props: {\n point: PointType;\n value: string;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { point, value } = props;\n const parsed = this.parse(point, value ?? '');\n const current = this.getCell(point, { resolution: 'RAW' });\n if ((current?.value ?? null) === parsed.value) {\n // no change (treat undefined and null as equivalent empty values)\n return this;\n }\n const diff = { [p2a(point)]: parsed };\n return this.update({\n ...props,\n diff,\n partial: true,\n operation: operation.Write,\n });\n }\n\n public insertRows({\n y,\n numRows,\n baseY,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumRows !== -1 && this.numRows + numRows > this.maxNumRows) {\n console.error(`Rows are limited to ${this.maxNumRows}.`);\n return this;\n }\n const numCols = this.numCols;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i < numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j <= numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: baseY, x: j }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.idMatrix.splice(y, 0, ...rows);\n this.area.bottom += numRows;\n // Shift existing row-metadata up, then seed the inserted rows from their copied layout\n // so non-default heights / filtered state are reflected immediately (not just on next read).\n this._shiftRowMetaForInsert(y, numRows);\n this._seedRowMeta(y, numRows);\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n y,\n numRows,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertRows) {\n const cloned = this.clone();\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onInsertRows({ sheet: cloned, y, numRows });\n }\n return this.refresh(true, true);\n }\n public removeRows({\n y,\n numRows,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumRows !== -1 && this.numRows - numRows < this.minNumRows) {\n console.error(`At least ${this.minNumRows} row(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const ys: number[] = [];\n this._materializeIdMatrix();\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let yi = y; yi < y + numRows; yi++) {\n const cell = this.getCell({ y: yi, x: 0 }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveRows)) {\n console.warn(`Cannot delete row ${yi}.`);\n return this;\n }\n for (let xi = 1; xi <= this.numCols; xi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi + numRows, x: xi });\n }\n ys.unshift(yi);\n }\n const deleted: MatrixType = [];\n ys.forEach((y) => {\n const row = this.idMatrix.splice(y, 1);\n deleted.unshift(row[0]);\n });\n this.area.bottom -= ys.length;\n // Keep row-metadata caches (keyed by absolute row number) aligned with the new layout.\n this._shiftRowMetaForRemove(y, numRows);\n\n const diffBefore = preserver.resolveDependents('removeRows');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n ys: ys.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveRows) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onRemoveRows({ sheet: cloned, ys: ys.reverse() });\n }\n return this.refresh(true, true);\n }\n\n public insertCols({\n x,\n numCols,\n baseX,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumCols !== -1 && this.numCols + numCols > this.maxNumCols) {\n console.error(`Columns are limited to ${this.maxNumCols}.`);\n return this;\n }\n const numRows = this.numRows;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i <= numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j < numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: i, x: baseX }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this._ensureIdRow(i).splice(x, 0, id);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.area.right += numCols;\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n x,\n numCols,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertCols) {\n const cloned = this.clone();\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onInsertCols({ sheet: cloned, x, numCols });\n }\n return this.refresh(true, true);\n }\n public removeCols({\n x,\n numCols,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumCols !== -1 && this.numCols - numCols < this.minNumCols) {\n console.error(`At least ${this.minNumCols} column(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const xs: number[] = [];\n this._materializeIdMatrix();\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let xi = x; xi < x + numCols; xi++) {\n const cell = this.getCell({ y: 0, x: xi }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveCols)) {\n console.warn(`Cannot delete col ${xi}.`);\n continue;\n }\n for (let yi = 1; yi <= this.numRows; yi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi, x: xi + numCols });\n }\n xs.unshift(xi);\n }\n\n const deleted: MatrixType = [];\n this.idMatrix.forEach((row) => {\n const deleting: Ids = [];\n deleted.push(deleting);\n // reverse and delete\n xs.forEach((x) => {\n deleting.unshift(...row.splice(x, 1));\n });\n });\n this.area.right -= xs.length;\n const diffBefore = preserver.resolveDependents('removeCols');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n xs: xs.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveCols) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onRemoveCols({ sheet: cloned, xs: xs.reverse() });\n }\n return this.refresh(true, true);\n }\n /** @internal */\n public histories() {\n return [...this.registry.histories];\n }\n /** @internal */\n public historyIndex() {\n return this.registry.historyIndex;\n }\n /** @internal */\n public historySize() {\n return this.registry.histories.length;\n }\n /** @internal */\n public getHistoryLimit() {\n return this.registry.historyLimit;\n }\n\n /** @internal */\n public parse(point: PointType, value: any): CellType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' }) ?? {};\n const policy = this.getPolicy(point);\n return policy.deserializeValue(value, cell);\n }\n\n /** @internal */\n public render(props: RenderProps) {\n const { point, apply } = props;\n const at = this.getId(point);\n const policy = this.getPolicy(point);\n return policy.render({ sheet: this, point, apply, value: undefined });\n }\n\n public getSerializedValue({\n point,\n cell,\n resolution = 'RESOLVED',\n }: {\n point: PointType;\n cell?: CellType;\n resolution?: Resolution;\n }) {\n if (cell == null) {\n // Use raw cell from registry so cell.value is the original formula string.\n // getCell(raise=false) would replace cell.value with undefined, losing the formula.\n const id = this.getId(point);\n cell = id != null ? this.registry.data[id] : undefined;\n }\n if (cell == null) {\n return '';\n }\n const policy = this.getPolicy(point);\n const raw = cell.value;\n\n if (typeof raw === 'string' && raw[0] === '=') {\n if (resolution === 'SYSTEM') {\n return raw; // do not evaluate system references\n }\n if (resolution === 'RAW' || cell?.formulaEnabled === false) {\n const lexer = new Lexer(raw.substring(1));\n lexer.tokenize();\n return '=' + lexer.display({ sheet: this });\n }\n try {\n const id = this.getId(point);\n const solved = solveFormula({ value: raw, sheet: this, point, raise: true, resolution, at: id });\n const value = stripSheet({ value: solved, raise: false });\n return policy.serialize({ value, cell, sheet: this, point });\n } catch (e) {\n return policy.serialize({ value: e, cell, sheet: this, point });\n }\n }\n return policy.serialize({ value: raw, cell, sheet: this, point });\n }\n\n /** @internal */\n public trim(area: AreaType): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n copied.area = area;\n copied._stripped = NONE;\n return copied;\n }\n\n /**\n * Solve all formulas in this sheet and return a 2D matrix of resolved values.\n * @internal\n */\n public solve({ raise = false, at }: { raise?: boolean; at: Id }): any[][] {\n return solveSheet({ sheet: this, raise, at });\n }\n\n /**\n * Collapse this sheet to a scalar (top-left cell value).\n * @internal\n */\n public strip({ raise = false, at }: { raise?: boolean; at?: Id }): any {\n if (!NONE.is(this._stripped)) {\n return this._stripped;\n }\n let value: any = this;\n while (value instanceof Sheet) {\n value = solveSheet({ sheet: value, raise, at })[0]?.[0];\n }\n this._stripped = value;\n return this._stripped;\n }\n\n /** @internal */\n /** Apply one undo/redo diff entry to registry.data. Shared by sync/async. @internal */\n private _applyDiffCell(id: string, cell: CellType, partial: boolean): void {\n let merged: CellType;\n if (partial) {\n merged = { ...this.registry.data[id] };\n (Object.keys(cell) as (keyof CellType)[]).forEach((key) => {\n if (cell[key] === undefined) {\n delete merged[key];\n } else {\n (merged as any)[key] = cell[key];\n }\n });\n } else {\n merged = { ...cell };\n }\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = Date.now();\n }\n this.registry.data[id] = merged;\n this.clearDependencies(id);\n this.processFormula(merged.value, { dependency: id });\n\n // Track row height overrides and filtered state\n const address = this.addressCaches.get(id);\n if (address) {\n const p = a2p(address);\n if (p.x === 0 && p.y > 0) {\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n const h = merged.height ?? defaultH;\n if (h !== defaultH) {\n this._rowHeightOverrides.set(p.y, h);\n } else {\n this._rowHeightOverrides.delete(p.y);\n }\n if (merged.filtered) {\n this._filteredRows.add(p.y);\n } else {\n this._filteredRows.delete(p.y);\n }\n }\n }\n }\n\n private _finishApplyDiff(ids: string[]): void {\n this._warmAddressCaches();\n const addresses: Address[] = [];\n for (const id of ids) {\n const address = this.getAddressById(id);\n if (address) {\n addresses.push(address);\n }\n }\n this.lastChangedAddresses = addresses;\n }\n\n private _applyDiff(diff: CellsByIdType = {}, partial = true) {\n const ids = Object.keys(diff);\n for (const id of ids) {\n this._applyDiffCell(id, diff[id] ?? {}, partial);\n }\n this._finishApplyDiff(ids);\n }\n\n /** Chunked, progress-reporting counterpart to _applyDiff (large undo/redo). @internal */\n private async _applyDiffAsync(\n diff: CellsByIdType = {},\n partial = true,\n opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n frameBudgetMs?: number;\n } = {},\n ): Promise<void> {\n const ids = Object.keys(diff);\n const total = ids.length;\n const doYield = opts.yieldControl ?? (() => Promise.resolve());\n const budget = opts.frameBudgetMs ?? 12;\n let lastYield = Date.now();\n opts.onProgress?.({ done: 0, total });\n for (let i = 0; i < total; i++) {\n const id = ids[i];\n this._applyDiffCell(id, diff[id] ?? {}, partial);\n if (Date.now() - lastYield >= budget) {\n opts.onProgress?.({ done: i + 1, total });\n await doYield();\n lastYield = Date.now();\n }\n }\n opts.onProgress?.({ done: total, total });\n // NB: intentionally NOT calling _finishApplyDiff here. This path only runs for a\n // large UPDATE undo/redo (paste/fill), where (a) cell positions don't change, so the\n // addressCaches reverse index stays valid — no need to rebuild all ~millions of\n // entries, and (b) getLastChangedAddresses() has no consumer, so building the address\n // list per changed id is pure work. Doing both synchronously here re-froze the UI at\n // 100% after the chunked apply. lastChangedAddresses is left as-is (unused for UPDATE).\n }\n\n public undo() {\n if (this.registry.historyIndex < 0) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex--];\n history.applyed = false;\n this.registry.currentHistory = this.registry.histories[this.registry.historyIndex];\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffBefore, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.splice(history.y, rows);\n dstSheet.area.bottom -= rows;\n dstSheet._shiftRowMetaForRemove(history.y, rows);\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.forEach((row: string[]) => {\n row.splice(history.x, cols);\n });\n dstSheet.area.right -= cols;\n break;\n }\n case 'REMOVE_ROWS': {\n const { ys, deleted } = history;\n dstSheet._materializeIdMatrix();\n ys.forEach((y, i) => {\n dstSheet.idMatrix.splice(y, 0, deleted[i]);\n });\n dstSheet.area.bottom += ys.length;\n const y0 = Math.min(...ys);\n dstSheet._shiftRowMetaForInsert(y0, ys.length);\n dstSheet._seedRowMeta(y0, ys.length);\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'REMOVE_COLS': {\n const { xs, deleted } = history;\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.forEach((row: string[], i: number) => {\n for (let j = 0; j < xs.length; j++) {\n row.splice(xs[j], 0, deleted[i][j]);\n }\n });\n dstSheet.area.right += xs.length;\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, true);\n }\n const movedAddresses = dstSheet.lastChangedAddresses;\n dstSheet._applyDiff(history.diffBefore, false);\n dstSheet.lastChangedAddresses = [...new Set([...movedAddresses, ...dstSheet.lastChangedAddresses])];\n break;\n }\n case 'SORT_ROWS': {\n dstSheet._materializeIdMatrix();\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, true);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.undoReflection?.transmit);\n },\n };\n }\n\n public redo() {\n if (this.registry.historyIndex + 1 >= this.registry.histories.length) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[++this.registry.historyIndex];\n history.applyed = true;\n this.registry.currentHistory = history;\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffAfter, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.splice(history.y, 0, ...history.idMatrix);\n dstSheet.area.bottom += rows;\n dstSheet._shiftRowMetaForInsert(history.y, rows);\n dstSheet._seedRowMeta(history.y, rows);\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.map((row: string[], i: number) => {\n row.splice(history.x, 0, ...history.idMatrix[i]);\n });\n dstSheet.area.right += cols;\n break;\n }\n case 'REMOVE_ROWS': {\n dstSheet.removeRows({\n y: history.ys[0],\n numRows: history.ys.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'REMOVE_COLS': {\n dstSheet.removeCols({\n x: history.xs[0],\n numCols: history.xs.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, false);\n }\n break;\n }\n case 'SORT_ROWS': {\n dstSheet._materializeIdMatrix();\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, false);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.redoReflection?.transmit);\n },\n };\n }\n\n /** @internal The history the next undo would apply (without applying it). */\n public peekUndo(): HistoryType | null {\n const idx = this.registry.historyIndex;\n return idx < 0 ? null : this.registry.histories[idx];\n }\n /** @internal The history the next redo would apply. */\n public peekRedo(): HistoryType | null {\n const idx = this.registry.historyIndex + 1;\n return idx >= this.registry.histories.length ? null : this.registry.histories[idx];\n }\n\n /**\n * Async, progress-reporting undo of a large UPDATE (paste/fill). Mirrors the UPDATE\n * branch of undo() but applies diffBefore in chunks. Only call when peekUndo() is an\n * UPDATE; other operations must use the synchronous undo(). @internal\n */\n public async undoAsync(opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n }): Promise<ReturnType<Sheet['undo']>> {\n if (this.registry.historyIndex < 0) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex];\n if (history.operation !== 'UPDATE') {\n return this.undo(); // caller only routes UPDATEs here; be safe for anything else\n }\n this.registry.historyIndex--;\n history.applyed = false;\n this.registry.currentHistory = this.registry.histories[this.registry.historyIndex];\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n await dstSheet._applyDiffAsync(history.diffBefore, history.partial ?? false, opts);\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.undoReflection?.transmit);\n },\n };\n }\n\n /** Async, progress-reporting redo of a large UPDATE (paste/fill). @internal */\n public async redoAsync(opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n }): Promise<ReturnType<Sheet['redo']>> {\n if (this.registry.historyIndex + 1 >= this.registry.histories.length) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex + 1];\n if (history.operation !== 'UPDATE') {\n return this.redo(); // caller only routes UPDATEs here; be safe for anything else\n }\n this.registry.historyIndex++;\n history.applyed = true;\n this.registry.currentHistory = history;\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n await dstSheet._applyDiffAsync(history.diffAfter, history.partial ?? false, opts);\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.redoReflection?.transmit);\n },\n };\n }\n\n /** @internal */\n public getFunctionByName(name: string) {\n return this.registry.functions[name];\n }\n\n /** @internal */\n public clearDependencies(id: Id): void {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n if (sys != null) {\n sys.dependencies = new Set();\n }\n }\n\n /** @internal */\n public addDependency(id: Id, dependency: Id): void {\n const sys = ensureSys(this.registry, id);\n if (sys.dependents == null) {\n sys.dependents = new Set();\n }\n sys.dependents.add(dependency);\n const depSys = ensureSys(this.registry, dependency);\n if (depSys.dependencies == null) {\n depSys.dependencies = new Set();\n }\n depSys.dependencies.add(id);\n }\n\n /** @internal */\n public getSolvedCache(point: PointType): [boolean, any] {\n const id = this.getId(point);\n return [this.registry.solvedCaches.has(id), this.registry.solvedCaches.get(id)];\n }\n /** @internal */\n public setSolvingCache(point: PointType) {\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, SOLVING);\n ensureSys(this.registry, id, { tmpAsyncCaches: {} });\n }\n\n /** @internal */\n public finishSolvedCache(point: PointType, value: any) {\n if (SOLVING.is(value)) {\n return;\n }\n\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, value);\n\n const cell = this.registry.data[id];\n if (cell == null) {\n return;\n }\n const sys = this.registry.systems[id];\n const tmp = sys?.tmpAsyncCaches;\n\n if (tmp != null) {\n if (Object.keys(tmp).length > 0) {\n cell.asyncCaches = tmp;\n } else {\n delete cell.asyncCaches;\n }\n delete sys!.tmpAsyncCaches;\n }\n }\n\n /** @internal */\n public clearSolvedCaches() {\n this.registry.solvedCaches.clear();\n for (const id of this.registry.lastSpilledTargetIds) {\n const sys = this.registry.systems[id];\n if (sys?.spilledFrom != null) {\n delete sys.spilledFrom;\n }\n }\n this.registry.lastSpilledTargetIds.clear();\n }\n\n /**\n * Spill a 2D matrix of values starting from the origin cell.\n * The origin cell receives matrix[0][0] and adjacent cells receive spill values in solvedCaches.\n * For a 1×1 matrix, no spill occurs — the single value is cached directly.\n * Throws FormulaError('#REF!') if the spill range is obstructed.\n *\n * @param origin The anchor cell that produced the spill.\n * @param matrix The 2D array of resolved scalar values.\n * @returns The top-left value (matrix[0][0]).\n * @internal\n */\n public spill(origin: PointType, matrix: any[][]): any {\n const numRows = matrix.length;\n const numCols = numRows > 0 ? matrix[0].length : 0;\n\n // Single cell result (1×1) — no spill needed\n if (numRows <= 1 && numCols <= 1) {\n return matrix[0]?.[0];\n }\n\n // Multi-cell result — check for obstructions\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n if (i === 0 && j === 0) {\n continue;\n }\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n const address = p2a(targetPoint);\n if (targetId == null) {\n console.warn(`Spill target ${address} is out of bounds.`);\n continue;\n }\n const targetCell = this.registry.data[targetId];\n if (targetCell?.value != null && targetCell.value !== '') {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because it would overwrite data in ${address}.`,\n );\n }\n // If solvedCaches already has an entry for this cell, another formula\n // (including another spill) has already written here — treat as obstruction.\n if (this.registry.solvedCaches.has(targetId)) {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because ${address} is already occupied by another formula.`,\n );\n }\n }\n }\n\n // All clear — write values into solvedCaches\n const originId = this.getId(origin);\n const spilledAddresses: Address[] = [];\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n if (targetId == null) {\n continue;\n }\n this.finishSolvedCache(targetPoint, matrix[i][j]);\n if (i !== 0 || j !== 0) {\n spilledAddresses.push(p2a(targetPoint));\n // Mark target cell as spilled from the origin formula cell.\n // The spilled value is cached above regardless of whether the target\n // cell has a data entry yet (empty cells are populated lazily), so the\n // spilledFrom marker must be set unconditionally too — otherwise an\n // empty spill target shows its value but is not recognised as spilled\n // (formula bar shows its own address instead of the origin, stays editable).\n if (originId != null) {\n const sys = ensureSys(this.registry, targetId, {});\n sys.spilledFrom = p2a(origin);\n this.registry.lastSpilledTargetIds.add(targetId);\n }\n }\n }\n }\n\n return matrix[0][0];\n }\n\n /** @internal */\n public sheetPrefix(omit = false) {\n if (omit) {\n return '';\n }\n return toSheetPrefix(this.name);\n }\n /** @internal */\n public rangeToArea(range: string) {\n const cells = range.split(':');\n let [start, end] = cells;\n if (start.match(/[a-zA-Z]$/)) {\n start += '1';\n }\n if (start.match(/^[1-9]/)) {\n start = `A${start}`;\n }\n if (end?.match(/[a-zA-Z]$/)) {\n end += this.bottom;\n }\n if (end?.match(/^[1-9]/)) {\n end = `${x2c(this.right)}${end}`;\n }\n const { y: top, x: left } = a2p(start);\n const { y: bottom, x: right } = a2p(end || start);\n return {\n top: Math.abs(top),\n left: Math.abs(left),\n bottom: Math.abs(bottom),\n right: Math.abs(right),\n };\n }\n\n get __raw__(): Sheet {\n return this;\n }\n\n get shape() {\n return areaShape(this.area);\n }\n get hasSingleCell() {\n const shape = this.shape;\n return shape.rows === 1 && shape.cols === 1;\n }\n get currentVersion() {\n return this.version;\n }\n}\n","import { Pending, SOLVING, Spilling } from '../sentinels';\nimport { Sheet } from '../lib/sheet';\nimport type { Id, MatrixType, PointType, Resolution } from '../types';\nimport { Lexer, Parser } from './evaluator';\nimport { FormulaError } from './formula-error';\n\nexport type SolveOptions = {\n raise?: boolean;\n resolution?: Resolution;\n};\n\ntype SolveFormulaProps = {\n value: any;\n sheet: Sheet;\n point: PointType;\n raise?: boolean;\n resolution?: Resolution;\n at?: Id;\n};\n\n/**\n * Evaluates a single cell value (formula or literal) within the context of a sheet.\n * Handles caching, circular reference detection, spilling, and async pending states.\n * Returns the resolved scalar value (or error) for the given cell.\n */\nexport const solveFormula = ({ value, sheet, point, raise = true, resolution = 'RESOLVED', at }: SolveFormulaProps) => {\n const [hit, cache] = sheet.getSolvedCache(point);\n if (hit && value == null && !SOLVING.is(cache)) {\n // spilled value\n return cache;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n if (resolution === 'SYSTEM') {\n return value;\n }\n if (value.charAt(0) === \"'\") {\n return resolution === 'RAW' ? value : value.substring(1);\n }\n if (value.charAt(0) !== '=') {\n return value;\n }\n if (resolution === 'RAW') {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n return '=' + lexer.display({ sheet });\n }\n\n let solved: any = value;\n if (hit && !SOLVING.is(cache)) {\n solved = cache;\n } else {\n try {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n const parser = new Parser(lexer.tokens);\n const expr = parser.build();\n solved = expr?.evaluate?.({ sheet });\n } catch (e) {\n if (raise) {\n sheet.finishSolvedCache(point, e);\n throw e;\n }\n return e;\n }\n }\n\n if (Spilling.is(solved)) {\n solved = sheet.spill(point, solved.matrix);\n } else {\n sheet.finishSolvedCache(point, solved);\n }\n\n if (resolution === 'RESOLVED' && solved instanceof Sheet) {\n solved = stripSheet({ value: solved, raise, at });\n }\n if (Pending.is(solved)) {\n sheet.finishSolvedCache(point, solved);\n }\n return solved;\n};\n\nexport type SolveSheetProps = {\n sheet: Sheet;\n raise?: boolean;\n at?: Id;\n};\n\n/**\n * Evaluates all cells in a Sheet and returns the results as a 2D array (MatrixType).\n * Each cell formula is resolved in order, with caching to avoid redundant computation.\n * Use this when you need the full evaluated contents of a range.\n */\nexport const solveSheet = ({ sheet, raise = true, at }: SolveSheetProps): MatrixType => {\n const area = sheet.area;\n const matrix = sheet._toValueMatrix({ area, at, resolution: 'SYSTEM' });\n return matrix.map((row, i) => {\n const y = area.top + i;\n return row.map((value, j) => {\n const x = area.left + j;\n const point = { y, x };\n const [hit, cache] = sheet.getSolvedCache(point);\n try {\n if (SOLVING.is(cache)) {\n throw new FormulaError('#REF!', 'References are circulating.', new Error(value as string));\n } else if (Pending.is(cache)) {\n return cache;\n } else if (FormulaError.is(cache)) {\n throw cache;\n } else if (cache != null) {\n return cache;\n }\n sheet.setSolvingCache(point);\n const solved = solveFormula({ value, sheet, point, raise, at, resolution: 'RESOLVED' });\n sheet.finishSolvedCache(point, solved);\n return solved;\n } catch (e) {\n sheet.finishSolvedCache(point, e);\n if (raise) {\n throw e;\n }\n return e;\n }\n });\n });\n};\n\nexport type StripSheetProps = {\n value: any;\n at?: Id;\n raise?: boolean;\n};\n\nexport const stripSheet = ({ value, at, raise = true }: StripSheetProps): any => {\n if (value instanceof Sheet) {\n return value.strip({ raise, at });\n }\n return value;\n};\n","import { Pending, Sentinel, Spilling } from '../../sentinels';\nimport { FormulaError } from '../formula-error';\nimport { ensureSys, setAsyncCache } from '../../lib/cell';\nimport type { Registry } from '../../lib/book';\nimport type { CellType, Id, PointType } from '../../types';\nimport type { Sheet } from '../../lib/sheet';\nimport { toValueMatrix } from '../../lib/sheet_utils';\n\n/**\n * Sentinel value to distinguish cache miss from user-returned undefined/null.\n * Since user functions can return undefined or null, we need a special marker\n * to indicate \"no cache entry found\" vs \"cache entry is undefined\".\n */\nexport const asyncCacheMiss = new Sentinel('asyncCacheMiss');\n\n/** Returns true if any element of `args` is a Pending sentinel. */\nexport const hasPendingArg = (args: any[]): boolean => {\n return args.some((v) => Pending.is(v));\n};\n\nconst isSheet = (value: any): value is Sheet => {\n return value?.__gsType === 'Sheet';\n};\n\n/**\n * Recursively check whether any value in the structure is a Pending sentinel.\n * Handles flat values, nested arrays, and Sheet objects (via getFieldMatrix).\n */\nexport const hasDeepPending = (values: any[], at: Id): boolean => {\n for (const v of values) {\n if (Pending.is(v)) {\n return true;\n }\n if (Array.isArray(v)) {\n if (hasDeepPending(v, at)) {\n return true;\n }\n }\n if (Spilling.is(v)) {\n if (hasDeepPending(v.matrix, at)) {\n return true;\n }\n }\n if (isSheet(v)) {\n if (hasDeepPending(v._toValueMatrix({ at }), at)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * cyrb53 – a fast, high-quality 53-bit string hash.\n * Returns a non-negative integer that fits safely in a JS Number.\n */\nconst cyrb53 = (str: string, seed = 0): number => {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\n\n/**\n * Build a cache key from function name + hashed serialised arguments.\n *\n * Format: `funcName:length:hash1-hash2-...`\n * - length: byte length of the JSON-serialised args\n * - hash: cyrb53 hash of the JSON string, repeated hashPrecision times with different seeds\n *\n * When a Sheet appears as an argument its trimmed area is converted to a\n * value matrix (`any[][]`) via `getFieldMatrix()` so the key reflects the\n * actual cell values the function will operate on.\n */\nexport const buildAsyncCacheKey = (funcName: string, args: any[], hashPrecision: number = 1): string => {\n const argsJson = JSON.stringify(args, (_key, value) => {\n if (isSheet(value)) {\n return toValueMatrix(value);\n }\n if (Pending.is(value)) {\n return null;\n }\n return value;\n });\n const hashes = Array.from({ length: hashPrecision }, (_, i) => cyrb53(argsJson, i).toString(36));\n return `${funcName}:${argsJson.length}:${hashes.join('-')}`;\n};\n\n/**\n * Try to retrieve a cached or pending async result for the given cache key.\n *\n * Returns:\n * - Cached value if present, valid, and not expired\n * - Pending if there is an in-flight promise for this cell\n * - asyncCacheMiss if no cache/pending exists (distinguishes from user-returned undefined/null)\n */\nexport const getAsyncCache = (\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n useInflight: boolean = false,\n): any => {\n const registry = sheet.registry;\n const cell: CellType | undefined = registry.data[id];\n\n if (cell == null) {\n return asyncCacheMiss;\n }\n\n const sys = ensureSys(registry, id, { tmpAsyncCaches: {} });\n\n // Check for a cached result from a previous async run\n if (cell.asyncCaches != null) {\n const ac = cell.asyncCaches[key];\n if (ac != null) {\n // Check expiry\n if (ac.expireTime == null || Date.now() < ac.expireTime) {\n sys.tmpAsyncCaches![key] = ac;\n return ac.value;\n }\n // Expired — will not be copied to tmpAsyncCaches\n }\n }\n\n const compositeKey = `${id}:${key}`;\n\n // Check if there is already a pending promise for this cell+key\n if (registry.asyncPending.has(compositeKey)) {\n return registry.asyncPending.get(compositeKey)!;\n }\n\n // If useInflight is enabled, check for an in-flight promise with the same cache key\n if (useInflight && registry.asyncInflight?.has(key)) {\n const inflight = registry.asyncInflight.get(key)!;\n // Track for this cell+key to prevent duplicate `.then` attachment and correctly yield the pending sentinel\n registry.asyncPending.set(compositeKey, inflight.pending);\n\n // Chain to the shared promise to populate this cell's cache when it resolves\n inflight.pending.promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime: inflight.expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime: inflight.expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n });\n\n return inflight.pending;\n }\n\n return asyncCacheMiss;\n};\n\n/**\n * Handle an async (Promise) result returned by BaseFunction.main().\n *\n * Cache is stored per-cell in cell.asyncCache.\n * In-flight tracking uses Binding.asyncPending (keyed by cell ID).\n * If useInflight is true, also tracks by cache key in Binding.asyncInflight.\n *\n * Flow:\n * 1. If cell has asyncCache and the key matches (inputs unchanged) and not expired → return cached value\n * 2. If there is already an in-flight promise for this cell → return its Pending\n * 3. If useInflight is true and there is an in-flight promise for this key → return its Pending\n * 4. Otherwise start the async work, return a new Pending, and on completion\n * write the result into cell.asyncCache and trigger a re-render.\n *\n * @param ttlMilliseconds - Cache time-to-live in **milliseconds**. undefined = never expires.\n * @param useInflight - If true, reuse the same promise for matching cache keys across different cells.\n */\nexport const awaitAndSave = (\n promise: Promise<any>,\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n ttlMilliseconds?: number,\n useInflight: boolean = false,\n): Pending => {\n const registry = sheet.registry;\n\n // Compute expireTime from ttl (ms)\n const expireTime = ttlMilliseconds != null ? Date.now() + ttlMilliseconds : undefined;\n\n const compositeKey = `${id}:${key}`;\n\n // Start the async computation\n const pending = new Pending(promise);\n registry.asyncPending.set(compositeKey, pending);\n\n // If useInflight is enabled, also track by cache key\n if (useInflight) {\n if (!registry.asyncInflight) {\n registry.asyncInflight = new Map();\n }\n registry.asyncInflight.set(key, { pending, expireTime });\n }\n\n promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n // If useInflight was enabled, also remove from asyncInflight\n if (useInflight) {\n if (registry.asyncInflight) {\n registry.asyncInflight.delete(key);\n }\n }\n // Clear solvedCaches so dependent formulas re-evaluate\n registry.solvedCaches.clear();\n // Trigger re-render of all sheets\n registry.transmit();\n });\n\n return pending;\n};\n\n/**\n * Create a Pending sentinel that resolves immediately.\n * Used when an argument is already pending — the result is propagated.\n */\nexport const createPropagatedPending = (): Pending => {\n return new Pending(Promise.resolve());\n};\n","import { stripSheet } from '../solver';\nimport { Sheet } from '../../lib/sheet';\nimport { FormulaError } from '../formula-error';\nimport dayjs from 'dayjs';\nimport { FULLDATE_FORMAT_UTC } from '../../constants';\nimport { Pending, Spilling } from '../../sentinels';\nimport type { Id, PointType } from '../../types';\nimport { Time } from '../../lib/time';\n\nexport const gt = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) > ensureString(right);\n }\n try {\n return ensureNumber(left) > ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const gte = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) >= ensureString(right);\n }\n try {\n return ensureNumber(left) >= ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const lt = (left: any, right: any): boolean => {\n return !gte(left, right);\n};\n\nexport const lte = (left: any, right: any): boolean => {\n return !gt(left, right);\n};\n\nexport const eq = (left: any, right: any): boolean => {\n return ensureString(left).toLowerCase() === ensureString(right).toLowerCase();\n};\n\nexport const ne = (left: any, right: any): boolean => {\n return !eq(left, right);\n};\n\nexport type EnsureNumberOptions = {\n alternative?: number;\n ignore?: boolean;\n};\n\nexport type EnsureBooleanOptions = {\n alternative?: boolean;\n ignore?: boolean;\n};\n\nexport const isPercentage = (value: any): value is string => {\n if (typeof value !== 'string' || !value.endsWith('%')) {\n return false;\n }\n return !isNaN(parseFloat(value.slice(0, -1)));\n};\n\nexport const isNumeric = (value: any): boolean => {\n if (typeof value === 'number') {\n return true;\n }\n if (isPercentage(value)) {\n return true;\n }\n if (typeof value === 'string') {\n return !isNaN(parseFloat(value)) && isFinite(Number(value));\n }\n return false;\n};\n\nexport const ensureNumber = (value: any, options?: EnsureNumberOptions): number => {\n const { alternative, ignore } = options || {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (!value) {\n // falsy is 0\n return 0;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureNumber(v, { alternative });\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n if (Time.is(value)) {\n return value.days;\n }\n\n if (isPercentage(value)) {\n return parseFloat(value.slice(0, -1)) / 100;\n }\n\n const num = parseFloat(value as string);\n if (isNaN(num)) {\n if (ignore) {\n return alternative ?? 0;\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a number`);\n }\n return num;\n};\n\nexport const ensureString = (value: any): string => {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value === 0) {\n return '0';\n }\n if (!value) {\n return '';\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureString(v);\n }\n switch (value.constructor.name) {\n case 'Date': {\n const d: Date = value;\n return dayjs(d).format(FULLDATE_FORMAT_UTC);\n }\n default:\n return String(value);\n }\n};\n\nexport const ensureBoolean = (value: any, options?: EnsureBooleanOptions): boolean => {\n const { alternative, ignore } = options ?? {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (value === null) {\n return false;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureBoolean(v, options);\n }\n if (typeof value === 'string' || value instanceof String) {\n const bool = { true: true, false: false }[value.toLowerCase()];\n if (bool == null) {\n if (ignore) {\n return false;\n }\n throw new FormulaError('#VALUE!', `text '${value as string}' cannot be converted to a boolean`);\n }\n return bool;\n }\n return Boolean(value);\n};\n\n/**\n * Converts a value to a Date object.\n * Accepts: Date, number (ms since epoch), string (parseable date string).\n */\nexport function ensureDate(value: any): Date {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value instanceof Date) {\n return value;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureDate(v);\n }\n if (typeof value === 'number') {\n return new Date(value);\n }\n if (typeof value === 'string') {\n const d = new Date(value);\n if (!isNaN(d.getTime())) {\n return d;\n }\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a date`);\n}\n\nconst CONDITION_REGEX = /^(<=|>=|<>|>|<|=)?(.*)$/;\n\nexport const check = (value: any, condition: string): boolean => {\n const m = condition.match(CONDITION_REGEX);\n\n const [, expr = '', target = ''] = m || [];\n let comparison: any = target;\n if (expr === '>' || expr === '<' || expr === '>=' || expr === '<=') {\n if (typeof value === 'number') {\n comparison = parseFloat(target);\n }\n switch (expr) {\n case '>':\n return gt(value, comparison);\n case '>=':\n return gte(value, comparison);\n case '<':\n return lt(value, comparison);\n case '<=':\n return lte(value, comparison);\n }\n }\n\n const equals = expr === '' || expr === '=';\n if (target === '') {\n // empty target means \"\" or \"<>\"\n return (value == null || value === '') === equals;\n }\n\n if (typeof value === 'string' || value instanceof String) {\n const replaced = target\n .replace(/~\\*/g, '(\\\\*)')\n .replace(/~\\?/g, '(\\\\?)')\n .replace(/\\*/g, '(.*)')\n .replace(/\\?/g, '(.)');\n const regex = RegExp(`^${replaced}$`, 'i');\n return regex.test(value as string) === equals;\n }\n return eq(value, comparison) === equals;\n};\n\nexport const eachMatrix = (value: any, callback: (v: any, relativePoint: PointType) => void, at: Id) => {\n if (value instanceof Sheet) {\n const matrix = value.solve({ at });\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let y = 0; y < value.length; y++) {\n for (let x = 0; x < value[y].length; x++) {\n callback(value[y][x], { y, x });\n }\n }\n } else {\n callback(value, { y: 0, x: 0 });\n }\n};\n\nexport const createBooleanMask = (sheets: Sheet[], conditions: string[], at: Id): boolean[][] => {\n if (sheets.length === 0) {\n return [];\n }\n const refRange = sheets[0];\n const numRows = refRange.numRows;\n const numCols = refRange.numCols;\n\n const mask: boolean[][] = Array.from({ length: numRows }, () => Array(numCols).fill(true));\n\n for (let p = 0; p < sheets.length; p++) {\n const condRange = sheets[p];\n const condition = conditions[p];\n eachMatrix(\n condRange,\n (v: any, pt: PointType) => {\n mask[pt.y][pt.x] &&= check(v, condition);\n },\n at,\n );\n }\n return mask;\n};\n","import { type Sheet } from '../../lib/sheet';\n\n/** Duck-type check for Sheet instances (avoids runtime import cycle). */\nexport const isSheet = (v: any): v is Sheet => v?.__gsType === 'Sheet';\n/** Duck-type check for Time instances (avoids runtime import cycle). */\nconst isTime = (v: any): boolean => v != null && v.__gsType === 'Time';\nimport { Spilling } from '../../sentinels';\nimport type { Id } from '../../types';\nimport { FormulaError } from '../formula-error';\nimport { stripSheet } from '../../formula/solver';\nimport type { Expression } from '../evaluator';\nimport {\n hasPendingArg,\n hasDeepPending,\n buildAsyncCacheKey,\n awaitAndSave,\n createPropagatedPending,\n getAsyncCache,\n asyncCacheMiss,\n} from './__async';\nimport { Time } from '../../lib/time';\nimport { isNumeric, isPercentage } from './__utils';\n\nexport type FunctionCategory =\n | 'math'\n | 'statistics'\n | 'text'\n | 'time'\n | 'lookup'\n | 'information'\n | 'finance'\n | 'engineering'\n | 'logical'\n | 'other'\n // Open the union: the literals above are built-in autocomplete hints, but plugins may define\n // their own category (e.g. 'ai' in the CSV viewer). `string & {}` keeps literal suggestions\n // while allowing any string — category is a display-only label (badge text + CSS class), never\n // branched on — so no core code needs to know a plugin's categories.\n | (string & {});\n\nexport type FunctionProps = {\n args: Expression[];\n sheet: Sheet;\n at?: Id;\n};\n\nexport type FunctionArgumentType = 'number' | 'string' | 'boolean' | 'date' | 'time' | 'matrix' | 'reference' | 'any';\n\nexport type FunctionArgumentDefinition = {\n name: string;\n description: string;\n // if true, this argument can be omitted (i.e. fewer args than defs.length is allowed)\n optional?: boolean;\n // If true, blank will be treated as 0 for numbers, \"\" for strings, etc. Default: true\n nullable?: boolean;\n variadic?: boolean;\n\n errorTolerant?: boolean;\n acceptedTypes?: FunctionArgumentType[];\n /** When true, this argument takes a range/matrix value — broadcasting is suppressed for it. */\n takesMatrix?: boolean;\n};\n\nexport const conditionArg: FunctionArgumentDefinition = {\n name: 'condition',\n description:\n 'The condition to evaluate. Use \"=\" for equal, \"<\" for less than, \">\" for greater than, \"<=\" for less than or equal, \">=\" for greater than or equal, \"<>\" for not equal.',\n acceptedTypes: ['any'],\n};\n\n/**\n * Check whether a value matches one of the allowed type names\n * from a FunctionArgumentDefinition.acceptedTypes array.\n */\nconst matchesType = (\n value: any,\n { nullable = true, errorTolerant = false, acceptedTypes }: FunctionArgumentDefinition,\n): boolean => {\n if (!acceptedTypes || acceptedTypes.length === 0) {\n return true;\n }\n if (value == null) {\n return nullable;\n }\n if (FormulaError.is(value) || value instanceof Error) {\n if (errorTolerant) {\n return true;\n }\n throw value;\n }\n for (const t of acceptedTypes) {\n switch (t) {\n case 'any':\n return true;\n case 'number':\n if (isNumeric(value)) {\n return true;\n }\n break;\n case 'string':\n if (typeof value === 'string') {\n return true;\n }\n break;\n case 'boolean':\n if (typeof value === 'boolean') {\n return true;\n }\n break;\n case 'date':\n if (value instanceof Date) {\n return true;\n }\n break;\n case 'time':\n if (Time.is(value)) {\n return true;\n }\n break;\n case 'matrix':\n if (isMatrix(value)) {\n return true;\n }\n break;\n case 'reference':\n if (isSheet(value)) {\n return true;\n }\n break;\n }\n }\n return false;\n};\n\n/**\n * Check if a value is a \"matrix\" (Sheet, Spilling, or 2D array).\n */\nexport const isMatrix = (value: any): boolean => {\n return isSheet(value) || Spilling.is(value) || (Array.isArray(value) && Array.isArray(value[0]));\n};\n\n/**\n * Extract the scalar from a 1×1 matrix (Sheet, Spilling, or plain 2D array).\n * Returns the value unchanged if it is not a matrix.\n */\nexport const stripMatrix = (value: any, at: Id): any => {\n if (!isMatrix(value)) {\n return value;\n }\n if (isSheet(value)) {\n return stripSheet({ value, raise: false, at });\n }\n const m: any[][] = Spilling.is(value) ? value.matrix : value;\n let val = m?.[0]?.[0];\n return val;\n};\n\n/**\n * Check if a value is a matrix that is larger than 1×1.\n */\nexport const isMultiCell = (value: any): boolean => {\n if (isSheet(value)) {\n return !value.hasSingleCell;\n }\n if (Spilling.is(value)) {\n const m = value.matrix;\n return m.length > 1 || (m.length === 1 && m[0].length > 1);\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value.length > 1 || value[0].length > 1;\n }\n return false;\n};\n\n/**\n * Resolve which FunctionArgumentDefinition index each args position maps to,\n * accounting for variadic args at the tail.\n *\n * Example: args = [A, B(variadic), C(variadic)], args has 7 elements\n * positions 0 → A, 1 → B, 2 → C, 3 → B, 4 → C, 5 → B, 6 → C\n */\nconst resolveParamIndex = (defs: FunctionArgumentDefinition[], argCount: number): number[] => {\n const indices: number[] = [];\n\n // Find the first variadic arg position\n let iterStart = -1;\n let iterCount = 0;\n for (let i = 0; i < defs.length; i++) {\n if (defs[i].variadic) {\n if (iterStart < 0) {\n iterStart = i;\n }\n iterCount++;\n }\n }\n\n for (let i = 0; i < argCount; i++) {\n if (iterStart >= 0 && i >= iterStart) {\n // Map extra args round-robin across variadic args\n const j = (i - iterStart) % iterCount;\n indices.push(iterStart + j);\n } else if (i < defs.length) {\n indices.push(i);\n } else {\n // Beyond defs and no variadic — fall back to last def\n indices.push(defs.length - 1);\n }\n }\n return indices;\n};\n\nexport class BaseFunction {\n public defs: FunctionArgumentDefinition[] = [];\n public example: string | undefined;\n public description = '';\n public category: FunctionCategory = 'other';\n /** Indicates if this function is async. Override in subclass or use BaseFunctionAsync. */\n protected isAsync: boolean = false;\n /** Cache TTL in milliseconds. Override in subclass to set expiry. undefined = never expires. */\n protected ttlMilliseconds?: number;\n /** Hash precision for cache key generation. Higher values reduce collision risk. Default: 1 */\n protected hashPrecision: number = 1;\n /** If true, reuse the same in-flight promise for matching cache keys across different cells. */\n protected useInflight: boolean = true;\n /** If true, broadcasting is unconditionally disabled for this function. */\n protected broadcastDisabled: boolean = false;\n protected args: any[];\n protected autoSpilling: boolean = false;\n public sheet: Sheet;\n public at: Id;\n static __name = '';\n /**\n * Static async marker, readable from the class without instantiating it\n * (e.g. `registry.functions[name].isAsync`). Lets the formula indexer decide\n * whether a cell needs eager resolution. Kept in sync with the instance\n * `isAsync`; `BaseFunctionAsync` flips both to true.\n */\n static isAsync = false;\n\n constructor({ args, sheet, at }: FunctionProps) {\n this.args = args.map((a) => {\n try {\n return a.evaluate({ sheet });\n } catch (e) {\n return e;\n }\n });\n this.sheet = sheet;\n this.at = at ?? '?';\n }\n\n private _main(...args: any[]): any {\n if (this.autoSpilling) {\n // @ts-expect-error main is not defined in BaseFunction\n const result = this.main(...args);\n // Async main() returns a Promise: wrap the RESOLVED matrix, not the Promise itself\n // (a Spilling holding a Promise never spills). The resolved Spilling then flows through\n // the async cache and the solver spills it — same as a sync autoSpilling function.\n if (this.isAsync) {\n return Promise.resolve(result).then((matrix) => new Spilling(matrix));\n }\n return new Spilling(result);\n }\n // @ts-expect-error main is not defined in BaseFunction\n return this.main(...args);\n }\n\n /**\n * Validate and normalise arguments before `main()` is called.\n *\n * Checks:\n * 1. Argument count satisfies defs (respecting optional / variadic).\n * 2. Each argument's runtime type matches the corresponding def's `type` list.\n *\n * Subclasses may override for additional coercion / spreading.\n */\n protected validate(args: any[]): any[] {\n const validatedArgs = [...args];\n\n const defs = this.defs;\n if (defs.length === 0) {\n if (args.length !== 0) {\n throw new FormulaError('#N/A', 'Too many arguments: expected 0, got ' + args.length + '.');\n }\n return validatedArgs;\n }\n\n // --- argument count check ---\n // minArgs: count of defs that are neither optional nor variadic,\n // plus non-optional variadic defs (need at least one instance each).\n let minArgs = 0;\n let hasIterable = false;\n let variadicCount = 0;\n for (const d of defs) {\n if (d.variadic) {\n hasIterable = true;\n variadicCount++;\n if (!d.optional) {\n minArgs++;\n }\n } else if (!d.optional) {\n minArgs++;\n }\n }\n\n if (args.length < minArgs) {\n throw new FormulaError('#N/A', `Too few arguments: expected at least ${minArgs}, got ${args.length}.`);\n }\n\n // maxArgs: if no variadic defs, max = defs.length\n if (!hasIterable && args.length > defs.length) {\n throw new FormulaError('#N/A', `Too many arguments: expected at most ${defs.length}, got ${args.length}.`);\n }\n\n // --- per-argument type check ---\n const indices = resolveParamIndex(defs, args.length);\n for (let i = 0; i < args.length; i++) {\n const def = defs[indices[i]];\n if (!def) {\n continue;\n }\n let value = args[i];\n if (!def.acceptedTypes || def.acceptedTypes.length === 0) {\n continue;\n }\n\n if (isMultiCell(value)) {\n if (!def.takesMatrix) {\n continue;\n }\n } else if (isMatrix(value)) {\n // For 1x1 Sheet, Spilling, or plain 2D array, extract the single value for validation.\n // UNLESS the definition explicitly takes a matrix (e.g. SUM(A1) — let it pass through).\n if (!def.takesMatrix) {\n value = stripMatrix(value, this.at);\n }\n }\n if (isPercentage(value)) {\n value = parseFloat(value.slice(0, -1)) / 100;\n }\n if (!matchesType(value, def)) {\n throw new FormulaError(\n '#VALUE!',\n `Argument \"${def.name}\" (position ${i + 1}) expected ${def.acceptedTypes.join(' | ')}, got ${typeof value}.`,\n );\n }\n validatedArgs[i] = value;\n }\n return validatedArgs;\n }\n\n eachMatrix = (value: any, callback: (v: any) => void) => {\n if (isSheet(value)) {\n const matrix = value.solve({ at: this.at, raise: true });\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let r = 0; r < value.length; r++) {\n for (let c = 0; c < value[r].length; c++) {\n callback(value[r][c]);\n }\n }\n } else {\n callback(value);\n }\n };\n\n /**\n * Extract a 2D array from a matrix value (Spilling, Sheet, or nested array).\n * Default behavior for Sheet is value.solve(). Functions like COL can override\n * this to preserve Sheet metadata per cell.\n */\n protected toMatrix(value: any): any[][] {\n if (Spilling.is(value)) {\n return value.matrix;\n }\n if (isSheet(value)) {\n return value.solve({ at: this.at });\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value;\n }\n return [[value]];\n }\n\n /**\n * Collapse a 1×1 matrix value (Sheet, Spilling, or 2D array) to a scalar.\n * Non-matrix values pass through unchanged.\n *\n * Override in sub-classes that need the original Sheet / reference\n * metadata (e.g. COL, ROW) — for instance, to extract position\n * information before collapsing.\n */\n protected toScalar(value: any): any {\n if (isSheet(value)) {\n const { rows, cols } = value.shape;\n if (rows === 1 && cols === 1) {\n return value.strip({});\n }\n return value;\n }\n if (Spilling.is(value)) {\n return value.matrix?.[0]?.[0];\n }\n if (Array.isArray(value)) {\n if (Array.isArray(value[0])) {\n return value[0]?.[0];\n }\n return value[0];\n }\n return value;\n }\n\n public call() {\n // Broadcast BEFORE validate, because validate may strip Tables to scalars.\n // broadcast only activates when there are 2+ args and at least one\n // broadcastable arg is a multi-cell matrix.\n const broadcastResult = this.broadcast();\n if (broadcastResult !== undefined) {\n return broadcastResult;\n }\n\n // If any argument is still pending, propagate before validate runs\n // (Pending values would fail type checks in validate).\n if (hasDeepPending(this.args, this.at)) {\n return createPropagatedPending();\n }\n\n this.args = this.validate(this.args);\n\n // For async functions, build cache key and check cache before execution\n if (this.isAsync) {\n const key = buildAsyncCacheKey(this.constructor.name, this.args, this.hashPrecision);\n const cached = getAsyncCache(this.sheet, this.at, key, this.useInflight);\n if (cached !== asyncCacheMiss) {\n return cached;\n }\n\n const promise = this._main(...this.args);\n return awaitAndSave(promise, this.sheet, this.at, key, this.ttlMilliseconds, this.useInflight);\n }\n\n // For sync functions, just call and return\n return this._main(...this.args);\n }\n\n /**\n * If any broadcastable argument is a matrix (multi-cell), expand the call\n * across all element positions and return a Spilling.\n * Returns `undefined` when no broadcast is necessary.\n *\n * Rules:\n * - broadcastDisabled = true → never broadcast\n * - An arg is broadcastable when its corresponding args[].takesMatrix is not true\n * - A Sheet/Spilling/2D-array whose size is (1,1) is treated as a scalar\n * (not broadcast); only multi-cell matrices trigger broadcast\n * - For variadic args, extra args are assigned round-robin\n * across the variadic helpArg positions\n */\n private broadcast(): any[][] | undefined {\n if (this.broadcastDisabled) {\n return undefined;\n }\n\n // Map each args index to its corresponding args index\n const helpIndices = resolveParamIndex(this.defs, this.args.length);\n\n // Determine which arg positions are broadcastable (takesMatrix: true suppresses broadcasting).\n const broadcastable: boolean[] = this.args.map((_, i) => {\n const hIdx = helpIndices[i];\n return !this.defs[hIdx]?.takesMatrix;\n });\n\n // Collect matrices only for broadcastable positions whose value is a multi-cell matrix\n const matrices: (any[][] | null)[] = this.args.map((arg, i) => {\n if (broadcastable[i] && isMultiCell(arg)) {\n return this.toMatrix(arg);\n }\n return null;\n });\n\n // If no broadcastable arg is actually a multi-cell matrix, nothing to do\n if (matrices.every((m) => m === null)) {\n return undefined;\n }\n\n // Collapse 1×1 matrix args (non-broadcast) to scalars for the cell-level calls\n const scalarArgs = this.args.map((arg, i) => {\n if (matrices[i] !== null) {\n return arg;\n } // will be expanded per-cell\n return this.toScalar(arg);\n });\n\n // Compute the max rows / cols across all matrix arguments\n let maxRows = 1;\n let maxCols = 1;\n for (const m of matrices) {\n if (m) {\n maxRows = Math.max(maxRows, m.length);\n maxCols = Math.max(\n maxCols,\n m.reduce((acc, row) => Math.max(acc, row.length), 0),\n );\n }\n }\n\n // Save original args so we can restore after each cell iteration\n const originalBareArgs = this.args;\n\n // Iterate over every (row, col) position\n const result: any[][] = [];\n for (let r = 0; r < maxRows; r++) {\n const row: any[] = [];\n for (let c = 0; c < maxCols; c++) {\n // Build the argument list for this cell position\n const cellArgs = scalarArgs.map((arg, i) => {\n const m = matrices[i];\n if (m) {\n // If the position exists in the matrix, use it; otherwise null\n return m?.[r]?.[c] ?? null;\n }\n return arg;\n });\n try {\n if (hasPendingArg(cellArgs)) {\n row.push(createPropagatedPending());\n } else {\n // Validate cell-level args\n const validatedArgs = this.validate(cellArgs);\n if (hasDeepPending(validatedArgs, this.at)) {\n row.push(createPropagatedPending());\n } else {\n row.push(this._main(...validatedArgs));\n }\n }\n } catch (e) {\n row.push(e);\n }\n }\n result.push(row);\n }\n\n // Restore original args\n this.args = originalBareArgs;\n\n return result;\n }\n}\n\n/**\n * Base class for async functions.\n * Extend this class to create async functions that support caching.\n */\nexport class BaseFunctionAsync extends BaseFunction {\n protected isAsync: boolean = true;\n static isAsync = true;\n}\n\nexport type FunctionMapping = { [functionName: string]: typeof BaseFunction };\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { BaseFunction, type FunctionCategory, type FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { Time } from '../../lib/time';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the sum of two numbers.\nThis is the same as the '+' operator.`;\n\nexport class AddFunction extends BaseFunction {\n example = 'ADD(2, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First additive.', acceptedTypes: ['number', 'date', 'time'] },\n { name: 'value2', description: 'Second additive.', acceptedTypes: ['number', 'date', 'time'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 + v2;\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).add(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).add(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .add(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n if (typeof v1 === 'number' && v2 instanceof Date) {\n return dayjs(v2)\n .add(v1 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) + ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for augend or addend.');\n }\n }\n}\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { Time } from '../../lib/time';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the difference of two numbers.\nThis is the same as the '-' operator.`;\n\nexport class MinusFunction extends BaseFunction {\n example = 'MINUS(8, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number', 'date', 'time'] },\n {\n name: 'value2',\n description: 'A number that will subtract from value1.',\n acceptedTypes: ['number', 'date', 'time'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 - v2;\n }\n if (v1 instanceof Date && v2 instanceof Date) {\n return Time.fromDates(v1, v2);\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).sub(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).sub(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .subtract(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) - ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for minuend or subtrahend.');\n }\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the product of two numbers.\nThis is the same as the '*' operator.`;\n\nexport class MultiplyFunction extends BaseFunction {\n example = 'MULTIPLY(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'factor1', description: 'First factor.', acceptedTypes: ['number'] },\n { name: 'factor2', description: 'Second factor.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any, v2: any) {\n return ensureNumber(v1) * ensureNumber(v2);\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the result of dividing one number by another.\nThis is the same as the '/' operator.`;\n\nexport class DivideFunction extends BaseFunction {\n example = 'DIVIDE(4, 2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'dividend',\n description: 'A number that will be divided by divisor.',\n acceptedTypes: ['number'],\n },\n {\n name: 'divisor',\n description: 'A number that will divide a dividend. Must be non-zero.',\n acceptedTypes: ['number'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected validate(args: any[]): any[] {\n const validated = super.validate(args).map((arg) => ensureNumber(arg));\n if (validated[1] === 0) {\n throw new FormulaError('#DIV/0!', 'The second argument must be non-zero.');\n }\n return validated;\n }\n\n protected main(divided: number, divisor: number) {\n return divided / divisor;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the sum of a series of numbers or cells.`;\n\nexport class SumFunction extends BaseFunction {\n example = 'SUM(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to sum.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n sum += ensureNumber(v, { ignore: true });\n },\n this.at,\n );\n });\n return sum;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the concatenation of two values.\nThis is the same as the '&' operator.`;\n\nexport class ConcatFunction extends BaseFunction {\n example = 'CONCAT(\"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value1',\n description: 'A value to be concatenated with value2.',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n {\n name: 'value2',\n description: 'A value to be concatenated with value1',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(v1: any, v2: any) {\n return ensureString(v1) + ensureString(v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eq } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are equal, FALSE if they are not.\nThis is the same as the '=' operator.`;\n\nexport class EqFunction extends BaseFunction {\n example = 'EQ(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return eq(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ne } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are not equal, FALSE if they are.\nThis is the same as the '<>' operator.`;\n\nexport class NeFunction extends BaseFunction {\n example = 'NE(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: number, v2: number) {\n return ne(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truly greater than the second, FALSE otherwise.\nThis is the same as the '>' operator.`;\n\nexport class GtFunction extends BaseFunction {\n example = 'GT(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is greater than the second, FALSE otherwise.\nThis is the same as the '>=' operator.`;\n\nexport class GteFunction extends BaseFunction {\n example = 'GTE(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truely less than the second argument, FALSE otherwise.\nThis is the same as the '<' operator.`;\n\nexport class LtFunction extends BaseFunction {\n example = 'LT(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is less than the second argument, FALSE otherwise.\nThis is the same as the '<=' operator.`;\n\nexport class LteFunction extends BaseFunction {\n example = 'LTE(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Returns a serial value corresponding to the current date and time.`;\n\nexport class NowFunction extends BaseFunction {\n example = 'NOW()';\n description = description;\n defs: FunctionArgumentDefinition[] = [];\n category: FunctionCategory = 'time';\n\n protected main() {\n return new Date();\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if all arguments are logically TRUE.\nReturns FALSE if any argument is logically FALSE.`;\n\nexport class AndFunction extends BaseFunction {\n example = 'AND(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a && b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if any argument is logically true.\nReturns FALSE if all arguments are logically false.`;\n\nexport class OrFunction extends BaseFunction {\n example = 'OR(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a || b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `If the logical expression is TRUE, the second argument is returned.\nIf FALSE, the third argument is returned.`;\n\nexport class IfFunction extends BaseFunction {\n example = 'IF(A2 = \"Human\", \"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'condition', description: 'An expression as a condition', acceptedTypes: ['any'] },\n {\n name: 'value1',\n description: 'value to be returned if the condition is true.',\n acceptedTypes: ['any'],\n },\n {\n name: 'value2',\n description: 'value to be returned if the condition is false.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(condition: any, v1: any, v2: any = false) {\n return ensureBoolean(condition) ? v1 : v2;\n }\n}\n","// DO NOT COPY THIS CODE FOR THE OTHER.\nimport { FormulaError } from '../formula-error';\nimport {\n FunctionArgumentDefinition,\n BaseFunction,\n FunctionCategory,\n isMatrix,\n isMultiCell,\n stripMatrix,\n} from './__base';\n\nconst description = `Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.`;\n\nexport class IfErrorFunction extends BaseFunction {\n example = 'IFERROR(A1, \"Error in cell A1\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The value to return if value itself is not an error.',\n acceptedTypes: ['any'],\n errorTolerant: true,\n },\n {\n name: 'value_if_error',\n description: 'The value the function returns if value is an error.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any, valueIfError?: any) {\n if (FormulaError.is(value) || value instanceof Error) {\n return valueIfError;\n }\n return value;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns the inverse of the Boolean; if TRUE, NOT returns FALSE.\nIf FALSE, NOT returns TRUE.`;\n\nexport class NotFunction extends BaseFunction {\n example = 'NOT(TRUE)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'logical expression',\n description: 'A logical expression as a boolean.',\n acceptedTypes: ['boolean', 'number'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any) {\n return !ensureBoolean(v1);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the count of a series of numbers or cells.`;\n\nexport class CountFunction extends BaseFunction {\n example = 'COUNT(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n count++;\n }\n },\n this.at,\n );\n } else {\n ensureNumber(val);\n count++;\n }\n });\n return count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the absolute value of a number`;\n\nexport class AbsFunction extends BaseFunction {\n example = 'ABS(-2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [{ name: 'value', description: 'target number', acceptedTypes: ['number'] }];\n category: FunctionCategory = 'math';\n\n protected main(value: any) {\n return Math.abs(ensureNumber(value));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number multiplied by an exponent.`;\n\nexport class PowerFunction extends BaseFunction {\n example = 'POWER(4,0.5)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'base', description: 'A number to be multiplied by an exponent.', acceptedTypes: ['number'] },\n { name: 'exponent', description: 'An exponent to power the base.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(base: any, exponent: any) {\n return Math.pow(ensureNumber(base), ensureNumber(exponent));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eachMatrix } from './__utils';\n\nconst description = `Returns the number of values in the data set.`;\n\nexport class CountaFunction extends BaseFunction {\n example = 'COUNTA(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Values or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n if (v != null && v !== '') {\n count++;\n }\n },\n this.at,\n );\n });\n return count;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the average of a series of numbers or cells.`;\n\nexport class AverageFunction extends BaseFunction {\n example = 'AVERAGE(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to average.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let sum = 0;\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n sum += ensureNumber(v);\n count++;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n sum += num;\n count++;\n }\n });\n\n if (count === 0) {\n throw new FormulaError('#DIV/0!', 'Evaluation of function AVERAGE caused a divide by zero error.');\n }\n return sum / count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the max in a series of numbers or cells.`;\n\nexport class MaxFunction extends BaseFunction {\n example = 'MAX(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find max from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let max = -Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n const num = ensureNumber(v);\n if (num > max) {\n max = num;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num > max) {\n max = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? max : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the min in a series of numbers or cells.`;\n\nexport class MinFunction extends BaseFunction {\n example = 'MIN(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find min from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let min = Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n const num = ensureNumber(v);\n if (num < min) {\n min = num;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num < min) {\n min = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? min : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the length of a string.`;\n\nexport class LenFunction extends BaseFunction {\n example = 'LEN(A2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'text',\n description: 'A text to be returned the length.',\n acceptedTypes: ['string', 'number'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(text: any) {\n return ensureString(text).length;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number with positive and negative values reversed.`;\n\nexport class UminusFunction extends BaseFunction {\n example = 'UMINUS(4)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any) {\n return -ensureNumber(v1);\n }\n}\n","import { Sheet } from '../../lib/sheet';\nimport { Spilling } from '../../sentinels';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Enables the display of values returned from an array formula into multiple rows and/or columns.\nIf the argument is already a Spilling, it is returned as-is. If it is a Sheet (range reference), the field matrix is extracted and wrapped in a Spilling. Otherwise the value is wrapped as a single-element Spilling.`;\n\nexport class ArrayformulaFunction extends BaseFunction {\n autoSpilling = true;\n example = 'ARRAYFORMULA(A1:A10 * B1:B10)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The array expression or value to evaluate.',\n takesMatrix: true,\n acceptedTypes: ['matrix', 'any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any) {\n if (Spilling.is(value)) {\n return value;\n }\n if (value instanceof Sheet) {\n return value._toValueMatrix();\n }\n if (Array.isArray(value)) {\n return value;\n }\n return [[value]];\n }\n}\n","import { AddFunction } from './functions/add';\nimport { MinusFunction } from './functions/minus';\nimport { MultiplyFunction } from './functions/multiply';\nimport { DivideFunction } from './functions/divide';\nimport { SumFunction } from './functions/sum';\nimport { ConcatFunction } from './functions/concat';\nimport { EqFunction } from './functions/eq';\nimport { NeFunction } from './functions/ne';\nimport { GtFunction } from './functions/gt';\nimport { GteFunction } from './functions/gte';\nimport { LtFunction } from './functions/lt';\nimport { LteFunction } from './functions/lte';\nimport { NowFunction } from './functions/now';\nimport { AndFunction } from './functions/and';\nimport { OrFunction } from './functions/or';\nimport { IfFunction } from './functions/if';\nimport { IfErrorFunction } from './functions/iferror';\nimport { NotFunction } from './functions/not';\nimport { CountFunction } from './functions/count';\nimport { AbsFunction } from './functions/abs';\nimport { PowerFunction } from './functions/power';\nimport { CountaFunction } from './functions/counta';\nimport { AverageFunction } from './functions/average';\nimport { MaxFunction } from './functions/max';\nimport { MinFunction } from './functions/min';\nimport { LenFunction } from './functions/len';\nimport { UminusFunction } from './functions/uminus';\nimport { ArrayformulaFunction } from './functions/arrayformula';\nimport type { FunctionCategory, FunctionMapping, FunctionArgumentDefinition } from './functions/__base';\n\nexport const functions: FunctionMapping = {\n // Arithmetic & Comparison\n add: AddFunction,\n minus: MinusFunction,\n uminus: UminusFunction,\n multiply: MultiplyFunction,\n divide: DivideFunction,\n pow: PowerFunction,\n power: PowerFunction,\n concat: ConcatFunction,\n eq: EqFunction,\n ne: NeFunction,\n gt: GtFunction,\n gte: GteFunction,\n lt: LtFunction,\n lte: LteFunction,\n\n // Logical\n if: IfFunction,\n iferror: IfErrorFunction,\n and: AndFunction,\n or: OrFunction,\n not: NotFunction,\n arrayformula: ArrayformulaFunction,\n\n // Statistics & Aggregation\n sum: SumFunction,\n max: MaxFunction,\n min: MinFunction,\n average: AverageFunction,\n count: CountFunction,\n counta: CountaFunction,\n\n // Text\n len: LenFunction,\n\n // Math\n abs: AbsFunction,\n\n // Time\n now: NowFunction,\n};\n\nexport type FunctionHelp = {\n name: string;\n category: FunctionCategory;\n example: string;\n description: string;\n defs: FunctionArgumentDefinition[];\n};\n\nconst _functionHelpsCache = new Map<FunctionMapping, FunctionHelp[]>();\n\nexport const getFunctionHelps = (customFunctions: FunctionMapping = functions): FunctionHelp[] => {\n let helps = _functionHelpsCache.get(customFunctions);\n if (!helps) {\n helps = Object.keys(customFunctions).map((name) => {\n const FnClass = customFunctions[name];\n const instance = new FnClass({ args: [], sheet: {} as any });\n return {\n name: name.toUpperCase(),\n category: instance.category,\n example: instance.example ?? FnClass?.__name ?? 'Unknown',\n description: instance.description ?? '',\n defs: instance.defs || [],\n };\n });\n _functionHelpsCache.set(customFunctions, helps);\n }\n return helps;\n};\n","import { DEFAULT_HISTORY_LIMIT, RESET_ZONE } from '../constants';\nimport { Pending } from '../sentinels';\n\nimport type {\n HistoryType,\n RefPaletteType,\n SheetIdsByName,\n ContextsBySheetId,\n ZoneType,\n CellsByIdType,\n SystemsByIdType,\n System,\n Id,\n StoreDispatchType,\n FeedbackType,\n EditorEvent,\n CursorStateType,\n} from '../types';\nimport type { UserSheet, Sheet } from './sheet';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { functions as functionsDefault } from '../formula/mapping';\nimport { PolicyType } from '../policy/core';\n\nexport type RegistryProps = {\n historyLimit?: number;\n additionalFunctions?: FunctionMapping;\n policies?: { [policyName: string]: PolicyType | null };\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n};\n\nexport type BookProps = RegistryProps;\n\nexport class Registry {\n sheetHead: number = 0;\n cellHead: number = 0;\n data: CellsByIdType = {};\n systems: SystemsByIdType = {};\n sheetIdsByName: SheetIdsByName = {};\n contextsBySheetId: ContextsBySheetId = {};\n choosingSheetId: number = 0;\n choosingAddress: string = '';\n editingSheetId: number = 0;\n editingAddress: string = '';\n paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n lastFocused: HTMLTextAreaElement | null = null;\n solvedCaches: Map<Id, any> = new Map();\n /** IDs of non-origin cells that received spilled values (populated in spill(), cleared in clearSolvedCaches()). */\n lastSpilledTargetIds: Set<Id> = new Set();\n /**\n * Index of every cell whose formula contains at least one async function call,\n * maintained by `Sheet.processFormula`. These are the only cells eager\n * resolution must fire: sync formulas have no side effects and resolve on read,\n * so `Sheet.resolveAll()` visits just this set instead of scanning the whole\n * (possibly virtualized) matrix. Registry-wide; each entry's owning sheet is\n * recoverable via `systems[id].sheetId`. Pruned lazily in `resolveAll()` when a\n * cell is no longer an async formula.\n */\n asyncFormulaCells: Set<Id> = new Set();\n /** Currently in-flight async formula Pending sentinels (keyed by cell ID). */\n asyncPending: Map<string, Pending> = new Map();\n /** In-flight async formulas shared by cache key (for useInflight). */\n asyncInflight?: Map<string, { pending: Pending; expireTime?: number }>;\n copyingSheetId: number = 0;\n copyingZone: ZoneType = RESET_ZONE;\n cutting: boolean = false;\n histories: HistoryType[] = [];\n historyIndex: number = -1;\n historyLimit: number = DEFAULT_HISTORY_LIMIT;\n lastHistory?: HistoryType;\n currentHistory?: HistoryType;\n /** StrictMode guard: Map from action object (identity) to cached reducer result.\n * Using a Map instead of a single slot allows multiple batched dispatches to coexist. */\n _strictModeCache?: Map<unknown, unknown>;\n /** StrictMode guard: Map from useId component key to assigned sheetId.\n * Prevents double-increment of sheetHead when useState initializer runs twice in Strict Mode. */\n _componentSheetIds: Map<string, number> = new Map();\n ready = false;\n functions: FunctionMapping = {};\n policies: { [policyName: string]: PolicyType | null } = {};\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n\n transmit: (newBook?: TransmitProps) => void = (newBook?: TransmitProps) => {\n // This method will be overridden by useBook\n };\n\n /** Injected by react-core / preact-core to create a store action for sheet updates. */\n updateSheet: (sheet: Sheet) => { type: number; value: any } = (sheet) => ({ type: 0, value: sheet });\n\n public boot() {\n if (this.ready || Object.keys(this.contextsBySheetId).length === 0) {\n return;\n }\n const keys = Object.keys(this.contextsBySheetId);\n const tobe: StoreDispatchType[] = [];\n for (let i = 0; i < keys.length; i++) {\n const sheetId = keys[i];\n const storeDispatch = this.contextsBySheetId[sheetId];\n const sheet = storeDispatch.store.sheetReactive.current;\n if (!sheet || sheet.status === 0) {\n return;\n }\n tobe.push(storeDispatch);\n }\n for (let i = 0; i < tobe.length; i++) {\n const { store, dispatch } = tobe[i];\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n continue;\n }\n sheet.resolveFormulas();\n dispatch(this.updateSheet(sheet));\n }\n this.ready = true;\n }\n\n constructor({\n historyLimit,\n additionalFunctions,\n policies = {},\n onSave,\n onChange,\n onRemoveRows,\n onRemoveCols,\n onInsertRows,\n onInsertCols,\n onSelect,\n onKeyUp,\n onInit,\n }: RegistryProps = {}) {\n if (historyLimit != null) {\n this.historyLimit = historyLimit;\n }\n this.functions = {\n ...functionsDefault,\n ...additionalFunctions,\n };\n for (const fnName in this.functions) {\n const fn = this.functions[fnName];\n fn.__name = fnName;\n }\n this.policies = policies;\n this.onSave = onSave;\n this.onChange = onChange;\n this.onRemoveRows = onRemoveRows;\n this.onRemoveCols = onRemoveCols;\n this.onInsertRows = onInsertRows;\n this.onInsertCols = onInsertCols;\n this.onSelect = onSelect;\n this.onKeyUp = onKeyUp;\n this.onInit = onInit;\n }\n}\n\nexport type TransmitProps = Partial<Registry>;\n\nexport const createRegistry = (props: RegistryProps = {}) => {\n return new Registry(props);\n};\n\n/** @deprecated use createRegistry */\nexport const createBinding = createRegistry;\n\nexport type BookType = {\n registry: Registry;\n};\n\nexport const createBook = (props: RegistryProps = {}): BookType => {\n return { registry: createRegistry(props) };\n};\n","import type { PolicyMixinType, RenderProps } from './core';\n\nconst makeThousandSeparatorMixin = (sep: string): PolicyMixinType => ({\n renderNumber({ value }: RenderProps<number>): any {\n if (value == null || isNaN(value)) {\n return 'NaN';\n }\n const [int, fraction] = String(parseFloat(value.toPrecision(this.decimalPrecision))).split('.');\n const result = int.replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, `$1${sep}`);\n if (fraction == null) {\n return result;\n }\n return `${result}.${fraction}`;\n },\n});\n\nexport const ThousandSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(',');\nexport const ThousandSpaceSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(' ');\n","import type { PolicyMixinType, RenderProps } from './core';\n\nexport const PercentagePolicyMixin: PolicyMixinType = {\n renderNumber({ value }: RenderProps<number>): any {\n if (value == null || isNaN(value)) {\n return '0%';\n }\n return `${parseFloat((value * 100).toPrecision(this.decimalPrecision))}%`;\n },\n};\n","import type { PointType } from '../types';\nimport type { UserSheet } from './sheet';\n\nexport const getLabel = (sheet: UserSheet, label: string | undefined, point: PointType, n: number): string | null => {\n if (label != null) {\n return label;\n }\n const policy = sheet.getPolicy(point);\n return (point.x === 0 ? policy.renderRowHeaderLabel(n) : policy.renderColHeaderLabel(n)) ?? null;\n};\n","export const COLOR_PALETTE = [\n // orange\n '#FF6600',\n // purple\n '#AA44FF',\n // emeraldblue\n '#00CCCC',\n // peach\n '#EEAAEE',\n // yellow\n '#DDDD00',\n // winered\n '#AA4444',\n // lightgreen\n '#00FF00',\n // pink\n '#FF00FF',\n // navy\n '#3366FF',\n // cyan\n '#008888',\n];\n","import dayjs from 'dayjs';\nimport type { AreaType, CellsByAddressType, CellType, CSSPropertiesLike, PointType, RefLike, ZoneType } from '../types';\nimport { Sheet } from './sheet';\nimport { areaShape, areaToZone, complementSelectingArea, concatAreas, zoneToArea, createMatrix } from './spatial';\nimport { p2a } from './coords';\nimport { Time } from './time';\n\ntype AutofillStore = {\n sheetReactive: RefLike<Sheet>;\n choosing: PointType;\n selectingZone: ZoneType;\n};\n\nconst BORDER_AUTOFILL_DRAGGING = 'dashed 1px #888888';\n\ntype Direction = 'left' | 'right' | 'up' | 'down' | 'none';\ntype Orientation = 'horizontal' | 'vertical' | 'none';\nconst DirectionMapping: {\n [key: string]: [Orientation, number];\n} = {\n left: ['horizontal', -1],\n right: ['horizontal', 1],\n up: ['vertical', -1],\n down: ['vertical', 1],\n none: ['none', 0],\n};\n\nexport class Autofill {\n private readonly src: AreaType;\n private readonly dst: AreaType;\n private readonly direction: Direction;\n private readonly sheet: Sheet;\n constructor(store: AutofillStore, draggingTo: PointType) {\n const { sheetReactive: sheetRef, choosing, selectingZone } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n throw new Error('Sheet is not available');\n }\n this.src = complementSelectingArea(zoneToArea(selectingZone), choosing);\n this.direction = this.suggestDirection(draggingTo);\n this.dst = this.getDestinationArea(draggingTo);\n this.sheet = sheet;\n }\n\n /** Build the fill diff without applying it. Shared by the sync/async apply paths. */\n private buildDiff(): CellsByAddressType {\n const [orientation, sign] = DirectionMapping[this.direction];\n const { top: sTop, left: sLeft, bottom: sBottom, right: sRight } = this.src;\n const matrix = createMatrix(sBottom - sTop + 1, sRight - sLeft + 1) as (CellType | null)[][];\n for (let y = sTop; y <= sBottom; y++) {\n for (let x = sLeft; x <= sRight; x++) {\n matrix[y - sTop][x - sLeft] = this.sheet.getCell({ y, x }, { resolution: 'SYSTEM' }) ?? null;\n }\n }\n const srcShape = areaShape(this.src);\n const dstShape = areaShape(this.dst);\n\n const diff: CellsByAddressType = {};\n if (orientation === 'horizontal') {\n for (let i = 0; i < dstShape.rows; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(matrix[i], '');\n for (let j = 0; j < dstShape.cols; j++) {\n const baseCell = matrix[i % srcShape.rows]?.[j % srcShape.cols];\n const x = sign > 0 ? this.dst.left + j : this.dst.right - j;\n const px = sign > 0 ? j % srcShape.cols : (srcShape.cols - 1 - (j % srcShape.cols)) % srcShape.cols;\n const point = { y: this.dst.top + i, x };\n const id = this.sheet.getId(point);\n const value = patterns[px].next().value;\n const nextValue =\n (baseCell?.formulaEnabled ?? true)\n ? this.sheet.processFormula(value, {\n dependency: id,\n })\n : value;\n diff[p2a(point)] = {\n ...baseCell,\n value: nextValue,\n };\n }\n }\n } else if (orientation === 'vertical') {\n for (let i = 0; i < dstShape.cols; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(\n matrix.map((row) => row[i]),\n '',\n );\n for (let j = 0; j < dstShape.rows; j++) {\n const baseCell = matrix[j % srcShape.rows]?.[i % srcShape.cols];\n const y = sign > 0 ? this.dst.top + j : this.dst.bottom - j;\n const py = sign > 0 ? j % srcShape.rows : (srcShape.rows - 1 - (j % srcShape.rows)) % srcShape.rows;\n const value = patterns[py].next().value;\n diff[p2a({ y, x: this.dst.left + i })] = { ...baseCell, value };\n }\n }\n }\n return diff;\n }\n\n private get reflections() {\n return {\n undoReflection: { sheetId: this.sheet.id, selectingZone: areaToZone(this.src) },\n redoReflection: { sheetId: this.sheet.id, selectingZone: areaToZone(this.dst) },\n };\n }\n\n public get applied(): Sheet {\n return this.sheet.update({ diff: this.buildDiff(), operator: 'USER', ...this.reflections });\n }\n\n /** Async, progress-reporting apply. Same result as `applied` but time-sliced. */\n public appliedAsync(opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n }): Promise<Sheet> {\n return this.sheet.updateAsync({ diff: this.buildDiff(), operator: 'USER', ...this.reflections, ...opts });\n }\n\n public get wholeArea() {\n return concatAreas(this.src, this.dst);\n }\n\n public getCellStyle(target: PointType) {\n const { x, y } = target;\n const style: CSSPropertiesLike = {};\n const { top, left, bottom, right } = this.src;\n\n switch (this.direction) {\n case 'left': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.left === x && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'right': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.right === x - 1 && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n\n case 'up': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.top === y && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'down': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.bottom === y - 1 && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n }\n return style;\n }\n\n private getDestinationArea(autofillDraggingTo: PointType): AreaType {\n const { x, y } = autofillDraggingTo;\n const { top, left, bottom, right } = this.src;\n switch (this.direction) {\n case 'left':\n return { top, bottom, left: x, right: left - 1 };\n case 'right':\n return { top, bottom, left: right + 1, right: x };\n case 'up':\n return { left, right, top: y, bottom: top - 1 };\n case 'down':\n return { left, right, top: bottom + 1, bottom: y };\n }\n return this.src;\n }\n\n private suggestDirection(draggingTo: PointType): Direction {\n const { top, left, bottom, right } = this.src;\n let horizontal = 0,\n vertical = 0;\n if (draggingTo.x < left) {\n horizontal = draggingTo.x - left;\n } else if (draggingTo.x > right) {\n horizontal = draggingTo.x - right;\n }\n if (draggingTo.y < top) {\n vertical = draggingTo.y - top;\n } else if (draggingTo.y > bottom) {\n vertical = draggingTo.y - bottom;\n }\n // diagonal\n if (Math.abs(horizontal) > 0 && Math.abs(vertical) > 0) {\n if (Math.abs(horizontal) > Math.abs(vertical)) {\n return horizontal < 0 ? 'left' : 'right';\n }\n return vertical < 0 ? 'up' : 'down';\n }\n if (horizontal !== 0) {\n return horizontal < 0 ? 'left' : 'right';\n }\n if (vertical !== 0) {\n return vertical < 0 ? 'up' : 'down';\n }\n return 'none';\n }\n\n private getChangePatterns(cells: (CellType | null)[], id: string): Generator[] {\n const result: Generator[] = [];\n const groups = groupByType(cells);\n const [orientation, sign] = DirectionMapping[this.direction];\n groups.forEach((group) => {\n const lastValue = sign > 0 ? group.last : group.first;\n switch (group.kind) {\n case 'other': {\n result.push(pass(group.first));\n return;\n }\n case 'formula': {\n const value = group.first;\n const sheet = this.sheet;\n\n function* generateFormula() {\n let slide = 0;\n const skip = cells.length * sign;\n while (true) {\n slide += skip;\n yield sheet.processFormula(value, {\n dependency: id,\n slideY: orientation === 'vertical' ? slide : 0,\n slideX: orientation === 'horizontal' ? slide : 0,\n });\n }\n }\n result.push(generateFormula());\n return;\n }\n case 'number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateNumber() {\n let value = lastValue;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield value;\n }\n }\n const g = generateNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'date': {\n const next = (d: Date) => {\n return sign > 0 ? group.time.add(d) : group.time.sub(d);\n };\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateDate() {\n let value = lastValue as Date;\n while (true) {\n value = next(value);\n yield new Date(value);\n }\n }\n const g = generateDate();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'string+number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateStringNumber() {\n const { prefix } = extractStringNumber(group.first as string);\n const { number: lastNumber } = extractStringNumber(lastValue as string);\n let value = lastNumber;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield `${prefix}${Math.abs(value)}`;\n }\n }\n const g = generateStringNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n }\n });\n return result;\n }\n}\n\nfunction* pass(value: any) {\n while (true) {\n yield value;\n }\n}\n\ntype GroupKind = 'number' | 'date' | 'string+number' | 'formula' | 'other';\n\nconst StringNumberPattern = new RegExp('(.+?)(\\\\d+)$');\n\nconst extractStringNumber = (value: string) => {\n const match = value.match(StringNumberPattern);\n if (match) {\n const [, prefix, n] = match;\n return { prefix, number: Number(n) };\n }\n return { prefix: '', number: 0 };\n};\n\nclass TypedGroup {\n public time: Time = Time.create();\n public numericDelta: number = 0;\n public kind: GroupKind;\n public nexts: any[];\n public first: any;\n public equidistant = true;\n\n constructor(value: any) {\n this.first = value;\n this.nexts = [];\n this.kind = this.discriminate(value);\n }\n private discriminate(value: any): GroupKind {\n const kind = value instanceof Date ? 'date' : typeof value;\n if (kind === 'number' || kind === 'date') {\n return kind;\n }\n if (kind === 'string' && value[0] === '=') {\n return 'formula';\n } else if (kind === 'string' && value.match(StringNumberPattern)) {\n return 'string+number';\n }\n return 'other';\n }\n\n public get last() {\n if (this.nexts.length === 0) {\n return this.first;\n }\n return this.nexts[this.nexts.length - 1];\n }\n\n public add(value: any): TypedGroup | undefined {\n const kind = this.discriminate(value);\n if (this.kind !== kind || kind === 'other' || kind === 'formula') {\n return new TypedGroup(value);\n }\n if (this.nexts.length === 0) {\n switch (kind) {\n case 'date': {\n this.time = Time.fromDates(value as Date, this.first as Date);\n break;\n }\n case 'number': {\n this.numericDelta = (value as number) - this.first;\n break;\n }\n case 'string+number': {\n const { prefix: prefix1, number: number1 } = extractStringNumber(this.first as string);\n const { prefix: prefix2, number: number2 } = extractStringNumber(value as string);\n if (prefix1 === prefix2) {\n this.numericDelta = number2 - number1;\n }\n break;\n }\n }\n }\n this.nexts.push(value);\n }\n\n public subdivide() {\n if (this.nexts.length === 0) {\n return [];\n }\n\n const news: TypedGroup[] = [];\n\n let lastGroup: TypedGroup = this;\n switch (this.kind) {\n case 'date': {\n const eq = this.nexts.every((v, i) => i === 0 || dayjs(v).isSame(this.time.add(this.nexts[i - 1])));\n this.equidistant = eq;\n return [];\n }\n case 'number': {\n const eq = this.nexts.every((v, i) => i === 0 || v === this.first + this.numericDelta * (i + 1));\n this.equidistant = eq;\n return [];\n }\n case 'string+number': {\n const { prefix: basePrefix } = extractStringNumber(this.first as string);\n for (let i = 0; i < lastGroup.nexts.length; i++) {\n const next = lastGroup.nexts[i];\n const { prefix, number } = extractStringNumber(next as string);\n if (basePrefix !== prefix) {\n const nexts = this.nexts.splice(i, this.nexts.length);\n lastGroup = new TypedGroup(nexts.splice(0, 1)[0]);\n nexts.forEach(lastGroup.add.bind(lastGroup));\n news.push(lastGroup, ...lastGroup.subdivide());\n break;\n } else {\n const { number: firstNumber } = extractStringNumber(lastGroup.first as string);\n if (number !== firstNumber + (i + 1) * lastGroup.numericDelta) {\n lastGroup.equidistant = false;\n }\n }\n }\n break;\n }\n }\n\n return news;\n }\n}\n\nfunction groupByType(cells: (CellType | null)[]): TypedGroup[] {\n let group = new TypedGroup(cells[0]?.value);\n const groups: TypedGroup[] = [group];\n\n for (let i = 1; i < cells.length; i++) {\n const value = cells[i]?.value;\n const nextGroup = group.add(value);\n if (nextGroup) {\n groups.push(nextGroup);\n group = nextGroup;\n }\n }\n for (let i = groups.length - 1; i >= 0; i--) {\n const group = groups[i];\n groups.splice(i + 1, 0, ...group.subdivide());\n }\n return groups;\n}\n"],"names":["DEFAULT_HISTORY_LIMIT","DEFAULT_HEIGHT","DEFAULT_WIDTH","SHEET_HEIGHT","SHEET_WIDTH","HEADER_HEIGHT","HEADER_WIDTH","MIN_WIDTH","MIN_HEIGHT","OVERSCAN_X","OVERSCAN_Y","DEFAULT_ALPHABET_CACHE_SIZE","SECONDS_IN_DAY","FULLDATE_FORMAT_UTC","RESET_ZONE","BASE_DATE","DEFAULT_KEY","DEFAULT_COL_KEY","DEFAULT_ROW_KEY","ALPHABET","N2C_CACHE","C2N_CACHE","getColumnLetterFromNumber","key","cacheSize","cached","num","result","it","st","getNumberFromColumnLetter","alpha","digit","x2c","x","c","c2x","col","absolute","n","y2r","y","r2y","row","p2a","absX","absY","colPart","rowPart","a2p","address","m","_absX","_absY","grantAddressAbsolute","absCol","absRow","rh","ch","stripAddressAbsolute","buildIdentifiedRef","id","superposeArea","srcArea","dstArea","srcRows","srcCols","areaDiff","dstRows","dstCols","concatAreas","area1","area2","zoneToArea","zone","top","bottom","left","right","areaToZone","area","areaToRange","leftTop","rightBottom","between","range","index","among","point","zoneDiff","zoneShape","areaShape","matrixShape","base","matrix","h","makeSequence","start","stop","step","_","oa2aa","oa","fields","aa","o","a","field","aa2oa","v","i","createMatrix","numRows","numCols","fill","buildInitialCellsFromOrigin","cells","ensured","flattenAs","origin","buildInitialCells","matrices","userKeys","deferred","sum","_a","buildCells","baseAddress","baseY","baseX","colLetters","rowStr","cell","getMaxSizesFromCells","keys","lastY","lastX","end","list","complementSelectingArea","selectingArea","choosing","expandRange","startRow","endRow","match","startCol","endCol","startColIndex","endColIndex","currentColumn","restrictZone","s","binarySearch","low","high","predicate","lessThan","mid","addressesToAreas","addresses","points","addr","pointSet","p","visited","areas","k","queue","dy","dx","nk","addressesToCols","asc","seen","cols","b","addressesToRows","rows","isZoneNotSelected","MS_PER_DAY","Time","days","format","date","totalMs","absMs","sign","millis","remaining","seconds","minutes","hours","milliseconds","ms","timeMs","date1","date2","obj","value","strict","formattedMatcher","dayjsFormatToNamedRegex","_sign","msecs","tokenRegexMap","sortedTokens","tokenPattern","regexSource","FormulaError","code","message","error","Sentinel","SOLVING","NONE","Pending","promise","Spilling","stripId","idString","stripAbsolute","Entity","ValueEntity","UnreferencedEntity","InvalidRefEntity","RefEntity","sheet","parsed","parseRef","props","slideY","slideX","newPoint","RangeEntity","formulas","IdEntity","sheetIdStr","sheetId","formula","ids","IdRangeEntity","idRange","ps","p1","p2","FunctionEntity","name","precedence","args","at","Func","ZERO","INFIX_FUNCTION_NAME_MAP","PREFIX_FUNCTION_NAME_MAP","WHITESPACE_CHARS","SPECIAL_CHARS","Token","type","entity","closed","isWhiteSpace","char","BOOLS","TOKEN_OPEN","TOKEN_CLOSE","TOKEN_COMMA","INFIX_OPERATOR","PREFIX_OPERATOR","POSTFIX_OPERATOR","Lexer","options","pos","token","slide","parts","t","idMap","prev1","prev2","_b","buf","tok","bool","resolveIdRange","space","quote","refString","refs","done","before","after","regex","ref","replaced","prefix","suffix","Parser","tokens","expr","underFunction","stack","lastOperator","complement","hasNext","outer","divideBy100","func","operator","FormulaParser","stripSheetName","sheetName","splitRef","nextChar","excl","operation","dependency","filterCellFields","ignoreFields","ensureSys","registry","defaults","sys","setAsyncCache","ac","noFilter","getCellByAddress","toValueMatrix","resolution","raise","filter","asScalar","toValueMatrixAsync","frameBudgetMs","onProgress","yieldControl","toValueObject","fieldValue","toValueRows","ys","toValueCols","xs","toCellMatrix","filteredCell","toCellObject","toCellRows","escapeSheetName","toSheetPrefix","toCellCols","RemoveRows","RemoveCols","InsertRowsAbove","InsertRowsBelow","InsertColsLeft","InsertColsRight","MoveFrom","MoveTo","Write","Style","Copy","Resize","SetPolicy","Sort","Filter","SetLabel","NoOperation","Move","Update","InsertRows","InsertCols","Add","Delete","ReadOnly","ColumnMenu","RowMenu","ViewOnly","hasOperation","flag","debugOperations","prevention","operations","dayjs","timezone","utc","NUMS","NUMS_Z","JFMASOND","NBRYNLGPTVC","DATE_WORDS","parseDate","first","words","word","timeZone","Policy","mixins","subclassProto","mixin","rendered","isSheet","_props","childSheet","rest","stripped","_n","e","_cell","next","DEFAULT_POLICY_NAME","nonePolicy","_str","detectType","cellValue","parseAsType","scale","d","td","bv","toNumeric","filterEq","condition","vt","cellNum","filterNe","filterGt","filterGte","filterLt","filterLte","filterBlank","_condition","filterNonblank","filterIncludes","filterExcludes","filterFunctions","evaluateFilterCondition","fn","evaluateFilterConfig","mode","ReferencePreserver","did","prevId","currId","diffBefore","dep","shouldTracking","op","Sheet","limits","createRegistry","eager","height","historicize","width","colCell","pendingMap","promises","resolve","check","snapshot","diffAfter","changedIds","trimmedBefore","trimmedAfter","activeFilters","changedAddresses","rowCell","shouldFilter","wasFiltered","direction","fixedPositions","sortableIndices","cellA","cellB","valA","valB","cmp","availablePositions","changed","sortedRowMapping","matrixSnapshot","oldY","newY","preserver","inverse","newOrder","oldYStr","savedRows","lexer","_c","extension","auto","addressKeys","data","deferredMatrices","explicitAddresses","otherSheet","context","dispatch","colLetter","changedTime","stacked","colId","colDefault","_cs","colDefaultLayout","headerCell","rowId","rowDefault","_rs","rowDefaultLayout","my","mx","val","matrixCell","headerH","defaultH","offset","oy","fy","heights","filtered","yy","l","rw","lw","th","headerW","accW","w","colSys","totalOverrideDiff","filteredHeightSum","fullH","relocate","resize","copied","cache","startWatermark","hit","retry","fromY","existing","solveFormula","idRow","explicit","totalRows","doYield","lastYield","history","book","kickedOut","rel","depId","newCell","srcSheet","src","dst","undoReflection","redoReflection","srcSheetRaw","moveRelations","dstSheet","srcTop","srcLeft","srcBottom","srcRight","dstTop","dstLeft","dstNumRows","dstNumCols","srcVisibleRows","srcNumCols","srcNumVisibleRows","dstVisibleRows","di","srcCellSet","j","dstAddrSet","dstY","dstX","srcY","srcX","srcAddr","isDstInBounds","dstAddr","newId","lostId","existingId","srcId","srcCell","dstCell","reverse","wireWrites","idWritesSrc","idWritesDst","beforePolicy","afterPolicy","toPoint","movedId","fromPoint","srcPoint","dstPoint","dstId","operation.hasOperation","operation.MoveFrom","operation.MoveTo","policyKey","restricted","dstPolicyKey","srcPolicyKey","dstPolicyVal","srcPolicyVal","isSrcWinner","srcSys","srcSnapshot","dstSnapshot","r","srcAddresses","resolvedDiff","onlyValue","isXSheet","topFrom","leftFrom","bottomFrom","rightFrom","topTo","leftTo","bottomTo","rightTo","diff","toY","toX","fromX","dstPolicy","srcPolicy","dstIdForClear","dstSys","operation.Copy","opts","srcCells","srcPolicies","si","cellRow","polRow","sc","out","ctx","noFilters","dstBottom","total","resized","visibleDstIndex","srcValue","partial","updateChangedTime","operation.Update","formulaIdentify","rawNext","ownNext","current","operation.Write","operation.Style","operation.Resize","_d","merged","finalH","_e","srcRowIndex","currentCell","matrixWithStyle","cloned","backup","yi","operation.RemoveRows","xi","deleted","operation.RemoveCols","deleting","apply","policy","raw","solved","stripSheet","solveSheet","budget","y0","movedAddresses","snapshotIds","sheetRef","idx","depSys","tmp","targetPoint","targetId","targetCell","originId","spilledAddresses","omit","shape","asyncCacheMiss","hasPendingArg","hasDeepPending","values","cyrb53","str","seed","h1","h2","buildAsyncCacheKey","funcName","hashPrecision","argsJson","_key","hashes","getAsyncCache","useInflight","compositeKey","inflight","awaitAndSave","ttlMilliseconds","expireTime","pending","createPropagatedPending","gt","ensureString","ensureNumber","gte","lt","lte","eq","ne","isPercentage","isNumeric","alternative","ignore","ensureBoolean","ensureDate","CONDITION_REGEX","target","comparison","equals","eachMatrix","callback","createBooleanMask","sheets","conditions","refRange","mask","condRange","pt","conditionArg","matchesType","nullable","errorTolerant","acceptedTypes","isMatrix","stripMatrix","isMultiCell","resolveParamIndex","defs","argCount","indices","iterStart","iterCount","_BaseFunction","validatedArgs","minArgs","hasIterable","def","broadcastResult","helpIndices","broadcastable","hIdx","arg","scalarArgs","maxRows","maxCols","acc","originalBareArgs","cellArgs","BaseFunction","_BaseFunctionAsync","BaseFunctionAsync","description","AddFunction","v1","v2","MinusFunction","MultiplyFunction","DivideFunction","validated","divided","divisor","SumFunction","ConcatFunction","EqFunction","NeFunction","GtFunction","GteFunction","LtFunction","LteFunction","NowFunction","AndFunction","OrFunction","IfFunction","IfErrorFunction","valueIfError","NotFunction","CountFunction","count","AbsFunction","PowerFunction","exponent","CountaFunction","AverageFunction","MaxFunction","max","hasValues","MinFunction","min","LenFunction","text","UminusFunction","ArrayformulaFunction","functions","_functionHelpsCache","getFunctionHelps","customFunctions","helps","FnClass","instance","Registry","historyLimit","additionalFunctions","policies","onSave","onChange","onRemoveRows","onRemoveCols","onInsertRows","onInsertCols","onSelect","onKeyUp","onInit","newBook","functionsDefault","fnName","tobe","storeDispatch","store","createBinding","createBook","makeThousandSeparatorMixin","sep","int","fraction","ThousandSeparatorPolicyMixin","PercentagePolicyMixin","getLabel","label","COLOR_PALETTE","BORDER_AUTOFILL_DRAGGING","DirectionMapping","Autofill","draggingTo","selectingZone","orientation","sTop","sLeft","sBottom","sRight","srcShape","dstShape","patterns","baseCell","px","nextValue","py","style","autofillDraggingTo","horizontal","vertical","groups","groupByType","group","lastValue","pass","generateFormula","skip","generateNumber","g","generateDate","generateStringNumber","extractStringNumber","lastNumber","StringNumberPattern","TypedGroup","kind","prefix1","number1","prefix2","number2","news","lastGroup","basePrefix","number","nexts","firstNumber","nextGroup"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/lib/coords.ts","../src/lib/spatial.ts","../src/lib/time.ts","../src/formula/formula-error.ts","../src/sentinels.ts","../src/formula/evaluator.ts","../src/lib/cell.ts","../src/lib/sheet_utils.ts","../src/lib/operation.ts","../src/lib/date.ts","../src/policy/core.ts","../src/lib/filter.ts","../src/lib/reference.ts","../src/lib/sheet.ts","../src/formula/solver.ts","../src/formula/functions/__async.ts","../src/formula/functions/__utils.ts","../src/formula/functions/__base.ts","../src/formula/functions/add.ts","../src/formula/functions/minus.ts","../src/formula/functions/multiply.ts","../src/formula/functions/divide.ts","../src/formula/functions/sum.ts","../src/formula/functions/concat.ts","../src/formula/functions/eq.ts","../src/formula/functions/ne.ts","../src/formula/functions/gt.ts","../src/formula/functions/gte.ts","../src/formula/functions/lt.ts","../src/formula/functions/lte.ts","../src/formula/functions/now.ts","../src/formula/functions/and.ts","../src/formula/functions/or.ts","../src/formula/functions/if.ts","../src/formula/functions/iferror.ts","../src/formula/functions/not.ts","../src/formula/functions/count.ts","../src/formula/functions/abs.ts","../src/formula/functions/power.ts","../src/formula/functions/counta.ts","../src/formula/functions/average.ts","../src/formula/functions/max.ts","../src/formula/functions/min.ts","../src/formula/functions/len.ts","../src/formula/functions/uminus.ts","../src/formula/functions/arrayformula.ts","../src/formula/mapping.ts","../src/lib/book.ts","../src/policy/thousand_separator.ts","../src/policy/percentage.ts","../src/lib/label.ts","../src/lib/palette.ts","../src/lib/autofill.ts"],"sourcesContent":["import type { ZoneType } from './types';\n\nexport const DEFAULT_HISTORY_LIMIT = 20;\n\nexport const DEFAULT_HEIGHT = 24;\nexport const DEFAULT_WIDTH = 90;\n\nexport const SHEET_HEIGHT = 500;\nexport const SHEET_WIDTH = 1000;\n\nexport const HEADER_HEIGHT = 24;\nexport const HEADER_WIDTH = 50;\n\nexport const MIN_WIDTH = 5;\nexport const MIN_HEIGHT = 5;\n\nexport const OVERSCAN_X = 5;\nexport const OVERSCAN_Y = 10;\n\nexport const DEFAULT_ALPHABET_CACHE_SIZE = 1000;\n\nexport const SECONDS_IN_DAY = 86400;\nexport const FULLDATE_FORMAT_UTC = 'YYYY-MM-DDTHH:mm:ss.SSSZ';\n\nexport const RESET_ZONE: ZoneType = {\n startY: -1,\n startX: -1,\n endY: -1,\n endX: -1,\n};\n\n// 1900-01-01 is the base date for date serialization in Excel, and is represented as 0 in Excel's date system. However, JavaScript's Date object uses the Unix epoch (1970-01-01) as its base date. Therefore, we need to account for the difference between these two epochs when converting between Excel dates and JavaScript dates.\nexport const BASE_DATE = new Date(1900, 0, 1);\n\nexport const DEFAULT_KEY = 'default';\nexport const DEFAULT_COL_KEY = 'defaultCol';\nexport const DEFAULT_ROW_KEY = 'defaultRow';\n","import type { Address, PointType, ExtraPointType } from '../types';\nimport { DEFAULT_ALPHABET_CACHE_SIZE } from '../constants';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nconst N2C_CACHE = new Map<number, string>();\nconst C2N_CACHE = new Map<string, number>();\n\nconst getColumnLetterFromNumber = (key: number, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): string => {\n const cached = N2C_CACHE.get(--key);\n if (cached != null) {\n return cached;\n }\n if (key === 0) {\n return '';\n }\n let num = key;\n let result = '';\n do {\n result = ALPHABET[--num % 26] + result;\n num = Math.floor(num / 26);\n } while (num > 0);\n\n N2C_CACHE.set(key, result);\n const it = N2C_CACHE.keys();\n for (let st = it.next(); N2C_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n N2C_CACHE.delete(st.value);\n }\n return result;\n};\n\nconst getNumberFromColumnLetter = (key: string, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): number => {\n const cached = C2N_CACHE.get(key);\n if (cached != null) {\n return cached;\n }\n if (key === '') {\n return 0;\n }\n const alpha = key;\n let result = 0;\n for (let digit = 0; digit < alpha.length; digit++) {\n const a = alpha[alpha.length - digit - 1];\n const num = ALPHABET.indexOf(a) + 1;\n result += ALPHABET.length ** digit * num;\n }\n C2N_CACHE.set(key, result);\n const it = C2N_CACHE.keys();\n for (let st = it.next(); C2N_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n C2N_CACHE.delete(st.value);\n }\n return result;\n};\n\nexport const x2c = (x: number): string => {\n if (x === 0) {\n return '';\n }\n const c = getColumnLetterFromNumber(x + 1);\n return x < 0 ? `$${c}` : c;\n};\n\nexport const c2x = (col: string, absolute = false): number => {\n const n = getNumberFromColumnLetter(col.toUpperCase());\n return absolute ? -n : n;\n};\n\nexport const y2r = (y: number) => {\n if (y === 0) {\n return '';\n }\n return y < 0 ? `$${y}` : String(y);\n};\n\nexport const r2y = (row: number | string, absolute = false) => {\n if (typeof row === 'string') {\n row = parseInt(row, 10);\n }\n return absolute ? -row : row;\n};\n\nexport const p2a = ({ y, x, absX, absY }: Partial<ExtraPointType>) => {\n if (x === -1 && y === -1) {\n return '?';\n }\n const colPart = x === undefined ? '' : x === 0 ? '0' : `${absX ? '$' : ''}${x2c(x)}`;\n const rowPart = y === undefined ? '' : y === 0 ? '0' : `${absY ? '$' : ''}${y2r(y)}`;\n return `${colPart}${rowPart}`;\n};\n\nexport const a2p = (address: Address): ExtraPointType => {\n const m = address.match(/(\\$)?([a-zA-Z]*)(\\$)?([0-9]*)/);\n if (m == null) {\n return { y: -1, x: -1 };\n }\n const [, _absX, col, _absY, row] = m.slice();\n const [absX, absY] = [_absX != null, _absY != null];\n if (col === '' && row === '') {\n return { y: -1, x: -1, absX: false, absY: false };\n }\n return { y: r2y(row) || 0, x: c2x(col) || 0, absX, absY };\n};\n\nexport const grantAddressAbsolute = (address: Address, absCol: boolean, absRow: boolean) => {\n const m = address.match(/([A-Z]*)([0-9]*)/);\n if (m == null) {\n return address;\n }\n const [, col, row] = m.slice();\n return `${absCol ? '$' : ''}${col.toUpperCase()}${absRow ? '$' : ''}${row}`;\n};\n\n/**\n * Returns the row header cell address for a given row number by prepending `0`.\n * e.g. rh(6) → '06', rh(1) → '01'\n */\nexport const rh = (y: number): string => `0${y}`;\n\n/**\n * Returns the column header cell address for a given column letter or column index\n * (1-based, same as point.x) by appending `0`.\n * e.g. ch('A') → 'A0', ch(1) → 'A0'\n */\nexport const ch = (col: string | number): string =>\n typeof col === 'number' ? `${x2c(col)}0` : `${col.toUpperCase()}0`;\n\nexport const stripAddressAbsolute = (address: Address) => {\n return address.replace(/\\$/g, '');\n};\n\nexport const buildIdentifiedRef = (id: string, absX = false, absY = false): string => {\n return `${absX ? '$' : ''}#${id}${absY ? '$' : ''}`;\n};\n","import { DEFAULT_KEY, DEFAULT_COL_KEY, DEFAULT_ROW_KEY } from '../constants';\nimport type {\n MatrixType,\n AreaType,\n ZoneType,\n RangeType,\n PointType,\n CellsByAddressType,\n ShapeType,\n MatricesByAddress,\n CellType,\n Address,\n} from '../types';\nimport { a2p, p2a, x2c, c2x } from './coords';\n\nexport const superposeArea = (srcArea: AreaType, dstArea: AreaType): ShapeType => {\n const { rows: srcRows, cols: srcCols } = areaDiff(srcArea);\n const { rows: dstRows, cols: dstCols } = areaDiff(dstArea);\n\n // biggerRows, biggerCols\n return {\n rows: srcRows > dstRows ? srcRows : dstRows,\n cols: srcCols > dstCols ? srcCols : dstCols,\n };\n};\n\nexport const concatAreas = (area1: AreaType, area2: AreaType): AreaType => {\n const result: AreaType = { ...area1 };\n if (area2.left < area1.left) {\n result.left = area2.left;\n }\n if (area2.right > area1.right) {\n result.right = area2.right;\n }\n if (area2.top < area1.top) {\n result.top = area2.top;\n }\n if (area2.bottom > area1.bottom) {\n result.bottom = area2.bottom;\n }\n return result;\n};\n\nexport const zoneToArea = (zone: ZoneType): AreaType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { top: -1, left: -1, bottom: -1, right: -1 };\n }\n const [top, bottom] = zone.startY < zone.endY ? [zone.startY, zone.endY] : [zone.endY, zone.startY];\n const [left, right] = zone.startX < zone.endX ? [zone.startX, zone.endX] : [zone.endX, zone.startX];\n return { top, left, bottom, right };\n};\n\nexport const areaToZone = (area: AreaType): ZoneType => {\n return {\n startY: area.top,\n startX: area.left,\n endY: area.bottom,\n endX: area.right,\n };\n};\n\nexport const areaToRange = (area: AreaType): string => {\n const { top, left, bottom, right } = area;\n if (top === bottom && left === right) {\n return p2a({ y: top, x: left });\n }\n const leftTop = p2a({ y: top, x: left });\n const rightBottom = p2a({ y: bottom, x: right });\n return `${leftTop}:${rightBottom}`;\n};\n\nexport const between = (range: RangeType, index: number) => {\n if (range.start === -1 || range.end === -1) {\n return false;\n }\n return (range.start <= index && index <= range.end) || (range.end <= index && index <= range.start);\n};\n\nexport const among = (area: AreaType, point: PointType) => {\n if (area.top === -1 || area.left === -1 || area.bottom === -1 || area.right === -1) {\n return false;\n }\n const { y, x } = point;\n const { top, left, bottom, right } = area;\n return top <= y && y <= bottom && left <= x && x <= right;\n};\n\ntype ShapeExtension = { base?: number };\n\nexport const zoneDiff = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 0, cols: 0 };\n }\n return {\n rows: Math.abs(zone.startY - zone.endY),\n cols: Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const zoneShape = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 1, cols: 1 };\n }\n return {\n rows: 1 + Math.abs(zone.startY - zone.endY),\n cols: 1 + Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const areaDiff = (area: AreaType): ShapeType => {\n return {\n rows: Math.abs(area.top - area.bottom),\n cols: Math.abs(area.left - area.right),\n };\n};\n\nexport const areaShape = (area: AreaType): ShapeType => {\n return {\n rows: 1 + Math.abs(area.top - area.bottom),\n cols: 1 + Math.abs(area.left - area.right),\n };\n};\n\nexport const matrixShape = ({ base = 0, matrix }: { matrix: MatrixType } & ShapeExtension): ShapeType => {\n const h = matrix.length;\n if (h === 0) {\n return { rows: 0, cols: 0 };\n }\n return { rows: base + h, cols: base + matrix[0].length };\n};\n\nexport const makeSequence = (start: number, stop: number, step: number = 1) => {\n return Array.from({ length: (stop - start - 1) / step + 1 }, (_, i) => start + i * step);\n};\n\nexport const oa2aa = (oa: { [s: string]: any }[], fields: string[]): MatrixType => {\n const aa: any[][] = [];\n oa.forEach((o) => {\n const a: any[] = [];\n fields.forEach((field) => {\n a.push(o[field]);\n });\n aa.push(a);\n });\n return aa;\n};\n\nexport const aa2oa = (aa: MatrixType, fields: string[]): { [s: string]: any }[] => {\n const oa: { [s: string]: any }[] = [];\n aa.forEach((a) => {\n const o: { [s: string]: any } = {};\n a.forEach((v, i) => {\n if (i >= fields.length) {\n return;\n }\n const field = fields[i];\n o[field] = v;\n });\n oa.push(o);\n });\n return oa;\n};\n\nexport const createMatrix = <T = any>(numRows: number, numCols: number, fill?: T): T[][] => {\n return [...Array(numRows)].map(() => Array(numCols).fill(fill));\n};\n\nexport const buildInitialCellsFromOrigin = ({\n cells = {},\n ensured = {},\n matrix = [],\n flattenAs = 'value',\n origin = 'A1',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrix?: MatrixType;\n origin?: Address;\n}) => {\n return buildInitialCells({\n cells,\n ensured,\n matrices: { [origin]: matrix },\n flattenAs,\n });\n};\n\nexport const buildInitialCells = ({\n cells = {},\n ensured = {},\n matrices = {},\n flattenAs = 'value',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<any>;\n} = {}) => {\n const userKeys = Object.keys(cells);\n // Only eagerly build cells for small matrices. For large ones, defer to\n // Sheet._ensureCellPopulated via __matrices so we avoid creating millions\n // of dictionary entries up front.\n const totalMatrixCells = Object.values(matrices).reduce((sum, m) => sum + m.length * (m[0]?.length ?? 0), 0);\n const EAGER_THRESHOLD = 100_000;\n const deferred = totalMatrixCells > EAGER_THRESHOLD;\n if (!deferred) {\n buildCells({ cells, flattenAs, matrices });\n } else {\n // Attach matrices for lazy resolution in Sheet.initialize()\n Object.defineProperty(cells, '__matrices', { value: matrices, configurable: true });\n Object.defineProperty(cells, '__flattenAs', { value: flattenAs, configurable: true });\n }\n const { numRows, numCols } = Object.assign({ numRows: 1, numCols: 1 }, ensured);\n const rightBottom = p2a({ y: numRows, x: numCols });\n if (cells[rightBottom] == null) {\n cells[rightBottom] = {};\n }\n // Only attach __userKeys for deferred matrices. When buildCells ran eagerly,\n // all keys are already in cells so Object.keys(cells) is correct.\n if (deferred) {\n userKeys.push(rightBottom);\n Object.defineProperty(cells, '__userKeys', { value: userKeys, configurable: true });\n }\n return cells;\n};\n\nexport const buildCells = <T>({\n cells = {},\n matrices = {},\n flattenAs,\n}: {\n cells?: CellsByAddressType;\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<T>;\n}) => {\n Object.keys(matrices).forEach((baseAddress) => {\n const matrix = matrices[baseAddress];\n const { y: baseY, x: baseX } = a2p(baseAddress);\n const colLetters: string[] = [];\n for (let y = 0; y < matrix.length; y++) {\n const row = matrix[y];\n const rowStr = String(baseY + y);\n for (let x = 0; x < row.length; x++) {\n if (colLetters[x] == null) {\n colLetters[x] = x2c(baseX + x);\n }\n const id = colLetters[x] + rowStr;\n if (flattenAs) {\n const cell = cells[id];\n if (cell) {\n if (!(flattenAs in cell)) {\n (cell as Record<string, unknown>)[flattenAs] = row[x];\n }\n } else {\n cells[id] = { [flattenAs]: row[x] };\n }\n } else {\n cells[id] = row[x] as CellType;\n }\n }\n }\n });\n return cells;\n};\n\nexport const getMaxSizesFromCells = (cells: CellsByAddressType = {}, keys?: string[]) => {\n let [lastY, lastX] = [0, 0];\n (keys ?? Object.keys(cells)).forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const { y, x } = a2p(address);\n if (lastY < y) {\n lastY = y;\n }\n if (lastX < x) {\n lastX = x;\n }\n });\n return { numRows: lastY, numCols: lastX };\n};\n\nexport const range = (start: number, end: number) => {\n const list: number[] = [];\n for (let i = start; i <= end; i++) {\n list.push(i);\n }\n return list;\n};\n\nexport const complementSelectingArea = (selectingArea: AreaType, choosing: PointType) => {\n if (selectingArea.left === -1) {\n selectingArea = {\n left: choosing.x,\n top: choosing.y,\n right: choosing.x,\n bottom: choosing.y,\n };\n }\n return selectingArea;\n};\n\nexport const expandRange = (range: string): Address[] => {\n if (range.indexOf(':') === -1) {\n return [range];\n }\n\n const result: Address[] = [];\n\n const isRowRange = /^\\d+\\:\\d+$/.test(range);\n\n if (isRowRange) {\n const [startRow, endRow] = range.split(':').map(Number);\n for (let row = startRow; row <= endRow; row++) {\n result.push(`${row}`);\n }\n return result;\n }\n\n const match = range.match(/^([A-Z]*)(\\d+)?\\:([A-Z]*)(\\d+)?$/);\n if (!match) {\n console.error('Invalid range format', range);\n return [range];\n }\n\n const [, startCol, startRow, endCol, endRow] = match;\n const startColIndex = startCol ? c2x(startCol) : 1;\n const endColIndex = endCol ? c2x(endCol) : 1;\n\n for (let col = startColIndex; col <= endColIndex; col++) {\n const currentColumn = startCol || endCol ? x2c(col) : '';\n if (startRow && endRow) {\n for (let row = Number(startRow); row <= Number(endRow); row++) {\n result.push(`${currentColumn}${row}`);\n }\n } else if (!startRow && !endRow) {\n result.push(currentColumn);\n }\n }\n return result;\n};\n\n// restrictZone resets a zone if the zone consists of a single cell.\nexport const restrictZone = (zone: ZoneType): ZoneType => {\n const s = zoneDiff(zone);\n if (s.rows + s.cols === 0) {\n return { startY: -1, startX: -1, endY: -1, endX: -1 };\n }\n return { ...zone };\n};\n\nexport type BinarySearchPredicate = (mid: number) => boolean;\n\nexport const binarySearch = (\n low: number,\n high: number,\n predicate: BinarySearchPredicate,\n lessThan: boolean,\n): number => {\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (predicate(mid)) {\n if (lessThan) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n } else {\n if (lessThan) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n }\n return lessThan ? low : high;\n};\n\n/**\n * Convert a list of addresses into an array of bounding areas.\n * Adjacent cells (4-connected: up/down/left/right) are grouped into the same area.\n * Each resulting AreaType is the bounding rectangle of one connected group.\n */\nexport const addressesToAreas = (addresses: Address[]): AreaType[] => {\n if (addresses.length === 0) {\n return [];\n }\n\n const points = addresses.map((addr) => {\n const { y, x } = a2p(addr);\n return { y, x };\n });\n\n const key = (y: number, x: number) => `${y},${x}`;\n const pointSet = new Set(points.map((p) => key(p.y, p.x)));\n const visited = new Set<string>();\n const areas: AreaType[] = [];\n\n for (const p of points) {\n const k = key(p.y, p.x);\n if (visited.has(k)) {\n continue;\n }\n\n // BFS to find connected component\n let top = p.y,\n left = p.x,\n bottom = p.y,\n right = p.x;\n const queue = [p];\n visited.add(k);\n\n while (queue.length > 0) {\n const { y, x } = queue.shift()!;\n if (y < top) {\n top = y;\n }\n if (y > bottom) {\n bottom = y;\n }\n if (x < left) {\n left = x;\n }\n if (x > right) {\n right = x;\n }\n\n for (const [dy, dx] of [\n [0, 1],\n [0, -1],\n [1, 0],\n [-1, 0],\n ]) {\n const nk = key(y + dy, x + dx);\n if (pointSet.has(nk) && !visited.has(nk)) {\n visited.add(nk);\n queue.push({ y: y + dy, x: x + dx });\n }\n }\n }\n\n areas.push({ top, left, bottom, right });\n }\n\n return areas;\n};\n\n/**\n * Extract unique column indices (x) from a list of addresses, ignoring row information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToCols = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const cols: number[] = [];\n for (const addr of addresses) {\n const { x } = a2p(addr);\n if (!seen.has(x)) {\n seen.add(x);\n cols.push(x);\n }\n }\n if (asc === true) {\n cols.sort((a, b) => a - b);\n } else if (asc === false) {\n cols.sort((a, b) => b - a);\n }\n return cols;\n};\n\n/**\n * Extract unique row indices (y) from a list of addresses, ignoring column information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToRows = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const rows: number[] = [];\n for (const addr of addresses) {\n const { y } = a2p(addr);\n if (!seen.has(y)) {\n seen.add(y);\n rows.push(y);\n }\n }\n if (asc === true) {\n rows.sort((a, b) => a - b);\n } else if (asc === false) {\n rows.sort((a, b) => b - a);\n }\n return rows;\n};\n\nexport const isZoneNotSelected = (zone: ZoneType): boolean => {\n return zone.startY === -1 || zone.startX === -1 || zone.endY === -1 || zone.endX === -1;\n};\n","import { BASE_DATE } from '../constants';\n\nconst MS_PER_DAY = 86400000;\n\nexport class Time {\n public readonly __gsType = 'Time' as const;\n public readonly days: number;\n public format: string;\n\n constructor(days: number, format = 'HH:mm:ss') {\n this.days = days;\n this.format = format;\n }\n\n public add(date: Date): Date {\n return new Date(date.getTime() + this.days * MS_PER_DAY);\n }\n\n public sub(date: Date): Date {\n return new Date(date.getTime() - this.days * MS_PER_DAY);\n }\n\n public stringify(format?: string): string {\n const totalMs = this.toMilliseconds();\n const absMs = Math.abs(totalMs);\n const sign = totalMs < 0 ? '-' : '';\n\n const millis = absMs % 1000;\n let remaining = Math.floor(absMs / 1000);\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n const minutes = remaining % 60;\n const hours = Math.floor(remaining / 60);\n\n const resolvedFormat = format ?? (millis === 0 ? 'HH:mm:ss' : 'HH:mm:ss.SSS');\n\n let result = resolvedFormat;\n result = result.replace('HH', sign + String(hours).padStart(2, '0'));\n result = result.replace('H', sign + String(hours));\n result = result.replace('mm', String(minutes).padStart(2, '0'));\n result = result.replace('ss', String(seconds).padStart(2, '0'));\n result = result.replace('SSS', String(millis).padStart(3, '0'));\n result = result.replace('SS', String(millis).padStart(3, '0').substring(0, 2));\n result = result.replace('S', String(millis).padStart(3, '0').substring(0, 1));\n return result;\n }\n\n public toMilliseconds(): number {\n return this.days * MS_PER_DAY;\n }\n\n public toDate(): Date {\n return new Date(BASE_DATE.getTime() + this.days * MS_PER_DAY);\n }\n\n public toJSON(): { __gsType: 'Time'; days: number; format: string } {\n return { __gsType: 'Time', days: this.days, format: this.format };\n }\n\n public toString(): string {\n return this.stringify();\n }\n\n static create(hours = 0, minutes = 0, seconds = 0, milliseconds = 0): Time {\n const ms = hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds;\n return new Time(ms / MS_PER_DAY);\n }\n\n static fromDate(date: Date): Time {\n const timeMs =\n date.getHours() * 3600000 + date.getMinutes() * 60000 + date.getSeconds() * 1000 + date.getMilliseconds();\n return new Time(timeMs / MS_PER_DAY);\n }\n\n static fromDates(date1: Date, date2: Date): Time {\n return new Time((date1.getTime() - date2.getTime()) / MS_PER_DAY);\n }\n\n static fromObject(obj: { days: number; format?: string }): Time {\n return new Time(obj.days, obj.format);\n }\n\n static is(obj: any): boolean {\n if (obj instanceof Time) {\n return true;\n }\n if (obj?.__gsType === 'Time') {\n return true;\n }\n return false;\n }\n\n static ensure(obj: any): Time {\n if (obj instanceof Time) {\n return obj;\n }\n if (obj?.__gsType === 'Time') {\n return Time.fromObject(obj);\n }\n return Time.create();\n }\n\n static parse(value: string, format?: string, strict = false): Time | undefined {\n if (format != null) {\n const formattedMatcher = dayjsFormatToNamedRegex(format);\n const match = value.match(formattedMatcher);\n if (match?.groups) {\n return Time.create(\n Number(match.groups.HH || match.groups.H || 0),\n Number(match.groups.mm || match.groups.m || 0),\n Number(match.groups.ss || match.groups.s || 0),\n Number(match.groups.SSS || match.groups.SS || match.groups.S || 0),\n );\n }\n }\n if (strict) {\n return;\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes, seconds] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})\\.(\\d+)$/);\n if (match) {\n const [, _sign, hours, minutes, seconds, msecs] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds), sign * Number(msecs));\n }\n }\n }\n}\n\nconst tokenRegexMap: Record<string, { group: string; pattern: string }> = {\n HH: { group: 'HH', pattern: '(?<HH>\\\\d+)' },\n H: { group: 'H', pattern: '(?<HH>\\\\d+)' },\n mm: { group: 'mm', pattern: '(?<mm>[0-5]\\\\d)' },\n m: { group: 'm', pattern: '(?<m>\\\\d|[1-5]\\\\d)' },\n ss: { group: 'ss', pattern: '(?<ss>[0-5]\\\\d)' },\n s: { group: 's', pattern: '(?<s>\\\\d|[1-5]\\\\d)' },\n SSS: { group: 'SSS', pattern: '(?<SSS>\\\\d{3})' },\n SS: { group: 'SS', pattern: '(?<SS>\\\\d{2})' },\n S: { group: 'S', pattern: '(?<S>\\\\d)' },\n};\n\nfunction dayjsFormatToNamedRegex(format: string): RegExp {\n const sortedTokens = Object.keys(tokenRegexMap).sort((a, b) => b.length - a.length);\n const tokenPattern = new RegExp(sortedTokens.join('|'), 'g');\n\n const escapedFormat = format.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n const regexSource = escapedFormat.replace(tokenPattern, (match) => {\n return tokenRegexMap[match]?.pattern ?? match;\n });\n\n return new RegExp(`^${regexSource}$`);\n}\n\nexport const safeQueueMicrotask =\n typeof queueMicrotask === 'function' ? queueMicrotask : (cb: () => void) => Promise.resolve().then(cb);\n","export class FormulaError {\n public code: string;\n public message: string;\n public error?: Error;\n public readonly __gsType = 'FormulaError' as const;\n constructor(code: string, message: string, error?: Error) {\n this.code = code;\n this.message = message;\n this.error = error;\n }\n static is(obj: any): obj is FormulaError {\n return obj instanceof FormulaError || obj?.__gsType === 'FormulaError';\n }\n toString() {\n return this.code;\n }\n}\n","export class Sentinel {\n public readonly __gsType = 'Sentinel' as const;\n constructor(public readonly code: string) {}\n\n is(obj: any): obj is this {\n return Sentinel.is(obj, this.code);\n }\n\n static is(obj: any, code?: string): obj is Sentinel {\n const match = obj instanceof Sentinel || obj?.__gsType === 'Sentinel';\n if (!match) {\n return false;\n }\n return code == null || obj.code === code;\n }\n}\n\nexport const SOLVING = new Sentinel('solving');\nexport const NONE = new Sentinel('none');\n\n/**\n * Sentinel value representing an in-flight async formula computation.\n * Cells whose solved cache contains a Pending will render a loading indicator.\n * Dependent cells that encounter a Pending value also become pending.\n */\nexport class Pending<T = unknown> {\n private readonly timestamp: number;\n\n public readonly promise: Promise<T>;\n public readonly __gsType = 'Pending' as const;\n\n constructor(promise: Promise<T>) {\n this.promise = promise;\n this.timestamp = Date.now();\n }\n\n static is(obj: any): obj is Pending {\n return obj instanceof Pending || obj?.__gsType === 'Pending';\n }\n\n toString(): string {\n return `<Pending #${this.timestamp}>`;\n }\n}\n\n/**\n * Returned by functions that want to spill a 2D result into adjacent cells.\n *\n * Usage in a function:\n * return new Spilling([[1, 2], [3, 4]]);\n *\n * The solver detects Spilling via `Spilling.is()` and calls\n * `sheet.spill(origin, result.matrix)` to perform obstruction checks\n * and write values into the solvedCaches.\n */\nexport class Spilling {\n public readonly __gsType = 'Spilling' as const;\n /** The 2D matrix of resolved values. matrix[row][col] */\n public readonly matrix: any[][];\n\n constructor(matrix: any[] | any[][]) {\n this.matrix = this.ensure2D(matrix);\n }\n\n private ensure2D(matrix: any[] | any[][]): any[][] {\n if (matrix.length === 0) {\n return [];\n }\n if (Array.isArray(matrix[0])) {\n return matrix as any[][];\n }\n // 1D array is treated as a single row (horizontal expansion).\n // e.g. [1, 2, 3] → [[1, 2, 3]]\n // To expand vertically instead, use: matrix.map(v => [v])\n return [matrix as any[]];\n }\n\n static is(obj: any): obj is Spilling {\n return obj instanceof Spilling || obj?.__gsType === 'Spilling';\n }\n}\n","import { a2p, buildIdentifiedRef, grantAddressAbsolute, p2a } from '../lib/coords';\nimport { Sheet } from '../lib/sheet';\nimport { Id, PointType } from '../types';\nimport { FormulaError } from './formula-error';\n\ntype EvaluateProps = {\n sheet: Sheet;\n};\n\ntype IdentityBaseProps = {\n slideY?: number;\n slideX?: number;\n operation?: 'move' | 'removeRows' | 'removeCols';\n dependency: Id;\n};\n\nexport type ProcessFormulaProps = IdentityBaseProps & {\n idMap?: { [id: string]: string };\n};\n\nexport type IdentifyProps = IdentityBaseProps & {\n sheet: Sheet;\n};\n\nexport type DisplayProps = {\n sheet: Sheet;\n slideY?: number;\n slideX?: number;\n};\n\n// strip sharp and dollars\nconst stripId = (idString: string, stripAbsolute = true) => {\n let id = idString;\n if (stripAbsolute && id.startsWith('$')) {\n id = id.slice(1);\n }\n if (stripAbsolute && id.endsWith('$')) {\n id = id.slice(0, -1);\n }\n return id.replace('#', '');\n};\n\nclass Entity<T = any> {\n public value: T;\n public ids: string[] = [];\n constructor(value: T) {\n this.value = value;\n }\n}\n\nexport class ValueEntity extends Entity {\n public evaluate() {\n return this.value;\n }\n}\n\nexport class UnreferencedEntity extends Entity {\n public evaluate() {\n throw new FormulaError('#REF!', `Reference does not exist.`);\n }\n}\n\nexport class InvalidRefEntity extends Entity<string> {\n public evaluate() {\n throw new FormulaError('#NAME?', `Invalid ref: ${this.value}`);\n }\n}\n\nexport class RefEntity extends Entity<string> {\n constructor(value: string) {\n super(value);\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const { y, x } = a2p(parsed.addresses[0]);\n const t = parsed.sheet.trim({ top: y, left: x, bottom: y, right: x });\n return t;\n }\n\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const address = parsed.addresses[0];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids = [id];\n return `#${parsed.sheet.id}!${buildIdentifiedRef(id, absX, absY)}`;\n }\n}\n\nexport class RangeEntity extends Entity<string> {\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const area = parsed.sheet.rangeToArea(parsed.addresses.join(':'));\n const t = parsed.sheet.trim(area);\n return t;\n }\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const formulas: string[] = [];\n for (let i = 0; i < parsed.addresses.length; i++) {\n const address = parsed.addresses[i];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids.push(id);\n formulas.push(buildIdentifiedRef(id, absX, absY));\n }\n return `#${parsed.sheet.id}!${formulas.join(':')}`;\n }\n}\n\nexport class IdEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; id: string } {\n if (this.value.indexOf('!') !== -1) {\n const [sheetIdStr, id] = this.value.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, id: stripId(id, false) };\n }\n return { sheet, id: stripId(this.value, false) };\n }\n public evaluate({ sheet }: EvaluateProps) {\n const parsed = this.parse(sheet);\n if (parsed.id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const { y, x } = parsed.sheet.getPointById(parsed.id);\n const [absY, absX] = [Math.abs(y), Math.abs(x)];\n return parsed.sheet.trim({\n top: absY,\n left: absX,\n bottom: absY,\n right: absX,\n });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const address = parsed.sheet.getAddressById(parsed.id, slideY, slideX);\n if (!address) {\n return '#REF!';\n }\n if (parsed.sheet.id === sheet.id) {\n return address;\n }\n return `${parsed.sheet.sheetPrefix()}${address}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const address = this.display({ sheet, slideY, slideX });\n if (address == null || address.length < 2) {\n return '#?';\n }\n const { formula, ids } = parseRef(address, props);\n this.ids = ids;\n return formula || '#?';\n }\n}\n\nexport class IdRangeEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; ids: string[] } {\n const range = this.value;\n if (range.indexOf('!') !== -1) {\n const [sheetIdStr, idRange] = range.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, ids: idRange.split(':') };\n }\n return { sheet, ids: range.split(':') };\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = this.parse(sheet);\n const ids = parsed.ids.map((id) => stripId(id));\n const ps: PointType[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const p = parsed.sheet.getPointById(id);\n ps.push(p);\n }\n const [p1, p2] = ps;\n const [top, left, bottom, right] = [p1.y, p1.x, p2.y || parsed.sheet.numRows, p2.x || parsed.sheet.numCols];\n return parsed.sheet.trim({ top, left, bottom, right });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const range = parsed.ids\n .map((id) => stripId(id, false))\n .map((id) => parsed.sheet.getAddressById(id, slideY, slideX) || '#REF!')\n .join(':');\n if (parsed.sheet.id === sheet.id) {\n return range;\n }\n return `${parsed.sheet.sheetPrefix()}${range}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const range = this.display({ sheet, slideY, slideX });\n const { formula, ids } = parseRef(range, props);\n this.ids = ids;\n // When the range can't be resolved (e.g. an autofill slid it off-sheet so display yields\n // \"#REF!:#REF!\"), parseRef returns no formula. Fall back to the broken-reference marker\n // \"#?\" — matching RefEntity/IdEntity — instead of \"\" which would DROP the whole argument\n // (turning =F(a, C2:C6, b) into =F(a, , b) and corrupting the formula's arity).\n return formula || '#?';\n }\n}\n\nexport class FunctionEntity {\n public args: Expression[];\n public name: string;\n public precedence: number;\n private at?: Id;\n constructor(name: string, precedence = 0, args: Expression[] = [], at?: Id) {\n this.name = name;\n this.precedence = precedence;\n this.args = args;\n this.at = at;\n }\n\n public evaluate({ sheet }: EvaluateProps): any {\n const name = this.name.toLowerCase();\n const Func = sheet.getFunctionByName(name);\n if (Func == null) {\n throw new FormulaError('#NAME?', `Unknown function: ${name}`);\n }\n const func = new Func({ args: this.args, sheet, at: this.at });\n return func.call();\n }\n}\n\nexport type Expression =\n | ValueEntity\n | RefEntity\n | RangeEntity\n | IdEntity\n | IdRangeEntity\n | FunctionEntity\n | UnreferencedEntity\n | InvalidRefEntity;\n\nconst ZERO = new ValueEntity(0);\n\nexport type TokenType =\n | 'VALUE'\n | 'REF'\n | 'RANGE'\n | 'ID'\n | 'ID_RANGE'\n | 'FUNCTION'\n | 'PREFIX_OPERATOR'\n | 'INFIX_OPERATOR'\n | 'POSTFIX_OPERATOR'\n | 'OPEN'\n | 'CLOSE'\n | 'COMMA'\n | 'SPACE'\n | 'UNREFERENCED'\n | 'INVALID_REF';\n\nconst INFIX_FUNCTION_NAME_MAP = {\n '+': 'add',\n '-': 'minus',\n '/': 'divide',\n '*': 'multiply',\n '^': 'power',\n '&': 'concat',\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nconst PREFIX_FUNCTION_NAME_MAP = {\n '-': 'uminus',\n};\n\nconst WHITESPACE_CHARS = new Set([' ', '\\n', '\\r', '\\t', '\\f']);\nconst SPECIAL_CHARS = new Set([...WHITESPACE_CHARS, '+', '-', '/', '*', '^', '&', '=', '<', '>', ')', ',', '%']);\n\nexport class Token {\n type: TokenType;\n entity: any;\n precedence: number;\n closed: boolean;\n raw?: string;\n private at?: Id;\n\n constructor(type: TokenType, entity: any, precedence = 0, at?: Id, closed = true) {\n this.type = type;\n this.entity = entity;\n this.precedence = precedence;\n this.at = at;\n this.closed = closed;\n }\n\n public length() {\n if (this.type === 'VALUE' && typeof this.entity === 'string') {\n return this.entity.length + (this.closed ? 2 : 1);\n }\n return new String(this.entity).length;\n }\n\n public stringify() {\n if (this.type === 'VALUE') {\n if (typeof this.entity === 'string') {\n return this.closed ? `\"${this.entity}\"` : `\"${this.entity}`;\n }\n if (typeof this.entity === 'boolean') {\n return this.entity ? 'TRUE' : 'FALSE';\n }\n if (this.raw != null) {\n return this.raw;\n }\n }\n return this.entity as string;\n }\n\n public convert() {\n switch (this.type) {\n case 'VALUE':\n return new ValueEntity(this.entity);\n\n case 'ID':\n return new IdEntity(this.entity as string);\n\n case 'ID_RANGE':\n return new IdRangeEntity(this.entity as string);\n\n case 'REF':\n return new RefEntity(this.entity as string);\n\n case 'RANGE':\n return new RangeEntity(this.entity as string);\n\n case 'INFIX_OPERATOR': {\n const name = INFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof INFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'PREFIX_OPERATOR': {\n const name = PREFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof PREFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'FUNCTION':\n return new FunctionEntity(this.entity as string, 0, [], this.at);\n\n case 'UNREFERENCED':\n return new UnreferencedEntity(this.entity);\n\n case 'INVALID_REF':\n return new InvalidRefEntity(this.entity as string);\n }\n }\n}\n\nconst isWhiteSpace = (char: string) => {\n return WHITESPACE_CHARS.has(char);\n};\n\nconst BOOLS: { [s: string]: boolean } = { ['true']: true, ['false']: false };\n\nconst TOKEN_OPEN = new Token('OPEN', '('),\n TOKEN_CLOSE = new Token('CLOSE', ')'),\n TOKEN_COMMA = new Token('COMMA', ',');\n\nconst INFIX_OPERATOR = 'INFIX_OPERATOR';\nconst PREFIX_OPERATOR = 'PREFIX_OPERATOR';\nconst POSTFIX_OPERATOR = 'POSTFIX_OPERATOR';\n\ntype LexerOption = {\n at?: Id;\n};\n\nexport class Lexer {\n private index: number;\n private formula: string;\n public tokens: Token[] = [];\n public foreign: boolean = false;\n public identifiedFormula: string = '';\n public dependencyIds: string[] = [];\n private at?: Id;\n\n constructor(formula: string, options?: LexerOption) {\n this.formula = formula;\n this.index = 0;\n this.tokens = [];\n this.at = options?.at;\n }\n\n private isWhiteSpace() {\n return isWhiteSpace(this.formula[this.index]);\n }\n\n private next(base = 1) {\n this.index += base;\n }\n\n private get(base = 0) {\n const c = this.formula[this.index + base];\n return c;\n }\n\n private getToken(base = 0) {\n return this.tokens[this.tokens.length + base];\n }\n\n public getTokenIndexByCharPosition(pos: number): [number, boolean] {\n // return [index, edge]\n let start = 0,\n end = 0;\n\n for (let i = 0; i < this.tokens.length; i++) {\n const token = this.tokens[i];\n end = start + token.length();\n if (start <= pos && pos <= end) {\n return [i, pos === start || pos === end];\n }\n start = end;\n }\n return [-1, false];\n }\n\n public getTokenPositionRange(index: number, slide = 1): [number, number] {\n let start = 0,\n end = 0;\n for (let i = 0; i < index; i++) {\n start = end;\n end += this.tokens[i].length();\n }\n return [start + slide, end + slide];\n }\n\n public stringify() {\n return this.tokens.map((t) => t.stringify()).join('');\n }\n\n public identify(props: IdentifyProps): void {\n const parts: string[] = [];\n const ids: string[] = [];\n for (const t of this.tokens) {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n parts.push(String(t.entity));\n } else {\n parts.push(t.closed ? `\"${t.entity}\"` : `\"${t.entity}`);\n }\n break;\n case 'ID': {\n const entity = new IdEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'ID_RANGE': {\n const entity = new IdRangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'REF': {\n const entity = new RefEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'RANGE': {\n const entity = new RangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n default:\n parts.push(t.entity);\n break;\n }\n }\n this.identifiedFormula = parts.join('');\n this.dependencyIds = ids;\n }\n\n public display({ sheet }: DisplayProps) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.raw ?? t.entity;\n }\n return t.closed ? `\"${t.entity}\"` : `\"${t.entity}`;\n case 'ID':\n return new IdEntity(t.entity as string).display({ sheet });\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).display({ sheet });\n }\n return t.entity;\n })\n .join('');\n }\n\n public tokenize(idMap: { [id: Id]: Id } = {}) {\n while (this.index <= this.formula.length) {\n this.skipSpaces();\n let char = this.get();\n this.next();\n switch (char) {\n case undefined:\n return;\n case '(':\n this.tokens.push(TOKEN_OPEN);\n continue;\n case ')':\n this.tokens.push(TOKEN_CLOSE);\n continue;\n case ',':\n this.tokens.push(TOKEN_COMMA);\n continue;\n case '+':\n // TOKEN_PLUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '+', 3, this.at));\n continue;\n case '-': {\n const prev1 = this.getToken(-1)?.type;\n const prev2 = this.getToken(-2)?.type;\n if (prev1 === INFIX_OPERATOR || (prev1 === 'SPACE' && prev2 === INFIX_OPERATOR)) {\n // TOKEN_UMINUS(6)\n this.tokens.push(new Token(PREFIX_OPERATOR, '-', 6, this.at));\n } else {\n // TOKEN_MINUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '-', 3, this.at));\n }\n continue;\n }\n case '/':\n // TOKEN_DIVIDE(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '/', 4, this.at));\n continue;\n case '*':\n // TOKEN_MULTIPLY(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '*', 4, this.at));\n continue;\n case '^':\n // TOKEN_POWER(5)\n this.tokens.push(new Token(INFIX_OPERATOR, '^', 5, this.at));\n continue;\n case '&':\n // TOKEN_CONCAT(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '&', 4, this.at));\n continue;\n case '=':\n // TOKEN_EQ(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '=', 1, this.at));\n continue;\n case '>':\n if (this.get() === '=') {\n this.next();\n // TOKEN_GTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>=', 2, this.at));\n continue;\n }\n // TOKEN_GT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>', 2, this.at));\n continue;\n case '<':\n if (this.get() === '=') {\n this.next();\n // TOKEN_LTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<=', 2, this.at));\n continue;\n }\n if (this.get() === '>') {\n this.next();\n // TOKEN_NE(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '<>', 1, this.at));\n continue;\n }\n // TOKEN_LT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<', 2, this.at));\n continue;\n case '\"': {\n const { buf, closed } = this.getString('\"');\n // TOKEN_VALUE(0)\n this.tokens.push(new Token('VALUE', buf, 0, this.at, closed));\n continue;\n }\n case \"'\": {\n const { buf } = this.getString(\"'\");\n char = `'${buf}'`;\n break;\n }\n case '!': {\n this.foreign = true;\n break;\n // not continue\n }\n case '%': {\n // TOKEN_PERCENT(4)\n this.tokens.push(new Token(POSTFIX_OPERATOR, '%', 4, this.at));\n continue;\n }\n } // switch end\n let buf = char;\n\n while (true) {\n const c = this.get();\n if (c === '(') {\n // TOKEN_FUNCTION(0)\n this.tokens.push(new Token('FUNCTION', buf, 0, this.at), TOKEN_OPEN);\n this.next();\n break;\n }\n if (c == null || SPECIAL_CHARS.has(c)) {\n if (buf.length === 0) {\n break;\n }\n if (buf.match(/^[+-]?(\\d*[.])?\\d+$/)) {\n const tok = new Token('VALUE', parseFloat(buf), 0, this.at);\n tok.raw = buf;\n this.tokens.push(tok);\n } else {\n const bool = BOOLS[buf.toLowerCase()];\n if (bool != null) {\n this.tokens.push(new Token('VALUE', bool, 0, this.at));\n } else if (buf.startsWith('#')) {\n if (buf.indexOf('#REF!') !== -1) {\n this.tokens.push(new Token('UNREFERENCED', buf, 0, this.at));\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('ID_RANGE', resolveIdRange(buf, idMap), 0, this.at));\n } else {\n this.tokens.push(new Token('ID', buf, 0, this.at));\n }\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('RANGE', buf, 0, this.at));\n } else {\n // A token containing '.' alongside letters is a partial function name\n // (e.g. \"RANGE.1\" before the opening paren), not a cell reference.\n // Sheet-qualified refs are excluded: a quoted sheet name ('a.csv'!A1)\n // or any '!' means it's a cross-sheet reference, where dots are part\n // of the sheet/file name — not a function.\n const looksLikeFunctionName =\n !buf.startsWith(\"'\") && buf.indexOf('!') === -1 && buf.includes('.') && /[a-zA-Z]/.test(buf);\n if (looksLikeFunctionName || isNaN(buf[buf.length - 1] as unknown as number)) {\n this.tokens.push(new Token('INVALID_REF', buf, 0, this.at));\n } else {\n this.tokens.push(new Token('REF', buf, 0, this.at));\n }\n }\n }\n break;\n }\n buf += c;\n this.next();\n }\n }\n }\n private skipSpaces() {\n let space: string = '';\n while (this.isWhiteSpace()) {\n space += this.formula[this.index++];\n }\n if (space !== '') {\n this.tokens.push(new Token('SPACE', space, 0, this.at));\n }\n }\n\n private getString(quote = '\"'): { buf: string; closed: boolean } {\n let buf = '';\n\n while (true) {\n const c = this.get();\n this.next();\n if (c == null) {\n return { buf, closed: false };\n }\n if (c === quote) {\n if (quote === '\"' && this.get() === quote) {\n // escape for double quotes\n buf += quote;\n this.next();\n continue;\n } else if (quote === \"'\" && this.get() === quote) {\n // keep consecutive single quotes as is\n buf += c;\n continue;\n } else {\n return { buf, closed: true };\n }\n } else {\n buf += c;\n }\n }\n }\n}\n\nconst resolveIdRange = (range: string, idMap: { [id: Id]: Id }) => {\n const [sheetId, refString] = range.split('!');\n const refs = refString.split(':');\n const done = new Set<number>();\n Object.keys(idMap).forEach((before) => {\n const after = idMap[before];\n // #x -> #y, #$x -> #$y, #x$ -> #y$, #$x$ -> #$y$\n const regex = new RegExp(`(\\\\$)?#${before}\\\\b(\\\\$)?`);\n for (let i = 0; i < refs.length; i++) {\n if (done.has(i)) {\n continue;\n }\n const ref = refs[i];\n const replaced = ref.replace(regex, (_: string, prefix: string, suffix: string) => {\n return `${prefix || ''}#${after}${suffix || ''}`;\n });\n if (replaced === ref) {\n continue;\n }\n refs[i] = replaced;\n done.add(i);\n }\n });\n return `${sheetId}!${refs.join(':')}`;\n};\n\nexport class Parser {\n public index = 0;\n public depth = 0;\n public tokens: Token[];\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n public build() {\n const { expr } = this.parse(false);\n return expr;\n }\n\n private parse(underFunction: boolean) {\n const stack: Expression[] = [];\n let lastOperator: undefined | FunctionEntity;\n\n const complement = (hasNext = false) => {\n if (lastOperator) {\n const outer = stack.pop();\n lastOperator.args.push(outer!);\n }\n return { hasNext, expr: stack.shift() };\n };\n\n while (this.tokens.length > this.index) {\n const token = this.tokens[this.index++];\n if (token.type === 'SPACE') {\n continue;\n }\n if (token.type === 'COMMA') {\n if (!underFunction) {\n throw new FormulaError('#ERROR!', 'Invalid comma');\n }\n return complement(true);\n } else if (\n token.type === 'VALUE' ||\n token.type === 'ID' ||\n token.type === 'ID_RANGE' ||\n token.type === 'REF' ||\n token.type === 'RANGE' ||\n token.type === 'UNREFERENCED' ||\n token.type === 'INVALID_REF'\n ) {\n const expr = token.convert();\n stack.push(expr!);\n } else if (token.type === 'POSTFIX_OPERATOR' && token.entity === '%') {\n const expr = stack.pop();\n if (!expr) {\n throw new FormulaError('#ERROR!', 'Missing expression before %');\n }\n const divideBy100 = new FunctionEntity('divide', 4, [expr, new ValueEntity(100)]);\n stack.push(divideBy100);\n } else if (token.type === 'FUNCTION') {\n this.index++;\n this.depth++;\n const func = token.convert() as FunctionEntity;\n stack.push(func);\n\n while (true) {\n const { expr, hasNext } = this.parse(true);\n if (expr) {\n func.args.push(expr);\n }\n if (!hasNext) {\n break;\n }\n }\n } else if (token.type === 'OPEN') {\n this.depth++;\n const { expr } = this.parse(false);\n stack.push(expr!);\n } else if (token.type === 'CLOSE') {\n if (this.depth-- === 0) {\n throw new FormulaError('#ERROR!', 'Unexpected end paren');\n }\n return complement();\n } else if (token.type === 'INFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n let left = stack.pop();\n if (left == null) {\n if (operator.name === 'minus' || operator.name === 'add') {\n left = ZERO;\n } else {\n throw new FormulaError('#ERROR!', 'Missing left expression');\n }\n }\n\n if (lastOperator == null) {\n operator.args.push(left);\n stack.unshift(operator);\n } else if (operator.precedence > lastOperator.precedence) {\n operator.args.push(left);\n lastOperator.args.push(operator);\n stack.unshift(lastOperator);\n } else {\n const outer = stack.shift();\n operator.args.push(outer!);\n lastOperator.args.push(left);\n stack.unshift(operator);\n }\n lastOperator = operator;\n } else if (token.type === 'PREFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n if (lastOperator) {\n lastOperator.args.push(operator);\n } else {\n stack.unshift(operator);\n }\n lastOperator = operator;\n }\n }\n return complement();\n }\n}\n\n/** Alias for Parser, exported for external tooling (e.g. Debugger). */\nexport const FormulaParser = Parser;\n\nexport const stripSheetName = (sheetName: string) => {\n if (sheetName.charAt(0) === \"'\") {\n sheetName = sheetName.slice(1);\n }\n if (sheetName.charAt(sheetName.length - 1) === \"'\") {\n sheetName = sheetName.slice(0, -1);\n }\n return sheetName;\n};\n\nexport function splitRef(ref: string): { sheetName: string | undefined; addresses: string[] } {\n let sheetName: string | undefined = undefined;\n let addresses: string[] = [];\n\n if (ref.startsWith(\"'\")) {\n let i = 1;\n let name = '';\n\n while (i < ref.length) {\n const char = ref[i];\n const nextChar = ref[i + 1];\n\n if (char === \"'\") {\n if (nextChar === \"'\") {\n name += \"'\";\n i += 2;\n } else if (nextChar === '!') {\n i += 2;\n break;\n } else {\n return { sheetName: undefined, addresses: [] };\n }\n } else {\n name += char;\n i++;\n }\n }\n\n sheetName = name;\n const addressPart = ref.slice(i).trim();\n addresses = addressPart.split(':');\n } else {\n const excl = ref.indexOf('!');\n if (excl !== -1) {\n sheetName = ref.slice(0, excl);\n const addressPart = ref.slice(excl + 1).trim();\n addresses = addressPart.split(':');\n } else {\n addresses = ref.trim().split(':');\n }\n }\n return { sheetName, addresses };\n}\n\nexport const parseRef = (\n ref: string,\n { sheet, operation, dependency }: IdentifyProps,\n): {\n sheet: Sheet;\n sheetId?: number;\n formula?: string;\n sheetName?: string;\n addresses: string[];\n ids: string[];\n} => {\n const { sheetName, addresses } = splitRef(ref);\n const ids: string[] = [];\n if (sheetName) {\n sheet = sheet.getSheetBySheetName(sheetName)!;\n if (sheet == null) {\n return { sheet, sheetName, addresses, ids };\n }\n }\n if (addresses.length === 0) {\n return { sheet, sheetName, addresses, ids };\n }\n const refs: string[] = [];\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n const { y, x, absX, absY } = a2p(address);\n let id = sheet.getId({ y, x });\n\n // if the id is the same as the dependency by the operation,\n // we need to adjust the id based on the operation\n if (id === dependency) {\n if (operation === 'removeRows') {\n id = sheet.getId({ y: y - 1, x });\n } else if (operation === 'removeCols') {\n id = sheet.getId({ y, x: x - 1 });\n }\n }\n if (id == null) {\n refs.push(grantAddressAbsolute(address, !!absX, !!absY) || '?');\n continue;\n }\n ids.push(id);\n refs.push(`${absX ? '$' : ''}#${id}${absY ? '$' : ''}`);\n }\n let formula = `#${sheet.id}!${refs.join(':')}`;\n return {\n sheet,\n sheetName,\n addresses,\n ids,\n formula,\n };\n};\n","import type { AsyncCache, CellType, System } from '../types';\n\nexport const filterCellFields = (cell: CellType, ignoreFields: (keyof CellType)[]): CellType => {\n if (ignoreFields.length === 0) {\n return cell;\n }\n return Object.fromEntries(\n Object.entries(cell).filter(([key]) => !ignoreFields.includes(key as keyof CellType)),\n ) as CellType;\n};\n\n/**\n * Ensure that `registry.systems[id]` exists, initialising it with sensible\n * defaults when missing. Any keys present in `defaults` that are absent on\n * the existing System object are filled in.\n * Returns the (possibly freshly-created) `System` object.\n */\nexport const ensureSys = (\n registry: { systems: Record<string, System> },\n id: string,\n defaults: Partial<System> = {},\n): System => {\n if (registry.systems[id] == null) {\n registry.systems[id] = {};\n }\n const sys = registry.systems[id];\n for (const key of Object.keys(defaults) as (keyof System)[]) {\n (sys as any)[key] ??= defaults[key];\n }\n return sys;\n};\n\n/**\n * Write an `AsyncCache` entry into `cell.asyncCaches[key]`, creating the\n * `asyncCaches` record if it does not yet exist.\n */\nexport const setAsyncCache = (cell: CellType, key: string, ac: AsyncCache): void => {\n if (!cell.asyncCaches) {\n cell.asyncCaches = {};\n }\n cell.asyncCaches[key] = ac;\n};\n","import type { Address, AreaType, CellsByAddressType, CellType, Id } from '../types';\nimport type { UserSheet } from './sheet';\nimport { a2p, p2a, x2c, c2x, y2r } from './coords';\nimport { createMatrix } from './spatial';\nimport { filterCellFields } from './cell';\nimport type { CellFilter, Resolution } from '../types';\nimport type { SolveOptions } from '../formula/solver';\n\nconst noFilter: CellFilter = () => true;\n\ntype CellField = keyof CellType;\n\ntype ToProps = {\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n area?: AreaType;\n};\n\ntype ToCellProps = ToProps & {\n ignoreFields?: CellField[];\n};\n\n/**\n * @internal — used by Sheet._toValueMatrix and solver.ts; keeps resolution for internal wiring.\n */\n\nexport type ToValueMatrixProps = ToProps;\n\nexport type ToCellMatrixProps = ToCellProps;\n\nexport type ToValueObjectProps = ToProps & {\n addresses?: Address[];\n};\n\nexport type ToCellObjectProps = ToCellProps & {\n addresses?: Address[];\n};\n\nexport type ToValueRowsProps = ToProps & {\n rows?: number[];\n};\n\nexport type ToCellRowsProps = ToCellProps & {\n rows?: number[];\n};\n\nexport type ToValueColsProps = ToProps & {\n cols?: (number | string)[];\n};\n\nexport type ToCellColsProps = ToCellProps & {\n cols?: (number | string)[];\n};\n\nexport const getCellByAddress = (\n sheet: UserSheet,\n address: Address,\n options: SolveOptions = {},\n): CellType | undefined => {\n const point = a2p(address);\n return sheet.getCell(point, options);\n};\n\nexport const toValueMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, asScalar = false }: ToValueMatrixProps = {},\n): any[][] => {\n return sheet.__raw__._toValueMatrix({ area, resolution, raise, filter, asScalar });\n};\n\nexport type ToValueMatrixAsyncProps = ToValueMatrixProps & {\n /** Wall-clock budget (ms) to spend before yielding a chunk. Default 12 (≈one frame). */\n frameBudgetMs?: number;\n /** Called after each chunk with row-granular progress (and once at 0 and at 100%). */\n onProgress?: (progress: { done: number; total: number }) => void;\n /** How to yield between chunks. Pass a macrotask/rAF yielder so the UI can paint. */\n yieldControl?: () => Promise<void> | void;\n};\n\n/**\n * Async, progress-reporting, non-blocking counterpart to {@link toValueMatrix}.\n * Materializing every cell (lazy population + formula solve) is O(cells) and\n * blocks the thread; this time-slices the scan, reports progress, and yields so\n * the host stays responsive and can render a progress bar. Returns the same\n * matrix as toValueMatrix.\n */\nexport const toValueMatrixAsync = (\n sheet: UserSheet,\n {\n area,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n frameBudgetMs,\n onProgress,\n yieldControl,\n }: ToValueMatrixAsyncProps = {},\n): Promise<any[][]> => {\n return sheet.__raw__._toValueMatrixAsync({\n area,\n resolution,\n raise,\n filter,\n asScalar,\n frameBudgetMs,\n onProgress,\n yieldControl,\n });\n};\n\nexport const toValueObject = (\n sheet: UserSheet,\n {\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n addresses,\n area,\n asScalar = false,\n }: ToValueObjectProps = {},\n): { [address: Address]: any } => {\n const result: { [Address: Address]: any } = {};\n if (addresses) {\n for (const addr of addresses) {\n const point = a2p(addr);\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy(point);\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point });\n }\n result[addr] = fieldValue;\n }\n }\n return result;\n }\n const { top, left, bottom, right } = area ?? sheet.area;\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n result[p2a({ y, x })] = fieldValue;\n }\n }\n }\n return result;\n};\n\nexport const toValueRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, area, asScalar = false }: ToValueRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n row[x2c(x)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toValueCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, area, asScalar = false }: ToValueColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n col[y2r(y)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toCellMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, ignoreFields = [] }: ToCellMatrixProps = {},\n): (CellType | null)[][] => {\n const { top, left, bottom, right } = area ?? sheet.area;\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n const filteredCell = filterCellFields(cell, ignoreFields);\n matrix[y - top][x - left] = filteredCell;\n }\n }\n }\n return matrix;\n};\n\nexport const toCellObject = (\n sheet: UserSheet,\n {\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n addresses,\n area,\n ignoreFields = [],\n }: ToCellObjectProps = {},\n): CellsByAddressType => {\n const result: CellsByAddressType = {};\n if (addresses) {\n for (const addr of addresses) {\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[addr] = filterCellFields(cell, ignoreFields);\n }\n }\n return result;\n }\n const { top, left, bottom, right } = area ?? sheet.area;\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[p2a({ y, x })] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const toCellRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, area, ignoreFields = [] }: ToCellRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n row[x2c(x)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const escapeSheetName = (name: string): string => {\n const escaped = name.replace(/'/g, \"''\");\n return `'${escaped}'`;\n};\n\nexport const toSheetPrefix = (name?: string): string => {\n if (name) {\n return `${escapeSheetName(name)}!`;\n }\n return '';\n};\n\nexport const toCellCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, area, ignoreFields = [] }: ToCellColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = area ?? sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n col[y2r(y)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n","import { OperationType as operations } from '../types';\n\nexport const RemoveRows: operations = 0b00000000000000000000000000000000000000000000000000001; // 1\nexport const RemoveCols: operations = 0b00000000000000000000000000000000000000000000000000010; // 2\nexport const InsertRowsAbove: operations = 0b00000000000000000000000000000000000000000000000000100; // 4\nexport const InsertRowsBelow: operations = 0b00000000000000000000000000000000000000000000000001000; // 8\nexport const InsertColsLeft: operations = 0b00000000000000000000000000000000000000000000000010000; // 16\nexport const InsertColsRight: operations = 0b00000000000000000000000000000000000000000000000100000; // 32\nexport const MoveFrom: operations = 0b00000000000000000000000000000000000000000000001000000; // 64\nexport const MoveTo: operations = 0b00000000000000000000000000000000000000000000010000000; // 128\nexport const Write: operations = 0b00000000000000000000000000000000000000000000100000000; // 256\nexport const Style: operations = 0b00000000000000000000000000000000000000000001000000000; // 512\nexport const Copy: operations = 0b00000000000000000000000000000000000000010000000000000; // 8192\nexport const Resize: operations = 0b00000000000000000000000000000000000000000010000000000; // 1024\nexport const SetPolicy: operations = 0b00000000000000000000000000000000000000100000000000000; // 16384\nexport const Sort: operations = 0b00000000000000000000000000000000000001000000000000000; // 32768\nexport const Filter: operations = 0b00000000000000000000000000000000000010000000000000000; // 65536\nexport const SetLabel: operations = 0b00000000000000000000000000000000000100000000000000000; // 131072\n\nexport const NoOperation: operations = 0;\n\nexport const Move: operations = MoveFrom | MoveTo; // 192\n\nexport const Update: operations = Write | Style | Copy | Resize | SetPolicy | SetLabel;\n\nexport const InsertRows: operations = InsertRowsAbove | InsertRowsBelow; // 12\n\nexport const InsertCols: operations = InsertColsLeft | InsertColsRight; // 48\n\nexport const Add: operations = InsertRows | InsertCols; // 60\n\nexport const Delete: operations = RemoveRows | RemoveCols; // 3\n\nexport const ReadOnly: operations = Update | Delete | Add | Move;\n\nexport const ColumnMenu: operations = Filter | Sort | SetLabel;\n\nexport const RowMenu: operations = 0b00000000000000000000000000000000010000000000000000000; // 524288\n\nexport const ViewOnly: operations = ReadOnly | ColumnMenu;\n\nexport const hasOperation = (operation: operations | undefined, flag: operations) => {\n if (operation === undefined) {\n return false;\n }\n return (operation & flag) === flag;\n};\n\n// Don't use this function in production\nexport const debugOperations = (prevention: operations | undefined) => {\n const operations: string[] = [];\n if (hasOperation(prevention, RemoveRows)) {\n operations.push('RemoveRow');\n }\n if (hasOperation(prevention, RemoveCols)) {\n operations.push('RemoveCol');\n }\n if (hasOperation(prevention, InsertRowsAbove)) {\n operations.push('InsertRowAbove');\n }\n if (hasOperation(prevention, InsertRowsBelow)) {\n operations.push('InsertRowBelow');\n }\n if (hasOperation(prevention, InsertColsLeft)) {\n operations.push('InsertColLeft');\n }\n if (hasOperation(prevention, InsertColsRight)) {\n operations.push('InsertColRight');\n }\n if (hasOperation(prevention, MoveFrom)) {\n operations.push('MoveFrom');\n }\n if (hasOperation(prevention, MoveTo)) {\n operations.push('MoveTo');\n }\n if (hasOperation(prevention, Write)) {\n operations.push('Write');\n }\n if (hasOperation(prevention, Style)) {\n operations.push('Style');\n }\n if (hasOperation(prevention, Resize)) {\n operations.push('Resize');\n }\n if (hasOperation(prevention, SetPolicy)) {\n operations.push('SetPolicy');\n }\n if (hasOperation(prevention, SetLabel)) {\n operations.push('SetLabel');\n }\n if (hasOperation(prevention, Sort)) {\n operations.push('Sort');\n }\n if (hasOperation(prevention, Filter)) {\n operations.push('Filter');\n }\n return operations;\n};\n","import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport timezone from 'dayjs/plugin/timezone.js';\ndayjs.extend(timezone);\ndayjs.extend(utc);\n\nconst NUMS = new Set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);\nconst NUMS_Z = new Set([...NUMS, 'Z', 'z']);\nconst JFMASOND = new Set(['J', 'F', 'M', 'A', 'S', 'O', 'N', 'D', ...NUMS]);\nconst NBRYNLGPTVC = new Set(['N', 'B', 'R', 'Y', 'N', 'L', 'G', 'P', 'T', 'V', 'C', ...NUMS_Z]);\n\n// Reject strings that contain words not typically found in date representations.\n// Date strings consist of month names, digits, separators, and timezone abbreviations.\n// If a word is purely alphabetic and not a recognized date token, it's likely not a date.\nconst DATE_WORDS = new Set([\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n 'january',\n 'february',\n 'march',\n 'april',\n 'june',\n 'july',\n 'august',\n 'september',\n 'october',\n 'november',\n 'december',\n 'mon',\n 'tue',\n 'wed',\n 'thu',\n 'fri',\n 'sat',\n 'sun',\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n 'am',\n 'pm',\n 'utc',\n 'gmt',\n 'est',\n 'cst',\n 'mst',\n 'pst',\n 'jst',\n 'cet',\n 'eet',\n 'ist',\n 'aest',\n 'edt',\n 'cdt',\n 'mdt',\n 'pdt',\n 'bst',\n 'hst',\n 'akst',\n 'akdt',\n 'nzst',\n 'nzdt',\n 't',\n 'z',\n]);\n\nexport function parseDate(value: string): Date | undefined {\n const first = value[0];\n if (first == null || !JFMASOND.has(first.toUpperCase())) {\n return;\n }\n if (!NBRYNLGPTVC.has(value[value.length - 1].toUpperCase())) {\n return;\n }\n if (value.match(/[=*&#@!?[\\]{}\"'()|%\\\\<>~+\\r\\n]/)) {\n return;\n }\n const words = value.split(/[\\s,/\\-:.]+/).filter(Boolean);\n for (const word of words) {\n if (/^[a-zA-Z]+$/.test(word) && !DATE_WORDS.has(word.toLowerCase())) {\n return;\n }\n }\n let timeZone = 'UTC';\n try {\n timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {}\n try {\n const day = dayjs.tz(value, timeZone);\n return day.toDate();\n } catch (e) {}\n}\n","import type { CellPatchType, CellType, OperationType, PointType } from '../types';\nimport type { Sheet, UserSheet } from '../lib/sheet';\nimport { isSheet } from '../formula/functions/__base';\nimport dayjs from 'dayjs';\nimport { FormulaError } from '../formula/formula-error';\nimport { Pending } from '../sentinels';\nimport { Time } from '../lib/time';\nimport { parseDate } from '../lib/date';\n\nexport type AutocompleteOption = {\n value: any;\n label?: any;\n keywords?: string[];\n tooltip?: any;\n};\n\nexport type SelectProps = {\n sheet: UserSheet;\n point: PointType;\n current?: CellType;\n next?: CellType;\n operation: OperationType;\n};\n\nexport type SerializeForClipboardProps = {\n sheet: UserSheet;\n point: PointType;\n};\n\nexport type SelectFallbackProps = {\n sheet: UserSheet;\n point: PointType;\n value: any;\n};\n\nexport type Scalar = string | number | boolean | null | undefined;\n\nexport type ScalarProps<T = any> = {\n value?: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type RenderProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n apply?: (sheet: UserSheet) => void;\n};\n\nexport type SerializeProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type PolicyMixinType = {\n // format settings\n datetimeFormat?: string;\n dateFormat?: string;\n timeFormat?: string;\n decimalPrecision?: number;\n\n // render\n render?: (props: RenderProps) => any;\n renderCallback?: (rendered: any, props: RenderProps) => any;\n renderString?: (props: RenderProps<string>) => any;\n renderNumber?: (props: RenderProps<number>) => any;\n renderBool?: (props: RenderProps<boolean>) => any;\n renderDate?: (props: RenderProps<Date>) => any;\n renderTime?: (props: RenderProps<Time>) => any;\n renderArray?: (props: RenderProps<any[]>) => any;\n renderObject?: (props: RenderProps<any>) => any;\n renderNull?: (props: RenderProps<null | undefined>) => any;\n renderSheet?: (props: RenderProps<UserSheet>) => any;\n renderRowHeaderLabel?: (n: number) => string | null;\n renderColHeaderLabel?: (n: number) => string | null;\n\n // serialize\n serialize?: (props: SerializeProps) => string;\n serializeString?: (props: SerializeProps<string>) => string;\n serializeNumber?: (props: SerializeProps<number>) => string;\n serializeBool?: (props: SerializeProps<boolean>) => string;\n serializeDate?: (props: SerializeProps<Date>) => string;\n serializeTime?: (props: SerializeProps<Time>) => string;\n serializeArray?: (props: SerializeProps<any[]>) => string;\n serializeNull?: (props: SerializeProps<null | undefined>) => string;\n serializeFormulaError?: (props: SerializeProps<FormulaError>) => string;\n serializeError?: (props: SerializeProps<Error>) => string;\n\n // deserialize\n deserialize?: (value: string, cell?: CellType) => CellType;\n deserializeRaw?: (value: any, cell?: CellType) => CellType;\n deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n // Priority slot: called before built-in deserializers when defined\n deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n // Built-in deserializers\n deserializeNumber?: (value: string, cell?: CellType) => CellPatchType<number | undefined>;\n deserializeBool?: (value: string, cell?: CellType) => CellPatchType<boolean | undefined>;\n deserializeDate?: (value: string, cell?: CellType) => CellPatchType<Date | undefined>;\n deserializeTime?: (value: string, cell?: CellType) => CellPatchType<Time | undefined>;\n deserializeAny?: (value: string, cell?: CellType) => CellPatchType<string | undefined>;\n\n // toScalar\n toScalar?: (props: ScalarProps) => Scalar;\n toScalarString?: (props: ScalarProps<string>) => Scalar;\n toScalarNumber?: (props: ScalarProps<number>) => Scalar;\n toScalarBool?: (props: ScalarProps<boolean>) => Scalar;\n toScalarDate?: (props: ScalarProps<Date>) => Scalar;\n toScalarTime?: (props: ScalarProps<Time>) => Scalar;\n toScalarArray?: (props: ScalarProps<any[]>) => Scalar;\n toScalarNull?: (props: ScalarProps<null | undefined>) => Scalar;\n\n // select\n getSelectOptions?: () => AutocompleteOption[];\n getSelectFallback?: (props: SelectFallbackProps) => CellType | undefined;\n select?: (props: SelectProps) => CellType | undefined;\n serializeForClipboard?: (props: SerializeForClipboardProps) => string;\n};\n\ntype PolicyProps = {\n mixins?: PolicyMixinType[];\n priority?: number;\n};\n\nconst BOOLS = { true: true, false: false } as { [s: string]: boolean };\n\nexport class Policy implements PolicyMixinType {\n public priority: number = 0;\n\n public datetimeFormat: string = 'YYYY-MM-DD HH:mm:ss';\n public dateFormat: string = 'YYYY-MM-DD';\n public timeFormat: string = 'HH:mm:ss';\n public decimalPrecision: number = 14;\n\n public deserializeFunctions: ((value: string, cell?: CellType) => CellPatchType<any>)[] = [];\n public deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n public deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n public renderCallback?: (rendered: any, props: RenderProps) => any;\n\n constructor(props?: PolicyProps) {\n this.priority = props?.priority ?? 1;\n this.applyMixins(props?.mixins);\n\n this.registerDeserializeFunctions();\n }\n\n private registerDeserializeFunctions(): void {\n this.deserializeFunctions = [\n ...(this.deserializeFirst ? [this.deserializeFirst.bind(this)] : []),\n this.deserializeNumber.bind(this),\n this.deserializeTime.bind(this),\n this.deserializeDate.bind(this),\n this.deserializeBool.bind(this),\n this.deserializeAny.bind(this),\n ];\n }\n\n private applyMixins(mixins?: PolicyMixinType[]) {\n if (mixins == null) {\n return;\n }\n const subclassProto = Object.getPrototypeOf(this);\n for (const mixin of mixins) {\n for (const key in mixin) {\n // Methods defined in a subclass take priority over mixins\n const overriddenBySubclass =\n subclassProto !== Policy.prototype && Object.prototype.hasOwnProperty.call(subclassProto, key);\n if (!overriddenBySubclass) {\n (this as any)[key] = (mixin as any)[key];\n }\n }\n }\n }\n\n // --- RENDER ---\n\n public render(props: RenderProps): any {\n let { value, cell } = props;\n const { sheet, point } = props;\n\n // Cell lookup: if cell not provided, resolve from sheet (entry-point usage)\n if (cell == null) {\n cell = sheet.getCell(point, { resolution: 'EVALUATED', raise: true }) ?? {};\n value = cell.value;\n }\n\n let rendered: any;\n\n if (Pending.is(value)) {\n rendered = '';\n } else if (value == null) {\n rendered = this.renderNull({ ...props, value: value as null | undefined, cell });\n } else {\n switch (typeof value) {\n case 'object':\n if (value instanceof Date) {\n rendered = this.renderDate({ ...props, value, cell });\n } else if (Time.is(value)) {\n rendered = this.renderTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n rendered = this.renderArray({ ...props, value, cell });\n } else if (FormulaError.is(value)) {\n throw value;\n } else if (isSheet(value)) {\n rendered = this.renderSheet({ ...props, value, cell });\n } else {\n rendered = this.renderObject({ ...props, value, cell });\n }\n break;\n case 'string':\n rendered = this.renderString({ ...props, value, cell });\n break;\n case 'number':\n rendered = this.renderNumber({ ...props, value, cell });\n break;\n case 'boolean':\n rendered = this.renderBool({ ...props, value, cell });\n break;\n case 'function':\n rendered = (value as () => any)();\n break;\n default:\n rendered = '';\n }\n }\n\n return this.renderCallback ? this.renderCallback(rendered, { ...props, value, cell }) : rendered;\n }\n\n public renderString({ value }: RenderProps<string>): any {\n return value!;\n }\n\n public renderBool({ value }: RenderProps<boolean>): any {\n return value ? 'TRUE' : 'FALSE';\n }\n\n public renderNumber({ value }: RenderProps<number>): any {\n if (isNaN(value!)) {\n return 'NaN';\n }\n return parseFloat(value!.toPrecision(this.decimalPrecision));\n }\n\n public renderDate({ value }: RenderProps<Date>): any {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public renderTime({ value }: RenderProps<Time>): any {\n return value!.stringify(this.timeFormat);\n }\n\n public renderArray(props: RenderProps<any[]>): any {\n let { value, cell } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.render({ ...props, value, cell });\n }\n\n public renderObject({ value }: RenderProps<any>): any {\n return JSON.stringify(value);\n }\n\n public renderNull(_props: RenderProps<null | undefined>): any {\n return '';\n }\n\n public renderSheet({ value: childSheet, ...rest }: RenderProps<UserSheet>): any {\n const at = rest.sheet.getId(rest.point);\n const stripped = childSheet.__raw__.strip({ raise: true, at });\n return this.render({ ...rest, value: stripped });\n }\n\n public renderRowHeaderLabel(_n: number): string | null {\n return null;\n }\n\n public renderColHeaderLabel(_n: number): string | null {\n return null;\n }\n\n // --- TO SCALAR ---\n\n public toScalar(props: ScalarProps): Scalar {\n const { value, cell, sheet, point } = props;\n if (Pending.is(value)) {\n return undefined;\n }\n if (value == null) {\n return this.toScalarNull({ value: value as null | undefined, cell, sheet, point });\n }\n switch (typeof value) {\n case 'string':\n return this.toScalarString({ value, cell, sheet, point });\n case 'number':\n return this.toScalarNumber({ value, cell, sheet, point });\n case 'boolean':\n return this.toScalarBool({ value, cell, sheet, point });\n case 'object':\n if (value instanceof Date) {\n return this.toScalarDate({ value, cell, sheet, point });\n } else if (Time.is(value)) {\n return this.toScalarTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n return this.toScalarArray({ value, cell, sheet, point });\n } else if (FormulaError.is(value)) {\n throw value;\n }\n return undefined;\n default:\n return undefined;\n }\n }\n\n public toScalarString({ value }: ScalarProps<string>): Scalar {\n return value;\n }\n\n public toScalarNumber({ value }: ScalarProps<number>): Scalar {\n return value?.toPrecision(this.decimalPrecision);\n }\n\n public toScalarBool({ value }: ScalarProps<boolean>): Scalar {\n return value;\n }\n\n public toScalarDate({ value }: ScalarProps<Date>): Scalar {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public toScalarTime({ value }: ScalarProps<Time>): Scalar {\n return value!.stringify(this.timeFormat);\n }\n\n public toScalarArray({ value, cell, sheet, point }: ScalarProps<any[]>): Scalar {\n let v = value?.[0];\n if (Array.isArray(v)) {\n v = v[0];\n }\n return this.toScalar({ value: v, cell, sheet, point });\n }\n\n public toScalarNull(_props: ScalarProps<null | undefined>): Scalar {\n return null;\n }\n\n // --- SERIALIZE ---\n\n public serialize({ value, cell, sheet, point }: SerializeProps): string {\n if (value === undefined) {\n value = cell?.value;\n }\n if (Pending.is(value)) {\n return '';\n }\n if (value instanceof Date) {\n return this.serializeDate({ value, cell, sheet, point } as SerializeProps<Date>);\n }\n if (Time.is(value)) {\n return this.serializeTime({ value: Time.ensure(value), cell, sheet, point } as SerializeProps<Time>);\n }\n if (value == null) {\n return this.serializeNull({ cell, sheet, point } as SerializeProps<null | undefined>);\n }\n if (Array.isArray(value)) {\n return this.serializeArray({ value, cell, sheet, point } as SerializeProps<any[]>);\n }\n if (value instanceof FormulaError) {\n return this.serializeFormulaError({ value, cell, sheet, point } as SerializeProps<FormulaError>);\n }\n if (value instanceof Error) {\n return this.serializeError({ value, cell, sheet, point } as SerializeProps<Error>);\n }\n return value.toString();\n }\n\n public serializeString({ value }: SerializeProps<string>): string {\n return value;\n }\n\n public serializeBool({ value }: SerializeProps<boolean>): string {\n return value ? 'true' : 'false';\n }\n\n public serializeNumber({ value }: SerializeProps<number>): string {\n if (isNaN(value)) {\n return 'NaN';\n }\n return parseFloat(value.toPrecision(this.decimalPrecision)).toString();\n }\n\n public serializeDate({ value }: SerializeProps<Date>): string {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public serializeTime({ value }: SerializeProps<Time>): string {\n return value.stringify(this.timeFormat);\n }\n\n public serializeArray(props: SerializeProps<any[]>): string {\n let { value } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.serialize({ ...props, value });\n }\n\n public serializeNull(_props: SerializeProps<null | undefined>): string {\n return '';\n }\n\n public serializeFormulaError({ value }: SerializeProps<FormulaError>): string {\n return value.code;\n }\n\n public serializeError(_props: SerializeProps<Error>): string {\n return '';\n }\n\n public serializeForClipboard(props: SerializeForClipboardProps): string {\n const { point, sheet } = props;\n return sheet.getSerializedValue({ point }) ?? '';\n }\n\n // --- DESERIALIZE ---\n public deserializeValue(value: any, cell: CellType): CellType {\n try {\n const parsed = typeof value !== 'string' ? this.deserializeRaw(value, cell) : this.deserialize(value, cell);\n if (this.deserializeCallback) {\n return this.deserializeCallback(parsed, cell);\n }\n return parsed;\n } catch (e) {\n return { ...cell, value: String(e) };\n }\n }\n\n public deserializeRaw(value: any, cell?: CellType): CellType {\n if (Time.is(value)) {\n value = Time.ensure(value);\n }\n return { ...cell, value };\n }\n\n public deserialize(value: string, cell?: CellType): CellPatchType<any> {\n if (value[0] === \"'\") {\n return { ...cell, value };\n }\n for (let i = 0; i < this.deserializeFunctions.length; i++) {\n const result = this.deserializeFunctions[i](value, cell);\n if (result?.value !== undefined) {\n return { ...cell, ...result };\n }\n }\n if (value === '') {\n return { ...cell, value: undefined };\n }\n return { ...cell, value };\n }\n\n public deserializeAny(value: string, _cell?: CellType): CellPatchType<string | undefined> {\n if (value == null || value === '') {\n return { value: undefined };\n }\n return { value };\n }\n\n public deserializeBool(value: string, _cell?: CellType): CellPatchType<boolean | undefined> {\n return { value: BOOLS[value.toLowerCase()] };\n }\n\n public deserializeNumber(value: string, _cell?: CellType): CellPatchType<number | undefined> {\n const m = value.match(/^-?[\\d.]+$/);\n if (m != null && value.match(/\\.$/) == null && (value.match(/\\./g) || []).length <= 1) {\n return { value: parseFloat(value) };\n }\n return { value: undefined };\n }\n\n public deserializeTime(value: string, _cell?: CellType): CellPatchType<Time | undefined> {\n if (value.length < 3 || isNaN(value[value.length - 1] as unknown as number)) {\n return { value: undefined };\n }\n return { value: Time.parse(value) };\n }\n\n public deserializeDate(value: string, _cell?: CellType): CellPatchType<Date | undefined> {\n return { value: parseDate(value) };\n }\n\n // --- SELECT ---\n\n public getSelectFallback(_props: SelectFallbackProps): any {\n return { value: null };\n }\n\n public getSelectOptions(): AutocompleteOption[] {\n return [];\n }\n\n public select(props: SelectProps): CellType | undefined {\n const { next, sheet, point } = props;\n const options = this.getSelectOptions();\n if (options.length === 0) {\n return next;\n }\n const ok = options.some((o) => o.value === next?.value);\n if (!ok) {\n return { ...next, ...this.getSelectFallback({ sheet, point, value: next?.value }) };\n }\n return next;\n }\n}\n\nexport type PolicyType = Policy;\nexport const DEFAULT_POLICY_NAME = 'default';\nexport const nonePolicy = new Policy({ priority: 0 });\n","import type { FilterCondition, FilterConditionMethod, FilterConfig } from '../types';\nimport { parseDate } from './date';\nimport { Time } from './time';\n\ntype FilterFunction = (condition: FilterCondition, cellValue: any) => boolean;\n\nconst _str = (v: any): string => (v == null ? '' : String(v));\n\ntype ValueType = 'number' | 'date' | 'time' | 'boolean' | 'string';\n\nfunction detectType(cellValue: any): ValueType {\n if (typeof cellValue === 'number') {\n return 'number';\n }\n if (cellValue instanceof Date) {\n return 'date';\n }\n if (Time.is(cellValue)) {\n return 'time';\n }\n if (typeof cellValue === 'boolean') {\n return 'boolean';\n }\n return 'string';\n}\n\nfunction parseAsType(v: string, type: ValueType): { ok: boolean; num: number } {\n switch (type) {\n case 'number': {\n let s = v.replace(/[,_]/g, '');\n let scale = 1;\n if (s.endsWith('%')) {\n s = s.slice(0, -1);\n scale = 0.01;\n }\n const n = Number(s);\n return { ok: !isNaN(n), num: n * scale };\n }\n case 'date': {\n const d = parseDate(v);\n if (!d) {\n return { ok: false, num: NaN };\n }\n return { ok: true, num: d.getTime() };\n }\n case 'time': {\n const td = Time.parse(v);\n return td ? { ok: true, num: td.toMilliseconds() } : { ok: false, num: NaN };\n }\n case 'boolean': {\n const bv = v.toLowerCase();\n if (bv === 'true') {\n return { ok: true, num: 1 };\n }\n if (bv === 'false') {\n return { ok: true, num: 0 };\n }\n return { ok: false, num: NaN };\n }\n default:\n return { ok: false, num: NaN };\n }\n}\n\nfunction toNumeric(cellValue: any, type: ValueType): number {\n switch (type) {\n case 'number':\n return cellValue as number;\n case 'date':\n return (cellValue as Date).getTime();\n case 'time':\n return Time.ensure(cellValue).toMilliseconds();\n case 'boolean':\n return cellValue ? 1 : 0;\n default:\n return NaN;\n }\n}\n\nconst filterEq: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterNe: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return !condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return !condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterGt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) > condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum > parsed.num;\n};\n\nconst filterGte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) >= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum >= parsed.num;\n};\n\nconst filterLt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) < condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum < parsed.num;\n};\n\nconst filterLte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) <= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum <= parsed.num;\n};\n\nconst filterBlank: FilterFunction = (_condition, cellValue) => {\n return cellValue == null || _str(cellValue) === '';\n};\n\nconst filterNonblank: FilterFunction = (_condition, cellValue) => {\n return cellValue != null && _str(cellValue) !== '';\n};\n\nconst filterIncludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nconst filterExcludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return !condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nexport const filterFunctions: Record<FilterConditionMethod, FilterFunction> = {\n eq: filterEq,\n ne: filterNe,\n gt: filterGt,\n gte: filterGte,\n lt: filterLt,\n lte: filterLte,\n blank: filterBlank,\n nonblank: filterNonblank,\n includes: filterIncludes,\n excludes: filterExcludes,\n};\n\nexport function evaluateFilterCondition(condition: FilterCondition, cellValue: any): boolean {\n const fn = filterFunctions[condition.method];\n return fn ? fn(condition, cellValue) : true;\n}\n\nexport function evaluateFilterConfig(filter: FilterConfig, cellValue: any): boolean {\n const mode = filter.mode ?? 'or';\n if (filter.conditions.length === 0) {\n return true;\n }\n if (mode === 'and') {\n return filter.conditions.every((c) => evaluateFilterCondition(c, cellValue));\n } else {\n return filter.conditions.some((c) => evaluateFilterCondition(c, cellValue));\n }\n}\n","import { CellsByIdType, Id } from '../types';\nimport { Sheet } from './sheet';\n\nexport class ReferencePreserver {\n public map: { [id: Id]: Id } = {};\n private sheet: Sheet;\n private dependentIds: Set<Id> = new Set<Id>();\n\n constructor(sheet: Sheet) {\n this.sheet = sheet;\n }\n\n collectDependents(...ids: Id[]) {\n ids.forEach((id) => {\n this.sheet.registry.systems[id]?.dependents?.forEach((did) => {\n this.dependentIds.add(did);\n });\n });\n }\n\n /**\n * Compare two idMatrix snapshots (`before` and `after`) and populate\n * `this.map` and collect dependents for every position where the occupying\n * cell ID changed. Works for any rearrangement (sort, move, etc.).\n */\n buildMap(before: Id[], after: Id[]) {\n for (let i = 0; i < before.length; i++) {\n const prevId = before[i];\n const currId = after[i];\n if (prevId != null && currId != null && prevId !== currId) {\n this.collectDependents(prevId, currId);\n this.map[prevId] = currId;\n }\n }\n }\n\n resolveDependents(operation?: 'move' | 'removeRows' | 'removeCols'): CellsByIdType {\n this.sheet.clearAddressCaches();\n const diffBefore: CellsByIdType = {};\n this.dependentIds.forEach((id) => {\n const dep = this.sheet.registry.data[id];\n if (dep == null) {\n return;\n }\n diffBefore[id] = { ...dep };\n this.sheet.clearDependencies(id);\n dep.value = this.sheet.processFormula(dep.value, {\n dependency: id,\n idMap: this.map,\n operation,\n });\n });\n\n return diffBefore;\n }\n}\n","import {\n Id,\n Ids,\n IdMatrix,\n AreaType,\n CellsByIdType,\n CellsByAddressType,\n PointType,\n Address,\n CellFilter,\n MatrixType,\n CellType,\n FilterConfig,\n HistoryType,\n HistorySortRowsType,\n StorePatchType,\n ShapeType,\n RectType,\n OperatorType,\n OperationType,\n RawCellType,\n ExtraPointType,\n RefLike,\n Resolution,\n MoveRelations,\n Y,\n X,\n System,\n} from '../types';\nimport { among, areaShape, createMatrix, expandRange, getMaxSizesFromCells, matrixShape } from './spatial';\nimport { a2p, x2c, c2x, p2a, y2r, grantAddressAbsolute } from './coords';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { Lexer, ProcessFormulaProps } from '../formula/evaluator';\nimport { FormulaError } from '../formula/formula-error';\nimport { solveFormula, SolveOptions, solveSheet, stripSheet } from '../formula/solver';\nimport { ensureSys, filterCellFields } from './cell';\nimport { escapeSheetName, toSheetPrefix } from './sheet_utils';\n\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n DEFAULT_HISTORY_LIMIT,\n DEFAULT_KEY,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '../constants';\nimport { Pending, SOLVING, NONE, Spilling } from '../sentinels';\nimport * as operation from './operation';\n\nconst shouldTracking = (op: string) => {\n switch (op) {\n case 'INSERT_ROWS':\n case 'INSERT_COLS':\n case 'REMOVE_ROWS':\n case 'REMOVE_COLS':\n case 'MOVE':\n case 'SORT_ROWS':\n return true;\n }\n return false;\n};\nimport { Registry, createRegistry } from './book';\nimport { nonePolicy, PolicyType, DEFAULT_POLICY_NAME, RenderProps, ScalarProps } from '../policy/core';\nimport { evaluateFilterConfig } from './filter';\nimport { ReferencePreserver } from './reference';\n\ntype CellField = keyof CellType;\n\nexport type SheetLimits = {\n minRows?: number;\n maxRows?: number;\n minCols?: number;\n maxCols?: number;\n};\n\ntype Props = {\n limits?: SheetLimits;\n functions?: FunctionMapping;\n name?: string;\n registry?: Registry;\n /** Opt into eager resolution for this sheet (see {@link Sheet.eager}). */\n eager?: boolean;\n};\n\nconst noFilter: CellFilter = () => true;\n\ntype MoveProps = {\n srcSheet?: UserSheet;\n src: AreaType;\n dst: AreaType;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n historicize?: boolean;\n};\n\nexport interface UserSheet {\n changedTime: number;\n lastChangedTime?: number;\n area: AreaType;\n top: number;\n left: number;\n bottom: number;\n right: number;\n minNumRows: number;\n maxNumRows: number;\n minNumCols: number;\n maxNumCols: number;\n headerWidth: number;\n headerHeight: number;\n name: string;\n\n /**\n * Returns the raw sheet object, which is used for internal operations.\n * This is not intended for public use and may change in future versions.\n */\n __raw__: Sheet;\n\n getRectSize(area: AreaType): RectType;\n getCell(point: PointType, options?: { resolution?: Resolution; raise?: boolean }): CellType | undefined;\n getPolicy(point: PointType): PolicyType;\n get numRows(): number;\n get numCols(): number;\n get shape(): ShapeType;\n move(args: MoveProps): UserSheet;\n copy(args: MoveProps & { onlyValue?: boolean }): UserSheet;\n update(args: {\n diff: CellsByAddressType;\n historicize?: boolean;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n writeMatrix(args: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n write(args: { point: PointType; value: string; updateChangedTime?: boolean; reflection?: StorePatchType }): UserSheet;\n insertRows(args: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeRows(args: { y: number; numRows: number; reflection?: StorePatchType }): UserSheet;\n insertCols(args: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeCols(args: { x: number; numCols: number; reflection?: StorePatchType }): UserSheet;\n undo(): {\n history: HistoryType | null;\n };\n redo(): {\n history: HistoryType | null;\n };\n histories(): HistoryType[];\n historyIndex(): number;\n historySize(): number;\n setHeaderHeight(height: number, historicize?: boolean): UserSheet;\n setHeaderWidth(width: number, historicize?: boolean): UserSheet;\n\n sortRows(args: { x: number; direction: 'asc' | 'desc' }): UserSheet;\n\n filterRows(args?: { x?: number; filter?: FilterConfig }): UserSheet;\n isRowFiltered(y: number): boolean;\n hasActiveFilters(): boolean;\n hasPendingCells(): boolean;\n waitForPending(): Promise<void>;\n resolveAll(): number;\n getLastChangedAddresses(): Address[];\n getSerializedValue(props: { point: PointType; cell?: CellType; resolution?: Resolution }): string;\n}\n\ntype InternalToValueMatrixProps = {\n area?: AreaType;\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n at?: Id;\n};\n\ntype _UpdateCtx = {\n partial: boolean;\n updateChangedTime: boolean;\n ignoreFields: CellField[];\n operator: OperatorType;\n op: OperationType;\n formulaIdentify: boolean;\n changedTime: number;\n};\n\ntype _UpdateAccum = {\n diffBefore: CellsByIdType;\n diffAfter: CellsByIdType;\n changedAddresses: Address[];\n};\n\nexport class Sheet implements UserSheet {\n /** @internal */\n public __gsType = 'Sheet';\n /** Cached result of strip (NONE = not yet stripped). */\n private _stripped: any = NONE;\n public changedTime: number;\n public lastChangedTime?: number;\n public area: AreaType = { top: 0, left: 0, bottom: 0, right: 0 };\n\n /** @internal */\n private _limits: Required<SheetLimits>;\n get minNumRows() {\n return this._limits.minRows;\n }\n get maxNumRows() {\n return this._limits.maxRows;\n }\n get minNumCols() {\n return this._limits.minCols;\n }\n get maxNumCols() {\n return this._limits.maxCols;\n }\n /** @internal */\n public id: number = 0;\n public name: string = '';\n /**\n * Opt into eager resolution for this sheet. When enabled, every formula cell\n * is solved regardless of the visible range, so off-screen async formulas fire\n * and fill in instead of staying unevaluated until scrolled into view (see\n * {@link Sheet.resolveAll}).\n *\n * OFF by default to preserve virtualization. Whether to resolve everything is a\n * property of the dataset (how many rows, how costly the async side effects),\n * not of any individual function — so it is scoped per sheet and opted into\n * explicitly rather than inferred from the formulas a sheet happens to contain.\n */\n public eager: boolean = false;\n /** @internal */\n public prevName: string = '';\n /** @internal */\n public status: 0 | 1 | 2 = 0; // 0: not initialized, 1: initialized, 2: formula absoluted\n /** @internal */\n public registry: Registry;\n /** @internal */\n public idsToBeIdentified: Id[] = [];\n /** @internal */\n public totalWidth = 0;\n /** @internal */\n public totalHeight = 0;\n /** @internal */\n public fullHeight = 0;\n /** @internal */\n public defaultColWidth: number = DEFAULT_WIDTH;\n /** @internal */\n public defaultRowHeight: number = DEFAULT_HEIGHT;\n\n /** @internal */\n private version = 0;\n /** @internal */\n private idMatrix: IdMatrix;\n /** @internal */\n private addressCaches: Map<Id, Address> = new Map();\n /**\n * @internal — scan watermark for getPointById misses: the row index up to which every\n * materialized row has been scanned through its LAST column and fully seeded into\n * addressCaches. A miss resumes from here instead of rescanning from 0. Reset to 0\n * whenever addressCaches is cleared/replaced. The row where a target is found is NOT\n * counted (its later columns stay unseeded), so it is re-scanned on the next miss.\n */\n private _addressCacheWatermark = 0;\n /** @internal */\n private lastChangedAddresses: Address[] = [];\n /** @internal — stored cell defaults from initialize() for lazy cell resolution */\n private _initCells: CellsByAddressType | null = null;\n /**\n * @internal — whether _initCells holds any explicit DATA cell (y>=1, x>=1). When false\n * (e.g. the matrices/large-dataset path, which only carries headers + defaults), the\n * per-cell _initCells lookup in peekRawValue is skipped entirely — that lookup builds a\n * fresh address string per scanned cell, and a full-column data-edge scan (Ctrl+Shift+↓)\n * over a million lazy rows would otherwise churn ~1M throwaway strings on every keypress.\n */\n private _hasExplicitCells = false;\n /** @internal — default cell config from cells['default'] / cells['*'] */\n private _common: CellType | undefined;\n /** @internal — default column config from cells['defaultCol'] / cells['*C'] */\n private _commonCol: CellType | undefined;\n /** @internal — default row config from cells['defaultRow'] / cells['*R'] */\n private _commonRow: CellType | undefined;\n /** @internal — deferred matrices from buildInitialCells (large datasets) */\n private _initMatrices: { [baseAddress: string]: any[][] } | null = null;\n /** @internal — flattenAs key for deferred matrices */\n private _initFlattenAs: string | undefined;\n /** @internal — parsed base points for each matrix key, cached once */\n private _matrixBases: { baseY: number; baseX: number; rows: number; cols: number }[] = [];\n /** @internal — raw matrix references keyed by base address for O(1) lookup */\n private _matrixByBase: { baseY: number; baseX: number; matrix: any[][] }[] = [];\n /** @internal — precomputed column letters for lazy ID row creation */\n private _colLetters: string[] = [];\n /** @internal — tracks custom row heights (row y → height) for arithmetic offset computation */\n private _rowHeightOverrides: Map<number, number> = new Map();\n /** @internal — tracks filtered rows for offset computation */\n private _filteredRows: Set<number> = new Set();\n\n constructor({ limits = {}, name, registry = createRegistry({}), eager = false }: Props) {\n this.idMatrix = [];\n this.changedTime = Date.now();\n this.eager = eager;\n this._limits = {\n minRows: limits.minRows ?? 1,\n maxRows: limits.maxRows ?? -1,\n minCols: limits.minCols ?? 1,\n maxCols: limits.maxCols ?? -1,\n };\n this.name = name || '';\n this.prevName = this.name;\n this.registry = registry;\n }\n\n static is(obj: any): obj is Sheet {\n return obj?.__gsType === 'Sheet';\n }\n\n toString() {\n return `Sheet(name=${escapeSheetName(this.name)}, top=${this.top}, left=${this.left}, bottom=${this.bottom}, right=${this.right})`;\n }\n\n get headerHeight() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.height || HEADER_HEIGHT;\n }\n\n setHeaderHeight(height: number, historicize = true) {\n return this.update({\n diff: { 0: { height } },\n partial: true,\n historicize,\n });\n }\n\n get headerWidth() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.width || HEADER_WIDTH;\n }\n\n setHeaderWidth(width: number, historicize = true) {\n return this.update({\n diff: { 0: { width } },\n partial: true,\n historicize,\n });\n }\n\n /**\n * Get the raw (mutable) cell data for a point. Unlike getCell, this returns the actual registry.data reference.\n * @internal\n */\n private _pointToRawCell({ y, x }: PointType): CellType | undefined {\n const id = this.getId({ y, x });\n if (id == null) {\n return undefined;\n }\n this._ensureCellPopulated(y, x, id);\n return this.registry.data[id];\n }\n\n public isRowFiltered(y: number): boolean {\n return !!this._pointToRawCell({ y, x: 0 })?.filtered;\n }\n\n public hasActiveFilters(): boolean {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns true if any data cell in this sheet currently holds a Pending value\n * (i.e. an async formula that hasn't resolved yet).\n */\n public hasPendingCells(): boolean {\n // Only check materialized cells — unmaterialized cells can't have Pending values\n for (const id of Object.keys(this.registry.data)) {\n const cell = this.registry.data[id];\n if (Pending.is(cell?.value)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns a Promise that resolves when all in-flight async formula computations\n * have completed and no data cells hold Pending values.\n * If nothing is pending, resolves immediately.\n * Useful for waiting before sort/filter so that cell values are fully resolved.\n */\n public waitForPending(): Promise<void> {\n const pendingMap = this.registry.asyncPending;\n // If there are in-flight promises, wait for them first\n if (pendingMap.size > 0) {\n const promises = Array.from(pendingMap.values()).map((p) => p.promise);\n return Promise.all(promises).then(() => this.waitForPending());\n }\n // Even if asyncPending is empty, cells may still hold Pending values\n // (e.g. propagated pending from dependent formulas).\n // In that case, wait for the next transmit cycle and re-check.\n if (this.hasPendingCells()) {\n return new Promise<void>((resolve) => {\n const check = () => {\n if (this.registry.asyncPending.size > 0) {\n const promises = Array.from(this.registry.asyncPending.values()).map((p) => p.promise);\n Promise.all(promises).then(check);\n } else if (this.hasPendingCells()) {\n // Still pending — wait a tick for transmit/re-render\n setTimeout(check, 50);\n } else {\n resolve();\n }\n };\n check();\n });\n }\n return Promise.resolve();\n }\n\n /**\n * Returns the addresses that were changed in the most recent `_update()` call.\n * Useful inside `onChange` to know which cells were modified.\n */\n public getLastChangedAddresses(): Address[] {\n return this.lastChangedAddresses;\n }\n\n /**\n * Eagerly fire every async formula cell in this sheet, ignoring the visible\n * range.\n *\n * GridSheet is virtualized: normally only cells the UI renders get solved, so\n * an off-screen `=…` formula that calls an async function never fires. Only\n * async cells need this — sync formulas have no side effects and resolve when\n * read (e.g. by serialization), whereas an async cell must be *fired* and given\n * time to settle before its value can be read. `resolveAll()` therefore walks\n * the async-formula index ({@link Registry.asyncFormulaCells}) and solves each\n * one, which fires it through the usual machinery: it resolves, populates the\n * per-cell async cache, and triggers a re-render via `transmit()`. Sync cells\n * that depend on those results resolve normally on the next read.\n *\n * Cells already resolved (async-cache hit) or in flight (Pending) are not\n * re-fired — solving is a cache hit for them — so repeated calls converge and\n * are cheap. After awaiting {@link waitForPending}, serialization helpers such\n * as `toValueMatrix` return resolved values for off-screen cells too.\n *\n * This is the building block behind the opt-in `eager` sheet option; call it\n * directly to resolve on demand without enabling eager mode.\n *\n * @returns the number of async formula cells visited (for diagnostics/tests).\n */\n public resolveAll(): number {\n const registry = this.registry;\n let visited = 0;\n // Snapshot: solving a cell may add new async cells (e.g. spilled formulas)\n // to the index, and we prune stale ids while iterating.\n for (const id of Array.from(registry.asyncFormulaCells)) {\n const cell = registry.data[id];\n // Prune ids that are gone or no longer hold a formula.\n if (cell == null || typeof cell.value !== 'string' || cell.value.charAt(0) !== '=') {\n registry.asyncFormulaCells.delete(id);\n continue;\n }\n // The index is registry-wide; only resolve cells owned by this sheet.\n if (registry.systems[id]?.sheetId !== this.id) {\n continue;\n }\n const { y, x } = this.getPointById(id);\n if (y < 0 || x < 0) {\n // Detached id (e.g. removed row/col not yet pruned from the index).\n registry.asyncFormulaCells.delete(id);\n continue;\n }\n // getCell(RESOLVED) fires main()/awaitAndSave on a cache miss and yields\n // the cached value / Pending otherwise, so resolved cells are not re-fired.\n this.getCell({ y, x }, { resolution: 'RESOLVED', raise: false });\n visited++;\n }\n return visited;\n }\n\n /**\n * Capture the full cell state of all filter-related header cells as a CellsByIdType snapshot.\n * @internal\n */\n private _captureFilterCellStates(): CellsByIdType {\n const snapshot: CellsByIdType = {};\n const numCols = this.numCols;\n const numRows = this.numRows;\n // Column header cells: capture the 'filter' field.\n // Use null instead of undefined so the value survives JSON serialization\n // (undefined is stripped by JSON.stringify, causing undo to silently no-op in environments\n // that serialize/deserialize state such as StackBlitz hot-reload).\n for (let col = 1; col <= numCols; col++) {\n const id = this.getId({ y: 0, x: col });\n if (id != null) {\n snapshot[id] = { filter: this.registry.data[id]?.filter ?? null };\n }\n }\n // Row header cells: capture the 'filtered' field.\n // Use false instead of undefined so the value survives JSON serialization\n // (undefined is stripped by JSON.stringify, causing undo to silently no-op in environments\n // that serialize/deserialize state such as StackBlitz hot-reload).\n for (let y = 1; y <= numRows; y++) {\n const id = this.getId({ y, x: 0 });\n if (id != null) {\n snapshot[id] = { filtered: this.registry.data[id]?.filtered ?? false };\n }\n }\n return snapshot;\n }\n\n public filterRows({\n x,\n filter,\n }: {\n x?: number;\n filter?: FilterConfig;\n } = {}) {\n const diffBefore = this._captureFilterCellStates();\n\n if (x == null) {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n delete colCell?.filter;\n }\n } else {\n const colCell = this._pointToRawCell({ y: 0, x });\n if (colCell) {\n if (filter) {\n colCell.filter = filter;\n } else {\n delete colCell.filter;\n }\n }\n }\n this._reapplyFilters();\n\n const diffAfter = this._captureFilterCellStates();\n\n // Only keep cells whose state actually changed\n const changedIds = Object.keys(diffBefore).filter(\n (id) => JSON.stringify(diffBefore[id]) !== JSON.stringify(diffAfter[id]),\n );\n\n if (changedIds.length > 0) {\n const trimmedBefore: CellsByIdType = {};\n const trimmedAfter: CellsByIdType = {};\n for (const id of changedIds) {\n trimmedBefore[id] = diffBefore[id];\n trimmedAfter[id] = diffAfter[id];\n }\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n diffBefore: trimmedBefore,\n diffAfter: trimmedAfter,\n partial: true,\n });\n }\n\n return this.refresh(false, true);\n }\n\n /** @internal */\n private _reapplyFilters() {\n // Collect active filters from column header cells\n const numCols = this.numCols;\n const activeFilters: { x: number; filter: FilterConfig }[] = [];\n const changedAddresses: Address[] = [];\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n activeFilters.push({ x: col, filter: colCell.filter });\n }\n // Track column header cells that have filter config changes\n changedAddresses.push(p2a({ y: 0, x: col }));\n }\n\n const numRows = this.numRows;\n\n // Evaluate each row and update filtered flag\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (!rowCell) {\n continue;\n }\n\n if (rowCell.filterFixed) {\n continue;\n }\n\n let shouldFilter = false;\n for (const { x: col, filter } of activeFilters) {\n const cell = this.getCell({ y, x: col }, { resolution: 'RESOLVED' });\n if (!evaluateFilterConfig(filter, cell?.value)) {\n shouldFilter = true;\n break;\n }\n }\n\n const wasFiltered = !!rowCell.filtered;\n if (shouldFilter) {\n rowCell.filtered = true;\n this._filteredRows.add(y);\n } else {\n delete rowCell.filtered;\n this._filteredRows.delete(y);\n }\n if (wasFiltered !== shouldFilter) {\n changedAddresses.push(p2a({ y, x: 0 }));\n }\n }\n\n this.lastChangedAddresses = changedAddresses;\n }\n\n public sortRows({ x, direction }: { x: number; direction: 'asc' | 'desc' }) {\n const numRows = this.numRows;\n if (numRows <= 1) {\n return this;\n }\n\n // Collect row indices (data rows: 1..numRows), separating fixed rows\n const fixedPositions = new Set<number>();\n const sortableIndices: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (rowCell?.sortFixed) {\n fixedPositions.add(y);\n } else {\n sortableIndices.push(y);\n }\n }\n\n // Sort by resolved cell value at column x\n sortableIndices.sort((a, b) => {\n const cellA = this.getCell({ y: a, x }, { resolution: 'RESOLVED' });\n const cellB = this.getCell({ y: b, x }, { resolution: 'RESOLVED' });\n const valA = cellA?.value;\n const valB = cellB?.value;\n\n // null/undefined goes to the end\n if (valA == null && valB == null) {\n return 0;\n }\n if (valA == null) {\n return 1;\n }\n if (valB == null) {\n return -1;\n }\n\n let cmp = 0;\n if (typeof valA === 'number' && typeof valB === 'number') {\n cmp = valA - valB;\n } else if (valA instanceof Date && valB instanceof Date) {\n cmp = valA.getTime() - valB.getTime();\n } else {\n cmp = String(valA).localeCompare(String(valB));\n }\n return direction === 'asc' ? cmp : -cmp;\n });\n\n // Check if order actually changed (only among sortable rows)\n // Assign sortable rows to the positions not occupied by fixed rows\n const availablePositions: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n if (!fixedPositions.has(y)) {\n availablePositions.push(y);\n }\n }\n\n let changed = false;\n for (let i = 0; i < sortableIndices.length; i++) {\n if (sortableIndices[i] !== availablePositions[i]) {\n changed = true;\n break;\n }\n }\n if (!changed) {\n return this;\n }\n\n // Build row mapping: original position -> new position\n // Fixed rows map to themselves; sortable rows map to available positions in sorted order\n const sortedRowMapping: { [beforeY: number]: number } = {};\n for (const y of fixedPositions) {\n sortedRowMapping[y] = y;\n }\n for (let i = 0; i < sortableIndices.length; i++) {\n sortedRowMapping[sortableIndices[i]] = availablePositions[i];\n }\n\n // Save row references before rearranging (rows are re-slotted, not mutated).\n this._materializeIdMatrix();\n const matrixSnapshot = this.idMatrix.slice();\n\n for (const [oldY, newY] of Object.entries(sortedRowMapping)) {\n this.idMatrix[Number(newY)] = matrixSnapshot[Number(oldY)];\n }\n this.addressCaches.clear();\n\n const preserver = new ReferencePreserver(this);\n preserver.buildMap(matrixSnapshot.flat(), this.idMatrix.flat());\n preserver.resolveDependents();\n\n this._pushHistory({\n applyed: true,\n operation: 'SORT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n sortedRowMapping,\n } as HistorySortRowsType);\n\n return this.refresh(true, true);\n }\n\n /** @internal */\n private _sortRowMapping(sortedRowMapping: { [beforeY: number]: number }, inverse = false) {\n const newOrder: number[] = new Array(this.numRows);\n\n if (inverse) {\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[oldY - 1] = newY;\n }\n } else {\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[newY - 1] = oldY;\n }\n }\n\n this._materializeIdMatrix();\n const savedRows: Ids[] = [];\n for (let i = 0; i < newOrder.length; i++) {\n savedRows.push(this.idMatrix[newOrder[i]]);\n }\n for (let i = 0; i < newOrder.length; i++) {\n this.idMatrix[i + 1] = savedRows[i];\n }\n this.addressCaches.clear();\n }\n\n get isInitialized() {\n return this.status === 2;\n }\n\n get policies() {\n return this.registry.policies;\n }\n\n /** @internal */\n public getSystem(point: PointType): System | undefined {\n const id = this.getId(point);\n if (id == null) {\n return undefined;\n }\n return this.registry.systems[id];\n }\n\n /** @internal */\n public processFormula(value: any, { idMap, ...props }: ProcessFormulaProps): any {\n if (typeof value === 'string' || value instanceof String) {\n if (value.charAt(0) === '=') {\n const lexer = new Lexer(value.substring(1));\n lexer.tokenize(idMap);\n lexer.identify({ ...props, sheet: this });\n lexer.dependencyIds.forEach((id) => this.addDependency(id, props.dependency));\n // Index this cell only if its formula calls an async function: those are\n // the cells eager resolution must fire (sync formulas resolve on read).\n if (props.dependency != null) {\n if (this._formulaHasAsync(lexer)) {\n this.registry.asyncFormulaCells.add(props.dependency);\n } else {\n this.registry.asyncFormulaCells.delete(props.dependency);\n }\n }\n return '=' + lexer.identifiedFormula;\n }\n }\n // No longer a formula (e.g. a formula cell overwritten with a literal): drop\n // it from the index so resolveAll() stops visiting it.\n if (props.dependency != null) {\n this.registry.asyncFormulaCells.delete(props.dependency);\n }\n return value;\n }\n\n /**\n * Whether a tokenized formula calls at least one async function, decided via\n * the function class's static `isAsync` flag (no instantiation). Drives the\n * async-formula index that {@link resolveAll} walks.\n * @internal\n */\n private _formulaHasAsync(lexer: Lexer): boolean {\n for (const token of lexer.tokens) {\n if (token.type === 'FUNCTION') {\n const fn = this.registry.functions[String(token.entity).toLowerCase()];\n if ((fn as unknown as { isAsync?: boolean })?.isAsync) {\n return true;\n }\n }\n }\n return false;\n }\n\n /** @internal */\n public resolveFormulas() {\n this.idsToBeIdentified.forEach((id) => {\n const cell = this.registry.data[id];\n if (this.registry.systems[id]?.sheetId == null) {\n return;\n }\n if (cell == null) {\n return;\n }\n this.clearDependencies(id);\n cell.value = this.processFormula(cell?.value, { dependency: id });\n });\n this.idsToBeIdentified = [];\n this.status = 2;\n }\n\n /** @internal */\n public getSheetBySheetName(sheetName: string) {\n const sheetId = this.registry.sheetIdsByName[sheetName];\n return this.getSheetBySheetId(sheetId);\n }\n /** @internal */\n public getSheetBySheetId(sheetId: number) {\n return this.registry.contextsBySheetId[sheetId]?.store?.sheetReactive?.current;\n }\n\n /** @internal */\n private static _stack(...cells: (CellType | undefined)[]) {\n const extension: CellType = {};\n cells.forEach((cell) => {\n if (cell?.style) {\n extension.style = { ...extension.style, ...cell.style };\n }\n if (cell?.prevention) {\n extension.prevention = (extension.prevention || 0) | cell.prevention;\n }\n });\n return extension;\n }\n\n /** @internal */\n public initialize(cells: CellsByAddressType) {\n if (this.status > 1) {\n return;\n }\n if (cells[0] == null) {\n cells[0] = { width: HEADER_WIDTH, height: HEADER_HEIGHT };\n }\n const auto = getMaxSizesFromCells(cells, (cells as any).__userKeys);\n this.area = {\n top: 1,\n left: 1,\n bottom: auto.numRows,\n right: auto.numCols,\n };\n\n // Pre-allocate idMatrix with undefined slots (O(1) — no ID generation)\n this.idMatrix = new Array(auto.numRows + 1);\n\n // Precompute column letters for lazy row creation\n this._colLetters = [];\n for (let x = 0; x <= auto.numCols; x++) {\n this._colLetters[x] = x2c(x);\n }\n\n // Expand range addresses (e.g. 'A1:C3') into individual cells.\n // Use __userKeys (set by buildInitialCells) to iterate only user-provided\n // addresses, avoiding an O(matrixCells) scan of the entire cells object.\n const addressKeys: string[] = (cells as any).__userKeys ?? Object.keys(cells);\n addressKeys.forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const range = expandRange(address);\n const data = cells[address];\n\n range.forEach((address) => {\n const origin = cells[address];\n cells[address] = {\n ...origin,\n ...data,\n ...Sheet._stack(origin, data),\n };\n });\n });\n\n // Store defaults for lazy cell resolution\n this._common = cells?.[DEFAULT_KEY];\n this._commonCol = cells?.[DEFAULT_COL_KEY];\n this._commonRow = cells?.[DEFAULT_ROW_KEY];\n this._initCells = cells;\n // Detect explicit data cells once so peekRawValue can skip its per-cell address build\n // when there are none (see _hasExplicitCells). A range key (contains ':') or any single\n // address with a row >= 1 counts; DEFAULT/header (row 0) keys do not.\n const userKeys: string[] = (cells as any)?.__userKeys ?? (cells ? Object.keys(cells) : []);\n this._hasExplicitCells = userKeys.some((k) => {\n if (k === DEFAULT_KEY || k === DEFAULT_COL_KEY || k === DEFAULT_ROW_KEY) {\n return false;\n }\n // Only a cell that actually carries a `value` can be returned by peekRawValue; empty\n // placeholders (e.g. the ensured bottom-right corner buildInitialCells inserts) don't\n // count and must not force the per-cell address build back on.\n const c = (cells as any)?.[k];\n if (c == null || !('value' in c)) {\n return false;\n }\n if (k.includes(':')) {\n return true;\n }\n return /^\\$?[A-Z]+\\$?[1-9]/.test(k);\n });\n\n // Store deferred matrices for lazy cell value lookup\n const deferredMatrices = (cells as any).__matrices;\n if (deferredMatrices) {\n this._initMatrices = deferredMatrices;\n this._initFlattenAs = (cells as any).__flattenAs;\n this._matrixByBase = [];\n for (const baseAddress of Object.keys(deferredMatrices)) {\n const { y: baseY, x: baseX } = a2p(baseAddress);\n this._matrixByBase.push({ baseY, baseX, matrix: deferredMatrices[baseAddress] });\n }\n }\n if (this._commonCol?.width != null) {\n this.defaultColWidth = this._commonCol.width;\n }\n if (this._commonRow?.height != null) {\n this.defaultRowHeight = this._commonRow.height;\n }\n\n // Eagerly populate header row (y=0) and header column (x=0) only.\n // All data cells are lazily populated on first access.\n this._ensureIdRow(0);\n for (let x = 0; x <= auto.numCols; x++) {\n const id = this.idMatrix[0][x];\n this._ensureCellPopulated(0, x, id);\n }\n\n // Eagerly populate cells that have explicit data or formulas in the input.\n // This ensures formulas are identified for resolveFormulas().\n const explicitAddresses = addressKeys;\n for (const address of explicitAddresses) {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n continue;\n }\n const point = a2p(address);\n const { y, x } = point;\n // Skip headers (already done), skip column/row-level defaults (like 'A' or '1')\n if ((y === 0 && x === 0) || y === 0 || x === 0) {\n continue;\n }\n // Skip column-only or row-only addresses (e.g. 'A' has x>0,y=0 or '1' has y>0,x=0)\n if (y <= 0 || x <= 0) {\n continue;\n }\n if (y > auto.numRows || x > auto.numCols) {\n continue;\n }\n const row = this._ensureIdRow(y);\n const id = row[x];\n if (id != null) {\n this._ensureCellPopulated(y, x, id);\n }\n }\n\n this.status = 1; // initialized\n this.registry.sheetIdsByName[this.name] = this.id;\n }\n\n /** @internal */\n private _incrementVersion() {\n this.version++;\n if (this.version >= Number.MAX_SAFE_INTEGER) {\n this.version = 1;\n }\n }\n\n /** @internal */\n private _xsheetDispatch(otherSheet: Sheet) {\n if (otherSheet === this) {\n return;\n }\n otherSheet.refresh(true);\n const context = this.registry.contextsBySheetId[otherSheet.id];\n if (context !== null) {\n const { dispatch } = context;\n requestAnimationFrame(() => {\n dispatch(this.registry.updateSheet(otherSheet));\n });\n }\n }\n\n /** @internal */\n private _generateId() {\n return (this.registry.cellHead++).toString();\n }\n\n /**\n * Lazily generate the ID row for the given y-coordinate.\n * If the row already exists, returns it immediately.\n * @internal\n */\n private _ensureIdRow(y: number): Ids {\n let row = this.idMatrix[y];\n if (row != null) {\n return row;\n }\n const numCols = this.area.right;\n row = [];\n for (let x = 0; x <= numCols; x++) {\n const id = this._generateId();\n row.push(id);\n const colLetter = this._colLetters[x] || x2c(x);\n this.addressCaches.set(id, y === 0 ? `${colLetter}0` : x === 0 ? `0${y}` : `${colLetter}${y}`);\n }\n this.idMatrix[y] = row;\n return row;\n }\n\n /**\n * Ensure that registry.data and registry.systems exist for a given cell.\n * Performs lazy cell stacking using stored initialization defaults.\n * @internal\n */\n private _ensureCellPopulated(y: number, x: number, id: Id): void {\n if (this.registry.data[id] != null) {\n return;\n }\n const cells = this._initCells;\n const changedTime = Date.now();\n let stacked: CellType;\n\n if (y === 0 && x > 0) {\n const colId = this._colLetters[x] || x2c(x);\n const colDefault = cells?.[colId];\n const { style: _cs, ...colDefaultLayout } = colDefault ?? {};\n const headerCell = cells?.[colId + '0'];\n stacked = {\n ...this._commonCol,\n ...colDefaultLayout,\n ...headerCell,\n ...Sheet._stack(this._commonCol, headerCell),\n } as CellType;\n } else if (x === 0 && y > 0) {\n const rowId = y2r(y);\n const rowDefault = cells?.[rowId];\n const { style: _rs, ...rowDefaultLayout } = rowDefault ?? {};\n const headerCell = cells?.['0' + rowId];\n stacked = {\n ...this._commonRow,\n ...rowDefaultLayout,\n ...headerCell,\n ...Sheet._stack(this._commonRow, headerCell),\n } as CellType;\n } else if (y === 0 && x === 0) {\n const cell = cells?.['0'];\n stacked = { ...cell, ...Sheet._stack(cell) } as CellType;\n } else {\n const colId = this._colLetters[x] || x2c(x);\n const rowId = y2r(y);\n const address = `${colId}${rowId}`;\n const rowDefault = cells?.[rowId];\n const colDefault = cells?.[colId];\n let cell = cells?.[address];\n // Resolve value from deferred matrices if cell has no explicit value\n if ((cell == null || !('value' in cell)) && this._matrixByBase.length > 0) {\n for (const { baseY, baseX, matrix } of this._matrixByBase) {\n const my = y - baseY;\n const mx = x - baseX;\n if (my >= 0 && my < matrix.length && mx >= 0 && mx < matrix[my].length) {\n const val = matrix[my][mx];\n let matrixCell: CellType;\n if (this._initFlattenAs) {\n matrixCell = { [this._initFlattenAs]: val };\n } else {\n matrixCell = val as CellType;\n }\n cell = cell ? { ...matrixCell, ...cell } : matrixCell;\n break;\n }\n }\n }\n stacked = {\n ...this._common,\n ...rowDefault,\n ...colDefault,\n ...cell,\n ...Sheet._stack(this._common, rowDefault, colDefault, cell),\n } as CellType;\n }\n\n if (stacked?.value?.startsWith?.('=') && (stacked?.formulaEnabled ?? true)) {\n this.idsToBeIdentified.push(id);\n }\n if (y === 0) {\n if (stacked.width == null) {\n stacked.width = DEFAULT_WIDTH;\n }\n } else if (x === 0) {\n if (stacked.height == null) {\n stacked.height = DEFAULT_HEIGHT;\n }\n // Track non-default row heights for arithmetic offset computation\n if (stacked.height !== (this.defaultRowHeight || DEFAULT_HEIGHT)) {\n this._rowHeightOverrides.set(y, stacked.height);\n }\n if (stacked.filtered) {\n this._filteredRows.add(y);\n }\n } else {\n delete stacked.height;\n delete stacked.width;\n delete stacked.label;\n }\n\n const policy = this.policies[stacked.policy ?? ''] ?? this.defaultPolicy;\n stacked = policy.deserializeValue(stacked.value, stacked) ?? {};\n // Preserve any pre-existing system entry (e.g. `spilledFrom` set by spill()\n // before this empty target cell was lazily populated). Overwriting it would\n // wipe the spill marker even though the spilled value stays cached.\n this.registry.systems[id] = { ...this.registry.systems[id], id, changedTime, sheetId: this.id };\n this.registry.data[id] = stacked;\n }\n\n /**\n * Materialize all lazy ID rows. Call this before operations that need the full\n * idMatrix (e.g. .flat(), .map(), .slice() for sort/move/undo/redo).\n * @internal\n */\n private _materializeIdMatrix(): void {\n for (let y = 0; y < this.idMatrix.length; y++) {\n if (this.idMatrix[y] == null) {\n this._ensureIdRow(y);\n }\n }\n }\n\n /**\n * Compute the absolute top offset for a given row using arithmetic + overrides.\n * Avoids iterating all rows — O(overrides) instead of O(numRows).\n * @internal\n */\n public getOffsetTop(y: number): number {\n const headerH = this.headerHeight;\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n // Base offset assuming all rows have default height\n let offset = headerH + (y - 1) * defaultH;\n // Apply overrides for rows before y\n for (const [oy, h] of this._rowHeightOverrides) {\n if (oy < y) {\n offset += h - defaultH;\n }\n }\n // Subtract filtered rows before y\n for (const fy of this._filteredRows) {\n if (fy < y) {\n const h = this._rowHeightOverrides.get(fy) ?? defaultH;\n offset -= h;\n }\n }\n return offset;\n }\n\n /**\n * Re-key the row-metadata caches after rows are removed at [y, y+numRows).\n * These maps are keyed by absolute row number, so deletions must drop the removed\n * keys and shift later keys down — otherwise stale entries corrupt getOffsetTop().\n * @internal\n */\n private _shiftRowMetaForRemove(y: number, numRows: number): void {\n const heights = new Map<number, number>();\n for (const [k, v] of this._rowHeightOverrides) {\n if (k < y) {\n heights.set(k, v);\n } else if (k >= y + numRows) {\n heights.set(k - numRows, v);\n }\n }\n this._rowHeightOverrides = heights;\n\n const filtered = new Set<number>();\n for (const k of this._filteredRows) {\n if (k < y) {\n filtered.add(k);\n } else if (k >= y + numRows) {\n filtered.add(k - numRows);\n }\n }\n this._filteredRows = filtered;\n }\n\n /**\n * Re-key the row-metadata caches after numRows are inserted at y, shifting keys >= y up.\n * @internal\n */\n private _shiftRowMetaForInsert(y: number, numRows: number): void {\n const heights = new Map<number, number>();\n for (const [k, v] of this._rowHeightOverrides) {\n heights.set(k < y ? k : k + numRows, v);\n }\n this._rowHeightOverrides = heights;\n\n const filtered = new Set<number>();\n for (const k of this._filteredRows) {\n filtered.add(k < y ? k : k + numRows);\n }\n this._filteredRows = filtered;\n }\n\n /**\n * (Re)seed row-metadata for the rows at [y, y+numRows) from their current header cells.\n * Used after rows are added (insert / undo-remove / redo-insert) so non-default heights\n * and filtered state are reflected immediately rather than only on the next lazy read.\n * @internal\n */\n private _seedRowMeta(y: number, numRows: number): void {\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n for (let i = 0; i < numRows; i++) {\n const yy = y + i;\n const id = this.getId({ y: yy, x: 0 });\n const cell = id ? this.registry.data[id] : undefined;\n if (cell?.height != null && cell.height !== defaultH) {\n this._rowHeightOverrides.set(yy, cell.height);\n } else {\n this._rowHeightOverrides.delete(yy);\n }\n if (cell?.filtered) {\n this._filteredRows.add(yy);\n } else {\n this._filteredRows.delete(yy);\n }\n }\n }\n\n public getRectSize({ top, left, bottom, right }: AreaType): RectType {\n const l = left || 1;\n const t = top || 1;\n\n // Column offsets: read from pre-computed offsetLeft on header cells\n const rw = this.registry.systems[this.getId({ y: 0, x: right })]?.offsetLeft ?? 0;\n const lw = this.registry.systems[this.getId({ y: 0, x: l })]?.offsetLeft ?? 0;\n // Row offsets: compute arithmetically\n const rh = this.getOffsetTop(bottom);\n const th = this.getOffsetTop(t);\n\n const width = Math.max(0, rw - lw);\n const height = Math.max(0, rh - th);\n return { y: t, x: l, height, width };\n }\n\n /** @internal */\n public setTotalSize() {\n const numCols = this.numCols;\n const numRows = this.numRows;\n const headerW = this.headerWidth;\n const headerH = this.headerHeight;\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n\n // Write offsetLeft into column-header cells (y=0, x=1..numCols) — small loop\n let accW = 0;\n for (let x = 1; x <= numCols; x++) {\n const cell = this.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const w = cell?.width || this.defaultColWidth || DEFAULT_WIDTH;\n const colSys = this.registry.systems[this.getId({ y: 0, x })];\n if (colSys != null) {\n colSys.offsetLeft = headerW + accW;\n }\n accW += w;\n }\n this.totalWidth = headerW + accW;\n\n // Compute totalHeight arithmetically — O(overrides) instead of O(numRows)\n let totalOverrideDiff = 0;\n let filteredHeightSum = 0;\n for (const [y, h] of this._rowHeightOverrides) {\n if (y >= 1 && y <= numRows) {\n totalOverrideDiff += h - defaultH;\n }\n }\n for (const fy of this._filteredRows) {\n if (fy >= 1 && fy <= numRows) {\n const h = this._rowHeightOverrides.get(fy) ?? defaultH;\n filteredHeightSum += h;\n }\n }\n const fullH = numRows * defaultH + totalOverrideDiff;\n this.totalHeight = headerH + fullH - filteredHeightSum;\n this.fullHeight = headerH + fullH;\n }\n\n /** @internal */\n public refresh(relocate = false, resize = false): Sheet {\n this._incrementVersion();\n this.lastChangedTime = this.changedTime;\n this.changedTime = Date.now();\n\n this.clearSolvedCaches();\n // Reset strip cache. Normally unnecessary since child Sheets in solvedCaches\n // are discarded above, but defensive against stale references.\n this._stripped = NONE;\n\n if (relocate) {\n // force reset\n this.addressCaches.clear();\n }\n if (resize) {\n this.setTotalSize();\n }\n return this;\n }\n\n /** @internal */\n public clone(relocate = false): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n copied._stripped = NONE;\n return copied.refresh(relocate);\n }\n\n /** @internal */\n public getPointById(\n id: Id,\n slideY = 0,\n slideX = 0,\n ): PointType & {\n absCol: boolean;\n absRow: boolean;\n } {\n const absCol = id.startsWith('$');\n if (absCol) {\n id = id.slice(1);\n slideX = 0;\n }\n const absRow = id.endsWith('$');\n if (absRow) {\n id = id.slice(0, -1);\n slideY = 0;\n }\n const cache = this.addressCaches.get(id);\n if (cache) {\n const p = a2p(cache);\n return { y: p.y + slideY, x: p.x + slideX, absCol, absRow };\n }\n\n // Cache miss. Resume the scan from the watermark rather than rescanning from 0, and\n // skip un-materialized rows — a valid Id only ever lives in a materialized row, and\n // such rows self-seed via _ensureIdRow when they are materialized later.\n const startWatermark = this._addressCacheWatermark;\n const hit = this._scanForIdFrom(startWatermark, id);\n if (hit != null) {\n return { y: hit.y + slideY, x: hit.x + slideX, absCol, absRow };\n }\n // Not found from the watermark. It may have advanced past a row that was inserted /\n // shifted after the last full seed (structural ops clear the cache only at their\n // terminal refresh), so fall back to a full rescan from 0 — this also re-seeds and\n // corrects any stale entries below the old watermark. Skipped when already at 0.\n if (startWatermark > 0) {\n const retry = this._scanForIdFrom(0, id);\n if (retry != null) {\n return { y: retry.y + slideY, x: retry.x + slideX, absCol, absRow };\n }\n }\n return { y: -1, x: -1, absCol, absRow };\n }\n\n /**\n * Scan materialized rows from `fromY`, seeding addressCaches as it goes. Advances the\n * watermark past every row scanned through its last column; if `id` is found mid-row,\n * leaves the watermark at that (still partially seeded) row. Returns the point or null.\n * @internal\n */\n private _scanForIdFrom(fromY: number, id: Id): PointType | null {\n let y = fromY;\n for (; y < this.idMatrix.length; y++) {\n const ids = this.idMatrix[y];\n if (ids == null) {\n continue;\n }\n for (let x = 0; x < ids.length; x++) {\n const existing = ids[x];\n this.addressCaches.set(existing, p2a({ y, x }));\n if (existing === id) {\n this._addressCacheWatermark = y;\n return { y, x };\n }\n }\n }\n this._addressCacheWatermark = y;\n return null;\n }\n\n /** @internal */\n public getAddressById(id: Id, slideY = 0, slideX = 0): string | undefined {\n const { y, x, absCol, absRow } = this.getPointById(id, slideY, slideX);\n return grantAddressAbsolute(p2a({ y, x }), absCol, absRow);\n }\n\n /** @internal */\n public clearAddressCaches() {\n this.addressCaches.clear();\n this._addressCacheWatermark = 0;\n }\n\n /** @internal */\n private _warmAddressCaches() {\n this._materializeIdMatrix();\n for (let y = 0; y < this.idMatrix.length; y++) {\n const row = this.idMatrix[y];\n for (let x = 0; x < row.length; x++) {\n this.addressCaches.set(row[x], p2a({ y, x }));\n }\n }\n // Every materialized row is now seeded through its last column.\n this._addressCacheWatermark = this.idMatrix.length;\n }\n\n /** @internal */\n public getId(point: PointType) {\n const { y, x } = point;\n if (y >= 0 && x >= 0 && y <= this.area.bottom && x <= this.area.right) {\n return this._ensureIdRow(y)[x];\n }\n // Out-of-bounds: return from raw array (undefined at runtime, preserves original type)\n return this.idMatrix[y]?.[x];\n }\n\n /** @internal */\n public getCell(point: PointType, { resolution = 'RESOLVED', raise = false }: SolveOptions = {}) {\n const { y, x } = point;\n if (y === -1 || x === -1) {\n return undefined;\n }\n const id = this.getId(point);\n if (id == null) {\n return undefined;\n }\n // Lazy cell population\n this._ensureCellPopulated(y, x, id);\n const cell = this.registry.data[id];\n if (cell == null) {\n return undefined;\n }\n let value = cell.value;\n if (resolution !== 'SYSTEM' && (cell.formulaEnabled ?? true)) {\n value = solveFormula({ value, sheet: this, point, raise, resolution, at: id });\n }\n return { ...cell, value } as CellType;\n }\n\n /**\n * Cheap raw-value peek that does NOT materialize the cell. Returns the populated\n * value if the cell already exists, otherwise reads straight from the deferred\n * matrix / init cells. Lets a full-column/row scan (e.g. Ctrl+Shift+arrow's\n * \"select to data edge\") stay O(1) per cell instead of stacking every cell it\n * walks over — a million-row scan was ~1.9s (and materialized the whole column)\n * purely because the empty-check went through getCell.\n */\n public peekRawValue({ y, x }: PointType): any {\n // Already-materialized (or user-edited) cell: registry.data is authoritative.\n const idRow = this.idMatrix[y];\n if (idRow != null) {\n const id = idRow[x];\n const cell = id != null ? this.registry.data[id] : undefined;\n if (cell != null) {\n return cell.value;\n }\n }\n if (y <= 0 || x <= 0) {\n return undefined;\n }\n // An explicit init cell (non-matrix path) wins over the matrix. Skipped entirely when\n // the sheet has no explicit data cells (the common large-dataset/matrices case), since\n // building this address string per scanned cell dominates a full-column scan's cost.\n if (this._hasExplicitCells) {\n const address = `${this._colLetters[x] || x2c(x)}${y2r(y)}`;\n const explicit = this._initCells?.[address];\n if (explicit != null && 'value' in explicit) {\n return explicit.value;\n }\n }\n // Deferred matrix (large-dataset path).\n for (const { baseY, baseX, matrix } of this._matrixByBase) {\n const my = y - baseY;\n const mx = x - baseX;\n if (my >= 0 && my < matrix.length) {\n const row = matrix[my];\n if (mx >= 0 && mx < row.length) {\n const val = row[mx];\n return this._initFlattenAs ? val : (val as any)?.value;\n }\n }\n }\n return undefined;\n }\n\n /** @internal */\n public get numRows() {\n const { top, bottom } = this.area;\n return 1 + bottom - top;\n }\n\n public get numCols() {\n const { left, right } = this.area;\n return 1 + right - left;\n }\n\n public get top() {\n return this.area.top;\n }\n public get left() {\n return this.area.left;\n }\n public get bottom() {\n return this.area.bottom;\n }\n public get right() {\n return this.area.right;\n }\n\n /**\n * Fill one matrix row (y) from cell values. Shared by the sync and async\n * _toValueMatrix so the two never diverge. Per-row (not per-cell) call, so the\n * indirection is negligible even at a million cells. @internal\n */\n private _fillValueRow(\n matrix: any[][],\n y: number,\n {\n top,\n left,\n right,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n }: InternalToValueMatrixProps & { top: number; left: number; right: number },\n ) {\n for (let x = left; x <= right; x++) {\n const id = this.getId({ y, x });\n // Only throw a circular-ref if the `at` cell is from this sheet.\n if (at === id) {\n throw new FormulaError('#REF!', 'References are circulating.');\n }\n const cell = this.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = this.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: this, point: { y, x } });\n }\n matrix[y - top][x - left] = fieldValue;\n }\n }\n }\n\n /** @internal */\n public _toValueMatrix({\n area,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n }: InternalToValueMatrixProps = {}) {\n const { top, left, bottom, right } = area ?? this.area;\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n for (let y = top; y <= bottom; y++) {\n this._fillValueRow(matrix, y, { top, left, right, at, resolution, raise, filter, asScalar });\n }\n return matrix;\n }\n\n /**\n * Async, time-sliced variant of _toValueMatrix. Reading every cell lazily\n * materializes the whole sheet (~hundreds of ms at a million cells), so doing\n * it synchronously freezes the host. This processes rows until `frameBudgetMs`\n * elapses, then reports progress and yields — leaving the UI responsive and\n * letting the caller paint a progress indicator. The caller supplies\n * `yieldControl` (a macrotask/rAF yielder so the host actually paints between\n * chunks); the default microtask only cooperates, which suffices for headless\n * callers that just want to avoid monopolizing the loop. @internal\n */\n public async _toValueMatrixAsync({\n area,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n frameBudgetMs = 12,\n onProgress,\n yieldControl,\n }: InternalToValueMatrixProps & {\n frameBudgetMs?: number;\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n } = {}): Promise<any[][]> {\n const { top, left, bottom, right } = area ?? this.area;\n const totalRows = Math.max(0, bottom - top + 1);\n const matrix = createMatrix(totalRows, right - left + 1);\n const doYield = yieldControl ?? (() => Promise.resolve());\n onProgress?.({ done: 0, total: totalRows });\n let lastYield = Date.now();\n let done = 0;\n for (let y = top; y <= bottom; y++) {\n this._fillValueRow(matrix, y, { top, left, right, at, resolution, raise, filter, asScalar });\n done++;\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done, total: totalRows });\n await doYield();\n lastYield = Date.now();\n }\n }\n onProgress?.({ done: totalRows, total: totalRows });\n return matrix;\n }\n\n /** @internal */\n private _pushHistory(history: HistoryType) {\n const book = this.registry;\n const strayedHistories = book.histories.splice(book.historyIndex + 1, book.histories.length);\n strayedHistories.forEach(this._cleanStrayed.bind(this));\n book.histories.push(history);\n book.lastHistory = book.currentHistory = history;\n if (book.histories.length > book.historyLimit) {\n const kickedOut = book.histories.splice(0, 1)[0];\n this._cleanObsolete(kickedOut);\n } else {\n book.historyIndex++;\n }\n }\n\n /** @internal */\n private _cleanObsolete(history: HistoryType) {\n if (history.operation === 'REMOVE_ROWS' || history.operation === 'REMOVE_COLS') {\n history.deleted.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n if (history.operation === 'MOVE') {\n history.moveRelations.forEach((rel) => {\n if (rel.new != null) {\n this._deleteOrphanedId(rel.new);\n }\n if (rel.lost != null) {\n this._deleteOrphanedId(rel.lost);\n }\n });\n }\n }\n\n /** @internal */\n private _cleanStrayed(history: HistoryType) {\n /**\n * Cleans up IDs that were created by a history entry that has been discarded\n * (\"strayed\") due to a new operation being pushed while the history index was\n * not at the end (i.e. after undo).\n *\n * When the user undoes one or more steps and then performs a new operation,\n * the previously-redoable future histories are removed from the history stack.\n * Any cells that were **inserted** by those discarded histories (INSERT_ROWS /\n * INSERT_COLS) have IDs that are no longer reachable from the id-matrix, so\n * their registry entries must be deleted to avoid memory leaks.\n * @internal\n */\n if (history.operation === 'INSERT_ROWS' || history.operation === 'INSERT_COLS') {\n history.idMatrix.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n }\n\n /**\n * Remove an id from registry.data and registry.dependents entirely.\n * @internal\n */\n private _deleteOrphanedId(id: Id) {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n delete this.registry.data[id];\n delete this.registry.systems[id];\n }\n\n /** @internal */\n private _copyCellLayout(cell: CellType | undefined) {\n if (cell == null) {\n return undefined;\n }\n const newCell: CellType = {};\n if (cell.style != null) {\n newCell.style = cell.style;\n }\n if (cell.justifyContent != null) {\n newCell.justifyContent = cell.justifyContent;\n }\n if (cell.alignItems != null) {\n newCell.alignItems = cell.alignItems;\n }\n if (cell.policy != null) {\n newCell.policy = cell.policy;\n }\n if (cell.width != null) {\n newCell.width = cell.width;\n }\n if (cell.height != null) {\n newCell.height = cell.height;\n }\n return newCell;\n }\n\n public move({\n srcSheet = this,\n src,\n dst,\n historicize = true,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: MoveProps) {\n const srcSheetRaw = srcSheet.__raw__;\n const moveRelations = this._createMoveRelations(srcSheetRaw, src, this, dst);\n const { diffBefore, diffAfter } = this._moveCells(srcSheetRaw, this, moveRelations, false, operator);\n\n this._xsheetDispatch(srcSheetRaw);\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'MOVE',\n srcSheetId: srcSheetRaw.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n moveRelations,\n });\n }\n\n return this.refresh(true);\n }\n\n /**\n * Build MoveRelations from src area to dst area, skipping filtered rows.\n *\n * Layout of the returned array (processed in this order by _moveCells):\n * 1. Entries where [0] is a newly-generated ID — these fill the vacated src cells (processed last in forward order)\n * 2. Entries where [0] is a src address and [1] is a dst address — the actual moves (processed first in forward order, descending)\n * Entries whose [1] is an existing ID mean the destination cell is displaced/overflowed and\n * is no longer addressable; on forward pass they are skipped; on reverse pass the ID is written back.\n */\n /** @internal */\n private _createMoveRelations(srcSheet: Sheet, src: AreaType, dstSheet: Sheet, dst: AreaType): MoveRelations {\n const { top: srcTop, left: srcLeft, bottom: srcBottom, right: srcRight } = src;\n const { top: dstTop, left: dstLeft } = dst;\n\n const dstNumRows = dstSheet.numRows;\n const dstNumCols = dstSheet.numCols;\n\n // Collect visible (non-filtered) rows for src\n const srcVisibleRows: number[] = [];\n for (let y = srcTop; y <= srcBottom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const srcNumCols = srcRight - srcLeft + 1;\n const srcNumVisibleRows = srcVisibleRows.length;\n\n // Collect corresponding visible dst rows (skip filtered rows in dst, matching count)\n const dstVisibleRows: number[] = [];\n {\n let di = 0;\n let y = dstTop;\n while (di < srcNumVisibleRows) {\n if (!dstSheet.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n di++;\n }\n y++;\n }\n }\n\n // Build sets for quick lookup\n const srcCellSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n for (let j = 0; j < srcNumCols; j++) {\n srcCellSet.add(p2a({ y: srcVisibleRows[di], x: srcLeft + j }));\n }\n }\n\n const dstAddrSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const dstX = dstLeft + j;\n if (dstY <= dstNumRows && dstX <= dstNumCols) {\n dstAddrSet.add(p2a({ y: dstY, x: dstX }));\n }\n }\n }\n\n const moveRelations: MoveRelations = [];\n\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const srcY = srcVisibleRows[di];\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const srcX = srcLeft + j;\n const dstX = dstLeft + j;\n const srcAddr = p2a({ y: srcY, x: srcX });\n const isDstInBounds = dstY <= dstNumRows && dstX <= dstNumCols;\n const dstAddr = isDstInBounds ? p2a({ y: dstY, x: dstX }) : undefined;\n\n let newId: Id | undefined;\n // Vacate: src cell is NOT covered by any dst write in the same sheet overlap\n if (!(srcSheet === dstSheet && dstAddrSet.has(srcAddr))) {\n newId = srcSheet._generateId();\n }\n\n let lostId: Id | undefined;\n if (isDstInBounds) {\n // Displace: dst cell is overwritten but was NOT part of the src area being moved\n if (!(srcSheet === dstSheet && srcCellSet.has(dstAddr!))) {\n const existingId = dstSheet.getId({ y: dstY, x: dstX });\n if (existingId != null) {\n lostId = existingId;\n }\n }\n } else {\n // Overflow: the src ID itself is pushed out of bounds and lost\n const srcId = srcSheet.getId({ y: srcY, x: srcX });\n if (srcId != null) {\n lostId = srcId;\n }\n }\n\n const srcCell = srcSheet.getCell({ y: srcY, x: srcX }, { resolution: 'SYSTEM' });\n const dstCell = isDstInBounds ? dstSheet.getCell({ y: dstY, x: dstX }, { resolution: 'SYSTEM' }) : undefined;\n\n moveRelations.push({\n before: srcCell?.policy,\n after: dstCell?.policy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n });\n }\n }\n\n return moveRelations;\n }\n\n get defaultPolicy(): PolicyType {\n return this.policies[DEFAULT_POLICY_NAME] ?? nonePolicy;\n }\n\n /**\n * Apply (or reverse) a MoveRelations list.\n *\n * Forward (reverse=false): process descending — actual ID moves happen bottom-up so\n * earlier entries don't clobber later ones; vacate entries (at front of array) are\n * applied last.\n * Reverse (reverse=true): process ascending — restores IDs in the natural order.\n *\n * On forward pass: applies policy, collects diffBefore, runs ReferencePreserver.\n * On reverse pass: only moves IDs (caller is responsible for applyDiff(diffBefore)).\n */\n /** @internal */\n private _moveCells(\n srcSheet: Sheet,\n dstSheet: Sheet,\n moveRelations: MoveRelations,\n reverse: boolean,\n operator: OperatorType = 'SYSTEM',\n ): { diffBefore: CellsByIdType; diffAfter: CellsByIdType } {\n const diffBefore: CellsByIdType = {};\n const preserver = new ReferencePreserver(dstSheet);\n\n const wireWrites: CellsByIdType = {};\n const idWritesSrc: Array<{ y: Y; x: X; id: Id }> = [];\n const idWritesDst: Array<{ y: Y; x: X; id: Id }> = [];\n\n // Forward pass: collect diffs and temporary buffer writes\n if (!reverse) {\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n const srcPoint = a2p(srcAddr);\n const srcId = srcSheet.getId(srcPoint);\n const dstPoint = dstAddr != null ? a2p(dstAddr) : undefined;\n const dstId = dstPoint != null ? dstSheet.getId(dstPoint) : undefined;\n\n const srcCell = srcId != null ? srcSheet.registry.data[srcId] : undefined;\n const dstCell = dstId != null ? dstSheet.registry.data[dstId] : undefined;\n\n if (\n operator === 'USER' &&\n (operation.hasOperation(srcCell?.prevention, operation.MoveFrom) ||\n operation.hasOperation(dstCell?.prevention, operation.MoveTo))\n ) {\n continue;\n }\n\n // Vacate\n if (newId != null) {\n const policyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const policy = srcSheet.policies[policyKey] ?? srcSheet.defaultPolicy;\n const restricted = policy.select({\n sheet: srcSheet,\n point: srcPoint,\n next: { value: null },\n current: srcCell,\n operation: operation.MoveFrom,\n });\n\n wireWrites[newId] = {\n ...restricted,\n policy: beforePolicy,\n };\n this.registry.systems[newId] = { id: newId, sheetId: srcSheet.id, changedTime: Date.now() };\n idWritesSrc.push({ y: srcPoint.y, x: srcPoint.x, id: newId });\n }\n\n // Actual Move\n if (dstId != null && dstPoint != null && dstAddr != null) {\n const dstPolicyKey = afterPolicy || DEFAULT_POLICY_NAME;\n const srcPolicyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const dstPolicyVal = dstSheet.policies[dstPolicyKey] ?? dstSheet.defaultPolicy;\n const srcPolicyVal = srcSheet.policies[srcPolicyKey] ?? srcSheet.defaultPolicy;\n const isSrcWinner = srcPolicyVal.priority > dstPolicyVal.priority;\n const policy = isSrcWinner ? srcPolicyVal : dstPolicyVal;\n\n const restricted = policy.select({\n sheet: dstSheet,\n point: dstPoint,\n next: srcCell,\n current: dstCell,\n operation: operation.MoveTo,\n });\n\n if (restricted) {\n diffBefore[srcId] = srcCell ?? {};\n wireWrites[srcId] = {\n ...srcCell,\n ...restricted,\n policy: isSrcWinner ? beforePolicy : afterPolicy,\n };\n }\n if (srcCell != null) {\n const srcSys = this.registry.systems[srcId];\n if (srcSys) {\n srcSys.changedTime = Date.now();\n }\n }\n\n idWritesDst.push({ y: dstPoint.y, x: dstPoint.x, id: srcId });\n }\n }\n } else {\n // Reverse pass: collect id buffer writes (no registry.data modification)\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n // Move ID that landed at dst back to src\n if (dstAddr != null) {\n const toPoint = a2p(dstAddr);\n const movedId = dstSheet.getId(toPoint);\n if (movedId != null) {\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: movedId });\n }\n }\n\n // Restore lost ID to where it was lost from\n if (lostId != null) {\n if (dstAddr != null) {\n // It was displaced from dst\n const toPoint = a2p(dstAddr);\n idWritesDst.push({ y: toPoint.y, x: toPoint.x, id: lostId });\n } else {\n // It overflowed from src\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: lostId });\n }\n }\n }\n }\n\n // Snapshot idMatrix before flush\n if (!reverse) {\n srcSheet._materializeIdMatrix();\n if (srcSheet !== dstSheet) {\n dstSheet._materializeIdMatrix();\n }\n }\n const srcSnapshot = !reverse ? srcSheet.idMatrix.flat() : null;\n const dstSnapshot = !reverse && srcSheet !== dstSheet ? dstSheet.idMatrix.flat() : null;\n\n // Flush registry.data writes first\n Object.assign(this.registry.data, wireWrites);\n // Then flush idMatrix writes\n for (const { y, x, id } of idWritesSrc) {\n srcSheet._ensureIdRow(y)[x] = id;\n }\n for (const { y, x, id } of idWritesDst) {\n dstSheet._ensureIdRow(y)[x] = id;\n }\n\n // Update lastChangedAddresses\n const changedAddresses: Address[] = moveRelations.filter((r) => r.dst != null).map((r) => r.dst as Address);\n const srcAddresses: Address[] = moveRelations.map((r) => r.src);\n\n if (srcSheet === dstSheet) {\n dstSheet.lastChangedAddresses = [...new Set([...srcAddresses, ...changedAddresses])];\n } else {\n dstSheet.lastChangedAddresses = changedAddresses;\n srcSheet.lastChangedAddresses = srcAddresses;\n }\n\n if (!reverse) {\n preserver.buildMap(srcSnapshot!.flat(), srcSheet.idMatrix.flat());\n if (srcSheet !== dstSheet) {\n preserver.buildMap(dstSnapshot!.flat(), dstSheet.idMatrix.flat());\n }\n const resolvedDiff = preserver.resolveDependents('move');\n Object.assign(diffBefore, resolvedDiff);\n }\n\n return { diffBefore, diffAfter: {} };\n }\n\n /** Build the paste (copy) diff without applying it. Shared by copy()/copyAsync(). @internal */\n private _buildCopyDiff({ srcSheet = this, src, dst, onlyValue = false }: MoveProps & { onlyValue?: boolean }): CellsByAddressType {\n const isXSheet = srcSheet !== this;\n const { top: topFrom, left: leftFrom, bottom: bottomFrom, right: rightFrom } = src;\n const { top: topTo, left: leftTo, bottom: bottomTo, right: rightTo } = dst;\n const diff: CellsByAddressType = {};\n const changedTime = Date.now();\n\n // Build list of visible (non-filtered) rows for src and dst\n const srcVisibleRows: number[] = [];\n for (let y = topFrom; y <= bottomFrom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const dstVisibleRows: number[] = [];\n for (let y = topTo; y <= bottomTo; y++) {\n if (y > this.numRows) {\n continue;\n }\n if (!this.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n }\n }\n\n const srcNumVisibleRows = srcVisibleRows.length;\n const srcNumCols = rightFrom - leftFrom + 1;\n const dstNumCols = rightTo - leftTo + 1;\n\n for (let di = 0; di < dstVisibleRows.length; di++) {\n const toY = dstVisibleRows[di];\n const fromY = srcVisibleRows[di % srcNumVisibleRows];\n for (let j = 0; j <= dstNumCols - 1; j++) {\n const toX = leftTo + j;\n if (toX > this.numCols) {\n continue;\n }\n const fromX = leftFrom + (j % srcNumCols);\n const slideY = isXSheet ? 0 : toY - fromY;\n const slideX = isXSheet ? 0 : toX - fromX;\n const cell: CellType = {\n ...srcSheet.getCell({ y: fromY, x: fromX }, { resolution: 'SYSTEM' }),\n };\n const dstPoint = { y: toY, x: toX };\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n const dstPolicy = this.getPolicy(dstPoint);\n const srcPoint = { y: fromY, x: fromX };\n const srcPolicy = srcSheet.getPolicy(srcPoint);\n const srcCell = srcSheet.getCell(srcPoint, { resolution: 'SYSTEM' });\n\n const isSrcWinner = srcPolicy.priority > dstPolicy.priority;\n cell.policy = isSrcWinner ? srcCell?.policy : dstCell?.policy;\n const dstIdForClear = this.getId(dstPoint);\n this.clearDependencies(dstIdForClear);\n const value =\n (cell?.formulaEnabled ?? true)\n ? this.processFormula(cell?.value, {\n dependency: dstIdForClear,\n slideY,\n slideX,\n })\n : cell?.value;\n const dstId = this.getId(dstPoint);\n const dstSys = this.registry.systems[dstId];\n if (dstSys != null) {\n dstSys.changedTime = changedTime;\n }\n const address = p2a(dstPoint);\n if (onlyValue) {\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n cell.style = dstCell?.style;\n cell.justifyContent = dstCell?.justifyContent;\n cell.alignItems = dstCell?.alignItems;\n }\n diff[address] = { ...cell, value };\n }\n }\n return diff;\n }\n\n public copy(props: MoveProps & { onlyValue?: boolean }) {\n const { operator = 'SYSTEM', undoReflection, redoReflection } = props;\n return this.update({\n diff: this._buildCopyDiff(props),\n partial: false,\n operator,\n operation: operation.Copy,\n undoReflection,\n redoReflection,\n });\n }\n\n /**\n * Async, progress-reporting counterpart to {@link copy} (large paste). Builds AND\n * applies the paste one dst-row-chunk at a time — never materializing the whole\n * diff — so progress advances throughout and peak memory stays to a chunk (the\n * full-diff build was what stalled a 2-million-cell paste at 0%). The source region\n * is snapshotted first so an overlapping paste (e.g. the copied cell is inside the\n * target) never reads an already-pasted value. @internal\n */\n public async copyAsync(\n props: MoveProps & { onlyValue?: boolean },\n opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n frameBudgetMs?: number;\n },\n ): Promise<Sheet> {\n const { srcSheet = this, src, dst, onlyValue = false, operator = 'SYSTEM', undoReflection, redoReflection } = props;\n const { onProgress, yieldControl, frameBudgetMs = 12 } = opts;\n const doYield = yieldControl ?? (() => Promise.resolve());\n\n const isXSheet = srcSheet !== this;\n const { top: topFrom, left: leftFrom, bottom: bottomFrom, right: rightFrom } = src;\n const { top: topTo, left: leftTo, bottom: bottomTo, right: rightTo } = dst;\n const changedTime = Date.now();\n\n const srcVisibleRows: number[] = [];\n for (let y = topFrom; y <= bottomFrom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const srcNumVisibleRows = srcVisibleRows.length;\n const srcNumCols = rightFrom - leftFrom + 1;\n const dstNumCols = rightTo - leftTo + 1;\n\n // Snapshot the (small) source region up front — safe against overlapping paste.\n const srcCells: (CellType | null)[][] = [];\n const srcPolicies: PolicyType[][] = [];\n for (let si = 0; si < srcNumVisibleRows; si++) {\n const fromY = srcVisibleRows[si];\n const cellRow: (CellType | null)[] = [];\n const polRow: PolicyType[] = [];\n for (let sc = 0; sc < srcNumCols; sc++) {\n const fromX = leftFrom + sc;\n cellRow.push(srcSheet.getCell({ y: fromY, x: fromX }, { resolution: 'SYSTEM' }) ?? null);\n polRow.push(srcSheet.getPolicy({ y: fromY, x: fromX }));\n }\n srcCells.push(cellRow);\n srcPolicies.push(polRow);\n }\n\n const out: _UpdateAccum = { diffBefore: {}, diffAfter: {}, changedAddresses: [] };\n const ctx: _UpdateCtx = {\n partial: false,\n updateChangedTime: true,\n ignoreFields: ['label'],\n operator,\n op: operation.Copy,\n formulaIdentify: false, // the formula is already resolved (with slide) in the loop below\n changedTime: Date.now(),\n };\n // Iterate destination rows directly (skipping filtered rows inline) instead of\n // precomputing a visible-row list — that list-building called isRowFiltered() for\n // every row, materializing a million row headers synchronously and stalling at 0%.\n // When nothing is filtered, skip the per-row check entirely.\n const noFilters = this._filteredRows.size === 0;\n const dstBottom = Math.min(bottomTo, this.numRows);\n const total = Math.max(0, dstBottom - topTo + 1);\n let resized = false;\n let lastYield = Date.now();\n let visibleDstIndex = 0;\n let done = 0;\n onProgress?.({ done: 0, total });\n\n for (let toY = topTo; toY <= dstBottom; toY++) {\n done++;\n if (!noFilters && this.isRowFiltered(toY)) {\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done, total });\n await doYield();\n lastYield = Date.now();\n }\n continue;\n }\n const si = visibleDstIndex % srcNumVisibleRows;\n const fromY = srcVisibleRows[si];\n visibleDstIndex++;\n for (let j = 0; j <= dstNumCols - 1; j++) {\n const toX = leftTo + j;\n if (toX > this.numCols) {\n continue;\n }\n const sc = j % srcNumCols;\n const fromX = leftFrom + sc;\n const slideY = isXSheet ? 0 : toY - fromY;\n const slideX = isXSheet ? 0 : toX - fromX;\n const srcCell = srcCells[si][sc];\n const dstPoint = { y: toY, x: toX };\n const dstId = this.getId(dstPoint);\n // Fetch the dst cell ONCE and derive its policy from it — getPolicy() would\n // otherwise getCell() the same point again (a second populate per cell).\n const dstCell = this.registry.data[dstId] ?? this.getCell(dstPoint, { resolution: 'SYSTEM' });\n const dstPolicy =\n dstCell?.policy == null ? this.defaultPolicy : (this.policies[dstCell.policy] ?? this.defaultPolicy);\n const srcPolicy = srcPolicies[si][sc];\n const isSrcWinner = srcPolicy.priority > dstPolicy.priority;\n this.clearDependencies(dstId);\n // Resolve the formula (with the paste offset) here; ctx.formulaIdentify is off,\n // so _applyUpdateCell won't re-run processFormula on the already-resolved value.\n // Skip processFormula entirely for non-formula values (the common bulk case) —\n // it would only tokenize a literal and hand it straight back.\n const srcValue = srcCell?.value;\n const isFormula = typeof srcValue === 'string' && srcValue.charCodeAt(0) === 61; // '='\n const value =\n isFormula && (srcCell?.formulaEnabled ?? true)\n ? this.processFormula(srcValue, { dependency: dstId, slideY, slideX })\n : srcValue;\n const dstSys = this.registry.systems[dstId];\n if (dstSys != null) {\n dstSys.changedTime = changedTime;\n }\n // Build the final cell in one spread (throwaway → _applyUpdateCell owns it).\n const next: CellType = { ...srcCell, value, policy: isSrcWinner ? srcCell?.policy : dstCell?.policy };\n if (onlyValue) {\n next.style = dstCell?.style;\n next.justifyContent = dstCell?.justifyContent;\n next.alignItems = dstCell?.alignItems;\n }\n if (this._applyUpdateCell(dstPoint, dstId, p2a(dstPoint), next, ctx, out, true)) {\n resized = true;\n }\n }\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done, total });\n await doYield();\n lastYield = Date.now();\n }\n }\n this.lastChangedAddresses = out.changedAddresses;\n onProgress?.({ done: total, total });\n\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore: out.diffBefore,\n diffAfter: out.diffAfter,\n partial: false,\n });\n return this.refresh(false, resized);\n }\n\n public getPolicy(point: PointType): PolicyType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' });\n if (cell?.policy == null) {\n return this.defaultPolicy;\n }\n return this.policies[cell.policy] ?? this.defaultPolicy;\n }\n\n /** @internal */\n private _update({\n diff,\n partial = true,\n updateChangedTime = true,\n ignoreFields = ['label'],\n operator = 'SYSTEM',\n operation: op = operation.Update,\n formulaIdentify = true,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n ignoreFields?: CellField[];\n operator?: OperatorType;\n operation?: OperationType;\n formulaIdentify?: boolean;\n }) {\n const out: _UpdateAccum = { diffBefore: {}, diffAfter: {}, changedAddresses: [] };\n const ctx: _UpdateCtx = {\n partial,\n updateChangedTime,\n ignoreFields,\n operator,\n op,\n formulaIdentify,\n changedTime: Date.now(),\n };\n\n let resized = false;\n for (const address of Object.keys(diff)) {\n const point = a2p(address);\n if (this._applyUpdateCell(point, this.getId(point), address, diff[address], ctx, out)) {\n resized = true;\n }\n }\n\n // Store the changed addresses for retrieval via getLastChangedAddresses()\n this.lastChangedAddresses = out.changedAddresses;\n\n //this.clearSolvedCaches();\n return {\n diffBefore: out.diffBefore,\n diffAfter: out.diffAfter,\n resized,\n };\n }\n\n /**\n * Apply one diff entry to registry.data, recording undo/redo state into `out`.\n * Shared by the synchronous `_update` and the chunked `updateAsync` so the two\n * never diverge. Returns whether this cell triggered a resize. @internal\n */\n private _applyUpdateCell(\n point: PointType,\n id: Id,\n address: string,\n rawNext: any,\n ctx: _UpdateCtx,\n out: _UpdateAccum,\n // When the caller hands us a throwaway object it built, mutate it in place instead\n // of copying — saves a spread per cell on the bulk paste/fill path.\n ownNext = false,\n ): boolean {\n const current = this.registry.data[id];\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Update)) {\n return false;\n }\n\n let next: Record<string, any> = ownNext ? rawNext : { ...rawNext };\n\n if (ctx.formulaIdentify && 'value' in next) {\n const formulaEnabled = next.formulaEnabled ?? current?.formulaEnabled ?? true;\n if (formulaEnabled) {\n this.clearDependencies(id);\n next.value = this.processFormula(next.value, { dependency: id });\n }\n }\n ctx.ignoreFields.forEach((key) => {\n next[key] = current?.[key];\n });\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Write)) {\n delete next.value;\n }\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Style)) {\n delete next?.style?.justifyContent;\n delete next?.style?.alignItems;\n }\n if (ctx.operator === 'USER' && operation.hasOperation(current?.prevention, operation.Resize)) {\n delete next?.style?.width;\n delete next?.style?.height;\n }\n let resized = false;\n if (next.width != null || next.height != null) {\n resized = true;\n }\n out.diffBefore[id] = current ?? {};\n\n const policy = this.policies[current?.policy || DEFAULT_POLICY_NAME] ?? this.defaultPolicy;\n // select() returns `next` unchanged (no select options) or a fresh object; either\n // is safe to adopt directly — no need to spread-copy it again.\n next = (policy.select({ sheet: this, point, next, current, operation: ctx.op }) ?? next) as Record<string, any>;\n if (ctx.updateChangedTime) {\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = ctx.changedTime;\n }\n }\n if (ctx.partial) {\n const merged = { ...current, ...next };\n this.registry.data[id] = merged;\n out.diffAfter[id] = merged;\n } else {\n this.registry.data[id] = next;\n out.diffAfter[id] = next;\n }\n // Keep the row-height override cache in sync when a row header's height\n // changes (e.g. a resize goes through this partial-update path, not the\n // stacking path that seeds the cache). getOffsetTop() / setTotalSize() read\n // this cache for vertical positioning, so a stale entry leaves the\n // selection/editor overlay drifting from the actual (correctly sized) cells.\n // Columns are unaffected: setTotalSize reads column widths directly.\n if (point.x === 0 && point.y >= 1) {\n const finalH = this.registry.data[id]?.height;\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n if (finalH != null && finalH !== defaultH) {\n this._rowHeightOverrides.set(point.y, finalH);\n } else {\n this._rowHeightOverrides.delete(point.y);\n }\n }\n out.changedAddresses.push(address);\n return resized;\n }\n\n public update({\n diff,\n partial = true,\n updateChangedTime = true,\n historicize = true,\n operator = 'SYSTEM',\n operation: op = operation.Update,\n ignoreFields,\n undoReflection,\n redoReflection,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n operation?: OperationType;\n ignoreFields?: CellField[];\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { diffBefore, diffAfter, resized } = this._update({\n diff,\n partial,\n operator,\n operation: op,\n updateChangedTime,\n ...(ignoreFields != null ? { ignoreFields } : {}),\n });\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n partial,\n });\n }\n return this.refresh(false, resized);\n }\n\n /**\n * Async, time-sliced counterpart to {@link update}. Applies the diff in chunks,\n * yielding + reporting progress between them, so a bulk write (fill / paste of\n * millions of cells) doesn't freeze the host and can drive a progress bar. Pushes\n * a SINGLE history entry (one undo) and produces the same result as update().\n * The caller is responsible for blocking other mutations while this runs — the\n * sheet is in an intermediate state between chunks.\n */\n public async updateAsync({\n diff,\n partial = true,\n updateChangedTime = true,\n historicize = true,\n operator = 'SYSTEM',\n operation: op = operation.Update,\n ignoreFields = ['label'],\n undoReflection,\n redoReflection,\n onProgress,\n yieldControl,\n frameBudgetMs = 12,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n operation?: OperationType;\n ignoreFields?: CellField[];\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n frameBudgetMs?: number;\n }): Promise<Sheet> {\n const out: _UpdateAccum = { diffBefore: {}, diffAfter: {}, changedAddresses: [] };\n const ctx: _UpdateCtx = {\n partial,\n updateChangedTime,\n ignoreFields,\n operator,\n op,\n formulaIdentify: true,\n changedTime: Date.now(),\n };\n const keys = Object.keys(diff);\n const total = keys.length;\n const doYield = yieldControl ?? (() => Promise.resolve());\n let resized = false;\n let lastYield = Date.now();\n onProgress?.({ done: 0, total });\n for (let i = 0; i < total; i++) {\n const address = keys[i];\n const point = a2p(address);\n if (this._applyUpdateCell(point, this.getId(point), address, diff[address], ctx, out)) {\n resized = true;\n }\n if (Date.now() - lastYield >= frameBudgetMs) {\n onProgress?.({ done: i + 1, total });\n await doYield();\n lastYield = Date.now();\n }\n }\n this.lastChangedAddresses = out.changedAddresses;\n onProgress?.({ done: total, total });\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore: out.diffBefore,\n diffAfter: out.diffAfter,\n partial,\n });\n }\n return this.refresh(false, resized);\n }\n\n /** @internal */\n public writeRawCellMatrix({\n point,\n matrix,\n updateChangedTime = true,\n historicize = true,\n onlyValue = false,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n point: PointType;\n matrix: MatrixType<RawCellType>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n onlyValue?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { y: baseY, x: baseX } = point;\n const diff: CellsByAddressType = {};\n\n // Build list of visible (non-filtered) rows starting from baseY\n // Map src row index (i) -> dst y, skipping filtered rows\n let srcRowIndex = 0;\n let dstY = baseY;\n while (srcRowIndex < matrix.length) {\n if (dstY > this.bottom) {\n break;\n }\n if (this.isRowFiltered(dstY)) {\n dstY++;\n continue;\n }\n const cells = matrix[srcRowIndex];\n cells.forEach((newCell, j) => {\n const x = baseX + j;\n if (x > this.right) {\n return;\n }\n const dstPoint = { y: dstY, x };\n const parsed = this.parse(dstPoint, newCell.value ?? '');\n parsed.style = { ...newCell.style, ...parsed.style };\n if (onlyValue) {\n const currentCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n parsed.style = currentCell?.style;\n parsed.justifyContent = currentCell?.justifyContent;\n parsed.alignItems = currentCell?.alignItems;\n }\n diff[p2a(dstPoint)] = parsed;\n });\n srcRowIndex++;\n dstY++;\n }\n return this.update({\n diff,\n partial: true,\n updateChangedTime,\n historicize,\n operator,\n operation: operation.Write,\n undoReflection,\n redoReflection,\n });\n }\n\n public writeMatrix(props: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const matrixWithStyle: MatrixType<RawCellType> = props.matrix.map((row) => row.map((value) => ({ value })));\n return this.writeRawCellMatrix({ ...props, matrix: matrixWithStyle });\n }\n\n public write(props: {\n point: PointType;\n value: string;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { point, value } = props;\n const parsed = this.parse(point, value ?? '');\n const current = this.getCell(point, { resolution: 'RAW' });\n if ((current?.value ?? null) === parsed.value) {\n // no change (treat undefined and null as equivalent empty values)\n return this;\n }\n const diff = { [p2a(point)]: parsed };\n return this.update({\n ...props,\n diff,\n partial: true,\n operation: operation.Write,\n });\n }\n\n public insertRows({\n y,\n numRows,\n baseY,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumRows !== -1 && this.numRows + numRows > this.maxNumRows) {\n console.error(`Rows are limited to ${this.maxNumRows}.`);\n return this;\n }\n const numCols = this.numCols;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i < numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j <= numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: baseY, x: j }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.idMatrix.splice(y, 0, ...rows);\n this.area.bottom += numRows;\n // Shift existing row-metadata up, then seed the inserted rows from their copied layout\n // so non-default heights / filtered state are reflected immediately (not just on next read).\n this._shiftRowMetaForInsert(y, numRows);\n this._seedRowMeta(y, numRows);\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n y,\n numRows,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertRows) {\n const cloned = this.clone();\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onInsertRows({ sheet: cloned, y, numRows });\n }\n return this.refresh(true, true);\n }\n public removeRows({\n y,\n numRows,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumRows !== -1 && this.numRows - numRows < this.minNumRows) {\n console.error(`At least ${this.minNumRows} row(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const ys: number[] = [];\n this._materializeIdMatrix();\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let yi = y; yi < y + numRows; yi++) {\n const cell = this.getCell({ y: yi, x: 0 }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveRows)) {\n console.warn(`Cannot delete row ${yi}.`);\n return this;\n }\n for (let xi = 1; xi <= this.numCols; xi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi + numRows, x: xi });\n }\n ys.unshift(yi);\n }\n const deleted: MatrixType = [];\n ys.forEach((y) => {\n const row = this.idMatrix.splice(y, 1);\n deleted.unshift(row[0]);\n });\n this.area.bottom -= ys.length;\n // Keep row-metadata caches (keyed by absolute row number) aligned with the new layout.\n this._shiftRowMetaForRemove(y, numRows);\n\n const diffBefore = preserver.resolveDependents('removeRows');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n ys: ys.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveRows) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onRemoveRows({ sheet: cloned, ys: ys.reverse() });\n }\n return this.refresh(true, true);\n }\n\n public insertCols({\n x,\n numCols,\n baseX,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumCols !== -1 && this.numCols + numCols > this.maxNumCols) {\n console.error(`Columns are limited to ${this.maxNumCols}.`);\n return this;\n }\n const numRows = this.numRows;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i <= numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j < numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: i, x: baseX }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this._ensureIdRow(i).splice(x, 0, id);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.area.right += numCols;\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n x,\n numCols,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertCols) {\n const cloned = this.clone();\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onInsertCols({ sheet: cloned, x, numCols });\n }\n return this.refresh(true, true);\n }\n public removeCols({\n x,\n numCols,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumCols !== -1 && this.numCols - numCols < this.minNumCols) {\n console.error(`At least ${this.minNumCols} column(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const xs: number[] = [];\n this._materializeIdMatrix();\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let xi = x; xi < x + numCols; xi++) {\n const cell = this.getCell({ y: 0, x: xi }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveCols)) {\n console.warn(`Cannot delete col ${xi}.`);\n continue;\n }\n for (let yi = 1; yi <= this.numRows; yi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi, x: xi + numCols });\n }\n xs.unshift(xi);\n }\n\n const deleted: MatrixType = [];\n this.idMatrix.forEach((row) => {\n const deleting: Ids = [];\n deleted.push(deleting);\n // reverse and delete\n xs.forEach((x) => {\n deleting.unshift(...row.splice(x, 1));\n });\n });\n this.area.right -= xs.length;\n const diffBefore = preserver.resolveDependents('removeCols');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n xs: xs.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveCols) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n cloned._addressCacheWatermark = 0;\n this.registry.onRemoveCols({ sheet: cloned, xs: xs.reverse() });\n }\n return this.refresh(true, true);\n }\n /** @internal */\n public histories() {\n return [...this.registry.histories];\n }\n /** @internal */\n public historyIndex() {\n return this.registry.historyIndex;\n }\n /** @internal */\n public historySize() {\n return this.registry.histories.length;\n }\n /** @internal */\n public getHistoryLimit() {\n return this.registry.historyLimit;\n }\n\n /** @internal */\n public parse(point: PointType, value: any): CellType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' }) ?? {};\n const policy = this.getPolicy(point);\n return policy.deserializeValue(value, cell);\n }\n\n /** @internal */\n public render(props: RenderProps) {\n const { point, apply } = props;\n const at = this.getId(point);\n const policy = this.getPolicy(point);\n return policy.render({ sheet: this, point, apply, value: undefined });\n }\n\n public getSerializedValue({\n point,\n cell,\n resolution = 'RESOLVED',\n }: {\n point: PointType;\n cell?: CellType;\n resolution?: Resolution;\n }) {\n if (cell == null) {\n // Use raw cell from registry so cell.value is the original formula string.\n // getCell(raise=false) would replace cell.value with undefined, losing the formula.\n const id = this.getId(point);\n cell = id != null ? this.registry.data[id] : undefined;\n }\n if (cell == null) {\n return '';\n }\n const policy = this.getPolicy(point);\n const raw = cell.value;\n\n if (typeof raw === 'string' && raw[0] === '=') {\n if (resolution === 'SYSTEM') {\n return raw; // do not evaluate system references\n }\n if (resolution === 'RAW' || cell?.formulaEnabled === false) {\n const lexer = new Lexer(raw.substring(1));\n lexer.tokenize();\n return '=' + lexer.display({ sheet: this });\n }\n try {\n const id = this.getId(point);\n const solved = solveFormula({ value: raw, sheet: this, point, raise: true, resolution, at: id });\n const value = stripSheet({ value: solved, raise: false });\n return policy.serialize({ value, cell, sheet: this, point });\n } catch (e) {\n return policy.serialize({ value: e, cell, sheet: this, point });\n }\n }\n return policy.serialize({ value: raw, cell, sheet: this, point });\n }\n\n /** @internal */\n public trim(area: AreaType): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n copied.area = area;\n copied._stripped = NONE;\n return copied;\n }\n\n /**\n * Solve all formulas in this sheet and return a 2D matrix of resolved values.\n * @internal\n */\n public solve({ raise = false, at }: { raise?: boolean; at: Id }): any[][] {\n return solveSheet({ sheet: this, raise, at });\n }\n\n /**\n * Collapse this sheet to a scalar (top-left cell value).\n * @internal\n */\n public strip({ raise = false, at }: { raise?: boolean; at?: Id }): any {\n if (!NONE.is(this._stripped)) {\n return this._stripped;\n }\n let value: any = this;\n while (Sheet.is(value)) {\n value = solveSheet({ sheet: value, raise, at })[0]?.[0];\n }\n this._stripped = value;\n return this._stripped;\n }\n\n /** @internal */\n /** Apply one undo/redo diff entry to registry.data. Shared by sync/async. @internal */\n private _applyDiffCell(id: string, cell: CellType, partial: boolean): void {\n let merged: CellType;\n if (partial) {\n merged = { ...this.registry.data[id] };\n (Object.keys(cell) as (keyof CellType)[]).forEach((key) => {\n if (cell[key] === undefined) {\n delete merged[key];\n } else {\n (merged as any)[key] = cell[key];\n }\n });\n } else {\n merged = { ...cell };\n }\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = Date.now();\n }\n this.registry.data[id] = merged;\n this.clearDependencies(id);\n this.processFormula(merged.value, { dependency: id });\n\n // Track row height overrides and filtered state\n const address = this.addressCaches.get(id);\n if (address) {\n const p = a2p(address);\n if (p.x === 0 && p.y > 0) {\n const defaultH = this.defaultRowHeight || DEFAULT_HEIGHT;\n const h = merged.height ?? defaultH;\n if (h !== defaultH) {\n this._rowHeightOverrides.set(p.y, h);\n } else {\n this._rowHeightOverrides.delete(p.y);\n }\n if (merged.filtered) {\n this._filteredRows.add(p.y);\n } else {\n this._filteredRows.delete(p.y);\n }\n }\n }\n }\n\n private _finishApplyDiff(ids: string[]): void {\n this._warmAddressCaches();\n const addresses: Address[] = [];\n for (const id of ids) {\n const address = this.getAddressById(id);\n if (address) {\n addresses.push(address);\n }\n }\n this.lastChangedAddresses = addresses;\n }\n\n private _applyDiff(diff: CellsByIdType = {}, partial = true) {\n const ids = Object.keys(diff);\n for (const id of ids) {\n this._applyDiffCell(id, diff[id] ?? {}, partial);\n }\n this._finishApplyDiff(ids);\n }\n\n /** Chunked, progress-reporting counterpart to _applyDiff (large undo/redo). @internal */\n private async _applyDiffAsync(\n diff: CellsByIdType = {},\n partial = true,\n opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n frameBudgetMs?: number;\n } = {},\n ): Promise<void> {\n const ids = Object.keys(diff);\n const total = ids.length;\n const doYield = opts.yieldControl ?? (() => Promise.resolve());\n const budget = opts.frameBudgetMs ?? 12;\n let lastYield = Date.now();\n opts.onProgress?.({ done: 0, total });\n for (let i = 0; i < total; i++) {\n const id = ids[i];\n this._applyDiffCell(id, diff[id] ?? {}, partial);\n if (Date.now() - lastYield >= budget) {\n opts.onProgress?.({ done: i + 1, total });\n await doYield();\n lastYield = Date.now();\n }\n }\n opts.onProgress?.({ done: total, total });\n // NB: intentionally NOT calling _finishApplyDiff here. This path only runs for a\n // large UPDATE undo/redo (paste/fill), where (a) cell positions don't change, so the\n // addressCaches reverse index stays valid — no need to rebuild all ~millions of\n // entries, and (b) getLastChangedAddresses() has no consumer, so building the address\n // list per changed id is pure work. Doing both synchronously here re-froze the UI at\n // 100% after the chunked apply. lastChangedAddresses is left as-is (unused for UPDATE).\n }\n\n public undo() {\n if (this.registry.historyIndex < 0) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex--];\n history.applyed = false;\n this.registry.currentHistory = this.registry.histories[this.registry.historyIndex];\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffBefore, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.splice(history.y, rows);\n dstSheet.area.bottom -= rows;\n dstSheet._shiftRowMetaForRemove(history.y, rows);\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.forEach((row: string[]) => {\n row.splice(history.x, cols);\n });\n dstSheet.area.right -= cols;\n break;\n }\n case 'REMOVE_ROWS': {\n const { ys, deleted } = history;\n dstSheet._materializeIdMatrix();\n ys.forEach((y, i) => {\n dstSheet.idMatrix.splice(y, 0, deleted[i]);\n });\n dstSheet.area.bottom += ys.length;\n const y0 = Math.min(...ys);\n dstSheet._shiftRowMetaForInsert(y0, ys.length);\n dstSheet._seedRowMeta(y0, ys.length);\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'REMOVE_COLS': {\n const { xs, deleted } = history;\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.forEach((row: string[], i: number) => {\n for (let j = 0; j < xs.length; j++) {\n row.splice(xs[j], 0, deleted[i][j]);\n }\n });\n dstSheet.area.right += xs.length;\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, true);\n }\n const movedAddresses = dstSheet.lastChangedAddresses;\n dstSheet._applyDiff(history.diffBefore, false);\n dstSheet.lastChangedAddresses = [...new Set([...movedAddresses, ...dstSheet.lastChangedAddresses])];\n break;\n }\n case 'SORT_ROWS': {\n dstSheet._materializeIdMatrix();\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, true);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.undoReflection?.transmit);\n },\n };\n }\n\n public redo() {\n if (this.registry.historyIndex + 1 >= this.registry.histories.length) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[++this.registry.historyIndex];\n history.applyed = true;\n this.registry.currentHistory = history;\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffAfter, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.splice(history.y, 0, ...history.idMatrix);\n dstSheet.area.bottom += rows;\n dstSheet._shiftRowMetaForInsert(history.y, rows);\n dstSheet._seedRowMeta(history.y, rows);\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet._materializeIdMatrix();\n dstSheet.idMatrix.map((row: string[], i: number) => {\n row.splice(history.x, 0, ...history.idMatrix[i]);\n });\n dstSheet.area.right += cols;\n break;\n }\n case 'REMOVE_ROWS': {\n dstSheet.removeRows({\n y: history.ys[0],\n numRows: history.ys.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'REMOVE_COLS': {\n dstSheet.removeCols({\n x: history.xs[0],\n numCols: history.xs.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, false);\n }\n break;\n }\n case 'SORT_ROWS': {\n dstSheet._materializeIdMatrix();\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, false);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.redoReflection?.transmit);\n },\n };\n }\n\n /** @internal The history the next undo would apply (without applying it). */\n public peekUndo(): HistoryType | null {\n const idx = this.registry.historyIndex;\n return idx < 0 ? null : this.registry.histories[idx];\n }\n /** @internal The history the next redo would apply. */\n public peekRedo(): HistoryType | null {\n const idx = this.registry.historyIndex + 1;\n return idx >= this.registry.histories.length ? null : this.registry.histories[idx];\n }\n\n /**\n * Async, progress-reporting undo of a large UPDATE (paste/fill). Mirrors the UPDATE\n * branch of undo() but applies diffBefore in chunks. Only call when peekUndo() is an\n * UPDATE; other operations must use the synchronous undo(). @internal\n */\n public async undoAsync(opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n }): Promise<ReturnType<Sheet['undo']>> {\n if (this.registry.historyIndex < 0) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex];\n if (history.operation !== 'UPDATE') {\n return this.undo(); // caller only routes UPDATEs here; be safe for anything else\n }\n this.registry.historyIndex--;\n history.applyed = false;\n this.registry.currentHistory = this.registry.histories[this.registry.historyIndex];\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n await dstSheet._applyDiffAsync(history.diffBefore, history.partial ?? false, opts);\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.undoReflection?.transmit);\n },\n };\n }\n\n /** Async, progress-reporting redo of a large UPDATE (paste/fill). @internal */\n public async redoAsync(opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n }): Promise<ReturnType<Sheet['redo']>> {\n if (this.registry.historyIndex + 1 >= this.registry.histories.length) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex + 1];\n if (history.operation !== 'UPDATE') {\n return this.redo(); // caller only routes UPDATEs here; be safe for anything else\n }\n this.registry.historyIndex++;\n history.applyed = true;\n this.registry.currentHistory = history;\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n await dstSheet._applyDiffAsync(history.diffAfter, history.partial ?? false, opts);\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: { sheetReactive: RefLike<Sheet> }) => {\n sheetRef.current?.registry.transmit(history.redoReflection?.transmit);\n },\n };\n }\n\n /** @internal */\n public getFunctionByName(name: string) {\n return this.registry.functions[name];\n }\n\n /** @internal */\n public clearDependencies(id: Id): void {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n if (sys != null) {\n sys.dependencies = new Set();\n }\n }\n\n /** @internal */\n public addDependency(id: Id, dependency: Id): void {\n const sys = ensureSys(this.registry, id);\n if (sys.dependents == null) {\n sys.dependents = new Set();\n }\n sys.dependents.add(dependency);\n const depSys = ensureSys(this.registry, dependency);\n if (depSys.dependencies == null) {\n depSys.dependencies = new Set();\n }\n depSys.dependencies.add(id);\n }\n\n /** @internal */\n public getSolvedCache(point: PointType): [boolean, any] {\n const id = this.getId(point);\n return [this.registry.solvedCaches.has(id), this.registry.solvedCaches.get(id)];\n }\n /** @internal */\n public setSolvingCache(point: PointType) {\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, SOLVING);\n ensureSys(this.registry, id, { tmpAsyncCaches: {} });\n }\n\n /** @internal */\n public finishSolvedCache(point: PointType, value: any) {\n if (SOLVING.is(value)) {\n return;\n }\n\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, value);\n\n const cell = this.registry.data[id];\n if (cell == null) {\n return;\n }\n const sys = this.registry.systems[id];\n const tmp = sys?.tmpAsyncCaches;\n\n if (tmp != null) {\n if (Object.keys(tmp).length > 0) {\n cell.asyncCaches = tmp;\n } else {\n delete cell.asyncCaches;\n }\n delete sys!.tmpAsyncCaches;\n }\n }\n\n /** @internal */\n public clearSolvedCaches() {\n this.registry.solvedCaches.clear();\n for (const id of this.registry.lastSpilledTargetIds) {\n const sys = this.registry.systems[id];\n if (sys?.spilledFrom != null) {\n delete sys.spilledFrom;\n }\n }\n this.registry.lastSpilledTargetIds.clear();\n }\n\n /**\n * Spill a 2D matrix of values starting from the origin cell.\n * The origin cell receives matrix[0][0] and adjacent cells receive spill values in solvedCaches.\n * For a 1×1 matrix, no spill occurs — the single value is cached directly.\n * Throws FormulaError('#REF!') if the spill range is obstructed.\n *\n * @param origin The anchor cell that produced the spill.\n * @param matrix The 2D array of resolved scalar values.\n * @returns The top-left value (matrix[0][0]).\n * @internal\n */\n public spill(origin: PointType, matrix: any[][]): any {\n const numRows = matrix.length;\n const numCols = numRows > 0 ? matrix[0].length : 0;\n\n // Single cell result (1×1) — no spill needed\n if (numRows <= 1 && numCols <= 1) {\n return matrix[0]?.[0];\n }\n\n // Multi-cell result — check for obstructions\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n if (i === 0 && j === 0) {\n continue;\n }\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n const address = p2a(targetPoint);\n if (targetId == null) {\n console.warn(`Spill target ${address} is out of bounds.`);\n continue;\n }\n const targetCell = this.registry.data[targetId];\n if (targetCell?.value != null && targetCell.value !== '') {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because it would overwrite data in ${address}.`,\n );\n }\n // If solvedCaches already has an entry for this cell, another formula\n // (including another spill) has already written here — treat as obstruction.\n if (this.registry.solvedCaches.has(targetId)) {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because ${address} is already occupied by another formula.`,\n );\n }\n }\n }\n\n // All clear — write values into solvedCaches\n const originId = this.getId(origin);\n const spilledAddresses: Address[] = [];\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n if (targetId == null) {\n continue;\n }\n this.finishSolvedCache(targetPoint, matrix[i][j]);\n if (i !== 0 || j !== 0) {\n spilledAddresses.push(p2a(targetPoint));\n // Mark target cell as spilled from the origin formula cell.\n // The spilled value is cached above regardless of whether the target\n // cell has a data entry yet (empty cells are populated lazily), so the\n // spilledFrom marker must be set unconditionally too — otherwise an\n // empty spill target shows its value but is not recognised as spilled\n // (formula bar shows its own address instead of the origin, stays editable).\n if (originId != null) {\n const sys = ensureSys(this.registry, targetId, {});\n sys.spilledFrom = p2a(origin);\n this.registry.lastSpilledTargetIds.add(targetId);\n }\n }\n }\n }\n\n return matrix[0][0];\n }\n\n /** @internal */\n public sheetPrefix(omit = false) {\n if (omit) {\n return '';\n }\n return toSheetPrefix(this.name);\n }\n /** @internal */\n public rangeToArea(range: string) {\n const cells = range.split(':');\n let [start, end] = cells;\n if (start.match(/[a-zA-Z]$/)) {\n start += '1';\n }\n if (start.match(/^[1-9]/)) {\n start = `A${start}`;\n }\n if (end?.match(/[a-zA-Z]$/)) {\n end += this.bottom;\n }\n if (end?.match(/^[1-9]/)) {\n end = `${x2c(this.right)}${end}`;\n }\n const { y: top, x: left } = a2p(start);\n const { y: bottom, x: right } = a2p(end || start);\n return {\n top: Math.abs(top),\n left: Math.abs(left),\n bottom: Math.abs(bottom),\n right: Math.abs(right),\n };\n }\n\n get __raw__(): Sheet {\n return this;\n }\n\n get shape() {\n return areaShape(this.area);\n }\n get hasSingleCell() {\n const shape = this.shape;\n return shape.rows === 1 && shape.cols === 1;\n }\n get currentVersion() {\n return this.version;\n }\n}\n","import { Pending, SOLVING, Spilling } from '../sentinels';\nimport { Sheet } from '../lib/sheet';\nimport type { Id, MatrixType, PointType, Resolution } from '../types';\nimport { Lexer, Parser } from './evaluator';\nimport { FormulaError } from './formula-error';\n\nexport type SolveOptions = {\n raise?: boolean;\n resolution?: Resolution;\n};\n\ntype SolveFormulaProps = {\n value: any;\n sheet: Sheet;\n point: PointType;\n raise?: boolean;\n resolution?: Resolution;\n at?: Id;\n};\n\n/**\n * Evaluates a single cell value (formula or literal) within the context of a sheet.\n * Handles caching, circular reference detection, spilling, and async pending states.\n * Returns the resolved scalar value (or error) for the given cell.\n */\nexport const solveFormula = ({ value, sheet, point, raise = true, resolution = 'RESOLVED', at }: SolveFormulaProps) => {\n const [hit, cache] = sheet.getSolvedCache(point);\n if (hit && value == null && !SOLVING.is(cache)) {\n // spilled value\n return cache;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n if (resolution === 'SYSTEM') {\n return value;\n }\n if (value.charAt(0) === \"'\") {\n return resolution === 'RAW' ? value : value.substring(1);\n }\n if (value.charAt(0) !== '=') {\n return value;\n }\n if (resolution === 'RAW') {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n return '=' + lexer.display({ sheet });\n }\n\n let solved: any = value;\n if (hit && !SOLVING.is(cache)) {\n solved = cache;\n } else {\n try {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n const parser = new Parser(lexer.tokens);\n const expr = parser.build();\n solved = expr?.evaluate?.({ sheet });\n } catch (e) {\n if (raise) {\n sheet.finishSolvedCache(point, e);\n throw e;\n }\n return e;\n }\n }\n\n if (Spilling.is(solved)) {\n solved = sheet.spill(point, solved.matrix);\n } else {\n sheet.finishSolvedCache(point, solved);\n }\n\n if (resolution === 'RESOLVED' && Sheet.is(solved)) {\n solved = stripSheet({ value: solved, raise, at });\n }\n if (Pending.is(solved)) {\n sheet.finishSolvedCache(point, solved);\n }\n return solved;\n};\n\nexport type SolveSheetProps = {\n sheet: Sheet;\n raise?: boolean;\n at?: Id;\n};\n\n/**\n * Evaluates all cells in a Sheet and returns the results as a 2D array (MatrixType).\n * Each cell formula is resolved in order, with caching to avoid redundant computation.\n * Use this when you need the full evaluated contents of a range.\n */\nexport const solveSheet = ({ sheet, raise = true, at }: SolveSheetProps): MatrixType => {\n const area = sheet.area;\n const matrix = sheet._toValueMatrix({ area, at, resolution: 'SYSTEM' });\n return matrix.map((row, i) => {\n const y = area.top + i;\n return row.map((value, j) => {\n const x = area.left + j;\n const point = { y, x };\n const [hit, cache] = sheet.getSolvedCache(point);\n try {\n if (SOLVING.is(cache)) {\n throw new FormulaError('#REF!', 'References are circulating.', new Error(value as string));\n } else if (Pending.is(cache)) {\n return cache;\n } else if (FormulaError.is(cache)) {\n throw cache;\n } else if (cache != null) {\n return cache;\n }\n sheet.setSolvingCache(point);\n const solved = solveFormula({ value, sheet, point, raise, at, resolution: 'RESOLVED' });\n sheet.finishSolvedCache(point, solved);\n return solved;\n } catch (e) {\n sheet.finishSolvedCache(point, e);\n if (raise) {\n throw e;\n }\n return e;\n }\n });\n });\n};\n\nexport type StripSheetProps = {\n value: any;\n at?: Id;\n raise?: boolean;\n};\n\nexport const stripSheet = ({ value, at, raise = true }: StripSheetProps): any => {\n if (Sheet.is(value)) {\n return value.strip({ raise, at });\n }\n return value;\n};\n","import { Pending, Sentinel, Spilling } from '../../sentinels';\nimport { FormulaError } from '../formula-error';\nimport { ensureSys, setAsyncCache } from '../../lib/cell';\nimport type { Registry } from '../../lib/book';\nimport type { CellType, Id, PointType } from '../../types';\nimport type { Sheet } from '../../lib/sheet';\nimport { toValueMatrix } from '../../lib/sheet_utils';\n\n/**\n * Sentinel value to distinguish cache miss from user-returned undefined/null.\n * Since user functions can return undefined or null, we need a special marker\n * to indicate \"no cache entry found\" vs \"cache entry is undefined\".\n */\nexport const asyncCacheMiss = new Sentinel('asyncCacheMiss');\n\n/** Returns true if any element of `args` is a Pending sentinel. */\nexport const hasPendingArg = (args: any[]): boolean => {\n return args.some((v) => Pending.is(v));\n};\n\nconst isSheet = (value: any): value is Sheet => {\n return value?.__gsType === 'Sheet';\n};\n\n/**\n * Recursively check whether any value in the structure is a Pending sentinel.\n * Handles flat values, nested arrays, and Sheet objects (via getFieldMatrix).\n */\nexport const hasDeepPending = (values: any[], at: Id): boolean => {\n for (const v of values) {\n if (Pending.is(v)) {\n return true;\n }\n if (Array.isArray(v)) {\n if (hasDeepPending(v, at)) {\n return true;\n }\n }\n if (Spilling.is(v)) {\n if (hasDeepPending(v.matrix, at)) {\n return true;\n }\n }\n if (isSheet(v)) {\n if (hasDeepPending(v._toValueMatrix({ at }), at)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * cyrb53 – a fast, high-quality 53-bit string hash.\n * Returns a non-negative integer that fits safely in a JS Number.\n */\nconst cyrb53 = (str: string, seed = 0): number => {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\n\n/**\n * Build a cache key from function name + hashed serialised arguments.\n *\n * Format: `funcName:length:hash1-hash2-...`\n * - length: byte length of the JSON-serialised args\n * - hash: cyrb53 hash of the JSON string, repeated hashPrecision times with different seeds\n *\n * When a Sheet appears as an argument its trimmed area is converted to a\n * value matrix (`any[][]`) via `getFieldMatrix()` so the key reflects the\n * actual cell values the function will operate on.\n */\nexport const buildAsyncCacheKey = (funcName: string, args: any[], hashPrecision: number = 1): string => {\n const argsJson = JSON.stringify(args, (_key, value) => {\n if (isSheet(value)) {\n return toValueMatrix(value);\n }\n if (Pending.is(value)) {\n return null;\n }\n return value;\n });\n const hashes = Array.from({ length: hashPrecision }, (_, i) => cyrb53(argsJson, i).toString(36));\n return `${funcName}:${argsJson.length}:${hashes.join('-')}`;\n};\n\n/**\n * Try to retrieve a cached or pending async result for the given cache key.\n *\n * Returns:\n * - Cached value if present, valid, and not expired\n * - Pending if there is an in-flight promise for this cell\n * - asyncCacheMiss if no cache/pending exists (distinguishes from user-returned undefined/null)\n */\nexport const getAsyncCache = (\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n useInflight: boolean = false,\n): any => {\n const registry = sheet.registry;\n const cell: CellType | undefined = registry.data[id];\n\n if (cell == null) {\n return asyncCacheMiss;\n }\n\n const sys = ensureSys(registry, id, { tmpAsyncCaches: {} });\n\n // Check for a cached result from a previous async run\n if (cell.asyncCaches != null) {\n const ac = cell.asyncCaches[key];\n if (ac != null) {\n // Check expiry\n if (ac.expireTime == null || Date.now() < ac.expireTime) {\n sys.tmpAsyncCaches![key] = ac;\n return ac.value;\n }\n // Expired — will not be copied to tmpAsyncCaches\n }\n }\n\n const compositeKey = `${id}:${key}`;\n\n // Check if there is already a pending promise for this cell+key\n if (registry.asyncPending.has(compositeKey)) {\n return registry.asyncPending.get(compositeKey)!;\n }\n\n // If useInflight is enabled, check for an in-flight promise with the same cache key\n if (useInflight && registry.asyncInflight?.has(key)) {\n const inflight = registry.asyncInflight.get(key)!;\n // Track for this cell+key to prevent duplicate `.then` attachment and correctly yield the pending sentinel\n registry.asyncPending.set(compositeKey, inflight.pending);\n\n // Chain to the shared promise to populate this cell's cache when it resolves\n inflight.pending.promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime: inflight.expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime: inflight.expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n });\n\n return inflight.pending;\n }\n\n return asyncCacheMiss;\n};\n\n/**\n * Handle an async (Promise) result returned by BaseFunction.main().\n *\n * Cache is stored per-cell in cell.asyncCache.\n * In-flight tracking uses Binding.asyncPending (keyed by cell ID).\n * If useInflight is true, also tracks by cache key in Binding.asyncInflight.\n *\n * Flow:\n * 1. If cell has asyncCache and the key matches (inputs unchanged) and not expired → return cached value\n * 2. If there is already an in-flight promise for this cell → return its Pending\n * 3. If useInflight is true and there is an in-flight promise for this key → return its Pending\n * 4. Otherwise start the async work, return a new Pending, and on completion\n * write the result into cell.asyncCache and trigger a re-render.\n *\n * @param ttlMilliseconds - Cache time-to-live in **milliseconds**. undefined = never expires.\n * @param useInflight - If true, reuse the same promise for matching cache keys across different cells.\n */\nexport const awaitAndSave = (\n promise: Promise<any>,\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n ttlMilliseconds?: number,\n useInflight: boolean = false,\n): Pending => {\n const registry = sheet.registry;\n\n // Compute expireTime from ttl (ms)\n const expireTime = ttlMilliseconds != null ? Date.now() + ttlMilliseconds : undefined;\n\n const compositeKey = `${id}:${key}`;\n\n // Start the async computation\n const pending = new Pending(promise);\n registry.asyncPending.set(compositeKey, pending);\n\n // If useInflight is enabled, also track by cache key\n if (useInflight) {\n if (!registry.asyncInflight) {\n registry.asyncInflight = new Map();\n }\n registry.asyncInflight.set(key, { pending, expireTime });\n }\n\n promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n // If useInflight was enabled, also remove from asyncInflight\n if (useInflight) {\n if (registry.asyncInflight) {\n registry.asyncInflight.delete(key);\n }\n }\n // Clear solvedCaches so dependent formulas re-evaluate\n registry.solvedCaches.clear();\n // Trigger re-render of all sheets\n registry.transmit();\n });\n\n return pending;\n};\n\n/**\n * Create a Pending sentinel that resolves immediately.\n * Used when an argument is already pending — the result is propagated.\n */\nexport const createPropagatedPending = (): Pending => {\n return new Pending(Promise.resolve());\n};\n","import { stripSheet } from '../solver';\nimport { Sheet } from '../../lib/sheet';\nimport { FormulaError } from '../formula-error';\nimport dayjs from 'dayjs';\nimport { FULLDATE_FORMAT_UTC } from '../../constants';\nimport { Pending, Spilling } from '../../sentinels';\nimport type { Id, PointType } from '../../types';\nimport { Time } from '../../lib/time';\n\nexport const gt = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) > ensureString(right);\n }\n try {\n return ensureNumber(left) > ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const gte = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) >= ensureString(right);\n }\n try {\n return ensureNumber(left) >= ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const lt = (left: any, right: any): boolean => {\n return !gte(left, right);\n};\n\nexport const lte = (left: any, right: any): boolean => {\n return !gt(left, right);\n};\n\nexport const eq = (left: any, right: any): boolean => {\n return ensureString(left).toLowerCase() === ensureString(right).toLowerCase();\n};\n\nexport const ne = (left: any, right: any): boolean => {\n return !eq(left, right);\n};\n\nexport type EnsureNumberOptions = {\n alternative?: number;\n ignore?: boolean;\n};\n\nexport type EnsureBooleanOptions = {\n alternative?: boolean;\n ignore?: boolean;\n};\n\nexport const isPercentage = (value: any): value is string => {\n if (typeof value !== 'string' || !value.endsWith('%')) {\n return false;\n }\n return !isNaN(parseFloat(value.slice(0, -1)));\n};\n\nexport const isNumeric = (value: any): boolean => {\n if (typeof value === 'number') {\n return true;\n }\n if (isPercentage(value)) {\n return true;\n }\n if (typeof value === 'string') {\n return !isNaN(parseFloat(value)) && isFinite(Number(value));\n }\n return false;\n};\n\nexport const ensureNumber = (value: any, options?: EnsureNumberOptions): number => {\n const { alternative, ignore } = options || {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (!value) {\n // falsy is 0\n return 0;\n }\n if (Sheet.is(value)) {\n const v = stripSheet({ value });\n return ensureNumber(v, { alternative });\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n if (Time.is(value)) {\n return value.days;\n }\n\n if (isPercentage(value)) {\n return parseFloat(value.slice(0, -1)) / 100;\n }\n\n const num = parseFloat(value as string);\n if (isNaN(num)) {\n if (ignore) {\n return alternative ?? 0;\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a number`);\n }\n return num;\n};\n\nexport const ensureString = (value: any): string => {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value === 0) {\n return '0';\n }\n if (!value) {\n return '';\n }\n if (Sheet.is(value)) {\n const v = stripSheet({ value });\n return ensureString(v);\n }\n switch (value.constructor.name) {\n case 'Date': {\n const d: Date = value;\n return dayjs(d).format(FULLDATE_FORMAT_UTC);\n }\n default:\n return String(value);\n }\n};\n\nexport const ensureBoolean = (value: any, options?: EnsureBooleanOptions): boolean => {\n const { alternative, ignore } = options ?? {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (value === null) {\n return false;\n }\n if (Sheet.is(value)) {\n const v = stripSheet({ value });\n return ensureBoolean(v, options);\n }\n if (typeof value === 'string' || value instanceof String) {\n const bool = { true: true, false: false }[value.toLowerCase()];\n if (bool == null) {\n if (ignore) {\n return false;\n }\n throw new FormulaError('#VALUE!', `text '${value as string}' cannot be converted to a boolean`);\n }\n return bool;\n }\n return Boolean(value);\n};\n\n/**\n * Converts a value to a Date object.\n * Accepts: Date, number (ms since epoch), string (parseable date string).\n */\nexport function ensureDate(value: any): Date {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value instanceof Date) {\n return value;\n }\n if (Sheet.is(value)) {\n const v = stripSheet({ value });\n return ensureDate(v);\n }\n if (typeof value === 'number') {\n return new Date(value);\n }\n if (typeof value === 'string') {\n const d = new Date(value);\n if (!isNaN(d.getTime())) {\n return d;\n }\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a date`);\n}\n\nconst CONDITION_REGEX = /^(<=|>=|<>|>|<|=)?(.*)$/;\n\nexport const check = (value: any, condition: string): boolean => {\n const m = condition.match(CONDITION_REGEX);\n\n const [, expr = '', target = ''] = m || [];\n let comparison: any = target;\n if (expr === '>' || expr === '<' || expr === '>=' || expr === '<=') {\n if (typeof value === 'number') {\n comparison = parseFloat(target);\n }\n switch (expr) {\n case '>':\n return gt(value, comparison);\n case '>=':\n return gte(value, comparison);\n case '<':\n return lt(value, comparison);\n case '<=':\n return lte(value, comparison);\n }\n }\n\n const equals = expr === '' || expr === '=';\n if (target === '') {\n // empty target means \"\" or \"<>\"\n return (value == null || value === '') === equals;\n }\n\n if (typeof value === 'string' || value instanceof String) {\n const replaced = target\n .replace(/~\\*/g, '(\\\\*)')\n .replace(/~\\?/g, '(\\\\?)')\n .replace(/\\*/g, '(.*)')\n .replace(/\\?/g, '(.)');\n const regex = RegExp(`^${replaced}$`, 'i');\n return regex.test(value as string) === equals;\n }\n return eq(value, comparison) === equals;\n};\n\nexport const eachMatrix = (value: any, callback: (v: any, relativePoint: PointType) => void, at: Id) => {\n if (Sheet.is(value)) {\n const matrix = value.solve({ at });\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let y = 0; y < value.length; y++) {\n for (let x = 0; x < value[y].length; x++) {\n callback(value[y][x], { y, x });\n }\n }\n } else {\n callback(value, { y: 0, x: 0 });\n }\n};\n\nexport const createBooleanMask = (sheets: Sheet[], conditions: string[], at: Id): boolean[][] => {\n if (sheets.length === 0) {\n return [];\n }\n const refRange = sheets[0];\n const numRows = refRange.numRows;\n const numCols = refRange.numCols;\n\n const mask: boolean[][] = Array.from({ length: numRows }, () => Array(numCols).fill(true));\n\n for (let p = 0; p < sheets.length; p++) {\n const condRange = sheets[p];\n const condition = conditions[p];\n eachMatrix(\n condRange,\n (v: any, pt: PointType) => {\n mask[pt.y][pt.x] &&= check(v, condition);\n },\n at,\n );\n }\n return mask;\n};\n","import { type Sheet } from '../../lib/sheet';\n\n/** Duck-type check for Sheet instances (avoids runtime import cycle). */\nexport const isSheet = (v: any): v is Sheet => v?.__gsType === 'Sheet';\n/** Duck-type check for Time instances (avoids runtime import cycle). */\nconst isTime = (v: any): boolean => v != null && v.__gsType === 'Time';\nimport { Spilling } from '../../sentinels';\nimport type { Id } from '../../types';\nimport { FormulaError } from '../formula-error';\nimport { stripSheet } from '../../formula/solver';\nimport type { Expression } from '../evaluator';\nimport {\n hasPendingArg,\n hasDeepPending,\n buildAsyncCacheKey,\n awaitAndSave,\n createPropagatedPending,\n getAsyncCache,\n asyncCacheMiss,\n} from './__async';\nimport { Time } from '../../lib/time';\nimport { isNumeric, isPercentage } from './__utils';\n\nexport type FunctionCategory =\n | 'math'\n | 'statistics'\n | 'text'\n | 'time'\n | 'lookup'\n | 'information'\n | 'finance'\n | 'engineering'\n | 'logical'\n | 'other'\n // Open the union: the literals above are built-in autocomplete hints, but plugins may define\n // their own category (e.g. 'ai' in the CSV viewer). `string & {}` keeps literal suggestions\n // while allowing any string — category is a display-only label (badge text + CSS class), never\n // branched on — so no core code needs to know a plugin's categories.\n | (string & {});\n\nexport type FunctionProps = {\n args: Expression[];\n sheet: Sheet;\n at?: Id;\n};\n\nexport type FunctionArgumentType = 'number' | 'string' | 'boolean' | 'date' | 'time' | 'matrix' | 'reference' | 'any';\n\nexport type FunctionArgumentDefinition = {\n name: string;\n description: string;\n // if true, this argument can be omitted (i.e. fewer args than defs.length is allowed)\n optional?: boolean;\n // If true, blank will be treated as 0 for numbers, \"\" for strings, etc. Default: true\n nullable?: boolean;\n variadic?: boolean;\n\n errorTolerant?: boolean;\n acceptedTypes?: FunctionArgumentType[];\n /** When true, this argument takes a range/matrix value — broadcasting is suppressed for it. */\n takesMatrix?: boolean;\n};\n\nexport const conditionArg: FunctionArgumentDefinition = {\n name: 'condition',\n description:\n 'The condition to evaluate. Use \"=\" for equal, \"<\" for less than, \">\" for greater than, \"<=\" for less than or equal, \">=\" for greater than or equal, \"<>\" for not equal.',\n acceptedTypes: ['any'],\n};\n\n/**\n * Check whether a value matches one of the allowed type names\n * from a FunctionArgumentDefinition.acceptedTypes array.\n */\nconst matchesType = (\n value: any,\n { nullable = true, errorTolerant = false, acceptedTypes }: FunctionArgumentDefinition,\n): boolean => {\n if (!acceptedTypes || acceptedTypes.length === 0) {\n return true;\n }\n if (value == null) {\n return nullable;\n }\n if (FormulaError.is(value) || value instanceof Error) {\n if (errorTolerant) {\n return true;\n }\n throw value;\n }\n for (const t of acceptedTypes) {\n switch (t) {\n case 'any':\n return true;\n case 'number':\n if (isNumeric(value)) {\n return true;\n }\n break;\n case 'string':\n if (typeof value === 'string') {\n return true;\n }\n break;\n case 'boolean':\n if (typeof value === 'boolean') {\n return true;\n }\n break;\n case 'date':\n if (value instanceof Date) {\n return true;\n }\n break;\n case 'time':\n if (Time.is(value)) {\n return true;\n }\n break;\n case 'matrix':\n if (isMatrix(value)) {\n return true;\n }\n break;\n case 'reference':\n if (isSheet(value)) {\n return true;\n }\n break;\n }\n }\n return false;\n};\n\n/**\n * Check if a value is a \"matrix\" (Sheet, Spilling, or 2D array).\n */\nexport const isMatrix = (value: any): boolean => {\n return isSheet(value) || Spilling.is(value) || (Array.isArray(value) && Array.isArray(value[0]));\n};\n\n/**\n * Extract the scalar from a 1×1 matrix (Sheet, Spilling, or plain 2D array).\n * Returns the value unchanged if it is not a matrix.\n */\nexport const stripMatrix = (value: any, at: Id): any => {\n if (!isMatrix(value)) {\n return value;\n }\n if (isSheet(value)) {\n return stripSheet({ value, raise: false, at });\n }\n const m: any[][] = Spilling.is(value) ? value.matrix : value;\n let val = m?.[0]?.[0];\n return val;\n};\n\n/**\n * Check if a value is a matrix that is larger than 1×1.\n */\nexport const isMultiCell = (value: any): boolean => {\n if (isSheet(value)) {\n return !value.hasSingleCell;\n }\n if (Spilling.is(value)) {\n const m = value.matrix;\n return m.length > 1 || (m.length === 1 && m[0].length > 1);\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value.length > 1 || value[0].length > 1;\n }\n return false;\n};\n\n/**\n * Resolve which FunctionArgumentDefinition index each args position maps to,\n * accounting for variadic args at the tail.\n *\n * Example: args = [A, B(variadic), C(variadic)], args has 7 elements\n * positions 0 → A, 1 → B, 2 → C, 3 → B, 4 → C, 5 → B, 6 → C\n */\nconst resolveParamIndex = (defs: FunctionArgumentDefinition[], argCount: number): number[] => {\n const indices: number[] = [];\n\n // Find the first variadic arg position\n let iterStart = -1;\n let iterCount = 0;\n for (let i = 0; i < defs.length; i++) {\n if (defs[i].variadic) {\n if (iterStart < 0) {\n iterStart = i;\n }\n iterCount++;\n }\n }\n\n for (let i = 0; i < argCount; i++) {\n if (iterStart >= 0 && i >= iterStart) {\n // Map extra args round-robin across variadic args\n const j = (i - iterStart) % iterCount;\n indices.push(iterStart + j);\n } else if (i < defs.length) {\n indices.push(i);\n } else {\n // Beyond defs and no variadic — fall back to last def\n indices.push(defs.length - 1);\n }\n }\n return indices;\n};\n\nexport class BaseFunction {\n public defs: FunctionArgumentDefinition[] = [];\n public example: string | undefined;\n public description = '';\n public category: FunctionCategory = 'other';\n /** Indicates if this function is async. Override in subclass or use BaseFunctionAsync. */\n protected isAsync: boolean = false;\n /** Cache TTL in milliseconds. Override in subclass to set expiry. undefined = never expires. */\n protected ttlMilliseconds?: number;\n /** Hash precision for cache key generation. Higher values reduce collision risk. Default: 1 */\n protected hashPrecision: number = 1;\n /** If true, reuse the same in-flight promise for matching cache keys across different cells. */\n protected useInflight: boolean = true;\n /** If true, broadcasting is unconditionally disabled for this function. */\n protected broadcastDisabled: boolean = false;\n protected args: any[];\n protected autoSpilling: boolean = false;\n public sheet: Sheet;\n public at: Id;\n static __name = '';\n /**\n * Static async marker, readable from the class without instantiating it\n * (e.g. `registry.functions[name].isAsync`). Lets the formula indexer decide\n * whether a cell needs eager resolution. Kept in sync with the instance\n * `isAsync`; `BaseFunctionAsync` flips both to true.\n */\n static isAsync = false;\n\n constructor({ args, sheet, at }: FunctionProps) {\n this.args = args.map((a) => {\n try {\n return a.evaluate({ sheet });\n } catch (e) {\n return e;\n }\n });\n this.sheet = sheet;\n this.at = at ?? '?';\n }\n\n private _main(...args: any[]): any {\n if (this.autoSpilling) {\n // @ts-expect-error main is not defined in BaseFunction\n const result = this.main(...args);\n // Async main() returns a Promise: wrap the RESOLVED matrix, not the Promise itself\n // (a Spilling holding a Promise never spills). The resolved Spilling then flows through\n // the async cache and the solver spills it — same as a sync autoSpilling function.\n if (this.isAsync) {\n return Promise.resolve(result).then((matrix) => new Spilling(matrix));\n }\n return new Spilling(result);\n }\n // @ts-expect-error main is not defined in BaseFunction\n return this.main(...args);\n }\n\n /**\n * Validate and normalise arguments before `main()` is called.\n *\n * Checks:\n * 1. Argument count satisfies defs (respecting optional / variadic).\n * 2. Each argument's runtime type matches the corresponding def's `type` list.\n *\n * Subclasses may override for additional coercion / spreading.\n */\n protected validate(args: any[]): any[] {\n const validatedArgs = [...args];\n\n const defs = this.defs;\n if (defs.length === 0) {\n if (args.length !== 0) {\n throw new FormulaError('#N/A', 'Too many arguments: expected 0, got ' + args.length + '.');\n }\n return validatedArgs;\n }\n\n // --- argument count check ---\n // minArgs: count of defs that are neither optional nor variadic,\n // plus non-optional variadic defs (need at least one instance each).\n let minArgs = 0;\n let hasIterable = false;\n let variadicCount = 0;\n for (const d of defs) {\n if (d.variadic) {\n hasIterable = true;\n variadicCount++;\n if (!d.optional) {\n minArgs++;\n }\n } else if (!d.optional) {\n minArgs++;\n }\n }\n\n if (args.length < minArgs) {\n throw new FormulaError('#N/A', `Too few arguments: expected at least ${minArgs}, got ${args.length}.`);\n }\n\n // maxArgs: if no variadic defs, max = defs.length\n if (!hasIterable && args.length > defs.length) {\n throw new FormulaError('#N/A', `Too many arguments: expected at most ${defs.length}, got ${args.length}.`);\n }\n\n // --- per-argument type check ---\n const indices = resolveParamIndex(defs, args.length);\n for (let i = 0; i < args.length; i++) {\n const def = defs[indices[i]];\n if (!def) {\n continue;\n }\n let value = args[i];\n if (!def.acceptedTypes || def.acceptedTypes.length === 0) {\n continue;\n }\n\n if (isMultiCell(value)) {\n if (!def.takesMatrix) {\n continue;\n }\n } else if (isMatrix(value)) {\n // For 1x1 Sheet, Spilling, or plain 2D array, extract the single value for validation.\n // UNLESS the definition explicitly takes a matrix (e.g. SUM(A1) — let it pass through).\n if (!def.takesMatrix) {\n value = stripMatrix(value, this.at);\n }\n }\n if (isPercentage(value)) {\n value = parseFloat(value.slice(0, -1)) / 100;\n }\n if (!matchesType(value, def)) {\n throw new FormulaError(\n '#VALUE!',\n `Argument \"${def.name}\" (position ${i + 1}) expected ${def.acceptedTypes.join(' | ')}, got ${typeof value}.`,\n );\n }\n validatedArgs[i] = value;\n }\n return validatedArgs;\n }\n\n eachMatrix = (value: any, callback: (v: any) => void) => {\n if (isSheet(value)) {\n const matrix = value.solve({ at: this.at, raise: true });\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let r = 0; r < value.length; r++) {\n for (let c = 0; c < value[r].length; c++) {\n callback(value[r][c]);\n }\n }\n } else {\n callback(value);\n }\n };\n\n /**\n * Extract a 2D array from a matrix value (Spilling, Sheet, or nested array).\n * Default behavior for Sheet is value.solve(). Functions like COL can override\n * this to preserve Sheet metadata per cell.\n */\n protected toMatrix(value: any): any[][] {\n if (Spilling.is(value)) {\n return value.matrix;\n }\n if (isSheet(value)) {\n return value.solve({ at: this.at });\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value;\n }\n return [[value]];\n }\n\n /**\n * Collapse a 1×1 matrix value (Sheet, Spilling, or 2D array) to a scalar.\n * Non-matrix values pass through unchanged.\n *\n * Override in sub-classes that need the original Sheet / reference\n * metadata (e.g. COL, ROW) — for instance, to extract position\n * information before collapsing.\n */\n protected toScalar(value: any): any {\n if (isSheet(value)) {\n const { rows, cols } = value.shape;\n if (rows === 1 && cols === 1) {\n return value.strip({});\n }\n return value;\n }\n if (Spilling.is(value)) {\n return value.matrix?.[0]?.[0];\n }\n if (Array.isArray(value)) {\n if (Array.isArray(value[0])) {\n return value[0]?.[0];\n }\n return value[0];\n }\n return value;\n }\n\n public call() {\n // Broadcast BEFORE validate, because validate may strip Tables to scalars.\n // broadcast only activates when there are 2+ args and at least one\n // broadcastable arg is a multi-cell matrix.\n const broadcastResult = this.broadcast();\n if (broadcastResult !== undefined) {\n return broadcastResult;\n }\n\n // If any argument is still pending, propagate before validate runs\n // (Pending values would fail type checks in validate).\n if (hasDeepPending(this.args, this.at)) {\n return createPropagatedPending();\n }\n\n this.args = this.validate(this.args);\n\n // For async functions, build cache key and check cache before execution\n if (this.isAsync) {\n const key = buildAsyncCacheKey(this.constructor.name, this.args, this.hashPrecision);\n const cached = getAsyncCache(this.sheet, this.at, key, this.useInflight);\n if (cached !== asyncCacheMiss) {\n return cached;\n }\n\n const promise = this._main(...this.args);\n return awaitAndSave(promise, this.sheet, this.at, key, this.ttlMilliseconds, this.useInflight);\n }\n\n // For sync functions, just call and return\n return this._main(...this.args);\n }\n\n /**\n * If any broadcastable argument is a matrix (multi-cell), expand the call\n * across all element positions and return a Spilling.\n * Returns `undefined` when no broadcast is necessary.\n *\n * Rules:\n * - broadcastDisabled = true → never broadcast\n * - An arg is broadcastable when its corresponding args[].takesMatrix is not true\n * - A Sheet/Spilling/2D-array whose size is (1,1) is treated as a scalar\n * (not broadcast); only multi-cell matrices trigger broadcast\n * - For variadic args, extra args are assigned round-robin\n * across the variadic helpArg positions\n */\n private broadcast(): any[][] | undefined {\n if (this.broadcastDisabled) {\n return undefined;\n }\n\n // Map each args index to its corresponding args index\n const helpIndices = resolveParamIndex(this.defs, this.args.length);\n\n // Determine which arg positions are broadcastable (takesMatrix: true suppresses broadcasting).\n const broadcastable: boolean[] = this.args.map((_, i) => {\n const hIdx = helpIndices[i];\n return !this.defs[hIdx]?.takesMatrix;\n });\n\n // Collect matrices only for broadcastable positions whose value is a multi-cell matrix\n const matrices: (any[][] | null)[] = this.args.map((arg, i) => {\n if (broadcastable[i] && isMultiCell(arg)) {\n return this.toMatrix(arg);\n }\n return null;\n });\n\n // If no broadcastable arg is actually a multi-cell matrix, nothing to do\n if (matrices.every((m) => m === null)) {\n return undefined;\n }\n\n // Collapse 1×1 matrix args (non-broadcast) to scalars for the cell-level calls\n const scalarArgs = this.args.map((arg, i) => {\n if (matrices[i] !== null) {\n return arg;\n } // will be expanded per-cell\n return this.toScalar(arg);\n });\n\n // Compute the max rows / cols across all matrix arguments\n let maxRows = 1;\n let maxCols = 1;\n for (const m of matrices) {\n if (m) {\n maxRows = Math.max(maxRows, m.length);\n maxCols = Math.max(\n maxCols,\n m.reduce((acc, row) => Math.max(acc, row.length), 0),\n );\n }\n }\n\n // Save original args so we can restore after each cell iteration\n const originalBareArgs = this.args;\n\n // Iterate over every (row, col) position\n const result: any[][] = [];\n for (let r = 0; r < maxRows; r++) {\n const row: any[] = [];\n for (let c = 0; c < maxCols; c++) {\n // Build the argument list for this cell position\n const cellArgs = scalarArgs.map((arg, i) => {\n const m = matrices[i];\n if (m) {\n // If the position exists in the matrix, use it; otherwise null\n return m?.[r]?.[c] ?? null;\n }\n return arg;\n });\n try {\n if (hasPendingArg(cellArgs)) {\n row.push(createPropagatedPending());\n } else {\n // Validate cell-level args\n const validatedArgs = this.validate(cellArgs);\n if (hasDeepPending(validatedArgs, this.at)) {\n row.push(createPropagatedPending());\n } else {\n row.push(this._main(...validatedArgs));\n }\n }\n } catch (e) {\n row.push(e);\n }\n }\n result.push(row);\n }\n\n // Restore original args\n this.args = originalBareArgs;\n\n return result;\n }\n}\n\n/**\n * Base class for async functions.\n * Extend this class to create async functions that support caching.\n */\nexport class BaseFunctionAsync extends BaseFunction {\n protected isAsync: boolean = true;\n static isAsync = true;\n}\n\nexport type FunctionMapping = { [functionName: string]: typeof BaseFunction };\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { BaseFunction, type FunctionCategory, type FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { Time } from '../../lib/time';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the sum of two numbers.\nThis is the same as the '+' operator.`;\n\nexport class AddFunction extends BaseFunction {\n example = 'ADD(2, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First additive.', acceptedTypes: ['number', 'date', 'time'] },\n { name: 'value2', description: 'Second additive.', acceptedTypes: ['number', 'date', 'time'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 + v2;\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).add(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).add(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .add(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n if (typeof v1 === 'number' && v2 instanceof Date) {\n return dayjs(v2)\n .add(v1 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) + ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for augend or addend.');\n }\n }\n}\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { Time } from '../../lib/time';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the difference of two numbers.\nThis is the same as the '-' operator.`;\n\nexport class MinusFunction extends BaseFunction {\n example = 'MINUS(8, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number', 'date', 'time'] },\n {\n name: 'value2',\n description: 'A number that will subtract from value1.',\n acceptedTypes: ['number', 'date', 'time'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 - v2;\n }\n if (v1 instanceof Date && v2 instanceof Date) {\n return Time.fromDates(v1, v2);\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).sub(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).sub(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .subtract(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) - ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for minuend or subtrahend.');\n }\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the product of two numbers.\nThis is the same as the '*' operator.`;\n\nexport class MultiplyFunction extends BaseFunction {\n example = 'MULTIPLY(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'factor1', description: 'First factor.', acceptedTypes: ['number'] },\n { name: 'factor2', description: 'Second factor.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any, v2: any) {\n return ensureNumber(v1) * ensureNumber(v2);\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the result of dividing one number by another.\nThis is the same as the '/' operator.`;\n\nexport class DivideFunction extends BaseFunction {\n example = 'DIVIDE(4, 2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'dividend',\n description: 'A number that will be divided by divisor.',\n acceptedTypes: ['number'],\n },\n {\n name: 'divisor',\n description: 'A number that will divide a dividend. Must be non-zero.',\n acceptedTypes: ['number'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected validate(args: any[]): any[] {\n const validated = super.validate(args).map((arg) => ensureNumber(arg));\n if (validated[1] === 0) {\n throw new FormulaError('#DIV/0!', 'The second argument must be non-zero.');\n }\n return validated;\n }\n\n protected main(divided: number, divisor: number) {\n return divided / divisor;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the sum of a series of numbers or cells.`;\n\nexport class SumFunction extends BaseFunction {\n example = 'SUM(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to sum.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n sum += ensureNumber(v, { ignore: true });\n },\n this.at,\n );\n });\n return sum;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the concatenation of two values.\nThis is the same as the '&' operator.`;\n\nexport class ConcatFunction extends BaseFunction {\n example = 'CONCAT(\"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value1',\n description: 'A value to be concatenated with value2.',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n {\n name: 'value2',\n description: 'A value to be concatenated with value1',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(v1: any, v2: any) {\n return ensureString(v1) + ensureString(v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eq } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are equal, FALSE if they are not.\nThis is the same as the '=' operator.`;\n\nexport class EqFunction extends BaseFunction {\n example = 'EQ(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return eq(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ne } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are not equal, FALSE if they are.\nThis is the same as the '<>' operator.`;\n\nexport class NeFunction extends BaseFunction {\n example = 'NE(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: number, v2: number) {\n return ne(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truly greater than the second, FALSE otherwise.\nThis is the same as the '>' operator.`;\n\nexport class GtFunction extends BaseFunction {\n example = 'GT(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is greater than the second, FALSE otherwise.\nThis is the same as the '>=' operator.`;\n\nexport class GteFunction extends BaseFunction {\n example = 'GTE(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truely less than the second argument, FALSE otherwise.\nThis is the same as the '<' operator.`;\n\nexport class LtFunction extends BaseFunction {\n example = 'LT(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is less than the second argument, FALSE otherwise.\nThis is the same as the '<=' operator.`;\n\nexport class LteFunction extends BaseFunction {\n example = 'LTE(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Returns a serial value corresponding to the current date and time.`;\n\nexport class NowFunction extends BaseFunction {\n example = 'NOW()';\n description = description;\n defs: FunctionArgumentDefinition[] = [];\n category: FunctionCategory = 'time';\n\n protected main() {\n return new Date();\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if all arguments are logically TRUE.\nReturns FALSE if any argument is logically FALSE.`;\n\nexport class AndFunction extends BaseFunction {\n example = 'AND(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a && b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if any argument is logically true.\nReturns FALSE if all arguments are logically false.`;\n\nexport class OrFunction extends BaseFunction {\n example = 'OR(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a || b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `If the logical expression is TRUE, the second argument is returned.\nIf FALSE, the third argument is returned.`;\n\nexport class IfFunction extends BaseFunction {\n example = 'IF(A2 = \"Human\", \"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'condition', description: 'An expression as a condition', acceptedTypes: ['any'] },\n {\n name: 'value1',\n description: 'value to be returned if the condition is true.',\n acceptedTypes: ['any'],\n },\n {\n name: 'value2',\n description: 'value to be returned if the condition is false.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(condition: any, v1: any, v2: any = false) {\n return ensureBoolean(condition) ? v1 : v2;\n }\n}\n","// DO NOT COPY THIS CODE FOR THE OTHER.\nimport { FormulaError } from '../formula-error';\nimport {\n FunctionArgumentDefinition,\n BaseFunction,\n FunctionCategory,\n isMatrix,\n isMultiCell,\n stripMatrix,\n} from './__base';\n\nconst description = `Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.`;\n\nexport class IfErrorFunction extends BaseFunction {\n example = 'IFERROR(A1, \"Error in cell A1\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The value to return if value itself is not an error.',\n acceptedTypes: ['any'],\n errorTolerant: true,\n },\n {\n name: 'value_if_error',\n description: 'The value the function returns if value is an error.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any, valueIfError?: any) {\n if (FormulaError.is(value) || value instanceof Error) {\n return valueIfError;\n }\n return value;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns the inverse of the Boolean; if TRUE, NOT returns FALSE.\nIf FALSE, NOT returns TRUE.`;\n\nexport class NotFunction extends BaseFunction {\n example = 'NOT(TRUE)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'logical expression',\n description: 'A logical expression as a boolean.',\n acceptedTypes: ['boolean', 'number'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any) {\n return !ensureBoolean(v1);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the count of a series of numbers or cells.`;\n\nexport class CountFunction extends BaseFunction {\n example = 'COUNT(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n count++;\n }\n },\n this.at,\n );\n } else {\n ensureNumber(val);\n count++;\n }\n });\n return count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the absolute value of a number`;\n\nexport class AbsFunction extends BaseFunction {\n example = 'ABS(-2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [{ name: 'value', description: 'target number', acceptedTypes: ['number'] }];\n category: FunctionCategory = 'math';\n\n protected main(value: any) {\n return Math.abs(ensureNumber(value));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number multiplied by an exponent.`;\n\nexport class PowerFunction extends BaseFunction {\n example = 'POWER(4,0.5)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'base', description: 'A number to be multiplied by an exponent.', acceptedTypes: ['number'] },\n { name: 'exponent', description: 'An exponent to power the base.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(base: any, exponent: any) {\n return Math.pow(ensureNumber(base), ensureNumber(exponent));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eachMatrix } from './__utils';\n\nconst description = `Returns the number of values in the data set.`;\n\nexport class CountaFunction extends BaseFunction {\n example = 'COUNTA(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Values or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n if (v != null && v !== '') {\n count++;\n }\n },\n this.at,\n );\n });\n return count;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the average of a series of numbers or cells.`;\n\nexport class AverageFunction extends BaseFunction {\n example = 'AVERAGE(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to average.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let sum = 0;\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n sum += ensureNumber(v);\n count++;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n sum += num;\n count++;\n }\n });\n\n if (count === 0) {\n throw new FormulaError('#DIV/0!', 'Evaluation of function AVERAGE caused a divide by zero error.');\n }\n return sum / count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the max in a series of numbers or cells.`;\n\nexport class MaxFunction extends BaseFunction {\n example = 'MAX(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find max from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let max = -Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n const num = ensureNumber(v);\n if (num > max) {\n max = num;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num > max) {\n max = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? max : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, isNumeric, eachMatrix } from './__utils';\n\nconst description = `Returns the min in a series of numbers or cells.`;\n\nexport class MinFunction extends BaseFunction {\n example = 'MIN(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find min from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let min = Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (isNumeric(v)) {\n const num = ensureNumber(v);\n if (num < min) {\n min = num;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num < min) {\n min = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? min : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the length of a string.`;\n\nexport class LenFunction extends BaseFunction {\n example = 'LEN(A2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'text',\n description: 'A text to be returned the length.',\n acceptedTypes: ['string', 'number'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(text: any) {\n return ensureString(text).length;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number with positive and negative values reversed.`;\n\nexport class UminusFunction extends BaseFunction {\n example = 'UMINUS(4)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any) {\n return -ensureNumber(v1);\n }\n}\n","import { Sheet } from '../../lib/sheet';\nimport { Spilling } from '../../sentinels';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Enables the display of values returned from an array formula into multiple rows and/or columns.\nIf the argument is already a Spilling, it is returned as-is. If it is a Sheet (range reference), the field matrix is extracted and wrapped in a Spilling. Otherwise the value is wrapped as a single-element Spilling.`;\n\nexport class ArrayformulaFunction extends BaseFunction {\n autoSpilling = true;\n example = 'ARRAYFORMULA(A1:A10 * B1:B10)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The array expression or value to evaluate.',\n takesMatrix: true,\n acceptedTypes: ['matrix', 'any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any) {\n if (Spilling.is(value)) {\n return value;\n }\n if (Sheet.is(value)) {\n return value._toValueMatrix();\n }\n if (Array.isArray(value)) {\n return value;\n }\n return [[value]];\n }\n}\n","import { AddFunction } from './functions/add';\nimport { MinusFunction } from './functions/minus';\nimport { MultiplyFunction } from './functions/multiply';\nimport { DivideFunction } from './functions/divide';\nimport { SumFunction } from './functions/sum';\nimport { ConcatFunction } from './functions/concat';\nimport { EqFunction } from './functions/eq';\nimport { NeFunction } from './functions/ne';\nimport { GtFunction } from './functions/gt';\nimport { GteFunction } from './functions/gte';\nimport { LtFunction } from './functions/lt';\nimport { LteFunction } from './functions/lte';\nimport { NowFunction } from './functions/now';\nimport { AndFunction } from './functions/and';\nimport { OrFunction } from './functions/or';\nimport { IfFunction } from './functions/if';\nimport { IfErrorFunction } from './functions/iferror';\nimport { NotFunction } from './functions/not';\nimport { CountFunction } from './functions/count';\nimport { AbsFunction } from './functions/abs';\nimport { PowerFunction } from './functions/power';\nimport { CountaFunction } from './functions/counta';\nimport { AverageFunction } from './functions/average';\nimport { MaxFunction } from './functions/max';\nimport { MinFunction } from './functions/min';\nimport { LenFunction } from './functions/len';\nimport { UminusFunction } from './functions/uminus';\nimport { ArrayformulaFunction } from './functions/arrayformula';\nimport type { FunctionCategory, FunctionMapping, FunctionArgumentDefinition } from './functions/__base';\n\nexport const functions: FunctionMapping = {\n // Arithmetic & Comparison\n add: AddFunction,\n minus: MinusFunction,\n uminus: UminusFunction,\n multiply: MultiplyFunction,\n divide: DivideFunction,\n pow: PowerFunction,\n power: PowerFunction,\n concat: ConcatFunction,\n eq: EqFunction,\n ne: NeFunction,\n gt: GtFunction,\n gte: GteFunction,\n lt: LtFunction,\n lte: LteFunction,\n\n // Logical\n if: IfFunction,\n iferror: IfErrorFunction,\n and: AndFunction,\n or: OrFunction,\n not: NotFunction,\n arrayformula: ArrayformulaFunction,\n\n // Statistics & Aggregation\n sum: SumFunction,\n max: MaxFunction,\n min: MinFunction,\n average: AverageFunction,\n count: CountFunction,\n counta: CountaFunction,\n\n // Text\n len: LenFunction,\n\n // Math\n abs: AbsFunction,\n\n // Time\n now: NowFunction,\n};\n\nexport type FunctionHelp = {\n name: string;\n category: FunctionCategory;\n example: string;\n description: string;\n defs: FunctionArgumentDefinition[];\n};\n\nconst _functionHelpsCache = new Map<FunctionMapping, FunctionHelp[]>();\n\nexport const getFunctionHelps = (customFunctions: FunctionMapping = functions): FunctionHelp[] => {\n let helps = _functionHelpsCache.get(customFunctions);\n if (!helps) {\n helps = Object.keys(customFunctions).map((name) => {\n const FnClass = customFunctions[name];\n const instance = new FnClass({ args: [], sheet: {} as any });\n return {\n name: name.toUpperCase(),\n category: instance.category,\n example: instance.example ?? FnClass?.__name ?? 'Unknown',\n description: instance.description ?? '',\n defs: instance.defs || [],\n };\n });\n _functionHelpsCache.set(customFunctions, helps);\n }\n return helps;\n};\n","import { DEFAULT_HISTORY_LIMIT, RESET_ZONE } from '../constants';\nimport { Pending } from '../sentinels';\n\nimport type {\n HistoryType,\n RefPaletteType,\n SheetIdsByName,\n ContextsBySheetId,\n ZoneType,\n CellsByIdType,\n SystemsByIdType,\n System,\n Id,\n StoreDispatchType,\n FeedbackType,\n EditorEvent,\n CursorStateType,\n} from '../types';\nimport type { UserSheet, Sheet } from './sheet';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { functions as functionsDefault } from '../formula/mapping';\nimport { PolicyType } from '../policy/core';\n\nexport type RegistryProps = {\n historyLimit?: number;\n additionalFunctions?: FunctionMapping;\n policies?: { [policyName: string]: PolicyType | null };\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n};\n\nexport type BookProps = RegistryProps;\n\nexport class Registry {\n sheetHead: number = 0;\n cellHead: number = 0;\n data: CellsByIdType = {};\n systems: SystemsByIdType = {};\n sheetIdsByName: SheetIdsByName = {};\n contextsBySheetId: ContextsBySheetId = {};\n choosingSheetId: number = 0;\n choosingAddress: string = '';\n editingSheetId: number = 0;\n editingAddress: string = '';\n paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n lastFocused: HTMLTextAreaElement | null = null;\n solvedCaches: Map<Id, any> = new Map();\n /** IDs of non-origin cells that received spilled values (populated in spill(), cleared in clearSolvedCaches()). */\n lastSpilledTargetIds: Set<Id> = new Set();\n /**\n * Index of every cell whose formula contains at least one async function call,\n * maintained by `Sheet.processFormula`. These are the only cells eager\n * resolution must fire: sync formulas have no side effects and resolve on read,\n * so `Sheet.resolveAll()` visits just this set instead of scanning the whole\n * (possibly virtualized) matrix. Registry-wide; each entry's owning sheet is\n * recoverable via `systems[id].sheetId`. Pruned lazily in `resolveAll()` when a\n * cell is no longer an async formula.\n */\n asyncFormulaCells: Set<Id> = new Set();\n /** Currently in-flight async formula Pending sentinels (keyed by cell ID). */\n asyncPending: Map<string, Pending> = new Map();\n /** In-flight async formulas shared by cache key (for useInflight). */\n asyncInflight?: Map<string, { pending: Pending; expireTime?: number }>;\n copyingSheetId: number = 0;\n copyingZone: ZoneType = RESET_ZONE;\n cutting: boolean = false;\n histories: HistoryType[] = [];\n historyIndex: number = -1;\n historyLimit: number = DEFAULT_HISTORY_LIMIT;\n lastHistory?: HistoryType;\n currentHistory?: HistoryType;\n /** StrictMode guard: Map from action object (identity) to cached reducer result.\n * Using a Map instead of a single slot allows multiple batched dispatches to coexist. */\n _strictModeCache?: Map<unknown, unknown>;\n /** StrictMode guard: Map from useId component key to assigned sheetId.\n * Prevents double-increment of sheetHead when useState initializer runs twice in Strict Mode. */\n _componentSheetIds: Map<string, number> = new Map();\n ready = false;\n functions: FunctionMapping = {};\n policies: { [policyName: string]: PolicyType | null } = {};\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n\n transmit: (newBook?: TransmitProps) => void = (newBook?: TransmitProps) => {\n // This method will be overridden by useBook\n };\n\n /** Injected by react-core / preact-core to create a store action for sheet updates. */\n updateSheet: (sheet: Sheet) => { type: number; value: any } = (sheet) => ({ type: 0, value: sheet });\n\n public boot() {\n if (this.ready || Object.keys(this.contextsBySheetId).length === 0) {\n return;\n }\n const keys = Object.keys(this.contextsBySheetId);\n const tobe: StoreDispatchType[] = [];\n for (let i = 0; i < keys.length; i++) {\n const sheetId = keys[i];\n const storeDispatch = this.contextsBySheetId[sheetId];\n const sheet = storeDispatch.store.sheetReactive.current;\n if (!sheet || sheet.status === 0) {\n return;\n }\n tobe.push(storeDispatch);\n }\n for (let i = 0; i < tobe.length; i++) {\n const { store, dispatch } = tobe[i];\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n continue;\n }\n sheet.resolveFormulas();\n dispatch(this.updateSheet(sheet));\n }\n this.ready = true;\n }\n\n constructor({\n historyLimit,\n additionalFunctions,\n policies = {},\n onSave,\n onChange,\n onRemoveRows,\n onRemoveCols,\n onInsertRows,\n onInsertCols,\n onSelect,\n onKeyUp,\n onInit,\n }: RegistryProps = {}) {\n if (historyLimit != null) {\n this.historyLimit = historyLimit;\n }\n this.functions = {\n ...functionsDefault,\n ...additionalFunctions,\n };\n for (const fnName in this.functions) {\n const fn = this.functions[fnName];\n fn.__name = fnName;\n }\n this.policies = policies;\n this.onSave = onSave;\n this.onChange = onChange;\n this.onRemoveRows = onRemoveRows;\n this.onRemoveCols = onRemoveCols;\n this.onInsertRows = onInsertRows;\n this.onInsertCols = onInsertCols;\n this.onSelect = onSelect;\n this.onKeyUp = onKeyUp;\n this.onInit = onInit;\n }\n}\n\nexport type TransmitProps = Partial<Registry>;\n\nexport const createRegistry = (props: RegistryProps = {}) => {\n return new Registry(props);\n};\n\n/** @deprecated use createRegistry */\nexport const createBinding = createRegistry;\n\nexport type BookType = {\n registry: Registry;\n};\n\nexport const createBook = (props: RegistryProps = {}): BookType => {\n return { registry: createRegistry(props) };\n};\n","import type { PolicyMixinType, RenderProps } from './core';\n\nconst makeThousandSeparatorMixin = (sep: string): PolicyMixinType => ({\n renderNumber({ value }: RenderProps<number>): any {\n if (value == null || isNaN(value)) {\n return 'NaN';\n }\n const [int, fraction] = String(parseFloat(value.toPrecision(this.decimalPrecision))).split('.');\n const result = int.replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, `$1${sep}`);\n if (fraction == null) {\n return result;\n }\n return `${result}.${fraction}`;\n },\n});\n\nexport const ThousandSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(',');\nexport const ThousandSpaceSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(' ');\n","import type { PolicyMixinType, RenderProps } from './core';\n\nexport const PercentagePolicyMixin: PolicyMixinType = {\n renderNumber({ value }: RenderProps<number>): any {\n if (value == null || isNaN(value)) {\n return '0%';\n }\n return `${parseFloat((value * 100).toPrecision(this.decimalPrecision))}%`;\n },\n};\n","import type { PointType } from '../types';\nimport type { UserSheet } from './sheet';\n\nexport const getLabel = (sheet: UserSheet, label: string | undefined, point: PointType, n: number): string | null => {\n if (label != null) {\n return label;\n }\n const policy = sheet.getPolicy(point);\n return (point.x === 0 ? policy.renderRowHeaderLabel(n) : policy.renderColHeaderLabel(n)) ?? null;\n};\n","export const COLOR_PALETTE = [\n // orange\n '#FF6600',\n // purple\n '#AA44FF',\n // emeraldblue\n '#00CCCC',\n // peach\n '#EEAAEE',\n // yellow\n '#DDDD00',\n // winered\n '#AA4444',\n // lightgreen\n '#00FF00',\n // pink\n '#FF00FF',\n // navy\n '#3366FF',\n // cyan\n '#008888',\n];\n","import dayjs from 'dayjs';\nimport type { AreaType, CellsByAddressType, CellType, CSSPropertiesLike, PointType, RefLike, ZoneType } from '../types';\nimport { Sheet } from './sheet';\nimport { areaShape, areaToZone, complementSelectingArea, concatAreas, zoneToArea, createMatrix } from './spatial';\nimport { p2a } from './coords';\nimport { Time } from './time';\n\ntype AutofillStore = {\n sheetReactive: RefLike<Sheet>;\n choosing: PointType;\n selectingZone: ZoneType;\n};\n\nconst BORDER_AUTOFILL_DRAGGING = 'dashed 1px #888888';\n\ntype Direction = 'left' | 'right' | 'up' | 'down' | 'none';\ntype Orientation = 'horizontal' | 'vertical' | 'none';\nconst DirectionMapping: {\n [key: string]: [Orientation, number];\n} = {\n left: ['horizontal', -1],\n right: ['horizontal', 1],\n up: ['vertical', -1],\n down: ['vertical', 1],\n none: ['none', 0],\n};\n\nexport class Autofill {\n private readonly src: AreaType;\n private readonly dst: AreaType;\n private readonly direction: Direction;\n private readonly sheet: Sheet;\n constructor(store: AutofillStore, draggingTo: PointType) {\n const { sheetReactive: sheetRef, choosing, selectingZone } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n throw new Error('Sheet is not available');\n }\n this.src = complementSelectingArea(zoneToArea(selectingZone), choosing);\n this.direction = this.suggestDirection(draggingTo);\n this.dst = this.getDestinationArea(draggingTo);\n this.sheet = sheet;\n }\n\n /** Build the fill diff without applying it. Shared by the sync/async apply paths. */\n private buildDiff(): CellsByAddressType {\n const [orientation, sign] = DirectionMapping[this.direction];\n const { top: sTop, left: sLeft, bottom: sBottom, right: sRight } = this.src;\n const matrix = createMatrix(sBottom - sTop + 1, sRight - sLeft + 1) as (CellType | null)[][];\n for (let y = sTop; y <= sBottom; y++) {\n for (let x = sLeft; x <= sRight; x++) {\n matrix[y - sTop][x - sLeft] = this.sheet.getCell({ y, x }, { resolution: 'SYSTEM' }) ?? null;\n }\n }\n const srcShape = areaShape(this.src);\n const dstShape = areaShape(this.dst);\n\n const diff: CellsByAddressType = {};\n if (orientation === 'horizontal') {\n for (let i = 0; i < dstShape.rows; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(matrix[i], '');\n for (let j = 0; j < dstShape.cols; j++) {\n const baseCell = matrix[i % srcShape.rows]?.[j % srcShape.cols];\n const x = sign > 0 ? this.dst.left + j : this.dst.right - j;\n const px = sign > 0 ? j % srcShape.cols : (srcShape.cols - 1 - (j % srcShape.cols)) % srcShape.cols;\n const point = { y: this.dst.top + i, x };\n const id = this.sheet.getId(point);\n const value = patterns[px].next().value;\n const nextValue =\n (baseCell?.formulaEnabled ?? true)\n ? this.sheet.processFormula(value, {\n dependency: id,\n })\n : value;\n diff[p2a(point)] = {\n ...baseCell,\n value: nextValue,\n };\n }\n }\n } else if (orientation === 'vertical') {\n for (let i = 0; i < dstShape.cols; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(\n matrix.map((row) => row[i]),\n '',\n );\n for (let j = 0; j < dstShape.rows; j++) {\n const baseCell = matrix[j % srcShape.rows]?.[i % srcShape.cols];\n const y = sign > 0 ? this.dst.top + j : this.dst.bottom - j;\n const py = sign > 0 ? j % srcShape.rows : (srcShape.rows - 1 - (j % srcShape.rows)) % srcShape.rows;\n const value = patterns[py].next().value;\n diff[p2a({ y, x: this.dst.left + i })] = { ...baseCell, value };\n }\n }\n }\n return diff;\n }\n\n private get reflections() {\n return {\n undoReflection: { sheetId: this.sheet.id, selectingZone: areaToZone(this.src) },\n redoReflection: { sheetId: this.sheet.id, selectingZone: areaToZone(this.dst) },\n };\n }\n\n public get applied(): Sheet {\n return this.sheet.update({ diff: this.buildDiff(), operator: 'USER', ...this.reflections });\n }\n\n /** Async, progress-reporting apply. Same result as `applied` but time-sliced. */\n public appliedAsync(opts: {\n onProgress?: (progress: { done: number; total: number }) => void;\n yieldControl?: () => Promise<void> | void;\n }): Promise<Sheet> {\n return this.sheet.updateAsync({ diff: this.buildDiff(), operator: 'USER', ...this.reflections, ...opts });\n }\n\n public get wholeArea() {\n return concatAreas(this.src, this.dst);\n }\n\n public getCellStyle(target: PointType) {\n const { x, y } = target;\n const style: CSSPropertiesLike = {};\n const { top, left, bottom, right } = this.src;\n\n switch (this.direction) {\n case 'left': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.left === x && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'right': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.right === x - 1 && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n\n case 'up': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.top === y && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'down': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.bottom === y - 1 && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n }\n return style;\n }\n\n private getDestinationArea(autofillDraggingTo: PointType): AreaType {\n const { x, y } = autofillDraggingTo;\n const { top, left, bottom, right } = this.src;\n switch (this.direction) {\n case 'left':\n return { top, bottom, left: x, right: left - 1 };\n case 'right':\n return { top, bottom, left: right + 1, right: x };\n case 'up':\n return { left, right, top: y, bottom: top - 1 };\n case 'down':\n return { left, right, top: bottom + 1, bottom: y };\n }\n return this.src;\n }\n\n private suggestDirection(draggingTo: PointType): Direction {\n const { top, left, bottom, right } = this.src;\n let horizontal = 0,\n vertical = 0;\n if (draggingTo.x < left) {\n horizontal = draggingTo.x - left;\n } else if (draggingTo.x > right) {\n horizontal = draggingTo.x - right;\n }\n if (draggingTo.y < top) {\n vertical = draggingTo.y - top;\n } else if (draggingTo.y > bottom) {\n vertical = draggingTo.y - bottom;\n }\n // diagonal\n if (Math.abs(horizontal) > 0 && Math.abs(vertical) > 0) {\n if (Math.abs(horizontal) > Math.abs(vertical)) {\n return horizontal < 0 ? 'left' : 'right';\n }\n return vertical < 0 ? 'up' : 'down';\n }\n if (horizontal !== 0) {\n return horizontal < 0 ? 'left' : 'right';\n }\n if (vertical !== 0) {\n return vertical < 0 ? 'up' : 'down';\n }\n return 'none';\n }\n\n private getChangePatterns(cells: (CellType | null)[], id: string): Generator[] {\n const result: Generator[] = [];\n const groups = groupByType(cells);\n const [orientation, sign] = DirectionMapping[this.direction];\n groups.forEach((group) => {\n const lastValue = sign > 0 ? group.last : group.first;\n switch (group.kind) {\n case 'other': {\n result.push(pass(group.first));\n return;\n }\n case 'formula': {\n const value = group.first;\n const sheet = this.sheet;\n\n function* generateFormula() {\n let slide = 0;\n const skip = cells.length * sign;\n while (true) {\n slide += skip;\n yield sheet.processFormula(value, {\n dependency: id,\n slideY: orientation === 'vertical' ? slide : 0,\n slideX: orientation === 'horizontal' ? slide : 0,\n });\n }\n }\n result.push(generateFormula());\n return;\n }\n case 'number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateNumber() {\n let value = lastValue;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield value;\n }\n }\n const g = generateNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'date': {\n const next = (d: Date) => {\n return sign > 0 ? group.time.add(d) : group.time.sub(d);\n };\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateDate() {\n let value = lastValue as Date;\n while (true) {\n value = next(value);\n yield new Date(value);\n }\n }\n const g = generateDate();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'string+number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateStringNumber() {\n const { prefix } = extractStringNumber(group.first as string);\n const { number: lastNumber } = extractStringNumber(lastValue as string);\n let value = lastNumber;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield `${prefix}${Math.abs(value)}`;\n }\n }\n const g = generateStringNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n }\n });\n return result;\n }\n}\n\nfunction* pass(value: any) {\n while (true) {\n yield value;\n }\n}\n\ntype GroupKind = 'number' | 'date' | 'string+number' | 'formula' | 'other';\n\nconst StringNumberPattern = new RegExp('(.+?)(\\\\d+)$');\n\nconst extractStringNumber = (value: string) => {\n const match = value.match(StringNumberPattern);\n if (match) {\n const [, prefix, n] = match;\n return { prefix, number: Number(n) };\n }\n return { prefix: '', number: 0 };\n};\n\nclass TypedGroup {\n public time: Time = Time.create();\n public numericDelta: number = 0;\n public kind: GroupKind;\n public nexts: any[];\n public first: any;\n public equidistant = true;\n\n constructor(value: any) {\n this.first = value;\n this.nexts = [];\n this.kind = this.discriminate(value);\n }\n private discriminate(value: any): GroupKind {\n const kind = value instanceof Date ? 'date' : typeof value;\n if (kind === 'number' || kind === 'date') {\n return kind;\n }\n if (kind === 'string' && value[0] === '=') {\n return 'formula';\n } else if (kind === 'string' && value.match(StringNumberPattern)) {\n return 'string+number';\n }\n return 'other';\n }\n\n public get last() {\n if (this.nexts.length === 0) {\n return this.first;\n }\n return this.nexts[this.nexts.length - 1];\n }\n\n public add(value: any): TypedGroup | undefined {\n const kind = this.discriminate(value);\n if (this.kind !== kind || kind === 'other' || kind === 'formula') {\n return new TypedGroup(value);\n }\n if (this.nexts.length === 0) {\n switch (kind) {\n case 'date': {\n this.time = Time.fromDates(value as Date, this.first as Date);\n break;\n }\n case 'number': {\n this.numericDelta = (value as number) - this.first;\n break;\n }\n case 'string+number': {\n const { prefix: prefix1, number: number1 } = extractStringNumber(this.first as string);\n const { prefix: prefix2, number: number2 } = extractStringNumber(value as string);\n if (prefix1 === prefix2) {\n this.numericDelta = number2 - number1;\n }\n break;\n }\n }\n }\n this.nexts.push(value);\n }\n\n public subdivide() {\n if (this.nexts.length === 0) {\n return [];\n }\n\n const news: TypedGroup[] = [];\n\n let lastGroup: TypedGroup = this;\n switch (this.kind) {\n case 'date': {\n const eq = this.nexts.every((v, i) => i === 0 || dayjs(v).isSame(this.time.add(this.nexts[i - 1])));\n this.equidistant = eq;\n return [];\n }\n case 'number': {\n const eq = this.nexts.every((v, i) => i === 0 || v === this.first + this.numericDelta * (i + 1));\n this.equidistant = eq;\n return [];\n }\n case 'string+number': {\n const { prefix: basePrefix } = extractStringNumber(this.first as string);\n for (let i = 0; i < lastGroup.nexts.length; i++) {\n const next = lastGroup.nexts[i];\n const { prefix, number } = extractStringNumber(next as string);\n if (basePrefix !== prefix) {\n const nexts = this.nexts.splice(i, this.nexts.length);\n lastGroup = new TypedGroup(nexts.splice(0, 1)[0]);\n nexts.forEach(lastGroup.add.bind(lastGroup));\n news.push(lastGroup, ...lastGroup.subdivide());\n break;\n } else {\n const { number: firstNumber } = extractStringNumber(lastGroup.first as string);\n if (number !== firstNumber + (i + 1) * lastGroup.numericDelta) {\n lastGroup.equidistant = false;\n }\n }\n }\n break;\n }\n }\n\n return news;\n }\n}\n\nfunction groupByType(cells: (CellType | null)[]): TypedGroup[] {\n let group = new TypedGroup(cells[0]?.value);\n const groups: TypedGroup[] = [group];\n\n for (let i = 1; i < cells.length; i++) {\n const value = cells[i]?.value;\n const nextGroup = group.add(value);\n if (nextGroup) {\n groups.push(nextGroup);\n group = nextGroup;\n }\n }\n for (let i = groups.length - 1; i >= 0; i--) {\n const group = groups[i];\n groups.splice(i + 1, 0, ...group.subdivide());\n }\n return groups;\n}\n"],"names":["DEFAULT_HISTORY_LIMIT","DEFAULT_HEIGHT","DEFAULT_WIDTH","SHEET_HEIGHT","SHEET_WIDTH","HEADER_HEIGHT","HEADER_WIDTH","MIN_WIDTH","MIN_HEIGHT","OVERSCAN_X","OVERSCAN_Y","DEFAULT_ALPHABET_CACHE_SIZE","SECONDS_IN_DAY","FULLDATE_FORMAT_UTC","RESET_ZONE","BASE_DATE","DEFAULT_KEY","DEFAULT_COL_KEY","DEFAULT_ROW_KEY","ALPHABET","N2C_CACHE","C2N_CACHE","getColumnLetterFromNumber","key","cacheSize","cached","num","result","it","st","getNumberFromColumnLetter","alpha","digit","x2c","x","c","c2x","col","absolute","n","y2r","y","r2y","row","p2a","absX","absY","colPart","rowPart","a2p","address","m","_absX","_absY","grantAddressAbsolute","absCol","absRow","rh","ch","stripAddressAbsolute","buildIdentifiedRef","id","superposeArea","srcArea","dstArea","srcRows","srcCols","areaDiff","dstRows","dstCols","concatAreas","area1","area2","zoneToArea","zone","top","bottom","left","right","areaToZone","area","areaToRange","leftTop","rightBottom","between","range","index","among","point","zoneDiff","zoneShape","areaShape","matrixShape","base","matrix","h","makeSequence","start","stop","step","_","oa2aa","oa","fields","aa","o","a","field","aa2oa","v","i","createMatrix","numRows","numCols","fill","buildInitialCellsFromOrigin","cells","ensured","flattenAs","origin","buildInitialCells","matrices","userKeys","deferred","sum","_a","buildCells","baseAddress","baseY","baseX","colLetters","rowStr","cell","getMaxSizesFromCells","keys","lastY","lastX","end","list","complementSelectingArea","selectingArea","choosing","expandRange","startRow","endRow","match","startCol","endCol","startColIndex","endColIndex","currentColumn","restrictZone","s","binarySearch","low","high","predicate","lessThan","mid","addressesToAreas","addresses","points","addr","pointSet","p","visited","areas","k","queue","dy","dx","nk","addressesToCols","asc","seen","cols","b","addressesToRows","rows","isZoneNotSelected","MS_PER_DAY","Time","days","format","date","totalMs","absMs","sign","millis","remaining","seconds","minutes","hours","milliseconds","ms","timeMs","date1","date2","obj","value","strict","formattedMatcher","dayjsFormatToNamedRegex","_sign","msecs","tokenRegexMap","sortedTokens","tokenPattern","regexSource","FormulaError","code","message","error","Sentinel","SOLVING","NONE","Pending","promise","Spilling","stripId","idString","stripAbsolute","Entity","ValueEntity","UnreferencedEntity","InvalidRefEntity","RefEntity","sheet","parsed","parseRef","props","slideY","slideX","newPoint","RangeEntity","formulas","IdEntity","sheetIdStr","sheetId","formula","ids","IdRangeEntity","idRange","ps","p1","p2","FunctionEntity","name","precedence","args","at","Func","ZERO","INFIX_FUNCTION_NAME_MAP","PREFIX_FUNCTION_NAME_MAP","WHITESPACE_CHARS","SPECIAL_CHARS","Token","type","entity","closed","isWhiteSpace","char","BOOLS","TOKEN_OPEN","TOKEN_CLOSE","TOKEN_COMMA","INFIX_OPERATOR","PREFIX_OPERATOR","POSTFIX_OPERATOR","Lexer","options","pos","token","slide","parts","t","idMap","prev1","prev2","_b","buf","tok","bool","resolveIdRange","space","quote","refString","refs","done","before","after","regex","ref","replaced","prefix","suffix","Parser","tokens","expr","underFunction","stack","lastOperator","complement","hasNext","outer","divideBy100","func","operator","FormulaParser","stripSheetName","sheetName","splitRef","nextChar","excl","operation","dependency","filterCellFields","ignoreFields","ensureSys","registry","defaults","sys","setAsyncCache","ac","noFilter","getCellByAddress","toValueMatrix","resolution","raise","filter","asScalar","toValueMatrixAsync","frameBudgetMs","onProgress","yieldControl","toValueObject","fieldValue","toValueRows","ys","toValueCols","xs","toCellMatrix","filteredCell","toCellObject","toCellRows","escapeSheetName","toSheetPrefix","toCellCols","RemoveRows","RemoveCols","InsertRowsAbove","InsertRowsBelow","InsertColsLeft","InsertColsRight","MoveFrom","MoveTo","Write","Style","Copy","Resize","SetPolicy","Sort","Filter","SetLabel","NoOperation","Move","Update","InsertRows","InsertCols","Add","Delete","ReadOnly","ColumnMenu","RowMenu","ViewOnly","hasOperation","flag","debugOperations","prevention","operations","dayjs","timezone","utc","NUMS","NUMS_Z","JFMASOND","NBRYNLGPTVC","DATE_WORDS","parseDate","first","words","word","timeZone","Policy","mixins","subclassProto","mixin","rendered","isSheet","_props","childSheet","rest","stripped","_n","e","_cell","next","DEFAULT_POLICY_NAME","nonePolicy","_str","detectType","cellValue","parseAsType","scale","d","td","bv","toNumeric","filterEq","condition","vt","cellNum","filterNe","filterGt","filterGte","filterLt","filterLte","filterBlank","_condition","filterNonblank","filterIncludes","filterExcludes","filterFunctions","evaluateFilterCondition","fn","evaluateFilterConfig","mode","ReferencePreserver","did","prevId","currId","diffBefore","dep","shouldTracking","op","Sheet","limits","createRegistry","eager","height","historicize","width","colCell","pendingMap","promises","resolve","check","snapshot","diffAfter","changedIds","trimmedBefore","trimmedAfter","activeFilters","changedAddresses","rowCell","shouldFilter","wasFiltered","direction","fixedPositions","sortableIndices","cellA","cellB","valA","valB","cmp","availablePositions","changed","sortedRowMapping","matrixSnapshot","oldY","newY","preserver","inverse","newOrder","oldYStr","savedRows","lexer","_c","extension","auto","addressKeys","data","deferredMatrices","explicitAddresses","otherSheet","context","dispatch","colLetter","changedTime","stacked","colId","colDefault","_cs","colDefaultLayout","headerCell","rowId","rowDefault","_rs","rowDefaultLayout","my","mx","val","matrixCell","headerH","defaultH","offset","oy","fy","heights","filtered","yy","l","rw","lw","th","headerW","accW","w","colSys","totalOverrideDiff","filteredHeightSum","fullH","relocate","resize","copied","cache","startWatermark","hit","retry","fromY","existing","solveFormula","idRow","explicit","totalRows","doYield","lastYield","history","book","kickedOut","rel","depId","newCell","srcSheet","src","dst","undoReflection","redoReflection","srcSheetRaw","moveRelations","dstSheet","srcTop","srcLeft","srcBottom","srcRight","dstTop","dstLeft","dstNumRows","dstNumCols","srcVisibleRows","srcNumCols","srcNumVisibleRows","dstVisibleRows","di","srcCellSet","j","dstAddrSet","dstY","dstX","srcY","srcX","srcAddr","isDstInBounds","dstAddr","newId","lostId","existingId","srcId","srcCell","dstCell","reverse","wireWrites","idWritesSrc","idWritesDst","beforePolicy","afterPolicy","toPoint","movedId","fromPoint","srcPoint","dstPoint","dstId","operation.hasOperation","operation.MoveFrom","operation.MoveTo","policyKey","restricted","dstPolicyKey","srcPolicyKey","dstPolicyVal","srcPolicyVal","isSrcWinner","srcSys","srcSnapshot","dstSnapshot","r","srcAddresses","resolvedDiff","onlyValue","isXSheet","topFrom","leftFrom","bottomFrom","rightFrom","topTo","leftTo","bottomTo","rightTo","diff","toY","toX","fromX","dstPolicy","srcPolicy","dstIdForClear","dstSys","operation.Copy","opts","srcCells","srcPolicies","si","cellRow","polRow","sc","out","ctx","noFilters","dstBottom","total","resized","visibleDstIndex","srcValue","partial","updateChangedTime","operation.Update","formulaIdentify","rawNext","ownNext","current","operation.Write","operation.Style","operation.Resize","_d","merged","finalH","_e","srcRowIndex","currentCell","matrixWithStyle","cloned","backup","yi","operation.RemoveRows","xi","deleted","operation.RemoveCols","deleting","apply","policy","raw","solved","stripSheet","solveSheet","budget","y0","movedAddresses","snapshotIds","sheetRef","idx","depSys","tmp","targetPoint","targetId","targetCell","originId","spilledAddresses","omit","shape","asyncCacheMiss","hasPendingArg","hasDeepPending","values","cyrb53","str","seed","h1","h2","buildAsyncCacheKey","funcName","hashPrecision","argsJson","_key","hashes","getAsyncCache","useInflight","compositeKey","inflight","awaitAndSave","ttlMilliseconds","expireTime","pending","createPropagatedPending","gt","ensureString","ensureNumber","gte","lt","lte","eq","ne","isPercentage","isNumeric","alternative","ignore","ensureBoolean","ensureDate","CONDITION_REGEX","target","comparison","equals","eachMatrix","callback","createBooleanMask","sheets","conditions","refRange","mask","condRange","pt","conditionArg","matchesType","nullable","errorTolerant","acceptedTypes","isMatrix","stripMatrix","isMultiCell","resolveParamIndex","defs","argCount","indices","iterStart","iterCount","_BaseFunction","validatedArgs","minArgs","hasIterable","def","broadcastResult","helpIndices","broadcastable","hIdx","arg","scalarArgs","maxRows","maxCols","acc","originalBareArgs","cellArgs","BaseFunction","_BaseFunctionAsync","BaseFunctionAsync","description","AddFunction","v1","v2","MinusFunction","MultiplyFunction","DivideFunction","validated","divided","divisor","SumFunction","ConcatFunction","EqFunction","NeFunction","GtFunction","GteFunction","LtFunction","LteFunction","NowFunction","AndFunction","OrFunction","IfFunction","IfErrorFunction","valueIfError","NotFunction","CountFunction","count","AbsFunction","PowerFunction","exponent","CountaFunction","AverageFunction","MaxFunction","max","hasValues","MinFunction","min","LenFunction","text","UminusFunction","ArrayformulaFunction","functions","_functionHelpsCache","getFunctionHelps","customFunctions","helps","FnClass","instance","Registry","historyLimit","additionalFunctions","policies","onSave","onChange","onRemoveRows","onRemoveCols","onInsertRows","onInsertCols","onSelect","onKeyUp","onInit","newBook","functionsDefault","fnName","tobe","storeDispatch","store","createBinding","createBook","makeThousandSeparatorMixin","sep","int","fraction","ThousandSeparatorPolicyMixin","PercentagePolicyMixin","getLabel","label","COLOR_PALETTE","BORDER_AUTOFILL_DRAGGING","DirectionMapping","Autofill","draggingTo","selectingZone","orientation","sTop","sLeft","sBottom","sRight","srcShape","dstShape","patterns","baseCell","px","nextValue","py","style","autofillDraggingTo","horizontal","vertical","groups","groupByType","group","lastValue","pass","generateFormula","skip","generateNumber","g","generateDate","generateStringNumber","extractStringNumber","lastNumber","StringNumberPattern","TypedGroup","kind","prefix1","number1","prefix2","number2","news","lastGroup","basePrefix","number","nexts","firstNumber","nextGroup"],"mappings":"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"}