@tanstack/table-core 9.0.0-alpha.47 → 9.0.0-alpha.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +10 -0
  2. package/dist/core/cells/coreCellsFeature.utils.cjs +11 -8
  3. package/dist/core/cells/coreCellsFeature.utils.cjs.map +1 -1
  4. package/dist/core/cells/coreCellsFeature.utils.d.cts +11 -8
  5. package/dist/core/cells/coreCellsFeature.utils.d.ts +11 -8
  6. package/dist/core/cells/coreCellsFeature.utils.js +11 -8
  7. package/dist/core/cells/coreCellsFeature.utils.js.map +1 -1
  8. package/dist/core/columns/coreColumnsFeature.types.d.cts +7 -6
  9. package/dist/core/columns/coreColumnsFeature.types.d.ts +7 -6
  10. package/dist/core/columns/coreColumnsFeature.utils.cjs +37 -27
  11. package/dist/core/columns/coreColumnsFeature.utils.cjs.map +1 -1
  12. package/dist/core/columns/coreColumnsFeature.utils.d.cts +37 -27
  13. package/dist/core/columns/coreColumnsFeature.utils.d.ts +37 -27
  14. package/dist/core/columns/coreColumnsFeature.utils.js +37 -27
  15. package/dist/core/columns/coreColumnsFeature.utils.js.map +1 -1
  16. package/dist/core/headers/coreHeadersFeature.types.d.cts +6 -4
  17. package/dist/core/headers/coreHeadersFeature.types.d.ts +6 -4
  18. package/dist/core/headers/coreHeadersFeature.utils.cjs +23 -18
  19. package/dist/core/headers/coreHeadersFeature.utils.cjs.map +1 -1
  20. package/dist/core/headers/coreHeadersFeature.utils.d.cts +23 -18
  21. package/dist/core/headers/coreHeadersFeature.utils.d.ts +23 -18
  22. package/dist/core/headers/coreHeadersFeature.utils.js +23 -18
  23. package/dist/core/headers/coreHeadersFeature.utils.js.map +1 -1
  24. package/dist/core/row-models/coreRowModelsFeature.utils.cjs +48 -36
  25. package/dist/core/row-models/coreRowModelsFeature.utils.cjs.map +1 -1
  26. package/dist/core/row-models/coreRowModelsFeature.utils.d.cts +48 -36
  27. package/dist/core/row-models/coreRowModelsFeature.utils.d.ts +48 -36
  28. package/dist/core/row-models/coreRowModelsFeature.utils.js +48 -36
  29. package/dist/core/row-models/coreRowModelsFeature.utils.js.map +1 -1
  30. package/dist/core/rows/coreRowsFeature.types.d.cts +4 -4
  31. package/dist/core/rows/coreRowsFeature.types.d.ts +4 -4
  32. package/dist/core/rows/coreRowsFeature.utils.cjs +34 -28
  33. package/dist/core/rows/coreRowsFeature.utils.cjs.map +1 -1
  34. package/dist/core/rows/coreRowsFeature.utils.d.cts +34 -28
  35. package/dist/core/rows/coreRowsFeature.utils.d.ts +34 -28
  36. package/dist/core/rows/coreRowsFeature.utils.js +34 -28
  37. package/dist/core/rows/coreRowsFeature.utils.js.map +1 -1
  38. package/dist/core/table/coreTablesFeature.types.d.cts +6 -2
  39. package/dist/core/table/coreTablesFeature.types.d.ts +6 -2
  40. package/dist/core/table/coreTablesFeature.utils.cjs +2 -2
  41. package/dist/core/table/coreTablesFeature.utils.cjs.map +1 -1
  42. package/dist/core/table/coreTablesFeature.utils.d.cts +2 -2
  43. package/dist/core/table/coreTablesFeature.utils.d.ts +2 -2
  44. package/dist/core/table/coreTablesFeature.utils.js +2 -2
  45. package/dist/core/table/coreTablesFeature.utils.js.map +1 -1
  46. package/dist/features/column-faceting/columnFacetingFeature.types.d.cts +16 -10
  47. package/dist/features/column-faceting/columnFacetingFeature.types.d.ts +16 -10
  48. package/dist/features/column-faceting/columnFacetingFeature.utils.cjs +26 -18
  49. package/dist/features/column-faceting/columnFacetingFeature.utils.cjs.map +1 -1
  50. package/dist/features/column-faceting/columnFacetingFeature.utils.d.cts +26 -18
  51. package/dist/features/column-faceting/columnFacetingFeature.utils.d.ts +26 -18
  52. package/dist/features/column-faceting/columnFacetingFeature.utils.js +26 -18
  53. package/dist/features/column-faceting/columnFacetingFeature.utils.js.map +1 -1
  54. package/dist/features/column-filtering/columnFilteringFeature.types.d.cts +21 -11
  55. package/dist/features/column-filtering/columnFilteringFeature.types.d.ts +21 -11
  56. package/dist/features/column-filtering/columnFilteringFeature.utils.cjs +39 -28
  57. package/dist/features/column-filtering/columnFilteringFeature.utils.cjs.map +1 -1
  58. package/dist/features/column-filtering/columnFilteringFeature.utils.d.cts +39 -28
  59. package/dist/features/column-filtering/columnFilteringFeature.utils.d.ts +39 -28
  60. package/dist/features/column-filtering/columnFilteringFeature.utils.js +39 -28
  61. package/dist/features/column-filtering/columnFilteringFeature.utils.js.map +1 -1
  62. package/dist/features/column-grouping/columnGroupingFeature.types.d.cts +18 -14
  63. package/dist/features/column-grouping/columnGroupingFeature.types.d.ts +18 -14
  64. package/dist/features/column-grouping/columnGroupingFeature.utils.cjs +55 -43
  65. package/dist/features/column-grouping/columnGroupingFeature.utils.cjs.map +1 -1
  66. package/dist/features/column-grouping/columnGroupingFeature.utils.d.cts +55 -43
  67. package/dist/features/column-grouping/columnGroupingFeature.utils.d.ts +55 -43
  68. package/dist/features/column-grouping/columnGroupingFeature.utils.js +55 -43
  69. package/dist/features/column-grouping/columnGroupingFeature.utils.js.map +1 -1
  70. package/dist/features/column-ordering/columnOrderingFeature.types.d.cts +14 -5
  71. package/dist/features/column-ordering/columnOrderingFeature.types.d.ts +14 -5
  72. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs +30 -23
  73. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs.map +1 -1
  74. package/dist/features/column-ordering/columnOrderingFeature.utils.d.cts +30 -23
  75. package/dist/features/column-ordering/columnOrderingFeature.utils.d.ts +30 -23
  76. package/dist/features/column-ordering/columnOrderingFeature.utils.js +30 -23
  77. package/dist/features/column-ordering/columnOrderingFeature.utils.js.map +1 -1
  78. package/dist/features/column-pinning/columnPinningFeature.types.d.cts +43 -31
  79. package/dist/features/column-pinning/columnPinningFeature.types.d.ts +43 -31
  80. package/dist/features/column-pinning/columnPinningFeature.utils.cjs +111 -91
  81. package/dist/features/column-pinning/columnPinningFeature.utils.cjs.map +1 -1
  82. package/dist/features/column-pinning/columnPinningFeature.utils.d.cts +111 -91
  83. package/dist/features/column-pinning/columnPinningFeature.utils.d.ts +111 -91
  84. package/dist/features/column-pinning/columnPinningFeature.utils.js +111 -91
  85. package/dist/features/column-pinning/columnPinningFeature.utils.js.map +1 -1
  86. package/dist/features/column-resizing/columnResizingFeature.types.d.cts +9 -9
  87. package/dist/features/column-resizing/columnResizingFeature.types.d.ts +9 -9
  88. package/dist/features/column-resizing/columnResizingFeature.utils.cjs +29 -20
  89. package/dist/features/column-resizing/columnResizingFeature.utils.cjs.map +1 -1
  90. package/dist/features/column-resizing/columnResizingFeature.utils.d.cts +28 -19
  91. package/dist/features/column-resizing/columnResizingFeature.utils.d.ts +28 -19
  92. package/dist/features/column-resizing/columnResizingFeature.utils.js +29 -20
  93. package/dist/features/column-resizing/columnResizingFeature.utils.js.map +1 -1
  94. package/dist/features/column-sizing/columnSizingFeature.types.d.cts +19 -12
  95. package/dist/features/column-sizing/columnSizingFeature.types.d.ts +19 -12
  96. package/dist/features/column-sizing/columnSizingFeature.utils.cjs +52 -41
  97. package/dist/features/column-sizing/columnSizingFeature.utils.cjs.map +1 -1
  98. package/dist/features/column-sizing/columnSizingFeature.utils.d.cts +52 -41
  99. package/dist/features/column-sizing/columnSizingFeature.utils.d.ts +52 -41
  100. package/dist/features/column-sizing/columnSizingFeature.utils.js +52 -41
  101. package/dist/features/column-sizing/columnSizingFeature.utils.js.map +1 -1
  102. package/dist/features/column-visibility/columnVisibilityFeature.types.d.cts +16 -13
  103. package/dist/features/column-visibility/columnVisibilityFeature.types.d.ts +16 -13
  104. package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs +54 -42
  105. package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs.map +1 -1
  106. package/dist/features/column-visibility/columnVisibilityFeature.utils.d.cts +54 -42
  107. package/dist/features/column-visibility/columnVisibilityFeature.utils.d.ts +54 -42
  108. package/dist/features/column-visibility/columnVisibilityFeature.utils.js +54 -42
  109. package/dist/features/column-visibility/columnVisibilityFeature.utils.js.map +1 -1
  110. package/dist/features/global-filtering/globalFilteringFeature.types.d.cts +10 -5
  111. package/dist/features/global-filtering/globalFilteringFeature.types.d.ts +10 -5
  112. package/dist/features/global-filtering/globalFilteringFeature.utils.cjs +20 -14
  113. package/dist/features/global-filtering/globalFilteringFeature.utils.cjs.map +1 -1
  114. package/dist/features/global-filtering/globalFilteringFeature.utils.d.cts +20 -14
  115. package/dist/features/global-filtering/globalFilteringFeature.utils.d.ts +20 -14
  116. package/dist/features/global-filtering/globalFilteringFeature.utils.js +20 -14
  117. package/dist/features/global-filtering/globalFilteringFeature.utils.js.map +1 -1
  118. package/dist/features/row-expanding/rowExpandingFeature.types.d.cts +16 -15
  119. package/dist/features/row-expanding/rowExpandingFeature.types.d.ts +16 -15
  120. package/dist/features/row-expanding/rowExpandingFeature.utils.cjs +56 -41
  121. package/dist/features/row-expanding/rowExpandingFeature.utils.cjs.map +1 -1
  122. package/dist/features/row-expanding/rowExpandingFeature.utils.d.cts +56 -41
  123. package/dist/features/row-expanding/rowExpandingFeature.utils.d.ts +56 -41
  124. package/dist/features/row-expanding/rowExpandingFeature.utils.js +56 -41
  125. package/dist/features/row-expanding/rowExpandingFeature.utils.js.map +1 -1
  126. package/dist/features/row-pagination/rowPaginationFeature.types.d.cts +19 -12
  127. package/dist/features/row-pagination/rowPaginationFeature.types.d.ts +19 -12
  128. package/dist/features/row-pagination/rowPaginationFeature.utils.cjs +49 -32
  129. package/dist/features/row-pagination/rowPaginationFeature.utils.cjs.map +1 -1
  130. package/dist/features/row-pagination/rowPaginationFeature.utils.d.cts +49 -32
  131. package/dist/features/row-pagination/rowPaginationFeature.utils.d.ts +49 -32
  132. package/dist/features/row-pagination/rowPaginationFeature.utils.js +49 -32
  133. package/dist/features/row-pagination/rowPaginationFeature.utils.js.map +1 -1
  134. package/dist/features/row-pinning/rowPinningFeature.types.d.cts +12 -8
  135. package/dist/features/row-pinning/rowPinningFeature.types.d.ts +12 -8
  136. package/dist/features/row-pinning/rowPinningFeature.utils.cjs +39 -29
  137. package/dist/features/row-pinning/rowPinningFeature.utils.cjs.map +1 -1
  138. package/dist/features/row-pinning/rowPinningFeature.utils.d.cts +39 -29
  139. package/dist/features/row-pinning/rowPinningFeature.utils.d.ts +39 -29
  140. package/dist/features/row-pinning/rowPinningFeature.utils.js +39 -29
  141. package/dist/features/row-pinning/rowPinningFeature.utils.js.map +1 -1
  142. package/dist/features/row-selection/rowSelectionFeature.types.d.cts +30 -24
  143. package/dist/features/row-selection/rowSelectionFeature.types.d.ts +30 -24
  144. package/dist/features/row-selection/rowSelectionFeature.utils.cjs +89 -69
  145. package/dist/features/row-selection/rowSelectionFeature.utils.cjs.map +1 -1
  146. package/dist/features/row-selection/rowSelectionFeature.utils.d.cts +89 -69
  147. package/dist/features/row-selection/rowSelectionFeature.utils.d.ts +89 -69
  148. package/dist/features/row-selection/rowSelectionFeature.utils.js +89 -69
  149. package/dist/features/row-selection/rowSelectionFeature.utils.js.map +1 -1
  150. package/dist/features/row-sorting/rowSortingFeature.types.d.cts +10 -8
  151. package/dist/features/row-sorting/rowSortingFeature.types.d.ts +10 -8
  152. package/dist/features/row-sorting/rowSortingFeature.utils.cjs +62 -45
  153. package/dist/features/row-sorting/rowSortingFeature.utils.cjs.map +1 -1
  154. package/dist/features/row-sorting/rowSortingFeature.utils.d.cts +61 -44
  155. package/dist/features/row-sorting/rowSortingFeature.utils.d.ts +61 -44
  156. package/dist/features/row-sorting/rowSortingFeature.utils.js +62 -45
  157. package/dist/features/row-sorting/rowSortingFeature.utils.js.map +1 -1
  158. package/dist/fns/aggregationFns.cjs +33 -9
  159. package/dist/fns/aggregationFns.cjs.map +1 -1
  160. package/dist/fns/aggregationFns.d.cts +33 -9
  161. package/dist/fns/aggregationFns.d.ts +33 -9
  162. package/dist/fns/aggregationFns.js +33 -9
  163. package/dist/fns/aggregationFns.js.map +1 -1
  164. package/dist/fns/filterFns.cjs +48 -17
  165. package/dist/fns/filterFns.cjs.map +1 -1
  166. package/dist/fns/filterFns.d.cts +42 -15
  167. package/dist/fns/filterFns.d.ts +42 -15
  168. package/dist/fns/filterFns.js +48 -17
  169. package/dist/fns/filterFns.js.map +1 -1
  170. package/dist/helpers/columnHelper.cjs +9 -4
  171. package/dist/helpers/columnHelper.cjs.map +1 -1
  172. package/dist/helpers/columnHelper.d.cts +9 -4
  173. package/dist/helpers/columnHelper.d.ts +9 -4
  174. package/dist/helpers/columnHelper.js +9 -4
  175. package/dist/helpers/columnHelper.js.map +1 -1
  176. package/dist/helpers/tableOptions.cjs.map +1 -1
  177. package/dist/helpers/tableOptions.d.cts +12 -9
  178. package/dist/helpers/tableOptions.d.ts +12 -9
  179. package/dist/helpers/tableOptions.js.map +1 -1
  180. package/dist/types/ColumnDef.d.cts +38 -0
  181. package/dist/types/ColumnDef.d.ts +38 -0
  182. package/dist/types/TableOptions.d.cts +15 -0
  183. package/dist/types/TableOptions.d.ts +15 -0
  184. package/dist/types/TableState.d.cts +12 -0
  185. package/dist/types/TableState.d.ts +12 -0
  186. package/package.json +5 -3
  187. package/skills/column-definitions/SKILL.md +333 -0
  188. package/skills/column-layout/SKILL.md +328 -0
  189. package/skills/column-layout/references/subsystems.md +220 -0
  190. package/skills/customizing-feature-behavior/SKILL.md +416 -0
  191. package/skills/filtering/SKILL.md +357 -0
  192. package/skills/filtering/references/faceting-and-fuzzy.md +191 -0
  193. package/skills/grouping/SKILL.md +448 -0
  194. package/skills/migrate-v8-to-v9/SKILL.md +495 -0
  195. package/skills/pagination/SKILL.md +385 -0
  196. package/skills/row-expanding/SKILL.md +348 -0
  197. package/skills/row-pinning/SKILL.md +269 -0
  198. package/skills/row-selection/SKILL.md +391 -0
  199. package/skills/setup/SKILL.md +400 -0
  200. package/skills/sorting/SKILL.md +344 -0
  201. package/skills/state-management/SKILL.md +388 -0
  202. package/src/core/cells/coreCellsFeature.utils.ts +11 -8
  203. package/src/core/columns/coreColumnsFeature.types.ts +7 -6
  204. package/src/core/columns/coreColumnsFeature.utils.ts +37 -27
  205. package/src/core/headers/coreHeadersFeature.types.ts +6 -4
  206. package/src/core/headers/coreHeadersFeature.utils.ts +23 -18
  207. package/src/core/row-models/coreRowModelsFeature.utils.ts +48 -36
  208. package/src/core/rows/coreRowsFeature.types.ts +4 -4
  209. package/src/core/rows/coreRowsFeature.utils.ts +34 -28
  210. package/src/core/table/coreTablesFeature.types.ts +6 -2
  211. package/src/core/table/coreTablesFeature.utils.ts +2 -2
  212. package/src/features/column-faceting/columnFacetingFeature.types.ts +16 -10
  213. package/src/features/column-faceting/columnFacetingFeature.utils.ts +26 -18
  214. package/src/features/column-filtering/columnFilteringFeature.types.ts +21 -11
  215. package/src/features/column-filtering/columnFilteringFeature.utils.ts +39 -28
  216. package/src/features/column-grouping/columnGroupingFeature.types.ts +18 -14
  217. package/src/features/column-grouping/columnGroupingFeature.utils.ts +55 -43
  218. package/src/features/column-ordering/columnOrderingFeature.types.ts +14 -5
  219. package/src/features/column-ordering/columnOrderingFeature.utils.ts +30 -23
  220. package/src/features/column-pinning/columnPinningFeature.types.ts +43 -31
  221. package/src/features/column-pinning/columnPinningFeature.utils.ts +111 -91
  222. package/src/features/column-resizing/columnResizingFeature.types.ts +9 -9
  223. package/src/features/column-resizing/columnResizingFeature.utils.ts +29 -21
  224. package/src/features/column-sizing/columnSizingFeature.types.ts +19 -12
  225. package/src/features/column-sizing/columnSizingFeature.utils.ts +52 -41
  226. package/src/features/column-visibility/columnVisibilityFeature.types.ts +16 -13
  227. package/src/features/column-visibility/columnVisibilityFeature.utils.ts +54 -42
  228. package/src/features/global-filtering/globalFilteringFeature.types.ts +10 -5
  229. package/src/features/global-filtering/globalFilteringFeature.utils.ts +20 -14
  230. package/src/features/row-expanding/rowExpandingFeature.types.ts +16 -15
  231. package/src/features/row-expanding/rowExpandingFeature.utils.ts +56 -41
  232. package/src/features/row-pagination/rowPaginationFeature.types.ts +19 -12
  233. package/src/features/row-pagination/rowPaginationFeature.utils.ts +49 -32
  234. package/src/features/row-pinning/rowPinningFeature.types.ts +12 -8
  235. package/src/features/row-pinning/rowPinningFeature.utils.ts +39 -29
  236. package/src/features/row-selection/rowSelectionFeature.types.ts +30 -24
  237. package/src/features/row-selection/rowSelectionFeature.utils.ts +89 -69
  238. package/src/features/row-sorting/rowSortingFeature.types.ts +10 -8
  239. package/src/features/row-sorting/rowSortingFeature.utils.ts +62 -45
  240. package/src/fns/aggregationFns.ts +33 -9
  241. package/src/fns/filterFns.ts +48 -17
  242. package/src/helpers/columnHelper.ts +9 -4
  243. package/src/helpers/tableOptions.ts +12 -9
  244. package/src/types/ColumnDef.ts +38 -0
  245. package/src/types/TableOptions.ts +15 -0
  246. package/src/types/TableState.ts +12 -0
