@tanstack/table-core 9.0.0-beta.31 → 9.0.0-beta.33

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 (310) hide show
  1. package/dist/core/cells/constructCell.cjs +1 -4
  2. package/dist/core/cells/constructCell.cjs.map +1 -1
  3. package/dist/core/cells/constructCell.d.cts +1 -1
  4. package/dist/core/cells/constructCell.d.ts +1 -1
  5. package/dist/core/cells/constructCell.js +1 -4
  6. package/dist/core/cells/constructCell.js.map +1 -1
  7. package/dist/core/cells/coreCellsFeature.types.d.cts +1 -1
  8. package/dist/core/cells/coreCellsFeature.types.d.ts +1 -1
  9. package/dist/core/cells/coreCellsFeature.utils.d.cts +1 -1
  10. package/dist/core/cells/coreCellsFeature.utils.d.ts +1 -1
  11. package/dist/core/columns/constructColumn.cjs +3 -9
  12. package/dist/core/columns/constructColumn.cjs.map +1 -1
  13. package/dist/core/columns/constructColumn.js +3 -9
  14. package/dist/core/columns/constructColumn.js.map +1 -1
  15. package/dist/core/columns/coreColumnsFeature.cjs +12 -18
  16. package/dist/core/columns/coreColumnsFeature.cjs.map +1 -1
  17. package/dist/core/columns/coreColumnsFeature.js +12 -18
  18. package/dist/core/columns/coreColumnsFeature.js.map +1 -1
  19. package/dist/core/columns/coreColumnsFeature.utils.cjs +2 -6
  20. package/dist/core/columns/coreColumnsFeature.utils.cjs.map +1 -1
  21. package/dist/core/columns/coreColumnsFeature.utils.js +2 -6
  22. package/dist/core/columns/coreColumnsFeature.utils.js.map +1 -1
  23. package/dist/core/headers/buildHeaderGroups.cjs +1 -2
  24. package/dist/core/headers/buildHeaderGroups.cjs.map +1 -1
  25. package/dist/core/headers/buildHeaderGroups.js +1 -2
  26. package/dist/core/headers/buildHeaderGroups.js.map +1 -1
  27. package/dist/core/headers/constructHeader.cjs +1 -4
  28. package/dist/core/headers/constructHeader.cjs.map +1 -1
  29. package/dist/core/headers/constructHeader.js +1 -4
  30. package/dist/core/headers/constructHeader.js.map +1 -1
  31. package/dist/core/headers/coreHeadersFeature.cjs +8 -11
  32. package/dist/core/headers/coreHeadersFeature.cjs.map +1 -1
  33. package/dist/core/headers/coreHeadersFeature.js +8 -11
  34. package/dist/core/headers/coreHeadersFeature.js.map +1 -1
  35. package/dist/core/headers/coreHeadersFeature.utils.cjs +2 -4
  36. package/dist/core/headers/coreHeadersFeature.utils.cjs.map +1 -1
  37. package/dist/core/headers/coreHeadersFeature.utils.js +2 -4
  38. package/dist/core/headers/coreHeadersFeature.utils.js.map +1 -1
  39. package/dist/core/row-models/coreRowModelsFeature.types.d.cts +3 -3
  40. package/dist/core/row-models/coreRowModelsFeature.types.d.ts +3 -3
  41. package/dist/core/row-models/coreRowModelsFeature.utils.cjs +6 -24
  42. package/dist/core/row-models/coreRowModelsFeature.utils.cjs.map +1 -1
  43. package/dist/core/row-models/coreRowModelsFeature.utils.d.cts +1 -1
  44. package/dist/core/row-models/coreRowModelsFeature.utils.d.ts +1 -1
  45. package/dist/core/row-models/coreRowModelsFeature.utils.js +6 -24
  46. package/dist/core/row-models/coreRowModelsFeature.utils.js.map +1 -1
  47. package/dist/core/row-models/createCoreRowModel.cjs +2 -3
  48. package/dist/core/row-models/createCoreRowModel.cjs.map +1 -1
  49. package/dist/core/row-models/createCoreRowModel.d.cts +1 -1
  50. package/dist/core/row-models/createCoreRowModel.d.ts +1 -1
  51. package/dist/core/row-models/createCoreRowModel.js +2 -3
  52. package/dist/core/row-models/createCoreRowModel.js.map +1 -1
  53. package/dist/core/rows/constructRow.cjs +2 -8
  54. package/dist/core/rows/constructRow.cjs.map +1 -1
  55. package/dist/core/rows/constructRow.js +2 -8
  56. package/dist/core/rows/constructRow.js.map +1 -1
  57. package/dist/core/rows/coreRowsFeature.types.d.cts +1 -1
  58. package/dist/core/rows/coreRowsFeature.types.d.ts +1 -1
  59. package/dist/core/rows/coreRowsFeature.utils.cjs +3 -4
  60. package/dist/core/rows/coreRowsFeature.utils.cjs.map +1 -1
  61. package/dist/core/rows/coreRowsFeature.utils.d.cts +1 -1
  62. package/dist/core/rows/coreRowsFeature.utils.d.ts +1 -1
  63. package/dist/core/rows/coreRowsFeature.utils.js +3 -4
  64. package/dist/core/rows/coreRowsFeature.utils.js.map +1 -1
  65. package/dist/core/table/constructTable.cjs +4 -10
  66. package/dist/core/table/constructTable.cjs.map +1 -1
  67. package/dist/core/table/constructTable.js +4 -10
  68. package/dist/core/table/constructTable.js.map +1 -1
  69. package/dist/experimental-worker-plugin.cjs +14 -0
  70. package/dist/experimental-worker-plugin.d.cts +5 -0
  71. package/dist/experimental-worker-plugin.d.ts +5 -0
  72. package/dist/experimental-worker-plugin.js +6 -0
  73. package/dist/features/column-faceting/columnFacetingFeature.cjs +12 -18
  74. package/dist/features/column-faceting/columnFacetingFeature.cjs.map +1 -1
  75. package/dist/features/column-faceting/columnFacetingFeature.js +12 -18
  76. package/dist/features/column-faceting/columnFacetingFeature.js.map +1 -1
  77. package/dist/features/column-faceting/columnFacetingFeature.types.d.cts +1 -1
  78. package/dist/features/column-faceting/columnFacetingFeature.types.d.ts +1 -1
  79. package/dist/features/column-faceting/columnFacetingFeature.utils.cjs +7 -25
  80. package/dist/features/column-faceting/columnFacetingFeature.utils.cjs.map +1 -1
  81. package/dist/features/column-faceting/columnFacetingFeature.utils.d.cts +1 -1
  82. package/dist/features/column-faceting/columnFacetingFeature.utils.d.ts +1 -1
  83. package/dist/features/column-faceting/columnFacetingFeature.utils.js +7 -25
  84. package/dist/features/column-faceting/columnFacetingFeature.utils.js.map +1 -1
  85. package/dist/features/column-faceting/createFacetedRowModel.cjs +8 -14
  86. package/dist/features/column-faceting/createFacetedRowModel.cjs.map +1 -1
  87. package/dist/features/column-faceting/createFacetedRowModel.d.cts +1 -1
  88. package/dist/features/column-faceting/createFacetedRowModel.d.ts +1 -1
  89. package/dist/features/column-faceting/createFacetedRowModel.js +8 -14
  90. package/dist/features/column-faceting/createFacetedRowModel.js.map +1 -1
  91. package/dist/features/column-filtering/columnFilteringFeature.types.d.cts +1 -1
  92. package/dist/features/column-filtering/columnFilteringFeature.types.d.ts +1 -1
  93. package/dist/features/column-filtering/columnFilteringFeature.utils.cjs +10 -13
  94. package/dist/features/column-filtering/columnFilteringFeature.utils.cjs.map +1 -1
  95. package/dist/features/column-filtering/columnFilteringFeature.utils.js +10 -13
  96. package/dist/features/column-filtering/columnFilteringFeature.utils.js.map +1 -1
  97. package/dist/features/column-filtering/createFilteredRowModel.cjs +12 -18
  98. package/dist/features/column-filtering/createFilteredRowModel.cjs.map +1 -1
  99. package/dist/features/column-filtering/createFilteredRowModel.d.cts +1 -1
  100. package/dist/features/column-filtering/createFilteredRowModel.d.ts +1 -1
  101. package/dist/features/column-filtering/createFilteredRowModel.js +12 -18
  102. package/dist/features/column-filtering/createFilteredRowModel.js.map +1 -1
  103. package/dist/features/column-grouping/columnGroupingFeature.cjs +1 -4
  104. package/dist/features/column-grouping/columnGroupingFeature.cjs.map +1 -1
  105. package/dist/features/column-grouping/columnGroupingFeature.js +1 -4
  106. package/dist/features/column-grouping/columnGroupingFeature.js.map +1 -1
  107. package/dist/features/column-grouping/columnGroupingFeature.types.d.cts +4 -4
  108. package/dist/features/column-grouping/columnGroupingFeature.types.d.ts +4 -4
  109. package/dist/features/column-grouping/columnGroupingFeature.utils.cjs +8 -13
  110. package/dist/features/column-grouping/columnGroupingFeature.utils.cjs.map +1 -1
  111. package/dist/features/column-grouping/columnGroupingFeature.utils.d.cts +2 -2
  112. package/dist/features/column-grouping/columnGroupingFeature.utils.d.ts +2 -2
  113. package/dist/features/column-grouping/columnGroupingFeature.utils.js +8 -13
  114. package/dist/features/column-grouping/columnGroupingFeature.utils.js.map +1 -1
  115. package/dist/features/column-grouping/createGroupedRowModel.cjs +3 -7
  116. package/dist/features/column-grouping/createGroupedRowModel.cjs.map +1 -1
  117. package/dist/features/column-grouping/createGroupedRowModel.d.cts +1 -1
  118. package/dist/features/column-grouping/createGroupedRowModel.d.ts +1 -1
  119. package/dist/features/column-grouping/createGroupedRowModel.js +3 -7
  120. package/dist/features/column-grouping/createGroupedRowModel.js.map +1 -1
  121. package/dist/features/column-ordering/columnOrderingFeature.cjs +13 -19
  122. package/dist/features/column-ordering/columnOrderingFeature.cjs.map +1 -1
  123. package/dist/features/column-ordering/columnOrderingFeature.js +13 -19
  124. package/dist/features/column-ordering/columnOrderingFeature.js.map +1 -1
  125. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs +6 -11
  126. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs.map +1 -1
  127. package/dist/features/column-ordering/columnOrderingFeature.utils.js +6 -11
  128. package/dist/features/column-ordering/columnOrderingFeature.utils.js.map +1 -1
  129. package/dist/features/column-pinning/columnPinningFeature.cjs +78 -114
  130. package/dist/features/column-pinning/columnPinningFeature.cjs.map +1 -1
  131. package/dist/features/column-pinning/columnPinningFeature.js +78 -114
  132. package/dist/features/column-pinning/columnPinningFeature.js.map +1 -1
  133. package/dist/features/column-pinning/columnPinningFeature.types.d.cts +1 -1
  134. package/dist/features/column-pinning/columnPinningFeature.types.d.ts +1 -1
  135. package/dist/features/column-pinning/columnPinningFeature.utils.cjs +15 -28
  136. package/dist/features/column-pinning/columnPinningFeature.utils.cjs.map +1 -1
  137. package/dist/features/column-pinning/columnPinningFeature.utils.d.cts +2 -2
  138. package/dist/features/column-pinning/columnPinningFeature.utils.d.ts +2 -2
  139. package/dist/features/column-pinning/columnPinningFeature.utils.js +15 -28
  140. package/dist/features/column-pinning/columnPinningFeature.utils.js.map +1 -1
  141. package/dist/features/column-resizing/columnResizingFeature.utils.cjs +12 -16
  142. package/dist/features/column-resizing/columnResizingFeature.utils.cjs.map +1 -1
  143. package/dist/features/column-resizing/columnResizingFeature.utils.js +12 -16
  144. package/dist/features/column-resizing/columnResizingFeature.utils.js.map +1 -1
  145. package/dist/features/column-sizing/columnSizingFeature.cjs +24 -48
  146. package/dist/features/column-sizing/columnSizingFeature.cjs.map +1 -1
  147. package/dist/features/column-sizing/columnSizingFeature.js +24 -48
  148. package/dist/features/column-sizing/columnSizingFeature.js.map +1 -1
  149. package/dist/features/column-sizing/columnSizingFeature.utils.cjs +11 -18
  150. package/dist/features/column-sizing/columnSizingFeature.utils.cjs.map +1 -1
  151. package/dist/features/column-sizing/columnSizingFeature.utils.d.cts +1 -1
  152. package/dist/features/column-sizing/columnSizingFeature.utils.d.ts +1 -1
  153. package/dist/features/column-sizing/columnSizingFeature.utils.js +11 -18
  154. package/dist/features/column-sizing/columnSizingFeature.utils.js.map +1 -1
  155. package/dist/features/column-visibility/columnVisibilityFeature.cjs +25 -40
  156. package/dist/features/column-visibility/columnVisibilityFeature.cjs.map +1 -1
  157. package/dist/features/column-visibility/columnVisibilityFeature.js +25 -40
  158. package/dist/features/column-visibility/columnVisibilityFeature.js.map +1 -1
  159. package/dist/features/column-visibility/columnVisibilityFeature.types.d.cts +1 -1
  160. package/dist/features/column-visibility/columnVisibilityFeature.types.d.ts +1 -1
  161. package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs +3 -6
  162. package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs.map +1 -1
  163. package/dist/features/column-visibility/columnVisibilityFeature.utils.d.cts +1 -1
  164. package/dist/features/column-visibility/columnVisibilityFeature.utils.d.ts +1 -1
  165. package/dist/features/column-visibility/columnVisibilityFeature.utils.js +3 -6
  166. package/dist/features/column-visibility/columnVisibilityFeature.utils.js.map +1 -1
  167. package/dist/features/global-filtering/globalFilteringFeature.cjs +1 -2
  168. package/dist/features/global-filtering/globalFilteringFeature.cjs.map +1 -1
  169. package/dist/features/global-filtering/globalFilteringFeature.js +1 -2
  170. package/dist/features/global-filtering/globalFilteringFeature.js.map +1 -1
  171. package/dist/features/global-filtering/globalFilteringFeature.utils.cjs +3 -5
  172. package/dist/features/global-filtering/globalFilteringFeature.utils.cjs.map +1 -1
  173. package/dist/features/global-filtering/globalFilteringFeature.utils.js +3 -5
  174. package/dist/features/global-filtering/globalFilteringFeature.utils.js.map +1 -1
  175. package/dist/features/row-expanding/createExpandedRowModel.cjs +6 -10
  176. package/dist/features/row-expanding/createExpandedRowModel.cjs.map +1 -1
  177. package/dist/features/row-expanding/createExpandedRowModel.d.cts +1 -1
  178. package/dist/features/row-expanding/createExpandedRowModel.d.ts +1 -1
  179. package/dist/features/row-expanding/createExpandedRowModel.js +6 -10
  180. package/dist/features/row-expanding/createExpandedRowModel.js.map +1 -1
  181. package/dist/features/row-expanding/rowExpandingFeature.types.d.cts +1 -1
  182. package/dist/features/row-expanding/rowExpandingFeature.types.d.ts +1 -1
  183. package/dist/features/row-expanding/rowExpandingFeature.utils.cjs +8 -15
  184. package/dist/features/row-expanding/rowExpandingFeature.utils.cjs.map +1 -1
  185. package/dist/features/row-expanding/rowExpandingFeature.utils.js +8 -15
  186. package/dist/features/row-expanding/rowExpandingFeature.utils.js.map +1 -1
  187. package/dist/features/row-pagination/createPaginatedRowModel.cjs +6 -10
  188. package/dist/features/row-pagination/createPaginatedRowModel.cjs.map +1 -1
  189. package/dist/features/row-pagination/createPaginatedRowModel.d.cts +1 -1
  190. package/dist/features/row-pagination/createPaginatedRowModel.d.ts +1 -1
  191. package/dist/features/row-pagination/createPaginatedRowModel.js +6 -10
  192. package/dist/features/row-pagination/createPaginatedRowModel.js.map +1 -1
  193. package/dist/features/row-pagination/rowPaginationFeature.types.d.cts +1 -1
  194. package/dist/features/row-pagination/rowPaginationFeature.types.d.ts +1 -1
  195. package/dist/features/row-pagination/rowPaginationFeature.utils.cjs +8 -14
  196. package/dist/features/row-pagination/rowPaginationFeature.utils.cjs.map +1 -1
  197. package/dist/features/row-pagination/rowPaginationFeature.utils.js +8 -14
  198. package/dist/features/row-pagination/rowPaginationFeature.utils.js.map +1 -1
  199. package/dist/features/row-pinning/rowPinningFeature.cjs +4 -16
  200. package/dist/features/row-pinning/rowPinningFeature.cjs.map +1 -1
  201. package/dist/features/row-pinning/rowPinningFeature.js +4 -16
  202. package/dist/features/row-pinning/rowPinningFeature.js.map +1 -1
  203. package/dist/features/row-pinning/rowPinningFeature.utils.cjs +7 -12
  204. package/dist/features/row-pinning/rowPinningFeature.utils.cjs.map +1 -1
  205. package/dist/features/row-pinning/rowPinningFeature.utils.js +7 -12
  206. package/dist/features/row-pinning/rowPinningFeature.utils.js.map +1 -1
  207. package/dist/features/row-selection/rowSelectionFeature.cjs +30 -60
  208. package/dist/features/row-selection/rowSelectionFeature.cjs.map +1 -1
  209. package/dist/features/row-selection/rowSelectionFeature.js +30 -60
  210. package/dist/features/row-selection/rowSelectionFeature.js.map +1 -1
  211. package/dist/features/row-selection/rowSelectionFeature.types.d.cts +1 -1
  212. package/dist/features/row-selection/rowSelectionFeature.types.d.ts +1 -1
  213. package/dist/features/row-selection/rowSelectionFeature.utils.cjs +10 -17
  214. package/dist/features/row-selection/rowSelectionFeature.utils.cjs.map +1 -1
  215. package/dist/features/row-selection/rowSelectionFeature.utils.d.cts +1 -1
  216. package/dist/features/row-selection/rowSelectionFeature.utils.d.ts +1 -1
  217. package/dist/features/row-selection/rowSelectionFeature.utils.js +10 -17
  218. package/dist/features/row-selection/rowSelectionFeature.utils.js.map +1 -1
  219. package/dist/features/row-sorting/createSortedRowModel.cjs +3 -7
  220. package/dist/features/row-sorting/createSortedRowModel.cjs.map +1 -1
  221. package/dist/features/row-sorting/createSortedRowModel.d.cts +1 -1
  222. package/dist/features/row-sorting/createSortedRowModel.d.ts +1 -1
  223. package/dist/features/row-sorting/createSortedRowModel.js +3 -7
  224. package/dist/features/row-sorting/createSortedRowModel.js.map +1 -1
  225. package/dist/features/row-sorting/rowSortingFeature.types.d.cts +2 -2
  226. package/dist/features/row-sorting/rowSortingFeature.types.d.ts +2 -2
  227. package/dist/features/row-sorting/rowSortingFeature.utils.cjs +9 -13
  228. package/dist/features/row-sorting/rowSortingFeature.utils.cjs.map +1 -1
  229. package/dist/features/row-sorting/rowSortingFeature.utils.js +9 -13
  230. package/dist/features/row-sorting/rowSortingFeature.utils.js.map +1 -1
  231. package/dist/flex-render.d.cts +1 -1
  232. package/dist/flex-render.d.ts +1 -1
  233. package/dist/fns/filterFns.cjs +8 -12
  234. package/dist/fns/filterFns.cjs.map +1 -1
  235. package/dist/fns/filterFns.js +8 -12
  236. package/dist/fns/filterFns.js.map +1 -1
  237. package/dist/index.d.cts +16 -16
  238. package/dist/index.d.ts +16 -16
  239. package/dist/store-reactivity-bindings.cjs +2 -2
  240. package/dist/store-reactivity-bindings.cjs.map +1 -1
  241. package/dist/store-reactivity-bindings.js +2 -2
  242. package/dist/store-reactivity-bindings.js.map +1 -1
  243. package/dist/types/Cell.d.cts +1 -1
  244. package/dist/types/Cell.d.ts +1 -1
  245. package/dist/types/Column.d.cts +7 -7
  246. package/dist/types/Column.d.ts +7 -7
  247. package/dist/types/ColumnDef.d.cts +6 -6
  248. package/dist/types/ColumnDef.d.ts +6 -6
  249. package/dist/types/Header.d.cts +1 -1
  250. package/dist/types/Header.d.ts +1 -1
  251. package/dist/types/Row.d.cts +2 -2
  252. package/dist/types/Row.d.ts +2 -2
  253. package/dist/types/RowModel.d.cts +4 -4
  254. package/dist/types/RowModel.d.ts +4 -4
  255. package/dist/types/RowModelFns.d.cts +2 -2
  256. package/dist/types/RowModelFns.d.ts +2 -2
  257. package/dist/types/Table.d.cts +9 -9
  258. package/dist/types/Table.d.ts +9 -9
  259. package/dist/types/TableFeatures.d.cts +4 -4
  260. package/dist/types/TableFeatures.d.ts +4 -4
  261. package/dist/types/TableOptions.d.cts +7 -7
  262. package/dist/types/TableOptions.d.ts +7 -7
  263. package/dist/types/TableState.d.cts +6 -6
  264. package/dist/types/TableState.d.ts +6 -6
  265. package/dist/utils.cjs +9 -12
  266. package/dist/utils.cjs.map +1 -1
  267. package/dist/utils.js +9 -12
  268. package/dist/utils.js.map +1 -1
  269. package/dist/worker/createTableWorker.cjs +189 -0
  270. package/dist/worker/createTableWorker.cjs.map +1 -0
  271. package/dist/worker/createTableWorker.d.cts +102 -0
  272. package/dist/worker/createTableWorker.d.ts +102 -0
  273. package/dist/worker/createTableWorker.js +186 -0
  274. package/dist/worker/createTableWorker.js.map +1 -0
  275. package/dist/worker/createWorkerRowModel.cjs +78 -0
  276. package/dist/worker/createWorkerRowModel.cjs.map +1 -0
  277. package/dist/worker/createWorkerRowModel.d.cts +42 -0
  278. package/dist/worker/createWorkerRowModel.d.ts +42 -0
  279. package/dist/worker/createWorkerRowModel.js +78 -0
  280. package/dist/worker/createWorkerRowModel.js.map +1 -0
  281. package/dist/worker/initTableWorker.cjs +100 -0
  282. package/dist/worker/initTableWorker.cjs.map +1 -0
  283. package/dist/worker/initTableWorker.d.cts +33 -0
  284. package/dist/worker/initTableWorker.d.ts +33 -0
  285. package/dist/worker/initTableWorker.js +100 -0
  286. package/dist/worker/initTableWorker.js.map +1 -0
  287. package/dist/worker/rebuildRowModel.cjs +72 -0
  288. package/dist/worker/rebuildRowModel.cjs.map +1 -0
  289. package/dist/worker/rebuildRowModel.d.cts +9 -0
  290. package/dist/worker/rebuildRowModel.d.ts +9 -0
  291. package/dist/worker/rebuildRowModel.js +72 -0
  292. package/dist/worker/rebuildRowModel.js.map +1 -0
  293. package/dist/worker/serializeRowModel.cjs +53 -0
  294. package/dist/worker/serializeRowModel.cjs.map +1 -0
  295. package/dist/worker/serializeRowModel.js +52 -0
  296. package/dist/worker/serializeRowModel.js.map +1 -0
  297. package/dist/worker/tableWorkerProtocol.cjs +29 -0
  298. package/dist/worker/tableWorkerProtocol.cjs.map +1 -0
  299. package/dist/worker/tableWorkerProtocol.d.cts +88 -0
  300. package/dist/worker/tableWorkerProtocol.d.ts +88 -0
  301. package/dist/worker/tableWorkerProtocol.js +27 -0
  302. package/dist/worker/tableWorkerProtocol.js.map +1 -0
  303. package/package.json +6 -2
  304. package/src/experimental-worker-plugin.ts +22 -0
  305. package/src/worker/createTableWorker.ts +357 -0
  306. package/src/worker/createWorkerRowModel.ts +121 -0
  307. package/src/worker/initTableWorker.ts +164 -0
  308. package/src/worker/rebuildRowModel.ts +117 -0
  309. package/src/worker/serializeRowModel.ts +80 -0
  310. package/src/worker/tableWorkerProtocol.ts +105 -0
