@tanstack/table-core 9.0.0-beta.44 → 9.0.0-beta.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/features/row-pagination/rowPaginationFeature.utils.cjs +1 -1
  2. package/dist/features/row-pagination/rowPaginationFeature.utils.cjs.map +1 -1
  3. package/dist/features/row-pagination/rowPaginationFeature.utils.js +1 -1
  4. package/dist/features/row-pagination/rowPaginationFeature.utils.js.map +1 -1
  5. package/dist/fns/filterFns.cjs +3 -3
  6. package/dist/fns/filterFns.cjs.map +1 -1
  7. package/dist/fns/filterFns.js +3 -3
  8. package/dist/fns/filterFns.js.map +1 -1
  9. package/package.json +1 -1
  10. package/skills/api-not-found/SKILL.md +1 -1
  11. package/skills/client-vs-server/SKILL.md +1 -1
  12. package/skills/column-faceting/SKILL.md +1 -1
  13. package/skills/column-filtering/SKILL.md +1 -1
  14. package/skills/column-ordering/SKILL.md +1 -1
  15. package/skills/column-pinning/SKILL.md +1 -1
  16. package/skills/column-resizing/SKILL.md +1 -1
  17. package/skills/column-sizing/SKILL.md +1 -1
  18. package/skills/column-visibility/SKILL.md +1 -1
  19. package/skills/core/SKILL.md +1 -1
  20. package/skills/custom-features/SKILL.md +1 -1
  21. package/skills/expanding/SKILL.md +1 -1
  22. package/skills/global-filtering/SKILL.md +1 -1
  23. package/skills/grouping/SKILL.md +1 -1
  24. package/skills/migrate-v8-to-v9/SKILL.md +1 -1
  25. package/skills/pagination/SKILL.md +1 -1
  26. package/skills/row-pinning/SKILL.md +1 -1
  27. package/skills/row-selection/SKILL.md +1 -1
  28. package/skills/sorting/SKILL.md +1 -1
  29. package/skills/table-features/SKILL.md +1 -1
  30. package/skills/typescript/SKILL.md +1 -1
  31. package/src/features/row-pagination/rowPaginationFeature.utils.ts +1 -1
  32. package/src/fns/filterFns.ts +6 -3
