@extable/core 0.3.4 → 0.3.6
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/core.css +1 -1
- package/dist/dataModel.d.ts +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2175 -1808
- package/dist/index.js.map +1 -1
- package/dist/numberIO-B8lMxkWc.js +984 -0
- package/dist/numberIO-B8lMxkWc.js.map +1 -0
- package/dist/numberIO-BMnYEoog.js +1011 -0
- package/dist/numberIO-BMnYEoog.js.map +1 -0
- package/dist/numberIO-BhW20Lm1.js +988 -0
- package/dist/numberIO-BhW20Lm1.js.map +1 -0
- package/dist/numberIO-C1R2zgBN.js +1010 -0
- package/dist/numberIO-C1R2zgBN.js.map +1 -0
- package/dist/selectionManager.d.ts +35 -0
- package/dist/ssr/index.js +1 -1
- package/dist/types.d.ts +69 -4
- package/package.json +2 -2
- package/src/styles.css +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numberIO-B8lMxkWc.js","sources":["../src/utils.ts","../src/dateUtils.ts","../src/validation.ts","../src/dataModel.ts","../src/cellValueCodec.ts","../src/geometry.ts","../src/styleResolver.ts","../src/actionValue.ts","../src/numberIO.ts"],"sourcesContent":["export function generateId() {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `row_${Math.random().toString(16).slice(2)}`;\n}\n\nexport function toArray<T>(value: T | T[] | undefined): T[] | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n}\n\nexport function removeFromParent(el: Element | null | undefined) {\n if (!el) return;\n try {\n el.remove();\n } catch {\n // Ignore NotFoundError from re-entrant blur/remove edge cases.\n }\n}\n","const pad = (num: number, len = 2) => num.toString().padStart(len, \"0\");\n\nconst tokenHandlers: Record<\n string,\n (d: Date) => string\n> = {\n yyyy: (d) => pad(d.getFullYear(), 4),\n MM: (d) => pad(d.getMonth() + 1),\n dd: (d) => pad(d.getDate()),\n HH: (d) => pad(d.getHours()),\n hh: (d) => {\n const h = d.getHours() % 12 || 12;\n return pad(h);\n },\n mm: (d) => pad(d.getMinutes()),\n ss: (d) => pad(d.getSeconds()),\n a: (d) => (d.getHours() >= 12 ? \"PM\" : \"AM\"),\n};\n\nconst TOKENS = Object.keys(tokenHandlers).sort((a, b) => b.length - a.length);\nconst DATE_TOKENS = new Set([\"yyyy\", \"MM\", \"dd\"]);\nconst TIME_TOKENS = new Set([\"HH\", \"hh\", \"mm\", \"ss\", \"a\"]);\nconst DATETIME_TOKENS = new Set([...DATE_TOKENS, ...TIME_TOKENS]);\n\ntype DatePatternKind = \"date\" | \"time\" | \"datetime\";\n\nconst DATE_PRESETS: Record<string, string> = {\n iso: \"yyyy-MM-dd\",\n us: \"MM/dd/yyyy\",\n eu: \"dd.MM.yyyy\",\n};\n\nconst TIME_PRESETS: Record<string, string> = {\n iso: \"HH:mm:ss\",\n \"24h\": \"HH:mm\",\n \"12h\": \"hh:mm a\",\n};\n\nconst DATETIME_PRESETS: Record<string, string> = {\n iso: \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n \"iso-24h\": \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n \"iso-12h\": \"yyyy-MM-dd hh:mm a\",\n us: \"MM/dd/yyyy HH:mm\",\n \"us-24h\": \"MM/dd/yyyy HH:mm\",\n \"us-12h\": \"MM/dd/yyyy hh:mm a\",\n eu: \"dd.MM.yyyy HH:mm\",\n \"eu-24h\": \"dd.MM.yyyy HH:mm\",\n \"eu-12h\": \"dd.MM.yyyy hh:mm a\",\n};\n\nexport function parseIsoDate(value: string): Date | null {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function formatDateLite(date: Date, pattern: string): string {\n let out = \"\";\n let i = 0;\n let inLiteral = false;\n while (i < pattern.length) {\n const ch = pattern[i];\n if (ch === \"'\") {\n inLiteral = !inLiteral;\n i += 1;\n continue;\n }\n if (inLiteral) {\n out += ch;\n i += 1;\n continue;\n }\n let matched = false;\n for (const token of TOKENS) {\n if (pattern.startsWith(token, i)) {\n out += tokenHandlers[token](date);\n i += token.length;\n matched = true;\n break;\n }\n }\n if (!matched) {\n out += ch;\n i += 1;\n }\n }\n return out;\n}\n\nfunction isTokenAllowed(token: string, kind: DatePatternKind): boolean {\n if (kind === \"date\") return DATE_TOKENS.has(token);\n if (kind === \"time\") return TIME_TOKENS.has(token);\n return DATETIME_TOKENS.has(token);\n}\n\nfunction isPatternAllowed(pattern: string, kind: DatePatternKind): boolean {\n let i = 0;\n let inLiteral = false;\n while (i < pattern.length) {\n const ch = pattern[i];\n if (ch === \"'\") {\n inLiteral = !inLiteral;\n i += 1;\n continue;\n }\n if (inLiteral) {\n i += 1;\n continue;\n }\n let matched = false;\n for (const token of TOKENS) {\n if (pattern.startsWith(token, i)) {\n if (!isTokenAllowed(token, kind)) return false;\n i += token.length;\n matched = true;\n break;\n }\n }\n if (!matched) i += 1;\n }\n return true;\n}\n\nexport function coerceDatePattern(\n pattern: string | undefined,\n kind: DatePatternKind,\n): string {\n if (!pattern) {\n return kind === \"date\"\n ? DATE_PRESETS.iso\n : kind === \"time\"\n ? TIME_PRESETS.iso\n : DATETIME_PRESETS.iso;\n }\n\n if (kind === \"date\" && DATE_PRESETS[pattern]) return DATE_PRESETS[pattern];\n if (kind === \"time\" && TIME_PRESETS[pattern]) return TIME_PRESETS[pattern];\n if (kind === \"datetime\" && DATETIME_PRESETS[pattern]) return DATETIME_PRESETS[pattern];\n\n const fallback =\n kind === \"date\"\n ? DATE_PRESETS.iso\n : kind === \"time\"\n ? TIME_PRESETS.iso\n : DATETIME_PRESETS.iso;\n\n return isPatternAllowed(pattern, kind) ? pattern : fallback;\n}\n","import { coerceDatePattern, parseIsoDate } from \"./dateUtils\";\nimport type { ColumnSchema, NumberFormat, StringFormat } from \"./types\";\n\nconst isValidDate = (d: Date) => !Number.isNaN(d.getTime());\n\nconst asEnumValue = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"enum\") {\n return typeof obj.value === \"string\" ? obj.value : null;\n }\n }\n return null;\n};\n\nconst asTagsValues = (value: unknown) => {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) return value as string[];\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n return Array.isArray(values) && values.every((v) => typeof v === \"string\")\n ? (values as string[])\n : null;\n }\n }\n return null;\n};\n\nexport function validateCellValue(value: unknown, col: ColumnSchema): string | null {\n // MVP: avoid noisy \"required\" errors. Treat empty as valid.\n if (value === null || value === undefined) return null;\n\n switch (col.type) {\n case \"string\": {\n if (typeof value !== \"string\") return \"Expected a string\";\n const fmt = col.format as StringFormat | undefined;\n if (fmt?.maxLength !== undefined && value.length > fmt.maxLength) {\n return `Too long (max ${fmt.maxLength})`;\n }\n if (fmt?.regex) {\n try {\n const re = new RegExp(fmt.regex);\n if (!re.test(value)) return \"Does not match pattern\";\n } catch {\n // ignore invalid regex config\n }\n }\n return null;\n }\n case \"number\": {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"Expected a number\";\n const fmt = col.format as NumberFormat | undefined;\n if (fmt?.signed === false && value < 0) return \"Expected a non-negative number\";\n return null;\n }\n case \"int\": {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) return \"Expected an integer\";\n return null;\n }\n case \"uint\": {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n return \"Expected a non-negative integer\";\n }\n return null;\n }\n case \"boolean\": {\n if (typeof value !== \"boolean\") return \"Expected a boolean\";\n return null;\n }\n case \"enum\": {\n const v = asEnumValue(value);\n if (!v) return \"Expected an enum value\";\n const allowCustom = col.enum?.allowCustom ?? false;\n const options = col.enum?.options ?? [];\n if (!allowCustom && options.length && !options.includes(v)) return \"Not in allowed options\";\n return null;\n }\n case \"tags\": {\n const values = asTagsValues(value);\n if (!values) return \"Expected a list of tags\";\n const allowCustom = col.tags?.allowCustom ?? false;\n const options = col.tags?.options ?? [];\n if (!allowCustom && options.length) {\n for (const v of values) {\n if (!options.includes(v)) return \"Contains an unknown tag\";\n }\n }\n return null;\n }\n case \"date\":\n case \"time\":\n case \"datetime\": {\n // Enforce allowed format tokens per type; fall back to ISO preset if invalid.\n const fmt = col.format as string | undefined;\n if (col.type === \"date\") coerceDatePattern(fmt, \"date\");\n else if (col.type === \"time\") coerceDatePattern(fmt, \"time\");\n else coerceDatePattern(fmt, \"datetime\");\n if (value instanceof Date) return isValidDate(value) ? null : \"Invalid date\";\n if (typeof value === \"string\") {\n const d = parseIsoDate(value);\n return d && isValidDate(d) ? null : \"Invalid date/time\";\n }\n return \"Expected a date/time string\";\n }\n default:\n return null;\n }\n}\n","import { generateId } from \"./utils\";\nimport type {\n CellDiagnostic,\n ColumnSchema,\n ColumnDiagnosticFilter,\n ColumnType,\n ConditionalStyleFn,\n InternalRow,\n RowObject,\n Schema,\n StyleDelta,\n ViewFilterValues,\n ViewSort,\n View,\n} from \"./types\";\nimport { validateCellValue } from \"./validation\";\n\ntype AnyFilter = { key?: unknown; kind?: unknown };\n\nexport class DataModel {\n private schema: Schema<any>;\n private view: View;\n private rows: InternalRow[] = [];\n private baseIndexById = new Map<string, number>();\n private dataVersion = 0;\n private visibleRowsCache: {\n version: number;\n key: string;\n rows: InternalRow[];\n indexById: Map<string, number>;\n } | null = null;\n private distinctValueCache = new Map<\n string,\n {\n version: number;\n values: Array<{ value: unknown; label: string }>;\n hasBlanks: boolean;\n total: number;\n }\n >();\n private pending: Map<string, Record<string, unknown>> = new Map();\n private rowVersion: Map<string, number> = new Map();\n private listeners = new Set<() => void>();\n private cellStyles = new Map<string, StyleDelta>();\n private cellConditionalStyles = new Map<string, ConditionalStyleFn>();\n private computedCache = new Map<\n string,\n {\n version: number;\n formulaRef: unknown;\n value: unknown;\n textOverride?: string;\n diagnostic: CellDiagnostic | null;\n }\n >();\n private conditionalCache = new Map<\n string,\n {\n version: number;\n fnRef: unknown;\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n }\n >();\n private rowConditionalCache = new Map<\n string,\n {\n version: number;\n fnRef: unknown;\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n }\n >();\n private formulaDiagnostics = new Map<string, CellDiagnostic>();\n private conditionalDiagnostics = new Map<string, CellDiagnostic>();\n private baseValidationErrors = new Map<\n string,\n { rowId: string; colKey: string; message: string }\n >();\n private uniqueValidationErrors = new Map<\n string,\n { rowId: string; colKey: string; message: string }\n >();\n private notifySuspended = false;\n private notifyDirty = false;\n\n constructor(dataset: RowObject[] | undefined, schema: Schema<any>, view: View) {\n this.schema = schema;\n this.view = view;\n this.setData(dataset ?? []);\n }\n\n public subscribe(listener: () => void) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify() {\n this.visibleRowsCache = null;\n this.distinctValueCache.clear();\n if (this.notifySuspended) {\n this.notifyDirty = true;\n return;\n }\n for (const l of this.listeners) l();\n }\n\n public batchUpdate(run: () => void) {\n this.notifySuspended = true;\n try {\n run();\n } finally {\n this.notifySuspended = false;\n if (this.notifyDirty) {\n this.notifyDirty = false;\n this.notify();\n }\n }\n }\n\n public setData(dataset: RowObject[] | undefined) {\n this.dataVersion += 1;\n this.pending.clear();\n this.cellStyles.clear();\n this.cellConditionalStyles.clear();\n this.computedCache.clear();\n this.conditionalCache.clear();\n this.rowConditionalCache.clear();\n this.formulaDiagnostics.clear();\n this.conditionalDiagnostics.clear();\n this.baseValidationErrors.clear();\n this.uniqueValidationErrors.clear();\n this.rows = (dataset ?? []).map((row, idx) => {\n const id = generateId();\n this.rowVersion.set(id, 0);\n return {\n id,\n raw: row,\n displayIndex: idx + 1,\n };\n });\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n }\n\n public setSchema(schema: Schema<any>) {\n this.dataVersion += 1;\n this.schema = schema;\n this.computedCache.clear();\n this.conditionalCache.clear();\n this.rowConditionalCache.clear();\n this.formulaDiagnostics.clear();\n this.conditionalDiagnostics.clear();\n this.recomputeValidationErrors();\n this.notify();\n }\n\n public setView(view: View) {\n this.dataVersion += 1;\n // MVP constraint: allow `sorts` as array, but enforce at most one sort.\n if (Array.isArray(view.sorts) && view.sorts.length > 1) {\n this.view = { ...view, sorts: view.sorts.slice(0, 1) };\n } else {\n this.view = view;\n }\n this.notify();\n }\n\n public getSchema(): Schema<any> {\n return { ...this.schema, columns: this.getColumns() } as Schema<any>;\n }\n\n public getColumns(): ColumnSchema<any>[] {\n return this.schema.columns;\n }\n\n public getRowConditionalStyleFn(): ConditionalStyleFn | null {\n return this.schema.row?.conditionalStyle ?? null;\n }\n\n public getView() {\n return this.view;\n }\n\n public getDataVersion() {\n return this.dataVersion;\n }\n\n public getFullSchema(): Schema<any> {\n return this.schema;\n }\n\n public listRows(): InternalRow[] {\n return this.computeVisibleRows().rows;\n }\n\n public listAllRows(): InternalRow[] {\n return this.rows;\n }\n\n public getAllRowCount() {\n return this.rows.length;\n }\n\n private findRow(rowId: string): { row: InternalRow; index: number } | null {\n const index = this.baseIndexById.get(rowId);\n if (index === undefined) return null;\n const row = this.rows[index];\n if (row && row.id === rowId) return { row, index };\n // Defensive fallback for unexpected external mutation of `rows`.\n const slowIndex = this.rows.findIndex((r) => r.id === rowId);\n if (slowIndex < 0) return null;\n const slowRow = this.rows[slowIndex];\n if (!slowRow) return null;\n this.rebuildBaseIndex();\n return { row: slowRow, index: slowIndex };\n }\n\n public getRowHeight(rowId: string) {\n return this.view.rowHeights?.[rowId];\n }\n\n public setRowHeight(rowId: string, height: number) {\n if (!this.view.rowHeights) this.view.rowHeights = {};\n const prev = this.view.rowHeights[rowId];\n if (prev === height) return;\n this.view.rowHeights[rowId] = height;\n this.notify();\n }\n\n public setRowHeightsBulk(next: Record<string, number>) {\n const entries = Object.entries(next);\n if (entries.length === 0) return;\n if (!this.view.rowHeights) this.view.rowHeights = {};\n let changed = false;\n for (const [rowId, height] of entries) {\n if (this.view.rowHeights[rowId] === height) continue;\n this.view.rowHeights[rowId] = height;\n changed = true;\n }\n if (changed) this.notify();\n }\n\n public getCell(rowId: string, key: string) {\n const found = this.findRow(rowId);\n if (!found) return undefined;\n const row = found.row;\n const pendingRow = this.pending.get(rowId);\n if (pendingRow && key in pendingRow) return pendingRow[key];\n return row.raw[key];\n }\n\n public getRawCell(rowId: string, key: string) {\n const found = this.findRow(rowId);\n if (!found) return undefined;\n const row = found.row;\n return row.raw[key];\n }\n\n public isRowReadonly(rowId: string) {\n const found = this.findRow(rowId);\n if (!found) return false;\n const row = found.row;\n return Boolean((row.raw as Record<string, unknown>)._readonly);\n }\n\n private isActionType(colType: ColumnType | undefined) {\n return colType === \"button\" || colType === \"link\";\n }\n\n private supportsConditionalReadonly(colType: ColumnType | undefined) {\n return (\n colType === \"boolean\" ||\n colType === \"number\" ||\n colType === \"date\" ||\n colType === \"time\" ||\n colType === \"datetime\" ||\n colType === \"string\" ||\n colType === \"enum\" ||\n colType === \"tags\"\n );\n }\n\n public isColumnReadonly(colKey: string) {\n const col = this.schema.columns.find((c) => c.key === colKey);\n if (this.isActionType(col?.type)) return true;\n return Boolean(col?.readonly || col?.formula);\n }\n\n public getCellInteraction(rowId: string, colKey: string) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return { readonly: false, disabled: false, muted: false };\n const baseReadonly = this.isRowReadonly(rowId) || this.isColumnReadonly(colKey);\n const delta = this.resolveConditionalStyle(rowId, col).delta;\n const cellStyle = this.getCellStyle(rowId, colKey);\n const readonlyAllowed = this.supportsConditionalReadonly(col.type);\n const readonlyFromStyle =\n readonlyAllowed && Boolean(col.style?.readonly || delta?.readonly || cellStyle?.readonly);\n const disabledAllowed = this.isActionType(col.type);\n const disabled =\n disabledAllowed && Boolean(col.style?.disabled || delta?.disabled || cellStyle?.disabled);\n const readonly = baseReadonly || readonlyFromStyle || disabled;\n const isFormulaCol = Boolean(col.formula);\n const muted = disabled || (readonly && !disabledAllowed && !isFormulaCol);\n return { readonly, disabled, muted };\n }\n\n public isReadonly(rowId: string, colKey: string) {\n return this.getCellInteraction(rowId, colKey).readonly;\n }\n\n public setCell(rowId: string, key: string, value: unknown, committed: boolean) {\n this.dataVersion += 1;\n const found = this.findRow(rowId);\n if (!found) return;\n const row = found.row;\n const bumpVersion = () => {\n const prev = this.rowVersion.get(rowId) ?? 0;\n this.rowVersion.set(rowId, prev + 1);\n };\n if (committed) {\n row.raw[key] = value;\n this.pending.delete(rowId);\n bumpVersion();\n } else {\n const rawVal = this.getRawCell(rowId, key);\n const current = this.pending.get(rowId) ?? {};\n if (this.isEqual(rawVal, value)) {\n delete current[key];\n } else {\n current[key] = value;\n }\n const hasKeys = Object.keys(current).length > 0;\n if (hasKeys) {\n this.pending.set(rowId, current);\n } else {\n this.pending.delete(rowId);\n }\n bumpVersion();\n }\n this.updateValidationForCell(rowId, key, this.getCell(rowId, key));\n const col = this.schema.columns.find((c) => c.key === key);\n if (col?.unique) this.recomputeUniqueValidationForColumn(key);\n // Invalidate computed/conditional caches for the row by version mismatch; clear diagnostics eagerly.\n this.clearDiagnosticsForCell(rowId, key);\n this.notify();\n }\n\n public applyPending(rowId: string) {\n this.dataVersion += 1;\n const pendingRow = this.pending.get(rowId);\n if (!pendingRow) return;\n const found = this.findRow(rowId);\n if (!found) return;\n const row = found.row;\n const uniqueCols = new Set<string>();\n for (const [key, val] of Object.entries(pendingRow)) {\n row.raw[key] = val;\n this.updateValidationForCell(rowId, key, val);\n const col = this.schema.columns.find((c) => String(c.key) === String(key));\n if (col?.unique) uniqueCols.add(col.key);\n this.clearDiagnosticsForCell(rowId, key);\n }\n this.pending.delete(rowId);\n for (const colKey of uniqueCols) this.recomputeUniqueValidationForColumn(colKey);\n this.notify();\n }\n\n public clearPending(rowId: string) {\n this.dataVersion += 1;\n this.pending.delete(rowId);\n this.notify();\n }\n\n public getPending() {\n return this.pending;\n }\n\n public hasPending(rowId: string, key: string) {\n const p = this.pending.get(rowId);\n if (!p) return false;\n return key in p;\n }\n\n public insertRow(rowData: InternalRow[\"raw\"]) {\n return this.insertRowAt(rowData, this.rows.length);\n }\n\n public insertRowAt(rowData: InternalRow[\"raw\"], index: number, forcedId?: string) {\n this.dataVersion += 1;\n const id = forcedId ?? generateId();\n const clamped = Math.max(0, Math.min(index, this.rows.length));\n this.rows.splice(clamped, 0, { id, raw: rowData, displayIndex: 0 });\n this.reindexRows();\n this.rowVersion.set(id, 0);\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n return id;\n }\n\n public removeRow(rowId: string): { row: InternalRow; index: number } | null {\n this.dataVersion += 1;\n const found = this.findRow(rowId);\n if (!found) return null;\n const removed = this.rows.splice(found.index, 1)[0];\n if (!removed) return null;\n this.pending.delete(rowId);\n this.rowVersion.delete(rowId);\n this.reindexRows();\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n return { row: removed, index: found.index };\n }\n\n public getDisplayIndex(rowId: string) {\n return this.findRow(rowId)?.row.displayIndex ?? null;\n }\n\n public getRowIndex(rowId: string) {\n return this.computeVisibleRows().indexById.get(rowId) ?? -1;\n }\n\n public getBaseRowIndex(rowId: string) {\n return this.baseIndexById.get(rowId) ?? -1;\n }\n\n public getColumnIndex(colKey: string) {\n return this.getColumns().findIndex((c) => c.key === colKey);\n }\n\n public getColumnByIndex(colIndex: number) {\n return this.getColumns()[colIndex] ?? null;\n }\n\n public getRowByIndex(rowIndex: number) {\n return this.listRows()[rowIndex] ?? null;\n }\n\n private rebuildBaseIndex() {\n this.baseIndexById.clear();\n for (let i = 0; i < this.rows.length; i += 1) {\n const r = this.rows[i];\n if (r) this.baseIndexById.set(r.id, i);\n }\n }\n\n private getFilterSortKey(options?: {\n excludeColumnKey?: string;\n includeSort?: boolean;\n }) {\n const exclude = options?.excludeColumnKey;\n const includeSort = options?.includeSort ?? true;\n const view = this.view;\n const filters = (view.filters ?? [])\n .filter((f) => {\n if (exclude === undefined) return true;\n const key = (f as AnyFilter | null | undefined)?.key;\n return String(key) !== String(exclude);\n })\n .map((f) => {\n const kind = (f as AnyFilter | null | undefined)?.kind;\n if (kind === \"values\") {\n const vf = f as ViewFilterValues;\n return {\n kind: \"values\" as const,\n key: String(vf.key),\n includeBlanks: Boolean(vf.includeBlanks),\n values: (vf.values ?? []).map((v) => this.stableValueKey(v)),\n };\n }\n // Unknown filter kind (or legacy op filter) => keep a stable representation for caching.\n const opf = f as Record<string, unknown>;\n return {\n kind: \"op\" as const,\n key: String(opf.key),\n op: String(opf.op ?? \"\"),\n value: this.stableValueKey(opf.value),\n };\n })\n .sort((a, b) => (a.key === b.key ? (a.kind < b.kind ? -1 : 1) : a.key < b.key ? -1 : 1));\n\n const columnDiagnosticsEntries = Object.entries(view.columnDiagnostics ?? {})\n .filter(([k]) => (exclude !== undefined ? String(k) !== String(exclude) : true))\n .map(([k, v]) => ({\n key: String(k),\n errors: Boolean((v as ColumnDiagnosticFilter | undefined)?.errors),\n warnings: Boolean((v as ColumnDiagnosticFilter | undefined)?.warnings),\n }))\n .filter((x) => x.errors || x.warnings)\n .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n\n const sorts = includeSort\n ? (view.sorts ?? []).slice(0, 1).map((s) => ({ key: String(s.key), dir: s.dir }))\n : [];\n\n return JSON.stringify({ filters, columnDiagnosticsEntries, sorts });\n }\n\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private isBlankValue(value: unknown) {\n return value === null || value === undefined || value === \"\";\n }\n\n private resolveFilterColumnKey(key: string) {\n const cols = this.getColumns();\n const found = cols.find((c) => String(c.key) === String(key));\n return found?.key ?? key;\n }\n\n private getFilterCellValue(rowId: string, colKey: string) {\n const col = this.getColumns().find((c) => String(c.key) === String(colKey));\n if (!col) return this.getCell(rowId, colKey);\n return this.resolveCellValue(rowId, col).value;\n }\n\n private valuesFilterMatches(rowId: string, filter: ViewFilterValues) {\n const colKey = this.resolveFilterColumnKey(filter.key);\n const value = this.getFilterCellValue(rowId, colKey);\n if (this.isBlankValue(value)) return Boolean(filter.includeBlanks);\n if (!filter.values || filter.values.length === 0) return false;\n const valueKey = this.stableValueKey(value);\n for (const v of filter.values) {\n if (this.stableValueKey(v) === valueKey) return true;\n }\n return false;\n }\n\n private rowPassesColumnDiagnostics(\n rowId: string,\n colKeyStr: string,\n diag: ColumnDiagnosticFilter,\n ) {\n const errors = Boolean(diag.errors);\n const warnings = Boolean(diag.warnings);\n if (!errors && !warnings) return true;\n const colKey = this.resolveFilterColumnKey(colKeyStr);\n // Ensure diagnostics are computed for this cell before filtering by diagnostics.\n const col = this.getColumns().find((c) => String(c.key) === String(colKey));\n if (col) {\n this.resolveCellValue(rowId, col);\n this.resolveConditionalStyle(rowId, col);\n }\n const marker = this.getCellMarker(rowId, colKey);\n if (!marker) return false;\n if (marker.level === \"error\") return errors;\n return warnings;\n }\n\n private computeRowsAfterFilter(options?: {\n excludeColumnKey?: string;\n includeSort?: boolean;\n }) {\n const exclude = options?.excludeColumnKey;\n const includeSort = options?.includeSort ?? true;\n const view = this.view;\n const schema = this.getSchema();\n\n const filters = (view.filters ?? []).filter((f) => {\n if (exclude === undefined) return true;\n const key = (f as AnyFilter | null | undefined)?.key;\n return String(key) !== String(exclude);\n });\n const diagEntries = Object.entries(view.columnDiagnostics ?? {}).filter(([k]) =>\n exclude !== undefined ? String(k) !== String(exclude) : true,\n );\n\n const filtered: InternalRow[] = [];\n for (const row of this.rows) {\n let ok = true;\n for (const f of filters) {\n const kind = (f as AnyFilter | null | undefined)?.kind;\n if (kind === \"values\") {\n if (!this.valuesFilterMatches(row.id, f as ViewFilterValues)) {\n ok = false;\n break;\n }\n // matched values filter\n }\n // Unknown filter kind (or legacy op filter) => ignore in MVP.\n }\n if (!ok) continue;\n for (const [k, diag] of diagEntries) {\n if (!this.rowPassesColumnDiagnostics(row.id, k, diag as ColumnDiagnosticFilter)) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n filtered.push(row);\n }\n\n if (!includeSort) return filtered;\n\n const sort = (view.sorts ?? []).slice(0, 1)[0] as ViewSort | undefined;\n if (!sort) return filtered;\n const sortCol = schema.columns.find((c) => String(c.key) === String(sort.key));\n if (!sortCol) return filtered;\n\n const dir = sort.dir === \"desc\" ? -1 : 1;\n const withKeys = filtered.map((row) => {\n const v = this.getFilterCellValue(row.id, sortCol.key);\n const blank = this.isBlankValue(v);\n const baseIndex = this.baseIndexById.get(row.id) ?? 0;\n return { row, v, blank, baseIndex };\n });\n\n const compare = (a: unknown, b: unknown) => {\n if (a === b) return 0;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return a === b ? 0 : a ? 1 : -1;\n const as = a instanceof Date ? a.toISOString() : typeof a === \"string\" ? a : String(a);\n const bs = b instanceof Date ? b.toISOString() : typeof b === \"string\" ? b : String(b);\n if (as === bs) return 0;\n return as < bs ? -1 : 1;\n };\n\n withKeys.sort((a, b) => {\n if (a.blank && b.blank) return a.baseIndex - b.baseIndex;\n if (a.blank) return 1;\n if (b.blank) return -1;\n const c = compare(a.v, b.v);\n if (c !== 0) return c * dir;\n return a.baseIndex - b.baseIndex;\n });\n\n return withKeys.map((x) => x.row);\n }\n\n private computeVisibleRows() {\n const key = this.getFilterSortKey();\n const cached = this.visibleRowsCache;\n if (cached && cached.version === this.dataVersion && cached.key === key) return cached;\n\n const base = this.computeRowsAfterFilter({ includeSort: true });\n // Keep `displayIndex` stable (pre-filter) and only change the visible ordering.\n const rows = base;\n const indexById = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const r = rows[i];\n if (r) indexById.set(r.id, i);\n }\n const next = { version: this.dataVersion, key, rows, indexById };\n this.visibleRowsCache = next;\n return next;\n }\n\n public getDistinctValuesForColumn(colKey: string) {\n const cacheKey = `${String(colKey)}|${this.getFilterSortKey({ excludeColumnKey: colKey, includeSort: false })}`;\n const cached = this.distinctValueCache.get(cacheKey);\n if (cached && cached.version === this.dataVersion) return cached;\n\n const rows = this.computeRowsAfterFilter({ excludeColumnKey: colKey, includeSort: false });\n const col = this.getSchema().columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n const empty = { version: this.dataVersion, values: [], hasBlanks: false, total: 0 };\n this.distinctValueCache.set(cacheKey, empty);\n return empty;\n }\n\n const map = new Map<string, { value: unknown; label: string }>();\n let hasBlanks = false;\n for (const row of rows) {\n const v = this.getFilterCellValue(row.id, col.key);\n if (this.isBlankValue(v)) {\n hasBlanks = true;\n continue;\n }\n const k = this.stableValueKey(v);\n if (map.has(k)) continue;\n const label = (() => {\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\" && v) {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n map.set(k, { value: v, label });\n }\n\n const values = [...map.values()].sort((a, b) =>\n a.label < b.label ? -1 : a.label > b.label ? 1 : 0,\n );\n const next = {\n version: this.dataVersion,\n values,\n hasBlanks,\n total: values.length + (hasBlanks ? 1 : 0),\n };\n this.distinctValueCache.set(cacheKey, next);\n return next;\n }\n\n private cellStyleKey(rowId: string, colKey: string) {\n return `${rowId}::${String(colKey)}`;\n }\n\n private clearDiagnosticsForCell(rowId: string, colKey: string) {\n const key = this.cellStyleKey(rowId, colKey);\n this.formulaDiagnostics.delete(key);\n this.conditionalDiagnostics.delete(key);\n }\n\n public getCellDiagnostic(rowId: string, colKey: string): CellDiagnostic | null {\n const key = this.cellStyleKey(rowId, colKey);\n const a = this.formulaDiagnostics.get(key) ?? null;\n const b = this.conditionalDiagnostics.get(key) ?? null;\n if (!a) return b;\n if (!b) return a;\n if (a.level === \"error\") return a;\n if (b.level === \"error\") return b;\n // Both warnings: prefer formula message (more likely to explain the value).\n return a;\n }\n\n public getDiagnostics() {\n const keys = new Set<string>();\n for (const k of this.formulaDiagnostics.keys()) keys.add(k);\n for (const k of this.conditionalDiagnostics.keys()) keys.add(k);\n return [...keys].map((key) => {\n const sep = key.indexOf(\"::\");\n const rowId = sep >= 0 ? key.slice(0, sep) : key;\n const colKey = sep >= 0 ? key.slice(sep + 2) : \"\";\n return { rowId, colKey, diag: this.getCellDiagnostic(rowId, colKey) };\n });\n }\n\n private getRowObjectEffective(rowId: string): Record<string, unknown> | null {\n const found = this.findRow(rowId);\n if (!found) return null;\n const row = found.row;\n const pendingRow = this.pending.get(rowId);\n if (!pendingRow || Object.keys(pendingRow).length === 0)\n return row.raw as Record<string, unknown>;\n const merged: Record<string, unknown> = { ...(row.raw as Record<string, unknown>) };\n for (const [k, v] of Object.entries(pendingRow)) {\n merged[k] = v;\n }\n return merged;\n }\n\n public resolveCellValue(\n rowId: string,\n col: ColumnSchema,\n ): {\n value: unknown;\n textOverride?: string;\n diagnostic: CellDiagnostic | null;\n } {\n if (!col.formula) {\n return { value: this.getCell(rowId, col.key), diagnostic: null };\n }\n const version = this.getRowVersion(rowId);\n const key = this.cellStyleKey(rowId, col.key);\n const cached = this.computedCache.get(key);\n if (cached && cached.version === version && cached.formulaRef === col.formula) {\n if (cached.diagnostic) this.formulaDiagnostics.set(key, cached.diagnostic);\n return {\n value: cached.value,\n textOverride: cached.textOverride,\n diagnostic: cached.diagnostic,\n };\n }\n const data = this.getRowObjectEffective(rowId);\n if (!data) {\n const value = this.getCell(rowId, col.key);\n const next = {\n version,\n formulaRef: col.formula,\n value,\n diagnostic: null as CellDiagnostic | null,\n };\n this.computedCache.set(key, next);\n return { value, diagnostic: null };\n }\n try {\n const out: unknown = col.formula(data);\n if (Array.isArray(out) && out.length >= 2 && out[1] instanceof Error) {\n const diag: CellDiagnostic = {\n level: \"warning\",\n message: out[1].message,\n source: \"formula\",\n };\n const value = out[0];\n this.computedCache.set(key, { version, formulaRef: col.formula, value, diagnostic: diag });\n this.formulaDiagnostics.set(key, diag);\n return { value, diagnostic: diag };\n }\n const value = out;\n this.computedCache.set(key, { version, formulaRef: col.formula, value, diagnostic: null });\n this.formulaDiagnostics.delete(key);\n return { value, diagnostic: null };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n const diag: CellDiagnostic = { level: \"error\", message, source: \"formula\" };\n this.computedCache.set(key, {\n version,\n formulaRef: col.formula,\n value: null,\n textOverride: \"#ERROR\",\n diagnostic: diag,\n });\n this.formulaDiagnostics.set(key, diag);\n return { value: null, textOverride: \"#ERROR\", diagnostic: diag };\n }\n }\n\n public setCellConditionalStyle(rowId: string, colKey: string, fn: ConditionalStyleFn | null) {\n const key = this.cellStyleKey(rowId, colKey);\n if (!fn) this.cellConditionalStyles.delete(key);\n else this.cellConditionalStyles.set(key, fn);\n this.conditionalCache.delete(key);\n this.clearDiagnosticsForCell(rowId, colKey);\n this.notify();\n }\n\n private evalConditionalStyleFn(\n fn: ConditionalStyleFn,\n data: Record<string, unknown>,\n ): { delta: StyleDelta | null; diagnostic: CellDiagnostic | null; forceErrorText: boolean } {\n try {\n const out = fn(data);\n if (out instanceof Error) {\n return {\n delta: null,\n diagnostic: { level: \"warning\", message: out.message, source: \"conditionalStyle\" },\n forceErrorText: false,\n };\n }\n return { delta: out ?? null, diagnostic: null, forceErrorText: false };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n delta: null,\n diagnostic: { level: \"error\", message, source: \"conditionalStyle\" },\n forceErrorText: true,\n };\n }\n }\n\n private resolveRowConditionalStyle(rowId: string): {\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n } {\n const fn = this.getRowConditionalStyleFn();\n if (!fn) return { delta: null, diagnostic: null, forceErrorText: false };\n const version = this.getRowVersion(rowId);\n const cached = this.rowConditionalCache.get(rowId);\n if (cached && cached.version === version && cached.fnRef === fn) {\n return {\n delta: cached.delta,\n diagnostic: cached.diagnostic,\n forceErrorText: cached.forceErrorText,\n };\n }\n const data = this.getRowObjectEffective(rowId);\n if (!data) {\n const next = { version, fnRef: fn, delta: null, diagnostic: null, forceErrorText: false };\n this.rowConditionalCache.set(rowId, next);\n return { delta: null, diagnostic: null, forceErrorText: false };\n }\n const res = this.evalConditionalStyleFn(fn, data);\n this.rowConditionalCache.set(rowId, { version, fnRef: fn, ...res });\n return res;\n }\n\n public resolveConditionalStyle(\n rowId: string,\n col: ColumnSchema,\n ): {\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n } {\n const version = this.getRowVersion(rowId);\n const key = this.cellStyleKey(rowId, col.key);\n const data = this.getRowObjectEffective(rowId);\n const rowRes = this.resolveRowConditionalStyle(rowId);\n\n const applyDelta = (base: StyleDelta | null, next: StyleDelta | null) => {\n if (!next) return base;\n if (!base) return { ...next };\n return { ...base, ...next };\n };\n\n let delta: StyleDelta | null = null;\n let diagnostic: CellDiagnostic | null = null;\n let forceErrorText = false;\n\n // Lowest within the conditional layer: row-level.\n delta = applyDelta(delta, rowRes.delta);\n if (rowRes.diagnostic) diagnostic = rowRes.diagnostic;\n forceErrorText = forceErrorText || rowRes.forceErrorText;\n\n // Column-level conditional style.\n if (col.conditionalStyle && data) {\n const colCacheKey = `${rowId}::${String(col.key)}::col`;\n const cached = this.conditionalCache.get(colCacheKey);\n if (cached && cached.version === version && cached.fnRef === col.conditionalStyle) {\n delta = applyDelta(delta, cached.delta);\n if (cached.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = cached.diagnostic;\n forceErrorText = forceErrorText || cached.forceErrorText;\n } else {\n const res = this.evalConditionalStyleFn(col.conditionalStyle, data);\n this.conditionalCache.set(colCacheKey, { version, fnRef: col.conditionalStyle, ...res });\n delta = applyDelta(delta, res.delta);\n if (res.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = res.diagnostic;\n forceErrorText = forceErrorText || res.forceErrorText;\n }\n }\n\n // Highest within the conditional layer: cell-level.\n const cellFn = this.cellConditionalStyles.get(key);\n if (cellFn && data) {\n const cached = this.conditionalCache.get(key);\n if (cached && cached.version === version && cached.fnRef === cellFn) {\n delta = applyDelta(delta, cached.delta);\n if (cached.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = cached.diagnostic;\n forceErrorText = forceErrorText || cached.forceErrorText;\n } else {\n const res = this.evalConditionalStyleFn(cellFn, data);\n this.conditionalCache.set(key, { version, fnRef: cellFn, ...res });\n delta = applyDelta(delta, res.delta);\n if (res.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = res.diagnostic;\n forceErrorText = forceErrorText || res.forceErrorText;\n }\n }\n\n if (diagnostic) this.conditionalDiagnostics.set(key, diagnostic);\n else this.conditionalDiagnostics.delete(key);\n\n return { delta, diagnostic, forceErrorText };\n }\n\n public getValidationErrors() {\n const merged = new Map<string, { rowId: string; colKey: string; message: string }>();\n for (const [k, v] of this.baseValidationErrors.entries()) merged.set(k, { ...v });\n for (const [k, v] of this.uniqueValidationErrors.entries()) {\n const prev = merged.get(k);\n if (!prev) merged.set(k, { ...v });\n else merged.set(k, { ...prev, message: `${prev.message}\\n${v.message}` });\n }\n const out = [...merged.values()];\n out.sort((a, b) => {\n const ra = this.getRowIndex(a.rowId);\n const rb = this.getRowIndex(b.rowId);\n if (ra !== rb) return ra - rb;\n const ca = this.getColumnIndex(a.colKey);\n const cb = this.getColumnIndex(b.colKey);\n return ca - cb;\n });\n return out;\n }\n\n public getCellValidationMessage(rowId: string, colKey: string): string | null {\n const key = this.cellStyleKey(rowId, colKey);\n const a = this.baseValidationErrors.get(key)?.message ?? null;\n const b = this.uniqueValidationErrors.get(key)?.message ?? null;\n if (!a) return b;\n if (!b) return a;\n return `${a}\\n${b}`;\n }\n\n public getCellMarker(\n rowId: string,\n colKey: string,\n ): { level: \"warning\" | \"error\"; message: string } | null {\n const diag = this.getCellDiagnostic(rowId, colKey);\n const validation = this.getCellValidationMessage(rowId, colKey);\n if (!diag && !validation) return null;\n const level: \"warning\" | \"error\" = validation ? \"error\" : (diag?.level ?? \"warning\");\n const message = [diag?.message ?? null, validation].filter(Boolean).join(\"\\n\");\n return { level, message };\n }\n\n private updateValidationForCell(rowId: string, colKey: string, value: unknown) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return;\n const msg = validateCellValue(value, col);\n const key = this.cellStyleKey(rowId, colKey);\n if (!msg) this.baseValidationErrors.delete(key);\n else this.baseValidationErrors.set(key, { rowId, colKey, message: msg });\n }\n\n private recomputeValidationErrors() {\n this.baseValidationErrors.clear();\n this.uniqueValidationErrors.clear();\n for (const row of this.rows) {\n for (const col of this.schema.columns) {\n const v = this.getCell(row.id, col.key);\n this.updateValidationForCell(row.id, col.key, v);\n }\n }\n for (const col of this.getColumns()) {\n if (!col.unique) continue;\n this.recomputeUniqueValidationForColumn(col.key);\n }\n }\n\n private normalizeUniqueValue(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value === \"\" ? null : value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value instanceof Date) return String(value.getTime());\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") {\n return obj.value === \"\" ? null : obj.value;\n }\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n const joined = obj.values.filter((x) => typeof x === \"string\").join(\",\");\n return joined === \"\" ? null : joined;\n }\n }\n return String(value);\n }\n\n private recomputeUniqueValidationForColumn(colKey: string) {\n const colKeyStr = String(colKey);\n for (const k of Array.from(this.uniqueValidationErrors.keys())) {\n const sep = k.indexOf(\"::\");\n const existingCol = sep >= 0 ? k.slice(sep + 2) : \"\";\n if (existingCol === colKeyStr) this.uniqueValidationErrors.delete(k);\n }\n const valueToRows = new Map<string, string[]>();\n for (const row of this.rows) {\n const v = this.getCell(row.id, colKey);\n const norm = this.normalizeUniqueValue(v);\n if (!norm) continue;\n const list = valueToRows.get(norm) ?? [];\n list.push(row.id);\n valueToRows.set(norm, list);\n }\n for (const rowIds of valueToRows.values()) {\n if (rowIds.length < 2) continue;\n const display = rowIds\n .map((rowId) => this.getDisplayIndex(rowId))\n .filter((x): x is number => typeof x === \"number\" && Number.isFinite(x))\n .sort((a, b) => a - b);\n const rowList = display.length ? display.join(\", \") : rowIds.join(\", \");\n for (const rowId of rowIds) {\n const key = this.cellStyleKey(rowId, colKey);\n this.uniqueValidationErrors.set(key, {\n rowId,\n colKey,\n message: `Duplicate value\\nRows: ${rowList}`,\n });\n }\n }\n }\n\n public getCellStyle(rowId: string, colKey: string): StyleDelta | null {\n return this.cellStyles.get(this.cellStyleKey(rowId, colKey)) ?? null;\n }\n\n public setCellStyle(rowId: string, colKey: string, style: StyleDelta | null) {\n const key = this.cellStyleKey(rowId, colKey);\n if (!style || Object.keys(style).length === 0) this.cellStyles.delete(key);\n else this.cellStyles.set(key, style);\n this.notify();\n }\n\n public updateColumnStyle(\n colKey: string,\n updater:\n | ColumnSchema[\"style\"]\n | ((oldValue: ColumnSchema[\"style\"] | undefined) => ColumnSchema[\"style\"] | undefined),\n ) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return;\n const next = typeof updater === \"function\" ? updater(col.style) : updater;\n col.style = next;\n this.notify();\n }\n\n private isEqual(a: unknown, b: unknown) {\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n return Object.is(a, b);\n }\n\n public getRowVersion(rowId: string) {\n return this.rowVersion.get(rowId) ?? 0;\n }\n\n private reindexRows() {\n let idx = 1;\n for (const row of this.rows) {\n row.displayIndex = idx;\n idx += 1;\n }\n }\n}\n","import type { ColumnSchema } from \"./types\";\nimport { parseIsoDate } from \"./dateUtils\";\n\nconst DAY_MS = 86_400_000;\n\nexport function safeParseDate(value: string): Date | null {\n const parsed = parseIsoDate(value);\n if (!parsed) return null;\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function safeParseTime(value: string): Date | null {\n const parsed = new Date(`1970-01-01T${value}`);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function toRawValue(raw: unknown, value: unknown, col: ColumnSchema): string | null {\n void raw;\n if (value === null || value === undefined) return null;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"lookup\" && typeof obj.value === \"string\") {\n return obj.value;\n }\n }\n if (col.type === \"string\") return null;\n if (col.type === \"boolean\") return String(Boolean(value));\n if ((col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n return String(value);\n }\n if (col.type === \"datetime\") {\n const d = value instanceof Date ? value : safeParseDate(String(value));\n return d ? String(d.getTime()) : null;\n }\n if (col.type === \"date\") {\n const d = value instanceof Date ? value : safeParseDate(String(value));\n if (!d) return null;\n const floored = Math.floor(d.getTime() / DAY_MS) * DAY_MS;\n return String(floored);\n }\n if (col.type === \"time\") {\n const d = value instanceof Date ? value : safeParseTime(String(value));\n if (!d) return null;\n return String(d.getTime() % DAY_MS);\n }\n return null;\n}\n","import type { Schema, View } from \"./types\";\n\nexport const HEADER_HEIGHT_PX = 35;\nexport const ROW_HEADER_WIDTH_PX = 48;\nexport const DEFAULT_ROW_HEIGHT_PX = 35;\n\n// Shared visual metrics\n// Keep vertical insets compatible with DEFAULT_ROW_HEIGHT_PX (24px) and base line-height (16px).\nexport const CELL_PADDING_X_PX = 8;\nexport const CELL_PADDING_TOP_PX = 4;\nexport const CELL_PADDING_BOTTOM_PX = 4;\n\nexport function getColumnWidths(schema: Schema, view: View, fallbackWidth = 100): number[] {\n const extraByType: Partial<Record<string, number>> = {\n // Reserve extra space for browser UI affordances (e.g. date picker icon) and formatting.\n date: 8,\n };\n return schema.columns.map((c) => {\n const base = view.columnWidths?.[String(c.key)] ?? c.width ?? fallbackWidth;\n const extra = extraByType[c.type] ?? 0;\n return base + extra;\n });\n}\n","import type { ColumnSchema, ResolvedCellStyle, StyleDelta } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\n\nexport function columnFormatToStyle(col: ColumnSchema): ResolvedCellStyle {\n const fmt = col.style;\n const dec = fmt?.decorations;\n return {\n backgroundColor: fmt?.backgroundColor,\n textColor: fmt?.textColor,\n bold: dec?.bold,\n italic: dec?.italic,\n underline: dec?.underline,\n strike: dec?.strike,\n readonly: fmt?.readonly,\n disabled: fmt?.disabled,\n };\n}\n\nexport function mergeStyle(base: ResolvedCellStyle, override?: StyleDelta | null): ResolvedCellStyle {\n if (!override) return base;\n return {\n backgroundColor: override.backgroundColor ?? base.backgroundColor,\n textColor: override.textColor ?? base.textColor,\n bold: override.bold ?? base.bold,\n italic: override.italic ?? base.italic,\n underline: override.underline ?? base.underline,\n strike: override.strike ?? base.strike,\n readonly: override.readonly ?? base.readonly,\n disabled: override.disabled ?? base.disabled,\n };\n}\n\nexport function resolveCellStyles(\n dataModel: DataModel,\n rowId: string,\n col: ColumnSchema,\n): { columnStyle: ResolvedCellStyle; cellStyle: StyleDelta; resolved: ResolvedCellStyle } {\n const columnStyle = columnFormatToStyle(col);\n const conditional = dataModel.resolveConditionalStyle(rowId, col).delta ?? {};\n const cellStyle = dataModel.getCellStyle(rowId, col.key) ?? {};\n const resolved = mergeStyle(mergeStyle(columnStyle, conditional), cellStyle);\n return { columnStyle, cellStyle, resolved };\n}\n\nexport function styleToCssText(style: ResolvedCellStyle): string {\n let css = \"\";\n if (style.backgroundColor) css += `background-color:${style.backgroundColor};`;\n if (style.textColor) css += `color:${style.textColor};`;\n if (style.bold) css += \"font-weight:600;\";\n if (style.italic) css += \"font-style:italic;\";\n const dec: string[] = [];\n if (style.underline) dec.push(\"underline\");\n if (style.strike) dec.push(\"line-through\");\n if (dec.length) css += `text-decoration-line:${dec.join(\" \")};`;\n return css;\n}\n","import type { ButtonActionValue, ButtonValue, LinkValue } from \"./types\";\n\nexport type LinkActionValue = { label: string; href: string; target?: string };\n\nexport function resolveButtonAction(value: unknown): ButtonActionValue | null {\n if (typeof value === \"string\") return { label: value };\n if (!value || typeof value !== \"object\") return null;\n const obj = value as Record<string, unknown>;\n const label = obj.label;\n const command = obj.command;\n const commandfor = obj.commandfor;\n if (typeof label !== \"string\") return null;\n if (typeof command === \"string\" && typeof commandfor === \"string\") {\n return { label, command, commandfor };\n }\n return null;\n}\n\nexport function getButtonLabel(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return \"\";\n const label = (value as Record<string, unknown>).label;\n return typeof label === \"string\" ? label : \"\";\n}\n\nexport function resolveLinkAction(value: unknown): LinkActionValue | null {\n if (typeof value === \"string\") return { label: value, href: value };\n if (!value || typeof value !== \"object\") return null;\n const obj = value as Record<string, unknown>;\n const label = obj.label;\n const href = obj.href;\n const target = obj.target;\n if (typeof label !== \"string\" || typeof href !== \"string\") return null;\n if (typeof target === \"string\") return { label, href, target };\n if (target === undefined) return { label, href };\n return null;\n}\n\nexport function getLinkLabel(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return \"\";\n const obj = value as Record<string, unknown>;\n const label = obj.label;\n const href = obj.href;\n if (typeof label === \"string\") return label;\n if (typeof href === \"string\") return href;\n return \"\";\n}\n","export type NumericParseResult =\n | { ok: true; value: number }\n | { ok: false; reason: \"empty\" | \"invalid\" | \"non-finite\" | \"not-integer\" | \"out-of-range\" };\n\nexport type NumericColumnType = \"number\" | \"int\" | \"uint\";\n\nexport function normalizeNumericInput(text: string): string {\n return text.normalize(\"NFKC\").trim();\n}\n\nconst parsePrefixedBaseInteger = (text: string): number | null => {\n const s = text.trim();\n const m = /^([+-]?)(0[bBoOxX])([0-9a-fA-F]+)$/.exec(s);\n if (!m) return null;\n\n const sign = m[1] === \"-\" ? -1 : 1;\n const prefix = m[2].toLowerCase();\n const digits = m[3] ?? \"\";\n\n let radix = 10;\n let validRe = /^[0-9]+$/;\n if (prefix === \"0b\") {\n radix = 2;\n validRe = /^[01]+$/;\n } else if (prefix === \"0o\") {\n radix = 8;\n validRe = /^[0-7]+$/;\n } else if (prefix === \"0x\") {\n radix = 16;\n validRe = /^[0-9a-fA-F]+$/;\n }\n\n if (!digits || !validRe.test(digits)) return NaN;\n const n = Number.parseInt(digits, radix);\n return sign * n;\n};\n\nexport function parseNumericText(rawText: string): NumericParseResult {\n const text = normalizeNumericInput(rawText);\n if (text === \"\") return { ok: false, reason: \"empty\" };\n\n const baseParsed = parsePrefixedBaseInteger(text);\n if (baseParsed !== null) {\n if (!Number.isFinite(baseParsed)) return { ok: false, reason: \"invalid\" };\n return { ok: true, value: baseParsed };\n }\n\n const n = Number(text);\n if (!Number.isFinite(n)) return { ok: false, reason: Number.isNaN(n) ? \"invalid\" : \"non-finite\" };\n return { ok: true, value: n };\n}\n\nexport function coerceNumericForColumn(\n value: number,\n type: NumericColumnType,\n): NumericParseResult {\n if (!Number.isFinite(value)) return { ok: false, reason: \"non-finite\" };\n if (type === \"number\") return { ok: true, value };\n\n if (!Number.isSafeInteger(value)) return { ok: false, reason: \"not-integer\" };\n if (type === \"uint\" && value < 0) return { ok: false, reason: \"out-of-range\" };\n return { ok: true, value };\n}\n\nexport type IntegerBaseFormat = \"binary\" | \"octal\" | \"hex\";\n\nexport function formatIntegerWithPrefix(value: number, base: IntegerBaseFormat): string {\n const sign = value < 0 ? \"-\" : \"\";\n const abs = Math.abs(value);\n const digits =\n base === \"binary\" ? abs.toString(2) : base === \"octal\" ? abs.toString(8) : abs.toString(16);\n const prefix = base === \"binary\" ? \"0b\" : base === \"octal\" ? \"0o\" : \"0x\";\n return `${sign}${prefix}${digits}`;\n}\n\nexport function formatNumberForEdit(value: number, options?: { format?: \"decimal\" | \"scientific\"; precision?: number; scale?: number }): string {\n if (!Number.isFinite(value)) return \"\";\n const fmt = options?.format ?? \"decimal\";\n if (fmt === \"scientific\") {\n const p = options?.precision;\n if (p !== undefined && Number.isFinite(p) && p > 0) {\n return value.toExponential(Math.max(0, Math.floor(p) - 1));\n }\n return value.toExponential();\n }\n const scale = options?.scale;\n if (scale !== undefined && Number.isFinite(scale)) {\n const s = Math.max(0, Math.floor(scale));\n return value.toFixed(s);\n }\n return String(value);\n}\n"],"names":["generateId","toArray","value","removeFromParent","el","pad","num","len","tokenHandlers","d","h","TOKENS","a","b","DATE_TOKENS","TIME_TOKENS","DATETIME_TOKENS","DATE_PRESETS","TIME_PRESETS","DATETIME_PRESETS","parseIsoDate","parsed","formatDateLite","date","pattern","out","i","inLiteral","ch","matched","token","isTokenAllowed","kind","isPatternAllowed","coerceDatePattern","fallback","isValidDate","asEnumValue","obj","asTagsValues","v","values","validateCellValue","col","fmt","allowCustom","options","DataModel","dataset","schema","view","listener","l","run","row","idx","id","rowId","index","slowIndex","r","slowRow","height","next","entries","changed","key","found","pendingRow","colType","colKey","c","baseReadonly","delta","cellStyle","readonlyFromStyle","disabledAllowed","disabled","readonly","isFormulaCol","committed","bumpVersion","prev","rawVal","current","uniqueCols","val","p","rowData","forcedId","clamped","removed","colIndex","rowIndex","exclude","includeSort","filters","f","vf","opf","columnDiagnosticsEntries","k","x","sorts","s","filter","valueKey","colKeyStr","diag","errors","warnings","marker","diagEntries","filtered","ok","sort","sortCol","dir","withKeys","blank","baseIndex","compare","as","bs","cached","rows","indexById","cacheKey","empty","map","hasBlanks","label","keys","sep","merged","version","data","e","fn","res","rowRes","applyDelta","base","diagnostic","forceErrorText","colCacheKey","cellFn","ra","rb","ca","cb","validation","level","message","msg","joined","valueToRows","norm","list","rowIds","display","rowList","style","updater","DAY_MS","safeParseDate","safeParseTime","toRawValue","raw","floored","HEADER_HEIGHT_PX","ROW_HEADER_WIDTH_PX","DEFAULT_ROW_HEIGHT_PX","CELL_PADDING_X_PX","CELL_PADDING_TOP_PX","CELL_PADDING_BOTTOM_PX","getColumnWidths","fallbackWidth","extraByType","extra","columnFormatToStyle","dec","mergeStyle","override","resolveCellStyles","dataModel","columnStyle","conditional","resolved","styleToCssText","css","resolveButtonAction","command","commandfor","getButtonLabel","resolveLinkAction","href","target","getLinkLabel","normalizeNumericInput","text","parsePrefixedBaseInteger","m","sign","prefix","digits","radix","validRe","n","parseNumericText","rawText","baseParsed","coerceNumericForColumn","type","formatIntegerWithPrefix","abs","formatNumberForEdit","scale"],"mappings":"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"}
|