@vueye-table/core 3.0.0-alpha.8 → 3.0.0-alpha.9
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.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["isRecord"],"sources":["../src/humanize.ts","../src/issues.ts","../src/path.ts","../src/column.ts","../src/delimited.ts","../src/grid.ts","../src/undo-stack.ts","../src/virtualizer.ts","../src/infer.ts","../src/pipeline.ts","../src/row.ts","../src/state.ts","../src/validation.ts","../src/edit-validation.ts","../src/pending-changes.ts","../src/row-list.ts","../src/stream.ts","../src/tree.ts","../src/table.ts"],"sourcesContent":["/**\n * Turn a column id into a readable header: `\"name.first_name\"` becomes `\"Name first name\"` and\n * `\"createdAt\"` becomes `\"Created at\"`.\n */\nexport function humanize(id: string): string {\n const words = id\n .replace(/([a-z0-9])([A-Z])/gu, \"$1 $2\")\n .split(/[\\s._-]+/u)\n .filter((word) => word.length > 0)\n .map((word) => word.toLowerCase());\n const sentence = words.join(\" \");\n return sentence.charAt(0).toUpperCase() + sentence.slice(1);\n}\n","import type { RowKey } from \"./state\";\n\n/** Every problem the engine can report. The union grows in minor versions. */\nexport type TableIssueCode =\n | \"stream_error\"\n | \"invalid_stream_option\"\n | \"ingestion_conflict\"\n | \"invalid_ingestion\"\n | \"duplicate_row_key\"\n | \"unknown_column\"\n | \"invalid_page_size\"\n | \"unknown_row\"\n | \"read_only_cell\"\n | \"invalid_value\"\n | \"validation_failed\"\n | \"stale_draft\"\n | \"invalid_row_operation\"\n | \"invalid_expanded\"\n | \"unsafe_path\"\n | \"paste_truncated\"\n | \"invalid_paste_limit\"\n | \"invalid_virtual_option\"\n | \"invalid_virtual_size\"\n | \"invalid_virtual_viewport\"\n | \"duplicate_virtual_key\"\n | \"tree_cycle\"\n | \"tree_depth_exceeded\"\n | \"tree_orphan\"\n | \"tree_duplicate_key\"\n | \"tree_load_error\"\n | \"invalid_tree_option\";\n\n/**\n * A problem the engine recovered from. Invalid input is never dropped silently: the engine falls\n * back to something safe and reports what it did here.\n */\nexport interface TableIssue {\n readonly code: TableIssueCode;\n readonly message: string;\n readonly column?: string | undefined;\n readonly rowKey?: RowKey | undefined;\n readonly validationCode?: string | undefined;\n}\n\nexport function issue(\n code: TableIssueCode,\n message: string,\n details: {\n readonly column?: string | undefined;\n readonly rowKey?: RowKey | undefined;\n readonly validationCode?: string | undefined;\n } = {},\n): TableIssue {\n return Object.freeze({ code, message, ...details });\n}\n","/**\n * Dotted property paths.\n *\n * A column addresses nested data with a path such as `\"address.city\"`. The types below give every\n * such path its value type, and the functions read and write through a path without mutating.\n */\n\nimport { issue, type TableIssue } from \"./issues\";\n\ntype Leaf =\n | string\n | number\n | boolean\n | bigint\n | symbol\n | null\n | undefined\n | Date\n | readonly unknown[]\n | ((...args: never[]) => unknown);\n\ntype Depth = [never, 0, 1, 2, 3];\n\n/** Every dotted path into `T`, four levels deep. Arrays, dates, and functions are leaves. */\nexport type DeepKeys<T, TDepth extends number = 4> = [TDepth] extends [never]\n ? never\n : T extends Leaf\n ? never\n : {\n [K in keyof T & string]:\n | K\n | (NonNullable<T[K]> extends Leaf\n ? never\n : `${K}.${DeepKeys<NonNullable<T[K]>, Depth[TDepth]>}`);\n }[keyof T & string];\n\n/** The value found at `TPath` in `T`. A nullable step makes the result possibly `undefined`. */\nexport type PathValue<T, TPath extends string> = TPath extends `${infer THead}.${infer TRest}`\n ? THead extends keyof T\n ? PathValue<NonNullable<T[THead]>, TRest> | (undefined extends T[THead] ? undefined : never)\n : undefined\n : TPath extends keyof T\n ? T[TPath]\n : undefined;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Whether every path segment can be read or written without addressing a prototype. */\nexport function isSafePath(path: string): boolean {\n return path\n .split(\".\")\n .every(\n (segment) => segment !== \"__proto__\" && segment !== \"constructor\" && segment !== \"prototype\",\n );\n}\n\n/** Read the value at a dotted path, or `undefined` when a step is missing. */\nexport function getPath(source: unknown, path: string): unknown {\n if (!isSafePath(path)) {\n return undefined;\n }\n let current: unknown = source;\n for (const segment of path.split(\".\")) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\n/**\n * Return a copy of `source` with `value` at `path`. Only the objects along the path are copied;\n * everything else is shared. Missing steps are created as plain objects. Unsafe paths return\n * `source` unchanged and report an `unsafe_path` issue through `onIssue`, when supplied.\n */\nexport function setPath<T>(\n source: T,\n path: string,\n value: unknown,\n onIssue?: (problem: TableIssue) => void,\n): T {\n if (!isSafePath(path)) {\n onIssue?.(\n issue(\"unsafe_path\", `The path \"${path}\" addresses a prototype and cannot be written.`, {\n column: path,\n }),\n );\n return source;\n }\n const [head, ...rest] = path.split(\".\");\n const base: Record<string, unknown> = isRecord(source) ? { ...source } : {};\n if (head === undefined) {\n return source;\n }\n base[head] =\n rest.length === 0\n ? value\n : setPath(Object.hasOwn(base, head) ? base[head] : undefined, rest.join(\".\"), value);\n return base as T;\n}\n","import { humanize } from \"./humanize\";\nimport { getPath, isSafePath, setPath, type DeepKeys, type PathValue } from \"./path\";\nimport type { EditorSpec, Validator } from \"./validation\";\n\nexport type ColumnAlign = \"start\" | \"center\" | \"end\";\n\n/** How typed or pasted text becomes a value when a column has no `parse`. */\nexport type ColumnType = \"text\" | \"number\" | \"boolean\" | \"date\";\n\n/** A range filter value, inclusive at both ends. Either end may be left open. */\nexport interface RangeFilter {\n readonly min?: number | string | Date | undefined;\n readonly max?: number | string | Date | undefined;\n}\n\n/** Options shared by path columns and computed columns. */\nexport interface ColumnOptions<TRow, TValue> {\n /** Header text. Defaults to the id made readable: `\"createdAt\"` becomes `\"Created at\"`. */\n readonly header?: string | undefined;\n readonly align?: ColumnAlign | undefined;\n /** Width in pixels. */\n readonly width?: number | undefined;\n readonly minWidth?: number | undefined;\n /** Whether a user may sort by this column. Defaults to `true`. */\n readonly sortable?: boolean | undefined;\n /** Whether the free-text search looks at this column. Defaults to `true`. */\n readonly searchable?: boolean | undefined;\n /** Hidden until a user shows it. */\n readonly hidden?: boolean | undefined;\n /**\n * How text becomes a value. Defaults to the type of the cell's current value, or of another\n * row's value when the cell is empty.\n */\n readonly type?: ColumnType | undefined;\n /** Whether cells of this column accept edits. A function decides per row. */\n readonly editable?: boolean | ((row: TRow) => boolean) | undefined;\n /** Order two values; the engine flips the sign for descending sorts. */\n readonly compare?: ((left: TValue, right: TValue) => number) | undefined;\n /** Decide whether a row passes this column's filter value. */\n readonly filter?: ((value: TValue, filterValue: unknown, row: TRow) => boolean) | undefined;\n /** Turn a value into the text a cell shows, searches, copies, and exports. */\n readonly format?: ((value: TValue, row: TRow) => string) | undefined;\n /**\n * Turn typed or pasted text into a value. Throw to reject the input. Defaults to reading the\n * column's `type`.\n */\n readonly parse?: ((input: string, row: TRow) => TValue) | undefined;\n readonly validate?: Validator<TValue, TRow> | undefined;\n /** Serializable editor hints. Core enforces their constraints for every write. */\n readonly editor?: EditorSpec | undefined;\n /** Free-form data for renderers. The engine never reads it. */\n readonly meta?: Readonly<Record<string, unknown>> | undefined;\n}\n\n/** A column that reads `row[id]`, following dots into nested objects. */\nexport interface PathColumnDef<TRow, TPath extends string> extends ColumnOptions<\n TRow,\n PathValue<TRow, TPath>\n> {\n readonly id: TPath;\n readonly accessor?: undefined;\n readonly setValue?: undefined;\n}\n\n/** A column whose value is computed from the row. It is editable only with `setValue`. */\nexport interface ComputedColumnDef<TRow, TValue = unknown> extends ColumnOptions<TRow, TValue> {\n readonly id: string;\n readonly accessor: (row: TRow) => TValue;\n /** Return a copy of `row` carrying `value`. Without it the column is read-only. */\n readonly setValue?: ((row: TRow, value: TValue) => TRow) | undefined;\n}\n\n/**\n * One column definition. A path column is discriminated by its literal id, so `format`,\n * `compare`, and `parse` receive the value type found at that path.\n */\nexport type ColumnDef<TRow> =\n | {\n [TPath in DeepKeys<TRow>]: PathColumnDef<TRow, TPath>;\n }[DeepKeys<TRow>]\n | ComputedColumnDef<TRow, any>;\n\n/**\n * A column definition for any row type, for props and containers that accept every table.\n */\nexport type AnyColumnDef = ColumnDef<any>;\n\n/** Declare columns for a row type with full inference, outside a table. */\nexport function defineColumns<TRow>(\n columns: readonly ColumnDef<TRow>[],\n): readonly ColumnDef<TRow>[] {\n return Object.freeze([...columns]);\n}\n\n/**\n * A column resolved against its defaults. Renderers read these; they never read definitions.\n */\nexport interface TableColumn<TRow> {\n readonly id: string;\n readonly header: string;\n readonly align: ColumnAlign;\n readonly width: number | undefined;\n readonly minWidth: number | undefined;\n readonly sortable: boolean;\n readonly searchable: boolean;\n readonly initiallyHidden: boolean;\n readonly meta: Readonly<Record<string, unknown>>;\n readonly definition: ColumnDef<TRow>;\n getValue(row: TRow): unknown;\n format(value: unknown, row: TRow): string;\n compare(left: unknown, right: unknown): number;\n matches(value: unknown, filterValue: unknown, row: TRow): boolean;\n isEditable(row: TRow): boolean;\n /**\n * Parse text into a value, or report why it could not be read. `sample` is a value from another\n * row, used to tell the column's type when this cell is empty.\n */\n parse(input: string, row: TRow, sample?: unknown): ParseResult;\n /** Return a copy of `row` carrying `value`, or `undefined` for a read-only column. */\n setValue(row: TRow, value: unknown): TRow | undefined;\n}\n\n/** The outcome of reading text into a cell value. */\nexport type ParseResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly message: string };\n\nconst collator = new Intl.Collator(undefined, { numeric: true, sensitivity: \"base\" });\n\nfunction isEmpty(value: unknown): boolean {\n return value === null || value === undefined || value === \"\";\n}\n\n/** Order any two values: empty last, then numbers, dates, booleans, and text naturally. */\nexport function compareValues(left: unknown, right: unknown): number {\n const leftEmpty = isEmpty(left);\n const rightEmpty = isEmpty(right);\n if (leftEmpty || rightEmpty) {\n return leftEmpty === rightEmpty ? 0 : leftEmpty ? 1 : -1;\n }\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n if (typeof left === \"bigint\" && typeof right === \"bigint\") {\n return left < right ? -1 : left > right ? 1 : 0;\n }\n if (left instanceof Date && right instanceof Date) {\n return left.getTime() - right.getTime();\n }\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) - Number(right);\n }\n return collator.compare(formatValue(left), formatValue(right));\n}\n\n/**\n * Text for a value: empty for `null` and `undefined`, ISO for dates, comma-joined for arrays, and\n * JSON for other objects. The result never depends on the runtime's locale, so server and client\n * render the same text.\n */\nexport function formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? \"\" : value.toISOString();\n }\n if (Array.isArray(value)) {\n return value.map(formatValue).join(\", \");\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n switch (typeof value) {\n case \"string\":\n return value;\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return String(value);\n case \"symbol\":\n return value.toString();\n default:\n return \"\";\n }\n}\n\nfunction toComparable(value: unknown): number | string | undefined {\n if (value instanceof Date) {\n const time = value.getTime();\n return Number.isNaN(time) ? undefined : time;\n }\n if (typeof value === \"number\") {\n return Number.isNaN(value) ? undefined : value;\n }\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Read a range bound in the kind of the value it is compared with, so a bound typed into a text\n * box (`\"10\"`, `\"2024-01-31\"`) compares with numbers as a number and with dates as a time. An\n * empty or unreadable bound leaves that end of the range open.\n */\nfunction toBound(bound: unknown, value: unknown): number | string | undefined {\n if (isEmpty(bound)) {\n return undefined;\n }\n if (typeof bound === \"string\" && typeof value === \"number\") {\n const number = Number(bound.trim());\n return bound.trim() === \"\" || Number.isNaN(number) ? undefined : number;\n }\n if (typeof bound === \"string\" && value instanceof Date) {\n return toComparable(new Date(bound));\n }\n if (bound instanceof Date && typeof value === \"string\") {\n // Compare text dates at their own precision: \"2024-01-31\" against the bound's day.\n return Number.isNaN(bound.getTime()) ? undefined : bound.toISOString().slice(0, value.length);\n }\n return toComparable(bound);\n}\n\nfunction isRangeFilter(value: unknown): value is RangeFilter {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n (\"min\" in value || \"max\" in value)\n );\n}\n\n/**\n * The default column filter:\n *\n * - an empty filter value (`undefined`, `null`, `\"\"`, `[]`) lets every row through;\n * - an array keeps rows whose value is one of its items;\n * - `{ min, max }` keeps values inside the inclusive range; a bound given as text is read as a\n * number or a date when the value is one, and an empty bound leaves that end open;\n * - text keeps rows whose shown text contains it, ignoring case;\n * - anything else keeps rows whose value is identical.\n */\nexport function matchesFilter(value: unknown, filterValue: unknown, display: string): boolean {\n if (isEmpty(filterValue) || (Array.isArray(filterValue) && filterValue.length === 0)) {\n return true;\n }\n if (Array.isArray(filterValue)) {\n return filterValue.some((item) => Object.is(item, value) || compareValues(item, value) === 0);\n }\n if (isRangeFilter(filterValue)) {\n const min = toBound(filterValue.min, value);\n const max = toBound(filterValue.max, value);\n if (min === undefined && max === undefined) {\n return true;\n }\n const comparable = toComparable(value);\n if (comparable === undefined) {\n return false;\n }\n return (min === undefined || comparable >= min) && (max === undefined || comparable <= max);\n }\n if (typeof filterValue === \"string\") {\n return display.toLowerCase().includes(filterValue.toLowerCase());\n }\n return Object.is(value, filterValue);\n}\n\nconst TRUE_WORDS = new Set([\"true\", \"1\", \"yes\", \"y\", \"on\"]);\nconst FALSE_WORDS = new Set([\"false\", \"0\", \"no\", \"n\", \"off\"]);\n\n/** The column type a value suggests, or `undefined` for an empty value. */\nexport function typeOf(value: unknown): ColumnType | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"number\") {\n return \"number\";\n }\n if (typeof value === \"boolean\") {\n return \"boolean\";\n }\n return value instanceof Date ? \"date\" : \"text\";\n}\n\n/** Read text as a column type. Empty text is `null` for every type but text. */\nexport function parseAs(input: string, type: ColumnType): ParseResult {\n const text = input.trim();\n if (type === \"text\") {\n return { ok: true, value: input };\n }\n if (text === \"\") {\n return { ok: true, value: null };\n }\n if (type === \"number\") {\n const value = Number(text);\n return Number.isFinite(value)\n ? { ok: true, value }\n : { ok: false, message: `\"${input}\" is not a number` };\n }\n if (type === \"boolean\") {\n const word = text.toLowerCase();\n if (TRUE_WORDS.has(word)) {\n return { ok: true, value: true };\n }\n if (FALSE_WORDS.has(word)) {\n return { ok: true, value: false };\n }\n return { ok: false, message: `\"${input}\" is not a yes or no value` };\n }\n const value = new Date(text);\n return Number.isNaN(value.getTime())\n ? { ok: false, message: `\"${input}\" is not a date` }\n : { ok: true, value };\n}\n\n/** Resolve a definition against its defaults. */\nexport function resolveColumn<TRow>(definition: ColumnDef<TRow>): TableColumn<TRow> {\n // Both branches of the union share these members; the value type is erased at runtime.\n const def = definition as ComputedColumnDef<TRow> | PathColumnDef<TRow, string>;\n const { accessor } = def;\n const safe = isSafePath(def.id);\n const getValue: (row: TRow) => unknown = safe\n ? (accessor ?? ((row) => getPath(row, def.id)))\n : () => undefined;\n const format = def.format ?? ((value: unknown) => formatValue(value));\n const compare = def.compare ?? compareValues;\n const customFilter = def.filter;\n const customParse = def.parse;\n const editable = def.editable ?? false;\n const customSetValue = def.setValue;\n const canWrite = safe && (accessor === undefined || customSetValue !== undefined);\n\n return Object.freeze({\n id: def.id,\n header: def.header ?? humanize(def.id),\n align: def.align ?? \"start\",\n width: def.width,\n minWidth: def.minWidth,\n sortable: def.sortable ?? true,\n searchable: def.searchable ?? true,\n initiallyHidden: def.hidden ?? false,\n meta: Object.freeze({ ...def.meta }),\n definition,\n getValue,\n format: (value: unknown, row: TRow): string => format(value as never, row),\n compare: (left: unknown, right: unknown): number => compare(left as never, right as never),\n matches(value: unknown, filterValue: unknown, row: TRow): boolean {\n return customFilter\n ? customFilter(value as never, filterValue, row)\n : matchesFilter(value, filterValue, format(value as never, row));\n },\n isEditable(row: TRow): boolean {\n if (!canWrite) {\n return false;\n }\n return typeof editable === \"function\" ? editable(row) : editable;\n },\n parse(input: string, row: TRow, sample?: unknown): ParseResult {\n if (customParse) {\n try {\n return { ok: true, value: customParse(input, row) };\n } catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n }\n return parseAs(input, def.type ?? typeOf(getValue(row)) ?? typeOf(sample) ?? \"text\");\n },\n setValue(row: TRow, value: unknown): TRow | undefined {\n if (!safe) {\n return undefined;\n }\n if (customSetValue) {\n return customSetValue(row, value);\n }\n return accessor === undefined ? setPath(row, def.id, value) : undefined;\n },\n });\n}\n","/**\n * Delimited text: tab-separated for the clipboard, comma-separated for export.\n *\n * A field is quoted when it holds the delimiter, a quote, or a line break, and quotes inside it\n * are doubled. This is what spreadsheet applications write and read.\n */\n\nfunction quote(field: string, delimiter: string): string {\n return field.includes(delimiter) ||\n field.includes('\"') ||\n field.includes(\"\\n\") ||\n field.includes(\"\\r\")\n ? `\"${field.replaceAll('\"', '\"\"')}\"`\n : field;\n}\n\n/** Escape formula-like display text; a finite number formatted as a number stays numeric. */\nexport function escapeFormula(text: string, value?: unknown): string {\n const numeric =\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/u.test(text);\n return !numeric && /^[=+\\-@\\t\\r\\n=+-@]/u.test(text) ? \"'\" + text : text;\n}\n\nexport interface DelimitedLimits {\n readonly maxRows: number;\n readonly maxColumns: number;\n readonly maxCells: number;\n readonly maxLength: number;\n}\n\nexport interface DelimitedResult {\n readonly rows: string[][];\n readonly truncated: boolean;\n}\n\n/** Write a matrix of text as delimited lines joined with `\\n`. */\nexport function toDelimited(matrix: readonly (readonly string[])[], delimiter = \"\\t\"): string {\n return matrix\n .map((line) => line.map((field) => quote(field, delimiter)).join(delimiter))\n .join(\"\\n\");\n}\n\n/**\n * Read delimited text into a matrix. Accepts `\\n` and `\\r\\n`, quoted fields with doubled quotes\n * and embedded line breaks, and ignores one trailing line break.\n */\nexport function parseDelimited(text: string, delimiter = \"\\t\"): string[][] {\n return readDelimited(\n text,\n {\n maxRows: Infinity,\n maxColumns: Infinity,\n maxCells: Infinity,\n maxLength: Infinity,\n },\n delimiter,\n ).rows;\n}\n\n/** Read complete fields within a grid and work budget, without materializing discarded fields. */\nexport function readDelimited(\n text: string,\n limits: DelimitedLimits,\n delimiter = \"\\t\",\n): DelimitedResult {\n const rows: string[][] = [];\n if (limits.maxRows === 0 || limits.maxColumns === 0) {\n return { rows, truncated: text.length > 0 };\n }\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n let started = false;\n let index = 0;\n let column = 0;\n let cells = 0;\n let truncated = false;\n const end = Math.min(text.length, limits.maxLength);\n\n const endField = (): void => {\n if (column < limits.maxColumns) {\n row.push(field);\n } else {\n truncated = true;\n }\n column += 1;\n cells += 1;\n field = \"\";\n started = false;\n };\n const append = (char: string): void => {\n if (column < limits.maxColumns) {\n field += char;\n }\n };\n\n while (index < end) {\n const char = text.charAt(index);\n if (quoted) {\n if (char === '\"') {\n if (index + 1 < end && text.charAt(index + 1) === '\"') {\n append('\"');\n index += 1;\n } else {\n quoted = false;\n }\n } else {\n append(char);\n }\n } else if (char === '\"' && !started) {\n quoted = true;\n } else if (char === delimiter) {\n endField();\n index += 1;\n if (\n cells >= limits.maxCells ||\n (rows.length + 1 >= limits.maxRows && column >= limits.maxColumns)\n ) {\n rows.push(row);\n return { rows, truncated: true };\n }\n continue;\n } else if (char === \"\\n\" || char === \"\\r\") {\n if (char === \"\\r\" && index + 1 < end && text.charAt(index + 1) === \"\\n\") {\n index += 1;\n }\n endField();\n rows.push(row);\n row = [];\n column = 0;\n index += 1;\n if (cells >= limits.maxCells || rows.length >= limits.maxRows) {\n return { rows, truncated: truncated || index < text.length };\n }\n continue;\n } else {\n append(char);\n }\n started = true;\n index += 1;\n }\n\n if (end < text.length) {\n // A field cut short by the character budget must never become a different cell value.\n if (row.length > 0) {\n rows.push(row);\n }\n return { rows, truncated: true };\n }\n if (started || column > 0) {\n endField();\n rows.push(row);\n }\n return { rows, truncated };\n}\n","/**\n * Spreadsheet addressing and selection.\n *\n * A cell is addressed by its position in what is shown: the row index on the current page and the\n * column index among visible columns. A selection is an anchor, where it started, and a focus,\n * where it is now; the rectangle between them is the selected range.\n */\n\nexport interface CellPosition {\n readonly row: number;\n readonly column: number;\n}\n\nexport interface CellRange {\n readonly top: number;\n readonly left: number;\n readonly bottom: number;\n readonly right: number;\n}\n\nexport interface GridSelection {\n readonly anchor: CellPosition;\n readonly focus: CellPosition;\n}\n\n/** The size of the addressable grid. */\nexport interface GridBounds {\n readonly rows: number;\n readonly columns: number;\n}\n\nexport type GridDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\nexport interface MoveOptions {\n /** Keep the anchor and move only the focus, growing or shrinking the range. */\n readonly extend?: boolean | undefined;\n /** Jump to the edge of the grid in that direction. */\n readonly toEdge?: boolean | undefined;\n}\n\nfunction clamp(value: number, max: number): number {\n return Math.min(Math.max(0, value), Math.max(0, max - 1));\n}\n\nexport function clampPosition(position: CellPosition, bounds: GridBounds): CellPosition {\n return { row: clamp(position.row, bounds.rows), column: clamp(position.column, bounds.columns) };\n}\n\n/** A selection of one cell. */\nexport function selectCell(position: CellPosition): GridSelection {\n return { anchor: position, focus: position };\n}\n\n/** Move the focus one step, or to the edge, staying inside the bounds. */\nexport function moveSelection(\n selection: GridSelection,\n direction: GridDirection,\n bounds: GridBounds,\n options: MoveOptions = {},\n): GridSelection {\n const { row, column } = selection.focus;\n const far = options.toEdge === true;\n const next: CellPosition = clampPosition(\n {\n row:\n direction === \"up\"\n ? far\n ? 0\n : row - 1\n : direction === \"down\"\n ? far\n ? bounds.rows - 1\n : row + 1\n : row,\n column:\n direction === \"left\"\n ? far\n ? 0\n : column - 1\n : direction === \"right\"\n ? far\n ? bounds.columns - 1\n : column + 1\n : column,\n },\n bounds,\n );\n return options.extend === true\n ? { anchor: selection.anchor, focus: next }\n : { anchor: next, focus: next };\n}\n\n/** The rectangle a selection covers. */\nexport function selectionRange(selection: GridSelection): CellRange {\n return {\n top: Math.min(selection.anchor.row, selection.focus.row),\n left: Math.min(selection.anchor.column, selection.focus.column),\n bottom: Math.max(selection.anchor.row, selection.focus.row),\n right: Math.max(selection.anchor.column, selection.focus.column),\n };\n}\n\nexport function rangeContains(range: CellRange, position: CellPosition): boolean {\n return (\n position.row >= range.top &&\n position.row <= range.bottom &&\n position.column >= range.left &&\n position.column <= range.right\n );\n}\n\n/** `0` is `\"A\"`, `25` is `\"Z\"`, `26` is `\"AA\"`. */\nexport function columnLabel(index: number): string {\n let label = \"\";\n let rest = index + 1;\n while (rest > 0) {\n const remainder = (rest - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n rest = Math.floor((rest - 1) / 26);\n }\n return label;\n}\n\n/** `{ row: 2, column: 1 }` is `\"B3\"`. */\nexport function toA1(position: CellPosition): string {\n return `${columnLabel(position.column)}${position.row + 1}`;\n}\n\n/** `\"B3\"` is `{ row: 2, column: 1 }`. Returns `undefined` for anything else. */\nexport function fromA1(reference: string): CellPosition | undefined {\n const match = /^([A-Z]+)([1-9]\\d*)$/u.exec(reference.trim().toUpperCase());\n if (!match?.[1] || !match[2]) {\n return undefined;\n }\n let column = 0;\n for (const char of match[1]) {\n column = column * 26 + (char.charCodeAt(0) - 64);\n }\n return { row: Number(match[2]) - 1, column: column - 1 };\n}\n\n/** The keys of a keyboard event that grid navigation reads. */\nexport interface GridKey {\n readonly key: string;\n readonly shiftKey?: boolean | undefined;\n readonly ctrlKey?: boolean | undefined;\n readonly metaKey?: boolean | undefined;\n readonly altKey?: boolean | undefined;\n}\n\n/** What a key press asks a grid to do while no cell is being edited. */\nexport type GridCommand =\n | { readonly type: \"move\"; readonly direction: GridDirection; readonly options: MoveOptions }\n | { readonly type: \"edit\"; readonly initial?: string | undefined }\n | { readonly type: \"clear\" }\n | { readonly type: \"selectAll\" }\n | { readonly type: \"undo\" }\n | { readonly type: \"redo\" }\n | { readonly type: \"cancel\" };\n\nconst ARROWS: Readonly<Record<string, GridDirection>> = {\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n ArrowLeft: \"left\",\n ArrowRight: \"right\",\n};\n\n/**\n * Map a key press to a grid command, spreadsheet style: arrows move (Shift extends, Ctrl or Cmd\n * jumps to the edge), Tab moves across, Home and End reach the row's ends, Enter or F2 edit,\n * a printable character starts editing with that character, Delete and Backspace clear, Escape\n * collapses the selection, and Ctrl or Cmd with A, Z, Y select all, undo, and redo.\n */\nexport function gridCommand(event: GridKey): GridCommand | undefined {\n const mod = event.ctrlKey === true || event.metaKey === true;\n const shift = event.shiftKey === true;\n const direction = ARROWS[event.key];\n if (direction) {\n return { type: \"move\", direction, options: { extend: shift, toEdge: mod } };\n }\n switch (event.key) {\n case \"Tab\":\n return { type: \"move\", direction: shift ? \"left\" : \"right\", options: {} };\n case \"Home\":\n case \"End\":\n return {\n type: \"move\",\n direction: event.key === \"Home\" ? \"left\" : \"right\",\n options: { extend: shift, toEdge: true },\n };\n case \"Enter\":\n case \"F2\":\n return { type: \"edit\" };\n case \"Delete\":\n case \"Backspace\":\n return { type: \"clear\" };\n case \"Escape\":\n return { type: \"cancel\" };\n default:\n break;\n }\n if (mod) {\n const key = event.key.toLowerCase();\n if (key === \"a\") {\n return { type: \"selectAll\" };\n }\n if (key === \"z\") {\n return shift ? { type: \"redo\" } : { type: \"undo\" };\n }\n if (key === \"y\") {\n return { type: \"redo\" };\n }\n return undefined;\n }\n if (event.key.length === 1 && event.altKey !== true) {\n return { type: \"edit\", initial: event.key };\n }\n return undefined;\n}\n","/**\n * An undo stack of batches. Recording a batch clears whatever could be redone, and the stack\n * keeps at most `limit` batches, dropping the oldest.\n */\nexport interface UndoStack<TEntry> {\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n record(entry: TEntry): void;\n /** Take the most recent batch to undo, if any. */\n undo(): TEntry | undefined;\n /** Take the most recently undone batch to redo, if any. */\n redo(): TEntry | undefined;\n clear(): void;\n /** Reconcile retained user batches after source ingestion. Undefined drops a batch. */\n transform(map: (entry: TEntry) => TEntry | undefined): void;\n}\n\nexport function createUndoStack<TEntry>(limit = 100): UndoStack<TEntry> {\n const past: TEntry[] = [];\n const future: TEntry[] = [];\n return {\n get canUndo(): boolean {\n return past.length > 0;\n },\n get canRedo(): boolean {\n return future.length > 0;\n },\n record(entry: TEntry): void {\n past.push(entry);\n if (past.length > limit) {\n past.shift();\n }\n future.length = 0;\n },\n undo(): TEntry | undefined {\n const entry = past.pop();\n if (entry !== undefined) {\n future.push(entry);\n }\n return entry;\n },\n redo(): TEntry | undefined {\n const entry = future.pop();\n if (entry !== undefined) {\n past.push(entry);\n }\n return entry;\n },\n clear(): void {\n past.length = 0;\n future.length = 0;\n },\n transform(map): void {\n const update = (entries: TEntry[]): TEntry[] =>\n entries.flatMap((entry) => {\n const value = map(entry);\n return value === undefined ? [] : [value];\n });\n const nextPast = update(past);\n const nextFuture = update(future);\n past.splice(0, past.length, ...nextPast);\n future.splice(0, future.length, ...nextFuture);\n },\n };\n}\n","import { issue, type TableIssue, type TableIssueCode } from \"./issues\";\nimport type { RowKey } from \"./state\";\n\nexport type VirtualAlign = \"start\" | \"center\" | \"end\" | \"auto\";\n\nexport interface VirtualizerOptions {\n readonly count: number;\n readonly estimateSize: number | ((index: number) => number);\n /** Extra items on each side. Defaults to 5. */\n readonly overscan?: number | undefined;\n /** Stable, unique identities preserve measurements across reorder and filtering. */\n readonly getKey?: ((index: number) => RowKey) | undefined;\n readonly onIssue?: ((problem: TableIssue) => void) | undefined;\n}\n\nexport interface VirtualItem {\n readonly index: number;\n readonly key: RowKey;\n readonly start: number;\n readonly size: number;\n}\n\nexport interface VirtualWindow {\n readonly items: readonly VirtualItem[];\n readonly totalSize: number;\n readonly paddingStart: number;\n readonly paddingEnd: number;\n /** Inclusive indices; an empty result uses 0 and -1. */\n readonly startIndex: number;\n readonly endIndex: number;\n /** Clamped viewport values, excluding overscan. */\n readonly offset: number;\n readonly viewportSize: number;\n readonly issues: readonly TableIssue[];\n}\n\nexport interface Virtualizer {\n setOptions(options: VirtualizerOptions): void;\n setViewport(offset: number, size: number): void;\n measure(key: RowKey, size: number): void;\n getWindow(): VirtualWindow;\n /** Read an item's layout without moving the viewport; out-of-range indices return undefined. */\n getItem(index: number): VirtualItem | undefined;\n getOffsetForIndex(index: number, align?: VirtualAlign): number;\n subscribe(listener: (view: VirtualWindow) => void): () => void;\n}\n\nconst FALLBACK_SIZE = 40;\n\n/** Layout arithmetic for either axis. All viewport values and measurements come from the caller. */\nexport function createVirtualizer(initialOptions: VirtualizerOptions): Virtualizer {\n let options = initialOptions;\n let count = 0;\n let overscan = 5;\n let fixedSize: number | undefined;\n let keys: RowKey[] = [];\n let byKey = new Map<RowKey, number>();\n let sizes: number[] = [];\n // Retain only the prefix before the first changed item; extend it lazily on the next lookup.\n let prefix = [0];\n let offset = 0;\n let viewportSize = 0;\n let cached: VirtualWindow | undefined;\n const measured = new Map<RowKey, number>();\n const problems = new Map<TableIssueCode, TableIssue>();\n const listeners = new Set<(view: VirtualWindow) => void>();\n\n function recover(code: TableIssueCode, message: string): void {\n // One representative issue per code keeps diagnostics bounded even for many bad items.\n if (!problems.has(code)) {\n const problem = issue(code, message);\n problems.set(code, problem);\n options.onIssue?.(problem);\n cached = undefined;\n }\n }\n\n function validSize(value: number): number {\n if (Number.isFinite(value) && value > 0) return value;\n recover(\n \"invalid_virtual_size\",\n `Item size ${String(value)} is not positive and finite; 40 is used.`,\n );\n return FALLBACK_SIZE;\n }\n\n function configure(next: VirtualizerOptions): void {\n options = next;\n problems.clear();\n count = Number.isSafeInteger(next.count) && next.count >= 0 ? next.count : 0;\n if (count !== next.count) {\n recover(\n \"invalid_virtual_option\",\n \"Virtual item count must be a non-negative safe integer; 0 is used.\",\n );\n }\n const requestedOverscan = next.overscan ?? 5;\n overscan =\n Number.isSafeInteger(requestedOverscan) && requestedOverscan >= 0 ? requestedOverscan : 5;\n if (overscan !== requestedOverscan) {\n recover(\"invalid_virtual_option\", \"Overscan must be a non-negative safe integer; 5 is used.\");\n }\n const estimate =\n typeof next.estimateSize === \"number\" ? validSize(next.estimateSize) : undefined;\n const nextKeys: RowKey[] = [];\n const nextSizes: number[] = [];\n const nextByKey = new Map<RowKey, number>();\n let firstChanged = count;\n let uniform = estimate !== undefined;\n for (let index = 0; index < count; index += 1) {\n let key = next.getKey ? next.getKey(index) : index;\n if (!(typeof key === \"string\" || (typeof key === \"number\" && Number.isFinite(key)))) {\n recover(\"invalid_virtual_option\", `Item ${index} has an invalid key; its index is used.`);\n key = index;\n }\n if (nextByKey.has(key)) {\n recover(\n \"duplicate_virtual_key\",\n `Item ${index} repeats a key; a distinct fallback key is used.`,\n );\n key = JSON.stringify([\"virtual\", index]);\n while (nextByKey.has(key)) key += \":\";\n }\n const size =\n measured.get(key) ??\n estimate ??\n validSize((next.estimateSize as (index: number) => number)(index));\n uniform &&= size === estimate;\n if (keys[index] !== key || sizes[index] !== size)\n firstChanged = Math.min(firstChanged, index);\n nextKeys.push(key);\n nextSizes.push(size);\n nextByKey.set(key, index);\n }\n if (fixedSize !== undefined || uniform) prefix = [0];\n else prefix.length = Math.min(prefix.length, firstChanged + 1);\n keys = nextKeys;\n sizes = nextSizes;\n byKey = nextByKey;\n fixedSize = uniform ? estimate : undefined;\n cached = undefined;\n }\n\n function startOf(index: number): number {\n if (fixedSize !== undefined) return index * fixedSize;\n while (prefix.length <= index) {\n const at = prefix.length - 1;\n prefix.push(prefix[at]! + sizes[at]!);\n }\n return prefix[index]!;\n }\n\n function totalSize(): number {\n return startOf(count);\n }\n\n function indexAt(position: number): number {\n if (fixedSize !== undefined) return Math.min(count - 1, Math.floor(position / fixedSize));\n let low = 0;\n let high = count - 1;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n if (startOf(middle + 1) <= position) low = middle + 1;\n else high = middle;\n }\n return low;\n }\n\n function getWindow(): VirtualWindow {\n if (cached) return cached;\n const total = totalSize();\n const clampedOffset = Math.min(offset, Math.max(0, total - viewportSize));\n let first = 0;\n let last = -1;\n if (count > 0 && viewportSize > 0) {\n first = Math.max(0, indexAt(clampedOffset) - overscan);\n const edge = Math.min(total, clampedOffset + viewportSize);\n let visibleEnd = indexAt(edge);\n if (startOf(visibleEnd) >= edge) visibleEnd -= 1;\n last = Math.min(count - 1, visibleEnd + overscan);\n }\n const items: VirtualItem[] = [];\n for (let index = first; index <= last; index += 1) {\n items.push(\n Object.freeze({ index, key: keys[index]!, start: startOf(index), size: sizes[index]! }),\n );\n }\n const paddingStart = items.length > 0 ? startOf(first) : 0;\n const paddingEnd = items.length > 0 ? Math.max(0, total - startOf(last + 1)) : total;\n cached = Object.freeze({\n items: Object.freeze(items),\n totalSize: total,\n paddingStart,\n paddingEnd,\n startIndex: first,\n endIndex: last,\n offset: clampedOffset,\n viewportSize,\n issues: Object.freeze([...problems.values()]),\n });\n return cached;\n }\n\n function notify(): void {\n cached = undefined;\n if (listeners.size > 0) {\n const view = getWindow();\n for (const listener of listeners) listener(view);\n }\n }\n\n configure(initialOptions);\n return {\n setOptions(next) {\n configure(next);\n notify();\n },\n setViewport(nextOffset, nextSize) {\n const issueCount = problems.size;\n const safeOffset = Number.isFinite(nextOffset) && nextOffset >= 0 ? nextOffset : 0;\n const safeSize = Number.isFinite(nextSize) && nextSize >= 0 ? nextSize : 0;\n if (safeOffset !== nextOffset || safeSize !== nextSize) {\n recover(\n \"invalid_virtual_viewport\",\n \"Viewport offset and size must be non-negative and finite; invalid values use 0.\",\n );\n }\n if (offset === safeOffset && viewportSize === safeSize && problems.size === issueCount)\n return;\n offset = safeOffset;\n viewportSize = safeSize;\n notify();\n },\n measure(key, size) {\n const index = byKey.get(key);\n if (index === undefined) return;\n if (!Number.isFinite(size) || size <= 0) {\n recover(\n \"invalid_virtual_size\",\n \"Measured size must be positive and finite; the previous size is retained.\",\n );\n notify();\n return;\n }\n measured.set(key, size);\n if (sizes[index] === size) return;\n if (fixedSize !== undefined) {\n fixedSize = undefined;\n prefix = [0];\n } else prefix.length = Math.min(prefix.length, index + 1);\n sizes[index] = size;\n notify();\n },\n getWindow,\n getItem(index) {\n return Number.isSafeInteger(index) && index >= 0 && index < count\n ? Object.freeze({ index, key: keys[index]!, start: startOf(index), size: sizes[index]! })\n : undefined;\n },\n getOffsetForIndex(index, align = \"auto\") {\n if (count === 0) return 0;\n if (!Number.isFinite(index) || !Number.isInteger(index)) {\n recover(\n \"invalid_virtual_option\",\n \"Scroll index must be a finite integer; it is clamped to a valid item.\",\n );\n }\n const target = Math.min(\n count - 1,\n Math.max(0, Number.isFinite(index) ? Math.trunc(index) : 0),\n );\n const start = startOf(target);\n const end = start + sizes[target]!;\n const current = getWindow().offset;\n let result = start;\n if (align === \"center\") result = start - (viewportSize - sizes[target]!) / 2;\n else if (align === \"end\") result = end - viewportSize;\n else if (align === \"auto\") {\n result =\n start < current ? start : end > current + viewportSize ? end - viewportSize : current;\n }\n return Math.min(Math.max(0, totalSize() - viewportSize), Math.max(0, result));\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","import type { ColumnDef } from \"./column\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction collect(value: unknown, prefix: string, depth: number, into: Set<string>): void {\n if (!isPlainObject(value)) {\n return;\n }\n for (const [key, child] of Object.entries(value)) {\n const path = prefix === \"\" ? key : `${prefix}.${key}`;\n if (isPlainObject(child) && depth < 4) {\n collect(child, path, depth + 1, into);\n } else {\n into.add(path);\n }\n }\n}\n\n/**\n * Columns for data that has none declared: one path column per leaf of the first `sample` rows,\n * nested objects flattened into dotted paths, in first-seen order.\n */\nexport function inferColumns<TRow>(rows: readonly TRow[], sample = 20): readonly ColumnDef<TRow>[] {\n const paths = new Set<string>();\n for (const row of rows.slice(0, sample)) {\n collect(row, \"\", 1, paths);\n }\n return Object.freeze([...paths].map((id) => ({ id }) as ColumnDef<TRow>));\n}\n","import type { TableColumn } from \"./column\";\nimport type { TableRow } from \"./row\";\nimport type { PaginationState, SortRule } from \"./state\";\n\n/**\n * The row pipeline: filter, then sort, then paginate. Each stage is a pure function, so a table\n * recomputes only the stages whose inputs changed, and a server can run the same stages.\n */\n\n/** Split free text into lowercase terms. */\nfunction searchTerms(search: string): readonly string[] {\n return search\n .toLowerCase()\n .split(/\\s+/u)\n .filter((term) => term.length > 0);\n}\n\n/**\n * Keep rows that pass every column filter and contain every search term in at least one\n * searchable column.\n */\nexport function filterRows<TRow>(\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n search: string,\n filters: Readonly<Record<string, unknown>>,\n): readonly TableRow<TRow>[] {\n const terms = searchTerms(search);\n const byId = new Map(columns.map((column) => [column.id, column]));\n const activeFilters = Object.entries(filters).flatMap(([id, value]) => {\n const column = byId.get(id);\n return column && value !== undefined ? [{ column, value }] : [];\n });\n const searchable = columns.filter((column) => column.searchable);\n\n if (terms.length === 0 && activeFilters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => {\n for (const { column, value } of activeFilters) {\n if (!column.matches(row.getValue(column.id), value, row.original)) {\n return false;\n }\n }\n if (terms.length === 0) {\n return true;\n }\n const haystack = searchable.map((column) => row.getDisplay(column.id).toLowerCase());\n return terms.every((term) => haystack.some((text) => text.includes(term)));\n });\n}\n\n/** Sort rows by each rule in turn. The sort is stable: ties keep their incoming order. */\nexport function sortRows<TRow>(\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n sorting: readonly SortRule[],\n): readonly TableRow<TRow>[] {\n if (!sorting.some((rule) => columns.some((column) => column.id === rule.column))) return rows;\n return rows.toSorted(compareRows(columns, sorting));\n}\n\nexport function compareRows<TRow>(\n columns: readonly TableColumn<TRow>[],\n sorting: readonly SortRule[],\n): (left: TableRow<TRow>, right: TableRow<TRow>) => number {\n const byId = new Map(columns.map((column) => [column.id, column]));\n const rules = sorting.flatMap((rule) => {\n const column = byId.get(rule.column);\n return column ? [{ column, sign: rule.direction === \"desc\" ? -1 : 1 }] : [];\n });\n return (left, right) => {\n for (const { column, sign } of rules) {\n const leftValue = left.getValue(column.id);\n const rightValue = right.getValue(column.id);\n const leftEmpty = leftValue === null || leftValue === undefined || leftValue === \"\";\n const rightEmpty = rightValue === null || rightValue === undefined || rightValue === \"\";\n // Empty values stay last in both directions.\n if (leftEmpty !== rightEmpty) {\n return leftEmpty ? 1 : -1;\n }\n const order = column.compare(leftValue, rightValue) * sign;\n if (order !== 0) {\n return order;\n }\n }\n return 0;\n };\n}\n\n/** Stable merge: an existing row wins a tie against an incoming row. */\nexport function mergeRows<TRow>(\n previous: readonly TableRow<TRow>[],\n incoming: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n sorting: readonly SortRule[],\n): readonly TableRow<TRow>[] {\n const compare = compareRows(columns, sorting);\n const added = sortRows(incoming, columns, sorting);\n const result: TableRow<TRow>[] = [];\n let left = 0;\n let right = 0;\n while (left < previous.length && right < added.length) {\n result.push(compare(previous[left]!, added[right]!) <= 0 ? previous[left++]! : added[right++]!);\n }\n while (left < previous.length) result.push(previous[left++]!);\n while (right < added.length) result.push(added[right++]!);\n return result;\n}\n\n/** The number of pages for a row count. An empty table still has one page. */\nexport function countPages(rowCount: number, pageSize: number): number {\n return Math.max(1, Math.ceil(rowCount / pageSize));\n}\n\n/** Clamp a page into `1..pageCount`. */\nexport function clampPage(page: number, pageCount: number): number {\n return Math.min(Math.max(1, Math.trunc(page) || 1), pageCount);\n}\n\n/** The rows on one page. `pagination.page` must already be clamped. */\nexport function paginateRows<TRow>(\n rows: readonly TableRow<TRow>[],\n pagination: PaginationState,\n): readonly TableRow<TRow>[] {\n const start = (pagination.page - 1) * pagination.pageSize;\n return rows.slice(start, start + pagination.pageSize);\n}\n\n/** A page number, or a gap between page numbers. */\nexport type PageItem =\n | { readonly type: \"page\"; readonly page: number; readonly current: boolean }\n | { readonly type: \"gap\"; readonly key: string };\n\n/**\n * The page buttons to show: always the first and last page, `siblings` pages on each side of the\n * current one, and a gap wherever pages are skipped. A gap never hides a single page.\n */\nexport function paginationItems(\n page: number,\n pageCount: number,\n siblings = 1,\n): readonly PageItem[] {\n const pages = new Set<number>([1, pageCount]);\n for (let offset = -siblings; offset <= siblings; offset += 1) {\n const candidate = page + offset;\n if (candidate >= 1 && candidate <= pageCount) {\n pages.add(candidate);\n }\n }\n const sorted = [...pages].toSorted((left, right) => left - right);\n const items: PageItem[] = [];\n let previous = 0;\n for (const value of sorted) {\n if (value - previous === 2) {\n items.push({ type: \"page\", page: value - 1, current: value - 1 === page });\n } else if (value - previous > 2) {\n items.push({ type: \"gap\", key: `gap-${previous}-${value}` });\n }\n items.push({ type: \"page\", page: value, current: value === page });\n previous = value;\n }\n return items;\n}\n","import type { TableColumn } from \"./column\";\nimport type { TableIssue } from \"./issues\";\nimport type { RowKey } from \"./state\";\nimport type { ChildStatus } from \"./tree\";\n\n/**\n * One row of data as the engine sees it: its key, its position in the source data, and cached\n * access to each column's value and text.\n */\nexport interface TableRow<TRow> {\n readonly key: RowKey;\n /** Position in the data the table was given. */\n readonly index: number;\n readonly original: TRow;\n readonly canExpand: boolean;\n readonly isExpanded: boolean;\n readonly depth: number;\n readonly parentKey: RowKey | undefined;\n readonly childCount: number | undefined;\n readonly childStatus: ChildStatus;\n /** Coverage of this row and its loaded descendants. */\n readonly selection: \"none\" | \"some\" | \"all\";\n readonly isDirty: boolean;\n readonly cellIssues: ReadonlyMap<string, TableIssue> | undefined;\n getValue(columnId: string): unknown;\n /** The formatted text of a cell, as shown, searched, copied, and exported. */\n getDisplay(columnId: string): string;\n}\n\nexport type RowItemKind = \"row\" | \"detail\";\n\n/** A renderer item; detail items do not count as data rows or grid coordinates. */\nexport interface TableRenderItem<TRow> {\n readonly kind: RowItemKind;\n readonly key: string;\n /** The parent data row, also for detail items. */\n readonly row: TableRow<TRow>;\n /** Position of the parent in snapshot.rows. */\n readonly rowIndex: number;\n}\n\n/** Disjoint namespaces and typed keys avoid collisions between 1, \"1\", and detail-like ids. */\nexport function getRowItemKey(key: RowKey, kind: RowItemKind = \"row\"): string {\n return JSON.stringify([kind, typeof key, key]);\n}\n\nexport function createRow<TRow>(\n original: TRow,\n key: RowKey,\n index: number,\n columns: ReadonlyMap<string, TableColumn<TRow>>,\n canExpand = false,\n): TableRow<TRow> {\n const values = new Map<string, unknown>();\n const displays = new Map<string, string>();\n\n const getValue = (columnId: string): unknown => {\n if (values.has(columnId)) {\n return values.get(columnId);\n }\n const value = columns.get(columnId)?.getValue(original);\n values.set(columnId, value);\n return value;\n };\n\n return Object.freeze({\n key,\n index,\n original,\n canExpand,\n isExpanded: false,\n depth: 0,\n parentKey: undefined,\n childCount: 0,\n childStatus: \"loaded\" as const,\n selection: \"none\" as const,\n isDirty: false,\n cellIssues: undefined,\n getValue,\n getDisplay(columnId: string): string {\n const cached = displays.get(columnId);\n if (cached !== undefined) {\n return cached;\n }\n const column = columns.get(columnId);\n const display = column ? column.format(getValue(columnId), original) : \"\";\n displays.set(columnId, display);\n return display;\n },\n });\n}\n","import { issue, type TableIssue } from \"./issues\";\n\n/** A stable identity for a row, read from the row itself or produced by a function. */\nexport type RowKey = string | number;\nexport type ExpandedState = readonly RowKey[] | true;\n\nexport type SortDirection = \"asc\" | \"desc\";\n\n/** One level of a sort. Several rules sort by the first, then break ties with the next. */\nexport interface SortRule {\n readonly column: string;\n readonly direction: SortDirection;\n}\n\n/** Pages are counted from 1. */\nexport interface PaginationState {\n readonly page: number;\n readonly pageSize: number;\n}\n\n/**\n * Everything a user can change about a table, as plain serializable data.\n *\n * Being plain data, the state can be stored, restored, sent to a server that sorts and pages, or\n * written to the URL with a library such as QueryWeave.\n */\nexport interface TableState {\n readonly sorting: readonly SortRule[];\n /** Free text matched against every searchable column. */\n readonly search: string;\n /** Filter value per column id, interpreted by that column's `filter`. */\n readonly filters: Readonly<Record<string, unknown>>;\n readonly pagination: PaginationState;\n readonly selection: readonly RowKey[];\n /** Expanded keys, or true for every expandable row. */\n readonly expanded: ExpandedState;\n readonly hiddenColumns: readonly string[];\n /** Column ids in display order. Columns missing from the list keep their definition order. */\n readonly columnOrder: readonly string[];\n}\n\n/** A partial state, as accepted by `setState` and `initialState`. */\nexport type TableStatePatch = {\n readonly [K in keyof TableState]?: TableState[K] | undefined;\n};\n\nexport const DEFAULT_PAGE_SIZE = 10;\n\nexport function createInitialState(\n patch: TableStatePatch = {},\n onIssue?: (problem: TableIssue) => void,\n): TableState {\n return freezeState({\n sorting: patch.sorting ?? [],\n search: patch.search ?? \"\",\n filters: patch.filters ?? {},\n pagination: patch.pagination ?? { page: 1, pageSize: DEFAULT_PAGE_SIZE },\n selection: patch.selection ?? [],\n expanded: normalizeExpanded(patch.expanded === undefined ? [] : patch.expanded, onIssue),\n hiddenColumns: patch.hiddenColumns ?? [],\n columnOrder: patch.columnOrder ?? [],\n });\n}\n\nexport function mergeState(\n state: TableState,\n patch: TableStatePatch,\n onIssue?: (problem: TableIssue) => void,\n): TableState {\n let changed = false;\n const next: Record<string, unknown> = { ...state };\n for (const [key, input] of Object.entries(patch)) {\n const value =\n key === \"expanded\" && input !== undefined ? normalizeExpanded(input, onIssue) : input;\n if (value === undefined || Object.is(next[key], value)) {\n continue;\n }\n if (\n key === \"pagination\" &&\n samePagination(next[key] as PaginationState, value as PaginationState)\n ) {\n continue;\n }\n if (key === \"expanded\" && sameExpanded(state.expanded, value as ExpandedState)) continue;\n next[key] = value;\n changed = true;\n }\n return changed ? freezeState(next as unknown as TableState, state) : state;\n}\n\nfunction normalizeExpanded(value: unknown, onIssue?: (problem: TableIssue) => void): ExpandedState {\n if (value === true) return true;\n if (\n Array.isArray(value) &&\n value.every(\n (key: unknown) =>\n typeof key === \"string\" || (typeof key === \"number\" && Number.isFinite(key)),\n )\n ) {\n return [...new Set(value as RowKey[])];\n }\n onIssue?.(\n issue(\n \"invalid_expanded\",\n \"Expanded state must be true or an array of string/finite number keys; an empty array is used.\",\n ),\n );\n return [];\n}\n\nfunction sameExpanded(left: ExpandedState, right: ExpandedState): boolean {\n return (\n left === right ||\n (left !== true &&\n right !== true &&\n left.length === right.length &&\n left.every((key, index) => key === right[index]))\n );\n}\n\nfunction samePagination(left: PaginationState, right: PaginationState): boolean {\n return left.page === right.page && left.pageSize === right.pageSize;\n}\n\nfunction freezeState(state: TableState, previous?: TableState): TableState {\n return Object.freeze({\n sorting:\n state.sorting === previous?.sorting\n ? previous.sorting\n : Object.freeze(state.sorting.map((rule) => Object.freeze({ ...rule }))),\n search: state.search,\n filters:\n state.filters === previous?.filters ? previous.filters : Object.freeze({ ...state.filters }),\n pagination:\n state.pagination === previous?.pagination\n ? previous.pagination\n : Object.freeze({ ...state.pagination }),\n selection:\n state.selection === previous?.selection\n ? previous.selection\n : Object.freeze([...state.selection]),\n expanded:\n state.expanded === previous?.expanded\n ? previous.expanded\n : state.expanded === true\n ? true\n : Object.freeze([...state.expanded]),\n hiddenColumns:\n state.hiddenColumns === previous?.hiddenColumns\n ? previous.hiddenColumns\n : Object.freeze([...state.hiddenColumns]),\n columnOrder:\n state.columnOrder === previous?.columnOrder\n ? previous.columnOrder\n : Object.freeze([...state.columnOrder]),\n });\n}\n","import { issue, type TableIssue } from \"./issues\";\nimport type { RowKey } from \"./state\";\n\nexport type ValidationResult = true | string | { readonly message: string; readonly code?: string };\nexport type Validator<TValue, TRow> = (\n value: TValue,\n row: TRow,\n) => ValidationResult | Promise<ValidationResult>;\nexport interface EditorSpec {\n readonly kind: \"text\" | \"number\" | \"select\" | \"checkbox\" | \"date\";\n readonly options?: readonly (string | number | boolean | null)[] | undefined;\n readonly min?: number | undefined;\n readonly max?: number | undefined;\n readonly maxLength?: number | undefined;\n readonly pattern?: string | undefined;\n}\nexport interface PendingCell {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly value: unknown;\n}\n\nexport function isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return typeof value === \"object\" && value !== null && \"then\" in value;\n}\n\n/** Validators receive values; their messages remain plain text. */\nexport function runValidation(\n validate: () => ValidationResult | Promise<ValidationResult>,\n rowKey: RowKey,\n column?: string,\n): TableIssue | undefined | Promise<TableIssue | undefined> {\n const fail = (message: string, validationCode?: string): TableIssue =>\n issue(\"validation_failed\", message, { rowKey, column, validationCode });\n const read = (result: ValidationResult): TableIssue | undefined => {\n if (result === true) return undefined;\n if (typeof result === \"string\") return fail(result);\n if (result && typeof result.message === \"string\") return fail(result.message, result.code);\n return fail(\"The validator returned an invalid result.\");\n };\n const thrown = (error: unknown): TableIssue =>\n fail(error instanceof Error ? error.message : String(error));\n try {\n const result = validate();\n return isPromise(result) ? Promise.resolve(result).then(read, thrown) : read(result);\n } catch (error) {\n return thrown(error);\n }\n}\n\nexport function editorFailure(spec: EditorSpec | undefined, value: unknown): string | undefined {\n if (!spec) return undefined;\n if (spec.maxLength !== undefined && (!Number.isSafeInteger(spec.maxLength) || spec.maxLength < 0))\n return \"Editor maxLength must be a non-negative safe integer.\";\n if (\n (spec.min !== undefined && !Number.isFinite(spec.min)) ||\n (spec.max !== undefined && !Number.isFinite(spec.max)) ||\n (spec.min !== undefined && spec.max !== undefined && spec.min > spec.max)\n )\n return \"Editor bounds must be finite and ordered.\";\n if (spec.options && !spec.options.some((option) => Object.is(option, value)))\n return \"Choose one of the allowed values.\";\n if (spec.maxLength !== undefined && typeof value === \"string\" && value.length > spec.maxLength)\n return `Use at most ${spec.maxLength} characters.`;\n if (spec.min !== undefined || spec.max !== undefined) {\n const number = value instanceof Date ? value.getTime() : value;\n if (typeof number !== \"number\" || !Number.isFinite(number))\n return \"Enter a finite numeric value.\";\n if (spec.min !== undefined && number < spec.min) return `Use a value of at least ${spec.min}.`;\n if (spec.max !== undefined && number > spec.max) return `Use a value of at most ${spec.max}.`;\n }\n if (spec.pattern !== undefined) {\n try {\n if (typeof value !== \"string\" || !new RegExp(spec.pattern, \"u\").test(value))\n return \"The value does not match the required pattern.\";\n } catch {\n return \"The editor pattern is invalid.\";\n }\n }\n return undefined;\n}\n","import type { TableColumn } from \"./column\";\nimport { issue, type TableIssue } from \"./issues\";\nimport { isSafePath } from \"./path\";\nimport type { TableRow } from \"./row\";\nimport type { RowKey } from \"./state\";\nimport type {\n CellChange,\n CellEdit,\n CellValueEdit,\n EditOptions,\n EditResult,\n TableSnapshot,\n} from \"./table\";\nimport {\n editorFailure,\n isPromise,\n runValidation,\n type PendingCell,\n type ValidationResult,\n} from \"./validation\";\n\ninterface Candidate<TRow> {\n readonly edit: CellValueEdit;\n readonly previous: unknown;\n readonly original: TRow;\n readonly column: TableColumn<TRow>;\n readonly validation: TableIssue | undefined | Promise<TableIssue | undefined>;\n readonly token: object;\n readonly guard: { row: TRow } | undefined;\n}\nexport interface ValidationHost<TRow> {\n snapshot(): TableSnapshot<TRow>;\n apply(\n edits: readonly CellEdit[],\n record: boolean,\n issues?: readonly TableIssue[],\n ): EditResult<TRow>;\n record(changes: readonly CellChange<TRow>[]): void;\n notify(): void;\n batch(run: () => EditResult<TRow>): EditResult<TRow>;\n writeIssue(row: TableRow<TRow>, next: TRow): TableIssue | undefined;\n onIssues(issues: readonly TableIssue[]): void;\n readonly optimistic: boolean;\n readonly validateRow:\n | ((next: TRow, previous: TRow) => ValidationResult | Promise<ValidationResult>)\n | undefined;\n}\n\nexport function readonlyMap<TKey, TValue>(\n source: ReadonlyMap<TKey, TValue>,\n): ReadonlyMap<TKey, TValue> {\n const copy = new Map(source);\n const result: ReadonlyMap<TKey, TValue> = {\n size: copy.size,\n get: (key) => copy.get(key),\n has: (key) => copy.has(key),\n entries: () => copy.entries(),\n keys: () => copy.keys(),\n values: () => copy.values(),\n [Symbol.iterator]: () => copy[Symbol.iterator](),\n forEach(callback, thisArg) {\n copy.forEach((value, key) => callback.call(thisArg, value, key, result));\n },\n };\n return Object.freeze(result);\n}\n\n/** All promises in one edit settle together. Tokens fence every cell against stale results. */\nexport function createEditValidation<TRow>(host: ValidationHost<TRow>): {\n edit(\n edits: readonly CellEdit[],\n recovered?: readonly TableIssue[],\n options?: EditOptions<TRow>,\n ): EditResult<TRow>;\n cells(): readonly PendingCell[];\n hasPending(key: RowKey): boolean;\n problems(): ReadonlyMap<RowKey, ReadonlyMap<string, TableIssue>>;\n cancel(keys?: readonly RowKey[]): void;\n} {\n const tokens = new Map<RowKey, Map<string, object>>();\n const pending = new Map<RowKey, Map<string, PendingCell>>();\n const problems = new Map<RowKey, Map<string, TableIssue>>();\n const current = (candidate: Candidate<TRow>): boolean =>\n tokens.get(candidate.edit.rowKey)?.get(candidate.edit.column) === candidate.token;\n const fresh = (candidate: Candidate<TRow>): boolean =>\n !candidate.guard ||\n host.snapshot().getRow(candidate.edit.rowKey)?.original === candidate.guard.row;\n const tokenFor = (rowKey: RowKey, column: string): object => {\n const row = tokens.get(rowKey) ?? new Map<string, object>();\n const token = {};\n row.set(column, token);\n tokens.set(rowKey, row);\n pending.get(rowKey)?.delete(column);\n problems.get(rowKey)?.delete(column);\n return token;\n };\n const setIssues = (issues: readonly TableIssue[]): void => {\n for (const problem of issues) {\n if (problem.rowKey === undefined || problem.column === undefined) continue;\n const row = problems.get(problem.rowKey) ?? new Map<string, TableIssue>();\n row.set(problem.column, problem);\n problems.set(problem.rowKey, row);\n }\n };\n function rowValidation(\n candidates: readonly Candidate<TRow>[],\n failures: TableIssue[],\n ): Candidate<TRow>[] | Promise<Candidate<TRow>[]> {\n if (!host.validateRow) return [...candidates];\n const rows = new Map<RowKey, Candidate<TRow>[]>();\n for (const candidate of candidates) {\n const group = rows.get(candidate.edit.rowKey) ?? [];\n group.push(candidate);\n rows.set(candidate.edit.rowKey, group);\n }\n const results: (Candidate<TRow>[] | Promise<Candidate<TRow>[]>)[] = [];\n for (const [key, group] of rows) {\n const previous = group[0]!.original;\n let next = previous;\n try {\n for (const candidate of group)\n next = candidate.column.setValue(next, candidate.edit.value) ?? next;\n } catch (error) {\n for (const candidate of group)\n failures.push(\n issue(\"validation_failed\", String(error), {\n rowKey: key,\n column: candidate.edit.column,\n }),\n );\n continue;\n }\n const validation = runValidation(() => host.validateRow!(next, previous), key);\n const accept = (problem: TableIssue | undefined): Candidate<TRow>[] => {\n if (!problem) return group;\n for (const candidate of group)\n if (current(candidate))\n failures.push(Object.freeze({ ...problem, column: candidate.edit.column }));\n return [];\n };\n results.push(isPromise(validation) ? validation.then(accept) : accept(validation));\n }\n return results.some(isPromise)\n ? Promise.all(results.map((result) => Promise.resolve(result))).then((groups) =>\n groups.flat(),\n )\n : (results as Candidate<TRow>[][]).flat();\n }\n function settle(\n accepted: readonly Candidate<TRow>[],\n all: readonly Candidate<TRow>[],\n failures: readonly TableIssue[],\n asynchronous: boolean,\n ): EditResult<TRow> {\n return host.batch(() => {\n const live = accepted.filter((candidate) => current(candidate) && fresh(candidate));\n const liveKeys = new Set(live);\n const active = all.filter(current);\n for (const candidate of active) {\n const key = candidate.edit.rowKey;\n pending.get(key)?.delete(candidate.edit.column);\n if (pending.get(key)?.size === 0) pending.delete(key);\n }\n const visibleFailures = failures;\n setIssues(visibleFailures);\n let result: EditResult<TRow>;\n if (asynchronous && host.optimistic) {\n const rollback = active\n .filter((candidate) => !liveKeys.has(candidate))\n .map((candidate) => ({ ...candidate.edit, value: candidate.previous }));\n result = host.apply(rollback, false, visibleFailures);\n const changes = live.map((candidate) =>\n Object.freeze({\n rowKey: candidate.edit.rowKey,\n column: candidate.edit.column,\n previous: candidate.previous,\n value: candidate.edit.value,\n row: host.snapshot().getRow(candidate.edit.rowKey)!.original,\n }),\n );\n if (changes.length) host.record(changes);\n result = Object.freeze({\n ...result,\n changes: Object.freeze(changes),\n status: changes.length\n ? visibleFailures.length\n ? \"partial\"\n : \"applied\"\n : visibleFailures.length\n ? \"rejected\"\n : \"unchanged\",\n });\n } else\n result = host.apply(\n live.map((candidate) => candidate.edit),\n true,\n visibleFailures,\n );\n setIssues(result.issues);\n if (\n (!result.changes.length && (all.length || result.issues.length)) ||\n (asynchronous && host.optimistic)\n )\n host.notify();\n if (asynchronous && !result.issues.length && active.length) host.onIssues([]);\n return result;\n });\n }\n return {\n hasPending: (key) => (pending.get(key)?.size ?? 0) > 0,\n cells: () => Object.freeze([...pending.values()].flatMap((row) => [...row.values()])),\n problems: () =>\n new Map(\n [...problems].filter(([, row]) => row.size).map(([key, row]) => [key, readonlyMap(row)]),\n ),\n cancel(keys) {\n if (!keys) {\n tokens.clear();\n pending.clear();\n problems.clear();\n } else\n for (const key of keys) {\n tokens.delete(key);\n pending.delete(key);\n problems.delete(key);\n }\n },\n edit(edits, recovered = [], options) {\n const metadataChanged = edits.some(\n (edit) =>\n pending.get(edit.rowKey)?.has(edit.column) ||\n problems.get(edit.rowKey)?.has(edit.column) ||\n (host.validateRow && pending.get(edit.rowKey)?.size),\n );\n const snapshot = host.snapshot();\n const failures = [...recovered];\n const candidates: Candidate<TRow>[] = [];\n const guards = new Map(\n [...(options?.expectedRows ?? [])].map(([key, row]) => [key, { row }]),\n );\n const drafts = new Map<RowKey, TRow>();\n const samples = new Map<string, unknown>();\n if (host.validateRow)\n for (const key of new Set(edits.map((edit) => edit.rowKey))) {\n tokens.delete(key);\n pending.delete(key);\n }\n for (const edit of edits) {\n const token = tokenFor(edit.rowKey, edit.column);\n const row: TableRow<TRow> | undefined = snapshot.getRow(edit.rowKey);\n const column = snapshot.getColumn(edit.column);\n const fail = (code: TableIssue[\"code\"], message: string): void => {\n failures.push(issue(code, message, { rowKey: edit.rowKey, column: edit.column }));\n };\n if (!isSafePath(edit.column)) {\n fail(\"unsafe_path\", \"This path addresses a prototype and cannot be written.\");\n continue;\n }\n if (!row) {\n fail(\"unknown_row\", `No row has the key \"${String(edit.rowKey)}\".`);\n continue;\n }\n const guard = guards.get(row.key);\n if (guard && row.original !== guard.row) {\n fail(\"stale_draft\", \"The row changed after this draft was opened.\");\n continue;\n }\n if (!column) {\n fail(\"unknown_column\", `No column has the id \"${edit.column}\".`);\n continue;\n }\n const original = drafts.get(row.key) ?? row.original;\n try {\n if (!column.isEditable(original)) {\n fail(\"read_only_cell\", `The \"${column.id}\" cell is read-only.`);\n continue;\n }\n let value: unknown;\n if (\"input\" in edit) {\n if (!samples.has(column.id))\n samples.set(\n column.id,\n snapshot.processedRows\n .find(\n (candidate) =>\n candidate.getValue(column.id) !== null &&\n candidate.getValue(column.id) !== undefined,\n )\n ?.getValue(column.id),\n );\n const parsed = column.parse(edit.input, original, samples.get(column.id));\n if (!parsed.ok) {\n fail(\"invalid_value\", parsed.message);\n continue;\n }\n value = parsed.value;\n } else value = edit.value;\n const previous = column.getValue(original);\n if (Object.is(previous, value)) continue;\n const constraint = editorFailure(column.definition.editor, value);\n if (constraint) {\n fail(\"validation_failed\", constraint);\n continue;\n }\n const next = column.setValue(original, value);\n if (next === undefined) {\n fail(\"read_only_cell\", \"The column has no way to write a value.\");\n continue;\n }\n const writeProblem = host.writeIssue(row, next);\n if (writeProblem) {\n failures.push(Object.freeze({ ...writeProblem, column: column.id }));\n continue;\n }\n const validate = column.definition.validate;\n const validation = validate\n ? runValidation(() => validate(value as never, row.original), row.key, column.id)\n : undefined;\n if (validation && !isPromise(validation)) {\n failures.push(validation);\n continue;\n }\n drafts.set(row.key, next);\n candidates.push({\n edit: { rowKey: row.key, column: column.id, value },\n previous: column.getValue(row.original),\n original: row.original,\n column,\n validation,\n token,\n guard,\n });\n } catch (error) {\n fail(\"invalid_value\", error instanceof Error ? error.message : String(error));\n }\n }\n const asynchronous = candidates.some((candidate) => isPromise(candidate.validation));\n const validateRows = (\n accepted: Candidate<TRow>[],\n ): Candidate<TRow>[] | Promise<Candidate<TRow>[]> =>\n rowValidation(\n accepted.filter((candidate) => current(candidate) && fresh(candidate)),\n failures,\n );\n const outcome = asynchronous\n ? Promise.all(\n candidates.map(async (candidate) => {\n const problem = await candidate.validation;\n if (problem) {\n if (current(candidate)) failures.push(problem);\n return undefined;\n }\n return candidate;\n }),\n ).then((accepted) =>\n validateRows(accepted.filter((candidate) => candidate !== undefined)),\n )\n : validateRows(candidates);\n if (!isPromise(outcome)) {\n const result = settle(outcome, candidates, failures, false);\n if (metadataChanged && !candidates.length && !failures.length) host.notify();\n return result;\n }\n for (const candidate of candidates) {\n const row = pending.get(candidate.edit.rowKey) ?? new Map<string, PendingCell>();\n row.set(candidate.edit.column, Object.freeze({ ...candidate.edit }));\n pending.set(candidate.edit.rowKey, row);\n }\n setIssues(failures);\n const optimistic = host.optimistic\n ? host.apply(\n candidates.map((candidate) => candidate.edit),\n false,\n failures,\n )\n : undefined;\n if (optimistic)\n for (const [key, guard] of guards) {\n const row = host.snapshot().getRow(key);\n if (row) guard.row = row.original;\n }\n if (!optimistic?.changes.length) host.notify();\n if (!host.optimistic && failures.length) host.onIssues(failures);\n const completion = outcome.then((accepted): EditResult<TRow> => {\n const staleCandidates = candidates\n .filter((candidate) => !current(candidate) || !fresh(candidate))\n .map((candidate) => ({\n candidate,\n problem: issue(\n \"stale_draft\",\n \"This edit was superseded or its row is no longer current.\",\n {\n rowKey: candidate.edit.rowKey,\n column: candidate.edit.column,\n },\n ),\n }));\n const stale = staleCandidates.map(({ problem }) => problem);\n const issues = [...failures, ...stale];\n if (candidates.some(current)) {\n const superseded = staleCandidates\n .filter(({ candidate }) => !current(candidate))\n .map(({ problem }) => problem);\n const result = settle(\n accepted,\n candidates,\n [\n ...failures,\n ...staleCandidates\n .filter(({ candidate }) => current(candidate))\n .map(({ problem }) => problem),\n ],\n true,\n );\n if (!stale.length) return result;\n return Object.freeze({\n ...result,\n issues: Object.freeze([...result.issues, ...superseded]),\n status: result.changes.length ? \"partial\" : \"rejected\",\n });\n }\n // Cancelled batches must not publish into a replaced or disposed table.\n return Object.freeze({\n status: \"rejected\",\n changes: Object.freeze([]),\n rowChanges: Object.freeze([]),\n issues: Object.freeze(issues),\n pendingCells: Object.freeze([]),\n });\n });\n return Object.freeze({\n status: \"pending\",\n changes: optimistic?.changes ?? Object.freeze([]),\n rowChanges: Object.freeze([]),\n issues: Object.freeze([...failures]),\n pendingCells: Object.freeze(\n candidates.map((candidate) => Object.freeze({ ...candidate.edit })),\n ),\n completion,\n });\n },\n };\n}\n","import type { RowKey } from \"./state\";\nimport type { CellChange } from \"./table\";\n\nexport interface InsertPosition {\n readonly before?: RowKey | undefined;\n readonly parent?: RowKey | undefined;\n}\nexport interface RowChange<TRow> {\n readonly kind: \"inserted\" | \"removed\";\n readonly rowKey: RowKey;\n readonly row: TRow;\n readonly position: InsertPosition;\n}\nexport interface UpdatedRow<TRow> {\n readonly rowKey: RowKey;\n readonly row: TRow;\n readonly previous: TRow;\n readonly changes: readonly CellChange<TRow>[];\n}\nexport interface PendingChanges<TRow> {\n readonly inserted: readonly RowChange<TRow>[];\n readonly updated: readonly UpdatedRow<TRow>[];\n readonly removed: readonly RowChange<TRow>[];\n}\nexport interface PendingEntry<TRow> {\n previous: TRow | undefined;\n row: TRow | undefined;\n readonly position: InsertPosition;\n readonly cells: Map<string, CellChange<TRow>>;\n}\n\n/** A saved baseline only for touched rows; viewing changes never scans source data. */\nexport function createPendingChanges<TRow>(): {\n readonly entries: Map<RowKey, PendingEntry<TRow>>;\n snapshot(): PendingChanges<TRow>;\n record(\n key: RowKey,\n previous: TRow | undefined,\n row: TRow | undefined,\n position: InsertPosition,\n changes: readonly CellChange<TRow>[],\n ): void;\n} {\n const entries = new Map<RowKey, PendingEntry<TRow>>();\n return {\n entries,\n snapshot() {\n const inserted: RowChange<TRow>[] = [];\n const removed: RowChange<TRow>[] = [];\n const updated: UpdatedRow<TRow>[] = [];\n for (const [rowKey, entry] of entries) {\n if (entry.previous === undefined && entry.row !== undefined)\n inserted.push(\n Object.freeze({ kind: \"inserted\", rowKey, row: entry.row, position: entry.position }),\n );\n else if (entry.row === undefined && entry.previous !== undefined)\n removed.push(\n Object.freeze({\n kind: \"removed\",\n rowKey,\n row: entry.previous,\n position: entry.position,\n }),\n );\n else if (entry.row !== undefined && entry.previous !== undefined)\n updated.push(\n Object.freeze({\n rowKey,\n row: entry.row,\n previous: entry.previous,\n changes: Object.freeze([...entry.cells.values()]),\n }),\n );\n }\n return Object.freeze({\n inserted: Object.freeze(inserted),\n updated: Object.freeze(updated),\n removed: Object.freeze(removed),\n });\n },\n record(key, previous, row, position, changes) {\n const entry = entries.get(key) ?? {\n previous,\n row,\n position: Object.freeze({ ...position }),\n cells: new Map<string, CellChange<TRow>>(),\n };\n entry.row = row;\n for (const change of changes) {\n const original = entry.cells.has(change.column)\n ? entry.cells.get(change.column)!.previous\n : change.previous;\n if (Object.is(original, change.value)) entry.cells.delete(change.column);\n else entry.cells.set(change.column, Object.freeze({ ...change, previous: original }));\n }\n if (\n (entry.previous === undefined && row === undefined) ||\n (entry.previous !== undefined && row !== undefined && entry.cells.size === 0)\n )\n entries.delete(key);\n else entries.set(key, entry);\n },\n };\n}\n","/** Read-only array views keep append publication independent of existing list length. */\nfunction indexOf(property: PropertyKey): number | undefined {\n if (typeof property !== \"string\" || !/^(0|[1-9]\\d*)$/u.test(property)) return undefined;\n return Number(property);\n}\n\nexport function rowList<T>(length: number, read: (index: number) => T): readonly T[] {\n return new Proxy<T[]>([], {\n get(target, property, receiver) {\n if (property === \"length\") return length;\n const index = indexOf(property);\n return index === undefined\n ? Reflect.get(target, property, receiver)\n : index < length\n ? read(index)\n : undefined;\n },\n has(target, property) {\n const index = indexOf(property);\n return index === undefined ? Reflect.has(target, property) : index < length;\n },\n ownKeys: () => [...Array.from({ length }, (_, index) => String(index)), \"length\"],\n getOwnPropertyDescriptor(target, property) {\n if (property === \"length\")\n return { ...Reflect.getOwnPropertyDescriptor(target, property)!, value: length };\n const index = indexOf(property);\n return index === undefined\n ? Reflect.getOwnPropertyDescriptor(target, property)\n : index < length\n ? { configurable: true, enumerable: true, writable: false, value: read(index) }\n : undefined;\n },\n set: () => false,\n deleteProperty: () => false,\n defineProperty: () => false,\n preventExtensions: () => false,\n setPrototypeOf: () => false,\n });\n}\n\ninterface Chunks<T> {\n readonly chunks: { readonly start: number; readonly rows: readonly T[] }[];\n}\nconst stores = new WeakMap<object, Chunks<unknown>>();\n\nexport function appendList<T>(previous: readonly T[], incoming: readonly T[]): readonly T[] {\n if (!incoming.length) return previous;\n let store = stores.get(previous) as Chunks<T> | undefined;\n // A previous view can branch after undo; only extend the current tail in place.\n const last = store?.chunks.at(-1);\n if (!store || (last && last.start + last.rows.length !== previous.length)) {\n store = { chunks: [{ start: 0, rows: previous }] };\n }\n store.chunks.push({ start: previous.length, rows: incoming });\n const chunks = store.chunks;\n const result = rowList(previous.length + incoming.length, (index) => {\n let low = 0;\n let high = chunks.length - 1;\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n if (chunks[mid]!.start <= index) low = mid;\n else high = mid - 1;\n }\n const chunk = chunks[low]!;\n return chunk.rows[index - chunk.start]!;\n });\n stores.set(result, store);\n return result;\n}\n\nexport function mapList<T, U>(rows: readonly T[], map: (row: T, index: number) => U): readonly U[] {\n const cache = new Map<number, U>();\n return rowList(rows.length, (index) => {\n if (!cache.has(index)) cache.set(index, map(rows[index]!, index));\n return cache.get(index)!;\n });\n}\n","import { issue, type TableIssue } from \"./issues\";\n\nexport type LoadState = \"idle\" | \"loading\" | \"streaming\" | \"done\" | \"error\" | \"aborted\";\n/** Structural cancellation, compatible with the caller's native signal. */\nexport interface StreamSignal {\n readonly aborted: boolean;\n addEventListener?(\n type: \"abort\",\n listener: () => void,\n options?: { readonly once?: boolean },\n ): void;\n removeEventListener?(type: \"abort\", listener: () => void): void;\n}\nexport interface StreamOptions {\n readonly signal?: StreamSignal | undefined;\n readonly batchSize?: number | undefined;\n readonly expectedRowCount?: number | undefined;\n readonly mode?: \"append\" | \"upsert\" | undefined;\n}\nexport interface DataIngestionResult {\n readonly status: \"applied\" | \"partial\" | \"rejected\" | \"unchanged\";\n readonly appended: number;\n readonly replaced: number;\n readonly removed: number;\n readonly issues: readonly TableIssue[];\n}\nexport interface StreamResult {\n readonly status: \"done\" | \"error\" | \"aborted\";\n readonly receivedRowCount: number;\n readonly issues: readonly TableIssue[];\n}\ninterface StreamHost<TRow> {\n ingest(rows: readonly TRow[], mode: \"append\" | \"upsert\"): DataIngestionResult;\n update(\n state: LoadState,\n expected: number | undefined,\n problems: readonly TableIssue[],\n notify: boolean,\n ): void;\n}\nexport function createStream<TRow>(host: StreamHost<TRow>): {\n run(\n source: AsyncIterable<readonly TRow[] | TRow>,\n options?: StreamOptions,\n ): Promise<StreamResult>;\n cancel(): void;\n} {\n let active: { cancel(): void } | undefined;\n return {\n cancel() {\n active?.cancel();\n active = undefined;\n },\n async run(source, options = {}) {\n active?.cancel();\n const problems: TableIssue[] = [];\n const requested = options.batchSize ?? 1000;\n const batchSize = Number.isSafeInteger(requested) && requested > 0 ? requested : 1000;\n if (batchSize !== requested)\n problems.push(\n issue(\n \"invalid_stream_option\",\n \"batchSize must be a positive safe integer; 1,000 is used.\",\n ),\n );\n const requestedCount = options.expectedRowCount;\n const expected =\n requestedCount === undefined ||\n (Number.isSafeInteger(requestedCount) && requestedCount >= 0)\n ? requestedCount\n : undefined;\n if (expected !== requestedCount)\n problems.push(\n issue(\n \"invalid_stream_option\",\n \"expectedRowCount must be a non-negative safe integer; it is unknown instead.\",\n ),\n );\n let cancelled = false;\n let wake: () => void = () => undefined;\n const cancellation = new Promise<undefined>((resolve) => {\n wake = () => resolve(undefined);\n });\n const cancel = (): void => {\n cancelled = true;\n wake();\n };\n const run = { cancel };\n active = run;\n const signal = options.signal;\n signal?.addEventListener?.(\"abort\", cancel, { once: true });\n if (signal?.aborted) run.cancel();\n let receivedRowCount = 0;\n let status: StreamResult[\"status\"] = \"done\";\n let iterator: AsyncIterator<readonly TRow[] | TRow> | undefined;\n host.update(cancelled ? \"aborted\" : \"loading\", expected, problems, true);\n try {\n if (!cancelled) iterator = source[Symbol.asyncIterator]();\n while (true) {\n if (cancelled || !iterator) break;\n // oxlint-disable-next-line no-await-in-loop -- Preserve source order and backpressure.\n const next = await Promise.race([iterator.next(), cancellation]);\n if (!next || cancelled || signal?.aborted) {\n run.cancel();\n break;\n }\n if (next.done) break;\n const rows: readonly TRow[] = Array.isArray(next.value)\n ? (next.value as readonly TRow[])\n : [next.value as TRow];\n for (let start = 0; start < rows.length; start += batchSize) {\n // Yield between bounded batches; a caller can cancel or supersede this run.\n // oxlint-disable-next-line no-await-in-loop -- Allow cancellation between ordered batches.\n await Promise.resolve();\n if (cancelled || signal?.aborted) {\n run.cancel();\n break;\n }\n host.update(\"streaming\", expected, problems, false);\n const result = host.ingest(\n rows.slice(start, start + batchSize),\n options.mode ?? \"append\",\n );\n receivedRowCount += result.appended + result.replaced;\n problems.push(...result.issues);\n }\n }\n } catch (error) {\n status = \"error\";\n problems.push(\n issue(\"stream_error\", error instanceof Error ? error.message : String(error)),\n );\n } finally {\n signal?.removeEventListener?.(\"abort\", cancel);\n if (cancelled) status = \"aborted\";\n if (active === run) {\n active = undefined;\n host.update(status, expected, problems, true);\n }\n // Do not wait on return(): an uncooperative iterator may be blocked in next().\n if (status !== \"done\" && iterator?.return)\n void Promise.resolve()\n .then(() => iterator!.return!())\n .catch(() => undefined);\n }\n return Object.freeze({ status, receivedRowCount, issues: Object.freeze([...problems]) });\n },\n };\n}\n","import type { TableColumn } from \"./column\";\nimport { issue, type TableIssue } from \"./issues\";\nimport { filterRows, sortRows } from \"./pipeline\";\nimport { createRow, type TableRow } from \"./row\";\nimport type { ExpandedState, RowKey, TableState } from \"./state\";\n\n/** A runtime supplies its own cancellation primitive; core needs no platform globals. */\nexport interface TreeLoadSignal {\n readonly aborted: boolean;\n}\n\nexport interface TreeLoadController<TSignal extends TreeLoadSignal = TreeLoadSignal> {\n readonly signal: TSignal;\n abort(): void;\n}\n\nexport type TreeFilter = \"ancestors\" | \"descendants\" | \"strict\";\nexport type TreePagination = \"root\" | \"row\";\nexport type ChildStatus = \"idle\" | \"loading\" | \"loaded\" | \"error\";\n\nexport interface TreeOptions<TRow, TSignal extends TreeLoadSignal = TreeLoadSignal> {\n readonly getChildren?: ((row: TRow) => readonly TRow[] | undefined) | undefined;\n /** Immutable counterpart of getChildren, required when editing nested descendants. */\n readonly setChildren?: ((row: TRow, children: readonly TRow[]) => TRow) | undefined;\n readonly getParentKey?: ((row: TRow) => RowKey | null | undefined) | undefined;\n readonly hasChildren?: ((row: TRow) => boolean) | undefined;\n readonly loadChildren?:\n | ((row: TableRow<TRow>, signal: TSignal) => Promise<readonly TRow[]>)\n | undefined;\n /** Required with loadChildren. Supply a controller from the caller's runtime. */\n readonly createChildLoadController?: (() => TreeLoadController<TSignal>) | undefined;\n readonly treeFilter?: TreeFilter | undefined;\n readonly paginateBy?: TreePagination | undefined;\n /** Maximum edges from a root. Deeper rows recover as roots. Defaults to 1,000. */\n readonly maxDepth?: number | undefined;\n}\n\nexport interface TreeNode<TRow> {\n row: TableRow<TRow>;\n parent: TreeNode<TRow> | undefined;\n children: TreeNode<TRow>[];\n depth: number;\n /** Position in the parent's children, or the source roots. */\n sourceIndex: number;\n lazy: boolean;\n writable: boolean;\n unloaded: boolean;\n}\n\nexport interface TreeModel<TRow> {\n readonly rows: readonly TableRow<TRow>[];\n readonly nodes: readonly TreeNode<TRow>[];\n readonly roots: readonly TreeNode<TRow>[];\n readonly byKey: ReadonlyMap<RowKey, TreeNode<TRow>>;\n readonly issues: readonly TableIssue[];\n}\n\nexport function buildTree<TRow, TSignal extends TreeLoadSignal>(\n data: readonly TRow[],\n columns: ReadonlyMap<string, TableColumn<TRow>>,\n readKey: (row: TRow, index: number) => RowKey,\n options: TreeOptions<TRow, TSignal>,\n lazy: ReadonlyMap<RowKey, readonly TRow[]>,\n): TreeModel<TRow> {\n const nodes: TreeNode<TRow>[] = [];\n const byKey = new Map<RowKey, TreeNode<TRow>>();\n const issues: TableIssue[] = [];\n const nested = options.getChildren !== undefined;\n let maxDepth = options.maxDepth ?? 1_000;\n if (!Number.isSafeInteger(maxDepth) || maxDepth < 1) {\n issues.push(\n issue(\"invalid_tree_option\", \"maxDepth must be a positive safe integer; 1,000 is used.\"),\n );\n maxDepth = 1_000;\n }\n if (nested && options.getParentKey) {\n issues.push(\n issue(\"invalid_tree_option\", \"Both tree inputs were supplied; getChildren takes precedence.\"),\n );\n }\n const seen = new Set<TRow>();\n const stack = data\n .map((original, sourceIndex) => ({\n original,\n sourceIndex,\n parent: undefined as TreeNode<TRow> | undefined,\n lazy: false,\n }))\n .reverse();\n while (stack.length) {\n const entry = stack.pop()!;\n const index = nodes.length;\n let key = readKey(entry.original, index);\n let parent = entry.parent;\n const reference =\n entry.original !== null &&\n (typeof entry.original === \"object\" || typeof entry.original === \"function\");\n const repeated = nested && reference && seen.has(entry.original);\n if (repeated) {\n issues.push(\n issue(\n \"tree_cycle\",\n \"A repeated nested value recovers as a root without traversing it again.\",\n { rowKey: key },\n ),\n );\n parent = undefined;\n }\n if (reference) seen.add(entry.original);\n if (byKey.has(key)) {\n issues.push(\n issue(\n entry.lazy ? \"tree_duplicate_key\" : \"duplicate_row_key\",\n entry.lazy\n ? \"A loaded child repeats an existing key and is rejected.\"\n : \"A repeated row key is replaced with a unique key.\",\n { rowKey: key },\n ),\n );\n if (entry.lazy) continue;\n const prefix = `${String(key)}#${index}`;\n key = prefix;\n let suffix = 0;\n while (byKey.has(key)) key = `${prefix}#${++suffix}`;\n }\n if (parent && parent.depth + 1 > maxDepth) {\n issues.push(\n issue(\n \"tree_depth_exceeded\",\n \"The maximum tree depth was exceeded; this row recovers as a root.\",\n { rowKey: key },\n ),\n );\n parent = undefined;\n }\n const children = repeated\n ? undefined\n : (lazy.get(key) ?? options.getChildren?.(entry.original));\n const node: TreeNode<TRow> = {\n row: createRow(entry.original, key, index, columns),\n parent,\n children: [],\n depth: parent ? parent.depth + 1 : 0,\n sourceIndex: entry.sourceIndex,\n lazy: entry.lazy,\n writable: parent?.writable ?? entry.parent === undefined,\n unloaded: children === undefined && (options.hasChildren?.(entry.original) ?? false),\n };\n nodes.push(node);\n byKey.set(key, node);\n if (parent) parent.children.push(node);\n if (children) {\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push({\n original: children[i]!,\n sourceIndex: i,\n parent: node,\n lazy: entry.lazy || lazy.has(key),\n });\n }\n }\n }\n if (!nested && options.getParentKey) {\n // One lookup per source row; lazy attachments already have an explicit parent.\n for (const node of nodes) {\n if (node.lazy) continue;\n const key = options.getParentKey(node.row.original);\n if (key === undefined || key === null) continue;\n const parent = byKey.get(key);\n if (!parent)\n issues.push(\n issue(\"tree_orphan\", \"The parent is missing; this row recovers as a root.\", {\n rowKey: node.row.key,\n }),\n );\n else node.parent = parent;\n }\n const done = new Set<TreeNode<TRow>>();\n for (const node of nodes) {\n const path: TreeNode<TRow>[] = [];\n const visiting = new Set<TreeNode<TRow>>();\n let cursor: TreeNode<TRow> | undefined = node;\n while (cursor && !done.has(cursor)) {\n if (visiting.has(cursor)) {\n issues.push(\n issue(\"tree_cycle\", \"A cyclic parent reference is detached to a root.\", {\n rowKey: cursor.row.key,\n }),\n );\n cursor.parent = undefined;\n break;\n }\n visiting.add(cursor);\n path.push(cursor);\n cursor = cursor.parent;\n }\n for (let i = path.length - 1; i >= 0; i--) {\n const current = path[i]!;\n done.add(current);\n }\n }\n for (const node of nodes) node.children = [];\n for (const node of nodes) if (node.parent) node.parent.children.push(node);\n const pending = nodes.filter((node) => !node.parent);\n while (pending.length) {\n const node = pending.pop()!;\n node.depth = node.parent ? node.parent.depth + 1 : 0;\n if (node.depth > maxDepth) {\n node.parent = undefined;\n node.depth = 0;\n issues.push(\n issue(\n \"tree_depth_exceeded\",\n \"The maximum tree depth was exceeded; this row recovers as a root.\",\n { rowKey: node.row.key },\n ),\n );\n }\n for (const child of node.children) pending.push(child);\n }\n for (const node of nodes)\n node.children = node.children.filter((child) => child.parent === node);\n }\n return {\n nodes,\n rows: nodes.map((node) => node.row),\n roots: nodes.filter((node) => !node.parent),\n byKey,\n issues,\n };\n}\n\nexport interface ProcessedTree<TRow> {\n readonly model: TreeModel<TRow>;\n readonly roots: readonly TreeNode<TRow>[];\n readonly children: ReadonlyMap<TreeNode<TRow>, readonly TreeNode<TRow>[]>;\n readonly autoExpanded: ReadonlySet<RowKey>;\n}\n\nexport function processTree<TRow>(\n model: TreeModel<TRow>,\n columns: readonly TableColumn<TRow>[],\n state: TableState,\n mode: TreeFilter,\n manual: boolean,\n): ProcessedTree<TRow> {\n const raw = model.nodes.map((node) => node.row);\n const matched = manual ? raw : filterRows(raw, columns, state.search, state.filters);\n const active = matched !== raw;\n const included = new Set(matched.map((row) => row.key));\n const autoExpanded = new Set<RowKey>();\n if (active && mode !== \"strict\") {\n if (mode === \"descendants\") {\n const stack = matched.map((row) => model.byKey.get(row.key)!);\n const visited = new Set<RowKey>();\n while (stack.length) {\n const node = stack.pop()!;\n if (visited.has(node.row.key)) continue;\n visited.add(node.row.key);\n included.add(node.row.key);\n if (node.children.length) autoExpanded.add(node.row.key);\n for (const child of node.children) stack.push(child);\n }\n }\n for (const row of matched) {\n let parent = model.byKey.get(row.key)!.parent;\n while (parent && !autoExpanded.has(parent.row.key)) {\n included.add(parent.row.key);\n autoExpanded.add(parent.row.key);\n parent = parent.parent;\n }\n }\n }\n if (active && mode === \"strict\") {\n const leaves = model.nodes.filter(\n (node) => included.has(node.row.key) && node.children.length === 0 && !node.unloaded,\n );\n return { model, roots: ordered(leaves), children: new Map(), autoExpanded };\n }\n const children = new Map<TreeNode<TRow>, readonly TreeNode<TRow>[]>();\n for (const node of model.nodes)\n if (node.children.length)\n children.set(node, ordered(node.children.filter((child) => included.has(child.row.key))));\n return {\n model,\n roots: ordered(model.roots.filter((node) => included.has(node.row.key))),\n children,\n autoExpanded,\n };\n\n function ordered(nodes: readonly TreeNode<TRow>[]): readonly TreeNode<TRow>[] {\n if (manual || !state.sorting.length || nodes.length < 2) return nodes;\n return sortRows(\n nodes.map((node) => node.row),\n columns,\n state.sorting,\n ).map((row) => model.byKey.get(row.key)!);\n }\n}\n\n/** Expansion changes reuse filtering and sibling order, splicing only a changed subtree. */\nexport function createTreeFlattener<TRow>(): (\n tree: ProcessedTree<TRow>,\n expanded: ExpandedState,\n ancestors: ReadonlySet<RowKey>,\n) => readonly TreeNode<TRow>[] {\n let previous: ProcessedTree<TRow> | undefined;\n let previousExpanded: ExpandedState = [];\n let visible: readonly TreeNode<TRow>[] = [];\n let previousAncestors: ReadonlySet<RowKey> | undefined;\n return (tree, expanded, ancestors) => {\n if (tree === previous && expanded === previousExpanded && ancestors === previousAncestors)\n return visible;\n const keys = expanded === true ? undefined : new Set(expanded);\n const open = (node: TreeNode<TRow>): boolean =>\n expanded === true ||\n (keys?.has(node.row.key) ?? false) ||\n ancestors.has(node.row.key) ||\n tree.autoExpanded.has(node.row.key);\n const walk = (roots: readonly TreeNode<TRow>[]): TreeNode<TRow>[] => {\n const output: TreeNode<TRow>[] = [];\n const stack = [...roots].reverse();\n while (stack.length) {\n const node = stack.pop()!;\n output.push(node);\n if (open(node)) {\n const children = tree.children.get(node) ?? [];\n for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]!);\n }\n }\n return output;\n };\n let changed: RowKey[] | undefined;\n if (\n previous === tree &&\n ancestors === previousAncestors &&\n expanded !== true &&\n previousExpanded !== true\n ) {\n const before = new Set(previousExpanded);\n const after = new Set(expanded);\n changed = [\n ...previousExpanded.filter((key) => !after.has(key)),\n ...expanded.filter((key) => !before.has(key)),\n ];\n }\n if (changed?.length === 1 && !tree.autoExpanded.has(changed[0]!)) {\n const index = visible.findIndex((node) => node.row.key === changed[0]);\n if (index >= 0) {\n const node = visible[index]!;\n let end = index + 1;\n while (end < visible.length && visible[end]!.depth > node.depth) end++;\n const inserted = walk(open(node) ? (tree.children.get(node) ?? []) : []);\n visible = visible.slice(0, index + 1).concat(inserted, visible.slice(end));\n }\n } else visible = walk(tree.roots);\n previous = tree;\n previousExpanded = expanded;\n previousAncestors = ancestors;\n return visible;\n };\n}\n","import { resolveColumn, type ColumnDef, type TableColumn } from \"./column\";\nimport { escapeFormula, readDelimited, toDelimited } from \"./delimited\";\nimport { createEditValidation } from \"./edit-validation\";\nimport { rangeContains, type CellPosition, type CellRange } from \"./grid\";\nimport { issue, type TableIssue } from \"./issues\";\nimport type { DeepKeys } from \"./path\";\nimport { getPath, isSafePath } from \"./path\";\nimport {\n createPendingChanges,\n type InsertPosition,\n type PendingChanges,\n type RowChange,\n} from \"./pending-changes\";\nimport {\n clampPage,\n countPages,\n filterRows,\n paginateRows,\n sortRows,\n mergeRows,\n type PageItem,\n paginationItems,\n} from \"./pipeline\";\nimport { createRow, getRowItemKey, type TableRow, type TableRenderItem } from \"./row\";\nimport { appendList, mapList } from \"./row-list\";\nimport {\n DEFAULT_PAGE_SIZE,\n createInitialState,\n mergeState,\n type RowKey,\n type ExpandedState,\n type SortDirection,\n type TableState,\n type TableStatePatch,\n} from \"./state\";\nimport {\n createStream,\n type DataIngestionResult,\n type LoadState,\n type StreamOptions,\n type StreamResult,\n} from \"./stream\";\nimport {\n buildTree,\n processTree,\n createTreeFlattener,\n type TreeOptions,\n type TreeLoadSignal,\n type TreeLoadController,\n type TreeModel,\n type TreeNode,\n type ChildStatus,\n} from \"./tree\";\nimport { createUndoStack } from \"./undo-stack\";\nimport type { PendingCell, ValidationResult } from \"./validation\";\n\nexport type SelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type ExpandMode = \"single\" | \"multiple\";\n\n/** Which rows \"select all\" covers: the current page, or every row that passes the filters. */\nexport type SelectScope = \"page\" | \"all\";\n\nexport interface PasteLimit {\n /** Maximum fields examined per paste, including clipped columns. Defaults to 100,000. */\n readonly maxCells?: number | undefined;\n /** Maximum UTF-16 code units examined per paste. Defaults to 5,000,000. */\n readonly maxLength?: number | undefined;\n}\n\nexport interface TableOptions<\n TRow,\n TSignal extends TreeLoadSignal = TreeLoadSignal,\n> extends TreeOptions<TRow, TSignal> {\n readonly data: readonly TRow[];\n readonly columns: readonly ColumnDef<TRow>[];\n /**\n * How to identify a row: a path into it, or a function. Defaults to `id` when rows have one and\n * to the row's position otherwise.\n */\n readonly rowKey?: DeepKeys<TRow> | ((row: TRow, index: number) => RowKey) | undefined;\n readonly initialState?: TableStatePatch | undefined;\n /** Present all processed rows rather than a page. Defaults to true. */\n readonly paginate?: boolean | undefined;\n readonly getRowCanExpand?: ((row: TRow) => boolean) | undefined;\n readonly expandMode?: ExpandMode | undefined;\n /** Defaults to `\"multiple\"`. */\n readonly selectionMode?: SelectionMode | undefined;\n /** Defaults to `\"all\"`. */\n readonly selectScope?: SelectScope | undefined;\n /**\n * The data is one page that a server has already searched, filtered, sorted, and paginated\n * with the current state. The table only presents it; `rowCount` gives the total.\n */\n readonly manual?: boolean | undefined;\n /** The total number of rows across all pages, for `manual` tables. */\n readonly rowCount?: number | undefined;\n /** Caller-owned source hint, independent of filtering and pagination. */\n readonly expectedRowCount?: number | undefined;\n /** Called after every state change a table operation makes, not after `setState`. */\n readonly onStateChange?: ((state: TableState, previous: TableState) => void) | undefined;\n /** Called with new data after edits or ingestion; ingestion has an empty cell-change list. */\n readonly onDataChange?:\n | ((data: readonly TRow[], changes: readonly CellChange<TRow>[]) => void)\n | undefined;\n /** Called with the reasons whenever an edit, a paste, or a clear refuses some cells. */\n readonly onEditIssues?: ((issues: readonly TableIssue[]) => void) | undefined;\n /** The most edit batches `undo` can reach. Defaults to 100. */\n readonly historyLimit?: number | undefined;\n /** Bound clipboard parsing. Only complete cells inside the visible grid are applied. */\n readonly pasteLimit?: PasteLimit | undefined;\n readonly validateRow?:\n | ((next: TRow, previous: TRow) => ValidationResult | Promise<ValidationResult>)\n | undefined;\n readonly asyncValidation?: \"held\" | \"optimistic\" | undefined;\n readonly createRow?: (() => TRow) | undefined;\n /** Immutable inverse of getParentKey for inserting adjacency children. */\n readonly setParentKey?: ((row: TRow, parent: RowKey | undefined) => TRow) | undefined;\n}\n\nexport type SelectionCoverage = \"none\" | \"some\" | \"all\";\n\nexport interface SortInfo {\n readonly direction: SortDirection;\n /** 0 for the first rule, 1 for the next, and so on. */\n readonly priority: number;\n}\n\n/**\n * Everything a renderer needs, computed from the data, the columns, and the state. A snapshot is\n * frozen and replaced on each change, so comparing snapshots by identity detects a change.\n */\nexport interface TableSnapshot<TRow> {\n readonly loadState: LoadState;\n readonly loadedRowCount: number;\n readonly expectedRowCount: number | undefined;\n readonly state: TableState;\n /** Visible columns in display order. */\n readonly columns: readonly TableColumn<TRow>[];\n /** Every column in display order, hidden ones included. */\n readonly allColumns: readonly TableColumn<TRow>[];\n /** Rows on the current page, or all processed rows when pagination is disabled. */\n readonly rows: readonly TableRow<TRow>[];\n /** Data rows followed by their open details; details do not affect pagination or grid positions. */\n readonly renderItems: readonly TableRenderItem<TRow>[];\n readonly paginate: boolean;\n /** Rows on every page, filtered and sorted. For `manual` tables this is the current page. */\n readonly processedRows: readonly TableRow<TRow>[];\n /** The current page, clamped into range. */\n readonly page: number;\n readonly pageSize: number;\n readonly pageCount: number;\n /** Rows that pass the search and filters. */\n readonly rowCount: number;\n /** Rows before searching and filtering. */\n readonly totalRowCount: number;\n /** The 1-based position of the first row on this page, or 0 when there are no rows. */\n readonly pageStart: number;\n /** The 1-based position of the last row on this page, or 0 when there are no rows. */\n readonly pageEnd: number;\n readonly pageItems: readonly PageItem[];\n readonly canPreviousPage: boolean;\n readonly canNextPage: boolean;\n readonly selectionMode: SelectionMode;\n readonly selectedCount: number;\n /** How much of the current page is selected. */\n readonly pageSelection: SelectionCoverage;\n /** How much of the select-all scope is selected. */\n readonly allSelection: SelectionCoverage;\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n readonly issues: readonly TableIssue[];\n readonly pendingCells: readonly PendingCell[];\n isSelected(key: RowKey): boolean;\n getSort(columnId: string): SortInfo | undefined;\n getColumn(columnId: string): TableColumn<TRow> | undefined;\n getRow(key: RowKey): TableRow<TRow> | undefined;\n}\n\n/** An edit given as a value of the column's type. */\nexport interface CellValueEdit {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly value: unknown;\n}\n\n/** An edit given as text, read by the column's `parse`, as typed or pasted. */\nexport interface CellInputEdit {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly input: string;\n}\n\nexport type CellEdit = CellValueEdit | CellInputEdit;\n\n/** Optional identity checks for a batch prepared from an earlier row snapshot. */\nexport interface EditOptions<TRow> {\n readonly expectedRows?: ReadonlyMap<RowKey, TRow> | undefined;\n}\n\nexport interface CellChange<TRow> {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly previous: unknown;\n readonly value: unknown;\n /** The row after the change. */\n readonly row: TRow;\n}\n\nexport type EditStatus = \"applied\" | \"partial\" | \"rejected\" | \"unchanged\" | \"pending\";\n\n/**\n * The outcome of a batch of edits. `partial` means some edits applied and others were refused;\n * each refusal is in `issues`.\n */\nexport interface EditResult<TRow> {\n readonly status: EditStatus;\n readonly changes: readonly CellChange<TRow>[];\n readonly issues: readonly TableIssue[];\n readonly rowChanges: readonly RowChange<TRow>[];\n readonly pendingCells: readonly PendingCell[];\n /** Present on pending batches; resolves to their final outcome, including superseded cells. */\n readonly completion?: Promise<EditResult<TRow>> | undefined;\n}\n\nexport interface CopyOptions {\n /** Prefix formula-like text with an apostrophe. Defaults to false for clipboard copies. */\n readonly escapeFormulas?: boolean | undefined;\n}\n\nexport interface ExportOptions extends CopyOptions {\n /** Prepend a numeric Depth column for hierarchical exports. */\n readonly depth?: boolean | undefined;\n /** Prefix the first data column with this text repeated per level. */\n readonly indent?: string | undefined;\n /** Prefix formula-like text with an apostrophe. Defaults to true for exports. */\n readonly escapeFormulas?: boolean | undefined;\n /** Defaults to `\"csv\"`. */\n readonly format?: \"csv\" | \"tsv\" | undefined;\n /** Column ids to export. Defaults to the visible columns. */\n readonly columns?: readonly string[] | undefined;\n /** Export only the current page. Defaults to every filtered row. */\n readonly pageOnly?: boolean | undefined;\n /** Defaults to `true`. */\n readonly headers?: boolean | undefined;\n}\n\n/**\n * A data table: data, columns, and state, with named operations to change them. It knows nothing\n * about rendering; a framework binding subscribes to it and draws each snapshot.\n */\nexport interface DataTable<TRow> {\n appendData(rows: readonly TRow[]): DataIngestionResult;\n upsertData(rows: readonly TRow[]): DataIngestionResult;\n removeData(keys: readonly RowKey[]): DataIngestionResult;\n stream(\n source: AsyncIterable<readonly TRow[] | TRow>,\n options?: StreamOptions,\n ): Promise<StreamResult>;\n insertRows(rows?: readonly TRow[], at?: InsertPosition): EditResult<TRow>;\n removeRows(keys: readonly RowKey[]): EditResult<TRow>;\n getPendingChanges(): PendingChanges<TRow>;\n markSaved(keys?: readonly RowKey[]): void;\n revert(keys?: readonly RowKey[]): EditResult<TRow>;\n getSnapshot(): TableSnapshot<TRow>;\n getState(): TableState;\n /** Called after every change with the new snapshot. Returns the unsubscribe function. */\n subscribe(listener: (snapshot: TableSnapshot<TRow>) => void): () => void;\n\n /** Replace part of the state from outside, without calling `onStateChange`. */\n setState(patch: TableStatePatch): void;\n /** Replace the data. The undo stack is cleared unless the data is the table's own. */\n setData(data: readonly TRow[]): void;\n setColumns(columns: readonly ColumnDef<TRow>[]): void;\n /** Update the total row count of a `manual` table. */\n setRowCount(rowCount: number): void;\n\n /** Cycle a column through ascending, descending, and unsorted. */\n toggleSort(columnId: string, options?: { readonly multi?: boolean | undefined }): void;\n /** Sort by one column, or clear it with `undefined`. */\n sort(\n columnId: string,\n direction: SortDirection | undefined,\n options?: { readonly multi?: boolean | undefined },\n ): void;\n clearSorting(): void;\n search(text: string): void;\n /** Set a column's filter value; an empty value removes the filter. */\n filter(columnId: string, value: unknown): void;\n clearFilters(): void;\n\n goToPage(page: number): void;\n nextPage(): void;\n previousPage(): void;\n /** Change the page size, keeping the first row of the current page in view. */\n setPageSize(pageSize: number): void;\n\n select(keys: readonly RowKey[]): void;\n deselect(keys: readonly RowKey[]): void;\n toggleRow(key: RowKey, selected?: boolean): void;\n /** Select every row in the scope, or clear them when all are already selected. */\n toggleAll(scope?: SelectScope): void;\n clearSelection(): void;\n /** The selected rows that are present in the data. */\n getSelectedRows(): readonly TableRow<TRow>[];\n\n toggleExpanded(key: RowKey, expanded?: boolean): void;\n expandAll(): void;\n collapseAll(): void;\n\n toggleColumn(columnId: string, visible?: boolean): void;\n moveColumn(columnId: string, toIndex: number): void;\n\n edit(edits: CellEdit | readonly CellEdit[], options?: EditOptions<TRow>): EditResult<TRow>;\n undo(): boolean;\n redo(): boolean;\n /** The text of a range of shown cells, tab-separated like a spreadsheet clipboard. */\n copy(range: CellRange, options?: CopyOptions): string;\n /** Paste tab-separated text with its top-left cell at `origin`, clipped to the grid. */\n paste(origin: CellPosition, text: string): EditResult<TRow>;\n /** Empty every editable cell in a range. */\n clear(range: CellRange): EditResult<TRow>;\n exportRows(options?: ExportOptions): string;\n\n /** Return to the initial state. */\n reset(): void;\n /** Drop every listener. */\n destroy(): void;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction memo<TDeps extends readonly unknown[], TResult>(\n compute: (...deps: TDeps) => TResult,\n): (...deps: TDeps) => TResult {\n let last: { readonly deps: TDeps; readonly result: TResult } | undefined;\n return (...deps: TDeps): TResult => {\n if (\n last &&\n last.deps.length === deps.length &&\n last.deps.every((d, i) => Object.is(d, deps[i]))\n ) {\n return last.result;\n }\n const result = compute(...deps);\n last = { deps, result };\n return result;\n };\n}\n\nfunction isInputEdit(edit: CellEdit): edit is CellInputEdit {\n return \"input\" in edit;\n}\n\nfunction coverage(selected: number, total: number): SelectionCoverage {\n if (selected === 0 || total === 0) {\n return \"none\";\n }\n return selected === total ? \"all\" : \"some\";\n}\n\ninterface IndexedRows<TRow> {\n readonly rows: readonly TableRow<TRow>[];\n readonly byKey: Map<RowKey, TableRow<TRow>>;\n readonly issues: readonly TableIssue[];\n}\n\ninterface RowScene<TRow> {\n readonly data: readonly TRow[];\n readonly lazy: ReadonlyMap<RowKey, readonly TRow[]>;\n}\ntype EditHistory<TRow> =\n | { readonly kind: \"cells\"; readonly changes: readonly CellChange<TRow>[] }\n | {\n readonly kind: \"rows\";\n readonly before: RowScene<TRow>;\n readonly after: RowScene<TRow>;\n readonly keys: readonly RowKey[];\n };\n\nfunction pasteLimit(\n value: number | undefined,\n fallback: number,\n name: string,\n issues: TableIssue[],\n): number {\n if (value === undefined) {\n return fallback;\n }\n if (Number.isSafeInteger(value) && value > 0) {\n return value;\n }\n issues.push(\n issue(\n \"invalid_paste_limit\",\n `Paste ${name} ${String(value)} is not a positive safe integer; ${fallback} is used.`,\n ),\n );\n return fallback;\n}\n\n/** Create a data table. */\nexport function createTable<TRow, TSignal extends TreeLoadSignal = TreeLoadSignal>(\n options: TableOptions<TRow, TSignal>,\n): DataTable<TRow> {\n const paginate = options.paginate ?? true;\n const expandMode = options.expandMode ?? \"multiple\";\n const selectionMode = options.selectionMode ?? \"multiple\";\n const selectScope = options.selectScope ?? \"all\";\n const manual = options.manual ?? false;\n const treeEnabled = Boolean(\n options.getChildren || options.getParentKey || options.hasChildren || options.loadChildren,\n );\n const rootPagination = treeEnabled && (manual || (options.paginateBy ?? \"root\") === \"root\");\n let lazyVersion = 0;\n const lazyChildren = new Map<RowKey, readonly TRow[]>();\n const childStatuses = new Map<RowKey, ChildStatus>();\n const loadIssues = new Map<RowKey, TableIssue>();\n const loadValidationIssues = new Map<RowKey, readonly TableIssue[]>();\n const pendingLoads = new Map<RowKey, TreeLoadController<TSignal>>();\n let destroyed = false;\n const undoStack = createUndoStack<EditHistory<TRow>>(options.historyLimit);\n const pendingChanges = createPendingChanges<TRow>();\n const listeners = new Set<(snapshot: TableSnapshot<TRow>) => void>();\n const optionIssues: TableIssue[] = [];\n const maxPasteCells = pasteLimit(options.pasteLimit?.maxCells, 100_000, \"maxCells\", optionIssues);\n const maxPasteLength = pasteLimit(\n options.pasteLimit?.maxLength,\n 5_000_000,\n \"maxLength\",\n optionIssues,\n );\n const sourceExpected =\n options.expectedRowCount === undefined ||\n (Number.isSafeInteger(options.expectedRowCount) && options.expectedRowCount >= 0)\n ? options.expectedRowCount\n : undefined;\n if (sourceExpected !== options.expectedRowCount)\n optionIssues.push(\n issue(\n \"invalid_stream_option\",\n \"expectedRowCount must be a non-negative safe integer; it is unknown instead.\",\n ),\n );\n\n let data = options.data;\n let definitions = options.columns;\n let rowCount = options.rowCount;\n let expandedIssue: TableIssue | undefined;\n let initialState = createInitialState(\n {\n ...options.initialState,\n hiddenColumns:\n options.initialState?.hiddenColumns ??\n options.columns.filter((column) => column.hidden === true).map((column) => column.id),\n },\n (problem) => {\n expandedIssue = problem;\n },\n );\n let state = initialState;\n let snapshot: TableSnapshot<TRow> | undefined;\n let loadState: LoadState = \"idle\";\n let expectedRowCount = sourceExpected;\n let ingestionIssues: readonly TableIssue[] = [];\n let streamIssues: readonly TableIssue[] = [];\n const streaming = createStream<TRow>({\n ingest: (rows, mode) => ingestData(rows, mode),\n update(next, expected, problems, publish) {\n loadState = next;\n expectedRowCount = expected;\n streamIssues = [...problems];\n if (publish) notify();\n },\n });\n let transaction = false;\n let deferValidationNotify = false;\n let validationNotifyRequested = false;\n const validation = createEditValidation<TRow>({\n snapshot: getSnapshot,\n apply: applyChanges,\n notify,\n writeIssue(row, next) {\n const node = treeEnabled\n ? treeStage(data, resolveColumns(definitions).byId, lazyVersion).byKey.get(row.key)\n : undefined;\n if (node && (!node.writable || (node.parent && options.getChildren && !options.setChildren)))\n return issue(\"read_only_cell\", \"This nested row has no immutable writable source path.\", {\n rowKey: row.key,\n });\n if (readKey(next, row.index) !== readKey(row.original, row.index))\n return issue(\n \"invalid_row_operation\",\n \"Editing a row key is not supported; remove and insert the row instead.\",\n { rowKey: row.key },\n );\n return undefined;\n },\n batch(run) {\n deferValidationNotify = true;\n validationNotifyRequested = false;\n try {\n return run();\n } finally {\n deferValidationNotify = false;\n if (validationNotifyRequested) notify();\n }\n },\n record: (changes) => undoStack.record({ kind: \"cells\", changes }),\n onIssues: (issues) => options.onEditIssues?.(issues),\n optimistic: options.asyncValidation === \"optimistic\",\n validateRow: options.validateRow,\n });\n\n const readKey = (row: TRow, index: number): RowKey => {\n const { rowKey } = options;\n if (typeof rowKey === \"function\") {\n return rowKey(row, index);\n }\n const path = rowKey ?? \"id\";\n const value = getPath(row, path);\n if (typeof value === \"string\" || typeof value === \"number\") {\n return value;\n }\n return rowKey === undefined || !isRecord(row) ? index : String(value);\n };\n\n const resolveColumns = memo((defs: readonly ColumnDef<TRow>[]) => {\n const issues: TableIssue[] = [];\n const columns = defs.flatMap((definition) => {\n if (!isSafePath(definition.id)) {\n issues.push(\n issue(\n \"unsafe_path\",\n `The column \"${definition.id}\" addresses a prototype and is ignored.`,\n { column: definition.id },\n ),\n );\n return [];\n }\n return [resolveColumn(definition)];\n });\n return { columns, byId: new Map(columns.map((column) => [column.id, column])), issues };\n });\n\n let primedIndex:\n | {\n data: readonly TRow[];\n columns: ReadonlyMap<string, TableColumn<TRow>>;\n result: IndexedRows<TRow>;\n }\n | undefined;\n const indexRows = memo(\n (rows: readonly TRow[], byId: ReadonlyMap<string, TableColumn<TRow>>): IndexedRows<TRow> => {\n if (primedIndex?.data === rows && primedIndex.columns === byId) return primedIndex.result;\n const byKey = new Map<RowKey, TableRow<TRow>>();\n const issues: TableIssue[] = [];\n const indexed = rows.map((original, index) => {\n let key = readKey(original, index);\n if (byKey.has(key)) {\n issues.push(\n issue(\n \"duplicate_row_key\",\n `Row ${index} repeats the key \"${String(key)}\"; it is keyed \"${String(key)}#${index}\" instead.`,\n { rowKey: key },\n ),\n );\n key = `${String(key)}#${index}`;\n }\n const row = createRow(\n original,\n key,\n index,\n byId,\n options.getRowCanExpand?.(original) ?? false,\n );\n byKey.set(key, row);\n return row;\n });\n stableSource.set(rows, stableRows(rows));\n return { rows: indexed, byKey, issues };\n },\n );\n\n const treeStage = memo(\n (rows: readonly TRow[], byId: ReadonlyMap<string, TableColumn<TRow>>, _version: number) =>\n buildTree(rows, byId, readKey, options, lazyChildren),\n );\n const treeIndex = memo(\n (model: TreeModel<TRow>): IndexedRows<TRow> => ({\n rows: model.rows,\n byKey: new Map(model.rows.map((row) => [row.key, row])),\n issues: model.issues,\n }),\n );\n const treePositions = memo((model: TreeModel<TRow>) => {\n const result = new Map<RowKey, InsertPosition>();\n const index = (siblings: readonly TreeNode<TRow>[], parent?: RowKey): void => {\n siblings.forEach((node, position) =>\n result.set(\n node.row.key,\n Object.freeze({ parent, before: siblings[position + 1]?.row.key }),\n ),\n );\n };\n index(model.roots);\n for (const node of model.nodes) index(node.children, node.row.key);\n return result;\n });\n const processedTreeStage = memo(\n (\n model: TreeModel<TRow>,\n columns: readonly TableColumn<TRow>[],\n search: string,\n filters: TableState[\"filters\"],\n sorting: TableState[\"sorting\"],\n ) =>\n processTree(\n model,\n columns,\n { ...state, search, filters, sorting },\n options.treeFilter ?? \"ancestors\",\n manual,\n ),\n );\n const flattenTree = createTreeFlattener<TRow>();\n const emptyAncestors = new Set<RowKey>();\n const singleTreePath = memo((model: TreeModel<TRow>, expanded: ExpandedState) => {\n const ancestors = new Set<RowKey>();\n if (expanded !== true) {\n for (const key of expanded) {\n let parent = model.byKey.get(key)?.parent;\n while (parent && !ancestors.has(parent.row.key)) {\n ancestors.add(parent.row.key);\n parent = parent.parent;\n }\n }\n }\n return ancestors;\n });\n const treeSelection = memo((model: TreeModel<TRow>, selection: readonly RowKey[]) => {\n const selected = new Set(selection);\n const counts = new Map<TreeNode<TRow>, { selected: number; total: number }>();\n const stack = model.roots.map((node) => ({ node, exit: false }));\n while (stack.length) {\n const { node, exit } = stack.pop()!;\n if (!exit) {\n stack.push({ node, exit: true });\n for (const child of node.children) stack.push({ node: child, exit: false });\n } else {\n let count = selected.has(node.row.key) ? 1 : 0;\n let total = 1;\n for (const child of node.children) {\n const value = counts.get(child)!;\n count += value.selected;\n total += value.total;\n }\n counts.set(node, { selected: count, total });\n }\n }\n return counts;\n });\n\n const orderColumns = memo(\n (\n columns: readonly TableColumn<TRow>[],\n columnOrder: readonly string[],\n hiddenColumns: readonly string[],\n ) => {\n const position = new Map(columnOrder.map((id, index) => [id, index]));\n const ordered = columns\n .map((column, index) => ({ column, index }))\n .toSorted((left, right) => {\n const leftPosition = position.get(left.column.id) ?? columnOrder.length + left.index;\n const rightPosition = position.get(right.column.id) ?? columnOrder.length + right.index;\n return leftPosition - rightPosition;\n })\n .map(({ column }) => column);\n const hidden = new Set(hiddenColumns);\n return { all: ordered, visible: ordered.filter((column) => !hidden.has(column.id)) };\n },\n );\n\n let primedFilter:\n | {\n rows: readonly TableRow<TRow>[];\n columns: readonly TableColumn<TRow>[];\n search: string;\n filters: TableState[\"filters\"];\n result: readonly TableRow<TRow>[];\n }\n | undefined;\n let primedSort:\n | {\n rows: readonly TableRow<TRow>[];\n columns: readonly TableColumn<TRow>[];\n sorting: TableState[\"sorting\"];\n result: readonly TableRow<TRow>[];\n }\n | undefined;\n const filterStage = memo(\n (\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n search: string,\n filters: TableState[\"filters\"],\n ) =>\n primedFilter?.rows === rows &&\n primedFilter.columns === columns &&\n primedFilter.search === search &&\n primedFilter.filters === filters\n ? primedFilter.result\n : filterRows(rows, columns, search, filters),\n );\n const sortStage = memo(\n (\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n sorting: TableState[\"sorting\"],\n ) =>\n primedSort?.rows === rows && primedSort.columns === columns && primedSort.sorting === sorting\n ? primedSort.result\n : sortRows(rows, columns, sorting),\n );\n const rowMembership = new WeakMap<readonly TableRow<TRow>[], Set<RowKey>>();\n function membership(rows: readonly TableRow<TRow>[]): Set<RowKey> {\n let keys = rowMembership.get(rows);\n if (!keys) {\n keys = new Set(rows.map((row) => row.key));\n rowMembership.set(rows, keys);\n }\n return keys;\n }\n const selectedSet = memo((selection: readonly RowKey[]) => new Set(selection));\n const expansionStage = memo(\n (indexed: IndexedRows<TRow>, expanded: ExpandedState, selection: readonly RowKey[]) => {\n const keys = expanded === true ? undefined : new Set(expanded);\n const selected = new Set(selection);\n const rows = mapList(indexed.rows, (row) => {\n const isExpanded = row.canExpand && (expanded === true || (keys?.has(row.key) ?? false));\n return isExpanded || selected.has(row.key)\n ? Object.freeze({\n ...row,\n isExpanded,\n selection: selected.has(row.key) ? (\"all\" as const) : (\"none\" as const),\n })\n : row;\n });\n const byKey = {\n get(key: RowKey): TableRow<TRow> | undefined {\n const row = indexed.byKey.get(key);\n return row && row.index < rows.length ? rows[row.index] : undefined;\n },\n };\n return { rows, byKey };\n },\n );\n const expandedOrder = memo(\n (rows: readonly TableRow<TRow>[], byKey: { get(key: RowKey): TableRow<TRow> | undefined }) =>\n mapList(rows, (row) => byKey.get(row.key)!),\n );\n\n function stateIssues(byId: ReadonlyMap<string, TableColumn<TRow>>): TableIssue[] {\n const issues: TableIssue[] = [];\n if (expandedIssue) issues.push(expandedIssue);\n const referenced = new Set([\n ...state.sorting.map((rule) => rule.column),\n ...Object.keys(state.filters),\n ...state.hiddenColumns,\n ...state.columnOrder,\n ]);\n for (const id of referenced) {\n if (!byId.has(id)) {\n issues.push(\n issue(\"unknown_column\", `The state refers to a column \"${id}\" that is not defined.`, {\n column: id,\n }),\n );\n }\n }\n const { pageSize } = state.pagination;\n if (paginate && (!Number.isInteger(pageSize) || pageSize < 1)) {\n issues.push(\n issue(\n \"invalid_page_size\",\n `Page size ${String(pageSize)} is not a positive whole number; ${DEFAULT_PAGE_SIZE} is used.`,\n ),\n );\n }\n return issues;\n }\n\n function computeSnapshot(): TableSnapshot<TRow> {\n const cellProblems = validation.problems();\n const dirty = new Set(pendingChanges.entries.keys());\n const metadata = (row: TableRow<TRow>): TableRow<TRow> =>\n dirty.has(row.key) || cellProblems.has(row.key)\n ? Object.freeze({\n ...row,\n isDirty: dirty.has(row.key),\n cellIssues: cellProblems.get(row.key),\n })\n : row;\n const { columns, byId, issues: columnIssues } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n const indexed = model ? { rows: model.rows, issues: model.issues } : indexRows(data, byId);\n const expanded = model\n ? undefined\n : expansionStage(indexed as IndexedRows<TRow>, state.expanded, state.selection);\n const ordered = orderColumns(columns, state.columnOrder, state.hiddenColumns);\n const issues = [\n ...optionIssues,\n ...ingestionIssues,\n ...streamIssues,\n ...columnIssues,\n ...indexed.issues,\n ...stateIssues(byId),\n ...loadIssues.values(),\n ...Array.from(loadValidationIssues.values()).flat(),\n ...Array.from(cellProblems.values()).flatMap((row) => [...row.values()]),\n ];\n const requestedSize = state.pagination.pageSize;\n let pageSize =\n Number.isInteger(requestedSize) && requestedSize >= 1 ? requestedSize : DEFAULT_PAGE_SIZE;\n\n let processedRows: readonly TableRow<TRow>[];\n let rows: readonly TableRow<TRow>[];\n let filteredCount: number;\n let page: number;\n let pageCount: number;\n let treeRow: ((key: RowKey) => TableRow<TRow> | undefined) | undefined;\n let totalCount = indexed.rows.length;\n if (model) {\n const processed = processedTreeStage(\n model,\n columns,\n state.search,\n state.filters,\n state.sorting,\n );\n const ancestors =\n expandMode === \"single\" ? singleTreePath(model, state.expanded) : emptyAncestors;\n const visible = flattenTree(processed, state.expanded, ancestors);\n const expandedState = state.expanded;\n const keys = state.expanded === true ? undefined : new Set(state.expanded);\n const selected = treeSelection(model, state.selection);\n const projected = new Map<RowKey, TableRow<TRow>>();\n const statuses = new Map(childStatuses);\n treeRow = (key) => {\n const cached = projected.get(key);\n if (cached) return cached;\n const node = model.byKey.get(key);\n if (!node) return undefined;\n const status =\n statuses.get(key) ?? (node.children.length || !node.unloaded ? \"loaded\" : \"idle\");\n const count = selected.get(node)!;\n const canExpand =\n node.children.length > 0 ||\n status !== \"loaded\" ||\n (options.getRowCanExpand?.(node.row.original) ?? false);\n const result = Object.freeze({\n ...node.row,\n isDirty: dirty.has(key),\n cellIssues: cellProblems.get(key),\n depth: node.depth,\n parentKey: node.parent?.row.key,\n childCount: status === \"loaded\" ? node.children.length : undefined,\n childStatus: status,\n canExpand,\n isExpanded:\n canExpand &&\n (expandedState === true ||\n (keys?.has(key) ?? false) ||\n ancestors.has(key) ||\n processed.autoExpanded.has(key)),\n selection: coverage(count.selected, count.total),\n });\n projected.set(key, result);\n return result;\n };\n processedRows = visible.map((node) => treeRow!(node.row.key)!);\n filteredCount = manual\n ? (rowCount ?? model.roots.length)\n : rootPagination\n ? processed.roots.length\n : visible.length;\n totalCount = rootPagination ? model.roots.length : model.nodes.length;\n pageCount = countPages(filteredCount, pageSize);\n page = clampPage(state.pagination.page, pageCount);\n if (manual) rows = processedRows;\n else if (rootPagination) {\n const roots = new Set(processed.roots.slice((page - 1) * pageSize, page * pageSize));\n const allRoots = new Set(processed.roots);\n let root: TreeNode<TRow> | undefined;\n rows = processedRows.filter((_row, index) => {\n const node = visible[index]!;\n if (allRoots.has(node)) root = node;\n return root !== undefined && roots.has(root);\n });\n } else rows = paginateRows(processedRows, { page, pageSize });\n } else if (manual) {\n processedRows = expanded!.rows;\n rows = expanded!.rows;\n filteredCount = rowCount ?? indexed.rows.length;\n pageCount = countPages(filteredCount, pageSize);\n page = clampPage(state.pagination.page, pageCount);\n } else {\n const filtered = filterStage(indexed.rows, columns, state.search, state.filters);\n processedRows = expandedOrder(sortStage(filtered, columns, state.sorting), expanded!.byKey);\n filteredCount = processedRows.length;\n pageCount = countPages(filteredCount, pageSize);\n page = clampPage(state.pagination.page, pageCount);\n rows = paginateRows(processedRows, { page, pageSize });\n }\n\n if (!paginate) {\n rows = processedRows;\n page = 1;\n pageCount = 1;\n pageSize = Math.max(1, rows.length);\n }\n const flatProjected = new Map<RowKey, TableRow<TRow>>();\n if (!model) {\n const project = (row: TableRow<TRow>): TableRow<TRow> => {\n let result = flatProjected.get(row.key);\n if (!result) {\n result = metadata(row);\n flatProjected.set(row.key, result);\n }\n return result;\n };\n const shared = rows === processedRows;\n processedRows = mapList(processedRows, project);\n rows = shared ? processedRows : rows.map(project);\n }\n\n const selected = selectedSet(state.selection);\n const allData = model ? model.byKey : (indexed as IndexedRows<TRow>).byKey;\n const allProcessedKeys = model\n ? undefined\n : manual\n ? undefined\n : membership(filterStage(indexed.rows, columns, state.search, state.filters));\n const selectedInProcessed = state.selection.filter(\n (key) => allData.has(key) && (!allProcessedKeys || allProcessedKeys.has(key)),\n ).length;\n const pageSelected =\n rows === processedRows\n ? selectedInProcessed\n : rows.filter((row) => selected.has(row.key)).length;\n const scopeRows = selectScope === \"page\" || manual ? rows : processedRows;\n const scopeSelected =\n scopeRows === rows\n ? pageSelected\n : model\n ? scopeRows.filter((row) => selected.has(row.key)).length\n : selectedInProcessed;\n const pageStart = rows.length === 0 ? 0 : (page - 1) * pageSize + 1;\n const sortIndex = new Map(\n state.sorting.map((rule, priority) => [rule.column, { direction: rule.direction, priority }]),\n );\n\n return Object.freeze({\n loadState,\n loadedRowCount: indexed.rows.length,\n expectedRowCount,\n state,\n columns: ordered.visible,\n allColumns: ordered.all,\n rows,\n renderItems:\n !model && state.expanded !== true && state.expanded.length === 0\n ? mapList(rows, (row, rowIndex) =>\n Object.freeze({ kind: \"row\" as const, key: getRowItemKey(row.key), row, rowIndex }),\n )\n : Object.freeze(\n rows.flatMap((row, rowIndex): TableRenderItem<TRow>[] => {\n const item = Object.freeze({\n kind: \"row\" as const,\n key: getRowItemKey(row.key),\n row,\n rowIndex,\n });\n return row.isExpanded &&\n (!model || (options.getRowCanExpand?.(row.original) ?? false))\n ? [\n item,\n Object.freeze({\n kind: \"detail\" as const,\n key: getRowItemKey(row.key, \"detail\"),\n row,\n rowIndex,\n }),\n ]\n : [item];\n }),\n ),\n paginate,\n processedRows,\n page,\n pageSize,\n pageCount,\n rowCount: filteredCount,\n totalRowCount: manual ? filteredCount : totalCount,\n pageStart,\n pageEnd:\n rows.length === 0\n ? 0\n : rootPagination\n ? Math.min(filteredCount, page * pageSize)\n : pageStart + rows.length - 1,\n pageItems: paginationItems(page, pageCount),\n canPreviousPage: page > 1,\n canNextPage: page < pageCount,\n selectionMode,\n selectedCount: model\n ? state.selection.filter((key) => model.byKey.has(key)).length\n : state.selection.length,\n pageSelection: coverage(pageSelected, rows.length),\n allSelection: coverage(scopeSelected, scopeRows.length),\n canUndo: undoStack.canUndo,\n canRedo: undoStack.canRedo,\n issues: Object.freeze(issues),\n pendingCells: validation.cells(),\n isSelected: (key: RowKey): boolean => selected.has(key),\n getSort: (columnId: string): SortInfo | undefined => sortIndex.get(columnId),\n getColumn: (columnId: string): TableColumn<TRow> | undefined => byId.get(columnId),\n getRow: (key: RowKey): TableRow<TRow> | undefined =>\n treeRow\n ? treeRow(key)\n : (flatProjected.get(key) ??\n (expanded!.byKey.get(key) ? metadata(expanded!.byKey.get(key)!) : undefined)),\n });\n }\n\n function getSnapshot(): TableSnapshot<TRow> {\n snapshot ??= computeSnapshot();\n return snapshot;\n }\n\n function notify(): void {\n snapshot = undefined;\n if (deferValidationNotify) {\n validationNotifyRequested = true;\n return;\n }\n if (transaction) return;\n if (listeners.size === 0) {\n return;\n }\n const next = getSnapshot();\n for (const listener of listeners) {\n listener(next);\n }\n }\n\n function abortLoads(all = false): void {\n for (const [key, controller] of pendingLoads) {\n const row = all ? undefined : getSnapshot().getRow(key);\n // Closing an ancestor also makes an in-flight descendant unnecessary.\n const visible =\n !all && getSnapshot().processedRows.some((candidate) => candidate.key === key);\n if (all || !row?.isExpanded || !visible) {\n pendingLoads.delete(key);\n childStatuses.delete(key);\n controller.abort();\n snapshot = undefined;\n }\n }\n }\n\n function requestChildren(row: TableRow<TRow>): void {\n if (\n !options.loadChildren ||\n destroyed ||\n pendingLoads.has(row.key) ||\n lazyChildren.has(row.key) ||\n row.childStatus === \"loaded\"\n )\n return;\n const key = row.key;\n if (!options.createChildLoadController) {\n childStatuses.set(key, \"error\");\n loadIssues.set(\n key,\n issue(\n \"invalid_tree_option\",\n \"Lazy children require createChildLoadController from the caller's runtime.\",\n { rowKey: key },\n ),\n );\n notify();\n return;\n }\n let controller: TreeLoadController<TSignal>;\n try {\n controller = options.createChildLoadController();\n } catch (error) {\n loadIssues.set(key, issue(\"tree_load_error\", String(error), { rowKey: key }));\n childStatuses.set(key, \"error\");\n notify();\n return;\n }\n pendingLoads.set(key, controller);\n childStatuses.set(key, \"loading\");\n loadIssues.delete(key);\n loadValidationIssues.delete(key);\n notify();\n // Promise scheduling catches synchronous loader failures as well as rejected loads.\n void Promise.resolve()\n .then(() => (controller.signal.aborted ? [] : options.loadChildren!(row, controller.signal)))\n .then((children) => {\n if (controller.signal.aborted || pendingLoads.get(key) !== controller || destroyed)\n return undefined;\n const { byId } = resolveColumns(definitions);\n const existing = treeStage(data, byId, lazyVersion);\n // Validate a loaded subtree against all existing keys, including collapsed rows.\n const candidate = buildTree(\n children,\n byId,\n readKey,\n { ...options, getParentKey: undefined },\n new Map(),\n );\n pendingLoads.delete(key);\n loadValidationIssues.set(\n key,\n candidate.issues.filter(\n (problem) => problem.code === \"tree_cycle\" || problem.code === \"tree_depth_exceeded\",\n ),\n );\n const collisions = candidate.nodes.filter((node) => existing.byKey.has(node.row.key));\n if (\n collisions.length ||\n candidate.issues.some((problem) => problem.code === \"duplicate_row_key\")\n ) {\n childStatuses.set(key, \"error\");\n loadIssues.set(\n key,\n issue(\n \"tree_duplicate_key\",\n \"Loaded children collide with existing keys; the batch is rejected.\",\n { rowKey: key },\n ),\n );\n } else {\n lazyChildren.set(key, children);\n childStatuses.set(key, \"loaded\");\n lazyVersion++;\n // A selected parent covers children as they arrive.\n if (state.selection.includes(key) && selectionMode === \"multiple\") {\n const nextModel = treeStage(data, byId, lazyVersion);\n applySelection([...state.selection, ...selectionKeys([key], nextModel)]);\n }\n }\n notify();\n startVisibleLoads();\n return undefined;\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted || pendingLoads.get(key) !== controller || destroyed) return;\n pendingLoads.delete(key);\n childStatuses.set(key, \"error\");\n loadIssues.set(\n key,\n issue(\"tree_load_error\", `Children could not be loaded: ${String(error)}`, {\n rowKey: key,\n }),\n );\n notify();\n });\n }\n\n function startVisibleLoads(): void {\n if (!treeEnabled || !options.loadChildren || destroyed) return;\n const current = getSnapshot();\n for (const row of current.rows)\n if (row.isExpanded && row.childStatus === \"idle\") requestChildren(row);\n }\n\n function selectionKeys(keys: readonly RowKey[], model?: TreeModel<TRow>): RowKey[] {\n if (!treeEnabled || selectionMode !== \"multiple\") return [...keys];\n model ??= treeStage(data, resolveColumns(definitions).byId, lazyVersion);\n const result = new Set(keys);\n const stack = keys.flatMap((key) => {\n const node = model.byKey.get(key);\n return node ? [node] : [];\n });\n const visited = new Set<RowKey>();\n while (stack.length) {\n const node = stack.pop()!;\n if (visited.has(node.row.key)) continue;\n visited.add(node.row.key);\n result.add(node.row.key);\n for (const child of node.children) stack.push(child);\n }\n return [...result];\n }\n\n /** Apply a change made by a table operation. */\n function commit(patch: TableStatePatch): void {\n const previous = state;\n const previousIssue = expandedIssue;\n const next = mergePatch(patch);\n if (next === previous && previousIssue === expandedIssue) {\n return;\n }\n state = next;\n snapshot = undefined;\n abortLoads();\n if (next !== previous) options.onStateChange?.(state, previous);\n notify();\n startVisibleLoads();\n }\n\n function canonicalExpanded(\n expanded: ExpandedState,\n candidate: TableState = state,\n ): ExpandedState {\n if (expandMode === \"multiple\") return expanded;\n if (expanded !== true) return expanded.slice(-1);\n const { columns, byId } = resolveColumns(definitions);\n if (treeEnabled) {\n const model = treeStage(data, byId, lazyVersion);\n const tree = processedTreeStage(\n model,\n columns,\n candidate.search,\n candidate.filters,\n candidate.sorting,\n );\n const first = tree.roots.find(\n (node) =>\n node.children.length > 0 ||\n (options.hasChildren?.(node.row.original) ?? false) ||\n (options.getRowCanExpand?.(node.row.original) ?? false),\n );\n return first ? [first.row.key] : [];\n }\n const indexed = indexRows(data, byId);\n const processed = manual\n ? indexed.rows\n : sortStage(\n filterStage(indexed.rows, columns, candidate.search, candidate.filters),\n columns,\n candidate.sorting,\n );\n const first = processed.find((row) => row.canExpand);\n return first ? [first.key] : [];\n }\n\n function mergePatch(patch: TableStatePatch): TableState {\n if (patch.expanded !== undefined) expandedIssue = undefined;\n const next = mergeState(state, patch, (problem) => {\n expandedIssue = problem;\n });\n return expandMode === \"single\" && patch.expanded !== undefined\n ? mergeState(state, { ...patch, expanded: canonicalExpanded(next.expanded, next) })\n : next;\n }\n\n const firstPage = (): { readonly page: number; readonly pageSize: number } => ({\n page: 1,\n pageSize: state.pagination.pageSize,\n });\n\n function setSort(columnId: string, direction: SortDirection | undefined, multi: boolean): void {\n const column = getSnapshot().getColumn(columnId);\n if (!column?.sortable) {\n return;\n }\n const others = multi ? state.sorting.filter((rule) => rule.column !== columnId) : [];\n const existing = state.sorting.findIndex((rule) => rule.column === columnId);\n let sorting = others;\n if (direction) {\n const rule = { column: columnId, direction };\n sorting =\n multi && existing !== -1\n ? state.sorting.map((current) => (current.column === columnId ? rule : current))\n : [...others, rule];\n }\n commit({ sorting, pagination: firstPage() });\n }\n\n function applySelection(next: readonly RowKey[]): void {\n if (selectionMode === \"none\") {\n return;\n }\n const unique = [...new Set(next)];\n const selection = selectionMode === \"single\" ? unique.slice(-1) : unique;\n const current = state.selection;\n if (selection.length === current.length && selection.every((key, i) => key === current[i])) {\n return;\n }\n commit({ selection });\n }\n\n function applyChanges(\n edits: readonly CellEdit[],\n record: boolean,\n recoveredIssues: readonly TableIssue[] = [],\n ): EditResult<TRow> {\n const current = getSnapshot();\n const working = [...data];\n const model = treeEnabled\n ? treeStage(data, resolveColumns(definitions).byId, lazyVersion)\n : undefined;\n const replacements = new Map<TreeNode<TRow>, TRow>();\n const cache = new Map(lazyChildren);\n const originalOf = (node: TreeNode<TRow>): TRow => replacements.get(node) ?? node.row.original;\n const issues: TableIssue[] = [...recoveredIssues];\n const changes: CellChange<TRow>[] = [];\n // A value from another row tells a column's type when the edited cell is empty. It is looked\n // up once per column, not once per edit, so pasting a large range stays linear.\n const samples = new Map<string, unknown>();\n const sampleOf = (columnId: string): unknown => {\n if (!samples.has(columnId)) {\n const other = current.processedRows.find((candidate) => {\n const value = candidate.getValue(columnId);\n return value !== null && value !== undefined;\n });\n samples.set(columnId, other?.getValue(columnId));\n }\n return samples.get(columnId);\n };\n for (const edit of edits) {\n const row = current.getRow(edit.rowKey);\n const column = current.getColumn(edit.column);\n if (!row) {\n issues.push(\n issue(\"unknown_row\", `No row has the key \"${String(edit.rowKey)}\".`, {\n rowKey: edit.rowKey,\n column: edit.column,\n }),\n );\n continue;\n }\n if (!isSafePath(edit.column)) {\n issues.push(\n issue(\n \"unsafe_path\",\n `The path \"${edit.column}\" addresses a prototype and cannot be written.`,\n { rowKey: edit.rowKey, column: edit.column },\n ),\n );\n continue;\n }\n if (!column) {\n issues.push(\n issue(\"unknown_column\", `No column has the id \"${edit.column}\".`, {\n rowKey: edit.rowKey,\n column: edit.column,\n }),\n );\n continue;\n }\n const node = model?.byKey.get(row.key);\n const original = node ? originalOf(node) : (working[row.index] as TRow);\n if (node && !node.writable) {\n issues.push(\n issue(\n \"read_only_cell\",\n \"A recovered nested root has no unambiguous source path for editing.\",\n { rowKey: row.key, column: column.id },\n ),\n );\n continue;\n }\n if (node?.parent && options.getChildren && !options.setChildren) {\n issues.push(\n issue(\n \"read_only_cell\",\n \"Editing a nested child requires an immutable setChildren callback.\",\n { rowKey: row.key, column: column.id },\n ),\n );\n continue;\n }\n if (record && !column.isEditable(original)) {\n issues.push(\n issue(\n \"read_only_cell\",\n `The \"${column.id}\" cell of row \"${String(row.key)}\" is read-only.`,\n {\n rowKey: row.key,\n column: column.id,\n },\n ),\n );\n continue;\n }\n let value: unknown;\n if (isInputEdit(edit)) {\n const parsed = column.parse(edit.input, original, sampleOf(column.id));\n if (!parsed.ok) {\n issues.push(\n issue(\"invalid_value\", parsed.message, { rowKey: row.key, column: column.id }),\n );\n continue;\n }\n value = parsed.value;\n } else {\n value = edit.value;\n }\n const previous = column.getValue(original);\n if (Object.is(previous, value)) {\n continue;\n }\n let updated: TRow | undefined;\n try {\n updated = column.setValue(original, value);\n } catch (error) {\n issues.push(\n issue(\"invalid_value\", error instanceof Error ? error.message : String(error), {\n rowKey: row.key,\n column: column.id,\n }),\n );\n continue;\n }\n if (updated === undefined) {\n issues.push(\n issue(\"read_only_cell\", `The \"${column.id}\" column has no way to write a value.`, {\n rowKey: row.key,\n column: column.id,\n }),\n );\n continue;\n }\n if (readKey(updated, row.index) !== readKey(original, row.index)) {\n issues.push(\n issue(\n \"invalid_row_operation\",\n \"Editing a row key is not supported; remove and insert the row instead.\",\n { rowKey: row.key, column: column.id },\n ),\n );\n continue;\n }\n if (!node) working[row.index] = updated;\n else {\n const planned = new Map<TreeNode<TRow>, TRow>([[node, updated]]);\n const plannedCache = new Map<RowKey, readonly TRow[]>();\n let cursor = node;\n try {\n while (cursor.parent) {\n const parent = cursor.parent;\n const children = parent.children.map(\n (child) => planned.get(child) ?? originalOf(child),\n );\n if (cursor.lazy) plannedCache.set(parent.row.key, children);\n if (options.setChildren)\n planned.set(parent, options.setChildren(originalOf(parent), children));\n cursor = parent;\n }\n } catch (error) {\n issues.push(\n issue(\"invalid_value\", error instanceof Error ? error.message : String(error), {\n rowKey: row.key,\n column: column.id,\n }),\n );\n continue;\n }\n for (const [item, plannedRow] of planned) replacements.set(item, plannedRow);\n for (const [key, children] of plannedCache) cache.set(key, children);\n if (!options.getChildren && !node.lazy) working[node.sourceIndex] = updated;\n if (options.getChildren || options.setChildren)\n working[cursor.sourceIndex] = originalOf(cursor);\n }\n changes.push({ rowKey: row.key, column: column.id, previous, value, row: updated });\n }\n\n let status: EditStatus;\n if (changes.length === 0) {\n status = issues.length > 0 ? \"rejected\" : \"unchanged\";\n } else {\n status = issues.length > 0 ? \"partial\" : \"applied\";\n data = working;\n if (model) {\n lazyChildren.clear();\n for (const [key, children] of cache) lazyChildren.set(key, children);\n lazyVersion++;\n }\n if (record) {\n if (!transaction) undoStack.record({ kind: \"cells\", changes });\n }\n const groups = new Map<RowKey, CellChange<TRow>[]>();\n for (const change of changes) {\n const group = groups.get(change.rowKey) ?? [];\n group.push(change);\n groups.set(change.rowKey, group);\n }\n for (const [key, group] of groups)\n pendingChanges.record(\n key,\n current.getRow(key)!.original,\n group.at(-1)!.row,\n positionOf(key),\n group,\n );\n if (!transaction) options.onDataChange?.(data, changes);\n notify();\n }\n if (issues.length > 0 && !transaction) {\n options.onEditIssues?.(issues);\n }\n return Object.freeze({\n status,\n changes: Object.freeze(changes),\n issues: Object.freeze(issues),\n rowChanges: Object.freeze([]),\n pendingCells: Object.freeze([]),\n });\n }\n\n function sourceRows(): IndexedRows<TRow> {\n const { byId } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n return model ? treeIndex(model) : indexRows(data, byId);\n }\n function positionOf(key: RowKey): InsertPosition {\n const { byId } = resolveColumns(definitions);\n if (treeEnabled) {\n const model = treeStage(data, byId, lazyVersion);\n return treePositions(model).get(key) ?? Object.freeze({});\n }\n const indexed = indexRows(data, byId);\n const row = indexed.byKey.get(key);\n return Object.freeze({ before: row ? indexed.rows[row.index + 1]?.key : undefined });\n }\n function scene(): RowScene<TRow> {\n return { data, lazy: new Map(lazyChildren) };\n }\n function resultForRows(\n changes: readonly RowChange<TRow>[],\n issues: readonly TableIssue[],\n cells: readonly CellChange<TRow>[] = [],\n ): EditResult<TRow> {\n return Object.freeze({\n status:\n changes.length || cells.length\n ? issues.length\n ? \"partial\"\n : \"applied\"\n : issues.length\n ? \"rejected\"\n : \"unchanged\",\n changes: Object.freeze([...cells]),\n rowChanges: Object.freeze([...changes]),\n pendingCells: Object.freeze([]),\n issues: Object.freeze([...issues]),\n });\n }\n function rowProblem(message: string, rowKey?: RowKey): TableIssue {\n return issue(\"invalid_row_operation\", message, { rowKey });\n }\n function stableRows(rows: readonly TRow[]): boolean {\n return (\n options.rowKey !== undefined ||\n rows.every((row) => {\n const key = getPath(row, \"id\");\n return typeof key === \"string\" || typeof key === \"number\";\n })\n );\n }\n function cellDifferences(previous: TRow, row: TRow, key: RowKey): CellChange<TRow>[] {\n return resolveColumns(definitions).columns.flatMap((column) => {\n const before = column.getValue(previous);\n const value = column.getValue(row);\n return Object.is(before, value)\n ? []\n : [{ rowKey: key, column: column.id, previous: before, value, row }];\n });\n }\n function recordRows(\n previous: IndexedRows<TRow>,\n keys: readonly RowKey[],\n positions: ReadonlyMap<RowKey, InsertPosition>,\n baselines: ReadonlyMap<RowKey, TRow> = new Map(),\n ): RowChange<TRow>[] {\n const next = sourceRows();\n const rowChanges: RowChange<TRow>[] = [];\n for (const key of keys) {\n const before = previous.byKey.get(key)?.original;\n const row = next.byKey.get(key)?.original;\n const position = positions.get(key) ?? positionOf(key);\n const cells =\n before !== undefined && row !== undefined ? cellDifferences(before, row, key) : [];\n const baseline = baselines.get(key);\n const pending = pendingChanges.entries.get(key);\n if (row === undefined && baseline !== undefined && pending?.previous !== undefined)\n pending.previous = baseline;\n pendingChanges.record(\n key,\n row === undefined ? (baseline ?? before) : before,\n row,\n position,\n cells,\n );\n if (before === undefined && row !== undefined)\n rowChanges.push(\n Object.freeze({ kind: \"inserted\", rowKey: key, row, position: positionOf(key) }),\n );\n else if (row === undefined && before !== undefined)\n rowChanges.push(Object.freeze({ kind: \"removed\", rowKey: key, row: before, position }));\n }\n return rowChanges;\n }\n function publishRows(\n before: RowScene<TRow>,\n previous: IndexedRows<TRow>,\n keys: readonly RowKey[],\n positions: ReadonlyMap<RowKey, InsertPosition>,\n issues: readonly TableIssue[],\n baselines: ReadonlyMap<RowKey, TRow> = new Map(),\n ): EditResult<TRow> {\n const rowChanges = recordRows(previous, keys, positions, baselines);\n if (!transaction) {\n undoStack.record({ kind: \"rows\", before, after: scene(), keys });\n options.onDataChange?.(data, []);\n if (issues.length) options.onEditIssues?.(issues);\n }\n notify();\n return resultForRows(rowChanges, issues);\n }\n function restoreScene(\n entry: Extract<EditHistory<TRow>, { kind: \"rows\" }>,\n direction: \"undo\" | \"redo\",\n ): void {\n const previous = sourceRows();\n const baselines = removalBaselines();\n const positions = new Map(entry.keys.map((key) => [key, positionOf(key)]));\n const target = direction === \"undo\" ? entry.before : entry.after;\n data = target.data;\n const changed = new Set([...entry.before.lazy.keys(), ...entry.after.lazy.keys()]);\n for (const key of changed) {\n if (entry.before.lazy.get(key) === entry.after.lazy.get(key)) continue;\n const rows = target.lazy.get(key);\n if (rows) lazyChildren.set(key, rows);\n else lazyChildren.delete(key);\n }\n lazyVersion++;\n recordRows(previous, entry.keys, positions, baselines);\n options.onDataChange?.(data, []);\n notify();\n }\n function removalBaselines(): ReadonlyMap<RowKey, TRow> {\n const baselines = new Map<RowKey, TRow>();\n if (!options.getChildren || !options.setChildren) return baselines;\n const model = treeStage(data, resolveColumns(definitions).byId, lazyVersion);\n for (const node of model.nodes.toReversed()) {\n const entry = pendingChanges.entries.get(node.row.key);\n if (entry && entry.previous === undefined) continue;\n let baseline = entry?.previous ?? node.row.original;\n const children = node.children\n .filter(\n (child) =>\n !pendingChanges.entries.has(child.row.key) ||\n pendingChanges.entries.get(child.row.key)!.previous !== undefined,\n )\n .map((child) => baselines.get(child.row.key) ?? child.row.original);\n const originalChildren = options.getChildren(baseline) ?? [];\n if (\n children.length !== originalChildren.length ||\n children.some((child, index) => child !== originalChildren[index])\n )\n baseline = options.setChildren(baseline, children);\n baselines.set(node.row.key, baseline);\n }\n return baselines;\n }\n function rewriteNested(\n model: TreeModel<TRow>,\n removed: ReadonlySet<RowKey>,\n overrides: ReadonlyMap<RowKey, readonly TRow[]>,\n cache: Map<RowKey, readonly TRow[]>,\n ): readonly TRow[] {\n const replacements = new Map<TreeNode<TRow>, TRow>();\n for (const node of model.nodes.toReversed()) {\n if (removed.has(node.row.key)) continue;\n const children =\n overrides.get(node.row.key) ??\n node.children\n .filter((child) => !removed.has(child.row.key))\n .map((child) => replacements.get(child) ?? child.row.original);\n const changed =\n overrides.has(node.row.key) ||\n children.length !== node.children.length ||\n children.some((child, index) => child !== node.children[index]?.row.original);\n if (!changed) continue;\n if (!options.setChildren) throw new Error(\"Changing nested children requires setChildren.\");\n replacements.set(node, options.setChildren(node.row.original, children));\n if (cache.has(node.row.key)) cache.set(node.row.key, children);\n }\n const roots = new Map(\n model.roots.filter((node) => node.writable).map((node) => [node.sourceIndex, node]),\n );\n return data.flatMap((row, index) => {\n const node = roots.get(index);\n return node && removed.has(node.row.key)\n ? []\n : [node ? (replacements.get(node) ?? row) : row];\n });\n }\n function insertRows(rows?: readonly TRow[], at: InsertPosition = {}): EditResult<TRow> {\n const before = scene();\n const previous = sourceRows();\n const problems: TableIssue[] = [];\n const reject = (problem: TableIssue): EditResult<TRow> => {\n if (!transaction) options.onEditIssues?.([problem]);\n return resultForRows([], [problem]);\n };\n let incoming: readonly TRow[];\n try {\n incoming = rows ?? (options.createRow ? [options.createRow()] : []);\n } catch (error) {\n return reject(rowProblem(error instanceof Error ? error.message : String(error)));\n }\n if (rows === undefined && !options.createRow)\n return reject(rowProblem(\"insertRows() requires rows or a createRow callback.\"));\n if (!incoming.length) return resultForRows([], []);\n if (!stableRows(data) || !stableRows(incoming))\n return reject(\n rowProblem(\"Row operations require stable row keys; supply rowKey or an id on every row.\"),\n );\n const { byId } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n const parent = at.parent === undefined ? undefined : model?.byKey.get(at.parent);\n const sibling = at.before === undefined ? undefined : previous.byKey.get(at.before);\n if (at.parent !== undefined && !parent)\n return reject(\n issue(\"unknown_row\", \"The insertion parent does not exist.\", { rowKey: at.parent }),\n );\n if (at.before !== undefined && !sibling)\n return reject(\n issue(\"unknown_row\", \"The insertion sibling does not exist.\", { rowKey: at.before }),\n );\n if (\n sibling &&\n (model?.byKey.get(sibling.key)?.parent?.row.key ?? sibling.parentKey) !== at.parent\n )\n return reject(rowProblem(\"The before row must belong to the requested parent.\", sibling.key));\n if (parent && !parent.writable)\n return reject(rowProblem(\"A recovered parent has no writable source path.\", parent.row.key));\n if (parent && getSnapshot().getRow(parent.row.key)?.childStatus !== \"loaded\")\n return reject(\n rowProblem(\"Load the parent's children before inserting rows.\", parent.row.key),\n );\n const cache = new Map(lazyChildren);\n let next: readonly TRow[];\n try {\n if (options.getChildren && parent && model) {\n const children = parent.children.map((child) => child.row.original);\n const index =\n at.before === undefined\n ? children.length\n : parent.children.findIndex((child) => child.row.key === at.before);\n children.splice(index, 0, ...incoming);\n next = rewriteNested(model, new Set(), new Map([[parent.row.key, children]]), cache);\n } else if (parent && cache.has(parent.row.key)) {\n incoming = incoming.map((row) =>\n options.setParentKey ? options.setParentKey(row, parent.row.key) : row,\n );\n const children = [...cache.get(parent.row.key)!];\n const index =\n at.before === undefined\n ? children.length\n : parent.children.findIndex((child) => child.row.key === at.before);\n children.splice(index, 0, ...incoming);\n cache.set(parent.row.key, children);\n next = [...data];\n } else {\n if (parent && options.getParentKey) {\n incoming = incoming.map((row) =>\n options.setParentKey ? options.setParentKey(row, parent.row.key) : row,\n );\n if (incoming.some((row) => options.getParentKey!(row) !== parent.row.key))\n return reject(\n rowProblem(\"Supply setParentKey or rows already addressed to the requested parent.\"),\n );\n }\n const working = [...data];\n working.splice(sibling?.index ?? working.length, 0, ...incoming);\n next = working;\n }\n const candidate = treeEnabled\n ? buildTree(next, byId, readKey, options, cache)\n : indexRows(next, byId);\n if (!stableRows(candidate.rows.map((row) => row.original)))\n return reject(rowProblem(\"Every inserted descendant must have a stable key.\"));\n const baseline = new Map<string, number>();\n for (const problem of previous.issues) {\n const key = `${problem.code}:${String(problem.rowKey)}`;\n baseline.set(key, (baseline.get(key) ?? 0) + 1);\n }\n problems.push(\n ...candidate.issues.filter((problem) => {\n const key = `${problem.code}:${String(problem.rowKey)}`;\n const remaining = baseline.get(key) ?? 0;\n if (!remaining) return true;\n baseline.set(key, remaining - 1);\n return false;\n }),\n );\n if (problems.length) {\n if (!transaction) options.onEditIssues?.(problems);\n return resultForRows([], problems);\n }\n const keys = candidate.rows\n .filter((row) => !previous.byKey.has(row.key))\n .map((row) => row.key);\n if (!keys.length) return reject(rowProblem(\"No unique rows can be inserted.\"));\n data = next;\n lazyChildren.clear();\n for (const [key, value] of cache) lazyChildren.set(key, value);\n lazyVersion++;\n return publishRows(before, previous, keys, new Map(), []);\n } catch (error) {\n return reject(rowProblem(error instanceof Error ? error.message : String(error)));\n }\n }\n function removeRows(keys: readonly RowKey[]): EditResult<TRow> {\n const before = scene();\n const previous = sourceRows();\n const problems: TableIssue[] = [];\n const removed = new Set<RowKey>();\n const { byId } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n if (!stableRows(data)) {\n const problem = rowProblem(\"Row operations require stable row keys.\");\n if (!transaction) options.onEditIssues?.([problem]);\n return resultForRows([], [problem]);\n }\n for (const key of keys) {\n if (!previous.byKey.has(key)) {\n problems.push(issue(\"unknown_row\", \"The row to remove does not exist.\", { rowKey: key }));\n continue;\n }\n const node = model?.byKey.get(key);\n if (node && !node.writable) {\n problems.push(rowProblem(\"A recovered row has no writable source path.\", key));\n continue;\n }\n const stack = node ? [node] : [];\n removed.add(key);\n while (stack.length) {\n const item = stack.pop()!;\n removed.add(item.row.key);\n for (const child of item.children) stack.push(child);\n }\n }\n if (!removed.size) {\n if (problems.length && !transaction) options.onEditIssues?.(problems);\n return resultForRows([], problems);\n }\n const positions = new Map([...removed].map((key) => [key, positionOf(key)]));\n const cache = new Map(lazyChildren);\n try {\n const baselines = removalBaselines();\n const next =\n options.getChildren && model\n ? rewriteNested(model, removed, new Map(), cache)\n : data.filter((row, index) => !removed.has(readKey(row, index)));\n for (const [key, children] of cache) {\n if (removed.has(key)) cache.delete(key);\n else\n cache.set(\n key,\n children.filter((row, index) => !removed.has(readKey(row, index))),\n );\n }\n data = next;\n lazyChildren.clear();\n for (const [key, value] of cache) lazyChildren.set(key, value);\n lazyVersion++;\n validation.cancel([...removed]);\n abortLoads();\n return publishRows(before, previous, [...removed], positions, problems, baselines);\n } catch (error) {\n problems.push(rowProblem(error instanceof Error ? error.message : String(error)));\n if (!transaction) options.onEditIssues?.(problems);\n return resultForRows([], problems);\n }\n }\n function revert(keys?: readonly RowKey[]): EditResult<TRow> {\n const selected = new Set(keys ?? pendingChanges.entries.keys());\n const entries = [...pendingChanges.entries]\n .filter(([key]) => selected.has(key))\n .map(([key, entry]) => [key, { ...entry, cells: new Map(entry.cells) }] as const);\n if (!entries.length) return resultForRows([], []);\n const before = scene();\n const previous = sourceRows();\n const positions = new Map([...selected].map((key) => [key, positionOf(key)]));\n const problems: TableIssue[] = [];\n const cells: CellChange<TRow>[] = [];\n transaction = true;\n try {\n problems.push(\n ...removeRows(\n entries.filter(([, entry]) => entry.previous === undefined).map(([key]) => key),\n ).issues,\n );\n const missing = entries.filter(\n ([, entry]) => entry.previous !== undefined && entry.row === undefined,\n );\n for (let pass = 0; missing.length && pass <= entries.length; pass++) {\n let progress = false;\n for (let index = missing.length - 1; index >= 0; index--) {\n const [key, entry] = missing[index]!;\n if (sourceRows().byKey.has(key)) {\n missing.splice(index, 1);\n progress = true;\n continue;\n }\n if (entry.position.parent !== undefined && !sourceRows().byKey.has(entry.position.parent))\n continue;\n const at = {\n ...entry.position,\n before:\n entry.position.before !== undefined && sourceRows().byKey.has(entry.position.before)\n ? entry.position.before\n : undefined,\n };\n const result = insertRows([entry.previous!], at);\n problems.push(...result.issues);\n missing.splice(index, 1);\n progress = true;\n }\n if (!progress) break;\n }\n for (const [key] of missing)\n problems.push(\n rowProblem(\"The saved parent is missing; restore it before this child.\", key),\n );\n const edits = entries.flatMap(([key, entry]) =>\n entry.previous !== undefined && sourceRows().byKey.has(key)\n ? [...entry.cells.values()].map((change) => ({\n rowKey: key,\n column: change.column,\n value: change.previous,\n }))\n : [],\n );\n const result = applyChanges(edits, false);\n cells.push(...result.changes);\n problems.push(...result.issues);\n for (const [key] of entries)\n if (!problems.some((problem) => problem.rowKey === key)) pendingChanges.entries.delete(key);\n validation.cancel([...selected]);\n } finally {\n transaction = false;\n }\n const after = scene();\n if (before.data !== after.data || cells.length)\n undoStack.record({ kind: \"rows\", before, after, keys: [...selected] });\n const next = sourceRows();\n const rowChanges = [...selected].flatMap((key): RowChange<TRow>[] => {\n const old = previous.byKey.get(key);\n const row = next.byKey.get(key);\n return !old && row\n ? [{ kind: \"inserted\", rowKey: key, row: row.original, position: positionOf(key) }]\n : old && !row\n ? [{ kind: \"removed\", rowKey: key, row: old.original, position: positions.get(key)! }]\n : [];\n });\n if (before.data !== after.data) options.onDataChange?.(data, cells);\n if (problems.length) options.onEditIssues?.(problems);\n notify();\n return resultForRows(rowChanges, problems, cells);\n }\n\n function rangeEdits(origin: CellPosition, matrix: readonly (readonly string[])[]): CellEdit[] {\n const { rows, columns } = getSnapshot();\n const edits: CellEdit[] = [];\n matrix.forEach((line, rowOffset) => {\n const row = rows[origin.row + rowOffset];\n if (!row) {\n return;\n }\n line.forEach((input, columnOffset) => {\n const column = columns[origin.column + columnOffset];\n if (column) {\n edits.push({ rowKey: row.key, column: column.id, input });\n }\n });\n });\n return edits;\n }\n\n function replay(changes: readonly CellChange<TRow>[], direction: \"undo\" | \"redo\"): void {\n applyChanges(\n (direction === \"undo\" ? changes.toReversed() : changes).map((change) => ({\n rowKey: change.rowKey,\n column: change.column,\n value: direction === \"undo\" ? change.previous : change.value,\n })),\n false,\n );\n }\n\n function ingestionResult(\n appended: number,\n replaced: number,\n removed: number,\n problems: readonly TableIssue[],\n ): DataIngestionResult {\n return Object.freeze({\n status:\n appended + replaced + removed\n ? problems.length\n ? \"partial\"\n : \"applied\"\n : problems.length\n ? \"rejected\"\n : \"unchanged\",\n appended,\n replaced,\n removed,\n issues: Object.freeze([...problems]),\n });\n }\n const stableSource = new WeakMap<readonly TRow[], boolean>();\n function ingestionKeys(rows: readonly TRow[]): boolean {\n let valid = stableSource.get(rows);\n if (valid === undefined) {\n valid = stableRows(rows);\n stableSource.set(rows, valid);\n }\n return valid;\n }\n function isProtectedSource(key: RowKey): boolean {\n return pendingChanges.entries.has(key) || validation.hasPending(key);\n }\n function affectedBranch(model: TreeModel<TRow> | undefined, key: RowKey): RowKey[] {\n const result = [key];\n const node = model?.byKey.get(key);\n if (!node) return result;\n let parent = node.parent;\n while (parent) {\n result.push(parent.row.key);\n parent = parent.parent;\n }\n const stack = [...node.children];\n while (stack.length) {\n const child = stack.pop()!;\n result.push(child.row.key);\n for (const descendant of child.children) stack.push(descendant);\n }\n return result;\n }\n function transformScene(\n source: RowScene<TRow>,\n updates: ReadonlyMap<RowKey, TRow>,\n removed: ReadonlySet<RowKey>,\n ): RowScene<TRow> {\n const seen = new Set<RowKey>();\n const replace = (rows: readonly TRow[]): readonly TRow[] =>\n rows.flatMap((row, index) => {\n const key = readKey(row, index);\n seen.add(key);\n return removed.has(key) ? [] : [updates.get(key) ?? row];\n });\n const cache = new Map<RowKey, readonly TRow[]>();\n for (const [key, children] of source.lazy) {\n if (!removed.has(key)) cache.set(key, replace(children));\n }\n let next: readonly TRow[];\n if (!options.getChildren) next = replace(source.data);\n else {\n const model = buildTree(\n source.data,\n resolveColumns(definitions).byId,\n readKey,\n options,\n source.lazy,\n );\n const replacements = new Map<TreeNode<TRow>, TRow>();\n for (const node of model.nodes.toReversed()) {\n const key = node.row.key;\n seen.add(key);\n if (removed.has(key)) continue;\n let row = updates.get(key) ?? node.row.original;\n const supplied = updates.has(key) ? options.getChildren(row) : undefined;\n if (supplied !== undefined) cache.delete(key);\n const children =\n supplied ??\n node.children\n .filter((child) => !removed.has(child.row.key))\n .map((child) => replacements.get(child) ?? child.row.original);\n const old = options.getChildren(row) ?? node.children.map((child) => child.row.original);\n if (\n supplied === undefined &&\n ((updates.has(key) && node.children.length > 0 && !cache.has(key)) ||\n children.length !== old.length ||\n children.some((child, index) => child !== old[index]))\n ) {\n if (!options.setChildren)\n throw new Error(\"Updating nested source children requires setChildren.\");\n row = options.setChildren(row, children);\n if (cache.has(key)) cache.set(key, children);\n }\n replacements.set(node, row);\n }\n const roots = new Map(\n model.roots.filter((node) => node.writable).map((node) => [node.sourceIndex, node]),\n );\n next = source.data.flatMap((row, index) => {\n const node = roots.get(index);\n return node && removed.has(node.row.key)\n ? []\n : [node ? (replacements.get(node) ?? row) : row];\n });\n }\n const additions = [...updates]\n .filter(([key]) => !seen.has(key) && !removed.has(key))\n .map(([, row]) => row);\n return { data: appendList(next, additions), lazy: cache };\n }\n function rebaseBatches(\n transform: (source: RowScene<TRow>) => RowScene<TRow>,\n removed: ReadonlySet<RowKey>,\n ): void {\n undoStack.transform((entry) => {\n if (entry.kind === \"cells\") {\n if (!removed.size) return entry;\n const changes = entry.changes.filter((change) => !removed.has(change.rowKey));\n return changes.length ? { ...entry, changes } : undefined;\n }\n const keys = entry.keys.filter((key) => !removed.has(key));\n return keys.length\n ? { ...entry, keys, before: transform(entry.before), after: transform(entry.after) }\n : undefined;\n });\n }\n function newTreeIssues(\n previous: readonly TableIssue[],\n next: readonly TableIssue[],\n ): TableIssue[] {\n const counts = new Map<string, number>();\n for (const problem of previous) {\n const key = JSON.stringify([problem.code, problem.rowKey]);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return next.filter((problem) => {\n const key = JSON.stringify([problem.code, problem.rowKey]);\n const remaining = counts.get(key) ?? 0;\n if (!remaining) return true;\n counts.set(key, remaining - 1);\n return false;\n });\n }\n function ingestData(incoming: readonly TRow[], mode: \"append\" | \"upsert\"): DataIngestionResult {\n const problems: TableIssue[] = [];\n const reject = (problem: TableIssue): DataIngestionResult => {\n ingestionIssues = [problem];\n notify();\n return ingestionResult(0, 0, 0, ingestionIssues);\n };\n if (destroyed)\n return reject(issue(\"invalid_ingestion\", \"A disposed table cannot receive source data.\"));\n if (!incoming.length) return ingestionResult(0, 0, 0, []);\n try {\n if (!ingestionKeys(data) || !stableRows(incoming))\n return reject(\n issue(\n \"invalid_ingestion\",\n \"Source ingestion requires stable rowKey values or ids on every row.\",\n ),\n );\n } catch (error) {\n return reject(\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n );\n }\n const previous = sourceRows();\n const { byId, columns } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n const seenBatch = new Set<RowKey>();\n const updates = new Map<RowKey, TRow>();\n for (const row of incoming) {\n try {\n const key = readKey(row, previous.rows.length + updates.size);\n if (typeof key !== \"string\" && (typeof key !== \"number\" || !Number.isFinite(key))) {\n problems.push(\n issue(\"invalid_ingestion\", \"An incoming row key must be a string or finite number.\"),\n );\n continue;\n }\n const existing = previous.byKey.get(key);\n if (seenBatch.has(key) || (mode === \"append\" && existing)) {\n problems.push(\n issue(\n \"duplicate_row_key\",\n \"An incoming source row repeats an existing key and is refused.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n seenBatch.add(key);\n const parent = options.getParentKey?.(row);\n const affected = affectedBranch(model, key);\n if (parent !== undefined && parent !== null)\n affected.push(...affectedBranch(model, parent));\n if (affected.some(isProtectedSource)) {\n problems.push(\n issue(\n \"ingestion_conflict\",\n \"Incoming source data would overwrite a local change or pending validation; retry after save or revert.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n const node = model?.byKey.get(key);\n if (\n node &&\n (!node.writable ||\n (node.lazy &&\n options.getParentKey &&\n options.getParentKey(row) !== node.parent?.row.key))\n ) {\n problems.push(\n issue(\n \"invalid_ingestion\",\n \"This recovered or lazy tree row has no writable source position.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n if (existing?.original !== row) updates.set(key, row);\n } catch (error) {\n problems.push(\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n );\n }\n }\n if (!updates.size) {\n ingestionIssues = problems;\n notify();\n return ingestionResult(0, 0, 0, problems);\n }\n const replaced = [...updates.keys()].filter((key) => previous.byKey.has(key)).length;\n const appended = updates.size - replaced;\n const previousState = state;\n try {\n if (!model && !replaced) {\n const added = Object.freeze([...updates.values()]);\n const indexed = added.map((row, offset) =>\n createRow(\n row,\n readKey(row, previous.rows.length + offset),\n previous.rows.length + offset,\n byId,\n options.getRowCanExpand?.(row) ?? false,\n ),\n );\n const filtered = manual\n ? previous.rows\n : filterStage(previous.rows, columns, state.search, state.filters);\n const addedFiltered = manual\n ? indexed\n : filterRows(indexed, columns, state.search, state.filters);\n const allRows = appendList(previous.rows, indexed);\n const allFiltered = appendList(filtered, addedFiltered);\n const keys = membership(filtered);\n for (const row of addedFiltered) keys.add(row.key);\n rowMembership.set(allFiltered, keys);\n const sorted =\n manual ||\n !state.sorting.some((rule) => columns.some((column) => column.id === rule.column))\n ? allFiltered\n : mergeRows(\n sortStage(filtered, columns, state.sorting),\n addedFiltered,\n columns,\n state.sorting,\n );\n const next = appendList(data, added);\n rebaseBatches((source) => ({ ...source, data: appendList(source.data, added) }), new Set());\n for (const row of indexed) previous.byKey.set(row.key, row);\n primedIndex = {\n data: next,\n columns: byId,\n result: { rows: allRows, byKey: previous.byKey, issues: previous.issues },\n };\n primedFilter = {\n rows: allRows,\n columns,\n search: state.search,\n filters: state.filters,\n result: allFiltered,\n };\n primedSort = { rows: allFiltered, columns, sorting: state.sorting, result: sorted };\n stableSource.set(next, true);\n data = next;\n } else {\n const next = transformScene(scene(), updates, new Set());\n const candidate = treeEnabled\n ? buildTree(next.data, byId, readKey, options, next.lazy)\n : indexRows(next.data, byId);\n const fresh = newTreeIssues(previous.issues, candidate.issues);\n if (fresh.length || !stableRows(candidate.rows.map((row) => row.original))) {\n problems.push(\n ...fresh,\n ...(!stableRows(candidate.rows.map((row) => row.original))\n ? [issue(\"invalid_ingestion\", \"Every incoming descendant needs a stable key.\")]\n : []),\n );\n ingestionIssues = problems;\n notify();\n return ingestionResult(0, 0, 0, problems);\n }\n const nextKeys = new Set(candidate.rows.map((row) => row.key));\n const removedKeys = new Set(\n previous.rows.filter((row) => !nextKeys.has(row.key)).map((row) => row.key),\n );\n rebaseBatches((source) => transformScene(source, updates, removedKeys), removedKeys);\n data = next.data;\n lazyChildren.clear();\n for (const [key, rows] of next.lazy) lazyChildren.set(key, rows);\n lazyVersion++;\n for (const key of [...updates.keys(), ...removedKeys]) {\n pendingLoads.get(key)?.abort();\n pendingLoads.delete(key);\n childStatuses.delete(key);\n loadIssues.delete(key);\n loadValidationIssues.delete(key);\n }\n validation.cancel([...removedKeys]);\n const selection = state.selection.filter((key) => !removedKeys.has(key));\n state = mergeState(state, {\n selection: selection.length === state.selection.length ? state.selection : selection,\n expanded:\n state.expanded === true ? true : state.expanded.filter((key) => !removedKeys.has(key)),\n });\n }\n validation.cancel([...updates.keys()]);\n ingestionIssues = problems;\n } catch (error) {\n return reject(\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n );\n }\n if (state !== previousState) options.onStateChange?.(state, previousState);\n options.onDataChange?.(data, []);\n notify();\n startVisibleLoads();\n return ingestionResult(appended, replaced, 0, problems);\n }\n function removeData(keys: readonly RowKey[]): DataIngestionResult {\n const previousState = state;\n const problems: TableIssue[] = [];\n const removed = new Set<RowKey>();\n const previous = sourceRows();\n const model = treeEnabled\n ? treeStage(data, resolveColumns(definitions).byId, lazyVersion)\n : undefined;\n if (destroyed || !ingestionKeys(data))\n problems.push(\n issue(\"invalid_ingestion\", \"Source removal requires a live table and stable row keys.\"),\n );\n else\n for (const key of new Set(keys)) {\n if (!previous.byKey.has(key)) {\n problems.push(\n issue(\"unknown_row\", \"The source row to remove does not exist.\", { rowKey: key }),\n );\n continue;\n }\n if (affectedBranch(model, key).some(isProtectedSource)) {\n problems.push(\n issue(\n \"ingestion_conflict\",\n \"Source removal would discard local changes or pending validation.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n const node = model?.byKey.get(key);\n if (node && !node.writable) {\n problems.push(\n issue(\"invalid_ingestion\", \"A recovered tree row has no writable source position.\", {\n rowKey: key,\n }),\n );\n continue;\n }\n removed.add(key);\n const stack = node ? [...node.children] : [];\n while (stack.length) {\n const child = stack.pop()!;\n removed.add(child.row.key);\n for (const descendant of child.children) stack.push(descendant);\n }\n }\n try {\n if (removed.size) {\n const next = transformScene(scene(), new Map(), removed);\n rebaseBatches((source) => transformScene(source, new Map(), removed), removed);\n data = next.data;\n lazyChildren.clear();\n for (const [key, rows] of next.lazy) lazyChildren.set(key, rows);\n lazyVersion++;\n validation.cancel([...removed]);\n for (const key of removed) {\n pendingLoads.get(key)?.abort();\n pendingLoads.delete(key);\n childStatuses.delete(key);\n loadIssues.delete(key);\n loadValidationIssues.delete(key);\n }\n const selection = state.selection.filter((key) => !removed.has(key));\n state = mergeState(state, {\n selection: selection.length === state.selection.length ? state.selection : selection,\n expanded:\n state.expanded === true ? true : state.expanded.filter((key) => !removed.has(key)),\n });\n }\n ingestionIssues = problems;\n } catch (error) {\n ingestionIssues = [\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n ];\n notify();\n return ingestionResult(0, 0, 0, ingestionIssues);\n }\n if (state !== previousState) options.onStateChange?.(state, previousState);\n if (removed.size) options.onDataChange?.(data, []);\n notify();\n startVisibleLoads();\n return ingestionResult(0, 0, removed.size, problems);\n }\n\n if (expandMode === \"single\") {\n initialState = mergeState(initialState, { expanded: canonicalExpanded(initialState.expanded) });\n state = initialState;\n snapshot = undefined;\n }\n\n const table: DataTable<TRow> = {\n appendData: (rows) => ingestData(rows, \"append\"),\n upsertData: (rows) => ingestData(rows, \"upsert\"),\n removeData,\n stream(source, streamOptions) {\n if (destroyed)\n return Promise.resolve(\n Object.freeze({\n status: \"aborted\",\n receivedRowCount: 0,\n issues: Object.freeze([\n issue(\"invalid_ingestion\", \"A disposed table cannot start a source.\"),\n ]),\n }),\n );\n return streaming.run(source, { expectedRowCount: sourceExpected, ...streamOptions });\n },\n insertRows,\n removeRows,\n revert,\n getPendingChanges: () => pendingChanges.snapshot(),\n markSaved(keys) {\n if (!keys) pendingChanges.entries.clear();\n else for (const key of keys) pendingChanges.entries.delete(key);\n notify();\n },\n getSnapshot,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n setState(patch) {\n const previousIssue = expandedIssue;\n const next = mergePatch(patch);\n if (next !== state || previousIssue !== expandedIssue) {\n state = next;\n snapshot = undefined;\n abortLoads();\n notify();\n startVisibleLoads();\n }\n },\n setData(next) {\n if (next === data) {\n return;\n }\n validation.cancel();\n streaming.cancel();\n loadState = \"idle\";\n streamIssues = [];\n ingestionIssues = [];\n expectedRowCount = sourceExpected;\n pendingChanges.entries.clear();\n abortLoads(true);\n lazyChildren.clear();\n childStatuses.clear();\n loadIssues.clear();\n loadValidationIssues.clear();\n lazyVersion++;\n data = next;\n undoStack.clear();\n notify();\n startVisibleLoads();\n },\n setColumns(next) {\n if (next === definitions) {\n return;\n }\n definitions = next;\n validation.cancel();\n notify();\n },\n setRowCount(next) {\n if (next === rowCount) {\n return;\n }\n rowCount = next;\n notify();\n },\n\n toggleSort(columnId, { multi = false } = {}) {\n const current = state.sorting.find((rule) => rule.column === columnId)?.direction;\n const next = current === undefined ? \"asc\" : current === \"asc\" ? \"desc\" : undefined;\n setSort(columnId, next, multi);\n },\n sort(columnId, direction, { multi = false } = {}) {\n setSort(columnId, direction, multi);\n },\n clearSorting() {\n commit({ sorting: [] });\n },\n search(text) {\n if (text === state.search) {\n return;\n }\n commit({ search: text, pagination: firstPage() });\n },\n filter(columnId, value) {\n const filters: Record<string, unknown> = { ...state.filters };\n const empty =\n value === undefined ||\n value === null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0);\n if (empty ? !(columnId in filters) : Object.is(filters[columnId], value)) {\n return;\n }\n if (empty) {\n delete filters[columnId];\n } else {\n filters[columnId] = value;\n }\n commit({ filters, pagination: firstPage() });\n },\n clearFilters() {\n if (Object.keys(state.filters).length > 0) {\n commit({ filters: {}, pagination: firstPage() });\n }\n },\n\n goToPage(page) {\n if (!paginate) return;\n const { pageCount, page: currentPage } = getSnapshot();\n const next = clampPage(page, pageCount);\n if (next !== currentPage || next !== state.pagination.page) {\n commit({ pagination: { page: next, pageSize: state.pagination.pageSize } });\n }\n },\n nextPage() {\n table.goToPage(getSnapshot().page + 1);\n },\n previousPage() {\n table.goToPage(getSnapshot().page - 1);\n },\n setPageSize(pageSize) {\n if (!paginate) return;\n if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize === state.pagination.pageSize) {\n return;\n }\n const { pageStart } = getSnapshot();\n const page = pageStart === 0 ? 1 : Math.floor((pageStart - 1) / pageSize) + 1;\n commit({ pagination: { page, pageSize } });\n },\n\n select(keys) {\n applySelection([...state.selection, ...selectionKeys(keys)]);\n },\n deselect(keys) {\n const removed = new Set(selectionKeys(keys));\n applySelection(state.selection.filter((key) => !removed.has(key)));\n },\n toggleRow(key, selected) {\n const isSelected = treeEnabled\n ? getSnapshot().getRow(key)?.selection === \"all\"\n : state.selection.includes(key);\n const next = selected ?? !isSelected;\n if (next === isSelected) {\n return;\n }\n if (next) {\n table.select([key]);\n } else {\n table.deselect([key]);\n }\n },\n toggleAll(scope = selectScope) {\n if (selectionMode !== \"multiple\") {\n return;\n }\n const current = getSnapshot();\n const rows = scope === \"page\" || manual ? current.rows : current.processedRows;\n const keys = rows.map((row) => row.key);\n const allSelected = keys.length > 0 && keys.every((key) => current.isSelected(key));\n if (allSelected) {\n table.deselect(keys);\n } else {\n table.select(keys);\n }\n },\n clearSelection() {\n applySelection([]);\n },\n getSelectedRows() {\n const current = getSnapshot();\n return state.selection.flatMap((key) => {\n const row = current.getRow(key);\n return row ? [row] : [];\n });\n },\n\n toggleExpanded(key, expanded) {\n const row = getSnapshot().getRow(key);\n if (!row?.canExpand) return;\n const open = expanded ?? !row.isExpanded;\n if (open === row.isExpanded) {\n if (open && row.childStatus === \"error\") requestChildren(row);\n return;\n }\n if (expandMode === \"single\") {\n commit({ expanded: open ? [key] : [] });\n } else if (state.expanded === true) {\n const { byId } = resolveColumns(definitions);\n commit({\n expanded: (treeEnabled\n ? treeStage(data, byId, lazyVersion).rows.map((candidate) =>\n getSnapshot().getRow(candidate.key)!,\n )\n : indexRows(data, byId).rows\n )\n .filter((candidate) => candidate.canExpand && candidate.key !== key)\n .map((candidate) => candidate.key),\n });\n } else {\n commit({\n expanded: open\n ? [...state.expanded, key]\n : state.expanded.filter((candidate) => candidate !== key),\n });\n }\n if (open) requestChildren(getSnapshot().getRow(key)!);\n },\n expandAll() {\n commit({ expanded: true });\n },\n collapseAll() {\n commit({ expanded: [] });\n },\n\n toggleColumn(columnId, visible) {\n if (!getSnapshot().getColumn(columnId)) {\n return;\n }\n const hidden = state.hiddenColumns.includes(columnId);\n const show = visible ?? hidden;\n if (show === !hidden) {\n return;\n }\n commit({\n hiddenColumns: show\n ? state.hiddenColumns.filter((id) => id !== columnId)\n : [...state.hiddenColumns, columnId],\n });\n },\n moveColumn(columnId, toIndex) {\n const order = getSnapshot().allColumns.map((column) => column.id);\n const from = order.indexOf(columnId);\n if (from === -1) {\n return;\n }\n const target = Math.min(Math.max(0, Math.trunc(toIndex)), order.length - 1);\n if (target === from) {\n return;\n }\n order.splice(from, 1);\n order.splice(target, 0, columnId);\n commit({ columnOrder: order });\n },\n\n edit(edits, editOptions) {\n return validation.edit(Array.isArray(edits) ? edits : [edits as CellEdit], [], editOptions);\n },\n undo() {\n const entry = undoStack.undo();\n if (!entry) {\n return false;\n }\n validation.cancel();\n if (entry.kind === \"cells\") replay(entry.changes, \"undo\");\n else restoreScene(entry, \"undo\");\n return true;\n },\n redo() {\n const entry = undoStack.redo();\n if (!entry) {\n return false;\n }\n validation.cancel();\n if (entry.kind === \"cells\") replay(entry.changes, \"redo\");\n else restoreScene(entry, \"redo\");\n return true;\n },\n copy(range, { escapeFormulas = false } = {}) {\n const { rows, columns } = getSnapshot();\n const matrix: string[][] = [];\n rows.forEach((row, rowIndex) => {\n const line: string[] = [];\n columns.forEach((column, columnIndex) => {\n if (rangeContains(range, { row: rowIndex, column: columnIndex })) {\n const display = row.getDisplay(column.id);\n line.push(escapeFormulas ? escapeFormula(display, row.getValue(column.id)) : display);\n }\n });\n if (line.length > 0) {\n matrix.push(line);\n }\n });\n return toDelimited(matrix);\n },\n paste(origin, text) {\n if (\n !Number.isInteger(origin.row) ||\n !Number.isInteger(origin.column) ||\n origin.row < 0 ||\n origin.column < 0\n ) {\n return validation.edit(\n [],\n [\n issue(\n \"invalid_value\",\n \"The paste origin must use non-negative whole row and column indices.\",\n ),\n ],\n );\n }\n const { rows, columns } = getSnapshot();\n const parsed = readDelimited(text, {\n maxRows: Math.max(0, rows.length - origin.row),\n maxColumns: Math.max(0, columns.length - origin.column),\n maxCells: maxPasteCells,\n maxLength: maxPasteLength,\n });\n const issues = parsed.truncated\n ? [\n issue(\n \"paste_truncated\",\n \"The paste exceeds the visible grid or parsing limits; only complete cells within those limits are applied.\",\n ),\n ]\n : [];\n return validation.edit(rangeEdits(origin, parsed.rows), issues);\n },\n clear(range) {\n const matrix = Array.from({ length: range.bottom - range.top + 1 }, () =>\n Array.from({ length: range.right - range.left + 1 }, () => \"\"),\n );\n const current = getSnapshot();\n const edits = rangeEdits({ row: range.top, column: range.left }, matrix).filter((edit) => {\n const row = current.getRow(edit.rowKey);\n return (\n row !== undefined && current.getColumn(edit.column)?.isEditable(row.original) === true\n );\n });\n return validation.edit(edits);\n },\n exportRows({\n format = \"csv\",\n columns: ids,\n pageOnly = false,\n headers = true,\n escapeFormulas = true,\n depth = false,\n indent = \"\",\n } = {}) {\n const current = getSnapshot();\n const columns = ids\n ? ids.flatMap((id) => {\n const column = current.getColumn(id);\n return column ? [column] : [];\n })\n : current.columns;\n const rows = pageOnly ? current.rows : current.processedRows;\n const matrix = rows.map((row) =>\n columns.map((column, index) => {\n const display = (index === 0 ? indent.repeat(row.depth) : \"\") + row.getDisplay(column.id);\n return escapeFormulas ? escapeFormula(display, row.getValue(column.id)) : display;\n }),\n );\n if (depth) matrix.forEach((line, index) => line.unshift(String(rows[index]!.depth)));\n if (headers) {\n matrix.unshift(\n columns.map((column) => (escapeFormulas ? escapeFormula(column.header) : column.header)),\n );\n if (depth) matrix[0]!.unshift(\"Depth\");\n }\n return toDelimited(matrix, format === \"csv\" ? \",\" : \"\\t\");\n },\n\n reset() {\n commit(initialState);\n },\n destroy() {\n destroyed = true;\n streaming.cancel();\n validation.cancel();\n abortLoads(true);\n listeners.clear();\n },\n };\n startVisibleLoads();\n return table;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["isRecord"],"sources":["../src/humanize.ts","../src/issues.ts","../src/path.ts","../src/column.ts","../src/delimited.ts","../src/grid.ts","../src/undo-stack.ts","../src/virtualizer.ts","../src/infer.ts","../src/pipeline.ts","../src/row.ts","../src/state.ts","../src/validation.ts","../src/edit-validation.ts","../src/pending-changes.ts","../src/row-list.ts","../src/stream.ts","../src/tree.ts","../src/table.ts"],"sourcesContent":["/**\n * Turn a column id into a readable header: `\"name.first_name\"` becomes `\"Name first name\"` and\n * `\"createdAt\"` becomes `\"Created at\"`.\n */\nexport function humanize(id: string): string {\n const words = id\n .replace(/([a-z0-9])([A-Z])/gu, \"$1 $2\")\n .split(/[\\s._-]+/u)\n .filter((word) => word.length > 0)\n .map((word) => word.toLowerCase());\n const sentence = words.join(\" \");\n return sentence.charAt(0).toUpperCase() + sentence.slice(1);\n}\n","import type { RowKey } from \"./state\";\n\n/** Every problem the engine can report. The union grows in minor versions. */\nexport type TableIssueCode =\n | \"stream_error\"\n | \"invalid_stream_option\"\n | \"ingestion_conflict\"\n | \"invalid_ingestion\"\n | \"duplicate_row_key\"\n | \"unknown_column\"\n | \"invalid_page_size\"\n | \"unknown_row\"\n | \"read_only_cell\"\n | \"invalid_value\"\n | \"validation_failed\"\n | \"stale_draft\"\n | \"invalid_row_operation\"\n | \"invalid_expanded\"\n | \"unsafe_path\"\n | \"paste_truncated\"\n | \"invalid_paste_limit\"\n | \"invalid_virtual_option\"\n | \"invalid_virtual_size\"\n | \"invalid_virtual_viewport\"\n | \"duplicate_virtual_key\"\n | \"tree_cycle\"\n | \"tree_depth_exceeded\"\n | \"tree_orphan\"\n | \"tree_duplicate_key\"\n | \"tree_load_error\"\n | \"invalid_tree_option\";\n\n/**\n * A problem the engine recovered from. Invalid input is never dropped silently: the engine falls\n * back to something safe and reports what it did here.\n */\nexport interface TableIssue {\n readonly code: TableIssueCode;\n readonly message: string;\n readonly column?: string | undefined;\n readonly rowKey?: RowKey | undefined;\n readonly validationCode?: string | undefined;\n}\n\nexport function issue(\n code: TableIssueCode,\n message: string,\n details: {\n readonly column?: string | undefined;\n readonly rowKey?: RowKey | undefined;\n readonly validationCode?: string | undefined;\n } = {},\n): TableIssue {\n return Object.freeze({ code, message, ...details });\n}\n","/**\n * Dotted property paths.\n *\n * A column addresses nested data with a path such as `\"address.city\"`. The types below give every\n * such path its value type, and the functions read and write through a path without mutating.\n */\n\nimport { issue, type TableIssue } from \"./issues\";\n\ntype Leaf =\n | string\n | number\n | boolean\n | bigint\n | symbol\n | null\n | undefined\n | Date\n | readonly unknown[]\n | ((...args: never[]) => unknown);\n\ntype Depth = [never, 0, 1, 2, 3];\n\n/** Every dotted path into `T`, four levels deep. Arrays, dates, and functions are leaves. */\nexport type DeepKeys<T, TDepth extends number = 4> = [TDepth] extends [never]\n ? never\n : T extends Leaf\n ? never\n : {\n [K in keyof T & string]:\n | K\n | (NonNullable<T[K]> extends Leaf\n ? never\n : `${K}.${DeepKeys<NonNullable<T[K]>, Depth[TDepth]>}`);\n }[keyof T & string];\n\n/** The value found at `TPath` in `T`. A nullable step makes the result possibly `undefined`. */\nexport type PathValue<T, TPath extends string> = TPath extends `${infer THead}.${infer TRest}`\n ? THead extends keyof T\n ? PathValue<NonNullable<T[THead]>, TRest> | (undefined extends T[THead] ? undefined : never)\n : undefined\n : TPath extends keyof T\n ? T[TPath]\n : undefined;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Whether every path segment can be read or written without addressing a prototype. */\nexport function isSafePath(path: string): boolean {\n return path\n .split(\".\")\n .every(\n (segment) => segment !== \"__proto__\" && segment !== \"constructor\" && segment !== \"prototype\",\n );\n}\n\n/** Read the value at a dotted path, or `undefined` when a step is missing. */\nexport function getPath(source: unknown, path: string): unknown {\n if (!isSafePath(path)) {\n return undefined;\n }\n let current: unknown = source;\n for (const segment of path.split(\".\")) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\n/**\n * Return a copy of `source` with `value` at `path`. Only the objects along the path are copied;\n * everything else is shared. Missing steps are created as plain objects. Unsafe paths return\n * `source` unchanged and report an `unsafe_path` issue through `onIssue`, when supplied.\n */\nexport function setPath<T>(\n source: T,\n path: string,\n value: unknown,\n onIssue?: (problem: TableIssue) => void,\n): T {\n if (!isSafePath(path)) {\n onIssue?.(\n issue(\"unsafe_path\", `The path \"${path}\" addresses a prototype and cannot be written.`, {\n column: path,\n }),\n );\n return source;\n }\n const [head, ...rest] = path.split(\".\");\n const base: Record<string, unknown> = isRecord(source) ? { ...source } : {};\n if (head === undefined) {\n return source;\n }\n base[head] =\n rest.length === 0\n ? value\n : setPath(Object.hasOwn(base, head) ? base[head] : undefined, rest.join(\".\"), value);\n return base as T;\n}\n","import { humanize } from \"./humanize\";\nimport { getPath, isSafePath, setPath, type DeepKeys, type PathValue } from \"./path\";\nimport type { EditorSpec, Validator } from \"./validation\";\n\nexport type ColumnAlign = \"start\" | \"center\" | \"end\";\n\n/** How typed or pasted text becomes a value when a column has no `parse`. */\nexport type ColumnType = \"text\" | \"number\" | \"boolean\" | \"date\";\n\n/** A range filter value, inclusive at both ends. Either end may be left open. */\nexport interface RangeFilter {\n readonly min?: number | string | Date | undefined;\n readonly max?: number | string | Date | undefined;\n}\n\n/** Options shared by path columns and computed columns. */\nexport interface ColumnOptions<TRow, TValue> {\n /** Header text. Defaults to the id made readable: `\"createdAt\"` becomes `\"Created at\"`. */\n readonly header?: string | undefined;\n readonly align?: ColumnAlign | undefined;\n /** Width in pixels. */\n readonly width?: number | undefined;\n readonly minWidth?: number | undefined;\n /** Whether a user may sort by this column. Defaults to `true`. */\n readonly sortable?: boolean | undefined;\n /** Whether the free-text search looks at this column. Defaults to `true`. */\n readonly searchable?: boolean | undefined;\n /** Hidden until a user shows it. */\n readonly hidden?: boolean | undefined;\n /**\n * How text becomes a value. Defaults to the type of the cell's current value, or of another\n * row's value when the cell is empty.\n */\n readonly type?: ColumnType | undefined;\n /** Whether cells of this column accept edits. A function decides per row. */\n readonly editable?: boolean | ((row: TRow) => boolean) | undefined;\n /** Order two values; the engine flips the sign for descending sorts. */\n readonly compare?: ((left: TValue, right: TValue) => number) | undefined;\n /** Decide whether a row passes this column's filter value. */\n readonly filter?: ((value: TValue, filterValue: unknown, row: TRow) => boolean) | undefined;\n /** Turn a value into the text a cell shows, searches, copies, and exports. */\n readonly format?: ((value: TValue, row: TRow) => string) | undefined;\n /**\n * Turn typed or pasted text into a value. Throw to reject the input. Defaults to reading the\n * column's `type`.\n */\n readonly parse?: ((input: string, row: TRow) => TValue) | undefined;\n readonly validate?: Validator<TValue, TRow> | undefined;\n /** Serializable editor hints. Core enforces their constraints for every write. */\n readonly editor?: EditorSpec | undefined;\n /** Free-form data for renderers. The engine never reads it. */\n readonly meta?: Readonly<Record<string, unknown>> | undefined;\n}\n\n/** A column that reads `row[id]`, following dots into nested objects. */\nexport interface PathColumnDef<TRow, TPath extends string> extends ColumnOptions<\n TRow,\n PathValue<TRow, TPath>\n> {\n readonly id: TPath;\n readonly accessor?: undefined;\n readonly setValue?: undefined;\n}\n\n/** A column whose value is computed from the row. It is editable only with `setValue`. */\nexport interface ComputedColumnDef<TRow, TValue = unknown> extends ColumnOptions<TRow, TValue> {\n readonly id: string;\n readonly accessor: (row: TRow) => TValue;\n /** Return a copy of `row` carrying `value`. Without it the column is read-only. */\n readonly setValue?: ((row: TRow, value: TValue) => TRow) | undefined;\n}\n\n/**\n * One column definition. A path column is discriminated by its literal id, so `format`,\n * `compare`, and `parse` receive the value type found at that path.\n */\nexport type ColumnDef<TRow> =\n | {\n [TPath in DeepKeys<TRow>]: PathColumnDef<TRow, TPath>;\n }[DeepKeys<TRow>]\n | ComputedColumnDef<TRow, any>;\n\n/**\n * A column definition for any row type, for props and containers that accept every table.\n */\nexport type AnyColumnDef = ColumnDef<any>;\n\n/** Declare columns for a row type with full inference, outside a table. */\nexport function defineColumns<TRow>(\n columns: readonly ColumnDef<TRow>[],\n): readonly ColumnDef<TRow>[] {\n return Object.freeze([...columns]);\n}\n\n/**\n * A column resolved against its defaults. Renderers read these; they never read definitions.\n */\nexport interface TableColumn<TRow> {\n readonly id: string;\n readonly header: string;\n readonly align: ColumnAlign;\n readonly width: number | undefined;\n readonly minWidth: number | undefined;\n readonly sortable: boolean;\n readonly searchable: boolean;\n readonly initiallyHidden: boolean;\n readonly meta: Readonly<Record<string, unknown>>;\n readonly definition: ColumnDef<TRow>;\n getValue(row: TRow): unknown;\n format(value: unknown, row: TRow): string;\n compare(left: unknown, right: unknown): number;\n matches(value: unknown, filterValue: unknown, row: TRow): boolean;\n isEditable(row: TRow): boolean;\n /**\n * Parse text into a value, or report why it could not be read. `sample` is a value from another\n * row, used to tell the column's type when this cell is empty.\n */\n parse(input: string, row: TRow, sample?: unknown): ParseResult;\n /** Return a copy of `row` carrying `value`, or `undefined` for a read-only column. */\n setValue(row: TRow, value: unknown): TRow | undefined;\n}\n\n/** The outcome of reading text into a cell value. */\nexport type ParseResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly message: string };\n\nconst collator = new Intl.Collator(undefined, { numeric: true, sensitivity: \"base\" });\n\nfunction isEmpty(value: unknown): boolean {\n return value === null || value === undefined || value === \"\";\n}\n\n/** Order any two values: empty last, then numbers, dates, booleans, and text naturally. */\nexport function compareValues(left: unknown, right: unknown): number {\n const leftEmpty = isEmpty(left);\n const rightEmpty = isEmpty(right);\n if (leftEmpty || rightEmpty) {\n return leftEmpty === rightEmpty ? 0 : leftEmpty ? 1 : -1;\n }\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n if (typeof left === \"bigint\" && typeof right === \"bigint\") {\n return left < right ? -1 : left > right ? 1 : 0;\n }\n if (left instanceof Date && right instanceof Date) {\n return left.getTime() - right.getTime();\n }\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) - Number(right);\n }\n return collator.compare(formatValue(left), formatValue(right));\n}\n\n/**\n * Text for a value: empty for `null` and `undefined`, ISO for dates, comma-joined for arrays, and\n * JSON for other objects. The result never depends on the runtime's locale, so server and client\n * render the same text.\n */\nexport function formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? \"\" : value.toISOString();\n }\n if (Array.isArray(value)) {\n return value.map(formatValue).join(\", \");\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n switch (typeof value) {\n case \"string\":\n return value;\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return String(value);\n case \"symbol\":\n return value.toString();\n default:\n return \"\";\n }\n}\n\nfunction toComparable(value: unknown): number | string | undefined {\n if (value instanceof Date) {\n const time = value.getTime();\n return Number.isNaN(time) ? undefined : time;\n }\n if (typeof value === \"number\") {\n return Number.isNaN(value) ? undefined : value;\n }\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Read a range bound in the kind of the value it is compared with, so a bound typed into a text\n * box (`\"10\"`, `\"2024-01-31\"`) compares with numbers as a number and with dates as a time. An\n * empty or unreadable bound leaves that end of the range open.\n */\nfunction toBound(bound: unknown, value: unknown): number | string | undefined {\n if (isEmpty(bound)) {\n return undefined;\n }\n if (typeof bound === \"string\" && typeof value === \"number\") {\n const number = Number(bound.trim());\n return bound.trim() === \"\" || Number.isNaN(number) ? undefined : number;\n }\n if (typeof bound === \"string\" && value instanceof Date) {\n return toComparable(new Date(bound));\n }\n if (bound instanceof Date && typeof value === \"string\") {\n // Compare text dates at their own precision: \"2024-01-31\" against the bound's day.\n return Number.isNaN(bound.getTime()) ? undefined : bound.toISOString().slice(0, value.length);\n }\n return toComparable(bound);\n}\n\nfunction isRangeFilter(value: unknown): value is RangeFilter {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n (\"min\" in value || \"max\" in value)\n );\n}\n\n/**\n * The default column filter:\n *\n * - an empty filter value (`undefined`, `null`, `\"\"`, `[]`) lets every row through;\n * - an array keeps rows whose value is one of its items;\n * - `{ min, max }` keeps values inside the inclusive range; a bound given as text is read as a\n * number or a date when the value is one, and an empty bound leaves that end open;\n * - text keeps rows whose shown text contains it, ignoring case;\n * - anything else keeps rows whose value is identical.\n */\nexport function matchesFilter(value: unknown, filterValue: unknown, display: string): boolean {\n if (isEmpty(filterValue) || (Array.isArray(filterValue) && filterValue.length === 0)) {\n return true;\n }\n if (Array.isArray(filterValue)) {\n return filterValue.some((item) => Object.is(item, value) || compareValues(item, value) === 0);\n }\n if (isRangeFilter(filterValue)) {\n const min = toBound(filterValue.min, value);\n const max = toBound(filterValue.max, value);\n if (min === undefined && max === undefined) {\n return true;\n }\n const comparable = toComparable(value);\n if (comparable === undefined) {\n return false;\n }\n return (min === undefined || comparable >= min) && (max === undefined || comparable <= max);\n }\n if (typeof filterValue === \"string\") {\n return display.toLowerCase().includes(filterValue.toLowerCase());\n }\n return Object.is(value, filterValue);\n}\n\nconst TRUE_WORDS = new Set([\"true\", \"1\", \"yes\", \"y\", \"on\"]);\nconst FALSE_WORDS = new Set([\"false\", \"0\", \"no\", \"n\", \"off\"]);\n\n/** The column type a value suggests, or `undefined` for an empty value. */\nexport function typeOf(value: unknown): ColumnType | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"number\") {\n return \"number\";\n }\n if (typeof value === \"boolean\") {\n return \"boolean\";\n }\n return value instanceof Date ? \"date\" : \"text\";\n}\n\n/** Read text as a column type. Empty text is `null` for every type but text. */\nexport function parseAs(input: string, type: ColumnType): ParseResult {\n const text = input.trim();\n if (type === \"text\") {\n return { ok: true, value: input };\n }\n if (text === \"\") {\n return { ok: true, value: null };\n }\n if (type === \"number\") {\n const value = Number(text);\n return Number.isFinite(value)\n ? { ok: true, value }\n : { ok: false, message: `\"${input}\" is not a number` };\n }\n if (type === \"boolean\") {\n const word = text.toLowerCase();\n if (TRUE_WORDS.has(word)) {\n return { ok: true, value: true };\n }\n if (FALSE_WORDS.has(word)) {\n return { ok: true, value: false };\n }\n return { ok: false, message: `\"${input}\" is not a yes or no value` };\n }\n const value = new Date(text);\n return Number.isNaN(value.getTime())\n ? { ok: false, message: `\"${input}\" is not a date` }\n : { ok: true, value };\n}\n\n/** Resolve a definition against its defaults. */\nexport function resolveColumn<TRow>(definition: ColumnDef<TRow>): TableColumn<TRow> {\n // Both branches of the union share these members; the value type is erased at runtime.\n const def = definition as ComputedColumnDef<TRow> | PathColumnDef<TRow, string>;\n const { accessor } = def;\n const safe = isSafePath(def.id);\n const getValue: (row: TRow) => unknown = safe\n ? (accessor ?? ((row) => getPath(row, def.id)))\n : () => undefined;\n const format = def.format ?? ((value: unknown) => formatValue(value));\n const compare = def.compare ?? compareValues;\n const customFilter = def.filter;\n const customParse = def.parse;\n const editable = def.editable ?? false;\n const customSetValue = def.setValue;\n const canWrite = safe && (accessor === undefined || customSetValue !== undefined);\n\n return Object.freeze({\n id: def.id,\n header: def.header ?? humanize(def.id),\n align: def.align ?? \"start\",\n width: def.width,\n minWidth: def.minWidth,\n sortable: def.sortable ?? true,\n searchable: def.searchable ?? true,\n initiallyHidden: def.hidden ?? false,\n meta: Object.freeze({ ...def.meta }),\n definition,\n getValue,\n format: (value: unknown, row: TRow): string => format(value as never, row),\n compare: (left: unknown, right: unknown): number => compare(left as never, right as never),\n matches(value: unknown, filterValue: unknown, row: TRow): boolean {\n return customFilter\n ? customFilter(value as never, filterValue, row)\n : matchesFilter(value, filterValue, format(value as never, row));\n },\n isEditable(row: TRow): boolean {\n if (!canWrite) {\n return false;\n }\n return typeof editable === \"function\" ? editable(row) : editable;\n },\n parse(input: string, row: TRow, sample?: unknown): ParseResult {\n if (customParse) {\n try {\n return { ok: true, value: customParse(input, row) };\n } catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n }\n return parseAs(input, def.type ?? typeOf(getValue(row)) ?? typeOf(sample) ?? \"text\");\n },\n setValue(row: TRow, value: unknown): TRow | undefined {\n if (!safe) {\n return undefined;\n }\n if (customSetValue) {\n return customSetValue(row, value);\n }\n return accessor === undefined ? setPath(row, def.id, value) : undefined;\n },\n });\n}\n","/**\n * Delimited text: tab-separated for the clipboard, comma-separated for export.\n *\n * A field is quoted when it holds the delimiter, a quote, or a line break, and quotes inside it\n * are doubled. This is what spreadsheet applications write and read.\n */\n\nfunction quote(field: string, delimiter: string): string {\n return field.includes(delimiter) ||\n field.includes('\"') ||\n field.includes(\"\\n\") ||\n field.includes(\"\\r\")\n ? `\"${field.replaceAll('\"', '\"\"')}\"`\n : field;\n}\n\n/** Escape formula-like display text; a finite number formatted as a number stays numeric. */\nexport function escapeFormula(text: string, value?: unknown): string {\n const numeric =\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/u.test(text);\n return !numeric && /^[=+\\-@\\t\\r\\n=+-@]/u.test(text) ? \"'\" + text : text;\n}\n\nexport interface DelimitedLimits {\n readonly maxRows: number;\n readonly maxColumns: number;\n readonly maxCells: number;\n readonly maxLength: number;\n}\n\nexport interface DelimitedResult {\n readonly rows: string[][];\n readonly truncated: boolean;\n}\n\n/** Write a matrix of text as delimited lines joined with `\\n`. */\nexport function toDelimited(matrix: readonly (readonly string[])[], delimiter = \"\\t\"): string {\n return matrix\n .map((line) => line.map((field) => quote(field, delimiter)).join(delimiter))\n .join(\"\\n\");\n}\n\n/**\n * Read delimited text into a matrix. Accepts `\\n` and `\\r\\n`, quoted fields with doubled quotes\n * and embedded line breaks, and ignores one trailing line break.\n */\nexport function parseDelimited(text: string, delimiter = \"\\t\"): string[][] {\n return readDelimited(\n text,\n {\n maxRows: Infinity,\n maxColumns: Infinity,\n maxCells: Infinity,\n maxLength: Infinity,\n },\n delimiter,\n ).rows;\n}\n\n/** Read complete fields within a grid and work budget, without materializing discarded fields. */\nexport function readDelimited(\n text: string,\n limits: DelimitedLimits,\n delimiter = \"\\t\",\n): DelimitedResult {\n const rows: string[][] = [];\n if (limits.maxRows === 0 || limits.maxColumns === 0) {\n return { rows, truncated: text.length > 0 };\n }\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n let started = false;\n let index = 0;\n let column = 0;\n let cells = 0;\n let truncated = false;\n const end = Math.min(text.length, limits.maxLength);\n\n const endField = (): void => {\n if (column < limits.maxColumns) {\n row.push(field);\n } else {\n truncated = true;\n }\n column += 1;\n cells += 1;\n field = \"\";\n started = false;\n };\n const append = (char: string): void => {\n if (column < limits.maxColumns) {\n field += char;\n }\n };\n\n while (index < end) {\n const char = text.charAt(index);\n if (quoted) {\n if (char === '\"') {\n if (index + 1 < end && text.charAt(index + 1) === '\"') {\n append('\"');\n index += 1;\n } else {\n quoted = false;\n }\n } else {\n append(char);\n }\n } else if (char === '\"' && !started) {\n quoted = true;\n } else if (char === delimiter) {\n endField();\n index += 1;\n if (\n cells >= limits.maxCells ||\n (rows.length + 1 >= limits.maxRows && column >= limits.maxColumns)\n ) {\n rows.push(row);\n return { rows, truncated: true };\n }\n continue;\n } else if (char === \"\\n\" || char === \"\\r\") {\n if (char === \"\\r\" && index + 1 < end && text.charAt(index + 1) === \"\\n\") {\n index += 1;\n }\n endField();\n rows.push(row);\n row = [];\n column = 0;\n index += 1;\n if (cells >= limits.maxCells || rows.length >= limits.maxRows) {\n return { rows, truncated: truncated || index < text.length };\n }\n continue;\n } else {\n append(char);\n }\n started = true;\n index += 1;\n }\n\n if (end < text.length) {\n // A field cut short by the character budget must never become a different cell value.\n if (row.length > 0) {\n rows.push(row);\n }\n return { rows, truncated: true };\n }\n if (started || column > 0) {\n endField();\n rows.push(row);\n }\n return { rows, truncated };\n}\n","/**\n * Spreadsheet addressing and selection.\n *\n * A cell is addressed by its position in what is shown: the row index on the current page and the\n * column index among visible columns. A selection is an anchor, where it started, and a focus,\n * where it is now; the rectangle between them is the selected range.\n */\n\nexport interface CellPosition {\n readonly row: number;\n readonly column: number;\n}\n\nexport interface CellRange {\n readonly top: number;\n readonly left: number;\n readonly bottom: number;\n readonly right: number;\n}\n\nexport interface GridSelection {\n readonly anchor: CellPosition;\n readonly focus: CellPosition;\n}\n\n/** The size of the addressable grid. */\nexport interface GridBounds {\n readonly rows: number;\n readonly columns: number;\n}\n\nexport type GridDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\nexport interface MoveOptions {\n /** Keep the anchor and move only the focus, growing or shrinking the range. */\n readonly extend?: boolean | undefined;\n /** Jump to the edge of the grid in that direction. */\n readonly toEdge?: boolean | undefined;\n}\n\nfunction clamp(value: number, max: number): number {\n return Math.min(Math.max(0, value), Math.max(0, max - 1));\n}\n\nexport function clampPosition(position: CellPosition, bounds: GridBounds): CellPosition {\n return { row: clamp(position.row, bounds.rows), column: clamp(position.column, bounds.columns) };\n}\n\n/** A selection of one cell. */\nexport function selectCell(position: CellPosition): GridSelection {\n return { anchor: position, focus: position };\n}\n\n/** Move the focus one step, or to the edge, staying inside the bounds. */\nexport function moveSelection(\n selection: GridSelection,\n direction: GridDirection,\n bounds: GridBounds,\n options: MoveOptions = {},\n): GridSelection {\n const { row, column } = selection.focus;\n const far = options.toEdge === true;\n const next: CellPosition = clampPosition(\n {\n row:\n direction === \"up\"\n ? far\n ? 0\n : row - 1\n : direction === \"down\"\n ? far\n ? bounds.rows - 1\n : row + 1\n : row,\n column:\n direction === \"left\"\n ? far\n ? 0\n : column - 1\n : direction === \"right\"\n ? far\n ? bounds.columns - 1\n : column + 1\n : column,\n },\n bounds,\n );\n return options.extend === true\n ? { anchor: selection.anchor, focus: next }\n : { anchor: next, focus: next };\n}\n\n/** The rectangle a selection covers. */\nexport function selectionRange(selection: GridSelection): CellRange {\n return {\n top: Math.min(selection.anchor.row, selection.focus.row),\n left: Math.min(selection.anchor.column, selection.focus.column),\n bottom: Math.max(selection.anchor.row, selection.focus.row),\n right: Math.max(selection.anchor.column, selection.focus.column),\n };\n}\n\nexport function rangeContains(range: CellRange, position: CellPosition): boolean {\n return (\n position.row >= range.top &&\n position.row <= range.bottom &&\n position.column >= range.left &&\n position.column <= range.right\n );\n}\n\n/** `0` is `\"A\"`, `25` is `\"Z\"`, `26` is `\"AA\"`. */\nexport function columnLabel(index: number): string {\n let label = \"\";\n let rest = index + 1;\n while (rest > 0) {\n const remainder = (rest - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n rest = Math.floor((rest - 1) / 26);\n }\n return label;\n}\n\n/** `{ row: 2, column: 1 }` is `\"B3\"`. */\nexport function toA1(position: CellPosition): string {\n return `${columnLabel(position.column)}${position.row + 1}`;\n}\n\n/** `\"B3\"` is `{ row: 2, column: 1 }`. Returns `undefined` for anything else. */\nexport function fromA1(reference: string): CellPosition | undefined {\n const match = /^([A-Z]+)([1-9]\\d*)$/u.exec(reference.trim().toUpperCase());\n if (!match?.[1] || !match[2]) {\n return undefined;\n }\n let column = 0;\n for (const char of match[1]) {\n column = column * 26 + (char.charCodeAt(0) - 64);\n }\n return { row: Number(match[2]) - 1, column: column - 1 };\n}\n\n/** The keys of a keyboard event that grid navigation reads. */\nexport interface GridKey {\n readonly key: string;\n readonly shiftKey?: boolean | undefined;\n readonly ctrlKey?: boolean | undefined;\n readonly metaKey?: boolean | undefined;\n readonly altKey?: boolean | undefined;\n}\n\n/** What a key press asks a grid to do while no cell is being edited. */\nexport type GridCommand =\n | {\n readonly type: \"tree\";\n readonly action: \"expand\" | \"collapse\" | \"child\" | \"parent\" | \"siblings\";\n }\n | { readonly type: \"move\"; readonly direction: GridDirection; readonly options: MoveOptions }\n | { readonly type: \"edit\"; readonly initial?: string | undefined }\n | { readonly type: \"clear\" }\n | { readonly type: \"selectAll\" }\n | { readonly type: \"undo\" }\n | { readonly type: \"redo\" }\n | { readonly type: \"cancel\" };\n\nconst ARROWS: Readonly<Record<string, GridDirection>> = {\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n ArrowLeft: \"left\",\n ArrowRight: \"right\",\n};\n\n/**\n * Map a key press to a grid command, spreadsheet style: arrows move (Shift extends, Ctrl or Cmd\n * jumps to the edge), Tab moves across, Home and End reach the row's ends, Enter or F2 edit,\n * a printable character starts editing with that character, Delete and Backspace clear, Escape\n * collapses the selection, and Ctrl or Cmd with A, Z, Y select all, undo, and redo.\n */\n/** Hierarchy navigation is enabled only at the caller's designated tree column. */\nexport interface GridTreeContext {\n readonly canExpand: boolean;\n readonly expanded: boolean;\n}\n\nexport function gridCommand(event: GridKey, tree?: GridTreeContext): GridCommand | undefined {\n const mod = event.ctrlKey === true || event.metaKey === true;\n const shift = event.shiftKey === true;\n if (tree && !mod && !event.altKey) {\n if (event.key === \"*\") return { type: \"tree\", action: \"siblings\" };\n if (!shift && event.key === \"ArrowRight\" && tree.canExpand)\n return { type: \"tree\", action: tree.expanded ? \"child\" : \"expand\" };\n if (!shift && event.key === \"ArrowLeft\")\n return { type: \"tree\", action: tree.canExpand && tree.expanded ? \"collapse\" : \"parent\" };\n }\n const direction = ARROWS[event.key];\n if (direction) {\n return { type: \"move\", direction, options: { extend: shift, toEdge: mod } };\n }\n switch (event.key) {\n case \"Tab\":\n return { type: \"move\", direction: shift ? \"left\" : \"right\", options: {} };\n case \"Home\":\n case \"End\":\n return {\n type: \"move\",\n direction: event.key === \"Home\" ? \"left\" : \"right\",\n options: { extend: shift, toEdge: true },\n };\n case \"Enter\":\n case \"F2\":\n return { type: \"edit\" };\n case \"Delete\":\n case \"Backspace\":\n return { type: \"clear\" };\n case \"Escape\":\n return { type: \"cancel\" };\n default:\n break;\n }\n if (mod) {\n const key = event.key.toLowerCase();\n if (key === \"a\") {\n return { type: \"selectAll\" };\n }\n if (key === \"z\") {\n return shift ? { type: \"redo\" } : { type: \"undo\" };\n }\n if (key === \"y\") {\n return { type: \"redo\" };\n }\n return undefined;\n }\n if (event.key.length === 1 && event.altKey !== true) {\n return { type: \"edit\", initial: event.key };\n }\n return undefined;\n}\n","/**\n * An undo stack of batches. Recording a batch clears whatever could be redone, and the stack\n * keeps at most `limit` batches, dropping the oldest.\n */\nexport interface UndoStack<TEntry> {\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n record(entry: TEntry): void;\n /** Take the most recent batch to undo, if any. */\n undo(): TEntry | undefined;\n /** Take the most recently undone batch to redo, if any. */\n redo(): TEntry | undefined;\n clear(): void;\n /** Reconcile retained user batches after source ingestion. Undefined drops a batch. */\n transform(map: (entry: TEntry) => TEntry | undefined): void;\n}\n\nexport function createUndoStack<TEntry>(limit = 100): UndoStack<TEntry> {\n const past: TEntry[] = [];\n const future: TEntry[] = [];\n return {\n get canUndo(): boolean {\n return past.length > 0;\n },\n get canRedo(): boolean {\n return future.length > 0;\n },\n record(entry: TEntry): void {\n past.push(entry);\n if (past.length > limit) {\n past.shift();\n }\n future.length = 0;\n },\n undo(): TEntry | undefined {\n const entry = past.pop();\n if (entry !== undefined) {\n future.push(entry);\n }\n return entry;\n },\n redo(): TEntry | undefined {\n const entry = future.pop();\n if (entry !== undefined) {\n past.push(entry);\n }\n return entry;\n },\n clear(): void {\n past.length = 0;\n future.length = 0;\n },\n transform(map): void {\n const update = (entries: TEntry[]): TEntry[] =>\n entries.flatMap((entry) => {\n const value = map(entry);\n return value === undefined ? [] : [value];\n });\n const nextPast = update(past);\n const nextFuture = update(future);\n past.splice(0, past.length, ...nextPast);\n future.splice(0, future.length, ...nextFuture);\n },\n };\n}\n","import { issue, type TableIssue, type TableIssueCode } from \"./issues\";\nimport type { RowKey } from \"./state\";\n\nexport type VirtualAlign = \"start\" | \"center\" | \"end\" | \"auto\";\n\nexport interface VirtualizerOptions {\n readonly count: number;\n readonly estimateSize: number | ((index: number) => number);\n /** Extra items on each side. Defaults to 5. */\n readonly overscan?: number | undefined;\n /** Stable, unique identities preserve measurements across reorder and filtering. */\n readonly getKey?: ((index: number) => RowKey) | undefined;\n readonly onIssue?: ((problem: TableIssue) => void) | undefined;\n}\n\nexport interface VirtualItem {\n readonly index: number;\n readonly key: RowKey;\n readonly start: number;\n readonly size: number;\n}\n\nexport interface VirtualWindow {\n readonly items: readonly VirtualItem[];\n readonly totalSize: number;\n readonly paddingStart: number;\n readonly paddingEnd: number;\n /** Inclusive indices; an empty result uses 0 and -1. */\n readonly startIndex: number;\n readonly endIndex: number;\n /** Clamped viewport values, excluding overscan. */\n readonly offset: number;\n readonly viewportSize: number;\n readonly issues: readonly TableIssue[];\n}\n\nexport interface Virtualizer {\n setOptions(options: VirtualizerOptions): void;\n setViewport(offset: number, size: number): void;\n measure(key: RowKey, size: number): void;\n getWindow(): VirtualWindow;\n /** Read an item's layout without moving the viewport; out-of-range indices return undefined. */\n getItem(index: number): VirtualItem | undefined;\n getOffsetForIndex(index: number, align?: VirtualAlign): number;\n subscribe(listener: (view: VirtualWindow) => void): () => void;\n}\n\nconst FALLBACK_SIZE = 40;\n\n/** Layout arithmetic for either axis. All viewport values and measurements come from the caller. */\nexport function createVirtualizer(initialOptions: VirtualizerOptions): Virtualizer {\n let options = initialOptions;\n let count = 0;\n let overscan = 5;\n let fixedSize: number | undefined;\n let keys: RowKey[] = [];\n let byKey = new Map<RowKey, number>();\n let sizes: number[] = [];\n // Retain only the prefix before the first changed item; extend it lazily on the next lookup.\n let prefix = [0];\n let offset = 0;\n let viewportSize = 0;\n let cached: VirtualWindow | undefined;\n const measured = new Map<RowKey, number>();\n const problems = new Map<TableIssueCode, TableIssue>();\n const listeners = new Set<(view: VirtualWindow) => void>();\n\n function recover(code: TableIssueCode, message: string): void {\n // One representative issue per code keeps diagnostics bounded even for many bad items.\n if (!problems.has(code)) {\n const problem = issue(code, message);\n problems.set(code, problem);\n options.onIssue?.(problem);\n cached = undefined;\n }\n }\n\n function validSize(value: number): number {\n if (Number.isFinite(value) && value > 0) return value;\n recover(\n \"invalid_virtual_size\",\n `Item size ${String(value)} is not positive and finite; 40 is used.`,\n );\n return FALLBACK_SIZE;\n }\n\n function configure(next: VirtualizerOptions): void {\n options = next;\n problems.clear();\n count = Number.isSafeInteger(next.count) && next.count >= 0 ? next.count : 0;\n if (count !== next.count) {\n recover(\n \"invalid_virtual_option\",\n \"Virtual item count must be a non-negative safe integer; 0 is used.\",\n );\n }\n const requestedOverscan = next.overscan ?? 5;\n overscan =\n Number.isSafeInteger(requestedOverscan) && requestedOverscan >= 0 ? requestedOverscan : 5;\n if (overscan !== requestedOverscan) {\n recover(\"invalid_virtual_option\", \"Overscan must be a non-negative safe integer; 5 is used.\");\n }\n const estimate =\n typeof next.estimateSize === \"number\" ? validSize(next.estimateSize) : undefined;\n const nextKeys: RowKey[] = [];\n const nextSizes: number[] = [];\n const nextByKey = new Map<RowKey, number>();\n let firstChanged = count;\n let uniform = estimate !== undefined;\n for (let index = 0; index < count; index += 1) {\n let key = next.getKey ? next.getKey(index) : index;\n if (!(typeof key === \"string\" || (typeof key === \"number\" && Number.isFinite(key)))) {\n recover(\"invalid_virtual_option\", `Item ${index} has an invalid key; its index is used.`);\n key = index;\n }\n if (nextByKey.has(key)) {\n recover(\n \"duplicate_virtual_key\",\n `Item ${index} repeats a key; a distinct fallback key is used.`,\n );\n key = JSON.stringify([\"virtual\", index]);\n while (nextByKey.has(key)) key += \":\";\n }\n const size =\n measured.get(key) ??\n estimate ??\n validSize((next.estimateSize as (index: number) => number)(index));\n uniform &&= size === estimate;\n if (keys[index] !== key || sizes[index] !== size)\n firstChanged = Math.min(firstChanged, index);\n nextKeys.push(key);\n nextSizes.push(size);\n nextByKey.set(key, index);\n }\n if (fixedSize !== undefined || uniform) prefix = [0];\n else prefix.length = Math.min(prefix.length, firstChanged + 1);\n keys = nextKeys;\n sizes = nextSizes;\n byKey = nextByKey;\n fixedSize = uniform ? estimate : undefined;\n cached = undefined;\n }\n\n function startOf(index: number): number {\n if (fixedSize !== undefined) return index * fixedSize;\n while (prefix.length <= index) {\n const at = prefix.length - 1;\n prefix.push(prefix[at]! + sizes[at]!);\n }\n return prefix[index]!;\n }\n\n function totalSize(): number {\n return startOf(count);\n }\n\n function indexAt(position: number): number {\n if (fixedSize !== undefined) return Math.min(count - 1, Math.floor(position / fixedSize));\n let low = 0;\n let high = count - 1;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n if (startOf(middle + 1) <= position) low = middle + 1;\n else high = middle;\n }\n return low;\n }\n\n function getWindow(): VirtualWindow {\n if (cached) return cached;\n const total = totalSize();\n const clampedOffset = Math.min(offset, Math.max(0, total - viewportSize));\n let first = 0;\n let last = -1;\n if (count > 0 && viewportSize > 0) {\n first = Math.max(0, indexAt(clampedOffset) - overscan);\n const edge = Math.min(total, clampedOffset + viewportSize);\n let visibleEnd = indexAt(edge);\n if (startOf(visibleEnd) >= edge) visibleEnd -= 1;\n last = Math.min(count - 1, visibleEnd + overscan);\n }\n const items: VirtualItem[] = [];\n for (let index = first; index <= last; index += 1) {\n items.push(\n Object.freeze({ index, key: keys[index]!, start: startOf(index), size: sizes[index]! }),\n );\n }\n const paddingStart = items.length > 0 ? startOf(first) : 0;\n const paddingEnd = items.length > 0 ? Math.max(0, total - startOf(last + 1)) : total;\n cached = Object.freeze({\n items: Object.freeze(items),\n totalSize: total,\n paddingStart,\n paddingEnd,\n startIndex: first,\n endIndex: last,\n offset: clampedOffset,\n viewportSize,\n issues: Object.freeze([...problems.values()]),\n });\n return cached;\n }\n\n function notify(): void {\n cached = undefined;\n if (listeners.size > 0) {\n const view = getWindow();\n for (const listener of listeners) listener(view);\n }\n }\n\n configure(initialOptions);\n return {\n setOptions(next) {\n configure(next);\n notify();\n },\n setViewport(nextOffset, nextSize) {\n const issueCount = problems.size;\n const safeOffset = Number.isFinite(nextOffset) && nextOffset >= 0 ? nextOffset : 0;\n const safeSize = Number.isFinite(nextSize) && nextSize >= 0 ? nextSize : 0;\n if (safeOffset !== nextOffset || safeSize !== nextSize) {\n recover(\n \"invalid_virtual_viewport\",\n \"Viewport offset and size must be non-negative and finite; invalid values use 0.\",\n );\n }\n if (offset === safeOffset && viewportSize === safeSize && problems.size === issueCount)\n return;\n offset = safeOffset;\n viewportSize = safeSize;\n notify();\n },\n measure(key, size) {\n const index = byKey.get(key);\n if (index === undefined) return;\n if (!Number.isFinite(size) || size <= 0) {\n recover(\n \"invalid_virtual_size\",\n \"Measured size must be positive and finite; the previous size is retained.\",\n );\n notify();\n return;\n }\n measured.set(key, size);\n if (sizes[index] === size) return;\n if (fixedSize !== undefined) {\n fixedSize = undefined;\n prefix = [0];\n } else prefix.length = Math.min(prefix.length, index + 1);\n sizes[index] = size;\n notify();\n },\n getWindow,\n getItem(index) {\n return Number.isSafeInteger(index) && index >= 0 && index < count\n ? Object.freeze({ index, key: keys[index]!, start: startOf(index), size: sizes[index]! })\n : undefined;\n },\n getOffsetForIndex(index, align = \"auto\") {\n if (count === 0) return 0;\n if (!Number.isFinite(index) || !Number.isInteger(index)) {\n recover(\n \"invalid_virtual_option\",\n \"Scroll index must be a finite integer; it is clamped to a valid item.\",\n );\n }\n const target = Math.min(\n count - 1,\n Math.max(0, Number.isFinite(index) ? Math.trunc(index) : 0),\n );\n const start = startOf(target);\n const end = start + sizes[target]!;\n const current = getWindow().offset;\n let result = start;\n if (align === \"center\") result = start - (viewportSize - sizes[target]!) / 2;\n else if (align === \"end\") result = end - viewportSize;\n else if (align === \"auto\") {\n result =\n start < current ? start : end > current + viewportSize ? end - viewportSize : current;\n }\n return Math.min(Math.max(0, totalSize() - viewportSize), Math.max(0, result));\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","import type { ColumnDef } from \"./column\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction collect(value: unknown, prefix: string, depth: number, into: Set<string>): void {\n if (!isPlainObject(value)) {\n return;\n }\n for (const [key, child] of Object.entries(value)) {\n const path = prefix === \"\" ? key : `${prefix}.${key}`;\n if (isPlainObject(child) && depth < 4) {\n collect(child, path, depth + 1, into);\n } else {\n into.add(path);\n }\n }\n}\n\n/**\n * Columns for data that has none declared: one path column per leaf of the first `sample` rows,\n * nested objects flattened into dotted paths, in first-seen order.\n */\nexport function inferColumns<TRow>(rows: readonly TRow[], sample = 20): readonly ColumnDef<TRow>[] {\n const paths = new Set<string>();\n for (const row of rows.slice(0, sample)) {\n collect(row, \"\", 1, paths);\n }\n return Object.freeze([...paths].map((id) => ({ id }) as ColumnDef<TRow>));\n}\n","import type { TableColumn } from \"./column\";\nimport type { TableRow } from \"./row\";\nimport type { PaginationState, SortRule } from \"./state\";\n\n/**\n * The row pipeline: filter, then sort, then paginate. Each stage is a pure function, so a table\n * recomputes only the stages whose inputs changed, and a server can run the same stages.\n */\n\n/** Split free text into lowercase terms. */\nfunction searchTerms(search: string): readonly string[] {\n return search\n .toLowerCase()\n .split(/\\s+/u)\n .filter((term) => term.length > 0);\n}\n\n/**\n * Keep rows that pass every column filter and contain every search term in at least one\n * searchable column.\n */\nexport function filterRows<TRow>(\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n search: string,\n filters: Readonly<Record<string, unknown>>,\n): readonly TableRow<TRow>[] {\n const terms = searchTerms(search);\n const byId = new Map(columns.map((column) => [column.id, column]));\n const activeFilters = Object.entries(filters).flatMap(([id, value]) => {\n const column = byId.get(id);\n return column && value !== undefined ? [{ column, value }] : [];\n });\n const searchable = columns.filter((column) => column.searchable);\n\n if (terms.length === 0 && activeFilters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => {\n for (const { column, value } of activeFilters) {\n if (!column.matches(row.getValue(column.id), value, row.original)) {\n return false;\n }\n }\n if (terms.length === 0) {\n return true;\n }\n const haystack = searchable.map((column) => row.getDisplay(column.id).toLowerCase());\n return terms.every((term) => haystack.some((text) => text.includes(term)));\n });\n}\n\n/** Sort rows by each rule in turn. The sort is stable: ties keep their incoming order. */\nexport function sortRows<TRow>(\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n sorting: readonly SortRule[],\n): readonly TableRow<TRow>[] {\n if (!sorting.some((rule) => columns.some((column) => column.id === rule.column))) return rows;\n return rows.toSorted(compareRows(columns, sorting));\n}\n\nexport function compareRows<TRow>(\n columns: readonly TableColumn<TRow>[],\n sorting: readonly SortRule[],\n): (left: TableRow<TRow>, right: TableRow<TRow>) => number {\n const byId = new Map(columns.map((column) => [column.id, column]));\n const rules = sorting.flatMap((rule) => {\n const column = byId.get(rule.column);\n return column ? [{ column, sign: rule.direction === \"desc\" ? -1 : 1 }] : [];\n });\n return (left, right) => {\n for (const { column, sign } of rules) {\n const leftValue = left.getValue(column.id);\n const rightValue = right.getValue(column.id);\n const leftEmpty = leftValue === null || leftValue === undefined || leftValue === \"\";\n const rightEmpty = rightValue === null || rightValue === undefined || rightValue === \"\";\n // Empty values stay last in both directions.\n if (leftEmpty !== rightEmpty) {\n return leftEmpty ? 1 : -1;\n }\n const order = column.compare(leftValue, rightValue) * sign;\n if (order !== 0) {\n return order;\n }\n }\n return 0;\n };\n}\n\n/** Stable merge: an existing row wins a tie against an incoming row. */\nexport function mergeRows<TRow>(\n previous: readonly TableRow<TRow>[],\n incoming: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n sorting: readonly SortRule[],\n): readonly TableRow<TRow>[] {\n const compare = compareRows(columns, sorting);\n const added = sortRows(incoming, columns, sorting);\n const result: TableRow<TRow>[] = [];\n let left = 0;\n let right = 0;\n while (left < previous.length && right < added.length) {\n result.push(compare(previous[left]!, added[right]!) <= 0 ? previous[left++]! : added[right++]!);\n }\n while (left < previous.length) result.push(previous[left++]!);\n while (right < added.length) result.push(added[right++]!);\n return result;\n}\n\n/** The number of pages for a row count. An empty table still has one page. */\nexport function countPages(rowCount: number, pageSize: number): number {\n return Math.max(1, Math.ceil(rowCount / pageSize));\n}\n\n/** Clamp a page into `1..pageCount`. */\nexport function clampPage(page: number, pageCount: number): number {\n return Math.min(Math.max(1, Math.trunc(page) || 1), pageCount);\n}\n\n/** The rows on one page. `pagination.page` must already be clamped. */\nexport function paginateRows<TRow>(\n rows: readonly TableRow<TRow>[],\n pagination: PaginationState,\n): readonly TableRow<TRow>[] {\n const start = (pagination.page - 1) * pagination.pageSize;\n return rows.slice(start, start + pagination.pageSize);\n}\n\n/** A page number, or a gap between page numbers. */\nexport type PageItem =\n | { readonly type: \"page\"; readonly page: number; readonly current: boolean }\n | { readonly type: \"gap\"; readonly key: string };\n\n/**\n * The page buttons to show: always the first and last page, `siblings` pages on each side of the\n * current one, and a gap wherever pages are skipped. A gap never hides a single page.\n */\nexport function paginationItems(\n page: number,\n pageCount: number,\n siblings = 1,\n): readonly PageItem[] {\n const pages = new Set<number>([1, pageCount]);\n for (let offset = -siblings; offset <= siblings; offset += 1) {\n const candidate = page + offset;\n if (candidate >= 1 && candidate <= pageCount) {\n pages.add(candidate);\n }\n }\n const sorted = [...pages].toSorted((left, right) => left - right);\n const items: PageItem[] = [];\n let previous = 0;\n for (const value of sorted) {\n if (value - previous === 2) {\n items.push({ type: \"page\", page: value - 1, current: value - 1 === page });\n } else if (value - previous > 2) {\n items.push({ type: \"gap\", key: `gap-${previous}-${value}` });\n }\n items.push({ type: \"page\", page: value, current: value === page });\n previous = value;\n }\n return items;\n}\n","import type { TableColumn } from \"./column\";\nimport type { TableIssue } from \"./issues\";\nimport type { RowKey } from \"./state\";\nimport type { ChildStatus } from \"./tree\";\n\n/**\n * One row of data as the engine sees it: its key, its position in the source data, and cached\n * access to each column's value and text.\n */\nexport interface TableRow<TRow> {\n readonly key: RowKey;\n /** Position in the data the table was given. */\n readonly index: number;\n readonly original: TRow;\n readonly canExpand: boolean;\n readonly isExpanded: boolean;\n readonly depth: number;\n readonly parentKey: RowKey | undefined;\n readonly childCount: number | undefined;\n readonly childStatus: ChildStatus;\n /** Coverage of this row and its loaded descendants. */\n readonly selection: \"none\" | \"some\" | \"all\";\n readonly isDirty: boolean;\n readonly cellIssues: ReadonlyMap<string, TableIssue> | undefined;\n getValue(columnId: string): unknown;\n /** The formatted text of a cell, as shown, searched, copied, and exported. */\n getDisplay(columnId: string): string;\n}\n\nexport type RowItemKind = \"row\" | \"detail\";\n\n/** A renderer item; detail items do not count as data rows or grid coordinates. */\nexport interface TableRenderItem<TRow> {\n readonly kind: RowItemKind;\n readonly key: string;\n /** The parent data row, also for detail items. */\n readonly row: TableRow<TRow>;\n /** Position of the parent in snapshot.rows. */\n readonly rowIndex: number;\n}\n\n/** Disjoint namespaces and typed keys avoid collisions between 1, \"1\", and detail-like ids. */\nexport function getRowItemKey(key: RowKey, kind: RowItemKind = \"row\"): string {\n return JSON.stringify([kind, typeof key, key]);\n}\n\nexport function createRow<TRow>(\n original: TRow,\n key: RowKey,\n index: number,\n columns: ReadonlyMap<string, TableColumn<TRow>>,\n canExpand = false,\n): TableRow<TRow> {\n const values = new Map<string, unknown>();\n const displays = new Map<string, string>();\n\n const getValue = (columnId: string): unknown => {\n if (values.has(columnId)) {\n return values.get(columnId);\n }\n const value = columns.get(columnId)?.getValue(original);\n values.set(columnId, value);\n return value;\n };\n\n return Object.freeze({\n key,\n index,\n original,\n canExpand,\n isExpanded: false,\n depth: 0,\n parentKey: undefined,\n childCount: 0,\n childStatus: \"loaded\" as const,\n selection: \"none\" as const,\n isDirty: false,\n cellIssues: undefined,\n getValue,\n getDisplay(columnId: string): string {\n const cached = displays.get(columnId);\n if (cached !== undefined) {\n return cached;\n }\n const column = columns.get(columnId);\n const display = column ? column.format(getValue(columnId), original) : \"\";\n displays.set(columnId, display);\n return display;\n },\n });\n}\n","import { issue, type TableIssue } from \"./issues\";\n\n/** A stable identity for a row, read from the row itself or produced by a function. */\nexport type RowKey = string | number;\nexport type ExpandedState = readonly RowKey[] | true;\n\nexport type SortDirection = \"asc\" | \"desc\";\n\n/** One level of a sort. Several rules sort by the first, then break ties with the next. */\nexport interface SortRule {\n readonly column: string;\n readonly direction: SortDirection;\n}\n\n/** Pages are counted from 1. */\nexport interface PaginationState {\n readonly page: number;\n readonly pageSize: number;\n}\n\n/**\n * Everything a user can change about a table, as plain serializable data.\n *\n * Being plain data, the state can be stored, restored, sent to a server that sorts and pages, or\n * written to the URL with a library such as QueryWeave.\n */\nexport interface TableState {\n readonly sorting: readonly SortRule[];\n /** Free text matched against every searchable column. */\n readonly search: string;\n /** Filter value per column id, interpreted by that column's `filter`. */\n readonly filters: Readonly<Record<string, unknown>>;\n readonly pagination: PaginationState;\n readonly selection: readonly RowKey[];\n /** Expanded keys, or true for every expandable row. */\n readonly expanded: ExpandedState;\n readonly hiddenColumns: readonly string[];\n /** Column ids in display order. Columns missing from the list keep their definition order. */\n readonly columnOrder: readonly string[];\n}\n\n/** A partial state, as accepted by `setState` and `initialState`. */\nexport type TableStatePatch = {\n readonly [K in keyof TableState]?: TableState[K] | undefined;\n};\n\nexport const DEFAULT_PAGE_SIZE = 10;\n\nexport function createInitialState(\n patch: TableStatePatch = {},\n onIssue?: (problem: TableIssue) => void,\n): TableState {\n return freezeState({\n sorting: patch.sorting ?? [],\n search: patch.search ?? \"\",\n filters: patch.filters ?? {},\n pagination: patch.pagination ?? { page: 1, pageSize: DEFAULT_PAGE_SIZE },\n selection: patch.selection ?? [],\n expanded: normalizeExpanded(patch.expanded === undefined ? [] : patch.expanded, onIssue),\n hiddenColumns: patch.hiddenColumns ?? [],\n columnOrder: patch.columnOrder ?? [],\n });\n}\n\nexport function mergeState(\n state: TableState,\n patch: TableStatePatch,\n onIssue?: (problem: TableIssue) => void,\n): TableState {\n let changed = false;\n const next: Record<string, unknown> = { ...state };\n for (const [key, input] of Object.entries(patch)) {\n const value =\n key === \"expanded\" && input !== undefined ? normalizeExpanded(input, onIssue) : input;\n if (value === undefined || Object.is(next[key], value)) {\n continue;\n }\n if (\n key === \"pagination\" &&\n samePagination(next[key] as PaginationState, value as PaginationState)\n ) {\n continue;\n }\n if (key === \"expanded\" && sameExpanded(state.expanded, value as ExpandedState)) continue;\n next[key] = value;\n changed = true;\n }\n return changed ? freezeState(next as unknown as TableState, state) : state;\n}\n\nfunction normalizeExpanded(value: unknown, onIssue?: (problem: TableIssue) => void): ExpandedState {\n if (value === true) return true;\n if (\n Array.isArray(value) &&\n value.every(\n (key: unknown) =>\n typeof key === \"string\" || (typeof key === \"number\" && Number.isFinite(key)),\n )\n ) {\n return [...new Set(value as RowKey[])];\n }\n onIssue?.(\n issue(\n \"invalid_expanded\",\n \"Expanded state must be true or an array of string/finite number keys; an empty array is used.\",\n ),\n );\n return [];\n}\n\nfunction sameExpanded(left: ExpandedState, right: ExpandedState): boolean {\n return (\n left === right ||\n (left !== true &&\n right !== true &&\n left.length === right.length &&\n left.every((key, index) => key === right[index]))\n );\n}\n\nfunction samePagination(left: PaginationState, right: PaginationState): boolean {\n return left.page === right.page && left.pageSize === right.pageSize;\n}\n\nfunction freezeState(state: TableState, previous?: TableState): TableState {\n return Object.freeze({\n sorting:\n state.sorting === previous?.sorting\n ? previous.sorting\n : Object.freeze(state.sorting.map((rule) => Object.freeze({ ...rule }))),\n search: state.search,\n filters:\n state.filters === previous?.filters ? previous.filters : Object.freeze({ ...state.filters }),\n pagination:\n state.pagination === previous?.pagination\n ? previous.pagination\n : Object.freeze({ ...state.pagination }),\n selection:\n state.selection === previous?.selection\n ? previous.selection\n : Object.freeze([...state.selection]),\n expanded:\n state.expanded === previous?.expanded\n ? previous.expanded\n : state.expanded === true\n ? true\n : Object.freeze([...state.expanded]),\n hiddenColumns:\n state.hiddenColumns === previous?.hiddenColumns\n ? previous.hiddenColumns\n : Object.freeze([...state.hiddenColumns]),\n columnOrder:\n state.columnOrder === previous?.columnOrder\n ? previous.columnOrder\n : Object.freeze([...state.columnOrder]),\n });\n}\n","import { issue, type TableIssue } from \"./issues\";\nimport type { RowKey } from \"./state\";\n\nexport type ValidationResult = true | string | { readonly message: string; readonly code?: string };\nexport type Validator<TValue, TRow> = (\n value: TValue,\n row: TRow,\n) => ValidationResult | Promise<ValidationResult>;\nexport interface EditorSpec {\n readonly kind: \"text\" | \"number\" | \"select\" | \"checkbox\" | \"date\";\n readonly options?: readonly (string | number | boolean | null)[] | undefined;\n readonly min?: number | undefined;\n readonly max?: number | undefined;\n readonly maxLength?: number | undefined;\n readonly pattern?: string | undefined;\n}\nexport interface PendingCell {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly value: unknown;\n}\n\nexport function isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return typeof value === \"object\" && value !== null && \"then\" in value;\n}\n\n/** Validators receive values; their messages remain plain text. */\nexport function runValidation(\n validate: () => ValidationResult | Promise<ValidationResult>,\n rowKey: RowKey,\n column?: string,\n): TableIssue | undefined | Promise<TableIssue | undefined> {\n const fail = (message: string, validationCode?: string): TableIssue =>\n issue(\"validation_failed\", message, { rowKey, column, validationCode });\n const read = (result: ValidationResult): TableIssue | undefined => {\n if (result === true) return undefined;\n if (typeof result === \"string\") return fail(result);\n if (result && typeof result.message === \"string\") return fail(result.message, result.code);\n return fail(\"The validator returned an invalid result.\");\n };\n const thrown = (error: unknown): TableIssue =>\n fail(error instanceof Error ? error.message : String(error));\n try {\n const result = validate();\n return isPromise(result) ? Promise.resolve(result).then(read, thrown) : read(result);\n } catch (error) {\n return thrown(error);\n }\n}\n\nexport function editorFailure(spec: EditorSpec | undefined, value: unknown): string | undefined {\n if (!spec) return undefined;\n if (spec.maxLength !== undefined && (!Number.isSafeInteger(spec.maxLength) || spec.maxLength < 0))\n return \"Editor maxLength must be a non-negative safe integer.\";\n if (\n (spec.min !== undefined && !Number.isFinite(spec.min)) ||\n (spec.max !== undefined && !Number.isFinite(spec.max)) ||\n (spec.min !== undefined && spec.max !== undefined && spec.min > spec.max)\n )\n return \"Editor bounds must be finite and ordered.\";\n if (spec.options && !spec.options.some((option) => Object.is(option, value)))\n return \"Choose one of the allowed values.\";\n if (spec.maxLength !== undefined && typeof value === \"string\" && value.length > spec.maxLength)\n return `Use at most ${spec.maxLength} characters.`;\n if (spec.min !== undefined || spec.max !== undefined) {\n const number = value instanceof Date ? value.getTime() : value;\n if (typeof number !== \"number\" || !Number.isFinite(number))\n return \"Enter a finite numeric value.\";\n if (spec.min !== undefined && number < spec.min) return `Use a value of at least ${spec.min}.`;\n if (spec.max !== undefined && number > spec.max) return `Use a value of at most ${spec.max}.`;\n }\n if (spec.pattern !== undefined) {\n try {\n if (typeof value !== \"string\" || !new RegExp(spec.pattern, \"u\").test(value))\n return \"The value does not match the required pattern.\";\n } catch {\n return \"The editor pattern is invalid.\";\n }\n }\n return undefined;\n}\n","import type { TableColumn } from \"./column\";\nimport { issue, type TableIssue } from \"./issues\";\nimport { isSafePath } from \"./path\";\nimport type { TableRow } from \"./row\";\nimport type { RowKey } from \"./state\";\nimport type {\n CellChange,\n CellEdit,\n CellValueEdit,\n EditOptions,\n EditResult,\n TableSnapshot,\n} from \"./table\";\nimport {\n editorFailure,\n isPromise,\n runValidation,\n type PendingCell,\n type ValidationResult,\n} from \"./validation\";\n\ninterface Candidate<TRow> {\n readonly edit: CellValueEdit;\n readonly previous: unknown;\n readonly original: TRow;\n readonly column: TableColumn<TRow>;\n readonly validation: TableIssue | undefined | Promise<TableIssue | undefined>;\n readonly token: object;\n readonly guard: { row: TRow } | undefined;\n}\nexport interface ValidationHost<TRow> {\n snapshot(): TableSnapshot<TRow>;\n apply(\n edits: readonly CellEdit[],\n record: boolean,\n issues?: readonly TableIssue[],\n ): EditResult<TRow>;\n record(changes: readonly CellChange<TRow>[]): void;\n notify(): void;\n batch(run: () => EditResult<TRow>): EditResult<TRow>;\n writeIssue(row: TableRow<TRow>, next: TRow): TableIssue | undefined;\n onIssues(issues: readonly TableIssue[]): void;\n readonly optimistic: boolean;\n readonly validateRow:\n | ((next: TRow, previous: TRow) => ValidationResult | Promise<ValidationResult>)\n | undefined;\n}\n\nexport function readonlyMap<TKey, TValue>(\n source: ReadonlyMap<TKey, TValue>,\n): ReadonlyMap<TKey, TValue> {\n const copy = new Map(source);\n const result: ReadonlyMap<TKey, TValue> = {\n size: copy.size,\n get: (key) => copy.get(key),\n has: (key) => copy.has(key),\n entries: () => copy.entries(),\n keys: () => copy.keys(),\n values: () => copy.values(),\n [Symbol.iterator]: () => copy[Symbol.iterator](),\n forEach(callback, thisArg) {\n copy.forEach((value, key) => callback.call(thisArg, value, key, result));\n },\n };\n return Object.freeze(result);\n}\n\n/** All promises in one edit settle together. Tokens fence every cell against stale results. */\nexport function createEditValidation<TRow>(host: ValidationHost<TRow>): {\n edit(\n edits: readonly CellEdit[],\n recovered?: readonly TableIssue[],\n options?: EditOptions<TRow>,\n ): EditResult<TRow>;\n cells(): readonly PendingCell[];\n hasPending(key: RowKey): boolean;\n problems(): ReadonlyMap<RowKey, ReadonlyMap<string, TableIssue>>;\n cancel(keys?: readonly RowKey[]): void;\n} {\n const tokens = new Map<RowKey, Map<string, object>>();\n const pending = new Map<RowKey, Map<string, PendingCell>>();\n const problems = new Map<RowKey, Map<string, TableIssue>>();\n const current = (candidate: Candidate<TRow>): boolean =>\n tokens.get(candidate.edit.rowKey)?.get(candidate.edit.column) === candidate.token;\n const fresh = (candidate: Candidate<TRow>): boolean =>\n !candidate.guard ||\n host.snapshot().getRow(candidate.edit.rowKey)?.original === candidate.guard.row;\n const tokenFor = (rowKey: RowKey, column: string): object => {\n const row = tokens.get(rowKey) ?? new Map<string, object>();\n const token = {};\n row.set(column, token);\n tokens.set(rowKey, row);\n pending.get(rowKey)?.delete(column);\n problems.get(rowKey)?.delete(column);\n return token;\n };\n const setIssues = (issues: readonly TableIssue[]): void => {\n for (const problem of issues) {\n if (problem.rowKey === undefined || problem.column === undefined) continue;\n const row = problems.get(problem.rowKey) ?? new Map<string, TableIssue>();\n row.set(problem.column, problem);\n problems.set(problem.rowKey, row);\n }\n };\n function rowValidation(\n candidates: readonly Candidate<TRow>[],\n failures: TableIssue[],\n ): Candidate<TRow>[] | Promise<Candidate<TRow>[]> {\n if (!host.validateRow) return [...candidates];\n const rows = new Map<RowKey, Candidate<TRow>[]>();\n for (const candidate of candidates) {\n const group = rows.get(candidate.edit.rowKey) ?? [];\n group.push(candidate);\n rows.set(candidate.edit.rowKey, group);\n }\n const results: (Candidate<TRow>[] | Promise<Candidate<TRow>[]>)[] = [];\n for (const [key, group] of rows) {\n const previous = group[0]!.original;\n let next = previous;\n try {\n for (const candidate of group)\n next = candidate.column.setValue(next, candidate.edit.value) ?? next;\n } catch (error) {\n for (const candidate of group)\n failures.push(\n issue(\"validation_failed\", String(error), {\n rowKey: key,\n column: candidate.edit.column,\n }),\n );\n continue;\n }\n const validation = runValidation(() => host.validateRow!(next, previous), key);\n const accept = (problem: TableIssue | undefined): Candidate<TRow>[] => {\n if (!problem) return group;\n for (const candidate of group)\n if (current(candidate))\n failures.push(Object.freeze({ ...problem, column: candidate.edit.column }));\n return [];\n };\n results.push(isPromise(validation) ? validation.then(accept) : accept(validation));\n }\n return results.some(isPromise)\n ? Promise.all(results.map((result) => Promise.resolve(result))).then((groups) =>\n groups.flat(),\n )\n : (results as Candidate<TRow>[][]).flat();\n }\n function settle(\n accepted: readonly Candidate<TRow>[],\n all: readonly Candidate<TRow>[],\n failures: readonly TableIssue[],\n asynchronous: boolean,\n ): EditResult<TRow> {\n return host.batch(() => {\n const live = accepted.filter((candidate) => current(candidate) && fresh(candidate));\n const liveKeys = new Set(live);\n const active = all.filter(current);\n for (const candidate of active) {\n const key = candidate.edit.rowKey;\n pending.get(key)?.delete(candidate.edit.column);\n if (pending.get(key)?.size === 0) pending.delete(key);\n }\n const visibleFailures = failures;\n setIssues(visibleFailures);\n let result: EditResult<TRow>;\n if (asynchronous && host.optimistic) {\n const rollback = active\n .filter((candidate) => !liveKeys.has(candidate))\n .map((candidate) => ({ ...candidate.edit, value: candidate.previous }));\n result = host.apply(rollback, false, visibleFailures);\n const changes = live.map((candidate) =>\n Object.freeze({\n rowKey: candidate.edit.rowKey,\n column: candidate.edit.column,\n previous: candidate.previous,\n value: candidate.edit.value,\n row: host.snapshot().getRow(candidate.edit.rowKey)!.original,\n }),\n );\n if (changes.length) host.record(changes);\n result = Object.freeze({\n ...result,\n changes: Object.freeze(changes),\n status: changes.length\n ? visibleFailures.length\n ? \"partial\"\n : \"applied\"\n : visibleFailures.length\n ? \"rejected\"\n : \"unchanged\",\n });\n } else\n result = host.apply(\n live.map((candidate) => candidate.edit),\n true,\n visibleFailures,\n );\n setIssues(result.issues);\n if (\n (!result.changes.length && (all.length || result.issues.length)) ||\n (asynchronous && host.optimistic)\n )\n host.notify();\n if (asynchronous && !result.issues.length && active.length) host.onIssues([]);\n return result;\n });\n }\n return {\n hasPending: (key) => (pending.get(key)?.size ?? 0) > 0,\n cells: () => Object.freeze([...pending.values()].flatMap((row) => [...row.values()])),\n problems: () =>\n new Map(\n [...problems].filter(([, row]) => row.size).map(([key, row]) => [key, readonlyMap(row)]),\n ),\n cancel(keys) {\n if (!keys) {\n tokens.clear();\n pending.clear();\n problems.clear();\n } else\n for (const key of keys) {\n tokens.delete(key);\n pending.delete(key);\n problems.delete(key);\n }\n },\n edit(edits, recovered = [], options) {\n const metadataChanged = edits.some(\n (edit) =>\n pending.get(edit.rowKey)?.has(edit.column) ||\n problems.get(edit.rowKey)?.has(edit.column) ||\n (host.validateRow && pending.get(edit.rowKey)?.size),\n );\n const snapshot = host.snapshot();\n const failures = [...recovered];\n const candidates: Candidate<TRow>[] = [];\n const guards = new Map(\n [...(options?.expectedRows ?? [])].map(([key, row]) => [key, { row }]),\n );\n const drafts = new Map<RowKey, TRow>();\n const samples = new Map<string, unknown>();\n if (host.validateRow)\n for (const key of new Set(edits.map((edit) => edit.rowKey))) {\n tokens.delete(key);\n pending.delete(key);\n }\n for (const edit of edits) {\n const token = tokenFor(edit.rowKey, edit.column);\n const row: TableRow<TRow> | undefined = snapshot.getRow(edit.rowKey);\n const column = snapshot.getColumn(edit.column);\n const fail = (code: TableIssue[\"code\"], message: string): void => {\n failures.push(issue(code, message, { rowKey: edit.rowKey, column: edit.column }));\n };\n if (!isSafePath(edit.column)) {\n fail(\"unsafe_path\", \"This path addresses a prototype and cannot be written.\");\n continue;\n }\n if (!row) {\n fail(\"unknown_row\", `No row has the key \"${String(edit.rowKey)}\".`);\n continue;\n }\n const guard = guards.get(row.key);\n if (guard && row.original !== guard.row) {\n fail(\"stale_draft\", \"The row changed after this draft was opened.\");\n continue;\n }\n if (!column) {\n fail(\"unknown_column\", `No column has the id \"${edit.column}\".`);\n continue;\n }\n const original = drafts.get(row.key) ?? row.original;\n try {\n if (!column.isEditable(original)) {\n fail(\"read_only_cell\", `The \"${column.id}\" cell is read-only.`);\n continue;\n }\n let value: unknown;\n if (\"input\" in edit) {\n if (!samples.has(column.id))\n samples.set(\n column.id,\n snapshot.processedRows\n .find(\n (candidate) =>\n candidate.getValue(column.id) !== null &&\n candidate.getValue(column.id) !== undefined,\n )\n ?.getValue(column.id),\n );\n const parsed = column.parse(edit.input, original, samples.get(column.id));\n if (!parsed.ok) {\n fail(\"invalid_value\", parsed.message);\n continue;\n }\n value = parsed.value;\n } else value = edit.value;\n const previous = column.getValue(original);\n if (Object.is(previous, value)) continue;\n const constraint = editorFailure(column.definition.editor, value);\n if (constraint) {\n fail(\"validation_failed\", constraint);\n continue;\n }\n const next = column.setValue(original, value);\n if (next === undefined) {\n fail(\"read_only_cell\", \"The column has no way to write a value.\");\n continue;\n }\n const writeProblem = host.writeIssue(row, next);\n if (writeProblem) {\n failures.push(Object.freeze({ ...writeProblem, column: column.id }));\n continue;\n }\n const validate = column.definition.validate;\n const validation = validate\n ? runValidation(() => validate(value as never, row.original), row.key, column.id)\n : undefined;\n if (validation && !isPromise(validation)) {\n failures.push(validation);\n continue;\n }\n drafts.set(row.key, next);\n candidates.push({\n edit: { rowKey: row.key, column: column.id, value },\n previous: column.getValue(row.original),\n original: row.original,\n column,\n validation,\n token,\n guard,\n });\n } catch (error) {\n fail(\"invalid_value\", error instanceof Error ? error.message : String(error));\n }\n }\n const asynchronous = candidates.some((candidate) => isPromise(candidate.validation));\n const validateRows = (\n accepted: Candidate<TRow>[],\n ): Candidate<TRow>[] | Promise<Candidate<TRow>[]> =>\n rowValidation(\n accepted.filter((candidate) => current(candidate) && fresh(candidate)),\n failures,\n );\n const outcome = asynchronous\n ? Promise.all(\n candidates.map(async (candidate) => {\n const problem = await candidate.validation;\n if (problem) {\n if (current(candidate)) failures.push(problem);\n return undefined;\n }\n return candidate;\n }),\n ).then((accepted) =>\n validateRows(accepted.filter((candidate) => candidate !== undefined)),\n )\n : validateRows(candidates);\n if (!isPromise(outcome)) {\n const result = settle(outcome, candidates, failures, false);\n if (metadataChanged && !candidates.length && !failures.length) host.notify();\n return result;\n }\n for (const candidate of candidates) {\n const row = pending.get(candidate.edit.rowKey) ?? new Map<string, PendingCell>();\n row.set(candidate.edit.column, Object.freeze({ ...candidate.edit }));\n pending.set(candidate.edit.rowKey, row);\n }\n setIssues(failures);\n const optimistic = host.optimistic\n ? host.apply(\n candidates.map((candidate) => candidate.edit),\n false,\n failures,\n )\n : undefined;\n if (optimistic)\n for (const [key, guard] of guards) {\n const row = host.snapshot().getRow(key);\n if (row) guard.row = row.original;\n }\n if (!optimistic?.changes.length) host.notify();\n if (!host.optimistic && failures.length) host.onIssues(failures);\n const completion = outcome.then((accepted): EditResult<TRow> => {\n const staleCandidates = candidates\n .filter((candidate) => !current(candidate) || !fresh(candidate))\n .map((candidate) => ({\n candidate,\n problem: issue(\n \"stale_draft\",\n \"This edit was superseded or its row is no longer current.\",\n {\n rowKey: candidate.edit.rowKey,\n column: candidate.edit.column,\n },\n ),\n }));\n const stale = staleCandidates.map(({ problem }) => problem);\n const issues = [...failures, ...stale];\n if (candidates.some(current)) {\n const superseded = staleCandidates\n .filter(({ candidate }) => !current(candidate))\n .map(({ problem }) => problem);\n const result = settle(\n accepted,\n candidates,\n [\n ...failures,\n ...staleCandidates\n .filter(({ candidate }) => current(candidate))\n .map(({ problem }) => problem),\n ],\n true,\n );\n if (!stale.length) return result;\n return Object.freeze({\n ...result,\n issues: Object.freeze([...result.issues, ...superseded]),\n status: result.changes.length ? \"partial\" : \"rejected\",\n });\n }\n // Cancelled batches must not publish into a replaced or disposed table.\n return Object.freeze({\n status: \"rejected\",\n changes: Object.freeze([]),\n rowChanges: Object.freeze([]),\n issues: Object.freeze(issues),\n pendingCells: Object.freeze([]),\n });\n });\n return Object.freeze({\n status: \"pending\",\n changes: optimistic?.changes ?? Object.freeze([]),\n rowChanges: Object.freeze([]),\n issues: Object.freeze([...failures]),\n pendingCells: Object.freeze(\n candidates.map((candidate) => Object.freeze({ ...candidate.edit })),\n ),\n completion,\n });\n },\n };\n}\n","import type { RowKey } from \"./state\";\nimport type { CellChange } from \"./table\";\n\nexport interface InsertPosition {\n readonly before?: RowKey | undefined;\n readonly parent?: RowKey | undefined;\n}\nexport interface RowChange<TRow> {\n readonly kind: \"inserted\" | \"removed\";\n readonly rowKey: RowKey;\n readonly row: TRow;\n readonly position: InsertPosition;\n}\nexport interface UpdatedRow<TRow> {\n readonly rowKey: RowKey;\n readonly row: TRow;\n readonly previous: TRow;\n readonly changes: readonly CellChange<TRow>[];\n}\nexport interface PendingChanges<TRow> {\n readonly inserted: readonly RowChange<TRow>[];\n readonly updated: readonly UpdatedRow<TRow>[];\n readonly removed: readonly RowChange<TRow>[];\n}\nexport interface PendingEntry<TRow> {\n previous: TRow | undefined;\n row: TRow | undefined;\n readonly position: InsertPosition;\n readonly cells: Map<string, CellChange<TRow>>;\n}\n\n/** A saved baseline only for touched rows; viewing changes never scans source data. */\nexport function createPendingChanges<TRow>(): {\n readonly entries: Map<RowKey, PendingEntry<TRow>>;\n snapshot(): PendingChanges<TRow>;\n record(\n key: RowKey,\n previous: TRow | undefined,\n row: TRow | undefined,\n position: InsertPosition,\n changes: readonly CellChange<TRow>[],\n ): void;\n} {\n const entries = new Map<RowKey, PendingEntry<TRow>>();\n return {\n entries,\n snapshot() {\n const inserted: RowChange<TRow>[] = [];\n const removed: RowChange<TRow>[] = [];\n const updated: UpdatedRow<TRow>[] = [];\n for (const [rowKey, entry] of entries) {\n if (entry.previous === undefined && entry.row !== undefined)\n inserted.push(\n Object.freeze({ kind: \"inserted\", rowKey, row: entry.row, position: entry.position }),\n );\n else if (entry.row === undefined && entry.previous !== undefined)\n removed.push(\n Object.freeze({\n kind: \"removed\",\n rowKey,\n row: entry.previous,\n position: entry.position,\n }),\n );\n else if (entry.row !== undefined && entry.previous !== undefined)\n updated.push(\n Object.freeze({\n rowKey,\n row: entry.row,\n previous: entry.previous,\n changes: Object.freeze([...entry.cells.values()]),\n }),\n );\n }\n return Object.freeze({\n inserted: Object.freeze(inserted),\n updated: Object.freeze(updated),\n removed: Object.freeze(removed),\n });\n },\n record(key, previous, row, position, changes) {\n const entry = entries.get(key) ?? {\n previous,\n row,\n position: Object.freeze({ ...position }),\n cells: new Map<string, CellChange<TRow>>(),\n };\n entry.row = row;\n for (const change of changes) {\n const original = entry.cells.has(change.column)\n ? entry.cells.get(change.column)!.previous\n : change.previous;\n if (Object.is(original, change.value)) entry.cells.delete(change.column);\n else entry.cells.set(change.column, Object.freeze({ ...change, previous: original }));\n }\n if (\n (entry.previous === undefined && row === undefined) ||\n (entry.previous !== undefined && row !== undefined && entry.cells.size === 0)\n )\n entries.delete(key);\n else entries.set(key, entry);\n },\n };\n}\n","/** Read-only array views keep append publication independent of existing list length. */\nfunction indexOf(property: PropertyKey): number | undefined {\n if (typeof property !== \"string\" || !/^(0|[1-9]\\d*)$/u.test(property)) return undefined;\n return Number(property);\n}\n\nexport function rowList<T>(length: number, read: (index: number) => T): readonly T[] {\n return new Proxy<T[]>([], {\n get(target, property, receiver) {\n if (property === \"length\") return length;\n const index = indexOf(property);\n return index === undefined\n ? Reflect.get(target, property, receiver)\n : index < length\n ? read(index)\n : undefined;\n },\n has(target, property) {\n const index = indexOf(property);\n return index === undefined ? Reflect.has(target, property) : index < length;\n },\n ownKeys: () => [...Array.from({ length }, (_, index) => String(index)), \"length\"],\n getOwnPropertyDescriptor(target, property) {\n if (property === \"length\")\n return { ...Reflect.getOwnPropertyDescriptor(target, property)!, value: length };\n const index = indexOf(property);\n return index === undefined\n ? Reflect.getOwnPropertyDescriptor(target, property)\n : index < length\n ? { configurable: true, enumerable: true, writable: false, value: read(index) }\n : undefined;\n },\n set: () => false,\n deleteProperty: () => false,\n defineProperty: () => false,\n preventExtensions: () => false,\n setPrototypeOf: () => false,\n });\n}\n\ninterface Chunks<T> {\n readonly chunks: { readonly start: number; readonly rows: readonly T[] }[];\n}\nconst stores = new WeakMap<object, Chunks<unknown>>();\n\nexport function appendList<T>(previous: readonly T[], incoming: readonly T[]): readonly T[] {\n if (!incoming.length) return previous;\n let store = stores.get(previous) as Chunks<T> | undefined;\n // A previous view can branch after undo; only extend the current tail in place.\n const last = store?.chunks.at(-1);\n if (!store || (last && last.start + last.rows.length !== previous.length)) {\n store = { chunks: [{ start: 0, rows: previous }] };\n }\n store.chunks.push({ start: previous.length, rows: incoming });\n const chunks = store.chunks;\n const result = rowList(previous.length + incoming.length, (index) => {\n let low = 0;\n let high = chunks.length - 1;\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n if (chunks[mid]!.start <= index) low = mid;\n else high = mid - 1;\n }\n const chunk = chunks[low]!;\n return chunk.rows[index - chunk.start]!;\n });\n stores.set(result, store);\n return result;\n}\n\nexport function mapList<T, U>(rows: readonly T[], map: (row: T, index: number) => U): readonly U[] {\n const cache = new Map<number, U>();\n return rowList(rows.length, (index) => {\n if (!cache.has(index)) cache.set(index, map(rows[index]!, index));\n return cache.get(index)!;\n });\n}\n","import { issue, type TableIssue } from \"./issues\";\n\nexport type LoadState = \"idle\" | \"loading\" | \"streaming\" | \"done\" | \"error\" | \"aborted\";\n/** Structural cancellation, compatible with the caller's native signal. */\nexport interface StreamSignal {\n readonly aborted: boolean;\n addEventListener?(\n type: \"abort\",\n listener: () => void,\n options?: { readonly once?: boolean },\n ): void;\n removeEventListener?(type: \"abort\", listener: () => void): void;\n}\nexport interface StreamOptions {\n readonly signal?: StreamSignal | undefined;\n readonly batchSize?: number | undefined;\n readonly expectedRowCount?: number | undefined;\n readonly mode?: \"append\" | \"upsert\" | undefined;\n}\nexport interface DataIngestionResult {\n readonly status: \"applied\" | \"partial\" | \"rejected\" | \"unchanged\";\n readonly appended: number;\n readonly replaced: number;\n readonly removed: number;\n readonly issues: readonly TableIssue[];\n}\nexport interface StreamResult {\n readonly status: \"done\" | \"error\" | \"aborted\";\n readonly receivedRowCount: number;\n readonly issues: readonly TableIssue[];\n}\ninterface StreamHost<TRow> {\n ingest(rows: readonly TRow[], mode: \"append\" | \"upsert\"): DataIngestionResult;\n update(\n state: LoadState,\n expected: number | undefined,\n problems: readonly TableIssue[],\n notify: boolean,\n ): void;\n}\nexport function createStream<TRow>(host: StreamHost<TRow>): {\n run(\n source: AsyncIterable<readonly TRow[] | TRow>,\n options?: StreamOptions,\n ): Promise<StreamResult>;\n cancel(): void;\n} {\n let active: { cancel(): void } | undefined;\n return {\n cancel() {\n active?.cancel();\n active = undefined;\n },\n async run(source, options = {}) {\n active?.cancel();\n const problems: TableIssue[] = [];\n const requested = options.batchSize ?? 1000;\n const batchSize = Number.isSafeInteger(requested) && requested > 0 ? requested : 1000;\n if (batchSize !== requested)\n problems.push(\n issue(\n \"invalid_stream_option\",\n \"batchSize must be a positive safe integer; 1,000 is used.\",\n ),\n );\n const requestedCount = options.expectedRowCount;\n const expected =\n requestedCount === undefined ||\n (Number.isSafeInteger(requestedCount) && requestedCount >= 0)\n ? requestedCount\n : undefined;\n if (expected !== requestedCount)\n problems.push(\n issue(\n \"invalid_stream_option\",\n \"expectedRowCount must be a non-negative safe integer; it is unknown instead.\",\n ),\n );\n let cancelled = false;\n let wake: () => void = () => undefined;\n const cancellation = new Promise<undefined>((resolve) => {\n wake = () => resolve(undefined);\n });\n const cancel = (): void => {\n cancelled = true;\n wake();\n };\n const run = { cancel };\n active = run;\n const signal = options.signal;\n signal?.addEventListener?.(\"abort\", cancel, { once: true });\n if (signal?.aborted) run.cancel();\n let receivedRowCount = 0;\n let status: StreamResult[\"status\"] = \"done\";\n let iterator: AsyncIterator<readonly TRow[] | TRow> | undefined;\n host.update(cancelled ? \"aborted\" : \"loading\", expected, problems, true);\n try {\n if (!cancelled) iterator = source[Symbol.asyncIterator]();\n while (true) {\n if (cancelled || !iterator) break;\n // oxlint-disable-next-line no-await-in-loop -- Preserve source order and backpressure.\n const next = await Promise.race([iterator.next(), cancellation]);\n if (!next || cancelled || signal?.aborted) {\n run.cancel();\n break;\n }\n if (next.done) break;\n const rows: readonly TRow[] = Array.isArray(next.value)\n ? (next.value as readonly TRow[])\n : [next.value as TRow];\n for (let start = 0; start < rows.length; start += batchSize) {\n // Yield between bounded batches; a caller can cancel or supersede this run.\n // oxlint-disable-next-line no-await-in-loop -- Allow cancellation between ordered batches.\n await Promise.resolve();\n if (cancelled || signal?.aborted) {\n run.cancel();\n break;\n }\n host.update(\"streaming\", expected, problems, false);\n const result = host.ingest(\n rows.slice(start, start + batchSize),\n options.mode ?? \"append\",\n );\n receivedRowCount += result.appended + result.replaced;\n problems.push(...result.issues);\n }\n }\n } catch (error) {\n status = \"error\";\n problems.push(\n issue(\"stream_error\", error instanceof Error ? error.message : String(error)),\n );\n } finally {\n signal?.removeEventListener?.(\"abort\", cancel);\n if (cancelled) status = \"aborted\";\n if (active === run) {\n active = undefined;\n host.update(status, expected, problems, true);\n }\n // Do not wait on return(): an uncooperative iterator may be blocked in next().\n if (status !== \"done\" && iterator?.return)\n void Promise.resolve()\n .then(() => iterator!.return!())\n .catch(() => undefined);\n }\n return Object.freeze({ status, receivedRowCount, issues: Object.freeze([...problems]) });\n },\n };\n}\n","import type { TableColumn } from \"./column\";\nimport { issue, type TableIssue } from \"./issues\";\nimport { filterRows, sortRows } from \"./pipeline\";\nimport { createRow, type TableRow } from \"./row\";\nimport type { ExpandedState, RowKey, TableState } from \"./state\";\n\n/** A runtime supplies its own cancellation primitive; core needs no platform globals. */\nexport interface TreeLoadSignal {\n readonly aborted: boolean;\n}\n\nexport interface TreeLoadController<TSignal extends TreeLoadSignal = TreeLoadSignal> {\n readonly signal: TSignal;\n abort(): void;\n}\n\nexport type TreeFilter = \"ancestors\" | \"descendants\" | \"strict\";\nexport type TreePagination = \"root\" | \"row\";\nexport type ChildStatus = \"idle\" | \"loading\" | \"loaded\" | \"error\";\n\nexport interface TreeOptions<TRow, TSignal extends TreeLoadSignal = TreeLoadSignal> {\n readonly getChildren?: ((row: TRow) => readonly TRow[] | undefined) | undefined;\n /** Immutable counterpart of getChildren, required when editing nested descendants. */\n readonly setChildren?: ((row: TRow, children: readonly TRow[]) => TRow) | undefined;\n readonly getParentKey?: ((row: TRow) => RowKey | null | undefined) | undefined;\n readonly hasChildren?: ((row: TRow) => boolean) | undefined;\n readonly loadChildren?:\n | ((row: TableRow<TRow>, signal: TSignal) => Promise<readonly TRow[]>)\n | undefined;\n /** Required with loadChildren. Supply a controller from the caller's runtime. */\n readonly createChildLoadController?: (() => TreeLoadController<TSignal>) | undefined;\n readonly treeFilter?: TreeFilter | undefined;\n readonly paginateBy?: TreePagination | undefined;\n /** Maximum edges from a root. Deeper rows recover as roots. Defaults to 1,000. */\n readonly maxDepth?: number | undefined;\n}\n\nexport interface TreeNode<TRow> {\n row: TableRow<TRow>;\n parent: TreeNode<TRow> | undefined;\n children: TreeNode<TRow>[];\n depth: number;\n /** Position in the parent's children, or the source roots. */\n sourceIndex: number;\n lazy: boolean;\n writable: boolean;\n unloaded: boolean;\n}\n\nexport interface TreeModel<TRow> {\n readonly rows: readonly TableRow<TRow>[];\n readonly nodes: readonly TreeNode<TRow>[];\n readonly roots: readonly TreeNode<TRow>[];\n readonly byKey: ReadonlyMap<RowKey, TreeNode<TRow>>;\n readonly issues: readonly TableIssue[];\n}\n\nexport function buildTree<TRow, TSignal extends TreeLoadSignal>(\n data: readonly TRow[],\n columns: ReadonlyMap<string, TableColumn<TRow>>,\n readKey: (row: TRow, index: number) => RowKey,\n options: TreeOptions<TRow, TSignal>,\n lazy: ReadonlyMap<RowKey, readonly TRow[]>,\n): TreeModel<TRow> {\n const nodes: TreeNode<TRow>[] = [];\n const byKey = new Map<RowKey, TreeNode<TRow>>();\n const issues: TableIssue[] = [];\n const nested = options.getChildren !== undefined;\n let maxDepth = options.maxDepth ?? 1_000;\n if (!Number.isSafeInteger(maxDepth) || maxDepth < 1) {\n issues.push(\n issue(\"invalid_tree_option\", \"maxDepth must be a positive safe integer; 1,000 is used.\"),\n );\n maxDepth = 1_000;\n }\n if (nested && options.getParentKey) {\n issues.push(\n issue(\"invalid_tree_option\", \"Both tree inputs were supplied; getChildren takes precedence.\"),\n );\n }\n const seen = new Set<TRow>();\n const stack = data\n .map((original, sourceIndex) => ({\n original,\n sourceIndex,\n parent: undefined as TreeNode<TRow> | undefined,\n lazy: false,\n }))\n .reverse();\n while (stack.length) {\n const entry = stack.pop()!;\n const index = nodes.length;\n let key = readKey(entry.original, index);\n let parent = entry.parent;\n const reference =\n entry.original !== null &&\n (typeof entry.original === \"object\" || typeof entry.original === \"function\");\n const repeated = nested && reference && seen.has(entry.original);\n if (repeated) {\n issues.push(\n issue(\n \"tree_cycle\",\n \"A repeated nested value recovers as a root without traversing it again.\",\n { rowKey: key },\n ),\n );\n parent = undefined;\n }\n if (reference) seen.add(entry.original);\n if (byKey.has(key)) {\n issues.push(\n issue(\n entry.lazy ? \"tree_duplicate_key\" : \"duplicate_row_key\",\n entry.lazy\n ? \"A loaded child repeats an existing key and is rejected.\"\n : \"A repeated row key is replaced with a unique key.\",\n { rowKey: key },\n ),\n );\n if (entry.lazy) continue;\n const prefix = `${String(key)}#${index}`;\n key = prefix;\n let suffix = 0;\n while (byKey.has(key)) key = `${prefix}#${++suffix}`;\n }\n if (parent && parent.depth + 1 > maxDepth) {\n issues.push(\n issue(\n \"tree_depth_exceeded\",\n \"The maximum tree depth was exceeded; this row recovers as a root.\",\n { rowKey: key },\n ),\n );\n parent = undefined;\n }\n const children = repeated\n ? undefined\n : (lazy.get(key) ?? options.getChildren?.(entry.original));\n const node: TreeNode<TRow> = {\n row: createRow(entry.original, key, index, columns),\n parent,\n children: [],\n depth: parent ? parent.depth + 1 : 0,\n sourceIndex: entry.sourceIndex,\n lazy: entry.lazy,\n writable: parent?.writable ?? entry.parent === undefined,\n unloaded: children === undefined && (options.hasChildren?.(entry.original) ?? false),\n };\n nodes.push(node);\n byKey.set(key, node);\n if (parent) parent.children.push(node);\n if (children) {\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push({\n original: children[i]!,\n sourceIndex: i,\n parent: node,\n lazy: entry.lazy || lazy.has(key),\n });\n }\n }\n }\n if (!nested && options.getParentKey) {\n // One lookup per source row; lazy attachments already have an explicit parent.\n for (const node of nodes) {\n if (node.lazy) continue;\n const key = options.getParentKey(node.row.original);\n if (key === undefined || key === null) continue;\n const parent = byKey.get(key);\n if (!parent)\n issues.push(\n issue(\"tree_orphan\", \"The parent is missing; this row recovers as a root.\", {\n rowKey: node.row.key,\n }),\n );\n else node.parent = parent;\n }\n const done = new Set<TreeNode<TRow>>();\n for (const node of nodes) {\n const path: TreeNode<TRow>[] = [];\n const visiting = new Set<TreeNode<TRow>>();\n let cursor: TreeNode<TRow> | undefined = node;\n while (cursor && !done.has(cursor)) {\n if (visiting.has(cursor)) {\n issues.push(\n issue(\"tree_cycle\", \"A cyclic parent reference is detached to a root.\", {\n rowKey: cursor.row.key,\n }),\n );\n cursor.parent = undefined;\n break;\n }\n visiting.add(cursor);\n path.push(cursor);\n cursor = cursor.parent;\n }\n for (let i = path.length - 1; i >= 0; i--) {\n const current = path[i]!;\n done.add(current);\n }\n }\n for (const node of nodes) node.children = [];\n for (const node of nodes) if (node.parent) node.parent.children.push(node);\n const pending = nodes.filter((node) => !node.parent);\n while (pending.length) {\n const node = pending.pop()!;\n node.depth = node.parent ? node.parent.depth + 1 : 0;\n if (node.depth > maxDepth) {\n node.parent = undefined;\n node.depth = 0;\n issues.push(\n issue(\n \"tree_depth_exceeded\",\n \"The maximum tree depth was exceeded; this row recovers as a root.\",\n { rowKey: node.row.key },\n ),\n );\n }\n for (const child of node.children) pending.push(child);\n }\n for (const node of nodes)\n node.children = node.children.filter((child) => child.parent === node);\n }\n return {\n nodes,\n rows: nodes.map((node) => node.row),\n roots: nodes.filter((node) => !node.parent),\n byKey,\n issues,\n };\n}\n\nexport interface ProcessedTree<TRow> {\n readonly model: TreeModel<TRow>;\n readonly roots: readonly TreeNode<TRow>[];\n readonly children: ReadonlyMap<TreeNode<TRow>, readonly TreeNode<TRow>[]>;\n readonly autoExpanded: ReadonlySet<RowKey>;\n}\n\nexport function processTree<TRow>(\n model: TreeModel<TRow>,\n columns: readonly TableColumn<TRow>[],\n state: TableState,\n mode: TreeFilter,\n manual: boolean,\n): ProcessedTree<TRow> {\n const raw = model.nodes.map((node) => node.row);\n const matched = manual ? raw : filterRows(raw, columns, state.search, state.filters);\n const active = matched !== raw;\n const included = new Set(matched.map((row) => row.key));\n const autoExpanded = new Set<RowKey>();\n if (active && mode !== \"strict\") {\n if (mode === \"descendants\") {\n const stack = matched.map((row) => model.byKey.get(row.key)!);\n const visited = new Set<RowKey>();\n while (stack.length) {\n const node = stack.pop()!;\n if (visited.has(node.row.key)) continue;\n visited.add(node.row.key);\n included.add(node.row.key);\n if (node.children.length) autoExpanded.add(node.row.key);\n for (const child of node.children) stack.push(child);\n }\n }\n for (const row of matched) {\n let parent = model.byKey.get(row.key)!.parent;\n while (parent && !autoExpanded.has(parent.row.key)) {\n included.add(parent.row.key);\n autoExpanded.add(parent.row.key);\n parent = parent.parent;\n }\n }\n }\n if (active && mode === \"strict\") {\n const leaves = model.nodes.filter(\n (node) => included.has(node.row.key) && node.children.length === 0 && !node.unloaded,\n );\n return { model, roots: ordered(leaves), children: new Map(), autoExpanded };\n }\n const children = new Map<TreeNode<TRow>, readonly TreeNode<TRow>[]>();\n for (const node of model.nodes)\n if (node.children.length)\n children.set(node, ordered(node.children.filter((child) => included.has(child.row.key))));\n return {\n model,\n roots: ordered(model.roots.filter((node) => included.has(node.row.key))),\n children,\n autoExpanded,\n };\n\n function ordered(nodes: readonly TreeNode<TRow>[]): readonly TreeNode<TRow>[] {\n if (manual || !state.sorting.length || nodes.length < 2) return nodes;\n return sortRows(\n nodes.map((node) => node.row),\n columns,\n state.sorting,\n ).map((row) => model.byKey.get(row.key)!);\n }\n}\n\n/** Expansion changes reuse filtering and sibling order, splicing only a changed subtree. */\nexport function createTreeFlattener<TRow>(): (\n tree: ProcessedTree<TRow>,\n expanded: ExpandedState,\n ancestors: ReadonlySet<RowKey>,\n) => readonly TreeNode<TRow>[] {\n let previous: ProcessedTree<TRow> | undefined;\n let previousExpanded: ExpandedState = [];\n let visible: readonly TreeNode<TRow>[] = [];\n let previousAncestors: ReadonlySet<RowKey> | undefined;\n return (tree, expanded, ancestors) => {\n if (tree === previous && expanded === previousExpanded && ancestors === previousAncestors)\n return visible;\n const keys = expanded === true ? undefined : new Set(expanded);\n const open = (node: TreeNode<TRow>): boolean =>\n expanded === true ||\n (keys?.has(node.row.key) ?? false) ||\n ancestors.has(node.row.key) ||\n tree.autoExpanded.has(node.row.key);\n const walk = (roots: readonly TreeNode<TRow>[]): TreeNode<TRow>[] => {\n const output: TreeNode<TRow>[] = [];\n const stack = [...roots].reverse();\n while (stack.length) {\n const node = stack.pop()!;\n output.push(node);\n if (open(node)) {\n const children = tree.children.get(node) ?? [];\n for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]!);\n }\n }\n return output;\n };\n let changed: RowKey[] | undefined;\n if (\n previous === tree &&\n ancestors === previousAncestors &&\n expanded !== true &&\n previousExpanded !== true\n ) {\n const before = new Set(previousExpanded);\n const after = new Set(expanded);\n changed = [\n ...previousExpanded.filter((key) => !after.has(key)),\n ...expanded.filter((key) => !before.has(key)),\n ];\n }\n if (changed?.length === 1 && !tree.autoExpanded.has(changed[0]!)) {\n const index = visible.findIndex((node) => node.row.key === changed[0]);\n if (index >= 0) {\n const node = visible[index]!;\n let end = index + 1;\n while (end < visible.length && visible[end]!.depth > node.depth) end++;\n const inserted = walk(open(node) ? (tree.children.get(node) ?? []) : []);\n visible = visible.slice(0, index + 1).concat(inserted, visible.slice(end));\n }\n } else visible = walk(tree.roots);\n previous = tree;\n previousExpanded = expanded;\n previousAncestors = ancestors;\n return visible;\n };\n}\n","import { resolveColumn, type ColumnDef, type TableColumn } from \"./column\";\nimport { escapeFormula, readDelimited, toDelimited } from \"./delimited\";\nimport { createEditValidation } from \"./edit-validation\";\nimport { rangeContains, type CellPosition, type CellRange } from \"./grid\";\nimport { issue, type TableIssue } from \"./issues\";\nimport type { DeepKeys } from \"./path\";\nimport { getPath, isSafePath } from \"./path\";\nimport {\n createPendingChanges,\n type InsertPosition,\n type PendingChanges,\n type RowChange,\n} from \"./pending-changes\";\nimport {\n clampPage,\n countPages,\n filterRows,\n paginateRows,\n sortRows,\n mergeRows,\n type PageItem,\n paginationItems,\n} from \"./pipeline\";\nimport { createRow, getRowItemKey, type TableRow, type TableRenderItem } from \"./row\";\nimport { appendList, mapList } from \"./row-list\";\nimport {\n DEFAULT_PAGE_SIZE,\n createInitialState,\n mergeState,\n type RowKey,\n type ExpandedState,\n type SortDirection,\n type TableState,\n type TableStatePatch,\n} from \"./state\";\nimport {\n createStream,\n type DataIngestionResult,\n type LoadState,\n type StreamOptions,\n type StreamResult,\n} from \"./stream\";\nimport {\n buildTree,\n processTree,\n createTreeFlattener,\n type TreeOptions,\n type TreeLoadSignal,\n type TreeLoadController,\n type TreeModel,\n type TreeNode,\n type ChildStatus,\n} from \"./tree\";\nimport { createUndoStack } from \"./undo-stack\";\nimport type { PendingCell, ValidationResult } from \"./validation\";\n\nexport type SelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type ExpandMode = \"single\" | \"multiple\";\n\n/** Which rows \"select all\" covers: the current page, or every row that passes the filters. */\nexport type SelectScope = \"page\" | \"all\";\n\nexport interface PasteLimit {\n /** Maximum fields examined per paste, including clipped columns. Defaults to 100,000. */\n readonly maxCells?: number | undefined;\n /** Maximum UTF-16 code units examined per paste. Defaults to 5,000,000. */\n readonly maxLength?: number | undefined;\n}\n\nexport interface TableOptions<\n TRow,\n TSignal extends TreeLoadSignal = TreeLoadSignal,\n> extends TreeOptions<TRow, TSignal> {\n readonly data: readonly TRow[];\n readonly columns: readonly ColumnDef<TRow>[];\n /**\n * How to identify a row: a path into it, or a function. Defaults to `id` when rows have one and\n * to the row's position otherwise.\n */\n readonly rowKey?: DeepKeys<TRow> | ((row: TRow, index: number) => RowKey) | undefined;\n readonly initialState?: TableStatePatch | undefined;\n /** Present all processed rows rather than a page. Defaults to true. */\n readonly paginate?: boolean | undefined;\n readonly getRowCanExpand?: ((row: TRow) => boolean) | undefined;\n readonly expandMode?: ExpandMode | undefined;\n /** Defaults to `\"multiple\"`. */\n readonly selectionMode?: SelectionMode | undefined;\n /** Defaults to `\"all\"`. */\n readonly selectScope?: SelectScope | undefined;\n /**\n * The data is one page that a server has already searched, filtered, sorted, and paginated\n * with the current state. The table only presents it; `rowCount` gives the total.\n */\n readonly manual?: boolean | undefined;\n /** The total number of rows across all pages, for `manual` tables. */\n readonly rowCount?: number | undefined;\n /** Caller-owned source hint, independent of filtering and pagination. */\n readonly expectedRowCount?: number | undefined;\n /** Called after every state change a table operation makes, not after `setState`. */\n readonly onStateChange?: ((state: TableState, previous: TableState) => void) | undefined;\n /** Called with new data after edits or ingestion; ingestion has an empty cell-change list. */\n readonly onDataChange?:\n | ((data: readonly TRow[], changes: readonly CellChange<TRow>[]) => void)\n | undefined;\n /** Called with the reasons whenever an edit, a paste, or a clear refuses some cells. */\n readonly onEditIssues?: ((issues: readonly TableIssue[]) => void) | undefined;\n /** The most edit batches `undo` can reach. Defaults to 100. */\n readonly historyLimit?: number | undefined;\n /** Bound clipboard parsing. Only complete cells inside the visible grid are applied. */\n readonly pasteLimit?: PasteLimit | undefined;\n readonly validateRow?:\n | ((next: TRow, previous: TRow) => ValidationResult | Promise<ValidationResult>)\n | undefined;\n readonly asyncValidation?: \"held\" | \"optimistic\" | undefined;\n readonly createRow?: (() => TRow) | undefined;\n /** Immutable inverse of getParentKey for inserting adjacency children. */\n readonly setParentKey?: ((row: TRow, parent: RowKey | undefined) => TRow) | undefined;\n}\n\nexport type SelectionCoverage = \"none\" | \"some\" | \"all\";\n\nexport interface SortInfo {\n readonly direction: SortDirection;\n /** 0 for the first rule, 1 for the next, and so on. */\n readonly priority: number;\n}\n\n/**\n * Everything a renderer needs, computed from the data, the columns, and the state. A snapshot is\n * frozen and replaced on each change, so comparing snapshots by identity detects a change.\n */\nexport interface TableSnapshot<TRow> {\n /** True when hierarchy options are configured, including an empty tree. */\n readonly tree: boolean;\n readonly loadState: LoadState;\n readonly loadedRowCount: number;\n readonly expectedRowCount: number | undefined;\n readonly state: TableState;\n /** Visible columns in display order. */\n readonly columns: readonly TableColumn<TRow>[];\n /** Every column in display order, hidden ones included. */\n readonly allColumns: readonly TableColumn<TRow>[];\n /** Rows on the current page, or all processed rows when pagination is disabled. */\n readonly rows: readonly TableRow<TRow>[];\n /** Data rows followed by their open details; details do not affect pagination or grid positions. */\n readonly renderItems: readonly TableRenderItem<TRow>[];\n readonly paginate: boolean;\n /** Rows on every page, filtered and sorted. For `manual` tables this is the current page. */\n readonly processedRows: readonly TableRow<TRow>[];\n /** The current page, clamped into range. */\n readonly page: number;\n readonly pageSize: number;\n readonly pageCount: number;\n /** Rows that pass the search and filters. */\n readonly rowCount: number;\n /** Rows before searching and filtering. */\n readonly totalRowCount: number;\n /** The 1-based position of the first row on this page, or 0 when there are no rows. */\n readonly pageStart: number;\n /** The 1-based position of the last row on this page, or 0 when there are no rows. */\n readonly pageEnd: number;\n readonly pageItems: readonly PageItem[];\n readonly canPreviousPage: boolean;\n readonly canNextPage: boolean;\n readonly selectionMode: SelectionMode;\n readonly selectedCount: number;\n /** How much of the current page is selected. */\n readonly pageSelection: SelectionCoverage;\n /** How much of the select-all scope is selected. */\n readonly allSelection: SelectionCoverage;\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n readonly issues: readonly TableIssue[];\n readonly pendingCells: readonly PendingCell[];\n isSelected(key: RowKey): boolean;\n getSort(columnId: string): SortInfo | undefined;\n getColumn(columnId: string): TableColumn<TRow> | undefined;\n getRow(key: RowKey): TableRow<TRow> | undefined;\n}\n\n/** An edit given as a value of the column's type. */\nexport interface CellValueEdit {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly value: unknown;\n}\n\n/** An edit given as text, read by the column's `parse`, as typed or pasted. */\nexport interface CellInputEdit {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly input: string;\n}\n\nexport type CellEdit = CellValueEdit | CellInputEdit;\n\n/** Optional identity checks for a batch prepared from an earlier row snapshot. */\nexport interface EditOptions<TRow> {\n readonly expectedRows?: ReadonlyMap<RowKey, TRow> | undefined;\n}\n\nexport interface CellChange<TRow> {\n readonly rowKey: RowKey;\n readonly column: string;\n readonly previous: unknown;\n readonly value: unknown;\n /** The row after the change. */\n readonly row: TRow;\n}\n\nexport type EditStatus = \"applied\" | \"partial\" | \"rejected\" | \"unchanged\" | \"pending\";\n\n/**\n * The outcome of a batch of edits. `partial` means some edits applied and others were refused;\n * each refusal is in `issues`.\n */\nexport interface EditResult<TRow> {\n readonly status: EditStatus;\n readonly changes: readonly CellChange<TRow>[];\n readonly issues: readonly TableIssue[];\n readonly rowChanges: readonly RowChange<TRow>[];\n readonly pendingCells: readonly PendingCell[];\n /** Present on pending batches; resolves to their final outcome, including superseded cells. */\n readonly completion?: Promise<EditResult<TRow>> | undefined;\n}\n\nexport interface CopyOptions {\n /** Prefix formula-like text with an apostrophe. Defaults to false for clipboard copies. */\n readonly escapeFormulas?: boolean | undefined;\n}\n\nexport interface ExportOptions extends CopyOptions {\n /** Prepend a numeric Depth column for hierarchical exports. */\n readonly depth?: boolean | undefined;\n /** Prefix the first data column with this text repeated per level. */\n readonly indent?: string | undefined;\n /** Prefix formula-like text with an apostrophe. Defaults to true for exports. */\n readonly escapeFormulas?: boolean | undefined;\n /** Defaults to `\"csv\"`. */\n readonly format?: \"csv\" | \"tsv\" | undefined;\n /** Column ids to export. Defaults to the visible columns. */\n readonly columns?: readonly string[] | undefined;\n /** Export only the current page. Defaults to every filtered row. */\n readonly pageOnly?: boolean | undefined;\n /** Defaults to `true`. */\n readonly headers?: boolean | undefined;\n}\n\n/**\n * A data table: data, columns, and state, with named operations to change them. It knows nothing\n * about rendering; a framework binding subscribes to it and draws each snapshot.\n */\nexport interface DataTable<TRow> {\n appendData(rows: readonly TRow[]): DataIngestionResult;\n upsertData(rows: readonly TRow[]): DataIngestionResult;\n removeData(keys: readonly RowKey[]): DataIngestionResult;\n stream(\n source: AsyncIterable<readonly TRow[] | TRow>,\n options?: StreamOptions,\n ): Promise<StreamResult>;\n insertRows(rows?: readonly TRow[], at?: InsertPosition): EditResult<TRow>;\n removeRows(keys: readonly RowKey[]): EditResult<TRow>;\n getPendingChanges(): PendingChanges<TRow>;\n markSaved(keys?: readonly RowKey[]): void;\n revert(keys?: readonly RowKey[]): EditResult<TRow>;\n getSnapshot(): TableSnapshot<TRow>;\n getState(): TableState;\n /** Called after every change with the new snapshot. Returns the unsubscribe function. */\n subscribe(listener: (snapshot: TableSnapshot<TRow>) => void): () => void;\n\n /** Replace part of the state from outside, without calling `onStateChange`. */\n setState(patch: TableStatePatch): void;\n /** Replace the data. The undo stack is cleared unless the data is the table's own. */\n setData(data: readonly TRow[]): void;\n setColumns(columns: readonly ColumnDef<TRow>[]): void;\n /** Update the total row count of a `manual` table. */\n setRowCount(rowCount: number): void;\n\n /** Cycle a column through ascending, descending, and unsorted. */\n toggleSort(columnId: string, options?: { readonly multi?: boolean | undefined }): void;\n /** Sort by one column, or clear it with `undefined`. */\n sort(\n columnId: string,\n direction: SortDirection | undefined,\n options?: { readonly multi?: boolean | undefined },\n ): void;\n clearSorting(): void;\n search(text: string): void;\n /** Set a column's filter value; an empty value removes the filter. */\n filter(columnId: string, value: unknown): void;\n clearFilters(): void;\n\n goToPage(page: number): void;\n nextPage(): void;\n previousPage(): void;\n /** Change the page size, keeping the first row of the current page in view. */\n setPageSize(pageSize: number): void;\n\n select(keys: readonly RowKey[]): void;\n deselect(keys: readonly RowKey[]): void;\n toggleRow(key: RowKey, selected?: boolean): void;\n /** Select every row in the scope, or clear them when all are already selected. */\n toggleAll(scope?: SelectScope): void;\n clearSelection(): void;\n /** The selected rows that are present in the data. */\n getSelectedRows(): readonly TableRow<TRow>[];\n\n toggleExpanded(key: RowKey, expanded?: boolean): void;\n expandAll(): void;\n collapseAll(): void;\n\n toggleColumn(columnId: string, visible?: boolean): void;\n moveColumn(columnId: string, toIndex: number): void;\n\n edit(edits: CellEdit | readonly CellEdit[], options?: EditOptions<TRow>): EditResult<TRow>;\n undo(): boolean;\n redo(): boolean;\n /** The text of a range of shown cells, tab-separated like a spreadsheet clipboard. */\n copy(range: CellRange, options?: CopyOptions): string;\n /** Paste tab-separated text with its top-left cell at `origin`, clipped to the grid. */\n paste(origin: CellPosition, text: string): EditResult<TRow>;\n /** Empty every editable cell in a range. */\n clear(range: CellRange): EditResult<TRow>;\n exportRows(options?: ExportOptions): string;\n\n /** Return to the initial state. */\n reset(): void;\n /** Drop every listener. */\n destroy(): void;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction memo<TDeps extends readonly unknown[], TResult>(\n compute: (...deps: TDeps) => TResult,\n): (...deps: TDeps) => TResult {\n let last: { readonly deps: TDeps; readonly result: TResult } | undefined;\n return (...deps: TDeps): TResult => {\n if (\n last &&\n last.deps.length === deps.length &&\n last.deps.every((d, i) => Object.is(d, deps[i]))\n ) {\n return last.result;\n }\n const result = compute(...deps);\n last = { deps, result };\n return result;\n };\n}\n\nfunction isInputEdit(edit: CellEdit): edit is CellInputEdit {\n return \"input\" in edit;\n}\n\nfunction coverage(selected: number, total: number): SelectionCoverage {\n if (selected === 0 || total === 0) {\n return \"none\";\n }\n return selected === total ? \"all\" : \"some\";\n}\n\ninterface IndexedRows<TRow> {\n readonly rows: readonly TableRow<TRow>[];\n readonly byKey: Map<RowKey, TableRow<TRow>>;\n readonly issues: readonly TableIssue[];\n}\n\ninterface RowScene<TRow> {\n readonly data: readonly TRow[];\n readonly lazy: ReadonlyMap<RowKey, readonly TRow[]>;\n}\ntype EditHistory<TRow> =\n | { readonly kind: \"cells\"; readonly changes: readonly CellChange<TRow>[] }\n | {\n readonly kind: \"rows\";\n readonly before: RowScene<TRow>;\n readonly after: RowScene<TRow>;\n readonly keys: readonly RowKey[];\n };\n\nfunction pasteLimit(\n value: number | undefined,\n fallback: number,\n name: string,\n issues: TableIssue[],\n): number {\n if (value === undefined) {\n return fallback;\n }\n if (Number.isSafeInteger(value) && value > 0) {\n return value;\n }\n issues.push(\n issue(\n \"invalid_paste_limit\",\n `Paste ${name} ${String(value)} is not a positive safe integer; ${fallback} is used.`,\n ),\n );\n return fallback;\n}\n\n/** Create a data table. */\nexport function createTable<TRow, TSignal extends TreeLoadSignal = TreeLoadSignal>(\n options: TableOptions<TRow, TSignal>,\n): DataTable<TRow> {\n const paginate = options.paginate ?? true;\n const expandMode = options.expandMode ?? \"multiple\";\n const selectionMode = options.selectionMode ?? \"multiple\";\n const selectScope = options.selectScope ?? \"all\";\n const manual = options.manual ?? false;\n const treeEnabled = Boolean(\n options.getChildren || options.getParentKey || options.hasChildren || options.loadChildren,\n );\n const rootPagination = treeEnabled && (manual || (options.paginateBy ?? \"root\") === \"root\");\n const projectedRows = new WeakMap<TableRow<TRow>, TableRow<TRow>>();\n function shareRow(base: TableRow<TRow>, next: TableRow<TRow>): TableRow<TRow> {\n const previous = projectedRows.get(base);\n if (\n previous &&\n (Object.keys(next) as (keyof TableRow<TRow>)[]).every((key) => previous[key] === next[key])\n )\n return previous;\n projectedRows.set(base, next);\n return next;\n }\n let lazyVersion = 0;\n const lazyChildren = new Map<RowKey, readonly TRow[]>();\n const childStatuses = new Map<RowKey, ChildStatus>();\n const loadIssues = new Map<RowKey, TableIssue>();\n const loadValidationIssues = new Map<RowKey, readonly TableIssue[]>();\n const pendingLoads = new Map<RowKey, TreeLoadController<TSignal>>();\n let destroyed = false;\n const undoStack = createUndoStack<EditHistory<TRow>>(options.historyLimit);\n const pendingChanges = createPendingChanges<TRow>();\n const listeners = new Set<(snapshot: TableSnapshot<TRow>) => void>();\n const optionIssues: TableIssue[] = [];\n const maxPasteCells = pasteLimit(options.pasteLimit?.maxCells, 100_000, \"maxCells\", optionIssues);\n const maxPasteLength = pasteLimit(\n options.pasteLimit?.maxLength,\n 5_000_000,\n \"maxLength\",\n optionIssues,\n );\n const sourceExpected =\n options.expectedRowCount === undefined ||\n (Number.isSafeInteger(options.expectedRowCount) && options.expectedRowCount >= 0)\n ? options.expectedRowCount\n : undefined;\n if (sourceExpected !== options.expectedRowCount)\n optionIssues.push(\n issue(\n \"invalid_stream_option\",\n \"expectedRowCount must be a non-negative safe integer; it is unknown instead.\",\n ),\n );\n\n let data = options.data;\n let definitions = options.columns;\n let rowCount = options.rowCount;\n let expandedIssue: TableIssue | undefined;\n let initialState = createInitialState(\n {\n ...options.initialState,\n hiddenColumns:\n options.initialState?.hiddenColumns ??\n options.columns.filter((column) => column.hidden === true).map((column) => column.id),\n },\n (problem) => {\n expandedIssue = problem;\n },\n );\n let state = initialState;\n let snapshot: TableSnapshot<TRow> | undefined;\n let loadState: LoadState = \"idle\";\n let expectedRowCount = sourceExpected;\n let ingestionIssues: readonly TableIssue[] = [];\n let streamIssues: readonly TableIssue[] = [];\n const streaming = createStream<TRow>({\n ingest: (rows, mode) => ingestData(rows, mode),\n update(next, expected, problems, publish) {\n loadState = next;\n expectedRowCount = expected;\n streamIssues = [...problems];\n if (publish) notify();\n },\n });\n let transaction = false;\n let deferValidationNotify = false;\n let validationNotifyRequested = false;\n const validation = createEditValidation<TRow>({\n snapshot: getSnapshot,\n apply: applyChanges,\n notify,\n writeIssue(row, next) {\n const node = treeEnabled\n ? treeStage(data, resolveColumns(definitions).byId, lazyVersion).byKey.get(row.key)\n : undefined;\n if (node && (!node.writable || (node.parent && options.getChildren && !options.setChildren)))\n return issue(\"read_only_cell\", \"This nested row has no immutable writable source path.\", {\n rowKey: row.key,\n });\n if (readKey(next, row.index) !== readKey(row.original, row.index))\n return issue(\n \"invalid_row_operation\",\n \"Editing a row key is not supported; remove and insert the row instead.\",\n { rowKey: row.key },\n );\n return undefined;\n },\n batch(run) {\n deferValidationNotify = true;\n validationNotifyRequested = false;\n try {\n return run();\n } finally {\n deferValidationNotify = false;\n if (validationNotifyRequested) notify();\n }\n },\n record: (changes) => undoStack.record({ kind: \"cells\", changes }),\n onIssues: (issues) => options.onEditIssues?.(issues),\n optimistic: options.asyncValidation === \"optimistic\",\n validateRow: options.validateRow,\n });\n\n const readKey = (row: TRow, index: number): RowKey => {\n const { rowKey } = options;\n if (typeof rowKey === \"function\") {\n return rowKey(row, index);\n }\n const path = rowKey ?? \"id\";\n const value = getPath(row, path);\n if (typeof value === \"string\" || typeof value === \"number\") {\n return value;\n }\n return rowKey === undefined || !isRecord(row) ? index : String(value);\n };\n\n const resolveColumns = memo((defs: readonly ColumnDef<TRow>[]) => {\n const issues: TableIssue[] = [];\n const columns = defs.flatMap((definition) => {\n if (!isSafePath(definition.id)) {\n issues.push(\n issue(\n \"unsafe_path\",\n `The column \"${definition.id}\" addresses a prototype and is ignored.`,\n { column: definition.id },\n ),\n );\n return [];\n }\n return [resolveColumn(definition)];\n });\n return { columns, byId: new Map(columns.map((column) => [column.id, column])), issues };\n });\n\n let primedIndex:\n | {\n data: readonly TRow[];\n columns: ReadonlyMap<string, TableColumn<TRow>>;\n result: IndexedRows<TRow>;\n }\n | undefined;\n const indexRows = memo(\n (rows: readonly TRow[], byId: ReadonlyMap<string, TableColumn<TRow>>): IndexedRows<TRow> => {\n if (primedIndex?.data === rows && primedIndex.columns === byId) return primedIndex.result;\n const byKey = new Map<RowKey, TableRow<TRow>>();\n const issues: TableIssue[] = [];\n const indexed = rows.map((original, index) => {\n let key = readKey(original, index);\n if (byKey.has(key)) {\n issues.push(\n issue(\n \"duplicate_row_key\",\n `Row ${index} repeats the key \"${String(key)}\"; it is keyed \"${String(key)}#${index}\" instead.`,\n { rowKey: key },\n ),\n );\n key = `${String(key)}#${index}`;\n }\n const row = createRow(\n original,\n key,\n index,\n byId,\n options.getRowCanExpand?.(original) ?? false,\n );\n byKey.set(key, row);\n return row;\n });\n stableSource.set(rows, stableRows(rows));\n return { rows: indexed, byKey, issues };\n },\n );\n\n const treeStage = memo(\n (rows: readonly TRow[], byId: ReadonlyMap<string, TableColumn<TRow>>, _version: number) =>\n buildTree(rows, byId, readKey, options, lazyChildren),\n );\n const treeIndex = memo(\n (model: TreeModel<TRow>): IndexedRows<TRow> => ({\n rows: model.rows,\n byKey: new Map(model.rows.map((row) => [row.key, row])),\n issues: model.issues,\n }),\n );\n const treePositions = memo((model: TreeModel<TRow>) => {\n const result = new Map<RowKey, InsertPosition>();\n const index = (siblings: readonly TreeNode<TRow>[], parent?: RowKey): void => {\n siblings.forEach((node, position) =>\n result.set(\n node.row.key,\n Object.freeze({ parent, before: siblings[position + 1]?.row.key }),\n ),\n );\n };\n index(model.roots);\n for (const node of model.nodes) index(node.children, node.row.key);\n return result;\n });\n const processedTreeStage = memo(\n (\n model: TreeModel<TRow>,\n columns: readonly TableColumn<TRow>[],\n search: string,\n filters: TableState[\"filters\"],\n sorting: TableState[\"sorting\"],\n ) =>\n processTree(\n model,\n columns,\n { ...state, search, filters, sorting },\n options.treeFilter ?? \"ancestors\",\n manual,\n ),\n );\n const flattenTree = createTreeFlattener<TRow>();\n const emptyAncestors = new Set<RowKey>();\n const singleTreePath = memo((model: TreeModel<TRow>, expanded: ExpandedState) => {\n const ancestors = new Set<RowKey>();\n if (expanded !== true) {\n for (const key of expanded) {\n let parent = model.byKey.get(key)?.parent;\n while (parent && !ancestors.has(parent.row.key)) {\n ancestors.add(parent.row.key);\n parent = parent.parent;\n }\n }\n }\n return ancestors;\n });\n const treeSelection = memo((model: TreeModel<TRow>, selection: readonly RowKey[]) => {\n const selected = new Set(selection);\n const counts = new Map<TreeNode<TRow>, { selected: number; total: number }>();\n const stack = model.roots.map((node) => ({ node, exit: false }));\n while (stack.length) {\n const { node, exit } = stack.pop()!;\n if (!exit) {\n stack.push({ node, exit: true });\n for (const child of node.children) stack.push({ node: child, exit: false });\n } else {\n let count = selected.has(node.row.key) ? 1 : 0;\n let total = 1;\n for (const child of node.children) {\n const value = counts.get(child)!;\n count += value.selected;\n total += value.total;\n }\n counts.set(node, { selected: count, total });\n }\n }\n return counts;\n });\n\n const orderColumns = memo(\n (\n columns: readonly TableColumn<TRow>[],\n columnOrder: readonly string[],\n hiddenColumns: readonly string[],\n ) => {\n const position = new Map(columnOrder.map((id, index) => [id, index]));\n const ordered = columns\n .map((column, index) => ({ column, index }))\n .toSorted((left, right) => {\n const leftPosition = position.get(left.column.id) ?? columnOrder.length + left.index;\n const rightPosition = position.get(right.column.id) ?? columnOrder.length + right.index;\n return leftPosition - rightPosition;\n })\n .map(({ column }) => column);\n const hidden = new Set(hiddenColumns);\n return { all: ordered, visible: ordered.filter((column) => !hidden.has(column.id)) };\n },\n );\n\n let primedFilter:\n | {\n rows: readonly TableRow<TRow>[];\n columns: readonly TableColumn<TRow>[];\n search: string;\n filters: TableState[\"filters\"];\n result: readonly TableRow<TRow>[];\n }\n | undefined;\n let primedSort:\n | {\n rows: readonly TableRow<TRow>[];\n columns: readonly TableColumn<TRow>[];\n sorting: TableState[\"sorting\"];\n result: readonly TableRow<TRow>[];\n }\n | undefined;\n const filterStage = memo(\n (\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n search: string,\n filters: TableState[\"filters\"],\n ) =>\n primedFilter?.rows === rows &&\n primedFilter.columns === columns &&\n primedFilter.search === search &&\n primedFilter.filters === filters\n ? primedFilter.result\n : filterRows(rows, columns, search, filters),\n );\n const sortStage = memo(\n (\n rows: readonly TableRow<TRow>[],\n columns: readonly TableColumn<TRow>[],\n sorting: TableState[\"sorting\"],\n ) =>\n primedSort?.rows === rows && primedSort.columns === columns && primedSort.sorting === sorting\n ? primedSort.result\n : sortRows(rows, columns, sorting),\n );\n const rowMembership = new WeakMap<readonly TableRow<TRow>[], Set<RowKey>>();\n function membership(rows: readonly TableRow<TRow>[]): Set<RowKey> {\n let keys = rowMembership.get(rows);\n if (!keys) {\n keys = new Set(rows.map((row) => row.key));\n rowMembership.set(rows, keys);\n }\n return keys;\n }\n const selectedSet = memo((selection: readonly RowKey[]) => new Set(selection));\n const expansionStage = memo(\n (indexed: IndexedRows<TRow>, expanded: ExpandedState, selection: readonly RowKey[]) => {\n const keys = expanded === true ? undefined : new Set(expanded);\n const selected = new Set(selection);\n const rows = mapList(indexed.rows, (row) => {\n const isExpanded = row.canExpand && (expanded === true || (keys?.has(row.key) ?? false));\n return isExpanded || selected.has(row.key)\n ? shareRow(\n row,\n Object.freeze({\n ...row,\n isExpanded,\n selection: selected.has(row.key) ? (\"all\" as const) : (\"none\" as const),\n }),\n )\n : row;\n });\n const byKey = {\n get(key: RowKey): TableRow<TRow> | undefined {\n const row = indexed.byKey.get(key);\n return row && row.index < rows.length ? rows[row.index] : undefined;\n },\n };\n return { rows, byKey };\n },\n );\n const expandedOrder = memo(\n (rows: readonly TableRow<TRow>[], byKey: { get(key: RowKey): TableRow<TRow> | undefined }) =>\n mapList(rows, (row) => byKey.get(row.key)!),\n );\n\n function stateIssues(byId: ReadonlyMap<string, TableColumn<TRow>>): TableIssue[] {\n const issues: TableIssue[] = [];\n if (expandedIssue) issues.push(expandedIssue);\n const referenced = new Set([\n ...state.sorting.map((rule) => rule.column),\n ...Object.keys(state.filters),\n ...state.hiddenColumns,\n ...state.columnOrder,\n ]);\n for (const id of referenced) {\n if (!byId.has(id)) {\n issues.push(\n issue(\"unknown_column\", `The state refers to a column \"${id}\" that is not defined.`, {\n column: id,\n }),\n );\n }\n }\n const { pageSize } = state.pagination;\n if (paginate && (!Number.isInteger(pageSize) || pageSize < 1)) {\n issues.push(\n issue(\n \"invalid_page_size\",\n `Page size ${String(pageSize)} is not a positive whole number; ${DEFAULT_PAGE_SIZE} is used.`,\n ),\n );\n }\n return issues;\n }\n\n function computeSnapshot(): TableSnapshot<TRow> {\n const cellProblems = validation.problems();\n const dirty = new Set(pendingChanges.entries.keys());\n const metadata = (row: TableRow<TRow>): TableRow<TRow> =>\n dirty.has(row.key) || cellProblems.has(row.key)\n ? Object.freeze({\n ...row,\n isDirty: dirty.has(row.key),\n cellIssues: cellProblems.get(row.key),\n })\n : row;\n const { columns, byId, issues: columnIssues } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n const indexed = model ? { rows: model.rows, issues: model.issues } : indexRows(data, byId);\n const expanded = model\n ? undefined\n : expansionStage(indexed as IndexedRows<TRow>, state.expanded, state.selection);\n const ordered = orderColumns(columns, state.columnOrder, state.hiddenColumns);\n const issues = [\n ...optionIssues,\n ...ingestionIssues,\n ...streamIssues,\n ...columnIssues,\n ...indexed.issues,\n ...stateIssues(byId),\n ...loadIssues.values(),\n ...Array.from(loadValidationIssues.values()).flat(),\n ...Array.from(cellProblems.values()).flatMap((row) => [...row.values()]),\n ];\n const requestedSize = state.pagination.pageSize;\n let pageSize =\n Number.isInteger(requestedSize) && requestedSize >= 1 ? requestedSize : DEFAULT_PAGE_SIZE;\n\n let processedRows: readonly TableRow<TRow>[];\n let rows: readonly TableRow<TRow>[];\n let filteredCount: number;\n let page: number;\n let pageCount: number;\n let treeRow: ((key: RowKey) => TableRow<TRow> | undefined) | undefined;\n let totalCount = indexed.rows.length;\n if (model) {\n const processed = processedTreeStage(\n model,\n columns,\n state.search,\n state.filters,\n state.sorting,\n );\n const ancestors =\n expandMode === \"single\" ? singleTreePath(model, state.expanded) : emptyAncestors;\n const visible = flattenTree(processed, state.expanded, ancestors);\n const expandedState = state.expanded;\n const keys = state.expanded === true ? undefined : new Set(state.expanded);\n const selected = treeSelection(model, state.selection);\n const projected = new Map<RowKey, TableRow<TRow>>();\n const statuses = new Map(childStatuses);\n treeRow = (key) => {\n const cached = projected.get(key);\n if (cached) return cached;\n const node = model.byKey.get(key);\n if (!node) return undefined;\n const status =\n statuses.get(key) ?? (node.children.length || !node.unloaded ? \"loaded\" : \"idle\");\n const count = selected.get(node)!;\n const canExpand =\n node.children.length > 0 ||\n status !== \"loaded\" ||\n (options.getRowCanExpand?.(node.row.original) ?? false);\n const result = shareRow(\n node.row,\n Object.freeze({\n ...node.row,\n isDirty: dirty.has(key),\n cellIssues: cellProblems.get(key),\n depth: node.depth,\n parentKey: node.parent?.row.key,\n childCount: status === \"loaded\" ? node.children.length : undefined,\n childStatus: status,\n canExpand,\n isExpanded:\n canExpand &&\n (expandedState === true ||\n (keys?.has(key) ?? false) ||\n ancestors.has(key) ||\n processed.autoExpanded.has(key)),\n selection: coverage(count.selected, count.total),\n }),\n );\n projected.set(key, result);\n return result;\n };\n processedRows = visible.map((node) => treeRow!(node.row.key)!);\n filteredCount = manual\n ? (rowCount ?? model.roots.length)\n : rootPagination\n ? processed.roots.length\n : visible.length;\n totalCount = rootPagination ? model.roots.length : model.nodes.length;\n pageCount = countPages(filteredCount, pageSize);\n page = clampPage(state.pagination.page, pageCount);\n if (manual) rows = processedRows;\n else if (rootPagination) {\n const roots = new Set(processed.roots.slice((page - 1) * pageSize, page * pageSize));\n const allRoots = new Set(processed.roots);\n let root: TreeNode<TRow> | undefined;\n rows = processedRows.filter((_row, index) => {\n const node = visible[index]!;\n if (allRoots.has(node)) root = node;\n return root !== undefined && roots.has(root);\n });\n } else rows = paginateRows(processedRows, { page, pageSize });\n } else if (manual) {\n processedRows = expanded!.rows;\n rows = expanded!.rows;\n filteredCount = rowCount ?? indexed.rows.length;\n pageCount = countPages(filteredCount, pageSize);\n page = clampPage(state.pagination.page, pageCount);\n } else {\n const filtered = filterStage(indexed.rows, columns, state.search, state.filters);\n processedRows = expandedOrder(sortStage(filtered, columns, state.sorting), expanded!.byKey);\n filteredCount = processedRows.length;\n pageCount = countPages(filteredCount, pageSize);\n page = clampPage(state.pagination.page, pageCount);\n rows = paginateRows(processedRows, { page, pageSize });\n }\n\n if (!paginate) {\n rows = processedRows;\n page = 1;\n pageCount = 1;\n pageSize = Math.max(1, rows.length);\n }\n const flatProjected = new Map<RowKey, TableRow<TRow>>();\n if (!model) {\n const project = (row: TableRow<TRow>): TableRow<TRow> => {\n let result = flatProjected.get(row.key);\n if (!result) {\n result = metadata(row);\n flatProjected.set(row.key, result);\n }\n return result;\n };\n const shared = rows === processedRows;\n processedRows = mapList(processedRows, project);\n rows = shared ? processedRows : rows.map(project);\n }\n\n const selected = selectedSet(state.selection);\n const allData = model ? model.byKey : (indexed as IndexedRows<TRow>).byKey;\n const allProcessedKeys = model\n ? undefined\n : manual\n ? undefined\n : membership(filterStage(indexed.rows, columns, state.search, state.filters));\n const selectedInProcessed = state.selection.filter(\n (key) => allData.has(key) && (!allProcessedKeys || allProcessedKeys.has(key)),\n ).length;\n const pageSelected =\n rows === processedRows\n ? selectedInProcessed\n : rows.filter((row) => selected.has(row.key)).length;\n const scopeRows = selectScope === \"page\" || manual ? rows : processedRows;\n const scopeSelected =\n scopeRows === rows\n ? pageSelected\n : model\n ? scopeRows.filter((row) => selected.has(row.key)).length\n : selectedInProcessed;\n const pageStart = rows.length === 0 ? 0 : (page - 1) * pageSize + 1;\n const sortIndex = new Map(\n state.sorting.map((rule, priority) => [rule.column, { direction: rule.direction, priority }]),\n );\n\n return Object.freeze({\n tree: treeEnabled,\n loadState,\n loadedRowCount: indexed.rows.length,\n expectedRowCount,\n state,\n columns: ordered.visible,\n allColumns: ordered.all,\n rows,\n renderItems:\n !model && state.expanded !== true && state.expanded.length === 0\n ? mapList(rows, (row, rowIndex) =>\n Object.freeze({ kind: \"row\" as const, key: getRowItemKey(row.key), row, rowIndex }),\n )\n : Object.freeze(\n rows.flatMap((row, rowIndex): TableRenderItem<TRow>[] => {\n const item = Object.freeze({\n kind: \"row\" as const,\n key: getRowItemKey(row.key),\n row,\n rowIndex,\n });\n return row.isExpanded &&\n (!model || (options.getRowCanExpand?.(row.original) ?? false))\n ? [\n item,\n Object.freeze({\n kind: \"detail\" as const,\n key: getRowItemKey(row.key, \"detail\"),\n row,\n rowIndex,\n }),\n ]\n : [item];\n }),\n ),\n paginate,\n processedRows,\n page,\n pageSize,\n pageCount,\n rowCount: filteredCount,\n totalRowCount: manual ? filteredCount : totalCount,\n pageStart,\n pageEnd:\n rows.length === 0\n ? 0\n : rootPagination\n ? Math.min(filteredCount, page * pageSize)\n : pageStart + rows.length - 1,\n pageItems: paginationItems(page, pageCount),\n canPreviousPage: page > 1,\n canNextPage: page < pageCount,\n selectionMode,\n selectedCount: model\n ? state.selection.filter((key) => model.byKey.has(key)).length\n : state.selection.length,\n pageSelection: coverage(pageSelected, rows.length),\n allSelection: coverage(scopeSelected, scopeRows.length),\n canUndo: undoStack.canUndo,\n canRedo: undoStack.canRedo,\n issues: Object.freeze(issues),\n pendingCells: validation.cells(),\n isSelected: (key: RowKey): boolean => selected.has(key),\n getSort: (columnId: string): SortInfo | undefined => sortIndex.get(columnId),\n getColumn: (columnId: string): TableColumn<TRow> | undefined => byId.get(columnId),\n getRow: (key: RowKey): TableRow<TRow> | undefined =>\n treeRow\n ? treeRow(key)\n : (flatProjected.get(key) ??\n (expanded!.byKey.get(key) ? metadata(expanded!.byKey.get(key)!) : undefined)),\n });\n }\n\n function getSnapshot(): TableSnapshot<TRow> {\n snapshot ??= computeSnapshot();\n return snapshot;\n }\n\n function notify(): void {\n snapshot = undefined;\n if (deferValidationNotify) {\n validationNotifyRequested = true;\n return;\n }\n if (transaction) return;\n if (listeners.size === 0) {\n return;\n }\n const next = getSnapshot();\n for (const listener of listeners) {\n listener(next);\n }\n }\n\n function abortLoads(all = false): void {\n for (const [key, controller] of pendingLoads) {\n const row = all ? undefined : getSnapshot().getRow(key);\n // Closing an ancestor also makes an in-flight descendant unnecessary.\n const visible =\n !all && getSnapshot().processedRows.some((candidate) => candidate.key === key);\n if (all || !row?.isExpanded || !visible) {\n pendingLoads.delete(key);\n childStatuses.delete(key);\n controller.abort();\n snapshot = undefined;\n }\n }\n }\n\n function requestChildren(row: TableRow<TRow>): void {\n if (\n !options.loadChildren ||\n destroyed ||\n pendingLoads.has(row.key) ||\n lazyChildren.has(row.key) ||\n row.childStatus === \"loaded\"\n )\n return;\n const key = row.key;\n if (!options.createChildLoadController) {\n childStatuses.set(key, \"error\");\n loadIssues.set(\n key,\n issue(\n \"invalid_tree_option\",\n \"Lazy children require createChildLoadController from the caller's runtime.\",\n { rowKey: key },\n ),\n );\n notify();\n return;\n }\n let controller: TreeLoadController<TSignal>;\n try {\n controller = options.createChildLoadController();\n } catch (error) {\n loadIssues.set(key, issue(\"tree_load_error\", String(error), { rowKey: key }));\n childStatuses.set(key, \"error\");\n notify();\n return;\n }\n pendingLoads.set(key, controller);\n childStatuses.set(key, \"loading\");\n loadIssues.delete(key);\n loadValidationIssues.delete(key);\n notify();\n // Promise scheduling catches synchronous loader failures as well as rejected loads.\n void Promise.resolve()\n .then(() => (controller.signal.aborted ? [] : options.loadChildren!(row, controller.signal)))\n .then((children) => {\n if (controller.signal.aborted || pendingLoads.get(key) !== controller || destroyed)\n return undefined;\n const { byId } = resolveColumns(definitions);\n const existing = treeStage(data, byId, lazyVersion);\n // Validate a loaded subtree against all existing keys, including collapsed rows.\n const candidate = buildTree(\n children,\n byId,\n readKey,\n { ...options, getParentKey: undefined },\n new Map(),\n );\n pendingLoads.delete(key);\n loadValidationIssues.set(\n key,\n candidate.issues.filter(\n (problem) => problem.code === \"tree_cycle\" || problem.code === \"tree_depth_exceeded\",\n ),\n );\n const collisions = candidate.nodes.filter((node) => existing.byKey.has(node.row.key));\n if (\n collisions.length ||\n candidate.issues.some((problem) => problem.code === \"duplicate_row_key\")\n ) {\n childStatuses.set(key, \"error\");\n loadIssues.set(\n key,\n issue(\n \"tree_duplicate_key\",\n \"Loaded children collide with existing keys; the batch is rejected.\",\n { rowKey: key },\n ),\n );\n } else {\n lazyChildren.set(key, children);\n childStatuses.set(key, \"loaded\");\n lazyVersion++;\n // A selected parent covers children as they arrive.\n if (state.selection.includes(key) && selectionMode === \"multiple\") {\n const nextModel = treeStage(data, byId, lazyVersion);\n applySelection([...state.selection, ...selectionKeys([key], nextModel)]);\n }\n }\n notify();\n startVisibleLoads();\n return undefined;\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted || pendingLoads.get(key) !== controller || destroyed) return;\n pendingLoads.delete(key);\n childStatuses.set(key, \"error\");\n loadIssues.set(\n key,\n issue(\"tree_load_error\", `Children could not be loaded: ${String(error)}`, {\n rowKey: key,\n }),\n );\n notify();\n });\n }\n\n function startVisibleLoads(): void {\n if (!treeEnabled || !options.loadChildren || destroyed) return;\n const current = getSnapshot();\n for (const row of current.rows)\n if (row.isExpanded && row.childStatus === \"idle\") requestChildren(row);\n }\n\n function selectionKeys(keys: readonly RowKey[], model?: TreeModel<TRow>): RowKey[] {\n if (!treeEnabled || selectionMode !== \"multiple\") return [...keys];\n model ??= treeStage(data, resolveColumns(definitions).byId, lazyVersion);\n const result = new Set(keys);\n const stack = keys.flatMap((key) => {\n const node = model.byKey.get(key);\n return node ? [node] : [];\n });\n const visited = new Set<RowKey>();\n while (stack.length) {\n const node = stack.pop()!;\n if (visited.has(node.row.key)) continue;\n visited.add(node.row.key);\n result.add(node.row.key);\n for (const child of node.children) stack.push(child);\n }\n return [...result];\n }\n\n /** Apply a change made by a table operation. */\n function commit(patch: TableStatePatch): void {\n const previous = state;\n const previousIssue = expandedIssue;\n const next = mergePatch(patch);\n if (next === previous && previousIssue === expandedIssue) {\n return;\n }\n state = next;\n snapshot = undefined;\n abortLoads();\n if (next !== previous) options.onStateChange?.(state, previous);\n notify();\n startVisibleLoads();\n }\n\n function canonicalExpanded(\n expanded: ExpandedState,\n candidate: TableState = state,\n ): ExpandedState {\n if (expandMode === \"multiple\") return expanded;\n if (expanded !== true) return expanded.slice(-1);\n const { columns, byId } = resolveColumns(definitions);\n if (treeEnabled) {\n const model = treeStage(data, byId, lazyVersion);\n const tree = processedTreeStage(\n model,\n columns,\n candidate.search,\n candidate.filters,\n candidate.sorting,\n );\n const first = tree.roots.find(\n (node) =>\n node.children.length > 0 ||\n (options.hasChildren?.(node.row.original) ?? false) ||\n (options.getRowCanExpand?.(node.row.original) ?? false),\n );\n return first ? [first.row.key] : [];\n }\n const indexed = indexRows(data, byId);\n const processed = manual\n ? indexed.rows\n : sortStage(\n filterStage(indexed.rows, columns, candidate.search, candidate.filters),\n columns,\n candidate.sorting,\n );\n const first = processed.find((row) => row.canExpand);\n return first ? [first.key] : [];\n }\n\n function mergePatch(patch: TableStatePatch): TableState {\n if (patch.expanded !== undefined) expandedIssue = undefined;\n const next = mergeState(state, patch, (problem) => {\n expandedIssue = problem;\n });\n return expandMode === \"single\" && patch.expanded !== undefined\n ? mergeState(state, { ...patch, expanded: canonicalExpanded(next.expanded, next) })\n : next;\n }\n\n const firstPage = (): { readonly page: number; readonly pageSize: number } => ({\n page: 1,\n pageSize: state.pagination.pageSize,\n });\n\n function setSort(columnId: string, direction: SortDirection | undefined, multi: boolean): void {\n const column = getSnapshot().getColumn(columnId);\n if (!column?.sortable) {\n return;\n }\n const others = multi ? state.sorting.filter((rule) => rule.column !== columnId) : [];\n const existing = state.sorting.findIndex((rule) => rule.column === columnId);\n let sorting = others;\n if (direction) {\n const rule = { column: columnId, direction };\n sorting =\n multi && existing !== -1\n ? state.sorting.map((current) => (current.column === columnId ? rule : current))\n : [...others, rule];\n }\n commit({ sorting, pagination: firstPage() });\n }\n\n function applySelection(next: readonly RowKey[]): void {\n if (selectionMode === \"none\") {\n return;\n }\n const unique = [...new Set(next)];\n const selection = selectionMode === \"single\" ? unique.slice(-1) : unique;\n const current = state.selection;\n if (selection.length === current.length && selection.every((key, i) => key === current[i])) {\n return;\n }\n commit({ selection });\n }\n\n function applyChanges(\n edits: readonly CellEdit[],\n record: boolean,\n recoveredIssues: readonly TableIssue[] = [],\n ): EditResult<TRow> {\n const current = getSnapshot();\n const working = [...data];\n const model = treeEnabled\n ? treeStage(data, resolveColumns(definitions).byId, lazyVersion)\n : undefined;\n const replacements = new Map<TreeNode<TRow>, TRow>();\n const cache = new Map(lazyChildren);\n const originalOf = (node: TreeNode<TRow>): TRow => replacements.get(node) ?? node.row.original;\n const issues: TableIssue[] = [...recoveredIssues];\n const changes: CellChange<TRow>[] = [];\n // A value from another row tells a column's type when the edited cell is empty. It is looked\n // up once per column, not once per edit, so pasting a large range stays linear.\n const samples = new Map<string, unknown>();\n const sampleOf = (columnId: string): unknown => {\n if (!samples.has(columnId)) {\n const other = current.processedRows.find((candidate) => {\n const value = candidate.getValue(columnId);\n return value !== null && value !== undefined;\n });\n samples.set(columnId, other?.getValue(columnId));\n }\n return samples.get(columnId);\n };\n for (const edit of edits) {\n const row = current.getRow(edit.rowKey);\n const column = current.getColumn(edit.column);\n if (!row) {\n issues.push(\n issue(\"unknown_row\", `No row has the key \"${String(edit.rowKey)}\".`, {\n rowKey: edit.rowKey,\n column: edit.column,\n }),\n );\n continue;\n }\n if (!isSafePath(edit.column)) {\n issues.push(\n issue(\n \"unsafe_path\",\n `The path \"${edit.column}\" addresses a prototype and cannot be written.`,\n { rowKey: edit.rowKey, column: edit.column },\n ),\n );\n continue;\n }\n if (!column) {\n issues.push(\n issue(\"unknown_column\", `No column has the id \"${edit.column}\".`, {\n rowKey: edit.rowKey,\n column: edit.column,\n }),\n );\n continue;\n }\n const node = model?.byKey.get(row.key);\n const original = node ? originalOf(node) : (working[row.index] as TRow);\n if (node && !node.writable) {\n issues.push(\n issue(\n \"read_only_cell\",\n \"A recovered nested root has no unambiguous source path for editing.\",\n { rowKey: row.key, column: column.id },\n ),\n );\n continue;\n }\n if (node?.parent && options.getChildren && !options.setChildren) {\n issues.push(\n issue(\n \"read_only_cell\",\n \"Editing a nested child requires an immutable setChildren callback.\",\n { rowKey: row.key, column: column.id },\n ),\n );\n continue;\n }\n if (record && !column.isEditable(original)) {\n issues.push(\n issue(\n \"read_only_cell\",\n `The \"${column.id}\" cell of row \"${String(row.key)}\" is read-only.`,\n {\n rowKey: row.key,\n column: column.id,\n },\n ),\n );\n continue;\n }\n let value: unknown;\n if (isInputEdit(edit)) {\n const parsed = column.parse(edit.input, original, sampleOf(column.id));\n if (!parsed.ok) {\n issues.push(\n issue(\"invalid_value\", parsed.message, { rowKey: row.key, column: column.id }),\n );\n continue;\n }\n value = parsed.value;\n } else {\n value = edit.value;\n }\n const previous = column.getValue(original);\n if (Object.is(previous, value)) {\n continue;\n }\n let updated: TRow | undefined;\n try {\n updated = column.setValue(original, value);\n } catch (error) {\n issues.push(\n issue(\"invalid_value\", error instanceof Error ? error.message : String(error), {\n rowKey: row.key,\n column: column.id,\n }),\n );\n continue;\n }\n if (updated === undefined) {\n issues.push(\n issue(\"read_only_cell\", `The \"${column.id}\" column has no way to write a value.`, {\n rowKey: row.key,\n column: column.id,\n }),\n );\n continue;\n }\n if (readKey(updated, row.index) !== readKey(original, row.index)) {\n issues.push(\n issue(\n \"invalid_row_operation\",\n \"Editing a row key is not supported; remove and insert the row instead.\",\n { rowKey: row.key, column: column.id },\n ),\n );\n continue;\n }\n if (!node) working[row.index] = updated;\n else {\n const planned = new Map<TreeNode<TRow>, TRow>([[node, updated]]);\n const plannedCache = new Map<RowKey, readonly TRow[]>();\n let cursor = node;\n try {\n while (cursor.parent) {\n const parent = cursor.parent;\n const children = parent.children.map(\n (child) => planned.get(child) ?? originalOf(child),\n );\n if (cursor.lazy) plannedCache.set(parent.row.key, children);\n if (options.setChildren)\n planned.set(parent, options.setChildren(originalOf(parent), children));\n cursor = parent;\n }\n } catch (error) {\n issues.push(\n issue(\"invalid_value\", error instanceof Error ? error.message : String(error), {\n rowKey: row.key,\n column: column.id,\n }),\n );\n continue;\n }\n for (const [item, plannedRow] of planned) replacements.set(item, plannedRow);\n for (const [key, children] of plannedCache) cache.set(key, children);\n if (!options.getChildren && !node.lazy) working[node.sourceIndex] = updated;\n if (options.getChildren || options.setChildren)\n working[cursor.sourceIndex] = originalOf(cursor);\n }\n changes.push({ rowKey: row.key, column: column.id, previous, value, row: updated });\n }\n\n let status: EditStatus;\n if (changes.length === 0) {\n status = issues.length > 0 ? \"rejected\" : \"unchanged\";\n } else {\n status = issues.length > 0 ? \"partial\" : \"applied\";\n data = working;\n if (model) {\n lazyChildren.clear();\n for (const [key, children] of cache) lazyChildren.set(key, children);\n lazyVersion++;\n }\n if (record) {\n if (!transaction) undoStack.record({ kind: \"cells\", changes });\n }\n const groups = new Map<RowKey, CellChange<TRow>[]>();\n for (const change of changes) {\n const group = groups.get(change.rowKey) ?? [];\n group.push(change);\n groups.set(change.rowKey, group);\n }\n for (const [key, group] of groups)\n pendingChanges.record(\n key,\n current.getRow(key)!.original,\n group.at(-1)!.row,\n positionOf(key),\n group,\n );\n if (!transaction) options.onDataChange?.(data, changes);\n notify();\n }\n if (issues.length > 0 && !transaction) {\n options.onEditIssues?.(issues);\n }\n return Object.freeze({\n status,\n changes: Object.freeze(changes),\n issues: Object.freeze(issues),\n rowChanges: Object.freeze([]),\n pendingCells: Object.freeze([]),\n });\n }\n\n function sourceRows(): IndexedRows<TRow> {\n const { byId } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n return model ? treeIndex(model) : indexRows(data, byId);\n }\n function positionOf(key: RowKey): InsertPosition {\n const { byId } = resolveColumns(definitions);\n if (treeEnabled) {\n const model = treeStage(data, byId, lazyVersion);\n return treePositions(model).get(key) ?? Object.freeze({});\n }\n const indexed = indexRows(data, byId);\n const row = indexed.byKey.get(key);\n return Object.freeze({ before: row ? indexed.rows[row.index + 1]?.key : undefined });\n }\n function scene(): RowScene<TRow> {\n return { data, lazy: new Map(lazyChildren) };\n }\n function resultForRows(\n changes: readonly RowChange<TRow>[],\n issues: readonly TableIssue[],\n cells: readonly CellChange<TRow>[] = [],\n ): EditResult<TRow> {\n return Object.freeze({\n status:\n changes.length || cells.length\n ? issues.length\n ? \"partial\"\n : \"applied\"\n : issues.length\n ? \"rejected\"\n : \"unchanged\",\n changes: Object.freeze([...cells]),\n rowChanges: Object.freeze([...changes]),\n pendingCells: Object.freeze([]),\n issues: Object.freeze([...issues]),\n });\n }\n function rowProblem(message: string, rowKey?: RowKey): TableIssue {\n return issue(\"invalid_row_operation\", message, { rowKey });\n }\n function stableRows(rows: readonly TRow[]): boolean {\n return (\n options.rowKey !== undefined ||\n rows.every((row) => {\n const key = getPath(row, \"id\");\n return typeof key === \"string\" || typeof key === \"number\";\n })\n );\n }\n function cellDifferences(previous: TRow, row: TRow, key: RowKey): CellChange<TRow>[] {\n return resolveColumns(definitions).columns.flatMap((column) => {\n const before = column.getValue(previous);\n const value = column.getValue(row);\n return Object.is(before, value)\n ? []\n : [{ rowKey: key, column: column.id, previous: before, value, row }];\n });\n }\n function recordRows(\n previous: IndexedRows<TRow>,\n keys: readonly RowKey[],\n positions: ReadonlyMap<RowKey, InsertPosition>,\n baselines: ReadonlyMap<RowKey, TRow> = new Map(),\n ): RowChange<TRow>[] {\n const next = sourceRows();\n const rowChanges: RowChange<TRow>[] = [];\n for (const key of keys) {\n const before = previous.byKey.get(key)?.original;\n const row = next.byKey.get(key)?.original;\n const position = positions.get(key) ?? positionOf(key);\n const cells =\n before !== undefined && row !== undefined ? cellDifferences(before, row, key) : [];\n const baseline = baselines.get(key);\n const pending = pendingChanges.entries.get(key);\n if (row === undefined && baseline !== undefined && pending?.previous !== undefined)\n pending.previous = baseline;\n pendingChanges.record(\n key,\n row === undefined ? (baseline ?? before) : before,\n row,\n position,\n cells,\n );\n if (before === undefined && row !== undefined)\n rowChanges.push(\n Object.freeze({ kind: \"inserted\", rowKey: key, row, position: positionOf(key) }),\n );\n else if (row === undefined && before !== undefined)\n rowChanges.push(Object.freeze({ kind: \"removed\", rowKey: key, row: before, position }));\n }\n return rowChanges;\n }\n function publishRows(\n before: RowScene<TRow>,\n previous: IndexedRows<TRow>,\n keys: readonly RowKey[],\n positions: ReadonlyMap<RowKey, InsertPosition>,\n issues: readonly TableIssue[],\n baselines: ReadonlyMap<RowKey, TRow> = new Map(),\n ): EditResult<TRow> {\n const rowChanges = recordRows(previous, keys, positions, baselines);\n if (!transaction) {\n undoStack.record({ kind: \"rows\", before, after: scene(), keys });\n options.onDataChange?.(data, []);\n if (issues.length) options.onEditIssues?.(issues);\n }\n notify();\n return resultForRows(rowChanges, issues);\n }\n function restoreScene(\n entry: Extract<EditHistory<TRow>, { kind: \"rows\" }>,\n direction: \"undo\" | \"redo\",\n ): void {\n const previous = sourceRows();\n const baselines = removalBaselines();\n const positions = new Map(entry.keys.map((key) => [key, positionOf(key)]));\n const target = direction === \"undo\" ? entry.before : entry.after;\n data = target.data;\n const changed = new Set([...entry.before.lazy.keys(), ...entry.after.lazy.keys()]);\n for (const key of changed) {\n if (entry.before.lazy.get(key) === entry.after.lazy.get(key)) continue;\n const rows = target.lazy.get(key);\n if (rows) lazyChildren.set(key, rows);\n else lazyChildren.delete(key);\n }\n lazyVersion++;\n recordRows(previous, entry.keys, positions, baselines);\n options.onDataChange?.(data, []);\n notify();\n }\n function removalBaselines(): ReadonlyMap<RowKey, TRow> {\n const baselines = new Map<RowKey, TRow>();\n if (!options.getChildren || !options.setChildren) return baselines;\n const model = treeStage(data, resolveColumns(definitions).byId, lazyVersion);\n for (const node of model.nodes.toReversed()) {\n const entry = pendingChanges.entries.get(node.row.key);\n if (entry && entry.previous === undefined) continue;\n let baseline = entry?.previous ?? node.row.original;\n const children = node.children\n .filter(\n (child) =>\n !pendingChanges.entries.has(child.row.key) ||\n pendingChanges.entries.get(child.row.key)!.previous !== undefined,\n )\n .map((child) => baselines.get(child.row.key) ?? child.row.original);\n const originalChildren = options.getChildren(baseline) ?? [];\n if (\n children.length !== originalChildren.length ||\n children.some((child, index) => child !== originalChildren[index])\n )\n baseline = options.setChildren(baseline, children);\n baselines.set(node.row.key, baseline);\n }\n return baselines;\n }\n function rewriteNested(\n model: TreeModel<TRow>,\n removed: ReadonlySet<RowKey>,\n overrides: ReadonlyMap<RowKey, readonly TRow[]>,\n cache: Map<RowKey, readonly TRow[]>,\n ): readonly TRow[] {\n const replacements = new Map<TreeNode<TRow>, TRow>();\n for (const node of model.nodes.toReversed()) {\n if (removed.has(node.row.key)) continue;\n const children =\n overrides.get(node.row.key) ??\n node.children\n .filter((child) => !removed.has(child.row.key))\n .map((child) => replacements.get(child) ?? child.row.original);\n const changed =\n overrides.has(node.row.key) ||\n children.length !== node.children.length ||\n children.some((child, index) => child !== node.children[index]?.row.original);\n if (!changed) continue;\n if (!options.setChildren) throw new Error(\"Changing nested children requires setChildren.\");\n replacements.set(node, options.setChildren(node.row.original, children));\n if (cache.has(node.row.key)) cache.set(node.row.key, children);\n }\n const roots = new Map(\n model.roots.filter((node) => node.writable).map((node) => [node.sourceIndex, node]),\n );\n return data.flatMap((row, index) => {\n const node = roots.get(index);\n return node && removed.has(node.row.key)\n ? []\n : [node ? (replacements.get(node) ?? row) : row];\n });\n }\n function insertRows(rows?: readonly TRow[], at: InsertPosition = {}): EditResult<TRow> {\n const before = scene();\n const previous = sourceRows();\n const problems: TableIssue[] = [];\n const reject = (problem: TableIssue): EditResult<TRow> => {\n if (!transaction) options.onEditIssues?.([problem]);\n return resultForRows([], [problem]);\n };\n let incoming: readonly TRow[];\n try {\n incoming = rows ?? (options.createRow ? [options.createRow()] : []);\n } catch (error) {\n return reject(rowProblem(error instanceof Error ? error.message : String(error)));\n }\n if (rows === undefined && !options.createRow)\n return reject(rowProblem(\"insertRows() requires rows or a createRow callback.\"));\n if (!incoming.length) return resultForRows([], []);\n if (!stableRows(data) || !stableRows(incoming))\n return reject(\n rowProblem(\"Row operations require stable row keys; supply rowKey or an id on every row.\"),\n );\n const { byId } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n const parent = at.parent === undefined ? undefined : model?.byKey.get(at.parent);\n const sibling = at.before === undefined ? undefined : previous.byKey.get(at.before);\n if (at.parent !== undefined && !parent)\n return reject(\n issue(\"unknown_row\", \"The insertion parent does not exist.\", { rowKey: at.parent }),\n );\n if (at.before !== undefined && !sibling)\n return reject(\n issue(\"unknown_row\", \"The insertion sibling does not exist.\", { rowKey: at.before }),\n );\n if (\n sibling &&\n (model?.byKey.get(sibling.key)?.parent?.row.key ?? sibling.parentKey) !== at.parent\n )\n return reject(rowProblem(\"The before row must belong to the requested parent.\", sibling.key));\n if (parent && !parent.writable)\n return reject(rowProblem(\"A recovered parent has no writable source path.\", parent.row.key));\n if (parent && getSnapshot().getRow(parent.row.key)?.childStatus !== \"loaded\")\n return reject(\n rowProblem(\"Load the parent's children before inserting rows.\", parent.row.key),\n );\n const cache = new Map(lazyChildren);\n let next: readonly TRow[];\n try {\n if (options.getChildren && parent && model) {\n const children = parent.children.map((child) => child.row.original);\n const index =\n at.before === undefined\n ? children.length\n : parent.children.findIndex((child) => child.row.key === at.before);\n children.splice(index, 0, ...incoming);\n next = rewriteNested(model, new Set(), new Map([[parent.row.key, children]]), cache);\n } else if (parent && cache.has(parent.row.key)) {\n incoming = incoming.map((row) =>\n options.setParentKey ? options.setParentKey(row, parent.row.key) : row,\n );\n const children = [...cache.get(parent.row.key)!];\n const index =\n at.before === undefined\n ? children.length\n : parent.children.findIndex((child) => child.row.key === at.before);\n children.splice(index, 0, ...incoming);\n cache.set(parent.row.key, children);\n next = [...data];\n } else {\n if (parent && options.getParentKey) {\n incoming = incoming.map((row) =>\n options.setParentKey ? options.setParentKey(row, parent.row.key) : row,\n );\n if (incoming.some((row) => options.getParentKey!(row) !== parent.row.key))\n return reject(\n rowProblem(\"Supply setParentKey or rows already addressed to the requested parent.\"),\n );\n }\n const working = [...data];\n working.splice(sibling?.index ?? working.length, 0, ...incoming);\n next = working;\n }\n const candidate = treeEnabled\n ? buildTree(next, byId, readKey, options, cache)\n : indexRows(next, byId);\n if (!stableRows(candidate.rows.map((row) => row.original)))\n return reject(rowProblem(\"Every inserted descendant must have a stable key.\"));\n const baseline = new Map<string, number>();\n for (const problem of previous.issues) {\n const key = `${problem.code}:${String(problem.rowKey)}`;\n baseline.set(key, (baseline.get(key) ?? 0) + 1);\n }\n problems.push(\n ...candidate.issues.filter((problem) => {\n const key = `${problem.code}:${String(problem.rowKey)}`;\n const remaining = baseline.get(key) ?? 0;\n if (!remaining) return true;\n baseline.set(key, remaining - 1);\n return false;\n }),\n );\n if (problems.length) {\n if (!transaction) options.onEditIssues?.(problems);\n return resultForRows([], problems);\n }\n const keys = candidate.rows\n .filter((row) => !previous.byKey.has(row.key))\n .map((row) => row.key);\n if (!keys.length) return reject(rowProblem(\"No unique rows can be inserted.\"));\n data = next;\n lazyChildren.clear();\n for (const [key, value] of cache) lazyChildren.set(key, value);\n lazyVersion++;\n return publishRows(before, previous, keys, new Map(), []);\n } catch (error) {\n return reject(rowProblem(error instanceof Error ? error.message : String(error)));\n }\n }\n function removeRows(keys: readonly RowKey[]): EditResult<TRow> {\n const before = scene();\n const previous = sourceRows();\n const problems: TableIssue[] = [];\n const removed = new Set<RowKey>();\n const { byId } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n if (!stableRows(data)) {\n const problem = rowProblem(\"Row operations require stable row keys.\");\n if (!transaction) options.onEditIssues?.([problem]);\n return resultForRows([], [problem]);\n }\n for (const key of keys) {\n if (!previous.byKey.has(key)) {\n problems.push(issue(\"unknown_row\", \"The row to remove does not exist.\", { rowKey: key }));\n continue;\n }\n const node = model?.byKey.get(key);\n if (node && !node.writable) {\n problems.push(rowProblem(\"A recovered row has no writable source path.\", key));\n continue;\n }\n const stack = node ? [node] : [];\n removed.add(key);\n while (stack.length) {\n const item = stack.pop()!;\n removed.add(item.row.key);\n for (const child of item.children) stack.push(child);\n }\n }\n if (!removed.size) {\n if (problems.length && !transaction) options.onEditIssues?.(problems);\n return resultForRows([], problems);\n }\n const positions = new Map([...removed].map((key) => [key, positionOf(key)]));\n const cache = new Map(lazyChildren);\n try {\n const baselines = removalBaselines();\n const next =\n options.getChildren && model\n ? rewriteNested(model, removed, new Map(), cache)\n : data.filter((row, index) => !removed.has(readKey(row, index)));\n for (const [key, children] of cache) {\n if (removed.has(key)) cache.delete(key);\n else\n cache.set(\n key,\n children.filter((row, index) => !removed.has(readKey(row, index))),\n );\n }\n data = next;\n lazyChildren.clear();\n for (const [key, value] of cache) lazyChildren.set(key, value);\n lazyVersion++;\n validation.cancel([...removed]);\n abortLoads();\n return publishRows(before, previous, [...removed], positions, problems, baselines);\n } catch (error) {\n problems.push(rowProblem(error instanceof Error ? error.message : String(error)));\n if (!transaction) options.onEditIssues?.(problems);\n return resultForRows([], problems);\n }\n }\n function revert(keys?: readonly RowKey[]): EditResult<TRow> {\n const selected = new Set(keys ?? pendingChanges.entries.keys());\n const entries = [...pendingChanges.entries]\n .filter(([key]) => selected.has(key))\n .map(([key, entry]) => [key, { ...entry, cells: new Map(entry.cells) }] as const);\n if (!entries.length) return resultForRows([], []);\n const before = scene();\n const previous = sourceRows();\n const positions = new Map([...selected].map((key) => [key, positionOf(key)]));\n const problems: TableIssue[] = [];\n const cells: CellChange<TRow>[] = [];\n transaction = true;\n try {\n problems.push(\n ...removeRows(\n entries.filter(([, entry]) => entry.previous === undefined).map(([key]) => key),\n ).issues,\n );\n const missing = entries.filter(\n ([, entry]) => entry.previous !== undefined && entry.row === undefined,\n );\n for (let pass = 0; missing.length && pass <= entries.length; pass++) {\n let progress = false;\n for (let index = missing.length - 1; index >= 0; index--) {\n const [key, entry] = missing[index]!;\n if (sourceRows().byKey.has(key)) {\n missing.splice(index, 1);\n progress = true;\n continue;\n }\n if (entry.position.parent !== undefined && !sourceRows().byKey.has(entry.position.parent))\n continue;\n const at = {\n ...entry.position,\n before:\n entry.position.before !== undefined && sourceRows().byKey.has(entry.position.before)\n ? entry.position.before\n : undefined,\n };\n const result = insertRows([entry.previous!], at);\n problems.push(...result.issues);\n missing.splice(index, 1);\n progress = true;\n }\n if (!progress) break;\n }\n for (const [key] of missing)\n problems.push(\n rowProblem(\"The saved parent is missing; restore it before this child.\", key),\n );\n const edits = entries.flatMap(([key, entry]) =>\n entry.previous !== undefined && sourceRows().byKey.has(key)\n ? [...entry.cells.values()].map((change) => ({\n rowKey: key,\n column: change.column,\n value: change.previous,\n }))\n : [],\n );\n const result = applyChanges(edits, false);\n cells.push(...result.changes);\n problems.push(...result.issues);\n for (const [key] of entries)\n if (!problems.some((problem) => problem.rowKey === key)) pendingChanges.entries.delete(key);\n validation.cancel([...selected]);\n } finally {\n transaction = false;\n }\n const after = scene();\n if (before.data !== after.data || cells.length)\n undoStack.record({ kind: \"rows\", before, after, keys: [...selected] });\n const next = sourceRows();\n const rowChanges = [...selected].flatMap((key): RowChange<TRow>[] => {\n const old = previous.byKey.get(key);\n const row = next.byKey.get(key);\n return !old && row\n ? [{ kind: \"inserted\", rowKey: key, row: row.original, position: positionOf(key) }]\n : old && !row\n ? [{ kind: \"removed\", rowKey: key, row: old.original, position: positions.get(key)! }]\n : [];\n });\n if (before.data !== after.data) options.onDataChange?.(data, cells);\n if (problems.length) options.onEditIssues?.(problems);\n notify();\n return resultForRows(rowChanges, problems, cells);\n }\n\n function rangeEdits(origin: CellPosition, matrix: readonly (readonly string[])[]): CellEdit[] {\n const { rows, columns } = getSnapshot();\n const edits: CellEdit[] = [];\n matrix.forEach((line, rowOffset) => {\n const row = rows[origin.row + rowOffset];\n if (!row) {\n return;\n }\n line.forEach((input, columnOffset) => {\n const column = columns[origin.column + columnOffset];\n if (column) {\n edits.push({ rowKey: row.key, column: column.id, input });\n }\n });\n });\n return edits;\n }\n\n function replay(changes: readonly CellChange<TRow>[], direction: \"undo\" | \"redo\"): void {\n applyChanges(\n (direction === \"undo\" ? changes.toReversed() : changes).map((change) => ({\n rowKey: change.rowKey,\n column: change.column,\n value: direction === \"undo\" ? change.previous : change.value,\n })),\n false,\n );\n }\n\n function ingestionResult(\n appended: number,\n replaced: number,\n removed: number,\n problems: readonly TableIssue[],\n ): DataIngestionResult {\n return Object.freeze({\n status:\n appended + replaced + removed\n ? problems.length\n ? \"partial\"\n : \"applied\"\n : problems.length\n ? \"rejected\"\n : \"unchanged\",\n appended,\n replaced,\n removed,\n issues: Object.freeze([...problems]),\n });\n }\n const stableSource = new WeakMap<readonly TRow[], boolean>();\n function ingestionKeys(rows: readonly TRow[]): boolean {\n let valid = stableSource.get(rows);\n if (valid === undefined) {\n valid = stableRows(rows);\n stableSource.set(rows, valid);\n }\n return valid;\n }\n function isProtectedSource(key: RowKey): boolean {\n return pendingChanges.entries.has(key) || validation.hasPending(key);\n }\n function affectedBranch(model: TreeModel<TRow> | undefined, key: RowKey): RowKey[] {\n const result = [key];\n const node = model?.byKey.get(key);\n if (!node) return result;\n let parent = node.parent;\n while (parent) {\n result.push(parent.row.key);\n parent = parent.parent;\n }\n const stack = [...node.children];\n while (stack.length) {\n const child = stack.pop()!;\n result.push(child.row.key);\n for (const descendant of child.children) stack.push(descendant);\n }\n return result;\n }\n function transformScene(\n source: RowScene<TRow>,\n updates: ReadonlyMap<RowKey, TRow>,\n removed: ReadonlySet<RowKey>,\n ): RowScene<TRow> {\n const seen = new Set<RowKey>();\n const replace = (rows: readonly TRow[]): readonly TRow[] =>\n rows.flatMap((row, index) => {\n const key = readKey(row, index);\n seen.add(key);\n return removed.has(key) ? [] : [updates.get(key) ?? row];\n });\n const cache = new Map<RowKey, readonly TRow[]>();\n for (const [key, children] of source.lazy) {\n if (!removed.has(key)) cache.set(key, replace(children));\n }\n let next: readonly TRow[];\n if (!options.getChildren) next = replace(source.data);\n else {\n const model = buildTree(\n source.data,\n resolveColumns(definitions).byId,\n readKey,\n options,\n source.lazy,\n );\n const replacements = new Map<TreeNode<TRow>, TRow>();\n for (const node of model.nodes.toReversed()) {\n const key = node.row.key;\n seen.add(key);\n if (removed.has(key)) continue;\n let row = updates.get(key) ?? node.row.original;\n const supplied = updates.has(key) ? options.getChildren(row) : undefined;\n if (supplied !== undefined) cache.delete(key);\n const children =\n supplied ??\n node.children\n .filter((child) => !removed.has(child.row.key))\n .map((child) => replacements.get(child) ?? child.row.original);\n const old = options.getChildren(row) ?? node.children.map((child) => child.row.original);\n if (\n supplied === undefined &&\n ((updates.has(key) && node.children.length > 0 && !cache.has(key)) ||\n children.length !== old.length ||\n children.some((child, index) => child !== old[index]))\n ) {\n if (!options.setChildren)\n throw new Error(\"Updating nested source children requires setChildren.\");\n row = options.setChildren(row, children);\n if (cache.has(key)) cache.set(key, children);\n }\n replacements.set(node, row);\n }\n const roots = new Map(\n model.roots.filter((node) => node.writable).map((node) => [node.sourceIndex, node]),\n );\n next = source.data.flatMap((row, index) => {\n const node = roots.get(index);\n return node && removed.has(node.row.key)\n ? []\n : [node ? (replacements.get(node) ?? row) : row];\n });\n }\n const additions = [...updates]\n .filter(([key]) => !seen.has(key) && !removed.has(key))\n .map(([, row]) => row);\n return { data: appendList(next, additions), lazy: cache };\n }\n function rebaseBatches(\n transform: (source: RowScene<TRow>) => RowScene<TRow>,\n removed: ReadonlySet<RowKey>,\n ): void {\n undoStack.transform((entry) => {\n if (entry.kind === \"cells\") {\n if (!removed.size) return entry;\n const changes = entry.changes.filter((change) => !removed.has(change.rowKey));\n return changes.length ? { ...entry, changes } : undefined;\n }\n const keys = entry.keys.filter((key) => !removed.has(key));\n return keys.length\n ? { ...entry, keys, before: transform(entry.before), after: transform(entry.after) }\n : undefined;\n });\n }\n function newTreeIssues(\n previous: readonly TableIssue[],\n next: readonly TableIssue[],\n ): TableIssue[] {\n const counts = new Map<string, number>();\n for (const problem of previous) {\n const key = JSON.stringify([problem.code, problem.rowKey]);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return next.filter((problem) => {\n const key = JSON.stringify([problem.code, problem.rowKey]);\n const remaining = counts.get(key) ?? 0;\n if (!remaining) return true;\n counts.set(key, remaining - 1);\n return false;\n });\n }\n function ingestData(incoming: readonly TRow[], mode: \"append\" | \"upsert\"): DataIngestionResult {\n const problems: TableIssue[] = [];\n const reject = (problem: TableIssue): DataIngestionResult => {\n ingestionIssues = [problem];\n notify();\n return ingestionResult(0, 0, 0, ingestionIssues);\n };\n if (destroyed)\n return reject(issue(\"invalid_ingestion\", \"A disposed table cannot receive source data.\"));\n if (!incoming.length) return ingestionResult(0, 0, 0, []);\n try {\n if (!ingestionKeys(data) || !stableRows(incoming))\n return reject(\n issue(\n \"invalid_ingestion\",\n \"Source ingestion requires stable rowKey values or ids on every row.\",\n ),\n );\n } catch (error) {\n return reject(\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n );\n }\n const previous = sourceRows();\n const { byId, columns } = resolveColumns(definitions);\n const model = treeEnabled ? treeStage(data, byId, lazyVersion) : undefined;\n const seenBatch = new Set<RowKey>();\n const updates = new Map<RowKey, TRow>();\n for (const row of incoming) {\n try {\n const key = readKey(row, previous.rows.length + updates.size);\n if (typeof key !== \"string\" && (typeof key !== \"number\" || !Number.isFinite(key))) {\n problems.push(\n issue(\"invalid_ingestion\", \"An incoming row key must be a string or finite number.\"),\n );\n continue;\n }\n const existing = previous.byKey.get(key);\n if (seenBatch.has(key) || (mode === \"append\" && existing)) {\n problems.push(\n issue(\n \"duplicate_row_key\",\n \"An incoming source row repeats an existing key and is refused.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n seenBatch.add(key);\n const parent = options.getParentKey?.(row);\n const affected = affectedBranch(model, key);\n if (parent !== undefined && parent !== null)\n affected.push(...affectedBranch(model, parent));\n if (affected.some(isProtectedSource)) {\n problems.push(\n issue(\n \"ingestion_conflict\",\n \"Incoming source data would overwrite a local change or pending validation; retry after save or revert.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n const node = model?.byKey.get(key);\n if (\n node &&\n (!node.writable ||\n (node.lazy &&\n options.getParentKey &&\n options.getParentKey(row) !== node.parent?.row.key))\n ) {\n problems.push(\n issue(\n \"invalid_ingestion\",\n \"This recovered or lazy tree row has no writable source position.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n if (existing?.original !== row) updates.set(key, row);\n } catch (error) {\n problems.push(\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n );\n }\n }\n if (!updates.size) {\n ingestionIssues = problems;\n notify();\n return ingestionResult(0, 0, 0, problems);\n }\n const replaced = [...updates.keys()].filter((key) => previous.byKey.has(key)).length;\n const appended = updates.size - replaced;\n const previousState = state;\n try {\n if (!model && !replaced) {\n const added = Object.freeze([...updates.values()]);\n const indexed = added.map((row, offset) =>\n createRow(\n row,\n readKey(row, previous.rows.length + offset),\n previous.rows.length + offset,\n byId,\n options.getRowCanExpand?.(row) ?? false,\n ),\n );\n const filtered = manual\n ? previous.rows\n : filterStage(previous.rows, columns, state.search, state.filters);\n const addedFiltered = manual\n ? indexed\n : filterRows(indexed, columns, state.search, state.filters);\n const allRows = appendList(previous.rows, indexed);\n const allFiltered = appendList(filtered, addedFiltered);\n const keys = membership(filtered);\n for (const row of addedFiltered) keys.add(row.key);\n rowMembership.set(allFiltered, keys);\n const sorted =\n manual ||\n !state.sorting.some((rule) => columns.some((column) => column.id === rule.column))\n ? allFiltered\n : mergeRows(\n sortStage(filtered, columns, state.sorting),\n addedFiltered,\n columns,\n state.sorting,\n );\n const next = appendList(data, added);\n rebaseBatches((source) => ({ ...source, data: appendList(source.data, added) }), new Set());\n for (const row of indexed) previous.byKey.set(row.key, row);\n primedIndex = {\n data: next,\n columns: byId,\n result: { rows: allRows, byKey: previous.byKey, issues: previous.issues },\n };\n primedFilter = {\n rows: allRows,\n columns,\n search: state.search,\n filters: state.filters,\n result: allFiltered,\n };\n primedSort = { rows: allFiltered, columns, sorting: state.sorting, result: sorted };\n stableSource.set(next, true);\n data = next;\n } else {\n const next = transformScene(scene(), updates, new Set());\n const candidate = treeEnabled\n ? buildTree(next.data, byId, readKey, options, next.lazy)\n : indexRows(next.data, byId);\n const fresh = newTreeIssues(previous.issues, candidate.issues);\n if (fresh.length || !stableRows(candidate.rows.map((row) => row.original))) {\n problems.push(\n ...fresh,\n ...(!stableRows(candidate.rows.map((row) => row.original))\n ? [issue(\"invalid_ingestion\", \"Every incoming descendant needs a stable key.\")]\n : []),\n );\n ingestionIssues = problems;\n notify();\n return ingestionResult(0, 0, 0, problems);\n }\n const nextKeys = new Set(candidate.rows.map((row) => row.key));\n const removedKeys = new Set(\n previous.rows.filter((row) => !nextKeys.has(row.key)).map((row) => row.key),\n );\n rebaseBatches((source) => transformScene(source, updates, removedKeys), removedKeys);\n data = next.data;\n lazyChildren.clear();\n for (const [key, rows] of next.lazy) lazyChildren.set(key, rows);\n lazyVersion++;\n for (const key of [...updates.keys(), ...removedKeys]) {\n pendingLoads.get(key)?.abort();\n pendingLoads.delete(key);\n childStatuses.delete(key);\n loadIssues.delete(key);\n loadValidationIssues.delete(key);\n }\n validation.cancel([...removedKeys]);\n const selection = state.selection.filter((key) => !removedKeys.has(key));\n state = mergeState(state, {\n selection: selection.length === state.selection.length ? state.selection : selection,\n expanded:\n state.expanded === true ? true : state.expanded.filter((key) => !removedKeys.has(key)),\n });\n }\n validation.cancel([...updates.keys()]);\n ingestionIssues = problems;\n } catch (error) {\n return reject(\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n );\n }\n if (state !== previousState) options.onStateChange?.(state, previousState);\n options.onDataChange?.(data, []);\n notify();\n startVisibleLoads();\n return ingestionResult(appended, replaced, 0, problems);\n }\n function removeData(keys: readonly RowKey[]): DataIngestionResult {\n const previousState = state;\n const problems: TableIssue[] = [];\n const removed = new Set<RowKey>();\n const previous = sourceRows();\n const model = treeEnabled\n ? treeStage(data, resolveColumns(definitions).byId, lazyVersion)\n : undefined;\n if (destroyed || !ingestionKeys(data))\n problems.push(\n issue(\"invalid_ingestion\", \"Source removal requires a live table and stable row keys.\"),\n );\n else\n for (const key of new Set(keys)) {\n if (!previous.byKey.has(key)) {\n problems.push(\n issue(\"unknown_row\", \"The source row to remove does not exist.\", { rowKey: key }),\n );\n continue;\n }\n if (affectedBranch(model, key).some(isProtectedSource)) {\n problems.push(\n issue(\n \"ingestion_conflict\",\n \"Source removal would discard local changes or pending validation.\",\n { rowKey: key },\n ),\n );\n continue;\n }\n const node = model?.byKey.get(key);\n if (node && !node.writable) {\n problems.push(\n issue(\"invalid_ingestion\", \"A recovered tree row has no writable source position.\", {\n rowKey: key,\n }),\n );\n continue;\n }\n removed.add(key);\n const stack = node ? [...node.children] : [];\n while (stack.length) {\n const child = stack.pop()!;\n removed.add(child.row.key);\n for (const descendant of child.children) stack.push(descendant);\n }\n }\n try {\n if (removed.size) {\n const next = transformScene(scene(), new Map(), removed);\n rebaseBatches((source) => transformScene(source, new Map(), removed), removed);\n data = next.data;\n lazyChildren.clear();\n for (const [key, rows] of next.lazy) lazyChildren.set(key, rows);\n lazyVersion++;\n validation.cancel([...removed]);\n for (const key of removed) {\n pendingLoads.get(key)?.abort();\n pendingLoads.delete(key);\n childStatuses.delete(key);\n loadIssues.delete(key);\n loadValidationIssues.delete(key);\n }\n const selection = state.selection.filter((key) => !removed.has(key));\n state = mergeState(state, {\n selection: selection.length === state.selection.length ? state.selection : selection,\n expanded:\n state.expanded === true ? true : state.expanded.filter((key) => !removed.has(key)),\n });\n }\n ingestionIssues = problems;\n } catch (error) {\n ingestionIssues = [\n issue(\"invalid_ingestion\", error instanceof Error ? error.message : String(error)),\n ];\n notify();\n return ingestionResult(0, 0, 0, ingestionIssues);\n }\n if (state !== previousState) options.onStateChange?.(state, previousState);\n if (removed.size) options.onDataChange?.(data, []);\n notify();\n startVisibleLoads();\n return ingestionResult(0, 0, removed.size, problems);\n }\n\n if (expandMode === \"single\") {\n initialState = mergeState(initialState, { expanded: canonicalExpanded(initialState.expanded) });\n state = initialState;\n snapshot = undefined;\n }\n\n const table: DataTable<TRow> = {\n appendData: (rows) => ingestData(rows, \"append\"),\n upsertData: (rows) => ingestData(rows, \"upsert\"),\n removeData,\n stream(source, streamOptions) {\n if (destroyed)\n return Promise.resolve(\n Object.freeze({\n status: \"aborted\",\n receivedRowCount: 0,\n issues: Object.freeze([\n issue(\"invalid_ingestion\", \"A disposed table cannot start a source.\"),\n ]),\n }),\n );\n return streaming.run(source, { expectedRowCount: sourceExpected, ...streamOptions });\n },\n insertRows,\n removeRows,\n revert,\n getPendingChanges: () => pendingChanges.snapshot(),\n markSaved(keys) {\n if (!keys) pendingChanges.entries.clear();\n else for (const key of keys) pendingChanges.entries.delete(key);\n notify();\n },\n getSnapshot,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n setState(patch) {\n const previousIssue = expandedIssue;\n const next = mergePatch(patch);\n if (next !== state || previousIssue !== expandedIssue) {\n state = next;\n snapshot = undefined;\n abortLoads();\n notify();\n startVisibleLoads();\n }\n },\n setData(next) {\n if (next === data) {\n return;\n }\n validation.cancel();\n streaming.cancel();\n loadState = \"idle\";\n streamIssues = [];\n ingestionIssues = [];\n expectedRowCount = sourceExpected;\n pendingChanges.entries.clear();\n abortLoads(true);\n lazyChildren.clear();\n childStatuses.clear();\n loadIssues.clear();\n loadValidationIssues.clear();\n lazyVersion++;\n data = next;\n undoStack.clear();\n notify();\n startVisibleLoads();\n },\n setColumns(next) {\n if (next === definitions) {\n return;\n }\n definitions = next;\n validation.cancel();\n notify();\n },\n setRowCount(next) {\n if (next === rowCount) {\n return;\n }\n rowCount = next;\n notify();\n },\n\n toggleSort(columnId, { multi = false } = {}) {\n const current = state.sorting.find((rule) => rule.column === columnId)?.direction;\n const next = current === undefined ? \"asc\" : current === \"asc\" ? \"desc\" : undefined;\n setSort(columnId, next, multi);\n },\n sort(columnId, direction, { multi = false } = {}) {\n setSort(columnId, direction, multi);\n },\n clearSorting() {\n commit({ sorting: [] });\n },\n search(text) {\n if (text === state.search) {\n return;\n }\n commit({ search: text, pagination: firstPage() });\n },\n filter(columnId, value) {\n const filters: Record<string, unknown> = { ...state.filters };\n const empty =\n value === undefined ||\n value === null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0);\n if (empty ? !(columnId in filters) : Object.is(filters[columnId], value)) {\n return;\n }\n if (empty) {\n delete filters[columnId];\n } else {\n filters[columnId] = value;\n }\n commit({ filters, pagination: firstPage() });\n },\n clearFilters() {\n if (Object.keys(state.filters).length > 0) {\n commit({ filters: {}, pagination: firstPage() });\n }\n },\n\n goToPage(page) {\n if (!paginate) return;\n const { pageCount, page: currentPage } = getSnapshot();\n const next = clampPage(page, pageCount);\n if (next !== currentPage || next !== state.pagination.page) {\n commit({ pagination: { page: next, pageSize: state.pagination.pageSize } });\n }\n },\n nextPage() {\n table.goToPage(getSnapshot().page + 1);\n },\n previousPage() {\n table.goToPage(getSnapshot().page - 1);\n },\n setPageSize(pageSize) {\n if (!paginate) return;\n if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize === state.pagination.pageSize) {\n return;\n }\n const { pageStart } = getSnapshot();\n const page = pageStart === 0 ? 1 : Math.floor((pageStart - 1) / pageSize) + 1;\n commit({ pagination: { page, pageSize } });\n },\n\n select(keys) {\n applySelection([...state.selection, ...selectionKeys(keys)]);\n },\n deselect(keys) {\n const removed = new Set(selectionKeys(keys));\n applySelection(state.selection.filter((key) => !removed.has(key)));\n },\n toggleRow(key, selected) {\n const isSelected = treeEnabled\n ? getSnapshot().getRow(key)?.selection === \"all\"\n : state.selection.includes(key);\n const next = selected ?? !isSelected;\n if (next === isSelected) {\n return;\n }\n if (next) {\n table.select([key]);\n } else {\n table.deselect([key]);\n }\n },\n toggleAll(scope = selectScope) {\n if (selectionMode !== \"multiple\") {\n return;\n }\n const current = getSnapshot();\n const rows = scope === \"page\" || manual ? current.rows : current.processedRows;\n const keys = rows.map((row) => row.key);\n const allSelected = keys.length > 0 && keys.every((key) => current.isSelected(key));\n if (allSelected) {\n table.deselect(keys);\n } else {\n table.select(keys);\n }\n },\n clearSelection() {\n applySelection([]);\n },\n getSelectedRows() {\n const current = getSnapshot();\n return state.selection.flatMap((key) => {\n const row = current.getRow(key);\n return row ? [row] : [];\n });\n },\n\n toggleExpanded(key, expanded) {\n const row = getSnapshot().getRow(key);\n if (!row?.canExpand) return;\n const open = expanded ?? !row.isExpanded;\n if (open === row.isExpanded) {\n if (open && row.childStatus === \"error\") requestChildren(row);\n return;\n }\n if (expandMode === \"single\") {\n commit({ expanded: open ? [key] : [] });\n } else if (state.expanded === true) {\n const { byId } = resolveColumns(definitions);\n commit({\n expanded: (treeEnabled\n ? treeStage(data, byId, lazyVersion).rows.map((candidate) =>\n getSnapshot().getRow(candidate.key)!,\n )\n : indexRows(data, byId).rows\n )\n .filter((candidate) => candidate.canExpand && candidate.key !== key)\n .map((candidate) => candidate.key),\n });\n } else {\n commit({\n expanded: open\n ? [...state.expanded, key]\n : state.expanded.filter((candidate) => candidate !== key),\n });\n }\n if (open) requestChildren(getSnapshot().getRow(key)!);\n },\n expandAll() {\n commit({ expanded: true });\n },\n collapseAll() {\n commit({ expanded: [] });\n },\n\n toggleColumn(columnId, visible) {\n if (!getSnapshot().getColumn(columnId)) {\n return;\n }\n const hidden = state.hiddenColumns.includes(columnId);\n const show = visible ?? hidden;\n if (show === !hidden) {\n return;\n }\n commit({\n hiddenColumns: show\n ? state.hiddenColumns.filter((id) => id !== columnId)\n : [...state.hiddenColumns, columnId],\n });\n },\n moveColumn(columnId, toIndex) {\n const order = getSnapshot().allColumns.map((column) => column.id);\n const from = order.indexOf(columnId);\n if (from === -1) {\n return;\n }\n const target = Math.min(Math.max(0, Math.trunc(toIndex)), order.length - 1);\n if (target === from) {\n return;\n }\n order.splice(from, 1);\n order.splice(target, 0, columnId);\n commit({ columnOrder: order });\n },\n\n edit(edits, editOptions) {\n return validation.edit(Array.isArray(edits) ? edits : [edits as CellEdit], [], editOptions);\n },\n undo() {\n const entry = undoStack.undo();\n if (!entry) {\n return false;\n }\n validation.cancel();\n if (entry.kind === \"cells\") replay(entry.changes, \"undo\");\n else restoreScene(entry, \"undo\");\n return true;\n },\n redo() {\n const entry = undoStack.redo();\n if (!entry) {\n return false;\n }\n validation.cancel();\n if (entry.kind === \"cells\") replay(entry.changes, \"redo\");\n else restoreScene(entry, \"redo\");\n return true;\n },\n copy(range, { escapeFormulas = false } = {}) {\n const { rows, columns } = getSnapshot();\n const matrix: string[][] = [];\n rows.forEach((row, rowIndex) => {\n const line: string[] = [];\n columns.forEach((column, columnIndex) => {\n if (rangeContains(range, { row: rowIndex, column: columnIndex })) {\n const display = row.getDisplay(column.id);\n line.push(escapeFormulas ? escapeFormula(display, row.getValue(column.id)) : display);\n }\n });\n if (line.length > 0) {\n matrix.push(line);\n }\n });\n return toDelimited(matrix);\n },\n paste(origin, text) {\n if (\n !Number.isInteger(origin.row) ||\n !Number.isInteger(origin.column) ||\n origin.row < 0 ||\n origin.column < 0\n ) {\n return validation.edit(\n [],\n [\n issue(\n \"invalid_value\",\n \"The paste origin must use non-negative whole row and column indices.\",\n ),\n ],\n );\n }\n const { rows, columns } = getSnapshot();\n const parsed = readDelimited(text, {\n maxRows: Math.max(0, rows.length - origin.row),\n maxColumns: Math.max(0, columns.length - origin.column),\n maxCells: maxPasteCells,\n maxLength: maxPasteLength,\n });\n const issues = parsed.truncated\n ? [\n issue(\n \"paste_truncated\",\n \"The paste exceeds the visible grid or parsing limits; only complete cells within those limits are applied.\",\n ),\n ]\n : [];\n return validation.edit(rangeEdits(origin, parsed.rows), issues);\n },\n clear(range) {\n const matrix = Array.from({ length: range.bottom - range.top + 1 }, () =>\n Array.from({ length: range.right - range.left + 1 }, () => \"\"),\n );\n const current = getSnapshot();\n const edits = rangeEdits({ row: range.top, column: range.left }, matrix).filter((edit) => {\n const row = current.getRow(edit.rowKey);\n return (\n row !== undefined && current.getColumn(edit.column)?.isEditable(row.original) === true\n );\n });\n return validation.edit(edits);\n },\n exportRows({\n format = \"csv\",\n columns: ids,\n pageOnly = false,\n headers = true,\n escapeFormulas = true,\n depth = false,\n indent = \"\",\n } = {}) {\n const current = getSnapshot();\n const columns = ids\n ? ids.flatMap((id) => {\n const column = current.getColumn(id);\n return column ? [column] : [];\n })\n : current.columns;\n const rows = pageOnly ? current.rows : current.processedRows;\n const matrix = rows.map((row) =>\n columns.map((column, index) => {\n const display = (index === 0 ? indent.repeat(row.depth) : \"\") + row.getDisplay(column.id);\n return escapeFormulas ? escapeFormula(display, row.getValue(column.id)) : display;\n }),\n );\n if (depth) matrix.forEach((line, index) => line.unshift(String(rows[index]!.depth)));\n if (headers) {\n matrix.unshift(\n columns.map((column) => (escapeFormulas ? escapeFormula(column.header) : column.header)),\n );\n if (depth) matrix[0]!.unshift(\"Depth\");\n }\n return toDelimited(matrix, format === \"csv\" ? \",\" : \"\\t\");\n },\n\n reset() {\n commit(initialState);\n },\n destroy() {\n destroyed = true;\n streaming.cancel();\n validation.cancel();\n abortLoads(true);\n listeners.clear();\n },\n };\n startVisibleLoads();\n return table;\n}\n"],"mappings":"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"}
|