@@ -33,7 +33,7 @@ function getDefaultPaginationState() {
33
33
  * ```
34
34
  */
35
35
  function table_autoResetPageIndex(table) {
36
- if (table.options.autoResetAll ?? table.options.autoResetPageIndex ?? !table.options.manualPagination) table_resetPageIndex(table);
36
+ if (table.options.autoResetAll ?? table.options.autoResetPageIndex ?? !table.options.manualPagination) table_resetPageIndex(table, true);
37
37
  }
38
38
  /**
39
39
  * Routes a pagination updater through the table's pagination change handler.
@@ -1 +1 @@
1
- {"version":3,"file":"rowPaginationFeature.utils.cjs","names":["functionalUpdate","cloneState"],"sources":["../../../src/features/row-pagination/rowPaginationFeature.utils.ts"],"sourcesContent":["import { cloneState, functionalUpdate } from '../../utils'\nimport type { RowData, Updater } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Table_Internal } from '../../types/Table'\nimport type { PaginationState } from './rowPaginationFeature.types'\n\nconst defaultPageIndex = 0\nconst defaultPageSize = 10\n\n/**\n * Creates the default pagination state used by the pagination feature.\n *\n * The feature default starts at the first page with a page size of 10. Reset\n * APIs use this value when `defaultState` is `true`.\n *\n * @example\n * ```ts\n * const pagination = getDefaultPaginationState()\n * ```\n */\nexport function getDefaultPaginationState(): PaginationState {\n return {\n pageIndex: defaultPageIndex,\n pageSize: defaultPageSize,\n }\n}\n\n/**\n * Resets the page index when a page-altering change should return to page 0.\n *\n * The reset runs when `autoResetAll`, `autoResetPageIndex`, or the default\n * client-side pagination behavior allows it. Manual pagination opts out unless\n * the reset options explicitly opt back in.\n *\n * @example\n * ```ts\n * table_autoResetPageIndex(table)\n * ```\n */\nexport function table_autoResetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n if (\n table.options.autoResetAll ??\n table.options.autoResetPageIndex ??\n !table.options.manualPagination\n ) {\n table_resetPageIndex(table)\n }\n}\n\n/**\n * Routes a pagination updater through the table's pagination change handler.\n *\n * The updater may be a next state object or a function of the previous\n * `PaginationState`; controlled state and external atoms observe the same\n * updater path as the instance API.\n *\n * @example\n * ```ts\n * table_setPagination(table, (old) => old)\n * ```\n */\nexport function table_setPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<PaginationState>) {\n const safeUpdater: Updater<PaginationState> = (old) => {\n const newState = functionalUpdate(updater, old)\n\n return newState\n }\n\n return table.options.onPaginationChange?.(safeUpdater)\n}\n\n/**\n * Resets `pagination` to the configured initial state or feature default.\n *\n * With no argument, the reset clones `table.initialState.pagination` when it\n * exists. Passing `true` ignores initial state and resets to\n * `{ pageIndex: 0, pageSize: 10 }`.\n *\n * @example\n * ```ts\n * table_resetPagination(table)\n * table_resetPagination(table, true)\n * ```\n */\nexport function table_resetPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n table_setPagination(\n table,\n defaultState\n ? getDefaultPaginationState()\n : cloneState(\n table.initialState.pagination ?? getDefaultPaginationState(),\n ),\n )\n}\n\n/**\n * Updates `pagination.pageIndex` and clamps it to the known page range.\n *\n * Unknown page counts (`undefined` or `-1`) allow any non-negative page index.\n * Known page counts clamp the index between `0` and `pageCount - 1`.\n *\n * @example\n * ```ts\n * table_setPageIndex(table, (old) => old)\n * ```\n */\nexport function table_setPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n let pageIndex = functionalUpdate(updater, old.pageIndex)\n\n const maxPageIndex =\n typeof table.options.pageCount === 'undefined' ||\n table.options.pageCount === -1\n ? Number.MAX_SAFE_INTEGER\n : table.options.pageCount - 1\n\n pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex))\n\n return {\n ...old,\n pageIndex,\n }\n })\n}\n\n/**\n * Resets only `pagination.pageIndex`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageIndex`\n * or `0`. Passing `true` always resets the page index to `0`.\n *\n * @example\n * ```ts\n * table_resetPageIndex(table)\n * table_resetPageIndex(table, true)\n * ```\n */\nexport function table_resetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageIndex =\n table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n const newPageIndex = defaultState\n ? defaultPageIndex\n : (table.initialState.pagination?.pageIndex ?? defaultPageIndex)\n if (newPageIndex === currentPageIndex) return\n table_setPageIndex(table, newPageIndex)\n}\n\n/**\n * Resets only `pagination.pageSize`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageSize`\n * or `10`. Passing `true` always resets the page size to `10`.\n *\n * @example\n * ```ts\n * table_resetPageSize(table)\n * table_resetPageSize(table, true)\n * ```\n */\nexport function table_resetPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageSize =\n table.atoms.pagination?.get()?.pageSize ?? defaultPageSize\n const newPageSize = defaultState\n ? defaultPageSize\n : (table.initialState.pagination?.pageSize ?? defaultPageSize)\n if (newPageSize === currentPageSize) return\n table_setPageSize(table, newPageSize)\n}\n\n/**\n * Updates `pagination.pageSize` while preserving the current top row.\n *\n * The new size is clamped to at least `1`, and `pageIndex` is recalculated so\n * the row that was previously at the top of the page remains in view.\n *\n * @example\n * ```ts\n * table_setPageSize(table, (old) => old)\n * ```\n */\nexport function table_setPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize))\n const topRowIndex = old.pageSize * old.pageIndex\n const pageIndex = Math.floor(topRowIndex / pageSize)\n\n return {\n ...old,\n pageIndex,\n pageSize,\n }\n })\n}\n\n/**\n * Builds the zero-based page indexes available for the current page count.\n *\n * Unknown or empty page counts return an empty array; otherwise the result is\n * `[0, 1, ...pageCount - 1]`.\n *\n * @example\n * ```ts\n * const pageIndexes = table_getPageOptions(table)\n * ```\n */\nexport function table_getPageOptions<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageCount = table_getPageCount(table)\n let pageOptions: Array<number> = []\n if (pageCount && pageCount > 0) {\n pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i)\n }\n return pageOptions\n}\n\n/**\n * Checks whether the current page index can move backward.\n *\n * The first page is page index `0`, so only positive page indexes can navigate\n * to a previous page.\n *\n * @example\n * ```ts\n * const canGoBack = table_getCanPreviousPage(table)\n * ```\n */\nexport function table_getCanPreviousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (table.atoms.pagination?.get()?.pageIndex ?? 0) > 0\n}\n\n/**\n * Checks whether the current page index can move forward.\n *\n * A `pageCount` of `-1` means the caller does not know the total page count, so\n * this returns `true`. A page count of `0` returns `false`.\n *\n * @example\n * ```ts\n * const canGoForward = table_getCanNextPage(table)\n * ```\n */\nexport function table_getCanNextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n\n const pageCount = table_getPageCount(table)\n\n if (pageCount === -1) {\n return true\n }\n\n if (pageCount === 0) {\n return false\n }\n\n return pageIndex < pageCount - 1\n}\n\n/**\n * Moves the table to the previous page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_previousPage(table)\n * ```\n */\nexport function table_previousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => old - 1)\n}\n\n/**\n * Moves the table to the next page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_nextPage(table)\n * ```\n */\nexport function table_nextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => {\n return old + 1\n })\n}\n\n/**\n * Moves the table to the first page.\n *\n * This is a convenience wrapper around `table_setPageIndex(table, 0)`.\n *\n * @example\n * ```ts\n * table_firstPage(table)\n * ```\n */\nexport function table_firstPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, 0)\n}\n\n/**\n * Moves the table to the last known page.\n *\n * The target page is derived from `table_getPageCount(table) - 1`.\n *\n * @example\n * ```ts\n * table_lastPage(table)\n * ```\n */\nexport function table_lastPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, table_getPageCount(table) - 1)\n}\n\n/**\n * Resolves the number of pages for the current pagination state.\n *\n * `options.pageCount` wins for manual pagination. Otherwise the value is\n * calculated from `table_getRowCount(table)` and the current `pageSize`.\n *\n * @example\n * ```ts\n * const pages = table_getPageCount(table)\n * ```\n */\nexport function table_getPageCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (\n table.options.pageCount ??\n Math.ceil(\n table_getRowCount(table) /\n (table.atoms.pagination?.get()?.pageSize ?? defaultPageSize),\n )\n )\n}\n\n/**\n * Resolves the total row count used for pagination math.\n *\n * `options.rowCount` wins for manual pagination. Otherwise the count comes\n * from the pre-paginated row model so filtering, grouping, sorting, and\n * expansion are reflected before the page slice is applied.\n *\n * @example\n * ```ts\n * const rows = table_getRowCount(table)\n * ```\n */\nexport function table_getRowCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table.options.rowCount ?? table.getPrePaginatedRowModel().rows.length\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rowPaginationFeature.utils.cjs","names":["functionalUpdate","cloneState"],"sources":["../../../src/features/row-pagination/rowPaginationFeature.utils.ts"],"sourcesContent":["import { cloneState, functionalUpdate } from '../../utils'\nimport type { RowData, Updater } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Table_Internal } from '../../types/Table'\nimport type { PaginationState } from './rowPaginationFeature.types'\n\nconst defaultPageIndex = 0\nconst defaultPageSize = 10\n\n/**\n * Creates the default pagination state used by the pagination feature.\n *\n * The feature default starts at the first page with a page size of 10. Reset\n * APIs use this value when `defaultState` is `true`.\n *\n * @example\n * ```ts\n * const pagination = getDefaultPaginationState()\n * ```\n */\nexport function getDefaultPaginationState(): PaginationState {\n return {\n pageIndex: defaultPageIndex,\n pageSize: defaultPageSize,\n }\n}\n\n/**\n * Resets the page index when a page-altering change should return to page 0.\n *\n * The reset runs when `autoResetAll`, `autoResetPageIndex`, or the default\n * client-side pagination behavior allows it. Manual pagination opts out unless\n * the reset options explicitly opt back in.\n *\n * @example\n * ```ts\n * table_autoResetPageIndex(table)\n * ```\n */\nexport function table_autoResetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n if (\n table.options.autoResetAll ??\n table.options.autoResetPageIndex ??\n !table.options.manualPagination\n ) {\n table_resetPageIndex(table, true)\n }\n}\n\n/**\n * Routes a pagination updater through the table's pagination change handler.\n *\n * The updater may be a next state object or a function of the previous\n * `PaginationState`; controlled state and external atoms observe the same\n * updater path as the instance API.\n *\n * @example\n * ```ts\n * table_setPagination(table, (old) => old)\n * ```\n */\nexport function table_setPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<PaginationState>) {\n const safeUpdater: Updater<PaginationState> = (old) => {\n const newState = functionalUpdate(updater, old)\n\n return newState\n }\n\n return table.options.onPaginationChange?.(safeUpdater)\n}\n\n/**\n * Resets `pagination` to the configured initial state or feature default.\n *\n * With no argument, the reset clones `table.initialState.pagination` when it\n * exists. Passing `true` ignores initial state and resets to\n * `{ pageIndex: 0, pageSize: 10 }`.\n *\n * @example\n * ```ts\n * table_resetPagination(table)\n * table_resetPagination(table, true)\n * ```\n */\nexport function table_resetPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n table_setPagination(\n table,\n defaultState\n ? getDefaultPaginationState()\n : cloneState(\n table.initialState.pagination ?? getDefaultPaginationState(),\n ),\n )\n}\n\n/**\n * Updates `pagination.pageIndex` and clamps it to the known page range.\n *\n * Unknown page counts (`undefined` or `-1`) allow any non-negative page index.\n * Known page counts clamp the index between `0` and `pageCount - 1`.\n *\n * @example\n * ```ts\n * table_setPageIndex(table, (old) => old)\n * ```\n */\nexport function table_setPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n let pageIndex = functionalUpdate(updater, old.pageIndex)\n\n const maxPageIndex =\n typeof table.options.pageCount === 'undefined' ||\n table.options.pageCount === -1\n ? Number.MAX_SAFE_INTEGER\n : table.options.pageCount - 1\n\n pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex))\n\n return {\n ...old,\n pageIndex,\n }\n })\n}\n\n/**\n * Resets only `pagination.pageIndex`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageIndex`\n * or `0`. Passing `true` always resets the page index to `0`.\n *\n * @example\n * ```ts\n * table_resetPageIndex(table)\n * table_resetPageIndex(table, true)\n * ```\n */\nexport function table_resetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageIndex =\n table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n const newPageIndex = defaultState\n ? defaultPageIndex\n : (table.initialState.pagination?.pageIndex ?? defaultPageIndex)\n if (newPageIndex === currentPageIndex) return\n table_setPageIndex(table, newPageIndex)\n}\n\n/**\n * Resets only `pagination.pageSize`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageSize`\n * or `10`. Passing `true` always resets the page size to `10`.\n *\n * @example\n * ```ts\n * table_resetPageSize(table)\n * table_resetPageSize(table, true)\n * ```\n */\nexport function table_resetPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageSize =\n table.atoms.pagination?.get()?.pageSize ?? defaultPageSize\n const newPageSize = defaultState\n ? defaultPageSize\n : (table.initialState.pagination?.pageSize ?? defaultPageSize)\n if (newPageSize === currentPageSize) return\n table_setPageSize(table, newPageSize)\n}\n\n/**\n * Updates `pagination.pageSize` while preserving the current top row.\n *\n * The new size is clamped to at least `1`, and `pageIndex` is recalculated so\n * the row that was previously at the top of the page remains in view.\n *\n * @example\n * ```ts\n * table_setPageSize(table, (old) => old)\n * ```\n */\nexport function table_setPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize))\n const topRowIndex = old.pageSize * old.pageIndex\n const pageIndex = Math.floor(topRowIndex / pageSize)\n\n return {\n ...old,\n pageIndex,\n pageSize,\n }\n })\n}\n\n/**\n * Builds the zero-based page indexes available for the current page count.\n *\n * Unknown or empty page counts return an empty array; otherwise the result is\n * `[0, 1, ...pageCount - 1]`.\n *\n * @example\n * ```ts\n * const pageIndexes = table_getPageOptions(table)\n * ```\n */\nexport function table_getPageOptions<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageCount = table_getPageCount(table)\n let pageOptions: Array<number> = []\n if (pageCount && pageCount > 0) {\n pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i)\n }\n return pageOptions\n}\n\n/**\n * Checks whether the current page index can move backward.\n *\n * The first page is page index `0`, so only positive page indexes can navigate\n * to a previous page.\n *\n * @example\n * ```ts\n * const canGoBack = table_getCanPreviousPage(table)\n * ```\n */\nexport function table_getCanPreviousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (table.atoms.pagination?.get()?.pageIndex ?? 0) > 0\n}\n\n/**\n * Checks whether the current page index can move forward.\n *\n * A `pageCount` of `-1` means the caller does not know the total page count, so\n * this returns `true`. A page count of `0` returns `false`.\n *\n * @example\n * ```ts\n * const canGoForward = table_getCanNextPage(table)\n * ```\n */\nexport function table_getCanNextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n\n const pageCount = table_getPageCount(table)\n\n if (pageCount === -1) {\n return true\n }\n\n if (pageCount === 0) {\n return false\n }\n\n return pageIndex < pageCount - 1\n}\n\n/**\n * Moves the table to the previous page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_previousPage(table)\n * ```\n */\nexport function table_previousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => old - 1)\n}\n\n/**\n * Moves the table to the next page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_nextPage(table)\n * ```\n */\nexport function table_nextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => {\n return old + 1\n })\n}\n\n/**\n * Moves the table to the first page.\n *\n * This is a convenience wrapper around `table_setPageIndex(table, 0)`.\n *\n * @example\n * ```ts\n * table_firstPage(table)\n * ```\n */\nexport function table_firstPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, 0)\n}\n\n/**\n * Moves the table to the last known page.\n *\n * The target page is derived from `table_getPageCount(table) - 1`.\n *\n * @example\n * ```ts\n * table_lastPage(table)\n * ```\n */\nexport function table_lastPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, table_getPageCount(table) - 1)\n}\n\n/**\n * Resolves the number of pages for the current pagination state.\n *\n * `options.pageCount` wins for manual pagination. Otherwise the value is\n * calculated from `table_getRowCount(table)` and the current `pageSize`.\n *\n * @example\n * ```ts\n * const pages = table_getPageCount(table)\n * ```\n */\nexport function table_getPageCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (\n table.options.pageCount ??\n Math.ceil(\n table_getRowCount(table) /\n (table.atoms.pagination?.get()?.pageSize ?? defaultPageSize),\n )\n )\n}\n\n/**\n * Resolves the total row count used for pagination math.\n *\n * `options.rowCount` wins for manual pagination. Otherwise the count comes\n * from the pre-paginated row model so filtering, grouping, sorting, and\n * expansion are reflected before the page slice is applied.\n *\n * @example\n * ```ts\n * const rows = table_getRowCount(table)\n * ```\n */\nexport function table_getRowCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table.options.rowCount ?? table.getPrePaginatedRowModel().rows.length\n}\n"],"mappings":"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"}
@@ -33,7 +33,7 @@ function getDefaultPaginationState() {
33
33
  * ```
34
34
  */
35
35
  function table_autoResetPageIndex(table) {
36
- if (table.options.autoResetAll ?? table.options.autoResetPageIndex ?? !table.options.manualPagination) table_resetPageIndex(table);
36
+ if (table.options.autoResetAll ?? table.options.autoResetPageIndex ?? !table.options.manualPagination) table_resetPageIndex(table, true);
37
37
  }
38
38
  /**
39
39
  * Routes a pagination updater through the table's pagination change handler.
@@ -1 +1 @@
1
- {"version":3,"file":"rowPaginationFeature.utils.js","names":[],"sources":["../../../src/features/row-pagination/rowPaginationFeature.utils.ts"],"sourcesContent":["import { cloneState, functionalUpdate } from '../../utils'\nimport type { RowData, Updater } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Table_Internal } from '../../types/Table'\nimport type { PaginationState } from './rowPaginationFeature.types'\n\nconst defaultPageIndex = 0\nconst defaultPageSize = 10\n\n/**\n * Creates the default pagination state used by the pagination feature.\n *\n * The feature default starts at the first page with a page size of 10. Reset\n * APIs use this value when `defaultState` is `true`.\n *\n * @example\n * ```ts\n * const pagination = getDefaultPaginationState()\n * ```\n */\nexport function getDefaultPaginationState(): PaginationState {\n return {\n pageIndex: defaultPageIndex,\n pageSize: defaultPageSize,\n }\n}\n\n/**\n * Resets the page index when a page-altering change should return to page 0.\n *\n * The reset runs when `autoResetAll`, `autoResetPageIndex`, or the default\n * client-side pagination behavior allows it. Manual pagination opts out unless\n * the reset options explicitly opt back in.\n *\n * @example\n * ```ts\n * table_autoResetPageIndex(table)\n * ```\n */\nexport function table_autoResetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n if (\n table.options.autoResetAll ??\n table.options.autoResetPageIndex ??\n !table.options.manualPagination\n ) {\n table_resetPageIndex(table)\n }\n}\n\n/**\n * Routes a pagination updater through the table's pagination change handler.\n *\n * The updater may be a next state object or a function of the previous\n * `PaginationState`; controlled state and external atoms observe the same\n * updater path as the instance API.\n *\n * @example\n * ```ts\n * table_setPagination(table, (old) => old)\n * ```\n */\nexport function table_setPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<PaginationState>) {\n const safeUpdater: Updater<PaginationState> = (old) => {\n const newState = functionalUpdate(updater, old)\n\n return newState\n }\n\n return table.options.onPaginationChange?.(safeUpdater)\n}\n\n/**\n * Resets `pagination` to the configured initial state or feature default.\n *\n * With no argument, the reset clones `table.initialState.pagination` when it\n * exists. Passing `true` ignores initial state and resets to\n * `{ pageIndex: 0, pageSize: 10 }`.\n *\n * @example\n * ```ts\n * table_resetPagination(table)\n * table_resetPagination(table, true)\n * ```\n */\nexport function table_resetPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n table_setPagination(\n table,\n defaultState\n ? getDefaultPaginationState()\n : cloneState(\n table.initialState.pagination ?? getDefaultPaginationState(),\n ),\n )\n}\n\n/**\n * Updates `pagination.pageIndex` and clamps it to the known page range.\n *\n * Unknown page counts (`undefined` or `-1`) allow any non-negative page index.\n * Known page counts clamp the index between `0` and `pageCount - 1`.\n *\n * @example\n * ```ts\n * table_setPageIndex(table, (old) => old)\n * ```\n */\nexport function table_setPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n let pageIndex = functionalUpdate(updater, old.pageIndex)\n\n const maxPageIndex =\n typeof table.options.pageCount === 'undefined' ||\n table.options.pageCount === -1\n ? Number.MAX_SAFE_INTEGER\n : table.options.pageCount - 1\n\n pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex))\n\n return {\n ...old,\n pageIndex,\n }\n })\n}\n\n/**\n * Resets only `pagination.pageIndex`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageIndex`\n * or `0`. Passing `true` always resets the page index to `0`.\n *\n * @example\n * ```ts\n * table_resetPageIndex(table)\n * table_resetPageIndex(table, true)\n * ```\n */\nexport function table_resetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageIndex =\n table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n const newPageIndex = defaultState\n ? defaultPageIndex\n : (table.initialState.pagination?.pageIndex ?? defaultPageIndex)\n if (newPageIndex === currentPageIndex) return\n table_setPageIndex(table, newPageIndex)\n}\n\n/**\n * Resets only `pagination.pageSize`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageSize`\n * or `10`. Passing `true` always resets the page size to `10`.\n *\n * @example\n * ```ts\n * table_resetPageSize(table)\n * table_resetPageSize(table, true)\n * ```\n */\nexport function table_resetPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageSize =\n table.atoms.pagination?.get()?.pageSize ?? defaultPageSize\n const newPageSize = defaultState\n ? defaultPageSize\n : (table.initialState.pagination?.pageSize ?? defaultPageSize)\n if (newPageSize === currentPageSize) return\n table_setPageSize(table, newPageSize)\n}\n\n/**\n * Updates `pagination.pageSize` while preserving the current top row.\n *\n * The new size is clamped to at least `1`, and `pageIndex` is recalculated so\n * the row that was previously at the top of the page remains in view.\n *\n * @example\n * ```ts\n * table_setPageSize(table, (old) => old)\n * ```\n */\nexport function table_setPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize))\n const topRowIndex = old.pageSize * old.pageIndex\n const pageIndex = Math.floor(topRowIndex / pageSize)\n\n return {\n ...old,\n pageIndex,\n pageSize,\n }\n })\n}\n\n/**\n * Builds the zero-based page indexes available for the current page count.\n *\n * Unknown or empty page counts return an empty array; otherwise the result is\n * `[0, 1, ...pageCount - 1]`.\n *\n * @example\n * ```ts\n * const pageIndexes = table_getPageOptions(table)\n * ```\n */\nexport function table_getPageOptions<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageCount = table_getPageCount(table)\n let pageOptions: Array<number> = []\n if (pageCount && pageCount > 0) {\n pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i)\n }\n return pageOptions\n}\n\n/**\n * Checks whether the current page index can move backward.\n *\n * The first page is page index `0`, so only positive page indexes can navigate\n * to a previous page.\n *\n * @example\n * ```ts\n * const canGoBack = table_getCanPreviousPage(table)\n * ```\n */\nexport function table_getCanPreviousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (table.atoms.pagination?.get()?.pageIndex ?? 0) > 0\n}\n\n/**\n * Checks whether the current page index can move forward.\n *\n * A `pageCount` of `-1` means the caller does not know the total page count, so\n * this returns `true`. A page count of `0` returns `false`.\n *\n * @example\n * ```ts\n * const canGoForward = table_getCanNextPage(table)\n * ```\n */\nexport function table_getCanNextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n\n const pageCount = table_getPageCount(table)\n\n if (pageCount === -1) {\n return true\n }\n\n if (pageCount === 0) {\n return false\n }\n\n return pageIndex < pageCount - 1\n}\n\n/**\n * Moves the table to the previous page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_previousPage(table)\n * ```\n */\nexport function table_previousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => old - 1)\n}\n\n/**\n * Moves the table to the next page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_nextPage(table)\n * ```\n */\nexport function table_nextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => {\n return old + 1\n })\n}\n\n/**\n * Moves the table to the first page.\n *\n * This is a convenience wrapper around `table_setPageIndex(table, 0)`.\n *\n * @example\n * ```ts\n * table_firstPage(table)\n * ```\n */\nexport function table_firstPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, 0)\n}\n\n/**\n * Moves the table to the last known page.\n *\n * The target page is derived from `table_getPageCount(table) - 1`.\n *\n * @example\n * ```ts\n * table_lastPage(table)\n * ```\n */\nexport function table_lastPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, table_getPageCount(table) - 1)\n}\n\n/**\n * Resolves the number of pages for the current pagination state.\n *\n * `options.pageCount` wins for manual pagination. Otherwise the value is\n * calculated from `table_getRowCount(table)` and the current `pageSize`.\n *\n * @example\n * ```ts\n * const pages = table_getPageCount(table)\n * ```\n */\nexport function table_getPageCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (\n table.options.pageCount ??\n Math.ceil(\n table_getRowCount(table) /\n (table.atoms.pagination?.get()?.pageSize ?? defaultPageSize),\n )\n )\n}\n\n/**\n * Resolves the total row count used for pagination math.\n *\n * `options.rowCount` wins for manual pagination. Otherwise the count comes\n * from the pre-paginated row model so filtering, grouping, sorting, and\n * expansion are reflected before the page slice is applied.\n *\n * @example\n * ```ts\n * const rows = table_getRowCount(table)\n * ```\n */\nexport function table_getRowCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table.options.rowCount ?? table.getPrePaginatedRowModel().rows.length\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rowPaginationFeature.utils.js","names":[],"sources":["../../../src/features/row-pagination/rowPaginationFeature.utils.ts"],"sourcesContent":["import { cloneState, functionalUpdate } from '../../utils'\nimport type { RowData, Updater } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Table_Internal } from '../../types/Table'\nimport type { PaginationState } from './rowPaginationFeature.types'\n\nconst defaultPageIndex = 0\nconst defaultPageSize = 10\n\n/**\n * Creates the default pagination state used by the pagination feature.\n *\n * The feature default starts at the first page with a page size of 10. Reset\n * APIs use this value when `defaultState` is `true`.\n *\n * @example\n * ```ts\n * const pagination = getDefaultPaginationState()\n * ```\n */\nexport function getDefaultPaginationState(): PaginationState {\n return {\n pageIndex: defaultPageIndex,\n pageSize: defaultPageSize,\n }\n}\n\n/**\n * Resets the page index when a page-altering change should return to page 0.\n *\n * The reset runs when `autoResetAll`, `autoResetPageIndex`, or the default\n * client-side pagination behavior allows it. Manual pagination opts out unless\n * the reset options explicitly opt back in.\n *\n * @example\n * ```ts\n * table_autoResetPageIndex(table)\n * ```\n */\nexport function table_autoResetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n if (\n table.options.autoResetAll ??\n table.options.autoResetPageIndex ??\n !table.options.manualPagination\n ) {\n table_resetPageIndex(table, true)\n }\n}\n\n/**\n * Routes a pagination updater through the table's pagination change handler.\n *\n * The updater may be a next state object or a function of the previous\n * `PaginationState`; controlled state and external atoms observe the same\n * updater path as the instance API.\n *\n * @example\n * ```ts\n * table_setPagination(table, (old) => old)\n * ```\n */\nexport function table_setPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<PaginationState>) {\n const safeUpdater: Updater<PaginationState> = (old) => {\n const newState = functionalUpdate(updater, old)\n\n return newState\n }\n\n return table.options.onPaginationChange?.(safeUpdater)\n}\n\n/**\n * Resets `pagination` to the configured initial state or feature default.\n *\n * With no argument, the reset clones `table.initialState.pagination` when it\n * exists. Passing `true` ignores initial state and resets to\n * `{ pageIndex: 0, pageSize: 10 }`.\n *\n * @example\n * ```ts\n * table_resetPagination(table)\n * table_resetPagination(table, true)\n * ```\n */\nexport function table_resetPagination<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n table_setPagination(\n table,\n defaultState\n ? getDefaultPaginationState()\n : cloneState(\n table.initialState.pagination ?? getDefaultPaginationState(),\n ),\n )\n}\n\n/**\n * Updates `pagination.pageIndex` and clamps it to the known page range.\n *\n * Unknown page counts (`undefined` or `-1`) allow any non-negative page index.\n * Known page counts clamp the index between `0` and `pageCount - 1`.\n *\n * @example\n * ```ts\n * table_setPageIndex(table, (old) => old)\n * ```\n */\nexport function table_setPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n let pageIndex = functionalUpdate(updater, old.pageIndex)\n\n const maxPageIndex =\n typeof table.options.pageCount === 'undefined' ||\n table.options.pageCount === -1\n ? Number.MAX_SAFE_INTEGER\n : table.options.pageCount - 1\n\n pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex))\n\n return {\n ...old,\n pageIndex,\n }\n })\n}\n\n/**\n * Resets only `pagination.pageIndex`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageIndex`\n * or `0`. Passing `true` always resets the page index to `0`.\n *\n * @example\n * ```ts\n * table_resetPageIndex(table)\n * table_resetPageIndex(table, true)\n * ```\n */\nexport function table_resetPageIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageIndex =\n table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n const newPageIndex = defaultState\n ? defaultPageIndex\n : (table.initialState.pagination?.pageIndex ?? defaultPageIndex)\n if (newPageIndex === currentPageIndex) return\n table_setPageIndex(table, newPageIndex)\n}\n\n/**\n * Resets only `pagination.pageSize`.\n *\n * With no argument, the reset uses `table.initialState.pagination?.pageSize`\n * or `10`. Passing `true` always resets the page size to `10`.\n *\n * @example\n * ```ts\n * table_resetPageSize(table)\n * table_resetPageSize(table, true)\n * ```\n */\nexport function table_resetPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n const currentPageSize =\n table.atoms.pagination?.get()?.pageSize ?? defaultPageSize\n const newPageSize = defaultState\n ? defaultPageSize\n : (table.initialState.pagination?.pageSize ?? defaultPageSize)\n if (newPageSize === currentPageSize) return\n table_setPageSize(table, newPageSize)\n}\n\n/**\n * Updates `pagination.pageSize` while preserving the current top row.\n *\n * The new size is clamped to at least `1`, and `pageIndex` is recalculated so\n * the row that was previously at the top of the page remains in view.\n *\n * @example\n * ```ts\n * table_setPageSize(table, (old) => old)\n * ```\n */\nexport function table_setPageSize<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<number>) {\n table_setPagination(table, (old) => {\n const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize))\n const topRowIndex = old.pageSize * old.pageIndex\n const pageIndex = Math.floor(topRowIndex / pageSize)\n\n return {\n ...old,\n pageIndex,\n pageSize,\n }\n })\n}\n\n/**\n * Builds the zero-based page indexes available for the current page count.\n *\n * Unknown or empty page counts return an empty array; otherwise the result is\n * `[0, 1, ...pageCount - 1]`.\n *\n * @example\n * ```ts\n * const pageIndexes = table_getPageOptions(table)\n * ```\n */\nexport function table_getPageOptions<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageCount = table_getPageCount(table)\n let pageOptions: Array<number> = []\n if (pageCount && pageCount > 0) {\n pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i)\n }\n return pageOptions\n}\n\n/**\n * Checks whether the current page index can move backward.\n *\n * The first page is page index `0`, so only positive page indexes can navigate\n * to a previous page.\n *\n * @example\n * ```ts\n * const canGoBack = table_getCanPreviousPage(table)\n * ```\n */\nexport function table_getCanPreviousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (table.atoms.pagination?.get()?.pageIndex ?? 0) > 0\n}\n\n/**\n * Checks whether the current page index can move forward.\n *\n * A `pageCount` of `-1` means the caller does not know the total page count, so\n * this returns `true`. A page count of `0` returns `false`.\n *\n * @example\n * ```ts\n * const canGoForward = table_getCanNextPage(table)\n * ```\n */\nexport function table_getCanNextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex\n\n const pageCount = table_getPageCount(table)\n\n if (pageCount === -1) {\n return true\n }\n\n if (pageCount === 0) {\n return false\n }\n\n return pageIndex < pageCount - 1\n}\n\n/**\n * Moves the table to the previous page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_previousPage(table)\n * ```\n */\nexport function table_previousPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => old - 1)\n}\n\n/**\n * Moves the table to the next page.\n *\n * This delegates to `table_setPageIndex` so pagination state ownership and\n * updater semantics remain consistent.\n *\n * @example\n * ```ts\n * table_nextPage(table)\n * ```\n */\nexport function table_nextPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, (old) => {\n return old + 1\n })\n}\n\n/**\n * Moves the table to the first page.\n *\n * This is a convenience wrapper around `table_setPageIndex(table, 0)`.\n *\n * @example\n * ```ts\n * table_firstPage(table)\n * ```\n */\nexport function table_firstPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, 0)\n}\n\n/**\n * Moves the table to the last known page.\n *\n * The target page is derived from `table_getPageCount(table) - 1`.\n *\n * @example\n * ```ts\n * table_lastPage(table)\n * ```\n */\nexport function table_lastPage<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table_setPageIndex(table, table_getPageCount(table) - 1)\n}\n\n/**\n * Resolves the number of pages for the current pagination state.\n *\n * `options.pageCount` wins for manual pagination. Otherwise the value is\n * calculated from `table_getRowCount(table)` and the current `pageSize`.\n *\n * @example\n * ```ts\n * const pages = table_getPageCount(table)\n * ```\n */\nexport function table_getPageCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return (\n table.options.pageCount ??\n Math.ceil(\n table_getRowCount(table) /\n (table.atoms.pagination?.get()?.pageSize ?? defaultPageSize),\n )\n )\n}\n\n/**\n * Resolves the total row count used for pagination math.\n *\n * `options.rowCount` wins for manual pagination. Otherwise the count comes\n * from the pre-paginated row model so filtering, grouping, sorting, and\n * expansion are reflected before the page slice is applied.\n *\n * @example\n * ```ts\n * const rows = table_getRowCount(table)\n * ```\n */\nexport function table_getRowCount<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n return table.options.rowCount ?? table.getPrePaginatedRowModel().rows.length\n}\n"],"mappings":"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"}
@@ -118,7 +118,7 @@ const filterFn_between = Object.assign((row, columnId, filterValues) => {
118
118
  if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) return true;
119
119
  }
