@tanstack/table-core 9.0.0-beta.5 → 9.0.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/core/cells/constructCell.cjs +1 -4
- package/dist/core/cells/constructCell.cjs.map +1 -1
- package/dist/core/cells/constructCell.d.cts +4 -4
- package/dist/core/cells/constructCell.d.ts +4 -4
- package/dist/core/cells/constructCell.js +1 -4
- package/dist/core/cells/constructCell.js.map +1 -1
- package/dist/core/cells/coreCellsFeature.types.d.cts +7 -7
- package/dist/core/cells/coreCellsFeature.types.d.ts +7 -7
- package/dist/core/cells/coreCellsFeature.utils.d.cts +4 -4
- package/dist/core/cells/coreCellsFeature.utils.d.ts +4 -4
- package/dist/core/columns/constructColumn.cjs +4 -5
- package/dist/core/columns/constructColumn.cjs.map +1 -1
- package/dist/core/columns/constructColumn.d.cts +3 -3
- package/dist/core/columns/constructColumn.d.ts +3 -3
- package/dist/core/columns/constructColumn.js +4 -5
- package/dist/core/columns/constructColumn.js.map +1 -1
- package/dist/core/columns/coreColumnsFeature.cjs +12 -18
- package/dist/core/columns/coreColumnsFeature.cjs.map +1 -1
- package/dist/core/columns/coreColumnsFeature.js +12 -18
- package/dist/core/columns/coreColumnsFeature.js.map +1 -1
- package/dist/core/columns/coreColumnsFeature.types.d.cts +7 -7
- package/dist/core/columns/coreColumnsFeature.types.d.ts +7 -7
- package/dist/core/columns/coreColumnsFeature.utils.cjs +4 -8
- package/dist/core/columns/coreColumnsFeature.utils.cjs.map +1 -1
- package/dist/core/columns/coreColumnsFeature.utils.d.cts +9 -9
- package/dist/core/columns/coreColumnsFeature.utils.d.ts +9 -9
- package/dist/core/columns/coreColumnsFeature.utils.js +5 -9
- package/dist/core/columns/coreColumnsFeature.utils.js.map +1 -1
- package/dist/core/coreFeatures.cjs.map +1 -1
- package/dist/core/coreFeatures.d.cts +1 -1
- package/dist/core/coreFeatures.d.ts +1 -1
- package/dist/core/coreFeatures.js.map +1 -1
- package/dist/core/headers/buildHeaderGroups.cjs +1 -2
- package/dist/core/headers/buildHeaderGroups.cjs.map +1 -1
- package/dist/core/headers/buildHeaderGroups.d.cts +2 -2
- package/dist/core/headers/buildHeaderGroups.d.ts +2 -2
- package/dist/core/headers/buildHeaderGroups.js +1 -2
- package/dist/core/headers/buildHeaderGroups.js.map +1 -1
- package/dist/core/headers/constructHeader.cjs +1 -4
- package/dist/core/headers/constructHeader.cjs.map +1 -1
- package/dist/core/headers/constructHeader.d.cts +2 -2
- package/dist/core/headers/constructHeader.d.ts +2 -2
- package/dist/core/headers/constructHeader.js +1 -4
- package/dist/core/headers/constructHeader.js.map +1 -1
- package/dist/core/headers/coreHeadersFeature.cjs +8 -11
- package/dist/core/headers/coreHeadersFeature.cjs.map +1 -1
- package/dist/core/headers/coreHeadersFeature.js +8 -11
- package/dist/core/headers/coreHeadersFeature.js.map +1 -1
- package/dist/core/headers/coreHeadersFeature.types.d.cts +6 -6
- package/dist/core/headers/coreHeadersFeature.types.d.ts +6 -6
- package/dist/core/headers/coreHeadersFeature.utils.cjs +8 -10
- package/dist/core/headers/coreHeadersFeature.utils.cjs.map +1 -1
- package/dist/core/headers/coreHeadersFeature.utils.d.cts +6 -6
- package/dist/core/headers/coreHeadersFeature.utils.d.ts +6 -6
- package/dist/core/headers/coreHeadersFeature.utils.js +8 -10
- package/dist/core/headers/coreHeadersFeature.utils.js.map +1 -1
- package/dist/core/row-models/coreRowModelsFeature.types.d.cts +7 -15
- package/dist/core/row-models/coreRowModelsFeature.types.d.ts +7 -15
- package/dist/core/row-models/coreRowModelsFeature.utils.cjs +8 -26
- package/dist/core/row-models/coreRowModelsFeature.utils.cjs.map +1 -1
- package/dist/core/row-models/coreRowModelsFeature.utils.d.cts +16 -16
- package/dist/core/row-models/coreRowModelsFeature.utils.d.ts +16 -16
- package/dist/core/row-models/coreRowModelsFeature.utils.js +8 -26
- package/dist/core/row-models/coreRowModelsFeature.utils.js.map +1 -1
- package/dist/core/row-models/createCoreRowModel.cjs +4 -6
- package/dist/core/row-models/createCoreRowModel.cjs.map +1 -1
- package/dist/core/row-models/createCoreRowModel.d.cts +2 -2
- package/dist/core/row-models/createCoreRowModel.d.ts +2 -2
- package/dist/core/row-models/createCoreRowModel.js +5 -7
- package/dist/core/row-models/createCoreRowModel.js.map +1 -1
- package/dist/core/rows/constructRow.cjs +6 -10
- package/dist/core/rows/constructRow.cjs.map +1 -1
- package/dist/core/rows/constructRow.d.cts +2 -2
- package/dist/core/rows/constructRow.d.ts +2 -2
- package/dist/core/rows/constructRow.js +7 -10
- package/dist/core/rows/constructRow.js.map +1 -1
- package/dist/core/rows/coreRowsFeature.cjs +18 -2
- package/dist/core/rows/coreRowsFeature.cjs.map +1 -1
- package/dist/core/rows/coreRowsFeature.js +19 -3
- package/dist/core/rows/coreRowsFeature.js.map +1 -1
- package/dist/core/rows/coreRowsFeature.types.d.cts +41 -7
- package/dist/core/rows/coreRowsFeature.types.d.ts +41 -7
- package/dist/core/rows/coreRowsFeature.utils.cjs +62 -8
- package/dist/core/rows/coreRowsFeature.utils.cjs.map +1 -1
- package/dist/core/rows/coreRowsFeature.utils.d.cts +24 -5
- package/dist/core/rows/coreRowsFeature.utils.d.ts +24 -5
- package/dist/core/rows/coreRowsFeature.utils.js +61 -10
- package/dist/core/rows/coreRowsFeature.utils.js.map +1 -1
- package/dist/core/table/constructTable.cjs +24 -14
- package/dist/core/table/constructTable.cjs.map +1 -1
- package/dist/core/table/constructTable.d.cts +1 -1
- package/dist/core/table/constructTable.d.ts +1 -1
- package/dist/core/table/constructTable.js +24 -14
- package/dist/core/table/constructTable.js.map +1 -1
- package/dist/core/table/coreTablesFeature.types.d.cts +32 -19
- package/dist/core/table/coreTablesFeature.types.d.ts +32 -19
- package/dist/core/table/coreTablesFeature.utils.cjs +38 -14
- package/dist/core/table/coreTablesFeature.utils.cjs.map +1 -1
- package/dist/core/table/coreTablesFeature.utils.d.cts +10 -7
- package/dist/core/table/coreTablesFeature.utils.d.ts +10 -7
- package/dist/core/table/coreTablesFeature.utils.js +38 -14
- package/dist/core/table/coreTablesFeature.utils.js.map +1 -1
- package/dist/experimental-worker-plugin.cjs +14 -0
- package/dist/experimental-worker-plugin.d.cts +5 -0
- package/dist/experimental-worker-plugin.d.ts +5 -0
- package/dist/experimental-worker-plugin.js +6 -0
- package/dist/features/column-faceting/columnFacetingFeature.cjs +12 -18
- package/dist/features/column-faceting/columnFacetingFeature.cjs.map +1 -1
- package/dist/features/column-faceting/columnFacetingFeature.js +12 -18
- package/dist/features/column-faceting/columnFacetingFeature.js.map +1 -1
- package/dist/features/column-faceting/columnFacetingFeature.types.d.cts +15 -33
- package/dist/features/column-faceting/columnFacetingFeature.types.d.ts +15 -33
- package/dist/features/column-faceting/columnFacetingFeature.utils.cjs +23 -12
- package/dist/features/column-faceting/columnFacetingFeature.utils.cjs.map +1 -1
- package/dist/features/column-faceting/columnFacetingFeature.utils.d.cts +9 -9
- package/dist/features/column-faceting/columnFacetingFeature.utils.d.ts +9 -9
- package/dist/features/column-faceting/columnFacetingFeature.utils.js +24 -12
- package/dist/features/column-faceting/columnFacetingFeature.utils.js.map +1 -1
- package/dist/features/column-faceting/createFacetedMinMaxValues.cjs +7 -4
- package/dist/features/column-faceting/createFacetedMinMaxValues.cjs.map +1 -1
- package/dist/features/column-faceting/createFacetedMinMaxValues.d.cts +1 -1
- package/dist/features/column-faceting/createFacetedMinMaxValues.d.ts +1 -1
- package/dist/features/column-faceting/createFacetedMinMaxValues.js +8 -5
- package/dist/features/column-faceting/createFacetedMinMaxValues.js.map +1 -1
- package/dist/features/column-faceting/createFacetedRowModel.cjs +10 -15
- package/dist/features/column-faceting/createFacetedRowModel.cjs.map +1 -1
- package/dist/features/column-faceting/createFacetedRowModel.d.cts +2 -2
- package/dist/features/column-faceting/createFacetedRowModel.d.ts +2 -2
- package/dist/features/column-faceting/createFacetedRowModel.js +10 -15
- package/dist/features/column-faceting/createFacetedRowModel.js.map +1 -1
- package/dist/features/column-faceting/createFacetedUniqueValues.cjs +10 -6
- package/dist/features/column-faceting/createFacetedUniqueValues.cjs.map +1 -1
- package/dist/features/column-faceting/createFacetedUniqueValues.d.cts +1 -1
- package/dist/features/column-faceting/createFacetedUniqueValues.d.ts +1 -1
- package/dist/features/column-faceting/createFacetedUniqueValues.js +11 -7
- package/dist/features/column-faceting/createFacetedUniqueValues.js.map +1 -1
- package/dist/features/column-filtering/columnFilteringFeature.cjs +2 -2
- package/dist/features/column-filtering/columnFilteringFeature.cjs.map +1 -1
- package/dist/features/column-filtering/columnFilteringFeature.js +3 -3
- package/dist/features/column-filtering/columnFilteringFeature.js.map +1 -1
- package/dist/features/column-filtering/columnFilteringFeature.types.d.cts +83 -29
- package/dist/features/column-filtering/columnFilteringFeature.types.d.ts +83 -29
- package/dist/features/column-filtering/columnFilteringFeature.utils.cjs +23 -17
- package/dist/features/column-filtering/columnFilteringFeature.utils.cjs.map +1 -1
- package/dist/features/column-filtering/columnFilteringFeature.utils.d.cts +18 -14
- package/dist/features/column-filtering/columnFilteringFeature.utils.d.ts +18 -14
- package/dist/features/column-filtering/columnFilteringFeature.utils.js +23 -17
- package/dist/features/column-filtering/columnFilteringFeature.utils.js.map +1 -1
- package/dist/features/column-filtering/createFilteredRowModel.cjs +29 -25
- package/dist/features/column-filtering/createFilteredRowModel.cjs.map +1 -1
- package/dist/features/column-filtering/createFilteredRowModel.d.cts +10 -4
- package/dist/features/column-filtering/createFilteredRowModel.d.ts +10 -4
- package/dist/features/column-filtering/createFilteredRowModel.js +30 -26
- package/dist/features/column-filtering/createFilteredRowModel.js.map +1 -1
- package/dist/features/column-filtering/filterFns.cjs +399 -0
- package/dist/features/column-filtering/filterFns.cjs.map +1 -0
- package/dist/features/column-filtering/filterFns.d.cts +210 -0
- package/dist/features/column-filtering/filterFns.d.ts +210 -0
- package/dist/features/column-filtering/filterFns.js +375 -0
- package/dist/features/column-filtering/filterFns.js.map +1 -0
- package/dist/features/column-filtering/filterRowsUtils.cjs +3 -2
- package/dist/features/column-filtering/filterRowsUtils.cjs.map +1 -1
- package/dist/features/column-filtering/filterRowsUtils.js +3 -2
- package/dist/features/column-filtering/filterRowsUtils.js.map +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.cjs +4 -16
- package/dist/features/column-grouping/columnGroupingFeature.cjs.map +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.d.cts +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.d.ts +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.js +6 -18
- package/dist/features/column-grouping/columnGroupingFeature.js.map +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.types.d.cts +14 -50
- package/dist/features/column-grouping/columnGroupingFeature.types.d.ts +14 -50
- package/dist/features/column-grouping/columnGroupingFeature.utils.cjs +6 -61
- package/dist/features/column-grouping/columnGroupingFeature.utils.cjs.map +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.utils.d.cts +12 -49
- package/dist/features/column-grouping/columnGroupingFeature.utils.d.ts +12 -49
- package/dist/features/column-grouping/columnGroupingFeature.utils.js +8 -60
- package/dist/features/column-grouping/columnGroupingFeature.utils.js.map +1 -1
- package/dist/features/column-grouping/createGroupedRowModel.cjs +37 -24
- package/dist/features/column-grouping/createGroupedRowModel.cjs.map +1 -1
- package/dist/features/column-grouping/createGroupedRowModel.d.cts +6 -4
- package/dist/features/column-grouping/createGroupedRowModel.d.ts +6 -4
- package/dist/features/column-grouping/createGroupedRowModel.js +39 -26
- package/dist/features/column-grouping/createGroupedRowModel.js.map +1 -1
- package/dist/features/column-ordering/columnOrderingFeature.cjs +17 -21
- package/dist/features/column-ordering/columnOrderingFeature.cjs.map +1 -1
- package/dist/features/column-ordering/columnOrderingFeature.js +18 -22
- package/dist/features/column-ordering/columnOrderingFeature.js.map +1 -1
- package/dist/features/column-ordering/columnOrderingFeature.types.d.cts +28 -3
- package/dist/features/column-ordering/columnOrderingFeature.types.d.ts +28 -3
- package/dist/features/column-ordering/columnOrderingFeature.utils.cjs +35 -15
- package/dist/features/column-ordering/columnOrderingFeature.utils.cjs.map +1 -1
- package/dist/features/column-ordering/columnOrderingFeature.utils.d.cts +26 -14
- package/dist/features/column-ordering/columnOrderingFeature.utils.d.ts +26 -14
- package/dist/features/column-ordering/columnOrderingFeature.utils.js +36 -17
- package/dist/features/column-ordering/columnOrderingFeature.utils.js.map +1 -1
- package/dist/features/column-pinning/columnPinningFeature.cjs +124 -143
- package/dist/features/column-pinning/columnPinningFeature.cjs.map +1 -1
- package/dist/features/column-pinning/columnPinningFeature.d.cts +6 -1
- package/dist/features/column-pinning/columnPinningFeature.d.ts +6 -1
- package/dist/features/column-pinning/columnPinningFeature.js +125 -144
- package/dist/features/column-pinning/columnPinningFeature.js.map +1 -1
- package/dist/features/column-pinning/columnPinningFeature.types.d.cts +52 -41
- package/dist/features/column-pinning/columnPinningFeature.types.d.ts +52 -41
- package/dist/features/column-pinning/columnPinningFeature.utils.cjs +161 -162
- package/dist/features/column-pinning/columnPinningFeature.utils.cjs.map +1 -1
- package/dist/features/column-pinning/columnPinningFeature.utils.d.cts +101 -92
- package/dist/features/column-pinning/columnPinningFeature.utils.d.ts +101 -92
- package/dist/features/column-pinning/columnPinningFeature.utils.js +148 -149
- package/dist/features/column-pinning/columnPinningFeature.utils.js.map +1 -1
- package/dist/features/column-resizing/columnResizingFeature.types.d.cts +1 -4
- package/dist/features/column-resizing/columnResizingFeature.types.d.ts +1 -4
- package/dist/features/column-resizing/columnResizingFeature.utils.cjs +84 -44
- package/dist/features/column-resizing/columnResizingFeature.utils.cjs.map +1 -1
- package/dist/features/column-resizing/columnResizingFeature.utils.d.cts +6 -6
- package/dist/features/column-resizing/columnResizingFeature.utils.d.ts +6 -6
- package/dist/features/column-resizing/columnResizingFeature.utils.js +85 -45
- package/dist/features/column-resizing/columnResizingFeature.utils.js.map +1 -1
- package/dist/features/column-sizing/columnSizingFeature.cjs +33 -67
- package/dist/features/column-sizing/columnSizingFeature.cjs.map +1 -1
- package/dist/features/column-sizing/columnSizingFeature.js +34 -68
- package/dist/features/column-sizing/columnSizingFeature.js.map +1 -1
- package/dist/features/column-sizing/columnSizingFeature.types.d.cts +52 -9
- package/dist/features/column-sizing/columnSizingFeature.types.d.ts +52 -9
- package/dist/features/column-sizing/columnSizingFeature.utils.cjs +88 -45
- package/dist/features/column-sizing/columnSizingFeature.utils.cjs.map +1 -1
- package/dist/features/column-sizing/columnSizingFeature.utils.d.cts +43 -25
- package/dist/features/column-sizing/columnSizingFeature.utils.d.ts +43 -25
- package/dist/features/column-sizing/columnSizingFeature.utils.js +88 -46
- package/dist/features/column-sizing/columnSizingFeature.utils.js.map +1 -1
- package/dist/features/column-visibility/columnVisibilityFeature.cjs +25 -36
- package/dist/features/column-visibility/columnVisibilityFeature.cjs.map +1 -1
- package/dist/features/column-visibility/columnVisibilityFeature.js +25 -36
- package/dist/features/column-visibility/columnVisibilityFeature.js.map +1 -1
- package/dist/features/column-visibility/columnVisibilityFeature.types.d.cts +3 -3
- package/dist/features/column-visibility/columnVisibilityFeature.types.d.ts +3 -3
- package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs +30 -29
- package/dist/features/column-visibility/columnVisibilityFeature.utils.cjs.map +1 -1
- package/dist/features/column-visibility/columnVisibilityFeature.utils.d.cts +18 -18
- package/dist/features/column-visibility/columnVisibilityFeature.utils.d.ts +18 -18
- package/dist/features/column-visibility/columnVisibilityFeature.utils.js +31 -30
- package/dist/features/column-visibility/columnVisibilityFeature.utils.js.map +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.cjs +1 -2
- package/dist/features/global-filtering/globalFilteringFeature.cjs.map +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.js +1 -2
- package/dist/features/global-filtering/globalFilteringFeature.js.map +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.types.d.cts +2 -2
- package/dist/features/global-filtering/globalFilteringFeature.types.d.ts +2 -2
- package/dist/features/global-filtering/globalFilteringFeature.utils.cjs +6 -6
- package/dist/features/global-filtering/globalFilteringFeature.utils.cjs.map +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.utils.d.cts +8 -11
- package/dist/features/global-filtering/globalFilteringFeature.utils.d.ts +8 -11
- package/dist/features/global-filtering/globalFilteringFeature.utils.js +6 -6
- package/dist/features/global-filtering/globalFilteringFeature.utils.js.map +1 -1
- package/dist/features/row-aggregation/aggregationFns.cjs +246 -0
- package/dist/features/row-aggregation/aggregationFns.cjs.map +1 -0
- package/dist/features/row-aggregation/aggregationFns.d.cts +68 -0
- package/dist/features/row-aggregation/aggregationFns.d.ts +68 -0
- package/dist/features/row-aggregation/aggregationFns.js +235 -0
- package/dist/features/row-aggregation/aggregationFns.js.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.cjs +39 -0
- package/dist/features/row-aggregation/rowAggregationFeature.cjs.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.d.cts +10 -0
- package/dist/features/row-aggregation/rowAggregationFeature.d.ts +10 -0
- package/dist/features/row-aggregation/rowAggregationFeature.js +39 -0
- package/dist/features/row-aggregation/rowAggregationFeature.js.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.types.cjs +13 -0
- package/dist/features/row-aggregation/rowAggregationFeature.types.cjs.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.types.d.cts +195 -0
- package/dist/features/row-aggregation/rowAggregationFeature.types.d.ts +195 -0
- package/dist/features/row-aggregation/rowAggregationFeature.types.js +12 -0
- package/dist/features/row-aggregation/rowAggregationFeature.types.js.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.utils.cjs +212 -0
- package/dist/features/row-aggregation/rowAggregationFeature.utils.cjs.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.utils.d.cts +34 -0
- package/dist/features/row-aggregation/rowAggregationFeature.utils.d.ts +34 -0
- package/dist/features/row-aggregation/rowAggregationFeature.utils.js +206 -0
- package/dist/features/row-aggregation/rowAggregationFeature.utils.js.map +1 -0
- package/dist/features/row-expanding/createExpandedRowModel.cjs +6 -10
- package/dist/features/row-expanding/createExpandedRowModel.cjs.map +1 -1
- package/dist/features/row-expanding/createExpandedRowModel.d.cts +2 -2
- package/dist/features/row-expanding/createExpandedRowModel.d.ts +2 -2
- package/dist/features/row-expanding/createExpandedRowModel.js +6 -10
- package/dist/features/row-expanding/createExpandedRowModel.js.map +1 -1
- package/dist/features/row-expanding/rowExpandingFeature.types.d.cts +6 -15
- package/dist/features/row-expanding/rowExpandingFeature.types.d.ts +6 -15
- package/dist/features/row-expanding/rowExpandingFeature.utils.cjs +28 -26
- package/dist/features/row-expanding/rowExpandingFeature.utils.cjs.map +1 -1
- package/dist/features/row-expanding/rowExpandingFeature.utils.d.cts +10 -10
- package/dist/features/row-expanding/rowExpandingFeature.utils.d.ts +10 -10
- package/dist/features/row-expanding/rowExpandingFeature.utils.js +29 -27
- package/dist/features/row-expanding/rowExpandingFeature.utils.js.map +1 -1
- package/dist/features/row-pagination/createPaginatedRowModel.cjs +6 -10
- package/dist/features/row-pagination/createPaginatedRowModel.cjs.map +1 -1
- package/dist/features/row-pagination/createPaginatedRowModel.d.cts +2 -2
- package/dist/features/row-pagination/createPaginatedRowModel.d.ts +2 -2
- package/dist/features/row-pagination/createPaginatedRowModel.js +6 -10
- package/dist/features/row-pagination/createPaginatedRowModel.js.map +1 -1
- package/dist/features/row-pagination/rowPaginationFeature.types.d.cts +5 -14
- package/dist/features/row-pagination/rowPaginationFeature.types.d.ts +5 -14
- package/dist/features/row-pagination/rowPaginationFeature.utils.cjs +9 -15
- package/dist/features/row-pagination/rowPaginationFeature.utils.cjs.map +1 -1
- package/dist/features/row-pagination/rowPaginationFeature.utils.d.cts +17 -17
- package/dist/features/row-pagination/rowPaginationFeature.utils.d.ts +17 -17
- package/dist/features/row-pagination/rowPaginationFeature.utils.js +9 -15
- package/dist/features/row-pagination/rowPaginationFeature.utils.js.map +1 -1
- package/dist/features/row-pinning/rowPinningFeature.cjs +4 -16
- package/dist/features/row-pinning/rowPinningFeature.cjs.map +1 -1
- package/dist/features/row-pinning/rowPinningFeature.js +4 -16
- package/dist/features/row-pinning/rowPinningFeature.js.map +1 -1
- package/dist/features/row-pinning/rowPinningFeature.types.d.cts +2 -2
- package/dist/features/row-pinning/rowPinningFeature.types.d.ts +2 -2
- package/dist/features/row-pinning/rowPinningFeature.utils.cjs +9 -14
- package/dist/features/row-pinning/rowPinningFeature.utils.cjs.map +1 -1
- package/dist/features/row-pinning/rowPinningFeature.utils.d.cts +7 -7
- package/dist/features/row-pinning/rowPinningFeature.utils.d.ts +7 -7
- package/dist/features/row-pinning/rowPinningFeature.utils.js +9 -14
- package/dist/features/row-pinning/rowPinningFeature.utils.js.map +1 -1
- package/dist/features/row-selection/rowSelectionFeature.cjs +66 -22
- package/dist/features/row-selection/rowSelectionFeature.cjs.map +1 -1
- package/dist/features/row-selection/rowSelectionFeature.js +67 -23
- package/dist/features/row-selection/rowSelectionFeature.js.map +1 -1
- package/dist/features/row-selection/rowSelectionFeature.types.d.cts +49 -11
- package/dist/features/row-selection/rowSelectionFeature.types.d.ts +49 -11
- package/dist/features/row-selection/rowSelectionFeature.utils.cjs +128 -72
- package/dist/features/row-selection/rowSelectionFeature.utils.cjs.map +1 -1
- package/dist/features/row-selection/rowSelectionFeature.utils.d.cts +57 -30
- package/dist/features/row-selection/rowSelectionFeature.utils.d.ts +57 -30
- package/dist/features/row-selection/rowSelectionFeature.utils.js +129 -74
- package/dist/features/row-selection/rowSelectionFeature.utils.js.map +1 -1
- package/dist/features/row-sorting/createSortedRowModel.cjs +69 -50
- package/dist/features/row-sorting/createSortedRowModel.cjs.map +1 -1
- package/dist/features/row-sorting/createSortedRowModel.d.cts +10 -4
- package/dist/features/row-sorting/createSortedRowModel.d.ts +10 -4
- package/dist/features/row-sorting/createSortedRowModel.js +70 -51
- package/dist/features/row-sorting/createSortedRowModel.js.map +1 -1
- package/dist/features/row-sorting/rowSortingFeature.types.d.cts +54 -22
- package/dist/features/row-sorting/rowSortingFeature.types.d.ts +54 -22
- package/dist/features/row-sorting/rowSortingFeature.utils.cjs +31 -17
- package/dist/features/row-sorting/rowSortingFeature.utils.cjs.map +1 -1
- package/dist/features/row-sorting/rowSortingFeature.utils.d.cts +16 -16
- package/dist/features/row-sorting/rowSortingFeature.utils.d.ts +16 -16
- package/dist/features/row-sorting/rowSortingFeature.utils.js +31 -17
- package/dist/features/row-sorting/rowSortingFeature.utils.js.map +1 -1
- package/dist/features/row-sorting/sortFns.cjs +226 -0
- package/dist/features/row-sorting/sortFns.cjs.map +1 -0
- package/dist/features/row-sorting/sortFns.d.cts +98 -0
- package/dist/features/row-sorting/sortFns.d.ts +98 -0
- package/dist/features/row-sorting/sortFns.js +217 -0
- package/dist/features/row-sorting/sortFns.js.map +1 -0
- package/dist/features/stockFeatures.cjs +2 -0
- package/dist/features/stockFeatures.cjs.map +1 -1
- package/dist/features/stockFeatures.d.cts +2 -0
- package/dist/features/stockFeatures.d.ts +2 -0
- package/dist/features/stockFeatures.js +2 -0
- package/dist/features/stockFeatures.js.map +1 -1
- package/dist/flex-render.d.cts +1 -1
- package/dist/flex-render.d.ts +1 -1
- package/dist/helpers/columnHelper.cjs.map +1 -1
- package/dist/helpers/columnHelper.d.cts +2 -2
- package/dist/helpers/columnHelper.d.ts +2 -2
- package/dist/helpers/columnHelper.js.map +1 -1
- package/dist/helpers/metaHelper.cjs +30 -0
- package/dist/helpers/metaHelper.cjs.map +1 -0
- package/dist/helpers/metaHelper.d.cts +26 -0
- package/dist/helpers/metaHelper.d.ts +26 -0
- package/dist/helpers/metaHelper.js +29 -0
- package/dist/helpers/metaHelper.js.map +1 -0
- package/dist/helpers/tableFeatures.cjs +32 -3
- package/dist/helpers/tableFeatures.cjs.map +1 -1
- package/dist/helpers/tableFeatures.d.cts +34 -5
- package/dist/helpers/tableFeatures.d.ts +34 -5
- package/dist/helpers/tableFeatures.js +32 -3
- package/dist/helpers/tableFeatures.js.map +1 -1
- package/dist/index.cjs +23 -3
- package/dist/index.d.cts +31 -28
- package/dist/index.d.ts +31 -28
- package/dist/index.js +8 -5
- package/dist/static-functions.cjs +30 -19
- package/dist/static-functions.d.cts +8 -7
- package/dist/static-functions.d.ts +8 -7
- package/dist/static-functions.js +8 -7
- package/dist/store-reactivity-bindings.cjs +3 -3
- package/dist/store-reactivity-bindings.cjs.map +1 -1
- package/dist/store-reactivity-bindings.d.cts +1 -1
- package/dist/store-reactivity-bindings.d.ts +1 -1
- package/dist/store-reactivity-bindings.js +3 -3
- package/dist/store-reactivity-bindings.js.map +1 -1
- package/dist/types/Cell.d.cts +4 -2
- package/dist/types/Cell.d.ts +4 -2
- package/dist/types/Column.d.cts +15 -15
- package/dist/types/Column.d.ts +15 -15
- package/dist/types/ColumnDef.d.cts +30 -14
- package/dist/types/ColumnDef.d.ts +30 -14
- package/dist/types/Header.d.cts +2 -2
- package/dist/types/Header.d.ts +2 -2
- package/dist/types/HeaderGroup.d.cts +2 -2
- package/dist/types/HeaderGroup.d.ts +2 -2
- package/dist/types/Row.d.cts +6 -4
- package/dist/types/Row.d.ts +6 -4
- package/dist/types/RowModel.d.cts +11 -23
- package/dist/types/RowModel.d.ts +11 -23
- package/dist/types/RowModelFns.d.cts +4 -4
- package/dist/types/RowModelFns.d.ts +4 -4
- package/dist/types/Table.d.cts +26 -31
- package/dist/types/Table.d.ts +26 -31
- package/dist/types/TableFeatures.d.cts +350 -22
- package/dist/types/TableFeatures.d.ts +350 -22
- package/dist/types/TableOptions.d.cts +22 -14
- package/dist/types/TableOptions.d.ts +22 -14
- package/dist/types/TableState.d.cts +6 -6
- package/dist/types/TableState.d.ts +6 -6
- package/dist/types/type-utils.d.cts +8 -1
- package/dist/types/type-utils.d.ts +8 -1
- package/dist/utils.cjs +51 -29
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +30 -8
- package/dist/utils.d.ts +30 -8
- package/dist/utils.js +49 -30
- package/dist/utils.js.map +1 -1
- package/dist/worker/createTableWorker.cjs +189 -0
- package/dist/worker/createTableWorker.cjs.map +1 -0
- package/dist/worker/createTableWorker.d.cts +102 -0
- package/dist/worker/createTableWorker.d.ts +102 -0
- package/dist/worker/createTableWorker.js +186 -0
- package/dist/worker/createTableWorker.js.map +1 -0
- package/dist/worker/createWorkerRowModel.cjs +78 -0
- package/dist/worker/createWorkerRowModel.cjs.map +1 -0
- package/dist/worker/createWorkerRowModel.d.cts +42 -0
- package/dist/worker/createWorkerRowModel.d.ts +42 -0
- package/dist/worker/createWorkerRowModel.js +78 -0
- package/dist/worker/createWorkerRowModel.js.map +1 -0
- package/dist/worker/initTableWorker.cjs +100 -0
- package/dist/worker/initTableWorker.cjs.map +1 -0
- package/dist/worker/initTableWorker.d.cts +33 -0
- package/dist/worker/initTableWorker.d.ts +33 -0
- package/dist/worker/initTableWorker.js +100 -0
- package/dist/worker/initTableWorker.js.map +1 -0
- package/dist/worker/rebuildRowModel.cjs +72 -0
- package/dist/worker/rebuildRowModel.cjs.map +1 -0
- package/dist/worker/rebuildRowModel.d.cts +9 -0
- package/dist/worker/rebuildRowModel.d.ts +9 -0
- package/dist/worker/rebuildRowModel.js +72 -0
- package/dist/worker/rebuildRowModel.js.map +1 -0
- package/dist/worker/serializeRowModel.cjs +53 -0
- package/dist/worker/serializeRowModel.cjs.map +1 -0
- package/dist/worker/serializeRowModel.js +52 -0
- package/dist/worker/serializeRowModel.js.map +1 -0
- package/dist/worker/tableWorkerProtocol.cjs +29 -0
- package/dist/worker/tableWorkerProtocol.cjs.map +1 -0
- package/dist/worker/tableWorkerProtocol.d.cts +88 -0
- package/dist/worker/tableWorkerProtocol.d.ts +88 -0
- package/dist/worker/tableWorkerProtocol.js +27 -0
- package/dist/worker/tableWorkerProtocol.js.map +1 -0
- package/package.json +8 -3
- package/skills/aggregation/SKILL.md +141 -0
- package/skills/api-not-found/SKILL.md +113 -0
- package/skills/client-vs-server/SKILL.md +164 -0
- package/skills/column-faceting/SKILL.md +97 -0
- package/skills/column-filtering/SKILL.md +87 -0
- package/skills/column-ordering/SKILL.md +75 -0
- package/skills/column-pinning/SKILL.md +89 -0
- package/skills/column-resizing/SKILL.md +91 -0
- package/skills/column-sizing/SKILL.md +72 -0
- package/skills/column-visibility/SKILL.md +75 -0
- package/skills/core/SKILL.md +175 -0
- package/skills/custom-features/SKILL.md +235 -0
- package/skills/expanding/SKILL.md +80 -0
- package/skills/global-filtering/SKILL.md +84 -0
- package/skills/grouping/SKILL.md +51 -401
- package/skills/migrate-v8-to-v9/SKILL.md +274 -416
- package/skills/pagination/SKILL.md +37 -344
- package/skills/row-pinning/SKILL.md +47 -234
- package/skills/row-selection/SKILL.md +75 -302
- package/skills/sorting/SKILL.md +45 -303
- package/skills/table-features/SKILL.md +159 -0
- package/skills/typescript/SKILL.md +126 -0
- package/src/core/cells/coreCellsFeature.types.ts +6 -6
- package/src/core/columns/constructColumn.ts +6 -0
- package/src/core/columns/coreColumnsFeature.types.ts +8 -8
- package/src/core/columns/coreColumnsFeature.utils.ts +4 -4
- package/src/core/coreFeatures.ts +1 -1
- package/src/core/headers/buildHeaderGroups.ts +4 -2
- package/src/core/headers/coreHeadersFeature.types.ts +12 -12
- package/src/core/headers/coreHeadersFeature.utils.ts +7 -8
- package/src/core/row-models/coreRowModelsFeature.types.ts +6 -20
- package/src/core/row-models/coreRowModelsFeature.utils.ts +8 -8
- package/src/core/row-models/createCoreRowModel.ts +7 -6
- package/src/core/rows/constructRow.ts +4 -2
- package/src/core/rows/coreRowsFeature.ts +21 -0
- package/src/core/rows/coreRowsFeature.types.ts +45 -8
- package/src/core/rows/coreRowsFeature.utils.ts +93 -5
- package/src/core/table/constructTable.ts +44 -6
- package/src/core/table/coreTablesFeature.types.ts +45 -20
- package/src/core/table/coreTablesFeature.utils.ts +59 -19
- package/src/experimental-worker-plugin.ts +22 -0
- package/src/features/column-faceting/columnFacetingFeature.types.ts +17 -48
- package/src/features/column-faceting/columnFacetingFeature.utils.ts +53 -18
- package/src/features/column-faceting/createFacetedMinMaxValues.ts +33 -7
- package/src/features/column-faceting/createFacetedRowModel.ts +8 -1
- package/src/features/column-faceting/createFacetedUniqueValues.ts +41 -10
- package/src/features/column-filtering/columnFilteringFeature.ts +3 -2
- package/src/features/column-filtering/columnFilteringFeature.types.ts +117 -41
- package/src/features/column-filtering/columnFilteringFeature.utils.ts +37 -23
- package/src/features/column-filtering/createFilteredRowModel.ts +28 -17
- package/src/features/column-filtering/filterFns.ts +533 -0
- package/src/features/column-filtering/filterRowsUtils.ts +3 -2
- package/src/features/column-grouping/columnGroupingFeature.ts +3 -21
- package/src/features/column-grouping/columnGroupingFeature.types.ts +21 -95
- package/src/features/column-grouping/columnGroupingFeature.utils.ts +4 -87
- package/src/features/column-grouping/createGroupedRowModel.ts +46 -45
- package/src/features/column-ordering/columnOrderingFeature.ts +12 -7
- package/src/features/column-ordering/columnOrderingFeature.types.ts +29 -3
- package/src/features/column-ordering/columnOrderingFeature.utils.ts +59 -8
- package/src/features/column-pinning/columnPinningFeature.ts +76 -59
- package/src/features/column-pinning/columnPinningFeature.types.ts +53 -42
- package/src/features/column-pinning/columnPinningFeature.utils.ts +184 -170
- package/src/features/column-resizing/columnResizingFeature.types.ts +1 -4
- package/src/features/column-resizing/columnResizingFeature.utils.ts +120 -52
- package/src/features/column-sizing/columnSizingFeature.ts +24 -24
- package/src/features/column-sizing/columnSizingFeature.types.ts +53 -8
- package/src/features/column-sizing/columnSizingFeature.utils.ts +143 -62
- package/src/features/column-visibility/columnVisibilityFeature.ts +4 -0
- package/src/features/column-visibility/columnVisibilityFeature.types.ts +4 -4
- package/src/features/column-visibility/columnVisibilityFeature.utils.ts +48 -30
- package/src/features/global-filtering/globalFilteringFeature.types.ts +4 -4
- package/src/features/global-filtering/globalFilteringFeature.utils.ts +13 -5
- package/src/features/row-aggregation/aggregationFns.ts +345 -0
- package/src/features/row-aggregation/rowAggregationFeature.ts +60 -0
- package/src/features/row-aggregation/rowAggregationFeature.types.ts +339 -0
- package/src/features/row-aggregation/rowAggregationFeature.utils.ts +430 -0
- package/src/features/row-expanding/rowExpandingFeature.types.ts +8 -23
- package/src/features/row-expanding/rowExpandingFeature.utils.ts +38 -13
- package/src/features/row-pagination/createPaginatedRowModel.ts +1 -1
- package/src/features/row-pagination/rowPaginationFeature.types.ts +6 -21
- package/src/features/row-pagination/rowPaginationFeature.utils.ts +1 -1
- package/src/features/row-pinning/rowPinningFeature.types.ts +4 -4
- package/src/features/row-selection/rowSelectionFeature.ts +53 -3
- package/src/features/row-selection/rowSelectionFeature.types.ts +54 -10
- package/src/features/row-selection/rowSelectionFeature.utils.ts +273 -91
- package/src/features/row-sorting/createSortedRowModel.ts +107 -75
- package/src/features/row-sorting/rowSortingFeature.types.ts +87 -34
- package/src/features/row-sorting/rowSortingFeature.utils.ts +49 -23
- package/src/features/row-sorting/sortFns.ts +366 -0
- package/src/features/stockFeatures.ts +3 -0
- package/src/helpers/columnHelper.ts +4 -4
- package/src/helpers/metaHelper.ts +24 -0
- package/src/helpers/tableFeatures.ts +37 -5
- package/src/index.ts +8 -8
- package/src/static-functions.ts +1 -0
- package/src/store-reactivity-bindings.ts +1 -1
- package/src/types/Cell.ts +4 -2
- package/src/types/Column.ts +13 -9
- package/src/types/ColumnDef.ts +40 -10
- package/src/types/Header.ts +2 -2
- package/src/types/HeaderGroup.ts +6 -6
- package/src/types/Row.ts +6 -4
- package/src/types/RowModel.ts +19 -74
- package/src/types/RowModelFns.ts +10 -10
- package/src/types/Table.ts +52 -27
- package/src/types/TableFeatures.ts +392 -14
- package/src/types/TableOptions.ts +67 -14
- package/src/types/TableState.ts +15 -1
- package/src/types/type-utils.ts +8 -0
- package/src/utils.ts +60 -8
- package/src/worker/createTableWorker.ts +357 -0
- package/src/worker/createWorkerRowModel.ts +121 -0
- package/src/worker/initTableWorker.ts +164 -0
- package/src/worker/rebuildRowModel.ts +120 -0
- package/src/worker/serializeRowModel.ts +80 -0
- package/src/worker/tableWorkerProtocol.ts +105 -0
- package/dist/fns/aggregationFns.cjs +0 -161
- package/dist/fns/aggregationFns.cjs.map +0 -1
- package/dist/fns/aggregationFns.d.cts +0 -85
- package/dist/fns/aggregationFns.d.ts +0 -85
- package/dist/fns/aggregationFns.js +0 -151
- package/dist/fns/aggregationFns.js.map +0 -1
- package/dist/fns/filterFns.cjs +0 -201
- package/dist/fns/filterFns.cjs.map +0 -1
- package/dist/fns/filterFns.d.cts +0 -167
- package/dist/fns/filterFns.d.ts +0 -167
- package/dist/fns/filterFns.js +0 -185
- package/dist/fns/filterFns.js.map +0 -1
- package/dist/fns/sortFns.cjs +0 -118
- package/dist/fns/sortFns.cjs.map +0 -1
- package/dist/fns/sortFns.d.cts +0 -65
- package/dist/fns/sortFns.d.ts +0 -65
- package/dist/fns/sortFns.js +0 -110
- package/dist/fns/sortFns.js.map +0 -1
- package/skills/column-definitions/SKILL.md +0 -333
- package/skills/column-layout/SKILL.md +0 -328
- package/skills/column-layout/references/subsystems.md +0 -220
- package/skills/customizing-feature-behavior/SKILL.md +0 -416
- package/skills/filtering/SKILL.md +0 -357
- package/skills/filtering/references/faceting-and-fuzzy.md +0 -191
- package/skills/row-expanding/SKILL.md +0 -348
- package/skills/setup/SKILL.md +0 -400
- package/skills/state-management/SKILL.md +0 -388
- package/src/fns/aggregationFns.ts +0 -245
- package/src/fns/filterFns.ts +0 -382
- package/src/fns/sortFns.ts +0 -217
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { Table, Table_Internal } from './types/Table'\nimport type { NoInfer, RowData, Updater } from './types/type-utils'\nimport type { TableFeatures } from './types/TableFeatures'\nimport type { TableState, TableState_All } from './types/TableState'\n\n/**\n * Applies a TanStack updater to a value.\n *\n * If the updater is a function it is called with the previous value; otherwise the updater value is returned directly.\n */\nexport function functionalUpdate<T>(updater: Updater<T>, input: T): T {\n return typeof updater === 'function'\n ? (updater as (i: T) => T)(input)\n : updater\n}\n\n/**\n * Clones table state values while preserving non-plain objects.\n *\n * Plain objects and arrays are copied recursively so state updates can avoid mutating existing references.\n */\nexport function cloneState<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(cloneState) as T\n }\n\n if (value && typeof value === 'object') {\n const proto = Object.getPrototypeOf(value)\n\n if (proto !== Object.prototype && proto !== null) {\n return value\n }\n\n const copy: Record<string, unknown> = {}\n const keys = Object.keys(value)\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]!\n copy[key] = cloneState((value as Record<string, unknown>)[key])\n }\n\n return copy as T\n }\n\n return value\n}\n\n/**\n * Creates a table state updater for a single state slice.\n *\n * The updater writes through the table base atom for the slice and supports both value and functional updater forms.\n */\nexport function makeStateUpdater<\n TFeatures extends TableFeatures,\n K extends (string & {}) | keyof TableState_All | keyof TableState<TFeatures>,\n>(key: K, instance: Table<TFeatures, any>) {\n return (updater: Updater<TableState<any>[K & keyof TableState<any>]>) => {\n const externalAtom = (instance.options as any).atoms?.[key]\n const targetAtom = externalAtom ?? (instance.baseAtoms as any)[key]\n targetAtom.set((old: any) => functionalUpdate(updater, old))\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\n/**\n * Returns whether a value is a function.\n */\nexport function isFunction<T extends AnyFunction>(d: any): d is T {\n return d instanceof Function\n}\n\n/**\n * Flattens a tree of nodes by recursively reading child nodes.\n *\n * The original nodes are preserved in depth-first order.\n */\nexport function flattenBy<TNode>(\n arr: Array<TNode>,\n getChildren: (item: TNode) => Array<TNode>,\n) {\n const flat: Array<TNode> = []\n\n const recurse = (subArr: Array<TNode>) => {\n subArr.forEach((item) => {\n flat.push(item)\n const children = getChildren(item)\n if (children.length) {\n recurse(children)\n }\n })\n }\n\n recurse(arr)\n\n return flat\n}\n\ninterface MemoOptions<TDeps extends ReadonlyArray<any>, TDepArgs, TResult> {\n fn: (...args: NoInfer<TDeps>) => TResult\n memoDeps?: (depArgs?: TDepArgs) => [...TDeps] | undefined\n onAfterCompare?: (depsChanged: boolean) => void\n onAfterUpdate?: (result: TResult) => void\n onBeforeCompare?: () => void\n onBeforeUpdate?: () => void\n}\n\n/**\n * Creates a dependency-tracked memoized function for table internals.\n *\n * The memo recomputes only when its dependency tuple changes and can emit debug timing information.\n */\nexport const memo = <TDeps extends ReadonlyArray<any>, TDepArgs, TResult>({\n fn,\n memoDeps,\n onAfterCompare,\n onAfterUpdate,\n onBeforeCompare,\n onBeforeUpdate,\n}: MemoOptions<TDeps, TDepArgs, TResult>): ((\n depArgs?: TDepArgs,\n) => TResult) => {\n let deps: Array<any> | undefined = []\n let result: TResult | undefined\n\n const memoizedFn = (depArgs?: TDepArgs): TResult => {\n onBeforeCompare?.()\n const newDeps = memoDeps?.(depArgs)\n let depsChanged = !newDeps || newDeps.length !== deps?.length\n if (!depsChanged && newDeps) {\n for (let i = 0; i < newDeps.length; i++) {\n if (newDeps[i] !== deps![i]) {\n depsChanged = true\n break\n }\n }\n }\n onAfterCompare?.(depsChanged)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n onBeforeUpdate?.()\n result = fn(...(newDeps ?? ([] as any)))\n onAfterUpdate?.(result)\n\n return result\n }\n\n return memoizedFn\n}\n\ninterface TableMemoOptions<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n> extends MemoOptions<TDeps, TDepArgs, TResult> {\n feature?: keyof TFeatures & string\n fnName: string\n objectId?: string\n onAfterUpdate?: () => void\n table: Table_Internal<TFeatures, any>\n}\n\nconst pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n}\n\n/**\n * Creates a table-aware memoized function.\n *\n * This wraps `memo` with table debug options and feature metadata so row models and derived APIs can share consistent diagnostics.\n */\nexport function tableMemo<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n>({\n feature,\n fnName,\n objectId,\n onAfterUpdate,\n table,\n ...memoOptions\n}: TableMemoOptions<TFeatures, TDeps, TDepArgs, TResult>) {\n let beforeCompareTime: number\n let afterCompareTime: number\n let startCalcTime: number\n let endCalcTime: number\n let runCount = 0\n let debug: boolean | undefined\n let debugCache: boolean | undefined\n\n if (process.env.NODE_ENV === 'development') {\n const { debugCache: _debugCache, debugAll } = table.options\n debugCache = _debugCache\n const { parentName } = getFunctionNameInfo(fnName, '.')\n\n const debugByParent =\n // @ts-expect-error\n table.options[\n `debug${(parentName != 'table' ? parentName + 's' : parentName).replace(\n parentName,\n parentName.charAt(0).toUpperCase() + parentName.slice(1),\n )}`\n ]\n const debugByFeature = feature\n ? // @ts-expect-error\n table.options[\n `debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`\n ]\n : false\n\n debug = debugAll || debugByParent || debugByFeature\n }\n\n function logTime(time: number, depsChanged: boolean) {\n const runType =\n runCount === 0\n ? '(1st run)'\n : depsChanged\n ? '(rerun #' + runCount + ')'\n : '(cache)'\n runCount++\n\n console.groupCollapsed(\n `%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split('.')[0]}Id: ${objectId})` : ''}`,\n `font-size: .6rem; font-weight: bold; ${\n depsChanged\n ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);`\n : ''\n } `,\n `color: ${runCount < 2 ? '#FF00FF' : '#FF1493'}`,\n 'color: #666',\n 'color: #87CEEB',\n )\n console.info({\n feature,\n state: table.store.state,\n deps: memoOptions.memoDeps?.toString(),\n })\n console.trace()\n console.groupEnd()\n }\n\n const onAfterUpdateHandler = () => {\n if (!onAfterUpdate) {\n return\n }\n\n const { schedule, untrack } = table._reactivity\n schedule(() => untrack(() => onAfterUpdate()))\n }\n\n const debugOptions =\n process.env.NODE_ENV === 'development'\n ? {\n onBeforeCompare: () => {\n if (debugCache) {\n beforeCompareTime = performance.now()\n }\n },\n onAfterCompare: (depsChanged: boolean) => {\n if (debugCache) {\n afterCompareTime = performance.now()\n const compareTime =\n Math.round((afterCompareTime - beforeCompareTime) * 100) / 100\n if (!depsChanged) {\n logTime(compareTime, depsChanged)\n }\n }\n },\n onBeforeUpdate: () => {\n if (debug) {\n startCalcTime = performance.now()\n }\n },\n onAfterUpdate: () => {\n if (debug) {\n endCalcTime = performance.now()\n const executionTime =\n Math.round((endCalcTime - startCalcTime) * 100) / 100\n logTime(executionTime, true)\n }\n onAfterUpdateHandler()\n },\n }\n : {\n onAfterUpdate: () => {\n onAfterUpdateHandler()\n },\n }\n\n return memo({\n ...memoOptions,\n ...debugOptions,\n })\n}\n\nexport interface API<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (...args: any) => any\n memoDeps?: (depArgs?: any) => [...any] | undefined\n}\n\nexport type APIObject<TDeps extends ReadonlyArray<any>, TDepArgs> = Record<\n string,\n API<TDeps, TDepArgs>\n>\n\n/**\n * Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n */\nexport function getFunctionNameInfo(\n staticFnName: string,\n splitBy: '_' | '.' = '_',\n) {\n const [parentName, fnKey] = staticFnName.split(splitBy)\n const fnName = `${parentName}.${fnKey}`\n return { fnKey, fnName, parentName } as {\n fnKey: string\n fnName: string\n parentName: string\n }\n}\n\n/**\n * Assigns Table API methods directly to the table instance.\n * Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n */\nexport function assignTableAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n table: Table_Internal<TFeatures, TData>,\n apis: APIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n ;(table as Record<string, any>)[fnKey] = memoDeps\n ? tableMemo({\n memoDeps,\n fn,\n fnName,\n table,\n feature,\n })\n : fn\n }\n}\n\nexport interface PrototypeAPI<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (self: any, ...args: any) => any\n memoDeps?: (self: any, depArgs?: any) => [...any] | undefined\n}\n\nexport type PrototypeAPIObject<\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n> = Record<string, PrototypeAPI<TDeps, TDepArgs>>\n\n/**\n * Assigns API methods to a prototype object for memory-efficient method sharing.\n * All instances created with this prototype will share the same method references.\n *\n * For memoized methods, the memo state is lazily created and stored on each instance.\n * This provides the best of both worlds: shared method code + per-instance caching.\n */\nexport function assignPrototypeAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n prototype: Record<string, any>,\n table: Table_Internal<TFeatures, TData>,\n apis: PrototypeAPIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n if (memoDeps) {\n // For memoized methods, create a function that lazily initializes\n // the memo on first access and stores it on the instance\n const memoKey = `_memo_${fnKey}`\n\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n // Lazily create memo on first access for this instance\n if (!this[memoKey]) {\n const self = this\n this[memoKey] = tableMemo({\n memoDeps: (depArgs) => memoDeps(self, depArgs),\n fn: (...deps) => fn(self, ...deps),\n fnName,\n objectId: self.id,\n table,\n feature,\n })\n }\n return this[memoKey](...args)\n }\n } else {\n // Non-memoized methods just call the static function with `this`\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n return fn(this, ...args)\n }\n }\n }\n}\n\n/**\n * Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fallback to the static method passed in.\n */\nexport function callMemoOrStaticFn<\n TObject extends Record<string, any>,\n TArgs extends Array<any>,\n TReturn,\n>(\n obj: TObject,\n fnKey: string,\n staticFn: (obj: TObject, ...args: TArgs) => TReturn,\n ...args: TArgs\n): TReturn {\n return (\n (obj[fnKey] as Function | undefined)?.(...args) ?? staticFn(obj, ...args)\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { Table_Internal } from './types/Table'\nimport type { NoInfer, RowData, Updater } from './types/type-utils'\nimport type { TableFeatures } from './types/TableFeatures'\nimport type { TableState, TableState_All } from './types/TableState'\n\n/**\n * Applies a TanStack updater to a value.\n *\n * If the updater is a function it is called with the previous value; otherwise the updater value is returned directly.\n */\nexport function functionalUpdate<T>(updater: Updater<T>, input: T): T {\n return typeof updater === 'function'\n ? (updater as (i: T) => T)(input)\n : updater\n}\n\n/**\n * Clones table state values while preserving non-plain objects.\n *\n * Plain objects and arrays are copied recursively so state updates can avoid mutating existing references.\n */\nexport function cloneState<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(cloneState) as T\n }\n\n if (value && typeof value === 'object') {\n const proto = Object.getPrototypeOf(value)\n\n if (proto !== Object.prototype && proto !== null) {\n return value\n }\n\n const copy: Record<string, unknown> = proto === null ? makeObjectMap() : {}\n const keys = Object.keys(value)\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]!\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n value: cloneState((value as Record<string, unknown>)[key]),\n writable: true,\n })\n }\n\n return copy as T\n }\n\n return value\n}\n\n/**\n * Copies prototype-instance own properties without carrying over lazy memo\n * closures or the per-row cell cache, both of which are bound to the source\n * instance (cached cells reference the source row).\n */\nexport function copyInstancePropertiesWithoutMemos<\n TTarget extends Record<string, any>,\n TSource extends Record<string, any>,\n>(target: TTarget, source: TSource): TTarget & TSource {\n const keys = Object.keys(source)\n const targetRecord = target as Record<string, any>\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]!\n if (!key.startsWith('_memo_') && key !== '_cellsCache') {\n targetRecord[key] = source[key]\n }\n }\n\n return target as TTarget & TSource\n}\n\n/**\n * Creates an object intended only for string-keyed dictionary lookups.\n *\n * The null prototype keeps user-controlled ids such as `__proto__` and\n * `hasOwnProperty` as plain data keys.\n */\nexport function makeObjectMap<TValue = unknown>(): Record<string, TValue> {\n return Object.create(null) as Record<string, TValue>\n}\n\n/**\n * Checks whether an object owns a key, including null-prototype dictionaries.\n */\nexport function hasOwn(obj: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key)\n}\n\n/**\n * Creates a table state updater for a single state slice.\n *\n * The updater writes through the table base atom for the slice and supports both value and functional updater forms.\n */\nexport function makeStateUpdater<\n TFeatures extends TableFeatures,\n K extends (string & {}) | keyof TableState_All | keyof TableState<TFeatures>,\n>(\n key: K,\n // Minimal structural shape so any table view (public `Table`,\n // `Table_Internal`, or a custom plugin table) can be passed without forcing\n // the compiler to relate the full table types.\n instance: {\n readonly options: { readonly atoms?: object | undefined }\n readonly baseAtoms: object\n },\n) {\n return (updater: Updater<TableState<any>[K & keyof TableState<any>]>) => {\n const externalAtom = (instance.options as any).atoms?.[key]\n const targetAtom = externalAtom ?? (instance.baseAtoms as any)[key]\n targetAtom.set((old: any) => functionalUpdate(updater, old))\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\n/**\n * Returns whether a value is a function.\n */\nexport function isFunction<T extends AnyFunction>(d: any): d is T {\n return d instanceof Function\n}\n\n/**\n * Flattens a tree of nodes by recursively reading child nodes.\n *\n * The original nodes are preserved in depth-first order.\n */\nexport function flattenBy<TNode>(\n arr: Array<TNode>,\n getChildren: (item: TNode) => Array<TNode>,\n) {\n const flat: Array<TNode> = []\n\n const recurse = (subArr: Array<TNode>) => {\n subArr.forEach((item) => {\n flat.push(item)\n const children = getChildren(item)\n if (children.length) {\n recurse(children)\n }\n })\n }\n\n recurse(arr)\n\n return flat\n}\n\ninterface MemoOptions<TDeps extends ReadonlyArray<any>, TDepArgs, TResult> {\n fn: (...args: NoInfer<TDeps>) => TResult\n memoDeps?: (depArgs?: TDepArgs) => [...TDeps] | undefined\n onAfterCompare?: (depsChanged: boolean) => void\n onAfterUpdate?: (result: TResult) => void\n onBeforeCompare?: () => void\n onBeforeUpdate?: () => void\n}\n\n/**\n * Creates a dependency-tracked memoized function for table internals.\n *\n * The memo recomputes only when its dependency tuple changes and can emit debug timing information.\n */\nexport const memo = <TDeps extends ReadonlyArray<any>, TDepArgs, TResult>({\n fn,\n memoDeps,\n onAfterCompare,\n onAfterUpdate,\n onBeforeCompare,\n onBeforeUpdate,\n}: MemoOptions<TDeps, TDepArgs, TResult>): ((\n depArgs?: TDepArgs,\n) => TResult) => {\n let deps: Array<any> | undefined = []\n let result: TResult | undefined\n\n const memoizedFn = (depArgs?: TDepArgs): TResult => {\n onBeforeCompare?.()\n const newDeps = memoDeps?.(depArgs)\n let depsChanged = !newDeps || newDeps.length !== deps?.length\n if (!depsChanged && newDeps) {\n for (let i = 0; i < newDeps.length; i++) {\n if (newDeps[i] !== deps![i]) {\n depsChanged = true\n break\n }\n }\n }\n onAfterCompare?.(depsChanged)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n onBeforeUpdate?.()\n result = fn(...(newDeps ?? ([] as any)))\n onAfterUpdate?.(result)\n\n return result\n }\n\n return memoizedFn\n}\n\ninterface TableMemoOptions<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n> extends MemoOptions<TDeps, TDepArgs, TResult> {\n feature?: keyof TFeatures & string\n fnName: string\n objectId?: string\n onAfterUpdate?: () => void\n table: Table_Internal<TFeatures, any>\n}\n\nconst pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n}\n\n/**\n * Creates a table-aware memoized function.\n *\n * This wraps `memo` with table debug options and feature metadata so row models and derived APIs can share consistent diagnostics.\n */\nexport function tableMemo<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n>({\n feature,\n fnName,\n objectId,\n onAfterUpdate,\n table,\n ...memoOptions\n}: TableMemoOptions<TFeatures, TDeps, TDepArgs, TResult>) {\n let beforeCompareTime: number\n let afterCompareTime: number\n let startCalcTime: number\n let endCalcTime: number\n let runCount = 0\n let debug: boolean | undefined\n let debugCache: boolean | undefined\n\n if (process.env.NODE_ENV === 'development') {\n const { debugAll } = table.options\n const { parentName } = getFunctionNameInfo(fnName, '.')\n\n const debugByParent =\n // @ts-expect-error\n table.options[\n `debug${(parentName != 'table' ? parentName + 's' : parentName).replace(\n parentName,\n parentName.charAt(0).toUpperCase() + parentName.slice(1),\n )}`\n ]\n const debugByFeature = feature\n ? // @ts-expect-error\n table.options[\n `debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`\n ]\n : false\n\n debug = debugAll || debugByParent || debugByFeature\n }\n\n function logTime(time: number, depsChanged: boolean) {\n const runType =\n runCount === 0\n ? '(1st run)'\n : depsChanged\n ? '(rerun #' + runCount + ')'\n : '(cache)'\n runCount++\n\n console.groupCollapsed(\n `%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split('.')[0]}Id: ${objectId})` : ''}`,\n `font-size: .6rem; font-weight: bold; ${\n depsChanged\n ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);`\n : ''\n } `,\n `color: ${runCount < 2 ? '#FF00FF' : '#FF1493'}`,\n 'color: #666',\n 'color: #87CEEB',\n )\n console.info({\n feature,\n state: table.store.state,\n deps: memoOptions.memoDeps?.toString(),\n })\n console.trace()\n console.groupEnd()\n }\n\n const onAfterUpdateHandler = () => {\n if (!onAfterUpdate) {\n return\n }\n\n const { schedule, untrack } = table._reactivity\n schedule(() => untrack(() => onAfterUpdate()))\n }\n\n const debugOptions =\n process.env.NODE_ENV === 'development'\n ? {\n onBeforeCompare: () => {\n if (debugCache) {\n beforeCompareTime = performance.now()\n }\n },\n onAfterCompare: (depsChanged: boolean) => {\n if (debugCache) {\n afterCompareTime = performance.now()\n const compareTime =\n Math.round((afterCompareTime - beforeCompareTime) * 100) / 100\n if (!depsChanged) {\n logTime(compareTime, depsChanged)\n }\n }\n },\n onBeforeUpdate: () => {\n if (debug) {\n startCalcTime = performance.now()\n }\n },\n onAfterUpdate: () => {\n if (debug) {\n endCalcTime = performance.now()\n const executionTime =\n Math.round((endCalcTime - startCalcTime) * 100) / 100\n logTime(executionTime, true)\n }\n onAfterUpdateHandler()\n },\n }\n : {\n onAfterUpdate: () => {\n onAfterUpdateHandler()\n },\n }\n\n return memo({\n ...memoOptions,\n ...debugOptions,\n })\n}\n\nexport interface API<_TDeps extends ReadonlyArray<any>, _TDepArgs> {\n fn: (...args: any) => any\n memoDeps?: (depArgs?: any) => [...any] | undefined\n}\n\nexport type APIObject<TDeps extends ReadonlyArray<any>, TDepArgs> = Record<\n string,\n API<TDeps, TDepArgs>\n>\n\n/**\n * Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n */\nexport function getFunctionNameInfo(\n staticFnName: string,\n splitBy: '_' | '.' = '_',\n) {\n const [parentName, fnKey] = staticFnName.split(splitBy)\n const fnName = `${parentName}.${fnKey}`\n return { fnKey, fnName, parentName } as {\n fnKey: string\n fnName: string\n parentName: string\n }\n}\n\n/**\n * Assigns Table API methods directly to the table instance.\n * Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n */\nexport function assignTableAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n table: Table_Internal<TFeatures, TData>,\n apis: APIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n ;(table as Record<string, any>)[fnKey] = memoDeps\n ? tableMemo({\n memoDeps,\n fn,\n fnName,\n table,\n feature,\n })\n : fn\n }\n}\n\nexport interface PrototypeAPI<_TDeps extends ReadonlyArray<any>, _TDepArgs> {\n fn: (self: any, ...args: any) => any\n memoDeps?: (self: any, depArgs?: any) => [...any] | undefined\n}\n\nexport type PrototypeAPIObject<\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n> = Record<string, PrototypeAPI<TDeps, TDepArgs>>\n\n/**\n * Assigns API methods to a prototype object for memory-efficient method sharing.\n * All instances created with this prototype will share the same method references.\n *\n * For memoized methods, the memo state is lazily created and stored on each instance.\n * This provides the best of both worlds: shared method code + per-instance caching.\n */\nexport function assignPrototypeAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n prototype: Record<string, any>,\n table: Table_Internal<TFeatures, TData>,\n apis: PrototypeAPIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n if (memoDeps) {\n // For memoized methods, create a function that lazily initializes\n // the memo on first access and stores it on the instance\n const memoKey = `_memo_${fnKey}`\n\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n // Lazily create memo on first access for this instance\n if (!this[memoKey]) {\n const self = this\n this[memoKey] = tableMemo({\n memoDeps: (depArgs) => memoDeps(self, depArgs),\n fn: (...deps) => fn(self, ...deps),\n fnName,\n objectId: self.id,\n table,\n feature,\n })\n }\n return this[memoKey](...args)\n }\n } else {\n // Non-memoized methods just call the static function with `this`\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n return fn(this, ...args)\n }\n }\n }\n}\n\n/**\n * Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fallback to the static method passed in.\n */\nexport function callMemoOrStaticFn<\n TObject extends Record<string, any>,\n TArgs extends Array<any>,\n TReturn,\n>(\n obj: TObject,\n fnKey: string,\n staticFn: (obj: TObject, ...args: TArgs) => TReturn,\n ...args: TArgs\n): TReturn {\n return (\n (obj[fnKey] as Function | undefined)?.(...args) ?? staticFn(obj, ...args)\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
const require_rowPaginationFeature_utils = require('../features/row-pagination/rowPaginationFeature.utils.cjs');
|
|
2
|
+
const require_rowExpandingFeature_utils = require('../features/row-expanding/rowExpandingFeature.utils.cjs');
|
|
3
|
+
const require_tableWorkerProtocol = require('./tableWorkerProtocol.cjs');
|
|
4
|
+
|
|
5
|
+
//#region src/worker/createTableWorker.ts
|
|
6
|
+
/**
|
|
7
|
+
* Registers the `workerRowModels` state slice
|
|
8
|
+
* (`{ version, isPending, lastComputeMs, lastRoundTripMs }`). Worker results
|
|
9
|
+
* land by bumping `version`, so re-renders flow through the exact same state
|
|
10
|
+
* mechanism as every other table state change.
|
|
11
|
+
*/
|
|
12
|
+
const workerRowModelsFeature = { getInitialState: (initialState) => ({
|
|
13
|
+
workerRowModels: {
|
|
14
|
+
version: 0,
|
|
15
|
+
isPending: false
|
|
16
|
+
},
|
|
17
|
+
...initialState
|
|
18
|
+
}) };
|
|
19
|
+
/**
|
|
20
|
+
* Creates the shared worker handle for a table's worker-backed row models.
|
|
21
|
+
* Pass it to `createWorkerRowModel()` once per stage you want offloaded.
|
|
22
|
+
*/
|
|
23
|
+
function createTableWorker(options) {
|
|
24
|
+
const liveBridges = /* @__PURE__ */ new Set();
|
|
25
|
+
return {
|
|
26
|
+
_options: options,
|
|
27
|
+
_bridges: /* @__PURE__ */ new WeakMap(),
|
|
28
|
+
_liveBridges: liveBridges,
|
|
29
|
+
terminate: () => {
|
|
30
|
+
for (const bridge of liveBridges) {
|
|
31
|
+
bridge.worker?.terminate();
|
|
32
|
+
bridge.worker = null;
|
|
33
|
+
bridge.failed = false;
|
|
34
|
+
bridge.lastData = void 0;
|
|
35
|
+
bridge.inFlight = false;
|
|
36
|
+
bridge.needsProcess = true;
|
|
37
|
+
bridge.sentState = null;
|
|
38
|
+
bridge.sentStageCount = 0;
|
|
39
|
+
}
|
|
40
|
+
liveBridges.clear();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function getTableWorkerBridge(tableWorker, table) {
|
|
45
|
+
let bridge = tableWorker._bridges.get(table);
|
|
46
|
+
if (!bridge) {
|
|
47
|
+
bridge = {
|
|
48
|
+
worker: null,
|
|
49
|
+
failed: false,
|
|
50
|
+
lastData: void 0,
|
|
51
|
+
dataVersion: 0,
|
|
52
|
+
requestId: 0,
|
|
53
|
+
resultRequestId: 0,
|
|
54
|
+
inFlight: false,
|
|
55
|
+
needsProcess: true,
|
|
56
|
+
sentAt: 0,
|
|
57
|
+
stages: /* @__PURE__ */ new Set(),
|
|
58
|
+
sentState: null,
|
|
59
|
+
sentStageCount: 0,
|
|
60
|
+
lastState: {},
|
|
61
|
+
results: {},
|
|
62
|
+
stageVersions: {}
|
|
63
|
+
};
|
|
64
|
+
tableWorker._bridges.set(table, bridge);
|
|
65
|
+
}
|
|
66
|
+
return bridge;
|
|
67
|
+
}
|
|
68
|
+
/** Shallow reference comparison; atoms return stable refs when unchanged. */
|
|
69
|
+
function statesEqual(a, b) {
|
|
70
|
+
if (a === null) return false;
|
|
71
|
+
const aKeys = Object.keys(a);
|
|
72
|
+
const bKeys = Object.keys(b);
|
|
73
|
+
if (aKeys.length !== bKeys.length) return false;
|
|
74
|
+
for (const key of bKeys) if (a[key] !== b[key]) return false;
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
function setWorkerRowModelsState(table, update) {
|
|
78
|
+
table.baseAtoms.workerRowModels?.set((prev) => update(prev ?? { version: 0 }));
|
|
79
|
+
}
|
|
80
|
+
function postProcess(table, bridge) {
|
|
81
|
+
const stages = require_tableWorkerProtocol.tableWorkerPipeline.filter((stage) => bridge.stages.has(stage));
|
|
82
|
+
bridge.needsProcess = false;
|
|
83
|
+
bridge.sentState = bridge.lastState;
|
|
84
|
+
bridge.sentStageCount = bridge.stages.size;
|
|
85
|
+
bridge.inFlight = true;
|
|
86
|
+
bridge.sentAt = performance.now();
|
|
87
|
+
const requestId = ++bridge.requestId;
|
|
88
|
+
bridge.worker.postMessage({
|
|
89
|
+
type: "process",
|
|
90
|
+
requestId,
|
|
91
|
+
dataVersion: bridge.dataVersion,
|
|
92
|
+
stages,
|
|
93
|
+
state: bridge.lastState
|
|
94
|
+
});
|
|
95
|
+
table._reactivity.schedule(() => {
|
|
96
|
+
if (bridge.requestId === requestId && bridge.resultRequestId < requestId) setWorkerRowModelsState(table, (prev) => ({
|
|
97
|
+
...prev,
|
|
98
|
+
isPending: true
|
|
99
|
+
}));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function handleResult(table, bridge, message) {
|
|
103
|
+
if (message.requestId !== bridge.requestId) return;
|
|
104
|
+
bridge.inFlight = false;
|
|
105
|
+
bridge.resultRequestId = message.requestId;
|
|
106
|
+
if (message.dataVersion !== bridge.dataVersion) {
|
|
107
|
+
postProcess(table, bridge);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let anyChanged = false;
|
|
111
|
+
let groupedChanged = false;
|
|
112
|
+
for (const [stage, payload] of Object.entries(message.stages)) {
|
|
113
|
+
if (payload.kind === "unchanged") continue;
|
|
114
|
+
bridge.results[stage] = payload;
|
|
115
|
+
bridge.stageVersions[stage] = (bridge.stageVersions[stage] ?? 0) + 1;
|
|
116
|
+
anyChanged = true;
|
|
117
|
+
if (stage === "grouped") groupedChanged = true;
|
|
118
|
+
}
|
|
119
|
+
const roundTripMs = performance.now() - bridge.sentAt;
|
|
120
|
+
setWorkerRowModelsState(table, (prev) => ({
|
|
121
|
+
version: (prev.version ?? 0) + 1,
|
|
122
|
+
isPending: false,
|
|
123
|
+
lastComputeMs: message.computeMs,
|
|
124
|
+
lastRoundTripMs: roundTripMs
|
|
125
|
+
}));
|
|
126
|
+
if (anyChanged) table._reactivity.schedule(() => table._reactivity.untrack(() => {
|
|
127
|
+
if (groupedChanged) require_rowExpandingFeature_utils.table_autoResetExpanded(table);
|
|
128
|
+
require_rowPaginationFeature_utils.table_autoResetPageIndex(table);
|
|
129
|
+
}));
|
|
130
|
+
if (bridge.needsProcess) postProcess(table, bridge);
|
|
131
|
+
}
|
|
132
|
+
function handleError(table, bridge, event) {
|
|
133
|
+
if (bridge.failed) return;
|
|
134
|
+
bridge.failed = true;
|
|
135
|
+
bridge.inFlight = false;
|
|
136
|
+
console.error("[table-worker] The table worker failed; worker row models will keep their last results and stop updating. Check that the worker entry loads and that its initTableWorker() config is thread-portable.", event);
|
|
137
|
+
bridge.worker?.terminate();
|
|
138
|
+
bridge.worker = null;
|
|
139
|
+
setWorkerRowModelsState(table, (prev) => ({
|
|
140
|
+
...prev,
|
|
141
|
+
isPending: false
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
function ensureWorker(tableWorker, table, bridge) {
|
|
145
|
+
if (bridge.worker) return;
|
|
146
|
+
bridge.worker = tableWorker._options.createWorker();
|
|
147
|
+
tableWorker._liveBridges.add(bridge);
|
|
148
|
+
bridge.worker.onmessage = (event) => {
|
|
149
|
+
handleResult(table, bridge, event.data);
|
|
150
|
+
};
|
|
151
|
+
bridge.worker.onerror = (event) => handleError(table, bridge, event);
|
|
152
|
+
bridge.worker.onmessageerror = (event) => handleError(table, bridge, event);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Pull-based sync, called at the top of every worker-backed row model read
|
|
156
|
+
* (i.e. every render). Posts data on identity change and a single-flight
|
|
157
|
+
* process request on state change; both are cheap no-ops otherwise, and
|
|
158
|
+
* multiple stages sharing the handle dedupe onto one request.
|
|
159
|
+
*/
|
|
160
|
+
function syncTableWorker(tableWorker, table) {
|
|
161
|
+
if (typeof Worker === "undefined") return;
|
|
162
|
+
const bridge = getTableWorkerBridge(tableWorker, table);
|
|
163
|
+
if (bridge.failed) return;
|
|
164
|
+
ensureWorker(tableWorker, table, bridge);
|
|
165
|
+
const data = table.options.data;
|
|
166
|
+
if (data !== bridge.lastData) {
|
|
167
|
+
bridge.lastData = data;
|
|
168
|
+
bridge.dataVersion++;
|
|
169
|
+
bridge.worker.postMessage({
|
|
170
|
+
type: "data",
|
|
171
|
+
dataVersion: bridge.dataVersion,
|
|
172
|
+
data
|
|
173
|
+
});
|
|
174
|
+
bridge.needsProcess = true;
|
|
175
|
+
}
|
|
176
|
+
const atoms = table.atoms;
|
|
177
|
+
const state = {};
|
|
178
|
+
for (const stage of bridge.stages) for (const key of require_tableWorkerProtocol.tableWorkerStageStateDeps[stage]) state[key] = atoms[key]?.get();
|
|
179
|
+
bridge.lastState = state;
|
|
180
|
+
if (!bridge.needsProcess && (!statesEqual(bridge.sentState, state) || bridge.stages.size !== bridge.sentStageCount)) bridge.needsProcess = true;
|
|
181
|
+
if (bridge.needsProcess && !bridge.inFlight) postProcess(table, bridge);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
//#endregion
|
|
185
|
+
exports.createTableWorker = createTableWorker;
|
|
186
|
+
exports.getTableWorkerBridge = getTableWorkerBridge;
|
|
187
|
+
exports.syncTableWorker = syncTableWorker;
|
|
188
|
+
exports.workerRowModelsFeature = workerRowModelsFeature;
|
|
189
|
+
//# sourceMappingURL=createTableWorker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTableWorker.cjs","names":["tableWorkerPipeline","tableWorkerStageStateDeps"],"sources":["../../src/worker/createTableWorker.ts"],"sourcesContent":["import { table_autoResetPageIndex } from '../features/row-pagination/rowPaginationFeature.utils'\nimport { table_autoResetExpanded } from '../features/row-expanding/rowExpandingFeature.utils'\nimport {\n tableWorkerPipeline,\n tableWorkerStageStateDeps,\n} from './tableWorkerProtocol'\nimport type { Table_Internal } from '../types/Table'\nimport type { TableFeature } from '../types/TableFeatures'\nimport type { TableWorkerDataPayload } from './rebuildRowModel'\nimport type {\n TableState_WorkerRowModels,\n TableWorkerResponse,\n TableWorkerStage,\n TableWorkerStagePayload,\n} from './tableWorkerProtocol'\n\n// Importing anything from this module (e.g. `workerRowModelsFeature`)\n// registers the plugin key and its state slice with the core type maps, so\n// userland needs no `declare module` of its own. Apps that never use worker\n// row models never load this module and never see the types.\ndeclare module '../types/TableFeatures' {\n interface Plugins {\n workerRowModelsFeature: TableFeature\n }\n}\ndeclare module '../types/TableState' {\n interface TableState_FeatureMap {\n workerRowModelsFeature: TableState_WorkerRowModels\n }\n}\n\nexport interface TableWorkerOptions {\n /**\n * Creates the dedicated worker that runs the shadow table. The worker entry\n * must call `initTableWorker` with the same columns and processing config.\n *\n * The `new Worker(new URL(...))` expression must live in your code (not the\n * library) so your bundler can statically discover and bundle the worker\n * entry file.\n *\n * @example\n * ```ts\n * createWorker: () =>\n * new Worker(new URL('./table.worker.ts', import.meta.url), {\n * type: 'module',\n * })\n * ```\n */\n createWorker: () => Worker\n}\n\nexport interface TableWorkerBridge {\n worker: Worker | null\n /** The worker errored (load failure or uncaught throw); stop posting. */\n failed: boolean\n lastData: unknown\n dataVersion: number\n requestId: number\n resultRequestId: number\n /** A process request has been posted and its result has not arrived yet. */\n inFlight: boolean\n /** State changed since the last posted request; post when possible. */\n needsProcess: boolean\n sentAt: number\n /** The stages registered on this table (grows as factories initialize). */\n stages: Set<TableWorkerStage>\n /** Snapshot of state refs + stage count captured at the last post. */\n sentState: Record<string, unknown> | null\n sentStageCount: number\n /** Latest observed state refs, posted on the trailing edge if in flight. */\n lastState: Record<string, unknown>\n results: { [K in TableWorkerStage]?: TableWorkerDataPayload }\n /** Bumped per stage only when that stage's payload actually changed. */\n stageVersions: { [K in TableWorkerStage]?: number }\n}\n\ntype AnyTable = Table_Internal<any, any>\n\n/**\n * A handle shared by every worker-backed row model on a table. It owns the\n * worker instance and the per-table request/result bookkeeping, so registering\n * one stage or four costs exactly one worker and one round trip per change.\n */\nexport interface TableWorker {\n _options: TableWorkerOptions\n _bridges: WeakMap<object, TableWorkerBridge>\n _liveBridges: Set<TableWorkerBridge>\n /**\n * Terminates every worker created through this handle and resets the\n * bookkeeping. Safe to call at any time: the next row model read lazily\n * recreates the worker and re-sends the data (self-healing). Note that\n * nothing calls this automatically yet; React StrictMode double-mounts and\n * HMR updates still leak a worker in development until the reactivity\n * bindings grow a real `unmount` hook.\n */\n terminate: () => void\n}\n\n/**\n * Registers the `workerRowModels` state slice\n * (`{ version, isPending, lastComputeMs, lastRoundTripMs }`). Worker results\n * land by bumping `version`, so re-renders flow through the exact same state\n * mechanism as every other table state change.\n */\nexport const workerRowModelsFeature: TableFeature = {\n getInitialState: (initialState: any) => ({\n workerRowModels: { version: 0, isPending: false },\n ...initialState,\n }),\n}\n\n/**\n * Creates the shared worker handle for a table's worker-backed row models.\n * Pass it to `createWorkerRowModel()` once per stage you want offloaded.\n */\nexport function createTableWorker(options: TableWorkerOptions): TableWorker {\n const liveBridges = new Set<TableWorkerBridge>()\n return {\n _options: options,\n _bridges: new WeakMap(),\n _liveBridges: liveBridges,\n terminate: () => {\n for (const bridge of liveBridges) {\n bridge.worker?.terminate()\n bridge.worker = null\n bridge.failed = false\n bridge.lastData = undefined\n bridge.inFlight = false\n bridge.needsProcess = true\n bridge.sentState = null\n bridge.sentStageCount = 0\n }\n liveBridges.clear()\n },\n }\n}\n\nexport function getTableWorkerBridge(\n tableWorker: TableWorker,\n table: AnyTable,\n): TableWorkerBridge {\n let bridge = tableWorker._bridges.get(table)\n if (!bridge) {\n bridge = {\n worker: null,\n failed: false,\n lastData: undefined,\n dataVersion: 0,\n requestId: 0,\n resultRequestId: 0,\n inFlight: false,\n needsProcess: true,\n sentAt: 0,\n stages: new Set(),\n sentState: null,\n sentStageCount: 0,\n lastState: {},\n results: {},\n stageVersions: {},\n }\n tableWorker._bridges.set(table, bridge)\n }\n return bridge\n}\n\n/** Shallow reference comparison; atoms return stable refs when unchanged. */\nfunction statesEqual(\n a: Record<string, unknown> | null,\n b: Record<string, unknown>,\n): boolean {\n if (a === null) return false\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n for (const key of bKeys) {\n if (a[key] !== b[key]) return false\n }\n return true\n}\n\nfunction setWorkerRowModelsState(\n table: AnyTable,\n update: (prev: any) => Record<string, unknown>,\n) {\n const stateAtom = (table.baseAtoms as Record<string, any>).workerRowModels\n stateAtom?.set((prev: any) => update(prev ?? { version: 0 }))\n}\n\nfunction postProcess(table: AnyTable, bridge: TableWorkerBridge): void {\n const stages = tableWorkerPipeline.filter((stage) => bridge.stages.has(stage))\n bridge.needsProcess = false\n bridge.sentState = bridge.lastState\n bridge.sentStageCount = bridge.stages.size\n bridge.inFlight = true\n bridge.sentAt = performance.now()\n const requestId = ++bridge.requestId\n bridge.worker!.postMessage({\n type: 'process',\n requestId,\n dataVersion: bridge.dataVersion,\n stages,\n state: bridge.lastState,\n })\n // postProcess can run during render (via sync); defer the pending write.\n table._reactivity.schedule(() => {\n if (bridge.requestId === requestId && bridge.resultRequestId < requestId) {\n setWorkerRowModelsState(table, (prev) => ({ ...prev, isPending: true }))\n }\n })\n}\n\nfunction handleResult(\n table: AnyTable,\n bridge: TableWorkerBridge,\n message: TableWorkerResponse,\n) {\n if (message.requestId !== bridge.requestId) return\n bridge.inFlight = false\n bridge.resultRequestId = message.requestId\n\n // A data change raced this request: the result is for the old dataset.\n // Drop it and immediately re-process against the new data.\n if (message.dataVersion !== bridge.dataVersion) {\n postProcess(table, bridge)\n return\n }\n\n // Merge stage payloads: `unchanged` keeps the previous result (and its\n // rebuilt model, via the per-stage version), changed payloads replace it.\n let anyChanged = false\n let groupedChanged = false\n for (const [stage, payload] of Object.entries(message.stages) as Array<\n [TableWorkerStage, TableWorkerStagePayload]\n >) {\n if (payload.kind === 'unchanged') continue\n bridge.results[stage] = payload\n bridge.stageVersions[stage] = (bridge.stageVersions[stage] ?? 0) + 1\n anyChanged = true\n if (stage === 'grouped') groupedChanged = true\n }\n\n const roundTripMs = performance.now() - bridge.sentAt\n setWorkerRowModelsState(table, (prev) => ({\n version: (prev.version ?? 0) + 1,\n isPending: false,\n lastComputeMs: message.computeMs,\n lastRoundTripMs: roundTripMs,\n }))\n\n // The async equivalent of the sync models' `onAfterUpdate` hooks. The\n // worker's unchanged-detection is its memo identity, so `groupedChanged`\n // mirrors exactly when the sync grouped model would have recomputed (and\n // reset expansion).\n if (anyChanged) {\n table._reactivity.schedule(() =>\n table._reactivity.untrack(() => {\n if (groupedChanged) {\n table_autoResetExpanded(table)\n }\n table_autoResetPageIndex(table)\n }),\n )\n }\n\n // Trailing edge: state changed while this request was in flight.\n if (bridge.needsProcess) {\n postProcess(table, bridge)\n }\n}\n\nfunction handleError(\n table: AnyTable,\n bridge: TableWorkerBridge,\n event: unknown,\n) {\n if (bridge.failed) return\n bridge.failed = true\n bridge.inFlight = false\n console.error(\n '[table-worker] The table worker failed; worker row models will keep ' +\n 'their last results and stop updating. Check that the worker entry ' +\n 'loads and that its initTableWorker() config is thread-portable.',\n event,\n )\n bridge.worker?.terminate()\n bridge.worker = null\n setWorkerRowModelsState(table, (prev) => ({ ...prev, isPending: false }))\n}\n\nfunction ensureWorker(\n tableWorker: TableWorker,\n table: AnyTable,\n bridge: TableWorkerBridge,\n) {\n if (bridge.worker) return\n bridge.worker = tableWorker._options.createWorker()\n tableWorker._liveBridges.add(bridge)\n bridge.worker.onmessage = (event: MessageEvent<TableWorkerResponse>) => {\n handleResult(table, bridge, event.data)\n }\n bridge.worker.onerror = (event) => handleError(table, bridge, event)\n bridge.worker.onmessageerror = (event) => handleError(table, bridge, event)\n}\n\n/**\n * Pull-based sync, called at the top of every worker-backed row model read\n * (i.e. every render). Posts data on identity change and a single-flight\n * process request on state change; both are cheap no-ops otherwise, and\n * multiple stages sharing the handle dedupe onto one request.\n */\nexport function syncTableWorker(tableWorker: TableWorker, table: AnyTable) {\n // SSR: no Worker global. Getters fall back to pre-stage models, so the\n // server renders unprocessed rows and the client takes over after hydration.\n if (typeof Worker === 'undefined') return\n\n const bridge = getTableWorkerBridge(tableWorker, table)\n if (bridge.failed) return\n ensureWorker(tableWorker, table, bridge)\n\n const data = table.options.data\n if (data !== bridge.lastData) {\n bridge.lastData = data\n bridge.dataVersion++\n bridge.worker!.postMessage({\n type: 'data',\n dataVersion: bridge.dataVersion,\n data,\n })\n bridge.needsProcess = true\n }\n\n // Union of the registered stages' state deps, compared by reference (atoms\n // return stable refs when a slice did not change).\n const atoms = table.atoms as Record<string, any>\n const state: Record<string, unknown> = {}\n for (const stage of bridge.stages) {\n for (const key of tableWorkerStageStateDeps[stage]) {\n state[key] = atoms[key]?.get()\n }\n }\n bridge.lastState = state\n\n if (\n !bridge.needsProcess &&\n (!statesEqual(bridge.sentState, state) ||\n bridge.stages.size !== bridge.sentStageCount)\n ) {\n bridge.needsProcess = true\n }\n\n // Single-flight: at most one request in the worker at a time. If one is in\n // flight, the latest state is posted from the result handler (trailing\n // edge), so rapid input coalesces instead of queueing doomed computes.\n if (bridge.needsProcess && !bridge.inFlight) {\n postProcess(table, bridge)\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { TableState_WorkerRowModels, TableWorkerStage } from "./tableWorkerProtocol.cjs";
|
|
2
|
+
import { Table } from "../types/Table.cjs";
|
|
3
|
+
import { TableFeature } from "../types/TableFeatures.cjs";
|
|
4
|
+
import { TableWorkerDataPayload } from "./rebuildRowModel.cjs";
|
|
5
|
+
|
|
6
|
+
//#region src/worker/createTableWorker.d.ts
|
|
7
|
+
declare module '../types/TableFeatures' {
|
|
8
|
+
interface Plugins {
|
|
9
|
+
workerRowModelsFeature: TableFeature;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
declare module '../types/TableState' {
|
|
13
|
+
interface TableState_FeatureMap {
|
|
14
|
+
workerRowModelsFeature: TableState_WorkerRowModels;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
interface TableWorkerOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Creates the dedicated worker that runs the shadow table. The worker entry
|
|
20
|
+
* must call `initTableWorker` with the same columns and processing config.
|
|
21
|
+
*
|
|
22
|
+
* The `new Worker(new URL(...))` expression must live in your code (not the
|
|
23
|
+
* library) so your bundler can statically discover and bundle the worker
|
|
24
|
+
* entry file.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* createWorker: () =>
|
|
29
|
+
* new Worker(new URL('./table.worker.ts', import.meta.url), {
|
|
30
|
+
* type: 'module',
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
createWorker: () => Worker;
|
|
35
|
+
}
|
|
36
|
+
interface TableWorkerBridge {
|
|
37
|
+
worker: Worker | null;
|
|
38
|
+
/** The worker errored (load failure or uncaught throw); stop posting. */
|
|
39
|
+
failed: boolean;
|
|
40
|
+
lastData: unknown;
|
|
41
|
+
dataVersion: number;
|
|
42
|
+
requestId: number;
|
|
43
|
+
resultRequestId: number;
|
|
44
|
+
/** A process request has been posted and its result has not arrived yet. */
|
|
45
|
+
inFlight: boolean;
|
|
46
|
+
/** State changed since the last posted request; post when possible. */
|
|
47
|
+
needsProcess: boolean;
|
|
48
|
+
sentAt: number;
|
|
49
|
+
/** The stages registered on this table (grows as factories initialize). */
|
|
50
|
+
stages: Set<TableWorkerStage>;
|
|
51
|
+
/** Snapshot of state refs + stage count captured at the last post. */
|
|
52
|
+
sentState: Record<string, unknown> | null;
|
|
53
|
+
sentStageCount: number;
|
|
54
|
+
/** Latest observed state refs, posted on the trailing edge if in flight. */
|
|
55
|
+
lastState: Record<string, unknown>;
|
|
56
|
+
results: { [K in TableWorkerStage]?: TableWorkerDataPayload };
|
|
57
|
+
/** Bumped per stage only when that stage's payload actually changed. */
|
|
58
|
+
stageVersions: { [K in TableWorkerStage]?: number };
|
|
59
|
+
}
|
|
60
|
+
type AnyTable = Table<any, any>;
|
|
61
|
+
/**
|
|
62
|
+
* A handle shared by every worker-backed row model on a table. It owns the
|
|
63
|
+
* worker instance and the per-table request/result bookkeeping, so registering
|
|
64
|
+
* one stage or four costs exactly one worker and one round trip per change.
|
|
65
|
+
*/
|
|
66
|
+
interface TableWorker {
|
|
67
|
+
_options: TableWorkerOptions;
|
|
68
|
+
_bridges: WeakMap<object, TableWorkerBridge>;
|
|
69
|
+
_liveBridges: Set<TableWorkerBridge>;
|
|
70
|
+
/**
|
|
71
|
+
* Terminates every worker created through this handle and resets the
|
|
72
|
+
* bookkeeping. Safe to call at any time: the next row model read lazily
|
|
73
|
+
* recreates the worker and re-sends the data (self-healing). Note that
|
|
74
|
+
* nothing calls this automatically yet; React StrictMode double-mounts and
|
|
75
|
+
* HMR updates still leak a worker in development until the reactivity
|
|
76
|
+
* bindings grow a real `unmount` hook.
|
|
77
|
+
*/
|
|
78
|
+
terminate: () => void;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Registers the `workerRowModels` state slice
|
|
82
|
+
* (`{ version, isPending, lastComputeMs, lastRoundTripMs }`). Worker results
|
|
83
|
+
* land by bumping `version`, so re-renders flow through the exact same state
|
|
84
|
+
* mechanism as every other table state change.
|
|
85
|
+
*/
|
|
86
|
+
declare const workerRowModelsFeature: TableFeature;
|
|
87
|
+
/**
|
|
88
|
+
* Creates the shared worker handle for a table's worker-backed row models.
|
|
89
|
+
* Pass it to `createWorkerRowModel()` once per stage you want offloaded.
|
|
90
|
+
*/
|
|
91
|
+
declare function createTableWorker(options: TableWorkerOptions): TableWorker;
|
|
92
|
+
declare function getTableWorkerBridge(tableWorker: TableWorker, table: AnyTable): TableWorkerBridge;
|
|
93
|
+
/**
|
|
94
|
+
* Pull-based sync, called at the top of every worker-backed row model read
|
|
95
|
+
* (i.e. every render). Posts data on identity change and a single-flight
|
|
96
|
+
* process request on state change; both are cheap no-ops otherwise, and
|
|
97
|
+
* multiple stages sharing the handle dedupe onto one request.
|
|
98
|
+
*/
|
|
99
|
+
declare function syncTableWorker(tableWorker: TableWorker, table: AnyTable): void;
|
|
100
|
+
//#endregion
|
|
101
|
+
export { TableWorker, TableWorkerBridge, TableWorkerOptions, createTableWorker, getTableWorkerBridge, syncTableWorker, workerRowModelsFeature };
|
|
102
|
+
//# sourceMappingURL=createTableWorker.d.cts.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { TableState_WorkerRowModels, TableWorkerStage } from "./tableWorkerProtocol.js";
|
|
2
|
+
import { Table } from "../types/Table.js";
|
|
3
|
+
import { TableFeature } from "../types/TableFeatures.js";
|
|
4
|
+
import { TableWorkerDataPayload } from "./rebuildRowModel.js";
|
|
5
|
+
|
|
6
|
+
//#region src/worker/createTableWorker.d.ts
|
|
7
|
+
declare module '../types/TableFeatures' {
|
|
8
|
+
interface Plugins {
|
|
9
|
+
workerRowModelsFeature: TableFeature;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
declare module '../types/TableState' {
|
|
13
|
+
interface TableState_FeatureMap {
|
|
14
|
+
workerRowModelsFeature: TableState_WorkerRowModels;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
interface TableWorkerOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Creates the dedicated worker that runs the shadow table. The worker entry
|
|
20
|
+
* must call `initTableWorker` with the same columns and processing config.
|
|
21
|
+
*
|
|
22
|
+
* The `new Worker(new URL(...))` expression must live in your code (not the
|
|
23
|
+
* library) so your bundler can statically discover and bundle the worker
|
|
24
|
+
* entry file.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* createWorker: () =>
|
|
29
|
+
* new Worker(new URL('./table.worker.ts', import.meta.url), {
|
|
30
|
+
* type: 'module',
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
createWorker: () => Worker;
|
|
35
|
+
}
|
|
36
|
+
interface TableWorkerBridge {
|
|
37
|
+
worker: Worker | null;
|
|
38
|
+
/** The worker errored (load failure or uncaught throw); stop posting. */
|
|
39
|
+
failed: boolean;
|
|
40
|
+
lastData: unknown;
|
|
41
|
+
dataVersion: number;
|
|
42
|
+
requestId: number;
|
|
43
|
+
resultRequestId: number;
|
|
44
|
+
/** A process request has been posted and its result has not arrived yet. */
|
|
45
|
+
inFlight: boolean;
|
|
46
|
+
/** State changed since the last posted request; post when possible. */
|
|
47
|
+
needsProcess: boolean;
|
|
48
|
+
sentAt: number;
|
|
49
|
+
/** The stages registered on this table (grows as factories initialize). */
|
|
50
|
+
stages: Set<TableWorkerStage>;
|
|
51
|
+
/** Snapshot of state refs + stage count captured at the last post. */
|
|
52
|
+
sentState: Record<string, unknown> | null;
|
|
53
|
+
sentStageCount: number;
|
|
54
|
+
/** Latest observed state refs, posted on the trailing edge if in flight. */
|
|
55
|
+
lastState: Record<string, unknown>;
|
|
56
|
+
results: { [K in TableWorkerStage]?: TableWorkerDataPayload };
|
|
57
|
+
/** Bumped per stage only when that stage's payload actually changed. */
|
|
58
|
+
stageVersions: { [K in TableWorkerStage]?: number };
|
|
59
|
+
}
|
|
60
|
+
type AnyTable = Table<any, any>;
|
|
61
|
+
/**
|
|
62
|
+
* A handle shared by every worker-backed row model on a table. It owns the
|
|
63
|
+
* worker instance and the per-table request/result bookkeeping, so registering
|
|
64
|
+
* one stage or four costs exactly one worker and one round trip per change.
|
|
65
|
+
*/
|
|
66
|
+
interface TableWorker {
|
|
67
|
+
_options: TableWorkerOptions;
|
|
68
|
+
_bridges: WeakMap<object, TableWorkerBridge>;
|
|
69
|
+
_liveBridges: Set<TableWorkerBridge>;
|
|
70
|
+
/**
|
|
71
|
+
* Terminates every worker created through this handle and resets the
|
|
72
|
+
* bookkeeping. Safe to call at any time: the next row model read lazily
|
|
73
|
+
* recreates the worker and re-sends the data (self-healing). Note that
|
|
74
|
+
* nothing calls this automatically yet; React StrictMode double-mounts and
|
|
75
|
+
* HMR updates still leak a worker in development until the reactivity
|
|
76
|
+
* bindings grow a real `unmount` hook.
|
|
77
|
+
*/
|
|
78
|
+
terminate: () => void;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Registers the `workerRowModels` state slice
|
|
82
|
+
* (`{ version, isPending, lastComputeMs, lastRoundTripMs }`). Worker results
|
|
83
|
+
* land by bumping `version`, so re-renders flow through the exact same state
|
|
84
|
+
* mechanism as every other table state change.
|
|
85
|
+
*/
|
|
86
|
+
declare const workerRowModelsFeature: TableFeature;
|
|
87
|
+
/**
|
|
88
|
+
* Creates the shared worker handle for a table's worker-backed row models.
|
|
89
|
+
* Pass it to `createWorkerRowModel()` once per stage you want offloaded.
|
|
90
|
+
*/
|
|
91
|
+
declare function createTableWorker(options: TableWorkerOptions): TableWorker;
|
|
92
|
+
declare function getTableWorkerBridge(tableWorker: TableWorker, table: AnyTable): TableWorkerBridge;
|
|
93
|
+
/**
|
|
94
|
+
* Pull-based sync, called at the top of every worker-backed row model read
|
|
95
|
+
* (i.e. every render). Posts data on identity change and a single-flight
|
|
96
|
+
* process request on state change; both are cheap no-ops otherwise, and
|
|
97
|
+
* multiple stages sharing the handle dedupe onto one request.
|
|
98
|
+
*/
|
|
99
|
+
declare function syncTableWorker(tableWorker: TableWorker, table: AnyTable): void;
|
|
100
|
+
//#endregion
|
|
101
|
+
export { TableWorker, TableWorkerBridge, TableWorkerOptions, createTableWorker, getTableWorkerBridge, syncTableWorker, workerRowModelsFeature };
|
|
102
|
+
//# sourceMappingURL=createTableWorker.d.ts.map
|