diff --git a/packages/angular-table/src/injectTable.ts b/packages/angular-table/src/injectTable.ts index 77c34095a4..5322040997 100644 --- a/packages/angular-table/src/injectTable.ts +++ b/packages/angular-table/src/injectTable.ts @@ -110,7 +110,10 @@ export function injectTable< return ngZone.runOutsideAngular(() => lazyInit(() => { - const table = constructTable({ + // Explicit type arguments skip generic inference from the spread object + // (a type-check hot spot); the spread only adds the angular reactivity + // binding to `features`. + const table = constructTable({ ...options(), features: { coreReactivityFeature: angularReactivity(injector), diff --git a/packages/preact-table/src/useTable.ts b/packages/preact-table/src/useTable.ts index b5cf8c078f..73c9681d2f 100644 --- a/packages/preact-table/src/useTable.ts +++ b/packages/preact-table/src/useTable.ts @@ -118,7 +118,10 @@ export function useTable< selector?: (state: TableState) => TSelected, ): PreactTable { const [table] = useState(() => { - const tableInstance = constructTable({ + // Explicit type arguments skip generic inference from the spread object (a + // type-check hot spot); the spread only adds the preact reactivity binding + // to `features`. + const tableInstance = constructTable({ ...tableOptions, features: { coreReactivityFeature: preactReactivity(), diff --git a/packages/react-table/src/useTable.ts b/packages/react-table/src/useTable.ts index fccbebd8af..4f4ee68fc3 100644 --- a/packages/react-table/src/useTable.ts +++ b/packages/react-table/src/useTable.ts @@ -147,7 +147,10 @@ export function useTable< selector?: (state: TableState) => TSelected, ): ReactTable { const [table] = useState(() => { - const tableInstance = constructTable({ + // Explicit type arguments skip generic inference from the spread object (a + // type-check hot spot); the spread only adds the react reactivity binding + // to `features`. + const tableInstance = constructTable({ ...tableOptions, features: { coreReactivityFeature: reactReactivity(), diff --git a/packages/table-core/src/core/cells/coreCellsFeature.types.ts b/packages/table-core/src/core/cells/coreCellsFeature.types.ts index b30c759882..a2a1832620 100644 --- a/packages/table-core/src/core/cells/coreCellsFeature.types.ts +++ b/packages/table-core/src/core/cells/coreCellsFeature.types.ts @@ -6,8 +6,8 @@ import type { Cell } from '../../types/Cell' import type { Column } from '../../types/Column' export interface CellContext< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { cell: Cell @@ -19,8 +19,8 @@ export interface CellContext< } export interface Cell_CoreProperties< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { /** @@ -42,8 +42,8 @@ export interface Cell_CoreProperties< } export interface Cell_Cell< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > extends Cell_CoreProperties { /** diff --git a/packages/table-core/src/core/columns/coreColumnsFeature.types.ts b/packages/table-core/src/core/columns/coreColumnsFeature.types.ts index d0edbe44a5..2cd8780410 100644 --- a/packages/table-core/src/core/columns/coreColumnsFeature.types.ts +++ b/packages/table-core/src/core/columns/coreColumnsFeature.types.ts @@ -5,8 +5,8 @@ import type { AccessorFn, ColumnDef } from '../../types/ColumnDef' import type { Column } from '../../types/Column' export interface Column_CoreProperties< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { /** @@ -43,8 +43,8 @@ export interface Column_CoreProperties< } export interface Column_Column< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > extends Column_CoreProperties { /** @@ -59,8 +59,8 @@ export interface Column_Column< } export interface TableOptions_Columns< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { /** @@ -74,8 +74,8 @@ export interface TableOptions_Columns< } export interface Table_Columns< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Returns a map of all flat columns by their ID. diff --git a/packages/table-core/src/core/headers/coreHeadersFeature.types.ts b/packages/table-core/src/core/headers/coreHeadersFeature.types.ts index bc10c9273a..d1d9acf69d 100644 --- a/packages/table-core/src/core/headers/coreHeadersFeature.types.ts +++ b/packages/table-core/src/core/headers/coreHeadersFeature.types.ts @@ -6,8 +6,8 @@ import type { HeaderGroup } from '../../types/HeaderGroup' import type { Column } from '../../types/Column' export interface Table_Headers< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Builds the visible header groups for the current column tree, visibility, @@ -30,8 +30,8 @@ export interface Table_Headers< } export interface HeaderContext< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { /** @@ -49,8 +49,8 @@ export interface HeaderContext< } export interface Header_CoreProperties< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { /** @@ -100,8 +100,8 @@ export interface Header_CoreProperties< } export interface Header_Header< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > extends Header_CoreProperties { /** @@ -115,8 +115,8 @@ export interface Header_Header< } export interface HeaderGroup_Header< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { depth: number diff --git a/packages/table-core/src/core/row-models/coreRowModelsFeature.types.ts b/packages/table-core/src/core/row-models/coreRowModelsFeature.types.ts index 379e938db2..a059be9601 100644 --- a/packages/table-core/src/core/row-models/coreRowModelsFeature.types.ts +++ b/packages/table-core/src/core/row-models/coreRowModelsFeature.types.ts @@ -10,8 +10,8 @@ import type { TableFeatures } from '../../types/TableFeatures' import type { RowData } from '../../types/type-utils' export interface RowModel< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { rows: Array> flatRows: Array> @@ -19,15 +19,15 @@ export interface RowModel< } export interface CachedRowModel_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { coreRowModel: () => RowModel } export interface Table_RowModels_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Returns the core row model before any processing has been applied. diff --git a/packages/table-core/src/core/row-models/createCoreRowModel.ts b/packages/table-core/src/core/row-models/createCoreRowModel.ts index 54653beefb..417893961a 100644 --- a/packages/table-core/src/core/row-models/createCoreRowModel.ts +++ b/packages/table-core/src/core/row-models/createCoreRowModel.ts @@ -1,7 +1,7 @@ import { constructRow } from '../rows/constructRow' import { tableMemo } from '../../utils' import { table_autoResetPageIndex } from '../../features/row-pagination/rowPaginationFeature.utils' -import type { Table, Table_Internal } from '../../types/Table' +import type { Table_Internal } from '../../types/Table' import type { RowModel } from './coreRowModelsFeature.types' import type { TableFeatures } from '../../types/TableFeatures' import type { Row } from '../../types/Row' @@ -15,9 +15,10 @@ import type { RowData } from '../../types/type-utils' export function createCoreRowModel< TFeatures extends TableFeatures, TData extends RowData, ->(): (table: Table) => () => RowModel { - return (_table) => { - const table = _table as unknown as Table_Internal +>(): ( + table: Table_Internal, +) => () => RowModel { + return (table) => { return tableMemo({ feature: 'coreRowModelsFeature', table, diff --git a/packages/table-core/src/core/rows/coreRowsFeature.types.ts b/packages/table-core/src/core/rows/coreRowsFeature.types.ts index d1c47d7522..4345405577 100644 --- a/packages/table-core/src/core/rows/coreRowsFeature.types.ts +++ b/packages/table-core/src/core/rows/coreRowsFeature.types.ts @@ -5,8 +5,8 @@ import type { Row } from '../../types/Row' import type { Cell } from '../../types/Cell' export interface Row_CoreProperties< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { _uniqueValuesCache: Record _valuesCache: Record @@ -45,8 +45,8 @@ export interface Row_CoreProperties< } export interface Row_Row< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > extends Row_CoreProperties { /** * Builds a lookup of this row's cells keyed by leaf column id. @@ -83,8 +83,8 @@ export interface Row_Row< } export interface TableOptions_Rows< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * This optional function is used to derive a unique ID for any given row. If not provided the rows index is used (nested rows join together with `.` using their grandparents' index eg. `index.index.index`). If you need to identify individual rows that are originating from any server-side operations, it's suggested you use this function to return an ID that makes sense regardless of network IO/ambiguity eg. a userId, taskId, database ID field, etc. @@ -106,8 +106,8 @@ export interface TableOptions_Rows< } export interface Table_Rows< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { getRowId: (_: TData, index: number, parent?: Row) => string /** diff --git a/packages/table-core/src/core/table/constructTable.ts b/packages/table-core/src/core/table/constructTable.ts index e25e80a095..c4f10f0ed5 100644 --- a/packages/table-core/src/core/table/constructTable.ts +++ b/packages/table-core/src/core/table/constructTable.ts @@ -202,5 +202,5 @@ export function constructTable< featuresList[i]!.constructTableAPIs?.(table) } - return table + return table as unknown as Table } diff --git a/packages/table-core/src/core/table/coreTablesFeature.types.ts b/packages/table-core/src/core/table/coreTablesFeature.types.ts index 892e68e9c6..014e37be5c 100644 --- a/packages/table-core/src/core/table/coreTablesFeature.types.ts +++ b/packages/table-core/src/core/table/coreTablesFeature.types.ts @@ -13,8 +13,8 @@ import type { TableOptions } from '../../types/TableOptions' import type { TableState, TableState_All } from '../../types/TableState' export interface TableMeta< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > {} /** @@ -84,8 +84,8 @@ export type ExternalAtoms_All = Partial<{ }> export interface TableOptions_Table< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * The feature modules registered on this table instance. @@ -152,8 +152,8 @@ export interface TableOptions_Table< } export interface Table_CoreProperties< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Table reactivity bindings for interacting with TanStack Store. @@ -220,8 +220,8 @@ export interface Table_CoreProperties< } export interface Table_Table< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > extends Table_CoreProperties { /** * Resets the table's internal base atoms to `table.initialState`. diff --git a/packages/table-core/src/core/table/coreTablesFeature.utils.ts b/packages/table-core/src/core/table/coreTablesFeature.utils.ts index 9f8e491716..236710a32b 100644 --- a/packages/table-core/src/core/table/coreTablesFeature.utils.ts +++ b/packages/table-core/src/core/table/coreTablesFeature.utils.ts @@ -83,7 +83,10 @@ export function table_mergeOptions< newOptions: TableOptions, ) { if (table.options.mergeOptions) { - return table.options.mergeOptions(table.options, newOptions) + return table.options.mergeOptions( + table.options as TableOptions, + newOptions, + ) } return { @@ -110,7 +113,10 @@ export function table_setOptions< table: Table_Internal, updater: Updater>, ): void { - const newOptions = functionalUpdate(updater, table.options) + const newOptions = functionalUpdate( + updater, + table.options as TableOptions, + ) // table static options that should never change after initialization const { features, atoms, initialState } = table.options const mergedOptions = Object.assign(table_mergeOptions(table, newOptions), { diff --git a/packages/table-core/src/features/column-faceting/columnFacetingFeature.types.ts b/packages/table-core/src/features/column-faceting/columnFacetingFeature.types.ts index 3a60c620a5..b7ff8c96de 100644 --- a/packages/table-core/src/features/column-faceting/columnFacetingFeature.types.ts +++ b/packages/table-core/src/features/column-faceting/columnFacetingFeature.types.ts @@ -4,8 +4,8 @@ import type { TableFeatures } from '../../types/TableFeatures' import type { RowModel } from '../../core/row-models/coreRowModelsFeature.types' export interface Column_ColumnFaceting< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Computes min/max numeric facet values for this column. @@ -25,8 +25,8 @@ export interface Column_ColumnFaceting< } export interface Table_RowModels_Faceted< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Computes min/max numeric facet values for the active faceting context. @@ -49,8 +49,8 @@ export interface Table_RowModels_Faceted< } export interface CachedRowModel_Faceted< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { facetedRowModel?: (columnId: string) => () => RowModel facetedMinMaxValues?: (columnId: string) => [number, number] @@ -58,8 +58,8 @@ export interface CachedRowModel_Faceted< } export interface Table_ColumnFaceting< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Returns the min and max values for the global filter. diff --git a/packages/table-core/src/features/column-filtering/columnFilteringFeature.types.ts b/packages/table-core/src/features/column-filtering/columnFilteringFeature.types.ts index 0f74329532..360f749477 100644 --- a/packages/table-core/src/features/column-filtering/columnFilteringFeature.types.ts +++ b/packages/table-core/src/features/column-filtering/columnFilteringFeature.types.ts @@ -41,8 +41,8 @@ export interface ColumnFilter { } export interface ResolvedColumnFilter< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { filterFn: FilterFn id: string @@ -50,15 +50,15 @@ export interface ResolvedColumnFilter< } export interface RowModelFns_ColumnFiltering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { filterFns: Record> } export interface FilterFn< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { ( row: Row, @@ -110,8 +110,8 @@ export type FilterFnOption< > = 'auto' | ExtractFilterFnKeys | FilterFn export interface ColumnDef_ColumnFiltering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Enables this column to participate in column-specific filtering. @@ -127,8 +127,8 @@ export interface ColumnDef_ColumnFiltering< } export interface Column_ColumnFiltering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Returns an automatically calculated filter function for the column based off of the columns first known value. @@ -164,8 +164,8 @@ export interface Column_ColumnFiltering< } export interface Row_ColumnFiltering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * The column filters map for the row. This object tracks whether a row is passing/failing specific filters by their column ID. @@ -178,8 +178,8 @@ export interface Row_ColumnFiltering< } export interface TableOptions_ColumnFiltering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Enables column-specific filtering for all columns that also allow it. @@ -227,8 +227,8 @@ export interface Table_ColumnFiltering { } export interface Table_RowModels_Filtered< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Resolves the row model after column and global filters have been applied. @@ -241,8 +241,8 @@ export interface Table_RowModels_Filtered< } export interface CachedRowModel_Filtered< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { filteredRowModel: () => RowModel } diff --git a/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts b/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts index 10336c282f..c376f378fa 100644 --- a/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts +++ b/packages/table-core/src/features/column-grouping/columnGroupingFeature.types.ts @@ -18,8 +18,8 @@ export interface TableState_ColumnGrouping { } export interface RowModelFns_ColumnGrouping< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { aggregationFns: Record> } @@ -66,8 +66,8 @@ export type AggregationFnOption< | AggregationFn export interface ColumnDef_ColumnGrouping< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { /** @@ -93,8 +93,8 @@ export interface ColumnDef_ColumnGrouping< } export interface Column_ColumnGrouping< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Returns the aggregation function for the column. @@ -190,8 +190,8 @@ export interface TableOptions_ColumnGrouping { export type GroupingColumnMode = false | 'reorder' | 'remove' export interface Table_ColumnGrouping< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Resets `grouping` to `initialState.grouping`. @@ -206,8 +206,8 @@ export interface Table_ColumnGrouping< } export interface Table_RowModels_Grouped< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Resolves the row model after grouping and aggregation have been applied. @@ -220,8 +220,8 @@ export interface Table_RowModels_Grouped< } export interface CachedRowModel_Grouped< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { groupedRowModel: () => RowModel } diff --git a/packages/table-core/src/features/column-ordering/columnOrderingFeature.types.ts b/packages/table-core/src/features/column-ordering/columnOrderingFeature.types.ts index 03e842a6c4..be7be63052 100644 --- a/packages/table-core/src/features/column-ordering/columnOrderingFeature.types.ts +++ b/packages/table-core/src/features/column-ordering/columnOrderingFeature.types.ts @@ -44,8 +44,8 @@ export interface ColumnOrderDefaultOptions { } export interface Table_ColumnOrdering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Resets `columnOrder` to `initialState.columnOrder`. diff --git a/packages/table-core/src/features/column-pinning/columnPinningFeature.types.ts b/packages/table-core/src/features/column-pinning/columnPinningFeature.types.ts index 88f45420c4..c51a136864 100644 --- a/packages/table-core/src/features/column-pinning/columnPinningFeature.types.ts +++ b/packages/table-core/src/features/column-pinning/columnPinningFeature.types.ts @@ -67,8 +67,8 @@ export interface Column_ColumnPinning { } export interface Row_ColumnPinning< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Gets visible row cells whose columns are not pinned left or right. @@ -85,8 +85,8 @@ export interface Row_ColumnPinning< } export interface Table_ColumnPinning< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Builds flat center-region headers for columns that are not pinned, diff --git a/packages/table-core/src/features/column-visibility/columnVisibilityFeature.types.ts b/packages/table-core/src/features/column-visibility/columnVisibilityFeature.types.ts index 2276e65db0..0580be7b26 100644 --- a/packages/table-core/src/features/column-visibility/columnVisibilityFeature.types.ts +++ b/packages/table-core/src/features/column-visibility/columnVisibilityFeature.types.ts @@ -28,8 +28,8 @@ export type VisibilityDefaultOptions = Pick< > export interface Table_ColumnVisibility< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Checks whether every leaf column is currently visible. @@ -76,8 +76,8 @@ export interface ColumnDef_ColumnVisibility { } export interface Row_ColumnVisibility< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Gets this row's cells for currently visible columns. diff --git a/packages/table-core/src/features/global-filtering/globalFilteringFeature.types.ts b/packages/table-core/src/features/global-filtering/globalFilteringFeature.types.ts index 1c192b3081..07dbbe7ceb 100644 --- a/packages/table-core/src/features/global-filtering/globalFilteringFeature.types.ts +++ b/packages/table-core/src/features/global-filtering/globalFilteringFeature.types.ts @@ -33,8 +33,8 @@ export interface Column_GlobalFiltering { } export interface TableOptions_GlobalFiltering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Enables global filtering across columns that allow it. @@ -67,8 +67,8 @@ export interface TableOptions_GlobalFiltering< } export interface Table_GlobalFiltering< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Currently, this function returns the built-in `includesString` filter function. In future releases, it may return more dynamic filter functions based on the nature of the data provided. diff --git a/packages/table-core/src/features/row-expanding/rowExpandingFeature.types.ts b/packages/table-core/src/features/row-expanding/rowExpandingFeature.types.ts index 8affdafd24..8921e49749 100644 --- a/packages/table-core/src/features/row-expanding/rowExpandingFeature.types.ts +++ b/packages/table-core/src/features/row-expanding/rowExpandingFeature.types.ts @@ -35,8 +35,8 @@ export interface Row_RowExpanding { } export interface TableOptions_RowExpanding< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Enables automatic expanded-state resets when page-altering table state changes. @@ -71,8 +71,8 @@ export interface TableOptions_RowExpanding< } export interface Table_RowExpanding< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { autoResetExpanded: () => void /** @@ -112,8 +112,8 @@ export interface Table_RowExpanding< } export interface Table_RowModels_Expanded< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Resolves the row model after expanded rows have been flattened into view. @@ -126,8 +126,8 @@ export interface Table_RowModels_Expanded< } export interface CachedRowModel_Expanded< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { expandedRowModel: () => RowModel } diff --git a/packages/table-core/src/features/row-pagination/rowPaginationFeature.types.ts b/packages/table-core/src/features/row-pagination/rowPaginationFeature.types.ts index 34781425cc..33862aad6f 100644 --- a/packages/table-core/src/features/row-pagination/rowPaginationFeature.types.ts +++ b/packages/table-core/src/features/row-pagination/rowPaginationFeature.types.ts @@ -42,8 +42,8 @@ export interface PaginationDefaultOptions { } export interface Table_RowPagination< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { _autoResetPageIndex: () => void /** @@ -117,8 +117,8 @@ export interface Table_RowPagination< } export interface Table_RowModels_Paginated< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Resolves the row model after pagination has sliced the current page. @@ -131,8 +131,8 @@ export interface Table_RowModels_Paginated< } export interface CachedRowModel_Paginated< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { paginatedRowModel: () => RowModel } diff --git a/packages/table-core/src/features/row-pinning/rowPinningFeature.types.ts b/packages/table-core/src/features/row-pinning/rowPinningFeature.types.ts index 4f19f9ce64..08d21b5b2d 100644 --- a/packages/table-core/src/features/row-pinning/rowPinningFeature.types.ts +++ b/packages/table-core/src/features/row-pinning/rowPinningFeature.types.ts @@ -14,8 +14,8 @@ export interface TableState_RowPinning { } export interface TableOptions_RowPinning< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Allows rows to be pinned to top or bottom regions. @@ -63,8 +63,8 @@ export interface Row_RowPinning { } export interface Table_RowPinning< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Gets rows pinned to the bottom region. diff --git a/packages/table-core/src/features/row-selection/rowSelectionFeature.types.ts b/packages/table-core/src/features/row-selection/rowSelectionFeature.types.ts index 00cc139d75..8af6d8f280 100644 --- a/packages/table-core/src/features/row-selection/rowSelectionFeature.types.ts +++ b/packages/table-core/src/features/row-selection/rowSelectionFeature.types.ts @@ -10,8 +10,8 @@ export interface TableState_RowSelection { } export interface TableOptions_RowSelection< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Allows rows to be selected alongside other rows. @@ -87,8 +87,8 @@ export interface Row_RowSelection { } export interface Table_RowSelection< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Builds a selected-row model from rows after filtering. diff --git a/packages/table-core/src/features/row-sorting/rowSortingFeature.types.ts b/packages/table-core/src/features/row-sorting/rowSortingFeature.types.ts index bae7956a81..a0bdfd2a95 100644 --- a/packages/table-core/src/features/row-sorting/rowSortingFeature.types.ts +++ b/packages/table-core/src/features/row-sorting/rowSortingFeature.types.ts @@ -18,8 +18,8 @@ export interface TableState_RowSorting { } export interface RowModelFns_RowSorting< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { sortFns: Record> } @@ -27,8 +27,8 @@ export interface RowModelFns_RowSorting< export interface SortFns {} export interface SortFn< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { ( rowA: Row, @@ -64,8 +64,8 @@ export type SortFnOption< > = 'auto' | ExtractSortFnKeys | SortFn export interface ColumnDef_RowSorting< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Enables/Disables multi-sorting for this column. @@ -102,8 +102,8 @@ export interface ColumnDef_RowSorting< } export interface Column_RowSorting< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Removes this column from the table's sorting state @@ -199,8 +199,8 @@ export interface TableOptions_RowSorting { } export interface Table_RowSorting< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Resets `sorting` to `initialState.sorting`. @@ -215,8 +215,8 @@ export interface Table_RowSorting< } export interface Table_RowModels_Sorted< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { /** * Reads the row model immediately before sorting. @@ -229,8 +229,8 @@ export interface Table_RowModels_Sorted< } export interface CachedRowModel_Sorted< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { sortedRowModel: () => RowModel } diff --git a/packages/table-core/src/types/Cell.ts b/packages/table-core/src/types/Cell.ts index 1c17789ca8..797f743fcc 100644 --- a/packages/table-core/src/types/Cell.ts +++ b/packages/table-core/src/types/Cell.ts @@ -4,8 +4,8 @@ import type { ExtractFeatureMapTypes, TableFeatures } from './TableFeatures' import type { Cell_Cell } from '../core/cells/coreCellsFeature.types' export interface Cell_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > extends Cell_Cell {} diff --git a/packages/table-core/src/types/Column.ts b/packages/table-core/src/types/Column.ts index 541b13ce62..c98f24cd1d 100644 --- a/packages/table-core/src/types/Column.ts +++ b/packages/table-core/src/types/Column.ts @@ -14,14 +14,14 @@ import type { ExtractFeatureMapTypes, TableFeatures } from './TableFeatures' import type { Column_Column } from '../core/columns/coreColumnsFeature.types' export interface Column_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue = unknown, > extends Column_Column {} export interface Column_FeatureMap< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { columnFacetingFeature: Column_ColumnFaceting columnFilteringFeature: Column_ColumnFiltering diff --git a/packages/table-core/src/types/ColumnDef.ts b/packages/table-core/src/types/ColumnDef.ts index 8e7999c57f..ad4c35814b 100644 --- a/packages/table-core/src/types/ColumnDef.ts +++ b/packages/table-core/src/types/ColumnDef.ts @@ -16,8 +16,8 @@ import type { ColumnDef_GlobalFiltering } from '../features/global-filtering/glo import type { ColumnDef_RowSorting } from '../features/row-sorting/rowSortingFeature.types' export interface ColumnMeta< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > {} @@ -79,8 +79,8 @@ export interface StringHeaderIdentifier { } export interface IdIdentifier< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > { /** @@ -127,8 +127,8 @@ interface ColumnDefBase_Core< } export interface ColumnDef_FeatureMap< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData, > { columnVisibilityFeature: ColumnDef_ColumnVisibility diff --git a/packages/table-core/src/types/Header.ts b/packages/table-core/src/types/Header.ts index 39aa608a26..2a85f694ee 100644 --- a/packages/table-core/src/types/Header.ts +++ b/packages/table-core/src/types/Header.ts @@ -5,8 +5,8 @@ import type { Header_Header } from '../core/headers/coreHeadersFeature.types' import type { Header_ColumnResizing } from '../features/column-resizing/columnResizingFeature.types' export interface Header_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue extends CellData = CellData, > extends Header_Header {} diff --git a/packages/table-core/src/types/HeaderGroup.ts b/packages/table-core/src/types/HeaderGroup.ts index b09509bf8c..eb22ce5ea0 100644 --- a/packages/table-core/src/types/HeaderGroup.ts +++ b/packages/table-core/src/types/HeaderGroup.ts @@ -3,8 +3,8 @@ import type { TableFeatures } from './TableFeatures' import type { RowData } from './type-utils' export interface HeaderGroup_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > extends HeaderGroup_Header {} export type HeaderGroup< diff --git a/packages/table-core/src/types/Row.ts b/packages/table-core/src/types/Row.ts index aa2051f04a..85549592c5 100644 --- a/packages/table-core/src/types/Row.ts +++ b/packages/table-core/src/types/Row.ts @@ -10,13 +10,13 @@ import type { ExtractFeatureMapTypes, TableFeatures } from './TableFeatures' import type { Row_Row } from '../core/rows/coreRowsFeature.types' export interface Row_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > extends Row_Row {} export interface Row_FeatureMap< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { columnFilteringFeature: Row_ColumnFiltering columnGroupingFeature: Row_ColumnGrouping diff --git a/packages/table-core/src/types/RowModel.ts b/packages/table-core/src/types/RowModel.ts index f6acd19144..217d2fb3af 100644 --- a/packages/table-core/src/types/RowModel.ts +++ b/packages/table-core/src/types/RowModel.ts @@ -12,8 +12,8 @@ import type { RowData } from './type-utils' import type { ExtractFeatureMapTypes, TableFeatures } from './TableFeatures' export interface CachedRowModels_FeatureMap< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { columnFacetingFeature: CachedRowModel_Faceted columnFilteringFeature: CachedRowModel_Filtered diff --git a/packages/table-core/src/types/RowModelFns.ts b/packages/table-core/src/types/RowModelFns.ts index bdeea67462..27d880376f 100644 --- a/packages/table-core/src/types/RowModelFns.ts +++ b/packages/table-core/src/types/RowModelFns.ts @@ -7,8 +7,8 @@ import type { ExtractFeatureMapTypes, TableFeatures } from './TableFeatures' export interface RowModelFns_Core {} export interface RowModelFns_FeatureMap< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { columnFilteringFeature: RowModelFns_ColumnFiltering columnGroupingFeature: RowModelFns_ColumnGrouping diff --git a/packages/table-core/src/types/Table.ts b/packages/table-core/src/types/Table.ts index 582de0d9f9..84c7bfaa7e 100644 --- a/packages/table-core/src/types/Table.ts +++ b/packages/table-core/src/types/Table.ts @@ -16,19 +16,21 @@ import type { Table_RowSorting } from '../features/row-sorting/rowSortingFeature import type { Table_RowModels } from '../core/row-models/coreRowModelsFeature.types' import type { CachedRowModel_All } from './RowModel' import type { RowModelFns_All } from './RowModelFns' -import type { TableState_All } from './TableState' +import type { TableState, TableState_All } from './TableState' import type { RowData } from './type-utils' import type { ExtractFeatureMapTypes, TableFeatures } from './TableFeatures' import type { Table_Columns } from '../core/columns/coreColumnsFeature.types' import type { Table_Headers } from '../core/headers/coreHeadersFeature.types' import type { Table_Rows } from '../core/rows/coreRowsFeature.types' import type { + Atoms, Atoms_All, + BaseAtoms, BaseAtoms_All, ExternalAtoms_All, Table_Table, } from '../core/table/coreTablesFeature.types' -import type { TableOptions_All } from './TableOptions' +import type { DebugOptions, TableOptions_All } from './TableOptions' /** * The core table object that only includes the core table functionality such as column, header, row, and table APIS. @@ -44,8 +46,8 @@ export type Table_Core< Table_Headers export interface Table_FeatureMap< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { columnFilteringFeature: Table_ColumnFiltering columnGroupingFeature: Table_ColumnGrouping @@ -72,19 +74,64 @@ export type Table< > = Table_Core & ExtractFeatureMapTypes> -export type Table_Internal< - TFeatures extends TableFeatures, - TData extends RowData = any, -> = Table & { +/** + * `Table_Table` members that `Table_Internal` re-declares with broadened + * (all-features) types so internal code can read any feature's slots and + * construction code can assign them. + */ +type Table_InternalBroadenedKeys = + | '_rowModels' + | '_rowModelFns' + | 'options' + | 'initialState' + | 'store' + +/** + * Internal broad table shape used by feature implementations. + * + * Declared as an interface extending every stock feature's table API (rather + * than the feature-conditional `Table` intersection) so that the compiler can + * relate `Table_Internal` instantiations nominally instead of structurally + * re-expanding the feature-map conditional for every internal call site. + * Mirrors the `*_All` convention used for options, state, and row models. + * Type parameters are annotated `in out` (invariant) so the checker can relate + * instantiations by their type arguments without measuring variance or falling + * back to member-by-member structural comparison. + */ +export interface Table_Internal< + in out TFeatures extends TableFeatures, + in out TData extends RowData = any, +> + extends + Omit, Table_InternalBroadenedKeys>, + Table_Columns, + Table_Rows, + Table_RowModels, + Table_Headers, + Table_ColumnFiltering, + Table_ColumnGrouping, + Table_ColumnOrdering, + Table_ColumnPinning, + Table_ColumnResizing, + Table_ColumnSizing, + Table_ColumnVisibility, + Table_ColumnFaceting, + Table_GlobalFiltering, + Table_RowExpanding, + Table_RowPagination, + Table_RowPinning, + Table_RowSelection, + Table_RowSorting { _rowModels: CachedRowModel_All _rowModelFns: RowModelFns_All - options: TableOptions_All & { - state?: TableState_All - initialState?: TableState_All - atoms?: ExternalAtoms_All - } - initialState: TableState_All - baseAtoms: BaseAtoms_All - atoms: Atoms_All - store: ReadonlyStore + options: DebugOptions & + TableOptions_All & { + state?: TableState_All + initialState?: TableState_All + atoms?: ExternalAtoms_All + } + initialState: TableState & TableState_All + baseAtoms: BaseAtoms & BaseAtoms_All + atoms: Atoms & Atoms_All + store: ReadonlyStore> & ReadonlyStore } diff --git a/packages/table-core/src/types/TableOptions.ts b/packages/table-core/src/types/TableOptions.ts index e38f752950..7e8aaba3b7 100644 --- a/packages/table-core/src/types/TableOptions.ts +++ b/packages/table-core/src/types/TableOptions.ts @@ -28,8 +28,8 @@ import type { * options are mixed in. */ export interface TableOptions_Core< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > extends TableOptions_Table, @@ -55,8 +55,8 @@ export type DebugOptions = { } & DebugKeysFor export interface TableOptions_FeatureMap< - TFeatures extends TableFeatures, - TData extends RowData, + in out TFeatures extends TableFeatures, + in out TData extends RowData, > { columnFilteringFeature: TableOptions_ColumnFiltering columnGroupingFeature: TableOptions_ColumnGrouping @@ -73,15 +73,42 @@ export interface TableOptions_FeatureMap< rowSortingFeature: TableOptions_RowSorting } -export type TableOptions_FeatureMap_All< +type TableOptions_StockFeatureKeys = + | 'columnFilteringFeature' + | 'columnGroupingFeature' + | 'columnOrderingFeature' + | 'columnPinningFeature' + | 'columnResizingFeature' + | 'columnSizingFeature' + | 'columnVisibilityFeature' + | 'globalFilteringFeature' + | 'rowExpandingFeature' + | 'rowPaginationFeature' + | 'rowPinningFeature' + | 'rowSelectionFeature' + | 'rowSortingFeature' + +/** + * Plugin entries declaration-merged into `TableOptions_FeatureMap`, i.e. keys + * beyond the stock set. Resolves to `unknown` (an intersection no-op) when no + * plugins are merged so the common case skips the union-to-intersection work. + */ +type TableOptions_PluginFeatureMapTypes< TFeatures extends TableFeatures, TData extends RowData, -> = UnionToIntersection< - TableOptions_FeatureMap[keyof TableOptions_FeatureMap< - TFeatures, - TData - >] -> +> = [ + Exclude< + keyof TableOptions_FeatureMap, + TableOptions_StockFeatureKeys + >, +] extends [never] + ? unknown + : UnionToIntersection< + TableOptions_FeatureMap[Exclude< + keyof TableOptions_FeatureMap, + TableOptions_StockFeatureKeys + >] + > /** * Complete table options for a specific feature set. @@ -105,4 +132,19 @@ export type TableOptions_All< TFeatures extends TableFeatures, TData extends RowData, > = TableOptions_Core & - Partial> + Partial< + TableOptions_ColumnFiltering & + TableOptions_ColumnGrouping & + TableOptions_ColumnOrdering & + TableOptions_ColumnPinning & + TableOptions_ColumnResizing & + TableOptions_ColumnSizing & + TableOptions_ColumnVisibility & + TableOptions_GlobalFiltering & + TableOptions_RowExpanding & + TableOptions_RowPagination & + TableOptions_RowPinning & + TableOptions_RowSelection & + TableOptions_RowSorting & + TableOptions_PluginFeatureMapTypes + > diff --git a/packages/table-core/src/utils.ts b/packages/table-core/src/utils.ts index d0d3e52389..4d0e1b4b0e 100755 --- a/packages/table-core/src/utils.ts +++ b/packages/table-core/src/utils.ts @@ -1,4 +1,4 @@ -import type { Table, Table_Internal } from './types/Table' +import type { Table_Internal } from './types/Table' import type { NoInfer, RowData, Updater } from './types/type-utils' import type { TableFeatures } from './types/TableFeatures' import type { TableState, TableState_All } from './types/TableState' @@ -53,7 +53,16 @@ export function cloneState(value: T): T { export function makeStateUpdater< TFeatures extends TableFeatures, K extends (string & {}) | keyof TableState_All | keyof TableState, ->(key: K, instance: Table) { +>( + key: K, + // Minimal structural shape so any table view (public `Table`, + // `Table_Internal`, or a custom plugin table) can be passed without forcing + // the compiler to relate the full table types. + instance: { + readonly options: { readonly atoms?: object | undefined } + readonly baseAtoms: object + }, +) { return (updater: Updater[K & keyof TableState]>) => { const externalAtom = (instance.options as any).atoms?.[key] const targetAtom = externalAtom ?? (instance.baseAtoms as any)[key] diff --git a/packages/table-core/tests/unit/core/columns/constructColumn.test.ts b/packages/table-core/tests/unit/core/columns/constructColumn.test.ts index f23fa43f2b..bd671531f8 100644 --- a/packages/table-core/tests/unit/core/columns/constructColumn.test.ts +++ b/packages/table-core/tests/unit/core/columns/constructColumn.test.ts @@ -4,6 +4,7 @@ import { constructColumn } from '../../../../src/core/columns/constructColumn' import { constructTable } from '../../../../src' import { storeReactivityBindings } from '../../../../src/store-reactivity-bindings' import type { ColumnDef } from '../../../../src/types/ColumnDef' +import type { Table_Internal } from '../../../../src/types/Table' const features = { coreColumnsFeature, @@ -20,7 +21,7 @@ describe('constructColumn', () => { features, columns: [], data: [], - }) + }) as unknown as Table_Internal const columnDef = { id: 'test-column',