120
120
  return filterFn_lessThan(row, columnId, max);
121
- }, { autoRemove: (val) => testFalsy(val) || testFalsy(val[0]) && testFalsy(val[1]) });
121
+ }, { autoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1]) });
122
122
  /**
123
123
  * Keeps rows whose value falls between an inclusive min/max pair.
124
124
  *
@@ -137,7 +137,7 @@ const filterFn_betweenInclusive = Object.assign((row, columnId, filterValues) =>
137
137
  if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) return true;
138
138
  }
139
139
  return filterFn_lessThanOrEqualTo(row, columnId, max);
140
- }, { autoRemove: (val) => testFalsy(val) || testFalsy(val[0]) && testFalsy(val[1]) });
140
+ }, { autoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1]) });
141
141
  /**
142
142
  * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.
143
143
  *
@@ -162,7 +162,7 @@ const filterFn_inNumberRange = Object.assign((row, columnId, filterValue) => {
162
162
  }
163
163
  return [min, max];
164
164
  },
165
- autoRemove: (val) => testFalsy(val) || testFalsy(val[0]) && testFalsy(val[1])
165
+ autoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])
166
166
  });
167
167
  /**
168
168
  * Keeps rows whose scalar column value equals at least one filter value.
@@ -1 +1 @@
1
- {"version":3,"file":"filterFns.cjs","names":[],"sources":["../../src/fns/filterFns.ts"],"sourcesContent":["import type { RowData } from '../types/type-utils'\nimport type { TableFeatures } from '../types/TableFeatures'\nimport type { Row } from '../types/Row'\n\n// Basic filters\n\n/**\n * Keeps rows whose column value is strictly equal to the filter value.\n *\n * Uses JavaScript `===` comparison and auto-removes empty filter values.\n */\nexport const filterFn_equals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) === filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose column value is loosely equal to the filter value.\n *\n * Uses JavaScript `==` comparison and auto-removes empty filter values. This is\n * useful for matching string input against numeric row values.\n */\nexport const filterFn_weakEquals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) == filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// String filters\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_includesStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(String(filterValue)),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_includesString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(String(filterValue).toLowerCase()),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value equals the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_equalsString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n String(filterValue).toLowerCase()\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value exactly equals the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_equalsStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId)?.toString() === String(filterValue)\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n// Number filters\n\n/**\n * Keeps rows whose value is greater than the filter value.\n *\n * Numeric values are compared numerically when both sides can be coerced to\n * numbers; otherwise normalized strings are compared.\n */\nexport const filterFn_greaterThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = Number(filterValue)\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = String(filterValue).toLowerCase().trim()\n return stringValue > stringFilterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is greater than or equal to the filter value.\n *\n * Delegates to the built-in greater-than and equality comparisons.\n */\nexport const filterFn_greaterThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n filterFn_greaterThan(row, columnId, filterValue) ||\n filterFn_equals(row, columnId, filterValue)\n )\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than the filter value.\n *\n * This is implemented as the inverse of greater-than-or-equal comparison.\n */\nexport const filterFn_lessThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThanOrEqualTo(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than or equal to the filter value.\n *\n * This is implemented as the inverse of greater-than comparison.\n */\nexport const filterFn_lessThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThan(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// Range filters\n\n/**\n * Keeps rows whose value falls between an exclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_between = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThan(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThan(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose value falls between an inclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_betweenInclusive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThanOrEqualTo(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThanOrEqualTo(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.\n *\n * Filter values are normalized so blank endpoints become open-ended and\n * reversed endpoints are swapped.\n */\nexport const filterFn_inNumberRange = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: [number, number],\n ) => {\n const [min, max] = filterValue\n\n const rowValue: number = row.getValue(columnId)\n return rowValue >= min && rowValue <= max\n },\n {\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin =\n typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin\n const parsedMax =\n typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax\n\n let min =\n unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max =\n unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n autoRemove: (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n// Array filters\n\n/**\n * Keeps rows whose scalar column value equals at least one filter value.\n */\nexport const filterFn_arrHas = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n for (let i = 0; i < filterValue.length; i++) {\n if (value === filterValue[i]) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array or string column value includes at least one filter value.\n */\nexport const filterFn_arrIncludes = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n if (typeof value !== 'string' && !Array.isArray(value)) {\n return false\n }\n\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i] as any)) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes every filter value.\n */\nexport const filterFn_arrIncludesAll = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (!value.includes(filterValue[i])) {\n return false\n }\n }\n return true\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes at least one filter value.\n */\nexport const filterFn_arrIncludesSome = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i])) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n// Export\n\n/**\n * The built-in filter function registry.\n *\n * Pass this object to filtered row model creation or extend it with custom filter functions.\n */\nexport const filterFns = {\n arrIncludes: filterFn_arrIncludes,\n arrIncludesAll: filterFn_arrIncludesAll,\n arrHas: filterFn_arrHas,\n arrIncludesSome: filterFn_arrIncludesSome,\n between: filterFn_between,\n betweenInclusive: filterFn_betweenInclusive,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n inNumberRange: filterFn_inNumberRange,\n includesString: filterFn_includesString,\n includesStringSensitive: filterFn_includesStringSensitive,\n weakEquals: filterFn_weakEquals,\n}\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n\n// Utils\n\nfunction testFalsy(val: any) {\n return val === undefined || val === null || val === ''\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filterFns.cjs","names":[],"sources":["../../src/fns/filterFns.ts"],"sourcesContent":["import type { RowData } from '../types/type-utils'\nimport type { TableFeatures } from '../types/TableFeatures'\nimport type { Row } from '../types/Row'\n\n// Basic filters\n\n/**\n * Keeps rows whose column value is strictly equal to the filter value.\n *\n * Uses JavaScript `===` comparison and auto-removes empty filter values.\n */\nexport const filterFn_equals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) === filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose column value is loosely equal to the filter value.\n *\n * Uses JavaScript `==` comparison and auto-removes empty filter values. This is\n * useful for matching string input against numeric row values.\n */\nexport const filterFn_weakEquals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) == filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// String filters\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_includesStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(String(filterValue)),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_includesString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(String(filterValue).toLowerCase()),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value equals the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_equalsString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n String(filterValue).toLowerCase()\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value exactly equals the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_equalsStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId)?.toString() === String(filterValue)\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n// Number filters\n\n/**\n * Keeps rows whose value is greater than the filter value.\n *\n * Numeric values are compared numerically when both sides can be coerced to\n * numbers; otherwise normalized strings are compared.\n */\nexport const filterFn_greaterThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = Number(filterValue)\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = String(filterValue).toLowerCase().trim()\n return stringValue > stringFilterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is greater than or equal to the filter value.\n *\n * Delegates to the built-in greater-than and equality comparisons.\n */\nexport const filterFn_greaterThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n filterFn_greaterThan(row, columnId, filterValue) ||\n filterFn_equals(row, columnId, filterValue)\n )\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than the filter value.\n *\n * This is implemented as the inverse of greater-than-or-equal comparison.\n */\nexport const filterFn_lessThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThanOrEqualTo(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than or equal to the filter value.\n *\n * This is implemented as the inverse of greater-than comparison.\n */\nexport const filterFn_lessThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThan(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// Range filters\n\n/**\n * Keeps rows whose value falls between an exclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_between = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThan(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThan(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose value falls between an inclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_betweenInclusive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThanOrEqualTo(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThanOrEqualTo(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.\n *\n * Filter values are normalized so blank endpoints become open-ended and\n * reversed endpoints are swapped.\n */\nexport const filterFn_inNumberRange = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: [number, number],\n ) => {\n const [min, max] = filterValue\n\n const rowValue: number = row.getValue(columnId)\n return rowValue >= min && rowValue <= max\n },\n {\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin =\n typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin\n const parsedMax =\n typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax\n\n let min =\n unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max =\n unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n// Array filters\n\n/**\n * Keeps rows whose scalar column value equals at least one filter value.\n */\nexport const filterFn_arrHas = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n for (let i = 0; i < filterValue.length; i++) {\n if (value === filterValue[i]) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array or string column value includes at least one filter value.\n */\nexport const filterFn_arrIncludes = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n if (typeof value !== 'string' && !Array.isArray(value)) {\n return false\n }\n\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i] as any)) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes every filter value.\n */\nexport const filterFn_arrIncludesAll = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (!value.includes(filterValue[i])) {\n return false\n }\n }\n return true\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes at least one filter value.\n */\nexport const filterFn_arrIncludesSome = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i])) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n// Export\n\n/**\n * The built-in filter function registry.\n *\n * Pass this object to filtered row model creation or extend it with custom filter functions.\n */\nexport const filterFns = {\n arrIncludes: filterFn_arrIncludes,\n arrIncludesAll: filterFn_arrIncludesAll,\n arrHas: filterFn_arrHas,\n arrIncludesSome: filterFn_arrIncludesSome,\n between: filterFn_between,\n betweenInclusive: filterFn_betweenInclusive,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n inNumberRange: filterFn_inNumberRange,\n includesString: filterFn_includesString,\n includesStringSensitive: filterFn_includesStringSensitive,\n weakEquals: filterFn_weakEquals,\n}\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n\n// Utils\n\nfunction testFalsy(val: any) {\n return val === undefined || val === null || val === ''\n}\n"],"mappings":"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"}
@@ -117,7 +117,7 @@ const filterFn_between = Object.assign((row, columnId, filterValues) => {
117
117
  if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) return true;
118
118
  }
