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

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 (163) hide show
  1. package/dist/core/cells/constructCell.cjs +4 -3
  2. package/dist/core/cells/constructCell.cjs.map +1 -1
  3. package/dist/core/cells/constructCell.js +4 -3
  4. package/dist/core/cells/constructCell.js.map +1 -1
  5. package/dist/core/columns/constructColumn.cjs +6 -4
  6. package/dist/core/columns/constructColumn.cjs.map +1 -1
  7. package/dist/core/columns/constructColumn.js +6 -4
  8. package/dist/core/columns/constructColumn.js.map +1 -1
  9. package/dist/core/columns/coreColumnsFeature.utils.cjs +10 -2
  10. package/dist/core/columns/coreColumnsFeature.utils.cjs.map +1 -1
  11. package/dist/core/columns/coreColumnsFeature.utils.js +10 -2
  12. package/dist/core/columns/coreColumnsFeature.utils.js.map +1 -1
  13. package/dist/core/headers/buildHeaderGroups.cjs +27 -19
  14. package/dist/core/headers/buildHeaderGroups.cjs.map +1 -1
  15. package/dist/core/headers/buildHeaderGroups.js +27 -19
  16. package/dist/core/headers/buildHeaderGroups.js.map +1 -1
  17. package/dist/core/headers/constructHeader.cjs +4 -3
  18. package/dist/core/headers/constructHeader.cjs.map +1 -1
  19. package/dist/core/headers/constructHeader.js +4 -3
  20. package/dist/core/headers/constructHeader.js.map +1 -1
  21. package/dist/core/headers/coreHeadersFeature.cjs +1 -6
  22. package/dist/core/headers/coreHeadersFeature.cjs.map +1 -1
  23. package/dist/core/headers/coreHeadersFeature.js +2 -7
  24. package/dist/core/headers/coreHeadersFeature.js.map +1 -1
  25. package/dist/core/headers/coreHeadersFeature.utils.cjs +20 -18
  26. package/dist/core/headers/coreHeadersFeature.utils.cjs.map +1 -1
  27. package/dist/core/headers/coreHeadersFeature.utils.d.cts +1 -1
  28. package/dist/core/headers/coreHeadersFeature.utils.d.ts +1 -1
  29. package/dist/core/headers/coreHeadersFeature.utils.js +21 -19
  30. package/dist/core/headers/coreHeadersFeature.utils.js.map +1 -1
  31. package/dist/core/reactivity/coreReactivityFeature.types.d.cts +4 -0
  32. package/dist/core/reactivity/coreReactivityFeature.types.d.ts +4 -0
  33. package/dist/core/rows/constructRow.cjs +8 -6
  34. package/dist/core/rows/constructRow.cjs.map +1 -1
  35. package/dist/core/rows/constructRow.js +8 -6
  36. package/dist/core/rows/constructRow.js.map +1 -1
  37. package/dist/core/rows/coreRowsFeature.utils.cjs +9 -4
  38. package/dist/core/rows/coreRowsFeature.utils.cjs.map +1 -1
  39. package/dist/core/rows/coreRowsFeature.utils.js +9 -4
  40. package/dist/core/rows/coreRowsFeature.utils.js.map +1 -1
  41. package/dist/core/table/constructTable.cjs +9 -5
  42. package/dist/core/table/constructTable.cjs.map +1 -1
  43. package/dist/core/table/constructTable.js +9 -5
  44. package/dist/core/table/constructTable.js.map +1 -1
  45. package/dist/core/table/coreTablesFeature.utils.cjs +5 -1
  46. package/dist/core/table/coreTablesFeature.utils.cjs.map +1 -1
  47. package/dist/core/table/coreTablesFeature.utils.js +5 -1
  48. package/dist/core/table/coreTablesFeature.utils.js.map +1 -1
  49. package/dist/features/column-faceting/createFacetedMinMaxValues.cjs +8 -5
  50. package/dist/features/column-faceting/createFacetedMinMaxValues.cjs.map +1 -1
  51. package/dist/features/column-faceting/createFacetedMinMaxValues.js +8 -5
  52. package/dist/features/column-faceting/createFacetedMinMaxValues.js.map +1 -1
  53. package/dist/features/column-faceting/createFacetedRowModel.cjs +8 -3
  54. package/dist/features/column-faceting/createFacetedRowModel.cjs.map +1 -1
  55. package/dist/features/column-faceting/createFacetedRowModel.js +8 -3
  56. package/dist/features/column-faceting/createFacetedRowModel.js.map +1 -1
  57. package/dist/features/column-faceting/createFacetedUniqueValues.cjs +7 -4
  58. package/dist/features/column-faceting/createFacetedUniqueValues.cjs.map +1 -1
  59. package/dist/features/column-faceting/createFacetedUniqueValues.js +7 -4
  60. package/dist/features/column-faceting/createFacetedUniqueValues.js.map +1 -1
  61. package/dist/features/column-filtering/createFilteredRowModel.cjs +11 -5
  62. package/dist/features/column-filtering/createFilteredRowModel.cjs.map +1 -1
  63. package/dist/features/column-filtering/createFilteredRowModel.js +11 -5
  64. package/dist/features/column-filtering/createFilteredRowModel.js.map +1 -1
  65. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs +16 -6
  66. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs.map +1 -1
  67. package/dist/features/column-ordering/columnOrderingFeature.utils.js +16 -6
  68. package/dist/features/column-ordering/columnOrderingFeature.utils.js.map +1 -1
  69. package/dist/features/column-pinning/columnPinningFeature.utils.cjs +41 -24
  70. package/dist/features/column-pinning/columnPinningFeature.utils.cjs.map +1 -1
  71. package/dist/features/column-pinning/columnPinningFeature.utils.d.cts +5 -4
  72. package/dist/features/column-pinning/columnPinningFeature.utils.d.ts +5 -4
  73. package/dist/features/column-pinning/columnPinningFeature.utils.js +42 -25
  74. package/dist/features/column-pinning/columnPinningFeature.utils.js.map +1 -1
  75. package/dist/features/column-sizing/columnSizingFeature.cjs +28 -4
  76. package/dist/features/column-sizing/columnSizingFeature.cjs.map +1 -1
  77. package/dist/features/column-sizing/columnSizingFeature.js +28 -4
  78. package/dist/features/column-sizing/columnSizingFeature.js.map +1 -1
  79. package/dist/features/column-visibility/columnVisibilityFeature.cjs +23 -14
  80. package/dist/features/column-visibility/columnVisibilityFeature.cjs.map +1 -1
  81. package/dist/features/column-visibility/columnVisibilityFeature.js +24 -15
  82. package/dist/features/column-visibility/columnVisibilityFeature.js.map +1 -1
  83. package/dist/features/column-visibility/columnVisibilityFeature.types.d.cts +4 -0
  84. package/dist/features/column-visibility/columnVisibilityFeature.types.d.ts +4 -0
  85. package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs +40 -13
  86. package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs.map +1 -1
  87. package/dist/features/column-visibility/columnVisibilityFeature.utils.d.cts +12 -1
  88. package/dist/features/column-visibility/columnVisibilityFeature.utils.d.ts +12 -1
  89. package/dist/features/column-visibility/columnVisibilityFeature.utils.js +40 -14
  90. package/dist/features/column-visibility/columnVisibilityFeature.utils.js.map +1 -1
  91. package/dist/features/row-expanding/rowExpandingFeature.utils.cjs +2 -2
  92. package/dist/features/row-expanding/rowExpandingFeature.utils.cjs.map +1 -1
  93. package/dist/features/row-expanding/rowExpandingFeature.utils.js +2 -2
  94. package/dist/features/row-expanding/rowExpandingFeature.utils.js.map +1 -1
  95. package/dist/features/row-pinning/rowPinningFeature.utils.cjs +13 -7
  96. package/dist/features/row-pinning/rowPinningFeature.utils.cjs.map +1 -1
  97. package/dist/features/row-pinning/rowPinningFeature.utils.js +13 -7
  98. package/dist/features/row-pinning/rowPinningFeature.utils.js.map +1 -1
  99. package/dist/features/row-selection/rowSelectionFeature.utils.cjs +6 -3
  100. package/dist/features/row-selection/rowSelectionFeature.utils.cjs.map +1 -1
  101. package/dist/features/row-selection/rowSelectionFeature.utils.js +6 -3
  102. package/dist/features/row-selection/rowSelectionFeature.utils.js.map +1 -1
  103. package/dist/features/row-sorting/createSortedRowModel.cjs +13 -8
  104. package/dist/features/row-sorting/createSortedRowModel.cjs.map +1 -1
  105. package/dist/features/row-sorting/createSortedRowModel.js +13 -8
  106. package/dist/features/row-sorting/createSortedRowModel.js.map +1 -1
  107. package/dist/features/row-sorting/rowSortingFeature.utils.cjs +2 -2
  108. package/dist/features/row-sorting/rowSortingFeature.utils.cjs.map +1 -1
  109. package/dist/features/row-sorting/rowSortingFeature.utils.js +2 -2
  110. package/dist/features/row-sorting/rowSortingFeature.utils.js.map +1 -1
  111. package/dist/fns/aggregationFns.cjs +14 -7
  112. package/dist/fns/aggregationFns.cjs.map +1 -1
  113. package/dist/fns/aggregationFns.js +14 -8
  114. package/dist/fns/aggregationFns.js.map +1 -1
  115. package/dist/index.cjs +0 -4
  116. package/dist/index.d.cts +2 -2
  117. package/dist/index.d.ts +2 -2
  118. package/dist/index.js +2 -2
  119. package/dist/static-functions.cjs +1 -0
  120. package/dist/static-functions.d.cts +2 -2
  121. package/dist/static-functions.d.ts +2 -2
  122. package/dist/static-functions.js +2 -2
  123. package/dist/store-reactivity-bindings.cjs +1 -0
  124. package/dist/store-reactivity-bindings.cjs.map +1 -1
  125. package/dist/store-reactivity-bindings.js +1 -0
  126. package/dist/store-reactivity-bindings.js.map +1 -1
  127. package/dist/utils.cjs +18 -39
  128. package/dist/utils.cjs.map +1 -1
  129. package/dist/utils.d.cts +1 -23
  130. package/dist/utils.d.ts +1 -23
  131. package/dist/utils.js +19 -36
  132. package/dist/utils.js.map +1 -1
  133. package/package.json +1 -1
  134. package/src/core/cells/constructCell.ts +3 -2
  135. package/src/core/columns/constructColumn.ts +5 -3
  136. package/src/core/columns/coreColumnsFeature.utils.ts +6 -2
  137. package/src/core/headers/buildHeaderGroups.ts +29 -30
  138. package/src/core/headers/constructHeader.ts +3 -2
  139. package/src/core/headers/coreHeadersFeature.ts +2 -27
  140. package/src/core/headers/coreHeadersFeature.utils.ts +29 -43
  141. package/src/core/reactivity/coreReactivityFeature.types.ts +4 -0
  142. package/src/core/rows/constructRow.ts +6 -4
  143. package/src/core/rows/coreRowsFeature.utils.ts +11 -4
  144. package/src/core/table/constructTable.ts +6 -4
  145. package/src/core/table/coreTablesFeature.utils.ts +3 -1
  146. package/src/features/column-faceting/createFacetedMinMaxValues.ts +8 -10
  147. package/src/features/column-faceting/createFacetedRowModel.ts +10 -6
  148. package/src/features/column-faceting/createFacetedUniqueValues.ts +4 -3
  149. package/src/features/column-filtering/createFilteredRowModel.ts +14 -8
  150. package/src/features/column-ordering/columnOrderingFeature.utils.ts +14 -6
  151. package/src/features/column-pinning/columnPinningFeature.utils.ts +53 -37
  152. package/src/features/column-sizing/columnSizingFeature.ts +16 -0
  153. package/src/features/column-visibility/columnVisibilityFeature.ts +8 -0
  154. package/src/features/column-visibility/columnVisibilityFeature.types.ts +7 -0
  155. package/src/features/column-visibility/columnVisibilityFeature.utils.ts +50 -17
  156. package/src/features/row-expanding/rowExpandingFeature.utils.ts +2 -2
  157. package/src/features/row-pinning/rowPinningFeature.utils.ts +20 -18
  158. package/src/features/row-selection/rowSelectionFeature.utils.ts +20 -19
  159. package/src/features/row-sorting/createSortedRowModel.ts +16 -13
  160. package/src/features/row-sorting/rowSortingFeature.utils.ts +2 -2
  161. package/src/fns/aggregationFns.ts +20 -8
  162. package/src/store-reactivity-bindings.ts +1 -0
  163. package/src/utils.ts +19 -46
