unstale

npm / @tanstack/table-core

@tanstack/table-core

What changed in @tanstack/table-core 9, from its official release notes, upgrade guides and advisories. Sources checked 2026-11-12.

39 breaking3 deprecations22 new APIs and options2 performance2 behavior and defaults2 tooling7 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.2.12 on npm

@tanstack/table-core 977 changes

Breaking changes 39

  • Without globalFilteringFeature, global facets include no columns, matching the filtered row model.

    9.3.1release notes

  • Bundled skills are split into smaller entry points, with feature and composition references loaded as needed. Consumers with individual skill permissions or explicit agent mappings must replace retired IDs and refresh mappings.

    9.2.6release notes

  • Grouped and downstream worker flatRows now use parent-first preorder.

    9.2.3release notes

  • Register aggregation functions in the tableFeatures registry slot instead of augmenting AggregationFns.

    9.0.0release notes

  • getAggregationFn is replaced by getAggregationFns because a column can run multiple aggregation definitions.

    9.0.0release notes

  • getAggregationValue now accepts a single options object containing rows and maxDepth instead of positional arguments.

    9.0.0release notes

  • ColumnMeta declaration merging now takes TFeatures as its first type parameter.

    9.0.0release notes

  • Column pinning uses logical start/end terminology instead of left/right, with no deprecated aliases; update state values, pin arguments, and related column, row, and table APIs.

    9.0.0release notes

  • Column pinning uses start/end terminology, including columnPinning.start and column.pin('end').

    9.0.0release notes

  • The former columnSizingInfo state and setter are now columnResizing and setColumnResizing, with onColumnResizingChange replacing onColumnSizingInfoChange.

    9.0.0release notes

  • Column sizing and interactive resizing are separate features, so tables can register only sizing or add columnResizingFeature when drag-to-resize is needed.

    9.0.0release notes

  • Custom aggregation callables now use context-based definitions with aggregate and context.rows; maxAggregationDepth controls the selected aggregation depth.

    9.0.0release notes

  • Convert custom aggregation callables to constructAggregationFn({ aggregate, merge? }) definitions.

    9.0.0release notes

  • Creates a filtered row model for registration on tableFeatures instead of configuring a separate table option.

    9.0.0release notes

  • Creates a paginated row model for registration on tableFeatures instead of configuring a separate table option.

    9.0.0release notes

  • Creates a sorted row model for registration on tableFeatures instead of configuring a separate table option.

    9.0.0release notes

  • The enablePinning option is split into separate column- and row-pinning options.

    9.0.0release notes

  • Packages ship as modern ESM; UMD and CJS builds have been dropped.

    9.0.0release notes

  • A required useTable option declares which features, row models, and processing functions the table uses.

    9.0.0release notes

  • Register filter functions in the tableFeatures registry slot instead of augmenting FilterFns; registered keys typecheck as string references.

    9.0.0release notes

  • Use the filterMeta feature slot to type filter metadata without augmenting FilterMeta.

    9.0.0release notes

  • Move get*RowModel() options into tableFeatures slots, such as filteredRowModel: createFilteredRowModel().

    9.0.0release notes

  • Table state is accessed through table.state, table.store, or state-slice atoms instead of the Table V8 getState method.

    9.0.0release notes

  • The table option was removed; subscribe to table.store for notifications of any state change. Individual on[State]Change handlers remain available.

    9.0.0release notes

  • Methods are shared on object prototypes rather than created per instance, so destructuring them loses the this context and they are not own properties.

    9.0.0release notes

  • When rowSelectionFeature is enabled, the handler now supports inclusive Shift range selection by default; set enableRowRangeSelection to false to retain the previous non-range behavior.

    9.0.0release notes

  • Call row methods on the row instance rather than using destructured row methods.

    9.0.0release notes

  • Aggregation is independent from column grouping; explicitly registered features must include rowAggregationFeature when columns use aggregation APIs.

    9.0.0release notes

  • RowData is restricted to Record<string, any> or Array<any>, so unusual data types must conform to one of those shapes.

    9.0.0release notes

  • Sorting APIs were renamed for consistency: column definitions use sortFn, and related methods, types, and built-in functions use SortFn, getSortFn, getAutoSortFn, SortFns, and sortFns.

    9.0.0release notes

  • Column definitions use sortFn in place of sortingFn.

    9.0.0release notes

  • Register sort functions in the tableFeatures registry slot instead of augmenting SortFns.

    9.0.0release notes

  • Internal APIs prefixed with an underscore have been removed, including _getPinnedRows and the listed faceting methods.

    9.0.0release notes

  • This check now returns true whenever at least one row is selected, including when all rows are selected; the page-row counterpart follows the same rule.

    9.0.0release notes

  • Access state through table.store.state or table.state instead of table.getState().

    9.0.0release notes

  • Registers table features, row model factories, and processing function registries, enabling unused code to be tree-shaken.

    9.0.0release notes

  • Separate export for legacy-specific APIs, including useLegacyTable and legacy helpers.

    9.0.0release notes

  • Most types now require TFeatures as a generic parameter, changing the generic shapes for table, column, row, cell, and definition types.

    9.0.0release notes

  • Replaces useReactTable as the React hook for creating a table, consistent with hook naming across TanStack libraries.

    9.0.0release notes