119
119
  return filterFn_lessThan(row, columnId, max);
120
- }, { autoRemove: (val) => testFalsy(val) || testFalsy(val[0]) && testFalsy(val[1]) });
120
+ }, { autoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1]) });
121
121
  /**
122
122
  * Keeps rows whose value falls between an inclusive min/max pair.
123
123
  *
@@ -136,7 +136,7 @@ const filterFn_betweenInclusive = Object.assign((row, columnId, filterValues) =>
136
136
  if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) return true;
137
137
  }
138
138
  return filterFn_lessThanOrEqualTo(row, columnId, max);
139
- }, { autoRemove: (val) => testFalsy(val) || testFalsy(val[0]) && testFalsy(val[1]) });
139
+ }, { autoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1]) });
140
140
  /**
141
141
  * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.
142
142
  *
@@ -161,7 +161,7 @@ const filterFn_inNumberRange = Object.assign((row, columnId, filterValue) => {
161
161
  }
162
162
  return [min, max];
163
163
  },
164
- autoRemove: (val) => testFalsy(val) || testFalsy(val[0]) && testFalsy(val[1])
164
+ autoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])
165
165
  });
166
166
  /**
167
167
  * Keeps rows whose scalar column value equals at least one filter value.
@@ -1 +1 @@
1
- {"version":3,"file":"filterFns.js","names":[],"sources":["../../src/fns/filterFns.ts"],"sourcesContent":["import type { RowData } from '../types/type-utils'\nimport type { TableFeatures } from '../types/TableFeatures'\nimport type { Row } from '../types/Row'\n\n// Basic filters\n\n/**\n * Keeps rows whose column value is strictly equal to the filter value.\n *\n * Uses JavaScript `===` comparison and auto-removes empty filter values.\n */\nexport const filterFn_equals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) === filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose column value is loosely equal to the filter value.\n *\n * Uses JavaScript `==` comparison and auto-removes empty filter values. This is\n * useful for matching string input against numeric row values.\n */\nexport const filterFn_weakEquals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) == filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// String filters\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_includesStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(String(filterValue)),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_includesString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(String(filterValue).toLowerCase()),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value equals the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_equalsString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n String(filterValue).toLowerCase()\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value exactly equals the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_equalsStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId)?.toString() === String(filterValue)\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n// Number filters\n\n/**\n * Keeps rows whose value is greater than the filter value.\n *\n * Numeric values are compared numerically when both sides can be coerced to\n * numbers; otherwise normalized strings are compared.\n */\nexport const filterFn_greaterThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = Number(filterValue)\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = String(filterValue).toLowerCase().trim()\n return stringValue > stringFilterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is greater than or equal to the filter value.\n *\n * Delegates to the built-in greater-than and equality comparisons.\n */\nexport const filterFn_greaterThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n filterFn_greaterThan(row, columnId, filterValue) ||\n filterFn_equals(row, columnId, filterValue)\n )\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than the filter value.\n *\n * This is implemented as the inverse of greater-than-or-equal comparison.\n */\nexport const filterFn_lessThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThanOrEqualTo(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than or equal to the filter value.\n *\n * This is implemented as the inverse of greater-than comparison.\n */\nexport const filterFn_lessThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThan(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// Range filters\n\n/**\n * Keeps rows whose value falls between an exclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_between = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThan(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThan(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose value falls between an inclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_betweenInclusive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThanOrEqualTo(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThanOrEqualTo(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.\n *\n * Filter values are normalized so blank endpoints become open-ended and\n * reversed endpoints are swapped.\n */\nexport const filterFn_inNumberRange = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: [number, number],\n ) => {\n const [min, max] = filterValue\n\n const rowValue: number = row.getValue(columnId)\n return rowValue >= min && rowValue <= max\n },\n {\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin =\n typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin\n const parsedMax =\n typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax\n\n let min =\n unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max =\n unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n autoRemove: (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n// Array filters\n\n/**\n * Keeps rows whose scalar column value equals at least one filter value.\n */\nexport const filterFn_arrHas = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n for (let i = 0; i < filterValue.length; i++) {\n if (value === filterValue[i]) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array or string column value includes at least one filter value.\n */\nexport const filterFn_arrIncludes = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n if (typeof value !== 'string' && !Array.isArray(value)) {\n return false\n }\n\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i] as any)) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes every filter value.\n */\nexport const filterFn_arrIncludesAll = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (!value.includes(filterValue[i])) {\n return false\n }\n }\n return true\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes at least one filter value.\n */\nexport const filterFn_arrIncludesSome = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i])) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n// Export\n\n/**\n * The built-in filter function registry.\n *\n * Pass this object to filtered row model creation or extend it with custom filter functions.\n */\nexport const filterFns = {\n arrIncludes: filterFn_arrIncludes,\n arrIncludesAll: filterFn_arrIncludesAll,\n arrHas: filterFn_arrHas,\n arrIncludesSome: filterFn_arrIncludesSome,\n between: filterFn_between,\n betweenInclusive: filterFn_betweenInclusive,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n inNumberRange: filterFn_inNumberRange,\n includesString: filterFn_includesString,\n includesStringSensitive: filterFn_includesStringSensitive,\n weakEquals: filterFn_weakEquals,\n}\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n\n// Utils\n\nfunction testFalsy(val: any) {\n return val === undefined || val === null || val === ''\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filterFns.js","names":[],"sources":["../../src/fns/filterFns.ts"],"sourcesContent":["import type { RowData } from '../types/type-utils'\nimport type { TableFeatures } from '../types/TableFeatures'\nimport type { Row } from '../types/Row'\n\n// Basic filters\n\n/**\n * Keeps rows whose column value is strictly equal to the filter value.\n *\n * Uses JavaScript `===` comparison and auto-removes empty filter values.\n */\nexport const filterFn_equals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) === filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose column value is loosely equal to the filter value.\n *\n * Uses JavaScript `==` comparison and auto-removes empty filter values. This is\n * useful for matching string input against numeric row values.\n */\nexport const filterFn_weakEquals = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId) == filterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// String filters\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_includesStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(String(filterValue)),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_includesString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(String(filterValue).toLowerCase()),\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value equals the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_equalsString = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n String(filterValue).toLowerCase()\n )\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n },\n)\n\n/**\n * Keeps rows whose stringified column value exactly equals the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_equalsStringSensitive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return row.getValue(columnId)?.toString() === String(filterValue)\n },\n {\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n },\n)\n\n// Number filters\n\n/**\n * Keeps rows whose value is greater than the filter value.\n *\n * Numeric values are compared numerically when both sides can be coerced to\n * numbers; otherwise normalized strings are compared.\n */\nexport const filterFn_greaterThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = Number(filterValue)\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = String(filterValue).toLowerCase().trim()\n return stringValue > stringFilterValue\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is greater than or equal to the filter value.\n *\n * Delegates to the built-in greater-than and equality comparisons.\n */\nexport const filterFn_greaterThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return (\n filterFn_greaterThan(row, columnId, filterValue) ||\n filterFn_equals(row, columnId, filterValue)\n )\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than the filter value.\n *\n * This is implemented as the inverse of greater-than-or-equal comparison.\n */\nexport const filterFn_lessThan = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThanOrEqualTo(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n/**\n * Keeps rows whose value is less than or equal to the filter value.\n *\n * This is implemented as the inverse of greater-than comparison.\n */\nexport const filterFn_lessThanOrEqualTo = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n ) => {\n return !filterFn_greaterThan(row, columnId, filterValue)\n },\n { autoRemove: (val: any) => testFalsy(val) },\n)\n\n// Range filters\n\n/**\n * Keeps rows whose value falls between an exclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_between = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThan(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThan(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose value falls between an inclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nconst filterFn_betweenInclusive = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [unknown, unknown],\n ): boolean => {\n const min = filterValues[0]\n if (min !== '' && min !== undefined) {\n if (!filterFn_greaterThanOrEqualTo(row, columnId, min)) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (min !== '' && min !== undefined) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return filterFn_lessThanOrEqualTo(row, columnId, max)\n },\n {\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n/**\n * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.\n *\n * Filter values are normalized so blank endpoints become open-ended and\n * reversed endpoints are swapped.\n */\nexport const filterFn_inNumberRange = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: [number, number],\n ) => {\n const [min, max] = filterValue\n\n const rowValue: number = row.getValue(columnId)\n return rowValue >= min && rowValue <= max\n },\n {\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin =\n typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin\n const parsedMax =\n typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax\n\n let min =\n unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max =\n unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n },\n)\n\n// Array filters\n\n/**\n * Keeps rows whose scalar column value equals at least one filter value.\n */\nexport const filterFn_arrHas = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n for (let i = 0; i < filterValue.length; i++) {\n if (value === filterValue[i]) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array or string column value includes at least one filter value.\n */\nexport const filterFn_arrIncludes = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<unknown>(columnId)\n if (typeof value !== 'string' && !Array.isArray(value)) {\n return false\n }\n\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i] as any)) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes every filter value.\n */\nexport const filterFn_arrIncludesAll = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (!value.includes(filterValue[i])) {\n return false\n }\n }\n return true\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n/**\n * Keeps rows whose array column value includes at least one filter value.\n */\nexport const filterFn_arrIncludesSome = Object.assign(\n <TFeatures extends TableFeatures, TData extends RowData>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n ) => {\n const value = row.getValue<Array<unknown>>(columnId)\n if (!Array.isArray(value)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (value.includes(filterValue[i])) {\n return true\n }\n }\n return false\n },\n { autoRemove: (val: any) => testFalsy(val) || !val?.length },\n)\n\n// Export\n\n/**\n * The built-in filter function registry.\n *\n * Pass this object to filtered row model creation or extend it with custom filter functions.\n */\nexport const filterFns = {\n arrIncludes: filterFn_arrIncludes,\n arrIncludesAll: filterFn_arrIncludesAll,\n arrHas: filterFn_arrHas,\n arrIncludesSome: filterFn_arrIncludesSome,\n between: filterFn_between,\n betweenInclusive: filterFn_betweenInclusive,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n inNumberRange: filterFn_inNumberRange,\n includesString: filterFn_includesString,\n includesStringSensitive: filterFn_includesStringSensitive,\n weakEquals: filterFn_weakEquals,\n}\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n\n// Utils\n\nfunction testFalsy(val: any) {\n return val === undefined || val === null || val === ''\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/table-core",
3
- "version": "9.0.0-beta.44",
3
+ "version": "9.0.0-beta.46",
4
4
  "description": "Headless UI for building powerful tables & datagrids for TS/JS.",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -5,7 +5,7 @@ description: >