@@ -49,20 +49,18 @@ function _createFacetedMinMaxValues<
49
49
  ): undefined | [number, number] {
50
50
  if (!flatRows.length) return undefined
51
51
 
52
- const numericValues = flatRows
53
- .map((flatRow) => flatRow.getValue(columnId))
54
- .map(Number)
55
- .filter((value) => !Number.isNaN(value))
52
+ let facetedMinValue = Number.POSITIVE_INFINITY
53
+ let facetedMaxValue = Number.NEGATIVE_INFINITY
54
+ let foundAny = false
56
55
 
57
- if (!numericValues.length) return undefined
58
-
59
- let facetedMinValue = numericValues[0]!
60
- let facetedMaxValue = numericValues[0]!
61
-
62
- for (const value of numericValues) {
56
+ for (let i = 0; i < flatRows.length; i++) {
57
+ const value = Number(flatRows[i]!.getValue(columnId))
58
+ if (Number.isNaN(value)) continue
59
+ foundAny = true
63
60
  if (value < facetedMinValue) facetedMinValue = value
64
61
  if (value > facetedMaxValue) facetedMaxValue = value
65
62
  }
66
63
 
64
+ if (!foundAny) return undefined
67
65
  return [facetedMinValue, facetedMaxValue]
68
66
  }
@@ -60,17 +60,21 @@ function _createFacetedRowModel<
60
60
  return preRowModel
61
61
  }