@@ -0,0 +1,121 @@
1
+ import { tableMemo } from '../utils'
2
+ import { getTableWorkerBridge, syncTableWorker } from './createTableWorker'
3
+ import { rebuildRowModel } from './rebuildRowModel'
4
+ import { tableWorkerPipeline } from './tableWorkerProtocol'
5
+ import type { RowModel } from '../core/row-models/coreRowModelsFeature.types'
6
+ import type { Table, Table_Internal } from '../types/Table'
7
+ import type { TableFeatures } from '../types/TableFeatures'
8
+ import type { RowData } from '../types/type-utils'
9
+ import type { TableWorker } from './createTableWorker'
10
+ import type { TableWorkerStage } from './tableWorkerProtocol'
11
+
12
+ type AnyTable = Table_Internal<any, any>
13
+
14
+ function capitalize(stage: string) {
15
+ return stage.charAt(0).toUpperCase() + stage.slice(1)
16
+ }
17
+
18
+ /**
19
+ * Turns any row model stage into a worker-backed one. The returned factory
20
+ * plugs into the standard feature slot for that stage, so it composes with
21
+ * the rest of the pipeline exactly like the sync factory it replaces.
22
+ *
23
+ * Register only the stages you want offloaded; each import is independent and
24
+ * tree-shakable. All stages on a table share one worker and one round trip
25
+ * per state change via the `tableWorker` handle. Until a result lands, the
26
+ * stage returns its pre-stage model (stale-while-revalidate).
27
+ *
28
+ * Offloaded stages must form a contiguous prefix of the pipeline
29
+ * (filtered -> grouped -> sorted -> expanded): a stage's worker result encodes
30
+ * everything upstream as computed in the worker, so any upstream stage
31
+ * registered on the main thread must be offloaded too. A dev warning fires on
32
+ * mismatches.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const tableWorker = createTableWorker({ createWorker })
37
+ *
38
+ * const features = tableFeatures({
39
+ * rowSortingFeature,
40
+ * columnGroupingFeature,
41
+ * workerRowModelsFeature,
42
+ * filteredRowModel: createWorkerRowModel(tableWorker, 'filtered'),
43
+ * groupedRowModel: createWorkerRowModel(tableWorker, 'grouped'),
44
+ * sortedRowModel: createWorkerRowModel(tableWorker, 'sorted'),
45
+ * })
46
+ * ```
47
+ */
48
+ export function createWorkerRowModel(
49
+ tableWorker: TableWorker,
50
+ stage: TableWorkerStage,
51
+ ) {
52
+ return <TFeatures extends TableFeatures, TData extends RowData>(
53
+ _table: Table<TFeatures, TData>,
54
+ ): (() => RowModel<TFeatures, TData>) => {
55
+ const table = _table as unknown as AnyTable
56
+ // Stages register per table as their factories initialize (first read).
57
+ // The first render may therefore fire one extra coalesced request while
58
+ // the stage set grows; single-flight makes it a cheap trailing request.
59
+ getTableWorkerBridge(tableWorker, table).stages.add(stage)
60
+ let warned = false
61
+
62
+ const warnOnce = (message: string) => {
63
+ if (process.env.NODE_ENV === 'development' && !warned) {
64
+ warned = true
65
+ console.warn(`[table-worker] ${message}`)
66
+ }
67
+ }
68
+
69
+ const memoized = tableMemo({
70
+ table,
71
+ fnName: `table.get${capitalize(stage)}RowModel`,
72
+ // The per-stage version bumps only when this stage's payload actually
73
+ // changed, so stages the worker reported as `unchanged` skip the O(n)
74
+ // rebuild entirely (the re-render itself rides the state slice bump).
75
+ memoDeps: () => [
76
+ table.getCoreRowModel(),
77
+ getTableWorkerBridge(tableWorker, table).stageVersions[stage],
78
+ ],
79
+ fn: () => {
80
+ const bridge = getTableWorkerBridge(tableWorker, table)
81
+ const payload = bridge.results[stage]
82
+ if (!payload) {
83
+ if (bridge.resultRequestId > 0) {
84
+ warnOnce(
85
+ `The worker returned no '${stage}' result. Make sure the ` +
86
+ `worker's initTableWorker() config registers a ` +
87
+ `${stage}RowModel factory.`,
88
+ )
89
+ }
90
+ return (table as any)[`getPre${capitalize(stage)}RowModel`]()
91
+ }
92
+ // Contiguous-prefix check: any upstream stage registered on this
93
+ // table must also have a worker result, or it is silently bypassed.
94
+ if (bridge.resultRequestId > 0) {
95
+ for (const upstream of tableWorkerPipeline) {
96
+ if (upstream === stage) break
97
+ if (
98
+ (table.options.features as Record<string, unknown>)[
99
+ `${upstream}RowModel`
100
+ ] &&
101
+ !bridge.results[upstream]
102
+ ) {
103
+ warnOnce(
104
+ `This table has a ${upstream}RowModel, but the worker result ` +
105
+ `for '${stage}' was computed without an offloaded ` +
106
+ `'${upstream}' stage, so it is bypassed. Offload it too ` +
107
+ `with createWorkerRowModel(tableWorker, '${upstream}').`,
108
+ )
109
+ }
110
+ }
111
+ }
112
+ return rebuildRowModel(table, payload, stage !== 'filtered')
113
+ },
114
+ })
115
+
116
+ return () => {
117
+ syncTableWorker(tableWorker, table)
118
+ return memoized()
119
+ }
120
+ }
121
+ }
@@ -0,0 +1,164 @@
1
+ import { constructTable } from '../core/table/constructTable'
2
+ import { storeReactivityBindings } from '../store-reactivity-bindings'
3
+ import { makeObjectMap } from '../utils'
4
+ import { serializeRowModel } from './serializeRowModel'
5
+ import type { RowData } from '../types/type-utils'
6
+ import type { TableFeatures } from '../types/TableFeatures'
7
+ import type { TableOptions } from '../types/TableOptions'
8
+ import type { Table_Internal } from '../types/Table'
9
+ import type {
10
+ TableWorkerRequest,
11
+ TableWorkerResult,
12
+ TableWorkerStage,
13
+ TableWorkerStagePayload,
14
+ } from './tableWorkerProtocol'
15
+
16
+ export type TableWorkerConfig<
17
+ TFeatures extends TableFeatures,
18
+ TData extends RowData,
19
+ > = Omit<TableOptions<TFeatures, TData>, 'data'>
20
+
21
+ function capitalize(stage: string) {
22
+ return stage.charAt(0).toUpperCase() + stage.slice(1)
23
+ }
24
+
25
+ /** Flatten column-group defs to leaf defs (mirrors core's id resolution). */
26
+ function flattenColumnDefs(defs: Array<any>): Array<any> {
27
+ return defs.flatMap((def) =>
28
+ def.columns ? flattenColumnDefs(def.columns) : [def],
29
+ )
30
+ }
31
+
32
+ /**
33
+ * Runs a headless "shadow table" inside a dedicated Web Worker.
34
+ *
35
+ * Call this from a user-authored worker entry file, passing the same columns
36
+ * and processing features used on the main thread. The shadow table runs the
37
+ * real table-core row model pipeline (real fns, real Row objects) off the
38
+ * main thread and posts back one payload per stage the main thread requested:
39
+ * a transferable index permutation for flat results, a serialized row tree
40
+ * (with eagerly computed aggregates) when grouping produces synthetic rows.
41
+ *
42
+ * Everything passed here must be thread-portable: `accessorKey` columns or
43
+ * accessors defined in a shared module, and fns from registries or shared
44
+ * modules (no closures over app state).
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * // table.worker.ts
49
+ * import { initTableWorker } from '@tanstack/table-core/experimental-worker-plugin'
50
+ * import { columns, sharedFeatures } from './tableConfig'
51
+ *
52
+ * initTableWorker({ features: sharedFeatures, columns })
53
+ * ```
54
+ */
55
+ export function initTableWorker<
56
+ TFeatures extends TableFeatures,
57
+ TData extends RowData,
58
+ >(config: TableWorkerConfig<TFeatures, TData>): void {
59
+ let table: Table_Internal<TFeatures, TData> | undefined
60
+ let dataVersion = 0
61
+ let coreIndexById: Record<string, number> = makeObjectMap()
62
+ let aggregateColumnIds: Array<string> = []
63
+ // Last-sent model identity per stage: the memoized getters return stable
64
+ // objects when their inputs did not change, so identity equality is exactly
65
+ // "this stage's result is unchanged".
66
+ let lastSentModels: { [K in TableWorkerStage]?: unknown } = {}
67
+
68
+ self.onmessage = (event: MessageEvent<TableWorkerRequest<TData>>) => {
69
+ const message = event.data
70
+
71
+ if (message.type === 'data') {
72
+ dataVersion = message.dataVersion
73
+ lastSentModels = {}
74
+ if (!table) {
75
+ table = constructTable<TFeatures, TData>({
76
+ ...(config as TableOptions<TFeatures, TData>),
77
+ features: {
78
+ coreReactivityFeature: storeReactivityBindings(),
79
+ ...config.features,
80
+ },
81
+ data: message.data,
82
+ }) as unknown as Table_Internal<TFeatures, TData>
83
+ // Only columns with an explicit aggregation get eagerly aggregated
84
+ // per group. Sync tables aggregate lazily (visible cells only), so
85
+ // auto-aggregating every column would explode on high-cardinality
86
+ // grouping for values nothing renders. Read the RAW column defs:
87
+ // columnGroupingFeature injects default aggregatedCell/aggregationFn
88
+ // into every resolved columnDef, so the resolved defs can't tell
89
+ // explicit from default.
90
+ aggregateColumnIds = flattenColumnDefs(config.columns as Array<any>)
91
+ .filter(
92
+ (def) => def.aggregationFn != null || def.aggregatedCell != null,
93
+ )
94
+ .map(
95
+ (def) =>
96
+ def.id ??
97
+ (typeof def.accessorKey === 'string'
98
+ ? def.accessorKey.replaceAll('.', '_')
99
+ : undefined),
100
+ )
101
+ .filter((id): id is string => id != null)
102
+ } else {
103
+ table.setOptions((prev) => ({ ...prev, data: message.data }))
104
+ }
105
+ // Map row ids to data positions once per dataset; serialization uses it
106
+ // to express every stage result in terms of core row positions.
107
+ const coreFlatRows = table.getCoreRowModel().flatRows
108
+ coreIndexById = makeObjectMap()
109
+ for (let i = 0; i < coreFlatRows.length; i++) {
110
+ coreIndexById[coreFlatRows[i]!.id] = i
111
+ }
112
+ return
113
+ }
114
+
115
+ if (!table) return
116
+
117
+ const start = performance.now()
118
+
119
+ // Apply the serializable state slices to the shadow table's base atoms.
120
+ table._reactivity.batch(() => {
121
+ for (const [key, value] of Object.entries(message.state)) {
122
+ const baseAtom = (table!.baseAtoms as Record<string, any>)[key]
123
+ if (baseAtom && value !== undefined) {
124
+ baseAtom.set(value)
125
+ }
126
+ }
127
+ })
128
+
129
+ // Compute exactly the stages the main thread requested, skipping any this
130
+ // shadow table has no row model factory for (the main thread warns).
131
+ const stages: { [K in TableWorkerStage]?: TableWorkerStagePayload } = {}
132
+ const transfer: Array<Transferable> = []
133
+
134
+ for (const stage of message.stages) {
135
+ if (!(config.features as Record<string, unknown>)[`${stage}RowModel`]) {
136
+ continue
137
+ }
138
+ const model = (table as any)[`get${capitalize(stage)}RowModel`]()
139
+ // Memoized getters return the same object when inputs are unchanged;
140
+ // skip re-serializing (and the main thread skips rebuilding). Safe under
141
+ // single-flight: results are never dropped within a dataVersion.
142
+ if (lastSentModels[stage] === model) {
143
+ stages[stage] = { kind: 'unchanged' }
144
+ continue
145
+ }
146
+ lastSentModels[stage] = model
147
+ stages[stage] = serializeRowModel(
148
+ model,
149
+ coreIndexById,
150
+ aggregateColumnIds,
151
+ transfer,
152
+ )
153
+ }
154
+
155
+ const response: TableWorkerResult = {
156
+ type: 'result',
157
+ requestId: message.requestId,
158
+ dataVersion,
159
+ stages,
160
+ computeMs: performance.now() - start,
161
+ }
162
+ postMessage(response, { transfer })
163
+ }
164
+ }
@@ -0,0 +1,117 @@
1
+ import { constructRow } from '../core/rows/constructRow'
2
+ import { hasOwn } from '../utils'
3
+ import type { RowModel } from '../core/row-models/coreRowModelsFeature.types'
4
+ import type { Table_Internal } from '../types/Table'
5
+ import type {
6
+ TableWorkerRowNode,
7
+ TableWorkerStagePayload,
8
+ } from './tableWorkerProtocol'
9
+
10
+ /** Payloads that carry data; `unchanged` never reaches the rebuilder. */
11
+ export type TableWorkerDataPayload = Exclude<
12
+ TableWorkerStagePayload,
13
+ { kind: 'unchanged' }
14
+ >
15
+
16
+ type AnyTable = Table_Internal<any, any>
17
+
18
+ // Main-thread side: payload + this table's core rows -> RowModel. Mirrors how
19
+ // the sync row models treat rows: data rows are reused (with depth/parentId
20
+ // rewritten, exactly like createGroupedRowModel does), synthetic group rows
21
+ // are reconstructed via constructRow with their worker-computed aggregates
22
+ // pre-seeded so no aggregation ever runs on the main thread.
23
+
24
+ function collectLeafRows(subRows: Array<any>, out: Array<any>) {
25
+ for (let i = 0; i < subRows.length; i++) {
26
+ const row = subRows[i]
27
+ if (row.groupingColumnId == null) {
28
+ out.push(row)
29
+ } else {
30
+ collectLeafRows(row.subRows, out)
31
+ }
32
+ }
33
+ }
34
+
35
+ export function rebuildRowModel(
36
+ table: AnyTable,
37
+ payload: TableWorkerDataPayload,
38
+ /**
39
+ * Whether a flat payload should rewrite row depth/parentId. Mirrors core:
40
+ * the grouped model's passthrough resets them, the filtered model never
41
+ * touches them. Without this distinction a filtered rebuild could zero the
42
+ * depths a grouped/sorted tree rebuild just assigned to shared row objects.
43
+ */
44
+ resetDepths: boolean,
45
+ ): RowModel<any, any> {
46
+ const core = table.getCoreRowModel()
47
+
48
+ if (payload.kind === 'flat') {
49
+ const { indices } = payload
50
+ const rows = new Array(indices.length)
51
+ for (let i = 0; i < indices.length; i++) {
52
+ const row: any = core.flatRows[indices[i]!]!
53
+ if (resetDepths) {
54
+ row.depth = 0
55
+ row.parentId = undefined
56
+ }
57
+ rows[i] = row
58
+ }
59
+ return { rows, flatRows: rows, rowsById: core.rowsById }
60
+ }
61
+
62
+ const flatRows: Array<any> = []
63
+ // Data rows resolve through the prototype chain to the core map; only
64
+ // synthetic group rows are added on top.
65
+ const rowsById: Record<string, any> = Object.create(core.rowsById)
66
+
67
+ const rebuildRows = (
68
+ nodes: Array<TableWorkerRowNode>,
69
+ depth: number,
70
+ parentId: string | undefined,
71
+ ): Array<any> => {
72
+ const rows = new Array(nodes.length)
73
+ for (let i = 0; i < nodes.length; i++) {
74
+ const node = nodes[i]!
75
+ if (typeof node === 'number') {
76
+ const row: any = core.flatRows[node]!
77
+ row.depth = depth
78
+ row.parentId = parentId
79
+ flatRows.push(row)
80
+ rows[i] = row
81
+ continue
82
+ }
83
+
84
+ const subRows = rebuildRows(node.children, depth + 1, node.id)
85
+ const leafRows: Array<any> = []
86
+ collectLeafRows(subRows, leafRows)
87
+
88
+ const row: any = constructRow(
89
+ table,
90
+ node.id,
91
+ leafRows[0]?.original,
92
+ node.index,
93
+ depth,
94
+ undefined,
95
+ parentId,
96
+ )
97
+ const aggregates = node.aggregates
98
+ Object.assign(row, {
99
+ groupingColumnId: node.groupingColumnId,
100
+ groupingValue: node.groupingValue,
101
+ subRows,
102
+ leafRows,
103
+ getValue: (columnId: string) =>
104
+ hasOwn(aggregates, columnId) ? aggregates[columnId] : undefined,
105
+ })
106
+
107
+ flatRows.push(row)
108
+ rowsById[node.id] = row
109
+ rows[i] = row
110
+ }
111
+ return rows
112
+ }
113
+
114
+ const rows = rebuildRows(payload.children, 0, undefined)
115
+
116
+ return { rows, flatRows, rowsById }
117
+ }
@@ -0,0 +1,80 @@
1
+ import type { RowModel } from '../core/row-models/coreRowModelsFeature.types'
2
+ import type {
3
+ TableWorkerRowNode,
4
+ TableWorkerStagePayload,
5
+ } from './tableWorkerProtocol'
6
+
7
+ // Worker-side: RowModel -> transferable payload. Stage-agnostic; the payload
8
+ // kind is chosen from the model's shape (synthetic rows present or not).
9
+
10
+ function isCloneSafe(value: unknown): boolean {
11
+ return typeof value !== 'function' && typeof value !== 'symbol'
12
+ }
13
+
14
+ function serializeRows(
15
+ rows: Array<any>,
16
+ coreIndexById: Record<string, number>,
17
+ aggregateColumnIds: Array<string>,
18
+ ): Array<TableWorkerRowNode> {
19
+ const nodes = new Array<TableWorkerRowNode>(rows.length)
20
+ for (let i = 0; i < rows.length; i++) {
21
+ const row = rows[i]
22
+ if (row.groupingColumnId == null) {
23
+ // Data row: its position in `options.data` is all the main thread needs.
24
+ nodes[i] = coreIndexById[row.id]!
25
+ continue
26
+ }
27
+ // Synthetic group row: compute aggregates eagerly (the expensive per-group
28
+ // work we want off the main thread), but only for columns with an explicit
29
+ // aggregation; sync tables aggregate lazily, so eagerly auto-aggregating
30
+ // every column would explode on high-cardinality grouping.
31
+ const aggregates: Record<string, unknown> = {}
32
+ for (let c = 0; c < aggregateColumnIds.length; c++) {
33
+ const columnId = aggregateColumnIds[c]!
34
+ const value = row.getValue(columnId)
35
+ if (value !== undefined && isCloneSafe(value)) {
36
+ aggregates[columnId] = value
37
+ }
38
+ }
39
+ // The group's own column always serializes its display value (the first
40
+ // leaf's value) so grouped cells render.
41
+ if (!(row.groupingColumnId in aggregates)) {
42
+ const value = row.getValue(row.groupingColumnId)
43
+ if (value !== undefined && isCloneSafe(value)) {
44
+ aggregates[row.groupingColumnId] = value
45
+ }
46
+ }
47
+ nodes[i] = {
48
+ id: row.id,
49
+ groupingColumnId: row.groupingColumnId,
50
+ groupingValue: row.groupingValue,
51
+ index: row.index,
52
+ aggregates,
53
+ children: serializeRows(row.subRows, coreIndexById, aggregateColumnIds),
54
+ }
55
+ }
56
+ return nodes
57
+ }
58
+
59
+ export function serializeRowModel(
60
+ model: RowModel<any, any>,
61
+ coreIndexById: Record<string, number>,
62
+ aggregateColumnIds: Array<string>,
63
+ transfer: Array<Transferable>,
64
+ ): TableWorkerStagePayload {
65
+ // Flat fast path: no synthetic rows anywhere (flatRows === rows for flat
66
+ // data). A Uint32Array permutation transfers at zero-copy cost.
67
+ if (model.flatRows.length === model.rows.length) {
68
+ const indices = new Uint32Array(model.rows.length)
69
+ for (let i = 0; i < indices.length; i++) {
70
+ indices[i] = coreIndexById[model.rows[i]!.id]!
71
+ }
72
+ transfer.push(indices.buffer)
73
+ return { kind: 'flat', indices }
74
+ }
75
+
76
+ return {
77
+ kind: 'tree',
78
+ children: serializeRows(model.rows, coreIndexById, aggregateColumnIds),
79
+ }
80
+ }
@@ -0,0 +1,105 @@
1
+ import type { RowData } from '../types/type-utils'
2
+
3
+ /**
4
+ * Row model stages that can be offloaded to the worker, in pipeline order.
5
+ * Everything else in this module is derived from this list; adding a stage
6
+ * means adding an entry here and to `tableWorkerStageStateDeps`.
7
+ */
8
+ export const tableWorkerPipeline = [
9
+ 'filtered',
10
+ 'grouped',
11
+ 'sorted',
12
+ 'expanded',
13
+ ] as const
14
+
15
+ export type TableWorkerStage = (typeof tableWorkerPipeline)[number]
16
+
17
+ /**
18
+ * The state slices each stage's computation depends on. The main thread sends
19
+ * the union of deps for its registered stages; a change to any of them
20
+ * triggers one worker round trip.
21
+ */
22
+ export const tableWorkerStageStateDeps: Record<
23
+ TableWorkerStage,
24
+ Array<string>
25
+ > = {
26
+ filtered: ['columnFilters', 'globalFilter'],
27
+ grouped: ['grouping'],
28
+ sorted: ['sorting'],
29
+ expanded: ['expanded'],
30
+ }
31
+
32
+ /**
33
+ * A serialized synthetic (group) row. Leaf rows serialize as their position in
34
+ * `options.data`; group rows carry what `constructRow` + the grouped row model
35
+ * need to rebuild them, plus eagerly computed aggregate values so no
36
+ * aggregation runs on the main thread.
37
+ */
38
+ export interface TableWorkerGroupNode {
39
+ id: string
40
+ groupingColumnId: string
41
+ groupingValue: unknown
42
+ index: number
43
+ aggregates: Record<string, unknown>
44
+ children: Array<TableWorkerRowNode>
45
+ }
46
+
47
+ export type TableWorkerRowNode = number | TableWorkerGroupNode
48
+
49
+ /**
50
+ * A stage result. Flat models (every row is a data row) travel as a
51
+ * transferable index permutation; models containing synthetic rows (grouping)
52
+ * travel as a tree. The kind is chosen from the model's actual shape at
53
+ * runtime, not from the stage name: a sorted model is flat without grouping
54
+ * and a tree with it.
55
+ *
56
+ * `unchanged` means the stage's model is identical to the last one sent for
57
+ * this dataset (its memoized inputs did not change); the main thread keeps
58
+ * its previous result and skips the rebuild entirely.
59
+ */
60
+ export type TableWorkerStagePayload =
61
+ | { kind: 'flat'; indices: Uint32Array }
62
+ | { kind: 'tree'; children: Array<TableWorkerRowNode> }
63
+ | { kind: 'unchanged' }
64
+
65
+ export type TableWorkerRequest<TData extends RowData = any> =
66
+ | {
67
+ type: 'data'
68
+ dataVersion: number
69
+ data: Array<TData>
70
+ }
71
+ | {
72
+ type: 'process'
73
+ requestId: number
74
+ dataVersion: number
75
+ /** The stages the main thread has worker-backed row models for. */
76
+ stages: Array<TableWorkerStage>
77
+ /** Serializable state slices (union of the stages' deps). */
78
+ state: Record<string, unknown>
79
+ }
80
+
81
+ export interface TableWorkerResult {
82
+ type: 'result'
83
+ requestId: number
84
+ dataVersion: number
85
+ stages: { [K in TableWorkerStage]?: TableWorkerStagePayload }
86
+ computeMs: number
87
+ }
88
+
89
+ export type TableWorkerResponse = TableWorkerResult
90
+
91
+ /**
92
+ * The state slice added by `workerRowModelsFeature`. `version` bumps when a
93
+ * worker result lands (driving re-renders through the normal state path);
94
+ * `isPending` is true while a request is in flight. The timing fields expose
95
+ * the last result's worker compute time and full round trip for devtools and
96
+ * debugging.
97
+ */
98
+ export interface TableState_WorkerRowModels {
99
+ workerRowModels: {
100
+ version: number
101
+ isPending: boolean
102
+ lastComputeMs?: number
103
+ lastRoundTripMs?: number
104
+ }
105
+ }