Deprecations 3

  • The full registry export is deprecated in favor of individual aggregationFn_* imports or functions supplied directly in column definitions.

    9.0.0release notes

  • The full registry export is deprecated in favor of individual filterFn_* imports or functions supplied directly in column definitions.

    9.0.0release notes

  • The full registry export is deprecated in favor of individual sortFn_* imports or functions supplied directly in column definitions.

    9.0.0release notes

New APIs and options 22

  • Adds table.autoResetSorting().

    9.2.8release notes

  • Adds getCanLastPage for detecting whether a finite last page can be reached.

    9.1.0release notes

  • Lets callers supply writable atoms for state slices to own that state externally.

    9.0.0release notes

  • Adds spreadsheet-style rectangular cell range selection, including drag, Shift-extend, and multiple disjoint ranges.

    9.0.0release notes

  • Adds body-cell spanning across rows and columns, with span-aware cell selection and header rowSpan computation.

    9.0.0release notes

  • The new columns() helper preserves individual column TValue types across wrapped arrays and nested group columns.

    9.0.0release notes

  • Declare column metadata types per table using the columnMeta feature slot, without global declaration merging.

    9.0.0release notes

  • Creates custom table hooks with pre-bound features and components for reusable app-level table patterns.

    9.0.0release notes

  • Provides all features for useTable as a shortcut for Table V8-like behavior, with a larger bundle.

    9.0.0release notes

  • Exposes per-slice readonly atoms for narrow subscriptions to individual table state slices.

    9.0.0release notes

  • A component-based rendering API is available on the table instance for headers, cells, and footers; the existing flexRender function still works.

    9.0.0release notes

  • Provides the selected table state, which contains all registered state by default or the state shape returned by a custom useTable selector.

    9.0.0release notes

  • Exposes a framework-agnostic store of the entire table state for one-off reads and fine-grained subscriptions.

    9.0.0release notes

  • Enables fine-grained reactive subscriptions so rendered content only updates when selected state changes.

    9.0.0release notes

  • Define table features with tableFeatures(), or use stockFeatures.

    9.0.0release notes

  • Declare metadata types per table using the tableMeta feature slot, without global declaration merging.

    9.0.0release notes

  • Enables composition of reusable table configuration, including features, row models, and default options.

    9.0.0release notes

  • The tableOptions helper provides type-safe composition of reusable partial table configurations, including options that omit required fields.

    9.0.0release notes

  • Components registered via createTableHook can access cell context with useCellContext.

    9.0.0release notes

  • Components registered via createTableHook can access header context with useHeaderContext.

    9.0.0release notes

  • Provides a temporary migration hook that accepts the Table V8-style API; it is deprecated and includes all features by default.

    9.0.0release notes

  • Components registered via createTableHook can access table context with useTableContext.

    9.0.0release notes

Performance 2

  • The core and unregistered features bundle less unrelated code, reducing the size of a minimal table by about 0.27 kB (brotli).

    9.3.1release notes

  • Importing one built-in filter, sort, or aggregation function now bundles only that function; row models also avoid importing code from unregistered features, reducing bundle size.

    9.2.8release notes

Behavior and default changes 2

  • Page size now supports Infinity, allowing an unbounded page size.

    9.1.0release notes

  • The former private row._getAllCellsByColumnId method is now public as row.getAllCellsByColumnId.

    9.0.0release notes

Tooling 2

  • The devtools panel now displays measured minified and brotli sizes for each feature, row model, and built-in function, with shared code accounted for in the total.

    9.2.8release notes

  • Compiled output now targets ES2022.

    9.0.0release notes

Fixes and other changes 7

  • Private declarations are kept out of emitted declaration files, preventing TS2883 failures for consumers emitting declarations.

    9.3.1release notes

  • The table type now declares getOrderColumnsFn(), which column ordering already assigned.

    9.3.1release notes

  • Corrects the type to declare autoResetPageIndex rather than _autoResetPageIndex, matching the method the table actually has.

    9.2.8release notes

  • Missing core rows are skipped when rebuilding a worker row-model payload, preventing stale worker results from crashing the table.

    9.2.4release notes

  • Hierarchical filtered row models now list parents before descendants in both filtering modes, preserve filter metadata on cloned rows, and round-trip nested data through worker-backed row models.

    9.2.3release notes

  • Equality-guarded state slices return the existing reference for semantically unchanged updates, helping controlled-state consumers avoid unnecessary re-renders and auto-reset render loops. Custom onXChange handlers are still invoked, and the state owner evaluates updaters once.

    9.1.2release notes

  • The flattened sorted rows now list parents before sub-rows, matching the sorted rows tree and other row models.

    9.1.1release notes