62
62
 
63
- const filterableIds = [
64
- ...(columnFilters?.map((d) => d.id).filter((d) => d !== columnId) ?? []),
65
- globalFilter ? '__global__' : undefined,
66
- ].filter(Boolean) as Array<string>
63
+ const filterableIds: Array<string> = []
64
+ if (columnFilters) {
65
+ for (let i = 0; i < columnFilters.length; i++) {
66
+ const id = columnFilters[i]!.id
67
+ if (id !== columnId) filterableIds.push(id)
68
+ }
69
+ }
70
+ if (globalFilter) filterableIds.push('__global__')
67
71
 
68
72
  const filterRowsImpl = (
69
73
  row: Row<TFeatures, TData> & Partial<Row_ColumnFiltering<TFeatures, TData>>,
70
74
  ) => {
71
75
  // Horizontally filter rows through each column
72
- for (const colId of filterableIds) {
73
- if (row.columnFilters?.[colId] === false) {
76
+ for (let i = 0; i < filterableIds.length; i++) {
77
+ if (row.columnFilters?.[filterableIds[i]!] === false) {
74
78
  return false
75
79
  }
76
80
  }
@@ -46,10 +46,11 @@ function _createFacetedUniqueValues<
46
46
  >(columnId: string, flatRows: Array<Row<TFeatures, TData>>): Map<any, number> {
47
47
  const facetedUniqueValues = new Map<any, number>()
48
48
 
49
- for (const row of flatRows) {
50
- const values = row.getUniqueValues(columnId)
49
+ for (let i = 0; i < flatRows.length; i++) {
50
+ const values = flatRows[i]!.getUniqueValues(columnId)
51
51
 
52
- for (const value of values) {
52
+ for (let j = 0; j < values.length; j++) {
53
+ const value = values[j]
53
54
  if (facetedUniqueValues.has(value)) {
54
55
  facetedUniqueValues.set(
55
56
  value,
@@ -57,9 +57,11 @@ function _createFilteredRowModel<
57
57
  const globalFilter = table.atoms.globalFilter?.get()
58
58
 
59
59
  if (!rowModel.rows.length || (!columnFilters?.length && !globalFilter)) {
60
- for (const row of rowModel.flatRows as Array<
60
+ const flatRows = rowModel.flatRows as Array<
61
61
  Row<TFeatures, TData> & Partial<Row_ColumnFiltering<TFeatures, TData>>
62
- >) {
62
+ >
63
+ for (let i = 0; i < flatRows.length; i++) {
64
+ const row = flatRows[i]!
63
65
  row.columnFilters = {}
64
66
  row.columnFiltersMeta = {}
65
67
  }
@@ -110,13 +112,16 @@ function _createFilteredRowModel<
110
112
  }
111
113
 
112
114
  // Flag the pre-filtered row model with each filter state
113
- for (const row of rowModel.flatRows as Array<
115
+ const flatRows = rowModel.flatRows as Array<
114
116
  Row<TFeatures, TData> & Partial<Row_ColumnFiltering<TFeatures, TData>>
115
- >) {
117
+ >
118
+ for (let i = 0; i < flatRows.length; i++) {
119
+ const row = flatRows[i]!
116
120
  row.columnFilters = {}
117
121
 
118
122
  if (resolvedColumnFilters.length) {
119
- for (const currentColumnFilter of resolvedColumnFilters) {
123
+ for (let j = 0; j < resolvedColumnFilters.length; j++) {
124
+ const currentColumnFilter = resolvedColumnFilters[j]!
120
125
  const id = currentColumnFilter.id
121
126
 
122
127
  // Tag the row with the column filter state
@@ -134,7 +139,8 @@ function _createFilteredRowModel<
134
139
  }
135
140
 
136
141
  if (resolvedGlobalFilters.length) {
137
- for (const currentGlobalFilter of resolvedGlobalFilters) {
142
+ for (let j = 0; j < resolvedGlobalFilters.length; j++) {
143
+ const currentGlobalFilter = resolvedGlobalFilters[j]!
138
144
  const id = currentGlobalFilter.id
139
145
  // Tag the row with the first truthy global filter state
140
146
  if (
@@ -164,8 +170,8 @@ function _createFilteredRowModel<
164
170
  row: Row<TFeatures, TData> & Row_ColumnFiltering<TFeatures, TData>,
165
171
  ) => {
166
172
  // Horizontally filter rows through each column
167
- for (const columnId of filterableIds) {
168
- if (row.columnFilters[columnId] === false) {
173
+ for (let i = 0; i < filterableIds.length; i++) {
174
+ if (row.columnFilters[filterableIds[i]!] === false) {
169
175
  return false
170
176
  }
171
177
  }
@@ -156,11 +156,15 @@ export function table_getOrderColumnsFn<
156
156
  string,
157
157
  Column_Internal<TFeatures, TData, unknown>
158
158
  >()
159
- for (const column of columns) remaining.set(column.id, column)
159
+ for (let i = 0; i < columns.length; i++) {
160
+ const column = columns[i]!
161
+ remaining.set(column.id, column)
162
+ }
160
163
 
161
164
  // Place columns in the requested order, removing each as it's used
162
165
  // (handles duplicates and unknown ids in columnOrder)
163
- for (const id of columnOrder) {
166
+ for (let i = 0; i < columnOrder.length; i++) {
167
+ const id = columnOrder[i]!
164
168
  const column = remaining.get(id)
165
169
  if (column) {
166
170
  orderedColumns.push(column)
@@ -169,7 +173,8 @@ export function table_getOrderColumnsFn<
169
173
  }
170
174
 
171
175
  // Append leftover columns in their original order
172
- for (const column of columns) {
176
+ for (let i = 0; i < columns.length; i++) {
177
+ const column = columns[i]!
173
178
  if (remaining.has(column.id)) orderedColumns.push(column)
174
179
  }
175
180
  }
@@ -214,11 +219,14 @@ export function orderColumns<
214
219
  string,
215
220
  Column_Internal<TFeatures, TData, unknown>
216
221
  >()
217
- for (const col of leafColumns) leafColumnsById.set(col.id, col)
222
+ for (let i = 0; i < leafColumns.length; i++) {
223
+ const col = leafColumns[i]!
224
+ leafColumnsById.set(col.id, col)
225
+ }
218
226
 
219
227
  const groupingColumns: Array<Column_Internal<TFeatures, TData, unknown>> = []
220
- for (const g of grouping) {
221
- const col = leafColumnsById.get(g)
228
+ for (let i = 0; i < grouping.length; i++) {
229
+ const col = leafColumnsById.get(grouping[i]!)
222
230
  if (col) groupingColumns.push(col)
223
231
  }
224
232
 
@@ -1,10 +1,12 @@
1
1
  import {
2
2
  column_getIsVisible,
3
3
  row_getVisibleCells,
4
+ row_getVisibleCellsByColumnId,
4
5
  table_getVisibleLeafColumns,
5
6
  } from '../column-visibility/columnVisibilityFeature.utils'
6
7
  import { buildHeaderGroups } from '../../core/headers/buildHeaderGroups'
7
8
  import { callMemoOrStaticFn, cloneState } from '../../utils'
9
+ import type { Header } from '../../types/Header'
8
10
  import type { HeaderGroup } from '../../types/HeaderGroup'
9
11
  import type { Cell } from '../../types/Cell'
10
12
  import type { Row } from '../../types/Row'
@@ -56,10 +58,13 @@ export function column_pin<
56
58
  column: Column_Internal<TFeatures, TData, TValue>,
57
59
  position: ColumnPinningPosition,
58
60
  ) {
59
- const columnIds = column
60
- .getLeafColumns()
61
- .map((d) => d.id)
62
- .filter(Boolean)
61
+ // Single pass: collect non-empty leaf-column ids.
62
+ const leafColumns = column.getLeafColumns()
63
+ const columnIds: Array<string> = []
64
+ for (let i = 0; i < leafColumns.length; i++) {
65
+ const id = leafColumns[i]!.id
66
+ if (id) columnIds.push(id)
67
+ }
63
68
 
64
69
  table_setColumnPinning(column.table, (old) => {
65
70
  if (position === 'right') {
@@ -209,12 +214,13 @@ export function row_getLeftVisibleCells<
209
214
  if (!left.length) return []
210
215
  const allVisibleCells = callMemoOrStaticFn(
211
216
  row,
212
- 'getVisibleCells',
213
- row_getVisibleCells,
217
+ 'getVisibleCellsByColumnId',
218
+ row_getVisibleCellsByColumnId,
214
219
  )
215
- const cells: typeof allVisibleCells = []
216
- for (const columnId of left) {
217
- const cell = allVisibleCells.find((c) => c.column.id === columnId)
220
+ const cells: Array<Cell<TFeatures, TData, unknown>> = []
221
+ for (let i = 0; i < left.length; i++) {
222
+ const columnId = left[i]!
223
+ const cell = allVisibleCells[columnId]
218
224
  if (cell) {
219
225
  // Assign position property directly to preserve prototype chain
220
226
  cell.position = 'left'
@@ -243,12 +249,13 @@ export function row_getRightVisibleCells<
243
249
  if (!right.length) return [] as Array<Cell<TFeatures, TData, unknown>>
244
250
  const allVisibleCells = callMemoOrStaticFn(
245
251
  row,
246
- 'getVisibleCells',
247
- row_getVisibleCells,
252
+ 'getVisibleCellsByColumnId',
253
+ row_getVisibleCellsByColumnId,
248
254
  )
249
- const cells: typeof allVisibleCells = []
250
- for (const columnId of right) {
251
- const cell = allVisibleCells.find((c) => c.column.id === columnId)
255
+ const cells: Array<Cell<TFeatures, TData, unknown>> = []
256
+ for (let i = 0; i < right.length; i++) {
257
+ const columnId = right[i]!
258
+ const cell = allVisibleCells[columnId]
252
259
  if (cell) {
253
260
  // Assign position property directly to preserve prototype chain
254
261
  cell.position = 'right'
@@ -353,8 +360,8 @@ export function table_getLeftHeaderGroups<
353
360
 
354
361
  const orderedLeafColumns: Array<Column_Internal<TFeatures, TData, unknown>> =
355
362
  []
356
- for (const columnId of left) {
357
- const column = leafColumnsById[columnId]
363
+ for (let i = 0; i < left.length; i++) {
364
+ const column = leafColumnsById[left[i]!]
358
365
  if (
359
366
  column &&
360
367
  callMemoOrStaticFn(column, 'getIsVisible', column_getIsVisible)
@@ -390,8 +397,8 @@ export function table_getRightHeaderGroups<
390
397
 
391
398
  const orderedLeafColumns: Array<Column_Internal<TFeatures, TData, unknown>> =
392
399
  []
393
- for (const columnId of right) {
394
- const column = leafColumnsById[columnId]
400
+ for (let i = 0; i < right.length; i++) {
401
+ const column = leafColumnsById[right[i]!]
395
402
  if (
396
403
  column &&
397
404
  callMemoOrStaticFn(column, 'getIsVisible', column_getIsVisible)
@@ -524,11 +531,14 @@ export function table_getLeftFlatHeaders<
524
531
  'getLeftHeaderGroups',
525
532
  table_getLeftHeaderGroups,
526
533
  )
527
- return leftHeaderGroups
528
- .map((headerGroup) => {
529
- return headerGroup.headers
530
- })
531
- .flat()
534
+ const result: Array<Header<TFeatures, TData, unknown>> = []
535
+ for (let i = 0; i < leftHeaderGroups.length; i++) {
536
+ const headers = leftHeaderGroups[i]!.headers
537
+ for (let j = 0; j < headers.length; j++) {
538
+ result.push(headers[j])
539
+ }
540
+ }
541
+ return result
532
542
  }
533
543
 
534
544
  /**
@@ -550,11 +560,14 @@ export function table_getRightFlatHeaders<
550
560
  'getRightHeaderGroups',
551
561
  table_getRightHeaderGroups,
552
562
  )
553
- return rightHeaderGroups
554
- .map((headerGroup) => {
555
- return headerGroup.headers
556
- })
557
- .flat()
563
+ const result: Array<Header<TFeatures, TData, unknown>> = []
564
+ for (let i = 0; i < rightHeaderGroups.length; i++) {
565
+ const headers = rightHeaderGroups[i]!.headers
566
+ for (let j = 0; j < headers.length; j++) {
567
+ result.push(headers[j])
568
+ }
569
+ }
570
+ return result
558
571
  }
559
572
 
560
573
  /**
@@ -576,11 +589,14 @@ export function table_getCenterFlatHeaders<
576
589
  'getCenterHeaderGroups',
577
590
  table_getCenterHeaderGroups,
578
591
  )
579
- return centerHeaderGroups
580
- .map((headerGroup) => {
581
- return headerGroup.headers
582
- })
583
- .flat()
592
+ const result: Array<Header<TFeatures, TData, unknown>> = []
593
+ for (let i = 0; i < centerHeaderGroups.length; i++) {
594
+ const headers = centerHeaderGroups[i]!.headers
595
+ for (let j = 0; j < headers.length; j++) {
596
+ result.push(headers[j])
597
+ }
598
+ }
599
+ return result
584
600
  }
585
601
 
586
602
  // leaf headers
@@ -668,8 +684,8 @@ export function table_getLeftLeafColumns<
668
684
  table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState()
669
685
  const leafColumnsById = table.getAllLeafColumnsById()
670
686
  const result: Array<Column_Internal<TFeatures, TData, unknown>> = []
671
- for (const columnId of left) {
672
- const column = leafColumnsById[columnId]
687
+ for (let i = 0; i < left.length; i++) {
688
+ const column = leafColumnsById[left[i]!]
673
689
  if (column) result.push(column)
674
690
  }
675
691
  return result
@@ -693,8 +709,8 @@ export function table_getRightLeafColumns<
693
709
  table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState()
694
710
  const leafColumnsById = table.getAllLeafColumnsById()
695
711
  const result: Array<Column_Internal<TFeatures, TData, unknown>> = []
696
- for (const columnId of right) {
697
- const column = leafColumnsById[columnId]
712
+ for (let i = 0; i < right.length; i++) {
713
+ const column = leafColumnsById[right[i]!]
698
714
  if (column) result.push(column)
699
715
  }
700
716
  return result
@@ -141,15 +141,31 @@ export function constructColumnSizingFeature<
141
141
  },
142
142
  table_getTotalSize: {
143
143
  fn: () => table_getTotalSize(table),
144
+ memoDeps: () => [
145
+ table.atoms.columnSizing?.get(),
146
+ table.getHeaderGroups(),
147
+ ],
144
148
  },
145
149
  table_getLeftTotalSize: {
146
150
  fn: () => table_getLeftTotalSize(table),
151
+ memoDeps: () => [
152
+ table.atoms.columnSizing?.get(),
153
+ table.getHeaderGroups(),
154
+ ],
147
155
  },
148
156
  table_getCenterTotalSize: {
149
157
  fn: () => table_getCenterTotalSize(table),
158
+ memoDeps: () => [
159
+ table.atoms.columnSizing?.get(),
160
+ table.getHeaderGroups(),
161
+ ],
150
162
  },
151
163
  table_getRightTotalSize: {
152
164
  fn: () => table_getRightTotalSize(table),
165
+ memoDeps: () => [
166
+ table.atoms.columnSizing?.get(),
167
+ table.getHeaderGroups(),
168
+ ],
153
169
  },
154
170
  })
155
171
  },
@@ -10,6 +10,7 @@ import {
10
10
  column_toggleVisibility,
11
11
  getDefaultColumnVisibilityState,
12
12
  row_getVisibleCells,
13
+ row_getVisibleCellsByColumnId,
13
14
  table_getIsAllColumnsVisible,
14
15
  table_getIsSomeColumnsVisible,
15
16
  table_getToggleAllColumnsVisibilityHandler,
@@ -97,6 +98,13 @@ export function constructColumnVisibilityFeature<
97
98
  table.atoms.columnVisibility?.get(),
98
99
  ],
99
100
  },
101
+ row_getVisibleCellsByColumnId: {
102
+ fn: (row) => row_getVisibleCellsByColumnId(row),
103
+ memoDeps: (row) => [
104
+ row.getAllCells(),
105
+ table.atoms.columnVisibility?.get(),
106
+ ],
107
+ },
100
108
  })
101
109
  },
102
110
 
@@ -80,6 +80,13 @@ export interface Row_ColumnVisibility<
80
80
  * Returns an array of cells that account for column visibility for the row.
81
81
  */
82
82
  getVisibleCells: () => Array<Cell<TFeatures, TData, unknown>>
83
+ /**
84
+ * Returns visible cells by column id for the row.
85
+ */
86
+ getVisibleCellsByColumnId: () => Record<
87
+ string,
88
+ Cell<TFeatures, TData, unknown>
89
+ >
83
90
  }
84
91
 
85
92
  export interface Column_ColumnVisibility {
@@ -130,42 +130,73 @@ export function row_getVisibleCells<
130
130
  TFeatures extends TableFeatures,
131
131
  TData extends RowData,
132
132
  >(row: Row<TFeatures, TData>): Array<Cell<TFeatures, TData, unknown>> {
133
- const cells = row
134
- .getAllCells()
135
- .filter((cell) =>
136
- callMemoOrStaticFn(cell.column, 'getIsVisible', column_getIsVisible),
137
- )
133
+ const allCells = row.getAllCells()
134
+ const visibleCells: Array<Cell<TFeatures, TData, unknown>> = []
135
+ for (let i = 0; i < allCells.length; i++) {
136
+ const cell = allCells[i]!
137
+ if (callMemoOrStaticFn(cell.column, 'getIsVisible', column_getIsVisible)) {
138
+ visibleCells.push(cell)
139
+ }
140
+ }
141
+
138
142
  const { left, right } =
139
143
  row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState()
140
- if (!left.length && !right.length) return cells // no pinning, return early
144
+ if (!left.length && !right.length) return visibleCells // no pinning, return early
141
145
 
142
- const cellsByColumnId = new Map<string, Cell<TFeatures, TData, unknown>>()
143
- for (const cell of cells) cellsByColumnId.set(cell.column.id, cell)
146
+ const visibleCellsByColumnId = callMemoOrStaticFn(
147
+ row,
148
+ 'getVisibleCellsByColumnId',
149
+ row_getVisibleCellsByColumnId,
150
+ )
144
151
 
145
152
  const leftCells: Array<Cell<TFeatures, TData, unknown>> = []
146
- for (const columnId of left) {
147
- const cell = cellsByColumnId.get(columnId)
153
+ for (let i = 0; i < left.length; i++) {
154
+ const cell = visibleCellsByColumnId[left[i]!]
148
155
  if (cell) leftCells.push(cell)
149
156
  }
150
157
 
151
158
  const rightCells: Array<Cell<TFeatures, TData, unknown>> = []
152
- for (const columnId of right) {
153
- const cell = cellsByColumnId.get(columnId)
159
+ for (let i = 0; i < right.length; i++) {
160
+ const cell = visibleCellsByColumnId[right[i]!]
154
161
  if (cell) rightCells.push(cell)
155
162
  }
156
163
 
157
164
  // Center cells: visible cells in natural column order, minus pinned ones.
158
- const leftSet = new Set(left)
159
- const rightSet = new Set(right)
160
165
  const centerCells: Array<Cell<TFeatures, TData, unknown>> = []
161
- for (const cell of cells) {
166
+ for (let i = 0; i < visibleCells.length; i++) {
167
+ const cell = visibleCells[i]!
162
168
  const id = cell.column.id
163
- if (!leftSet.has(id) && !rightSet.has(id)) centerCells.push(cell)
169
+ if (!left.includes(id) && !right.includes(id)) centerCells.push(cell)
164
170
  }
165
171
 
166
172
  return [...leftCells, ...centerCells, ...rightCells]
167
173
  }
168
174
 
175
+ /**
176
+ * Returns visible cells by column id for a row.
177
+ *
178
+ * This is the static implementation behind the matching row instance API and may read row caches or table state atoms.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * const value = row_getVisibleCellsByColumnId(row)
183
+ * ```
184
+ */
185
+ export function row_getVisibleCellsByColumnId<
186
+ TFeatures extends TableFeatures,
187
+ TData extends RowData,
188
+ >(row: Row<TFeatures, TData>): Record<string, Cell<TFeatures, TData, unknown>> {
189
+ const result: Record<string, Cell<TFeatures, TData, unknown>> = {}
190
+ const allCells = row.getAllCells()
191
+ for (let i = 0; i < allCells.length; i++) {
192
+ const cell = allCells[i]!
193
+ if (callMemoOrStaticFn(cell.column, 'getIsVisible', column_getIsVisible)) {
194
+ result[cell.column.id] = cell
195
+ }
196
+ }
197
+ return result
198
+ }
199
+
169
200
  /**
170
201
  * Returns visible flat columns for the table.
171
202
  *
@@ -266,7 +297,9 @@ export function table_toggleAllColumnsVisible<
266
297
  value = value ?? !table_getIsAllColumnsVisible(table)
267
298
 
268
299
  const visibility: Record<string, boolean> = {}
269
- for (const column of table.getAllLeafColumns()) {
300
+ const leafColumns = table.getAllLeafColumns()
301
+ for (let i = 0; i < leafColumns.length; i++) {
302
+ const column = leafColumns[i]!
270
303
  visibility[column.id] = !value ? !column_getCanHide(column) : value
271
304
  }
272
305
 
@@ -41,7 +41,7 @@ export function table_autoResetExpanded<
41
41
  table.options.autoResetExpanded ??
42
42
  !table.options.manualExpanding
43
43
  ) {
44
- queueMicrotask(() => table_resetExpanded(table))
44
+ table._reactivity.schedule(() => table_resetExpanded(table))
45
45
  }
46
46
  }
47
47
 
@@ -330,7 +330,7 @@ export function row_getIsAllParentsExpanded<
330
330
 
331
331
  while (isFullyExpanded && currentRow.parentId) {
332
332
  currentRow = row.table.getRow(currentRow.parentId, true)
333
- isFullyExpanded = row_getIsExpanded(row)
333
+ isFullyExpanded = row_getIsExpanded(currentRow)
334
334
  }
335
335
 
336
336
  return isFullyExpanded
@@ -109,26 +109,28 @@ function table_getPinnedRows<
109
109
  ): Array<Row<TFeatures, TData>> {
110
110
  const visibleRows = table.getRowModel().rows
111
111
  const pinnedRowIds = table.atoms.rowPinning?.get()?.[position] ?? []
112
+ const keepPinnedRows = table.options.keepPinnedRows ?? true
112
113
 
113
- const rows =
114
- (table.options.keepPinnedRows ?? true)
115
- ? // get all rows that are pinned even if they would not be otherwise visible
116
- // account for expanded parent rows, but not pagination or filtering
117
- pinnedRowIds.map((rowId) => {
118
- const row = table.getRow(rowId, true)
119
- return row_getIsAllParentsExpanded(row) ? row : null
120
- })
121
- : // else get only visible rows that are pinned
122
- pinnedRowIds.map(
123
- (rowId) => visibleRows.find((row) => row.id === rowId)!,
124
- )
125
-
126
- const filteredRows = rows.filter((r) => !!r)
127
- // Assign position property directly to preserve prototype chain
128
- filteredRows.forEach((row) => {
114
+ const result: Array<Row<TFeatures, TData>> = []
115
+ for (let i = 0; i < pinnedRowIds.length; i++) {
116
+ const rowId = pinnedRowIds[i]!
117
+ let row: Row<TFeatures, TData> | undefined
118
+ if (keepPinnedRows) {
119
+ // get all rows that are pinned even if they would not be otherwise
120
+ // visible; account for expanded parent rows, but not pagination/filtering
121
+ const fullRow = table.getRow(rowId, true)
122
+ if (row_getIsAllParentsExpanded(fullRow)) row = fullRow
123
+ } else {
124
+ // else get only visible rows that are pinned
125
+ row = visibleRows.find((r) => r.id === rowId)
126
+ }
127
+ if (!row)
128
+ continue
129
+ // Assign position property directly to preserve prototype chain
129
130
  ;(row as any).position = position
130
- })
131
- return filteredRows
131
+ result.push(row)
132
+ }
133
+ return result
132
134
  }
133
135
 
134
136
  /**
@@ -622,32 +622,33 @@ export function selectRowsFn<
622
622
  const newSelectedFlatRows: Array<Row<TFeatures, TData>> = []
623
623
  const newSelectedRowsById: Record<string, Row<TFeatures, TData>> = {}
624
624
 
625
- // Filters top level and nested rows
625
+ // Filters top level and nested rows.
626
626
  const recurseRows = (
627
627
  rows: Array<Row<TFeatures, TData>>,
628
628
  depth = 0,
629
629
  ): Array<Row<TFeatures, TData>> => {
630
- return rows
631
- .map((row) => {
632
- const isSelected = isRowSelected(row)
633
-
634
- if (isSelected) {
635
- newSelectedFlatRows.push(row)
636
- newSelectedRowsById[row.id] = row
637
- }
630
+ const result: Array<Row<TFeatures, TData>> = []
631
+ for (let i = 0; i < rows.length; i++) {
632
+ let row = rows[i]!
633
+ const isSelected = isRowSelected(row)
634
+
635
+ if (isSelected) {
636
+ newSelectedFlatRows.push(row)
637
+ newSelectedRowsById[row.id] = row
638
+ }
638
639
 
639
- if (row.subRows.length) {
640
- row = {
641
- ...row,
642
- subRows: recurseRows(row.subRows, depth + 1),
643
- }
640
+ if (row.subRows.length) {
641
+ row = {
642
+ ...row,
643
+ subRows: recurseRows(row.subRows, depth + 1),
644
644
  }
645
+ }
645
646
 
646
- if (isSelected) {
647
- return row
648
- }
649
- })
650
- .filter((x) => !!x)
647
+ if (isSelected) {
648
+ result.push(row)
649
+ }
650
+ }
651
+ return result
651
652
  }
652
653
 
653
654
  return {