5
5
  metadata:
6
6
  type: sub-skill
7
7
  library: '@tanstack/table-core'
8
- library_version: '9.0.0-beta.44'
8
+ library_version: '9.0.0-beta.46'
9
9
  requires: ['core', 'table-features']
10
10
  sources:
11
11
  - 'TanStack/table:packages/table-core/src/index.ts'
@@ -5,7 +5,7 @@ description: >
5
5
  metadata:
6
6
  type: sub-skill
7
7
  library: '@tanstack/table-core'
8
- library_version: '9.0.0-beta.44'
8
+ library_version: '9.0.0-beta.46'
9
9
  requires: ['core', 'table-features']
10
10
  sources:
11
11
  - 'TanStack/table:docs/guide/row-models.md'
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'column-filtering']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'client-vs-server']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'column-sizing']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'column-sizing']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features']
12
12
  sources:
@@ -5,7 +5,7 @@ description: >
5
5
  metadata:
6
6
  type: core
7
7
  library: '@tanstack/table-core'
8
- library_version: '9.0.0-beta.44'
8
+ library_version: '9.0.0-beta.46'
9
9
  sources:
10
10
  - 'TanStack/table:docs/overview.md'
11
11
  - 'TanStack/table:docs/guide/tables.md'
@@ -5,7 +5,7 @@ description: >
5
5
  metadata:
6
6
  type: sub-skill
7
7
  library: '@tanstack/table-core'
8
- library_version: '9.0.0-beta.44'
8
+ library_version: '9.0.0-beta.46'
9
9
  requires: ['core', 'table-features', 'typescript']
10
10
  sources:
11
11
  - 'TanStack/table:docs/framework/react/guide/custom-features.md'
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'client-vs-server']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'client-vs-server', 'column-filtering']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'client-vs-server']
12
12
  sources:
@@ -5,7 +5,7 @@ description: >
5
5
  metadata:
6
6
  type: lifecycle
7
7
  library: '@tanstack/table-core'
8
- library_version: '9.0.0-beta.44'
8
+ library_version: '9.0.0-beta.46'
9
9
  requires: ['core', 'table-features', 'typescript']
10
10
  sources:
11
11
  - 'TanStack/table:docs/framework/react/guide/migrating.md'
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'client-vs-server']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features']
12
12
  sources:
@@ -6,7 +6,7 @@ metadata:
6
6
  {
7
7
  type: sub-skill,
8
8
  library: '@tanstack/table-core',
9
- library_version: '9.0.0-beta.44',
9
+ library_version: '9.0.0-beta.46',
10
10
  }
11
11
  requires: ['core', 'table-features', 'client-vs-server']