@@ -0,0 +1,400 @@
1
+ ---
2
+ name: setup
3
+ description: >
4
+ Install a TanStack Table v9 framework adapter and wire up a first table with
5
+ `tableFeatures({...})` declaring `_features`, an `_rowModels` map of factory
6
+ results (`createSortedRowModel(sortFns)`, `createFilteredRowModel(filterFns)`,
7
+ `createPaginatedRowModel()`, …), a `createColumnHelper<typeof _features, TData>()`
8
+ column set, and the framework `useTable` / `injectTable` / `createTable` /
9
+ `constructTable` entry point. Covers the registry model, why `_features` must
10
+ be module-scoped, when to reach for `stockFeatures`, and `coreFeatures`.
11
+ type: core
12
+ library: tanstack-table
13
+ library_version: '9.0.0-alpha.48'
14
+ requires:
15
+ - state-management
16
+ - column-definitions
17
+ sources:
18
+ - TanStack/table:docs/installation.md
19
+ - TanStack/table:docs/overview.md
20
+ - TanStack/table:docs/guide/tables.md
21
+ - TanStack/table:docs/guide/features.md
22
+ - TanStack/table:packages/table-core/src/index.ts
23
+ - TanStack/table:examples/react/basic-use-table/src/main.tsx
24
+ ---
25
+
26
+ This skill builds on `tanstack-table/state-management` and `tanstack-table/column-definitions`. Read those first for the v9 atom model and the `createColumnHelper<typeof _features, TData>()` shape.
27
+
28
+ ## Setup
29
+
30
+ TanStack Table v9 separates a framework-agnostic core (`@tanstack/table-core`) from per-framework adapters. Every table — vanilla or framework — must declare two new v9-required options at construction time: `_features` (the registry of feature plugins) and `_rowModels` (the map of pipeline factories).
31
+
32
+ ```ts
33
+ // Framework-agnostic, using @tanstack/table-core directly.
34
+ import {
35
+ constructTable,
36
+ tableFeatures,
37
+ createColumnHelper,
38
+ rowSortingFeature,
39
+ createSortedRowModel,
40
+ sortFns,
41
+ } from '@tanstack/table-core'
42
+
43
+ type Person = { firstName: string; lastName: string; age: number }
44
+
45
+ // 1. Declare features at MODULE scope (stable reference). This is required —
46
+ // a fresh `_features` object on every call destroys feature registration.
47
+ const _features = tableFeatures({ rowSortingFeature })
48
+
49
+ // 2. Build a column helper bound to BOTH TFeatures and TData.
50
+ const columnHelper = createColumnHelper<typeof _features, Person>()
51
+
52
+ const columns = columnHelper.columns([
53
+ columnHelper.accessor('firstName', { header: 'First' }),
54
+ columnHelper.accessor('lastName', { header: 'Last' }),
55
+ columnHelper.accessor('age', { header: 'Age', sortFn: 'alphanumeric' }),
56
+ ])
57
+
58
+ const data: Person[] = [
59
+ { firstName: 'Ada', lastName: 'Lovelace', age: 36 },
60
+ { firstName: 'Grace', lastName: 'Hopper', age: 85 },
61
+ ]
62
+
63
+ const table = constructTable({
64
+ _features,
65
+ _rowModels: {
66
+ // Pair every feature with its matching row-model factory.
67
+ sortedRowModel: createSortedRowModel(sortFns),
68
+ },
69
+ columns,
70
+ data,
71
+ })
72
+
73
+ // Read header groups and row model to render.
74
+ table.getHeaderGroups()
75
+ table.getRowModel().rows
76
+ ```
77
+
78
+ Framework adapters wrap this with reactivity:
79
+
80
+ | Framework | Entry point | Package |
81
+ | ------------------------------ | ---------------------------------------------- | ------------------------- |
82
+ | React, Preact, Vue, Solid, Lit | `useTable` / `createTable` / `TableController` | `@tanstack/<fw>-table` |
83
+ | Angular | `injectTable` | `@tanstack/angular-table` |
84
+ | Svelte 5 | `createTable` (runes) | `@tanstack/svelte-table` |
85
+ | Vanilla JS | `constructTable` + `storeReactivityBindings()` | `@tanstack/table-core` |
86
+
87
+ ## Core Patterns
88
+
89
+ ### Minimum table (no extra features)
90
+
91
+ ```ts
92
+ const _features = tableFeatures({}) // core features only
93
+ const table = constructTable({
94
+ _features,
95
+ _rowModels: {}, // core row model auto-included
96
+ columns,
97
+ data,
98
+ })
99
+ ```
100
+
101
+ `tableFeatures({})` is the canonical "I only want the core read pipeline" setup.
102
+
103
+ ### Add features and their row models together
104
+
105
+ ```ts
106
+ import {
107
+ rowSortingFeature,
108
+ rowPaginationFeature,
109
+ columnFilteringFeature,
110
+ createSortedRowModel,
111
+ createFilteredRowModel,
112
+ createPaginatedRowModel,
113
+ sortFns,
114
+ filterFns,
115
+ } from '@tanstack/table-core'
116
+
117
+ const _features = tableFeatures({
118
+ rowSortingFeature,
119
+ rowPaginationFeature,
120
+ columnFilteringFeature,
121
+ })
122
+
123
+ const table = constructTable({
124
+ _features,
125
+ _rowModels: {
126
+ sortedRowModel: createSortedRowModel(sortFns),
127
+ filteredRowModel: createFilteredRowModel(filterFns),
128
+ paginatedRowModel: createPaginatedRowModel(),
129
+ },
130
+ columns,
131
+ data,
132
+ })
133
+ ```
134
+
135
+ Each feature and its row-model factory are registered together — TypeScript exposes the feature's APIs (`table.setSorting`, `table.nextPage`, `table.setColumnFilters`) only when its feature plugin is present in `_features`.
136
+
137
+ ### Vanilla JS reactivity binding
138
+
139
+ ```ts
140
+ import { constructTable, tableFeatures } from '@tanstack/table-core'
141
+ import { storeReactivityBindings } from '@tanstack/table-core'
142
+
143
+ const _features = tableFeatures({})
144
+
145
+ const table = constructTable({
146
+ _features,
147
+ _rowModels: {},
148
+ columns,
149
+ data,
150
+ _rowModelFns: {},
151
+ // Use the vanilla binding when no framework adapter exists
152
+ _processingMode: 'core',
153
+ })
154
+
155
+ // Subscribe to a slice
156
+ const unsub = table.atoms.sorting.subscribe((sorting) => {
157
+ console.log('sorting changed', sorting)
158
+ })
159
+ ```
160
+
161
+ ### `stockFeatures` for v8-like "everything on"
162
+
163
+ Reach for this only as a transitional aid. It re-introduces v8 bundle size (~15–20kb) and undoes v9's tree-shaking benefit.
164
+
165
+ ```ts
166
+ import { stockFeatures, tableFeatures } from '@tanstack/table-core'
167
+
168
+ // Discouraged in new code. Register only what you use.
169
+ const _features = tableFeatures(stockFeatures)
170
+ ```
171
+
172
+ ## Common Mistakes
173
+
174
+ ### [CRITICAL] API/state slice missing because the feature was not registered in `_features`
175
+
176
+ Wrong:
177
+
178
+ ```ts
179
+ // rowSortingFeature missing — table.setSorting / state.sorting unavailable
180
+ const _features = tableFeatures({}) // empty
181
+ const table = useTable({ _features, _rowModels: {}, columns, data })
182
+ table.setSorting([{ id: 'age', desc: true }]) // ❌ does not exist on this table type
183
+ ```
184
+
185
+ Correct:
186
+
187
+ ```ts
188
+ // Register every feature you intend to use; pair with its row model when applicable
189
+ const _features = tableFeatures({ rowSortingFeature, rowPaginationFeature })
190
+ const table = useTable({
191
+ _features,
192
+ _rowModels: {
193
+ sortedRowModel: createSortedRowModel(sortFns),
194
+ paginatedRowModel: createPaginatedRowModel(),
195
+ },
196
+ columns,
197
+ data,
198
+ })
199
+ ```
200
+
201
+ In v9, `_features` is a tree-shakeable registry — TypeScript hides APIs for unregistered features and the runtime atom is never created. Agents who see `table.setColumnFilters` "missing" often incorrectly conclude the API was removed.
202
+
203
+ Source: maintainer interview (Phase 4, 2026-05-17)
204
+
205
+ ### [CRITICAL] Hallucinating v7 / v8 `useReactTable` + `getCoreRowModel()` shape
206
+
207
+ Wrong:
208
+
209
+ ```ts
210
+ // v7
211
+ import { useTable, useSortBy } from 'react-table'
212
+ const table = useTable({ columns, data }, useSortBy)
213
+
214
+ // v8
215
+ import { useReactTable, getCoreRowModel } from '@tanstack/react-table'
216
+ const table = useReactTable({
217
+ columns,
218
+ data,
219
+ getCoreRowModel: getCoreRowModel(),
220
+ })
221
+ ```
222
+
223
+ Correct:
224
+
225
+ ```ts
226
+ import {
227
+ useTable,
228
+ tableFeatures,
229
+ rowSortingFeature,
230
+ createSortedRowModel,
231
+ sortFns,
232
+ } from '@tanstack/react-table'
233
+
234
+ const _features = tableFeatures({ rowSortingFeature })
235
+ const table = useTable({
236
+ _features,
237
+ _rowModels: { sortedRowModel: createSortedRowModel(sortFns) },
238
+ columns,
239
+ data,
240
+ })
241
+ ```
242
+
243
+ v7→v8 and v8→v9 both reshaped the API substantially. Agents trained on older data confidently emit v7/v8 shapes; v9 enforces `_features` + `_rowModels`.
244
+
245
+ Source: maintainer interview (Phase 4, 2026-05-17)
246
+
247
+ ### [HIGH] Calling `tableFeatures({})` inside the component body
248
+
249
+ Wrong:
250
+
251
+ ```tsx
252
+ function MyTable() {
253
+ // ❌ new object every render — destroys stable feature registration
254
+ const _features = tableFeatures({ rowSortingFeature })
255
+ const table = useTable({ _features, _rowModels: {}, columns, data })
256
+ }
257
+ ```
258
+
259
+ Correct:
260
+
261
+ ```tsx
262
+ // ✅ module-scoped, stable reference
263
+ const _features = tableFeatures({ rowSortingFeature })
264
+
265
+ function MyTable() {
266
+ const table = useTable({ _features, _rowModels: {}, columns, data })
267
+ }
268
+ ```
269
+
270
+ A fresh `_features` reference on each render churns the table's feature registry — the same way unstable `columns` or `data` cause infinite re-renders. Hoist to module scope or memoize.
271
+
272
+ Source: docs/guide/data.md; examples/react/basic-use-table/src/main.tsx
273
+
274
+ ### [HIGH] Adding a row-model factory without registering its feature
275
+
276
+ Wrong:
277
+
278
+ ```ts
279
+ // rowSortingFeature missing — sortedRowModel is orphaned and never runs
280
+ const _features = tableFeatures({ rowPaginationFeature })
281
+ const table = useTable({
282
+ _features,
283
+ _rowModels: {
284
+ sortedRowModel: createSortedRowModel(sortFns), // no-op
285
+ paginatedRowModel: createPaginatedRowModel(),
286
+ },
287
+ columns,
288
+ data,
289
+ })
290
+ ```
291
+
292
+ Correct:
293
+
294
+ ```ts
295
+ const _features = tableFeatures({ rowSortingFeature, rowPaginationFeature })
296
+ const table = useTable({
297
+ _features,
298
+ _rowModels: {
299
+ sortedRowModel: createSortedRowModel(sortFns),
300
+ paginatedRowModel: createPaginatedRowModel(),
301
+ },
302
+ columns,
303
+ data,
304
+ })
305
+ ```
306
+
307
+ Row-model factories only run if their matching feature is in `_features`. Runtime silently degrades.
308
+
309
+ Source: docs/guide/row-models.md; examples/react/basic-external-atoms/src/main.tsx
310
+
311
+ ### [CRITICAL] Reimplementing what built-in APIs already provide
312
+
313
+ Wrong:
314
+
315
+ ```ts
316
+ // ❌ Reimplements sorting state manually instead of using the API
317
+ const [sorting, setSorting] = useState([])
318
+ const sortedData = useMemo(() => [...data].sort((a, b) => /* …custom… */), [data, sorting])
319
+ // then uses sortedData directly, bypassing the table
320
+ ```
321
+
322
+ Correct:
323
+
324
+ ```ts
325
+ const table = useTable({
326
+ _features: tableFeatures({ rowSortingFeature }),
327
+ _rowModels: { sortedRowModel: createSortedRowModel(sortFns) },
328
+ columns,
329
+ data,
330
+ })
331
+ // then: table.setSorting(...), column.toggleSorting(), header.getToggleSortingHandler()
332
+ ```
333
+
334
+ TanStack Table IS a state-management coordinator. The maintainer flags hand-rolled state/sort/filter loops as the #1 tell that an AI wrote the code. Reach for `table.setSorting`, `row.toggleSelected`, `table.nextPage`, `table.setColumnFilters`, `column.toggleVisibility` first.
335
+
336
+ Source: maintainer interview (Phase 4, 2026-05-17)
337
+
338
+ ### [HIGH] Bundling `stockFeatures` when only a few features are used
339
+
340
+ Wrong:
341
+
342
+ ```ts
343
+ // Pulls in every feature even though only sorting+pagination are used
344
+ import { stockFeatures, tableFeatures } from '@tanstack/react-table'
345
+ const _features = tableFeatures(stockFeatures)
346
+ ```
347
+
348
+ Correct:
349
+
350
+ ```ts
351
+ import {
352
+ tableFeatures,
353
+ rowSortingFeature,
354
+ rowPaginationFeature,
355
+ } from '@tanstack/react-table'
356
+ const _features = tableFeatures({ rowSortingFeature, rowPaginationFeature })
357
+ ```
358
+
359
+ Tree-shaking via `_features` is the headline reason for the v9 redesign. `stockFeatures` exists as a v8-style transitional escape hatch, not a default.
360
+
361
+ Source: maintainer interview (Phase 4, 2026-05-17)
362
+
363
+ ### [CRITICAL] Empty array literal for `data` causes infinite re-renders
364
+
365
+ Wrong:
366
+
367
+ ```tsx
368
+ // ❌ Fresh [] each render — infinite loop when items is undefined
369
+ const table = useTable({
370
+ _features,
371
+ _rowModels: {},
372
+ columns,
373
+ data: items ?? [],
374
+ })
375
+ ```
376
+
377
+ Correct:
378
+
379
+ ```tsx
380
+ // ✅ Hoist the empty fallback OR memoize
381
+ const EMPTY: Person[] = []
382
+
383
+ const table = useTable({
384
+ _features,
385
+ _rowModels: {},
386
+ columns,
387
+ data: items ?? EMPTY,
388
+ })
389
+ // or: const data = useMemo(() => items ?? [], [items])
390
+ ```
391
+
392
+ A new `[]` reference each render means the table sees a fresh `data` prop and rebuilds row models. Top recurring beginner issue.
393
+
394
+ Source: https://github.com/TanStack/table/issues/4566; https://github.com/TanStack/table/issues/6002
395
+
396
+ ## See also
397
+
398
+ - `tanstack-table/state-management` — atom model, ownership precedence, state slices
399
+ - `tanstack-table/column-definitions` — `createColumnHelper<typeof _features, TData>()` and `getRowId`
400
+ - `tanstack-table/migrate-v8-to-v9` — full rename + restructure table for v8 → v9 upgrades