12
12
  sources:
@@ -5,7 +5,7 @@ description: >
5
5
  metadata:
6
6
  type: sub-skill
7
7
  library: '@tanstack/table-core'
8
- library_version: '9.0.0-beta.44'
8
+ library_version: '9.0.0-beta.46'
9
9
  requires: ['core']
10
10
  sources:
11
11
  - 'TanStack/table:docs/guide/row-models.md'
@@ -5,7 +5,7 @@ description: >
5
5
  metadata:
6
6
  type: sub-skill
7
7
  library: '@tanstack/table-core'
8
- library_version: '9.0.0-beta.44'
8
+ library_version: '9.0.0-beta.46'
9
9
  requires: ['core', 'table-features']
10
10
  sources:
11
11
  - 'TanStack/table:docs/guide/helpers.md'
@@ -46,7 +46,7 @@ export function table_autoResetPageIndex<
46
46
  table.options.autoResetPageIndex ??
47
47
  !table.options.manualPagination
48
48
  ) {
49
- table_resetPageIndex(table)
49
+ table_resetPageIndex(table, true)
50
50
  }
51
51
  }
52
52
 
@@ -246,7 +246,8 @@ const filterFn_between = Object.assign(
246
246
  },
247
247
  {
248
248
  autoRemove: (val: any) =>
249
- testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),
249
+ testFalsy(val) ||
250
+ (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),
250
251
  },
251
252
  )
252
253
 
@@ -285,7 +286,8 @@ const filterFn_betweenInclusive = Object.assign(
285
286
  },
286
287
  {
287
288
  autoRemove: (val: any) =>
288
- testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),
289
+ testFalsy(val) ||
290
+ (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),
289
291
  },
290
292
  )
291
293
 
@@ -329,7 +331,8 @@ export const filterFn_inNumberRange = Object.assign(
329
331
  return [min, max] as const
330
332
  },
331
333
  autoRemove: (val: any) =>
332
- testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1])),
334
+ testFalsy(val) ||
335
+ (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),
333
336
  },
334
337
  )
335
338