@tanstack/table-core 9.0.0-alpha.36 → 9.0.0-alpha.37

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 (79) hide show
  1. package/dist/core/columns/constructColumn.cjs.map +1 -1
  2. package/dist/core/columns/constructColumn.js.map +1 -1
  3. package/dist/core/columns/coreColumnsFeature.utils.cjs.map +1 -1
  4. package/dist/core/columns/coreColumnsFeature.utils.js.map +1 -1
  5. package/dist/core/headers/buildHeaderGroups.cjs.map +1 -1
  6. package/dist/core/headers/buildHeaderGroups.js.map +1 -1
  7. package/dist/core/headers/coreHeadersFeature.utils.cjs.map +1 -1
  8. package/dist/core/headers/coreHeadersFeature.utils.js.map +1 -1
  9. package/dist/core/row-models/createCoreRowModel.cjs.map +1 -1
  10. package/dist/core/row-models/createCoreRowModel.js.map +1 -1
  11. package/dist/core/rows/constructRow.cjs.map +1 -1
  12. package/dist/core/rows/constructRow.js.map +1 -1
  13. package/dist/core/table/constructTable.cjs.map +1 -1
  14. package/dist/core/table/constructTable.js.map +1 -1
  15. package/dist/core/table/coreTablesFeature.utils.cjs.map +1 -1
  16. package/dist/core/table/coreTablesFeature.utils.js.map +1 -1
  17. package/dist/features/column-faceting/createFacetedMinMaxValues.cjs.map +1 -1
  18. package/dist/features/column-faceting/createFacetedMinMaxValues.js.map +1 -1
  19. package/dist/features/column-faceting/createFacetedRowModel.cjs.map +1 -1
  20. package/dist/features/column-faceting/createFacetedRowModel.js.map +1 -1
  21. package/dist/features/column-faceting/createFacetedUniqueValues.cjs.map +1 -1
  22. package/dist/features/column-faceting/createFacetedUniqueValues.js.map +1 -1
  23. package/dist/features/column-filtering/columnFilteringFeature.utils.cjs.map +1 -1
  24. package/dist/features/column-filtering/columnFilteringFeature.utils.js.map +1 -1
  25. package/dist/features/column-filtering/createFilteredRowModel.cjs.map +1 -1
  26. package/dist/features/column-filtering/createFilteredRowModel.js.map +1 -1
  27. package/dist/features/column-filtering/filterRowsUtils.cjs.map +1 -1
  28. package/dist/features/column-filtering/filterRowsUtils.js.map +1 -1
  29. package/dist/features/column-grouping/columnGroupingFeature.utils.cjs.map +1 -1
  30. package/dist/features/column-grouping/columnGroupingFeature.utils.js.map +1 -1
  31. package/dist/features/column-grouping/createGroupedRowModel.cjs.map +1 -1
  32. package/dist/features/column-grouping/createGroupedRowModel.js.map +1 -1
  33. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs.map +1 -1
  34. package/dist/features/column-ordering/columnOrderingFeature.utils.js.map +1 -1
  35. package/dist/features/column-pinning/columnPinningFeature.utils.cjs.map +1 -1
  36. package/dist/features/column-pinning/columnPinningFeature.utils.js.map +1 -1
  37. package/dist/features/column-sizing/columnSizingFeature.utils.cjs.map +1 -1
  38. package/dist/features/column-sizing/columnSizingFeature.utils.js.map +1 -1
  39. package/dist/features/global-filtering/globalFilteringFeature.utils.cjs.map +1 -1
  40. package/dist/features/global-filtering/globalFilteringFeature.utils.js.map +1 -1
  41. package/dist/features/row-expanding/createExpandedRowModel.cjs.map +1 -1
  42. package/dist/features/row-expanding/createExpandedRowModel.js.map +1 -1
  43. package/dist/features/row-expanding/rowExpandingFeature.utils.cjs.map +1 -1
  44. package/dist/features/row-expanding/rowExpandingFeature.utils.js.map +1 -1
  45. package/dist/features/row-pagination/createPaginatedRowModel.cjs.map +1 -1
  46. package/dist/features/row-pagination/createPaginatedRowModel.js.map +1 -1
  47. package/dist/features/row-pagination/rowPaginationFeature.utils.cjs.map +1 -1
  48. package/dist/features/row-pagination/rowPaginationFeature.utils.js.map +1 -1
  49. package/dist/features/row-pinning/rowPinningFeature.utils.cjs.map +1 -1
  50. package/dist/features/row-pinning/rowPinningFeature.utils.js.map +1 -1
  51. package/dist/features/row-selection/rowSelectionFeature.utils.cjs.map +1 -1
  52. package/dist/features/row-selection/rowSelectionFeature.utils.js.map +1 -1
  53. package/dist/features/row-sorting/createSortedRowModel.cjs.map +1 -1
  54. package/dist/features/row-sorting/createSortedRowModel.js.map +1 -1
  55. package/dist/features/row-sorting/rowSortingFeature.utils.cjs.map +1 -1
  56. package/dist/features/row-sorting/rowSortingFeature.utils.js.map +1 -1
  57. package/dist/fns/filterFns.cjs.map +1 -1
  58. package/dist/fns/filterFns.js.map +1 -1
  59. package/dist/utils.cjs.map +1 -1
  60. package/dist/utils.js.map +1 -1
  61. package/package.json +1 -1
  62. package/src/core/columns/coreColumnsFeature.utils.ts +1 -1
  63. package/src/core/row-models/createCoreRowModel.ts +1 -1
  64. package/src/core/rows/constructRow.ts +1 -1
  65. package/src/core/table/constructTable.ts +2 -4
  66. package/src/features/column-faceting/createFacetedMinMaxValues.ts +1 -1
  67. package/src/features/column-faceting/createFacetedRowModel.ts +1 -1
  68. package/src/features/column-faceting/createFacetedUniqueValues.ts +1 -1
  69. package/src/features/column-filtering/columnFilteringFeature.utils.ts +5 -10
  70. package/src/features/column-filtering/createFilteredRowModel.ts +1 -1
  71. package/src/features/column-grouping/columnGroupingFeature.utils.ts +4 -4
  72. package/src/features/column-grouping/createGroupedRowModel.ts +1 -1
  73. package/src/features/global-filtering/globalFilteringFeature.utils.ts +2 -3
  74. package/src/features/row-expanding/createExpandedRowModel.ts +1 -1
  75. package/src/features/row-expanding/rowExpandingFeature.utils.ts +1 -1
  76. package/src/features/row-pagination/createPaginatedRowModel.ts +1 -1
  77. package/src/features/row-selection/rowSelectionFeature.utils.ts +2 -4
  78. package/src/features/row-sorting/createSortedRowModel.ts +3 -4
  79. package/src/features/row-sorting/rowSortingFeature.utils.ts +4 -6
@@ -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'\nimport type { FilterFn } from '../features/column-filtering/columnFilteringFeature.types'\n\n// Basic filters\n\n/**\n * Filter function for checking if a value is exactly equal to a given value. (JS === comparison)\n */\nexport const filterFn_equals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) === filterValue\n}\n\nfilterFn_equals.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a value is weakly equal to a given value. (JS == comparison)\n */\nexport const filterFn_weakEquals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) == filterValue\n}\n\nfilterFn_weakEquals.autoRemove = (val: any) => testFalsy(val)\n\n// String filters\n\n/**\n * Filter function for checking if a string includes a given substring. (Case-sensitive)\n */\nexport const filterFn_includesStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(filterValue.toString()),\n )\n}\n\nfilterFn_includesStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string includes a given substring. (Non-case-sensitive)\n */\nexport const filterFn_includesString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(filterValue.toString().toLowerCase()),\n )\n}\n\nfilterFn_includesString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Non-case-sensitive)\n */\nexport const filterFn_equalsString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n filterValue.toLowerCase()\n )\n}\n\nfilterFn_equalsString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Case-sensitive)\n */\nexport const filterFn_equalsStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return row.getValue(columnId)?.toString() === filterValue\n}\n\nfilterFn_equalsStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n// Number filters\n\n/**\n * Filter function for checking if a number is greater than a given number.\n */\nexport const filterFn_greaterThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = +filterValue\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = filterValue.toString().toLowerCase().trim()\n return stringValue > stringFilterValue\n}\n\nfilterFn_greaterThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is greater than or equal to a given number.\n */\nexport const filterFn_greaterThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return (\n filterFn_greaterThan(row as any, columnId, filterValue) ||\n filterFn_equals(row as any, columnId, filterValue)\n )\n}\n\nfilterFn_greaterThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than a given number.\n */\nexport const filterFn_lessThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThanOrEqualTo(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than or equal to a given number.\n */\nexport const filterFn_lessThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThan(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n// Range filters\n\n/**\n * Filter function for checking if a number or a string is between two given values.\n */\nconst filterFn_between: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThan(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThan(row as any, columnId, filterValues[1]))\n\nfilterFn_between.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number or a string is between two given values or equal to them.\n */\nconst filterFn_betweenInclusive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThanOrEqualTo(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThanOrEqualTo(row as any, columnId, filterValues[1]))\n\nfilterFn_betweenInclusive.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number is within a given range.\n */\nexport const filterFn_inNumberRange: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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\nfilterFn_inNumberRange.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 = 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\nfilterFn_inNumberRange.autoRemove = (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1]))\n\n// Array filters\n\n/**\n * Filter function for checking if an array has a given value.\n */\nexport const filterFn_arrHas: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) => row.getValue<unknown>(columnId) === val)\n}\n\n/**\n * Filter function for checking if an array includes a given value.\n */\nexport const filterFn_arrIncludes: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) =>\n (row.getValue<unknown>(columnId) as Array<unknown> | string).includes(\n val as any,\n ),\n )\n}\n\nfilterFn_arrIncludes.autoRemove = (val: any) => testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes all of the given values.\n */\nexport const filterFn_arrIncludesAll: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return !filterValue.some((val) => !value.includes(val))\n}\n\nfilterFn_arrIncludesAll.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes any of the given values.\n */\nexport const filterFn_arrIncludesSome: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return filterValue.some((val) => value.includes(val))\n}\n\nfilterFn_arrIncludesSome.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n// Export\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'\nimport type { FilterFn } from '../features/column-filtering/columnFilteringFeature.types'\n\n// Basic filters\n\n/**\n * Filter function for checking if a value is exactly equal to a given value. (JS === comparison)\n */\nexport const filterFn_equals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) === filterValue\n}\n\nfilterFn_equals.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a value is weakly equal to a given value. (JS == comparison)\n */\nexport const filterFn_weakEquals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) == filterValue\n}\n\nfilterFn_weakEquals.autoRemove = (val: any) => testFalsy(val)\n\n// String filters\n\n/**\n * Filter function for checking if a string includes a given substring. (Case-sensitive)\n */\nexport const filterFn_includesStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(filterValue.toString()),\n )\n}\n\nfilterFn_includesStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string includes a given substring. (Non-case-sensitive)\n */\nexport const filterFn_includesString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(filterValue.toString().toLowerCase()),\n )\n}\n\nfilterFn_includesString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Non-case-sensitive)\n */\nexport const filterFn_equalsString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n filterValue.toLowerCase()\n )\n}\n\nfilterFn_equalsString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Case-sensitive)\n */\nexport const filterFn_equalsStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return row.getValue(columnId)?.toString() === filterValue\n}\n\nfilterFn_equalsStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n// Number filters\n\n/**\n * Filter function for checking if a number is greater than a given number.\n */\nexport const filterFn_greaterThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = +filterValue\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = filterValue.toString().toLowerCase().trim()\n return stringValue > stringFilterValue\n}\n\nfilterFn_greaterThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is greater than or equal to a given number.\n */\nexport const filterFn_greaterThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return (\n filterFn_greaterThan(row as any, columnId, filterValue) ||\n filterFn_equals(row as any, columnId, filterValue)\n )\n}\n\nfilterFn_greaterThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than a given number.\n */\nexport const filterFn_lessThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThanOrEqualTo(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than or equal to a given number.\n */\nexport const filterFn_lessThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThan(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n// Range filters\n\n/**\n * Filter function for checking if a number or a string is between two given values.\n */\nconst filterFn_between: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThan(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThan(row as any, columnId, filterValues[1]))\n\nfilterFn_between.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number or a string is between two given values or equal to them.\n */\nconst filterFn_betweenInclusive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThanOrEqualTo(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThanOrEqualTo(row as any, columnId, filterValues[1]))\n\nfilterFn_betweenInclusive.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number is within a given range.\n */\nexport const filterFn_inNumberRange: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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\nfilterFn_inNumberRange.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 = 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\nfilterFn_inNumberRange.autoRemove = (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1]))\n\n// Array filters\n\n/**\n * Filter function for checking if an array has a given value.\n */\nexport const filterFn_arrHas: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) => row.getValue<unknown>(columnId) === val)\n}\n\n/**\n * Filter function for checking if an array includes a given value.\n */\nexport const filterFn_arrIncludes: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) =>\n (row.getValue<unknown>(columnId) as Array<unknown> | string).includes(\n val as any,\n ),\n )\n}\n\nfilterFn_arrIncludes.autoRemove = (val: any) => testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes all of the given values.\n */\nexport const filterFn_arrIncludesAll: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return !filterValue.some((val) => !value.includes(val))\n}\n\nfilterFn_arrIncludesAll.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes any of the given values.\n */\nexport const filterFn_arrIncludesSome: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return filterValue.some((val) => value.includes(val))\n}\n\nfilterFn_arrIncludesSome.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n// Export\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":";;;;;AAUA,MAAa,mBAIX,KACA,UACA,gBACG;AACH,QAAO,IAAI,SAAS,SAAS,KAAK;;AAGpC,gBAAgB,cAAc,QAAa,UAAU,IAAI;;;;AAKzD,MAAa,uBAIX,KACA,UACA,gBACG;AACH,QAAO,IAAI,SAAS,SAAS,IAAI;;AAGnC,oBAAoB,cAAc,QAAa,UAAU,IAAI;;;;AAO7D,MAAa,oCAIX,KACA,UACA,gBACG;;AACH,QAAO,yBACL,IAAI,SAAS,SAAS,gEAAE,UAAU,CAAC,SAAS,YAAY,UAAU,CAAC,CACpE;;AAGH,iCAAiC,cAAc,QAAa,UAAU,IAAI;;;;AAK1E,MAAa,2BAIX,KACA,UACA,gBACG;;AACH,QAAO,0BACL,IACG,SAAS,SAAS,kEACjB,UAAU,CACX,aAAa,CACb,SAAS,YAAY,UAAU,CAAC,aAAa,CAAC,CAClD;;AAGH,wBAAwB,cAAc,QAAa,UAAU,IAAI;;;;AAKjE,MAAa,yBAIX,KACA,UACA,gBACG;;AACH,2BACE,IAAI,SAAS,SAAS,kEAAE,UAAU,CAAC,aAAa,MAChD,YAAY,aAAa;;AAI7B,sBAAsB,cAAc,QAAa,UAAU,IAAI;;;;AAK/D,MAAa,kCAIX,KACA,UACA,gBACG;;AACH,2BAAO,IAAI,SAAS,SAAS,kEAAE,UAAU,MAAK;;AAGhD,+BAA+B,cAAc,QAAa,UAAU,IAAI;;;;AAOxE,MAAa,wBAIX,KACA,UACA,gBACG;CACH,MAAM,WAAW,IAAI,SAAS,SAAS;CACvC,MAAM,kBACJ,aAAa,QAAQ,aAAa,SAAY,IAAI,CAAC;CACrD,MAAM,qBAAqB,CAAC;AAE5B,KAAI,CAAC,MAAM,mBAAmB,IAAI,CAAC,MAAM,gBAAgB,CACvD,QAAO,kBAAkB;AAK3B,SAFqB,YAAY,IAAI,UAAU,CAAC,aAAa,CAAC,MAE5C,GADQ,YAAY,UAAU,CAAC,aAAa,CAAC,MACzB;;AAGxC,qBAAqB,sBAAsB,QAAa,UAAU,IAAI;;;;AAKtE,MAAa,iCAIX,KACA,UACA,gBACG;AACH,QACE,qBAAqB,KAAY,UAAU,YAAY,IACvD,gBAAgB,KAAY,UAAU,YAAY;;AAItD,8BAA8B,sBAAsB,QAAa,UAAU,IAAI;;;;AAK/E,MAAa,qBAIX,KACA,UACA,gBACG;AACH,QAAO,CAAC,8BAA8B,KAAY,UAAU,YAAY;;AAG1E,kBAAkB,sBAAsB,QAAa,UAAU,IAAI;;;;AAKnE,MAAa,8BAIX,KACA,UACA,gBACG;AACH,QAAO,CAAC,qBAAqB,KAAY,UAAU,YAAY;;AAGjE,2BAA2B,sBAAsB,QAAa,UAAU,IAAI;;;;AAO5E,MAAM,oBAIJ,KACA,UACA,kBAEE,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACxD,qBAAqB,KAAY,UAAU,aAAa,GAAG,MAC3D,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,aAAa,KAAK,CAAC,aAAa,MAChC,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACzD,kBAAkB,KAAY,UAAU,aAAa,GAAG;AAE5D,iBAAiB,cAAc,QAAa,CAAC;;;;AAK7C,MAAM,6BAIJ,KACA,UACA,kBAEE,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACxD,8BAA8B,KAAY,UAAU,aAAa,GAAG,MACpE,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,aAAa,KAAK,CAAC,aAAa,MAChC,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACzD,2BAA2B,KAAY,UAAU,aAAa,GAAG;AAErE,0BAA0B,cAAc,QAAa,CAAC;;;;AAKtD,MAAa,0BAIX,KACA,UACA,gBACG;CACH,MAAM,CAAC,KAAK,OAAO;CAEnB,MAAM,WAAmB,IAAI,SAAS,SAAS;AAC/C,QAAO,YAAY,OAAO,YAAY;;AAGxC,uBAAuB,sBAAsB,QAAoB;CAC/D,MAAM,CAAC,WAAW,aAAa;CAE/B,MAAM,YACJ,OAAO,cAAc,WAAW,WAAW,UAAU,GAAG;CAC1D,MAAM,YACJ,OAAO,cAAc,WAAW,WAAW,UAAU,GAAG;CAE1D,IAAI,MACF,cAAc,QAAQ,OAAO,MAAM,UAAU,GAAG,YAAY;CAC9D,IAAI,MAAM,cAAc,QAAQ,OAAO,MAAM,UAAU,GAAG,WAAW;AAErE,KAAI,MAAM,KAAK;EACb,MAAM,OAAO;AACb,QAAM;AACN,QAAM;;AAGR,QAAO,CAAC,KAAK,IAAI;;AAGnB,uBAAuB,cAAc,QACnC,UAAU,IAAI,IAAK,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG;;;;AAO3D,MAAa,mBAIX,KACA,UACA,gBACG;AACH,QAAO,YAAY,MAAM,QAAQ,IAAI,SAAkB,SAAS,KAAK,IAAI;;;;;AAM3E,MAAa,wBAIX,KACA,UACA,gBACG;AACH,QAAO,YAAY,MAAM,QACtB,IAAI,SAAkB,SAAS,CAA6B,SAC3D,IACD,CACF;;AAGH,qBAAqB,cAAc,QAAa,UAAU,IAAI,IAAI,4CAAC,IAAK;;;;AAKxE,MAAa,2BAIX,KACA,UACA,gBACG;CACH,MAAM,QAAQ,IAAI,SAAyB,SAAS;AACpD,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO;AAClC,QAAO,CAAC,YAAY,MAAM,QAAQ,CAAC,MAAM,SAAS,IAAI,CAAC;;AAGzD,wBAAwB,cAAc,QACpC,UAAU,IAAI,IAAI,4CAAC,IAAK;;;;AAK1B,MAAa,4BAIX,KACA,UACA,gBACG;CACH,MAAM,QAAQ,IAAI,SAAyB,SAAS;AACpD,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO;AAClC,QAAO,YAAY,MAAM,QAAQ,MAAM,SAAS,IAAI,CAAC;;AAGvD,yBAAyB,cAAc,QACrC,UAAU,IAAI,IAAI,4CAAC,IAAK;AAI1B,MAAa,YAAY;CACvB,aAAa;CACb,gBAAgB;CAChB,QAAQ;CACR,iBAAiB;CACjB,SAAS;CACT,kBAAkB;CAClB,QAAQ;CACR,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,yBAAyB;CACzB,YAAY;CACb;AAMD,SAAS,UAAU,KAAU;AAC3B,QAAO,QAAQ,UAAa,QAAQ,QAAQ,QAAQ"}
@@ -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'\nimport type { FilterFn } from '../features/column-filtering/columnFilteringFeature.types'\n\n// Basic filters\n\n/**\n * Filter function for checking if a value is exactly equal to a given value. (JS === comparison)\n */\nexport const filterFn_equals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) === filterValue\n}\n\nfilterFn_equals.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a value is weakly equal to a given value. (JS == comparison)\n */\nexport const filterFn_weakEquals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) == filterValue\n}\n\nfilterFn_weakEquals.autoRemove = (val: any) => testFalsy(val)\n\n// String filters\n\n/**\n * Filter function for checking if a string includes a given substring. (Case-sensitive)\n */\nexport const filterFn_includesStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(filterValue.toString()),\n )\n}\n\nfilterFn_includesStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string includes a given substring. (Non-case-sensitive)\n */\nexport const filterFn_includesString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(filterValue.toString().toLowerCase()),\n )\n}\n\nfilterFn_includesString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Non-case-sensitive)\n */\nexport const filterFn_equalsString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n filterValue.toLowerCase()\n )\n}\n\nfilterFn_equalsString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Case-sensitive)\n */\nexport const filterFn_equalsStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return row.getValue(columnId)?.toString() === filterValue\n}\n\nfilterFn_equalsStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n// Number filters\n\n/**\n * Filter function for checking if a number is greater than a given number.\n */\nexport const filterFn_greaterThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = +filterValue\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = filterValue.toString().toLowerCase().trim()\n return stringValue > stringFilterValue\n}\n\nfilterFn_greaterThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is greater than or equal to a given number.\n */\nexport const filterFn_greaterThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return (\n filterFn_greaterThan(row as any, columnId, filterValue) ||\n filterFn_equals(row as any, columnId, filterValue)\n )\n}\n\nfilterFn_greaterThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than a given number.\n */\nexport const filterFn_lessThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThanOrEqualTo(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than or equal to a given number.\n */\nexport const filterFn_lessThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThan(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n// Range filters\n\n/**\n * Filter function for checking if a number or a string is between two given values.\n */\nconst filterFn_between: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThan(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThan(row as any, columnId, filterValues[1]))\n\nfilterFn_between.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number or a string is between two given values or equal to them.\n */\nconst filterFn_betweenInclusive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThanOrEqualTo(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThanOrEqualTo(row as any, columnId, filterValues[1]))\n\nfilterFn_betweenInclusive.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number is within a given range.\n */\nexport const filterFn_inNumberRange: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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\nfilterFn_inNumberRange.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 = 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\nfilterFn_inNumberRange.autoRemove = (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1]))\n\n// Array filters\n\n/**\n * Filter function for checking if an array has a given value.\n */\nexport const filterFn_arrHas: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) => row.getValue<unknown>(columnId) === val)\n}\n\n/**\n * Filter function for checking if an array includes a given value.\n */\nexport const filterFn_arrIncludes: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) =>\n (row.getValue<unknown>(columnId) as Array<unknown> | string).includes(\n val as any,\n ),\n )\n}\n\nfilterFn_arrIncludes.autoRemove = (val: any) => testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes all of the given values.\n */\nexport const filterFn_arrIncludesAll: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return !filterValue.some((val) => !value.includes(val))\n}\n\nfilterFn_arrIncludesAll.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes any of the given values.\n */\nexport const filterFn_arrIncludesSome: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return filterValue.some((val) => value.includes(val))\n}\n\nfilterFn_arrIncludesSome.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n// Export\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":";;;;AAUA,MAAa,mBAIX,KACA,UACA,gBACG;AACH,QAAO,IAAI,SAAS,SAAS,KAAK;;AAGpC,gBAAgB,cAAc,QAAa,UAAU,IAAI;;;;AAKzD,MAAa,uBAIX,KACA,UACA,gBACG;AACH,QAAO,IAAI,SAAS,SAAS,IAAI;;AAGnC,oBAAoB,cAAc,QAAa,UAAU,IAAI;;;;AAO7D,MAAa,oCAIX,KACA,UACA,gBACG;;AACH,QAAO,yBACL,IAAI,SAAS,SAAS,gEAAE,UAAU,CAAC,SAAS,YAAY,UAAU,CAAC,CACpE;;AAGH,iCAAiC,cAAc,QAAa,UAAU,IAAI;;;;AAK1E,MAAa,2BAIX,KACA,UACA,gBACG;;AACH,QAAO,0BACL,IACG,SAAS,SAAS,kEACjB,UAAU,CACX,aAAa,CACb,SAAS,YAAY,UAAU,CAAC,aAAa,CAAC,CAClD;;AAGH,wBAAwB,cAAc,QAAa,UAAU,IAAI;;;;AAKjE,MAAa,yBAIX,KACA,UACA,gBACG;;AACH,2BACE,IAAI,SAAS,SAAS,kEAAE,UAAU,CAAC,aAAa,MAChD,YAAY,aAAa;;AAI7B,sBAAsB,cAAc,QAAa,UAAU,IAAI;;;;AAK/D,MAAa,kCAIX,KACA,UACA,gBACG;;AACH,2BAAO,IAAI,SAAS,SAAS,kEAAE,UAAU,MAAK;;AAGhD,+BAA+B,cAAc,QAAa,UAAU,IAAI;;;;AAOxE,MAAa,wBAIX,KACA,UACA,gBACG;CACH,MAAM,WAAW,IAAI,SAAS,SAAS;CACvC,MAAM,kBACJ,aAAa,QAAQ,aAAa,SAAY,IAAI,CAAC;CACrD,MAAM,qBAAqB,CAAC;AAE5B,KAAI,CAAC,MAAM,mBAAmB,IAAI,CAAC,MAAM,gBAAgB,CACvD,QAAO,kBAAkB;AAK3B,SAFqB,YAAY,IAAI,UAAU,CAAC,aAAa,CAAC,MAAM,GAC1C,YAAY,UAAU,CAAC,aAAa,CAAC,MAAM;;AAIvE,qBAAqB,sBAAsB,QAAa,UAAU,IAAI;;;;AAKtE,MAAa,iCAIX,KACA,UACA,gBACG;AACH,QACE,qBAAqB,KAAY,UAAU,YAAY,IACvD,gBAAgB,KAAY,UAAU,YAAY;;AAItD,8BAA8B,sBAAsB,QAAa,UAAU,IAAI;;;;AAK/E,MAAa,qBAIX,KACA,UACA,gBACG;AACH,QAAO,CAAC,8BAA8B,KAAY,UAAU,YAAY;;AAG1E,kBAAkB,sBAAsB,QAAa,UAAU,IAAI;;;;AAKnE,MAAa,8BAIX,KACA,UACA,gBACG;AACH,QAAO,CAAC,qBAAqB,KAAY,UAAU,YAAY;;AAGjE,2BAA2B,sBAAsB,QAAa,UAAU,IAAI;;;;AAO5E,MAAM,oBAIJ,KACA,UACA,kBAEE,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACxD,qBAAqB,KAAY,UAAU,aAAa,GAAG,MAC3D,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,aAAa,KAAK,CAAC,aAAa,MAChC,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACzD,kBAAkB,KAAY,UAAU,aAAa,GAAG;AAE5D,iBAAiB,cAAc,QAAa,CAAC;;;;AAK7C,MAAM,6BAIJ,KACA,UACA,kBAEE,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACxD,8BAA8B,KAAY,UAAU,aAAa,GAAG,MACpE,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,MAAM,CAAC,aAAa,GAAG,IACxB,CAAC,aAAa,KAAK,CAAC,aAAa,MAChC,CAAC,IAAI,OAAU,CAAgB,SAAS,aAAa,GAAG,IACzD,2BAA2B,KAAY,UAAU,aAAa,GAAG;AAErE,0BAA0B,cAAc,QAAa,CAAC;;;;AAKtD,MAAa,0BAIX,KACA,UACA,gBACG;CACH,MAAM,CAAC,KAAK,OAAO;CAEnB,MAAM,WAAmB,IAAI,SAAS,SAAS;AAC/C,QAAO,YAAY,OAAO,YAAY;;AAGxC,uBAAuB,sBAAsB,QAAoB;CAC/D,MAAM,CAAC,WAAW,aAAa;CAE/B,MAAM,YACJ,OAAO,cAAc,WAAW,WAAW,UAAU,GAAG;CAC1D,MAAM,YACJ,OAAO,cAAc,WAAW,WAAW,UAAU,GAAG;CAE1D,IAAI,MACF,cAAc,QAAQ,OAAO,MAAM,UAAU,GAAG,YAAY;CAC9D,IAAI,MAAM,cAAc,QAAQ,OAAO,MAAM,UAAU,GAAG,WAAW;AAErE,KAAI,MAAM,KAAK;EACb,MAAM,OAAO;AACb,QAAM;AACN,QAAM;;AAGR,QAAO,CAAC,KAAK,IAAI;;AAGnB,uBAAuB,cAAc,QACnC,UAAU,IAAI,IAAK,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG;;;;AAO3D,MAAa,mBAIX,KACA,UACA,gBACG;AACH,QAAO,YAAY,MAAM,QAAQ,IAAI,SAAkB,SAAS,KAAK,IAAI;;;;;AAM3E,MAAa,wBAIX,KACA,UACA,gBACG;AACH,QAAO,YAAY,MAAM,QACtB,IAAI,SAAkB,SAAS,CAA6B,SAC3D,IACD,CACF;;AAGH,qBAAqB,cAAc,QAAa,UAAU,IAAI,IAAI,4CAAC,IAAK;;;;AAKxE,MAAa,2BAIX,KACA,UACA,gBACG;CACH,MAAM,QAAQ,IAAI,SAAyB,SAAS;AACpD,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO;AAClC,QAAO,CAAC,YAAY,MAAM,QAAQ,CAAC,MAAM,SAAS,IAAI,CAAC;;AAGzD,wBAAwB,cAAc,QACpC,UAAU,IAAI,IAAI,4CAAC,IAAK;;;;AAK1B,MAAa,4BAIX,KACA,UACA,gBACG;CACH,MAAM,QAAQ,IAAI,SAAyB,SAAS;AACpD,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO;AAClC,QAAO,YAAY,MAAM,QAAQ,MAAM,SAAS,IAAI,CAAC;;AAGvD,yBAAyB,cAAc,QACrC,UAAU,IAAI,IAAI,4CAAC,IAAK;AAI1B,MAAa,YAAY;CACvB,aAAa;CACb,gBAAgB;CAChB,QAAQ;CACR,iBAAiB;CACjB,SAAS;CACT,kBAAkB;CAClB,QAAQ;CACR,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,yBAAyB;CACzB,YAAY;CACb;AAMD,SAAS,UAAU,KAAU;AAC3B,QAAO,QAAQ,UAAa,QAAQ,QAAQ,QAAQ"}
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'\nimport type { FilterFn } from '../features/column-filtering/columnFilteringFeature.types'\n\n// Basic filters\n\n/**\n * Filter function for checking if a value is exactly equal to a given value. (JS === comparison)\n */\nexport const filterFn_equals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) === filterValue\n}\n\nfilterFn_equals.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a value is weakly equal to a given value. (JS == comparison)\n */\nexport const filterFn_weakEquals: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: unknown,\n) => {\n return row.getValue(columnId) == filterValue\n}\n\nfilterFn_weakEquals.autoRemove = (val: any) => testFalsy(val)\n\n// String filters\n\n/**\n * Filter function for checking if a string includes a given substring. (Case-sensitive)\n */\nexport const filterFn_includesStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row.getValue(columnId)?.toString().includes(filterValue.toString()),\n )\n}\n\nfilterFn_includesStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string includes a given substring. (Non-case-sensitive)\n */\nexport const filterFn_includesString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n .toLowerCase()\n .includes(filterValue.toString().toLowerCase()),\n )\n}\n\nfilterFn_includesString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Non-case-sensitive)\n */\nexport const filterFn_equalsString: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return (\n row.getValue(columnId)?.toString().toLowerCase() ===\n filterValue.toLowerCase()\n )\n}\n\nfilterFn_equalsString.autoRemove = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a string is exactly equal to a given string. (Case-sensitive)\n */\nexport const filterFn_equalsStringSensitive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: string,\n) => {\n return row.getValue(columnId)?.toString() === filterValue\n}\n\nfilterFn_equalsStringSensitive.autoRemove = (val: any) => testFalsy(val)\n\n// Number filters\n\n/**\n * Filter function for checking if a number is greater than a given number.\n */\nexport const filterFn_greaterThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n const rowValue = row.getValue(columnId)\n const numericRowValue =\n rowValue === null || rowValue === undefined ? 0 : +rowValue\n const numericFilterValue = +filterValue\n\n if (!isNaN(numericFilterValue) && !isNaN(numericRowValue)) {\n return numericRowValue > numericFilterValue\n }\n\n const stringValue = (rowValue ?? '').toString().toLowerCase().trim()\n const stringFilterValue = filterValue.toString().toLowerCase().trim()\n return stringValue > stringFilterValue\n}\n\nfilterFn_greaterThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is greater than or equal to a given number.\n */\nexport const filterFn_greaterThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return (\n filterFn_greaterThan(row as any, columnId, filterValue) ||\n filterFn_equals(row as any, columnId, filterValue)\n )\n}\n\nfilterFn_greaterThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than a given number.\n */\nexport const filterFn_lessThan: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThanOrEqualTo(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThan.resolveFilterValue = (val: any) => testFalsy(val)\n\n/**\n * Filter function for checking if a number is less than or equal to a given number.\n */\nexport const filterFn_lessThanOrEqualTo: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Date | number | string,\n) => {\n return !filterFn_greaterThan(row as any, columnId, filterValue)\n}\n\nfilterFn_lessThanOrEqualTo.resolveFilterValue = (val: any) => testFalsy(val)\n\n// Range filters\n\n/**\n * Filter function for checking if a number or a string is between two given values.\n */\nconst filterFn_between: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThan(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThan(row as any, columnId, filterValues[1]))\n\nfilterFn_between.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number or a string is between two given values or equal to them.\n */\nconst filterFn_betweenInclusive: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValues: [number | string, number | string],\n): boolean =>\n ((['', undefined] as Array<any>).includes(filterValues[0]) ||\n filterFn_greaterThanOrEqualTo(row as any, columnId, filterValues[0])) &&\n ((!isNaN(+filterValues[0]) &&\n !isNaN(+filterValues[1]) &&\n +filterValues[0] > +filterValues[1]) ||\n (['', undefined] as Array<any>).includes(filterValues[1]) ||\n filterFn_lessThanOrEqualTo(row as any, columnId, filterValues[1]))\n\nfilterFn_betweenInclusive.autoRemove = (val: any) => !val\n\n/**\n * Filter function for checking if a number is within a given range.\n */\nexport const filterFn_inNumberRange: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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\nfilterFn_inNumberRange.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 = 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\nfilterFn_inNumberRange.autoRemove = (val: any) =>\n testFalsy(val) || (testFalsy(val[0]) && testFalsy(val[1]))\n\n// Array filters\n\n/**\n * Filter function for checking if an array has a given value.\n */\nexport const filterFn_arrHas: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) => row.getValue<unknown>(columnId) === val)\n}\n\n/**\n * Filter function for checking if an array includes a given value.\n */\nexport const filterFn_arrIncludes: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n row: Row<TFeatures, TData>,\n columnId: string,\n filterValue: Array<unknown>,\n) => {\n return filterValue.some((val) =>\n (row.getValue<unknown>(columnId) as Array<unknown> | string).includes(\n val as any,\n ),\n )\n}\n\nfilterFn_arrIncludes.autoRemove = (val: any) => testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes all of the given values.\n */\nexport const filterFn_arrIncludesAll: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return !filterValue.some((val) => !value.includes(val))\n}\n\nfilterFn_arrIncludesAll.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n/**\n * Filter function for checking if an array includes any of the given values.\n */\nexport const filterFn_arrIncludesSome: FilterFn<any, any> = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\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 return filterValue.some((val) => value.includes(val))\n}\n\nfilterFn_arrIncludesSome.autoRemove = (val: any) =>\n testFalsy(val) || !val?.length\n\n// Export\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 +1 @@
1
- {"version":3,"file":"utils.cjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { Table, Table_Internal } from './types/Table'\nimport type { NoInfer, RowData, Updater } from './types/type-utils'\nimport type { TableFeatures } from './types/TableFeatures'\nimport type { TableState, TableState_All } from './types/TableState'\n\nexport function functionalUpdate<T>(updater: Updater<T>, input: T): T {\n return typeof updater === 'function'\n ? (updater as (i: T) => T)(input)\n : updater\n}\n\nexport function cloneState<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(cloneState) as T\n }\n\n if (value && typeof value === 'object') {\n const proto = Object.getPrototypeOf(value)\n\n if (proto !== Object.prototype && proto !== null) {\n return value\n }\n\n const copy: Record<string, unknown> = {}\n\n for (const key of Object.keys(value)) {\n copy[key] = cloneState((value as Record<string, unknown>)[key])\n }\n\n return copy as T\n }\n\n return value\n}\n\nexport function noop() {}\n\nexport function makeStateUpdater<\n TFeatures extends TableFeatures,\n K extends (string & {}) | keyof TableState_All | keyof TableState<TFeatures>,\n>(key: K, instance: Table<TFeatures, any>) {\n return (updater: Updater<TableState<any>[K & keyof TableState<any>]>) => {\n const externalAtom = (instance.options as any).atoms?.[key]\n const targetAtom = externalAtom ?? (instance.baseAtoms as any)[key]\n targetAtom.set((old: any) => functionalUpdate(updater, old))\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\nexport function isFunction<T extends AnyFunction>(d: any): d is T {\n return d instanceof Function\n}\n\nexport function isNumberArray(d: any): d is Array<number> {\n return Array.isArray(d) && d.every((val) => typeof val === 'number')\n}\n\nexport function flattenBy<TNode>(\n arr: Array<TNode>,\n getChildren: (item: TNode) => Array<TNode>,\n) {\n const flat: Array<TNode> = []\n\n const recurse = (subArr: Array<TNode>) => {\n subArr.forEach((item) => {\n flat.push(item)\n const children = getChildren(item)\n if (children.length) {\n recurse(children)\n }\n })\n }\n\n recurse(arr)\n\n return flat\n}\n\nexport const $internalMemoFnMeta = Symbol('memoFnMeta')\nexport type MemoFnMeta = { originalArgsLength?: number }\n\n/**\n * @internal\n */\nfunction setMemoFnMeta(fn: Function, meta: MemoFnMeta) {\n Object.defineProperty(fn, $internalMemoFnMeta, { value: meta })\n}\n\n/**\n * @internal\n */\nexport function getMemoFnMeta(fn: any): MemoFnMeta | null {\n return (typeof fn === 'function' && fn[$internalMemoFnMeta]) ?? null\n}\n\ninterface MemoOptions<TDeps extends ReadonlyArray<any>, TDepArgs, TResult> {\n fn: (...args: NoInfer<TDeps>) => TResult\n memoDeps?: (depArgs?: TDepArgs) => [...TDeps] | undefined\n onAfterCompare?: (depsChanged: boolean) => void\n onAfterUpdate?: (result: TResult) => void\n onBeforeCompare?: () => void\n onBeforeUpdate?: () => void\n}\n\nexport const memo = <TDeps extends ReadonlyArray<any>, TDepArgs, TResult>({\n fn,\n memoDeps,\n onAfterCompare,\n onAfterUpdate,\n onBeforeCompare,\n onBeforeUpdate,\n}: MemoOptions<TDeps, TDepArgs, TResult>): ((\n depArgs?: TDepArgs,\n) => TResult) => {\n let deps: Array<any> | undefined = []\n let result: TResult | undefined\n\n const memoizedFn = (depArgs?: TDepArgs): TResult => {\n onBeforeCompare?.()\n const newDeps = memoDeps?.(depArgs)\n const depsChanged =\n !newDeps ||\n newDeps.length !== deps?.length ||\n newDeps.some((dep: any, index: number) => deps?.[index] !== dep)\n onAfterCompare?.(depsChanged)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n onBeforeUpdate?.()\n result = fn(...(newDeps ?? ([] as any)))\n onAfterUpdate?.(result)\n\n return result\n }\n\n setMemoFnMeta(memoizedFn, { originalArgsLength: fn.length })\n\n return memoizedFn\n}\n\ninterface TableMemoOptions<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n> extends MemoOptions<TDeps, TDepArgs, TResult> {\n feature?: keyof TFeatures & string\n fnName: string\n objectId?: string\n onAfterUpdate?: () => void\n table: Table_Internal<TFeatures, any>\n}\n\nconst pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n}\n\nexport function tableMemo<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n>({\n feature,\n fnName,\n objectId,\n onAfterUpdate,\n table,\n ...memoOptions\n}: TableMemoOptions<TFeatures, TDeps, TDepArgs, TResult>) {\n let beforeCompareTime: number\n let afterCompareTime: number\n let startCalcTime: number\n let endCalcTime: number\n let runCount = 0\n let debug: boolean | undefined\n let debugCache: boolean | undefined\n\n if (process.env.NODE_ENV === 'development') {\n const { debugCache: _debugCache, debugAll } = table.options\n debugCache = _debugCache\n const { parentName } = getFunctionNameInfo(fnName, '.')\n\n const debugByParent =\n // @ts-expect-error\n table.options[\n `debug${(parentName != 'table' ? parentName + 's' : parentName).replace(\n parentName,\n parentName.charAt(0).toUpperCase() + parentName.slice(1),\n )}`\n ]\n const debugByFeature = feature\n ? // @ts-expect-error\n table.options[\n `debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`\n ]\n : false\n\n debug = debugAll || debugByParent || debugByFeature\n }\n\n function logTime(time: number, depsChanged: boolean) {\n const runType =\n runCount === 0\n ? '(1st run)'\n : depsChanged\n ? '(rerun #' + runCount + ')'\n : '(cache)'\n runCount++\n\n console.groupCollapsed(\n `%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split('.')[0]}Id: ${objectId})` : ''}`,\n `font-size: .6rem; font-weight: bold; ${\n depsChanged\n ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);`\n : ''\n } `,\n `color: ${runCount < 2 ? '#FF00FF' : '#FF1493'}`,\n 'color: #666',\n 'color: #87CEEB',\n )\n console.info({\n feature,\n state: table.store.state,\n deps: memoOptions.memoDeps?.toString(),\n })\n console.trace()\n console.groupEnd()\n }\n\n const debugOptions =\n process.env.NODE_ENV === 'development'\n ? {\n onBeforeCompare: () => {\n if (debugCache) {\n beforeCompareTime = performance.now()\n }\n },\n onAfterCompare: (depsChanged: boolean) => {\n if (debugCache) {\n afterCompareTime = performance.now()\n const compareTime =\n Math.round((afterCompareTime - beforeCompareTime) * 100) / 100\n if (!depsChanged) {\n logTime(compareTime, depsChanged)\n }\n }\n },\n onBeforeUpdate: () => {\n if (debug) {\n startCalcTime = performance.now()\n }\n },\n onAfterUpdate: () => {\n if (debug) {\n endCalcTime = performance.now()\n const executionTime =\n Math.round((endCalcTime - startCalcTime) * 100) / 100\n logTime(executionTime, true)\n }\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n : {\n onAfterUpdate: () => {\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n\n return memo({\n ...memoOptions,\n ...debugOptions,\n })\n}\n\nexport interface API<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (...args: any) => any\n memoDeps?: (depArgs?: any) => [...any] | undefined\n}\n\nexport type APIObject<TDeps extends ReadonlyArray<any>, TDepArgs> = Record<\n string,\n API<TDeps, TDepArgs>\n>\n\n/**\n * Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n */\nexport function getFunctionNameInfo(\n staticFnName: string,\n splitBy: '_' | '.' = '_',\n) {\n const [parentName, fnKey] = staticFnName.split(splitBy)\n const fnName = `${parentName}.${fnKey}`\n return { fnKey, fnName, parentName } as {\n fnKey: string\n fnName: string\n parentName: string\n }\n}\n\n/**\n * Assigns Table API methods directly to the table instance.\n * Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n */\nexport function assignTableAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n table: Table_Internal<TFeatures, TData>,\n apis: APIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n ;(table as Record<string, any>)[fnKey] = memoDeps\n ? tableMemo({\n memoDeps,\n fn,\n fnName,\n table,\n feature,\n })\n : fn\n }\n}\n\nexport interface PrototypeAPI<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (self: any, ...args: any) => any\n memoDeps?: (self: any, depArgs?: any) => [...any] | undefined\n}\n\nexport type PrototypeAPIObject<\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n> = Record<string, PrototypeAPI<TDeps, TDepArgs>>\n\n/**\n * Assigns API methods to a prototype object for memory-efficient method sharing.\n * All instances created with this prototype will share the same method references.\n *\n * For memoized methods, the memo state is lazily created and stored on each instance.\n * This provides the best of both worlds: shared method code + per-instance caching.\n */\nexport function assignPrototypeAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n prototype: Record<string, any>,\n table: Table_Internal<TFeatures, TData>,\n apis: PrototypeAPIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n if (memoDeps) {\n // For memoized methods, create a function that lazily initializes\n // the memo on first access and stores it on the instance\n const memoKey = `_memo_${fnKey}`\n\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n // Lazily create memo on first access for this instance\n if (!this[memoKey]) {\n const self = this\n this[memoKey] = tableMemo({\n memoDeps: () => memoDeps(self),\n fn: (...deps) => fn(self, ...deps),\n fnName,\n objectId: self.id,\n table,\n feature,\n })\n }\n return this[memoKey](...args)\n }\n } else {\n // Non-memoized methods just call the static function with `this`\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n return fn(this, ...args)\n }\n }\n\n setMemoFnMeta(prototype[fnKey], { originalArgsLength: fn.length })\n }\n}\n\n/**\n * Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fallback to the static method passed in.\n */\nexport function callMemoOrStaticFn<\n TObject extends Record<string, any>,\n TStaticFn extends AnyFunction,\n>(\n obj: TObject,\n fnKey: string,\n staticFn: TStaticFn,\n ...args: Parameters<TStaticFn> extends [any, ...infer Rest] ? Rest : never\n): ReturnType<TStaticFn> {\n return (\n (obj[fnKey] as Function | undefined)?.(...args) ?? staticFn(obj, ...args)\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { Table, Table_Internal } from './types/Table'\nimport type { NoInfer, RowData, Updater } from './types/type-utils'\nimport type { TableFeatures } from './types/TableFeatures'\nimport type { TableState, TableState_All } from './types/TableState'\n\nexport function functionalUpdate<T>(updater: Updater<T>, input: T): T {\n return typeof updater === 'function'\n ? (updater as (i: T) => T)(input)\n : updater\n}\n\nexport function cloneState<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(cloneState) as T\n }\n\n if (value && typeof value === 'object') {\n const proto = Object.getPrototypeOf(value)\n\n if (proto !== Object.prototype && proto !== null) {\n return value\n }\n\n const copy: Record<string, unknown> = {}\n\n for (const key of Object.keys(value)) {\n copy[key] = cloneState((value as Record<string, unknown>)[key])\n }\n\n return copy as T\n }\n\n return value\n}\n\nexport function noop() {}\n\nexport function makeStateUpdater<\n TFeatures extends TableFeatures,\n K extends (string & {}) | keyof TableState_All | keyof TableState<TFeatures>,\n>(key: K, instance: Table<TFeatures, any>) {\n return (updater: Updater<TableState<any>[K & keyof TableState<any>]>) => {\n const externalAtom = (instance.options as any).atoms?.[key]\n const targetAtom = externalAtom ?? (instance.baseAtoms as any)[key]\n targetAtom.set((old: any) => functionalUpdate(updater, old))\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\nexport function isFunction<T extends AnyFunction>(d: any): d is T {\n return d instanceof Function\n}\n\nexport function isNumberArray(d: any): d is Array<number> {\n return Array.isArray(d) && d.every((val) => typeof val === 'number')\n}\n\nexport function flattenBy<TNode>(\n arr: Array<TNode>,\n getChildren: (item: TNode) => Array<TNode>,\n) {\n const flat: Array<TNode> = []\n\n const recurse = (subArr: Array<TNode>) => {\n subArr.forEach((item) => {\n flat.push(item)\n const children = getChildren(item)\n if (children.length) {\n recurse(children)\n }\n })\n }\n\n recurse(arr)\n\n return flat\n}\n\nexport const $internalMemoFnMeta = Symbol('memoFnMeta')\nexport type MemoFnMeta = { originalArgsLength?: number }\n\n/**\n * @internal\n */\nfunction setMemoFnMeta(fn: Function, meta: MemoFnMeta) {\n Object.defineProperty(fn, $internalMemoFnMeta, { value: meta })\n}\n\n/**\n * @internal\n */\nexport function getMemoFnMeta(fn: any): MemoFnMeta | null {\n return (typeof fn === 'function' && fn[$internalMemoFnMeta]) ?? null\n}\n\ninterface MemoOptions<TDeps extends ReadonlyArray<any>, TDepArgs, TResult> {\n fn: (...args: NoInfer<TDeps>) => TResult\n memoDeps?: (depArgs?: TDepArgs) => [...TDeps] | undefined\n onAfterCompare?: (depsChanged: boolean) => void\n onAfterUpdate?: (result: TResult) => void\n onBeforeCompare?: () => void\n onBeforeUpdate?: () => void\n}\n\nexport const memo = <TDeps extends ReadonlyArray<any>, TDepArgs, TResult>({\n fn,\n memoDeps,\n onAfterCompare,\n onAfterUpdate,\n onBeforeCompare,\n onBeforeUpdate,\n}: MemoOptions<TDeps, TDepArgs, TResult>): ((\n depArgs?: TDepArgs,\n) => TResult) => {\n let deps: Array<any> | undefined = []\n let result: TResult | undefined\n\n const memoizedFn = (depArgs?: TDepArgs): TResult => {\n onBeforeCompare?.()\n const newDeps = memoDeps?.(depArgs)\n const depsChanged =\n !newDeps ||\n newDeps.length !== deps?.length ||\n newDeps.some((dep: any, index: number) => deps?.[index] !== dep)\n onAfterCompare?.(depsChanged)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n onBeforeUpdate?.()\n result = fn(...(newDeps ?? ([] as any)))\n onAfterUpdate?.(result)\n\n return result\n }\n\n setMemoFnMeta(memoizedFn, { originalArgsLength: fn.length })\n\n return memoizedFn\n}\n\ninterface TableMemoOptions<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n> extends MemoOptions<TDeps, TDepArgs, TResult> {\n feature?: keyof TFeatures & string\n fnName: string\n objectId?: string\n onAfterUpdate?: () => void\n table: Table_Internal<TFeatures, any>\n}\n\nconst pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n}\n\nexport function tableMemo<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n>({\n feature,\n fnName,\n objectId,\n onAfterUpdate,\n table,\n ...memoOptions\n}: TableMemoOptions<TFeatures, TDeps, TDepArgs, TResult>) {\n let beforeCompareTime: number\n let afterCompareTime: number\n let startCalcTime: number\n let endCalcTime: number\n let runCount = 0\n let debug: boolean | undefined\n let debugCache: boolean | undefined\n\n if (process.env.NODE_ENV === 'development') {\n const { debugCache: _debugCache, debugAll } = table.options\n debugCache = _debugCache\n const { parentName } = getFunctionNameInfo(fnName, '.')\n\n const debugByParent =\n // @ts-expect-error\n table.options[\n `debug${(parentName != 'table' ? parentName + 's' : parentName).replace(\n parentName,\n parentName.charAt(0).toUpperCase() + parentName.slice(1),\n )}`\n ]\n const debugByFeature = feature\n ? // @ts-expect-error\n table.options[\n `debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`\n ]\n : false\n\n debug = debugAll || debugByParent || debugByFeature\n }\n\n function logTime(time: number, depsChanged: boolean) {\n const runType =\n runCount === 0\n ? '(1st run)'\n : depsChanged\n ? '(rerun #' + runCount + ')'\n : '(cache)'\n runCount++\n\n console.groupCollapsed(\n `%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split('.')[0]}Id: ${objectId})` : ''}`,\n `font-size: .6rem; font-weight: bold; ${\n depsChanged\n ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);`\n : ''\n } `,\n `color: ${runCount < 2 ? '#FF00FF' : '#FF1493'}`,\n 'color: #666',\n 'color: #87CEEB',\n )\n console.info({\n feature,\n state: table.store.state,\n deps: memoOptions.memoDeps?.toString(),\n })\n console.trace()\n console.groupEnd()\n }\n\n const debugOptions =\n process.env.NODE_ENV === 'development'\n ? {\n onBeforeCompare: () => {\n if (debugCache) {\n beforeCompareTime = performance.now()\n }\n },\n onAfterCompare: (depsChanged: boolean) => {\n if (debugCache) {\n afterCompareTime = performance.now()\n const compareTime =\n Math.round((afterCompareTime - beforeCompareTime) * 100) / 100\n if (!depsChanged) {\n logTime(compareTime, depsChanged)\n }\n }\n },\n onBeforeUpdate: () => {\n if (debug) {\n startCalcTime = performance.now()\n }\n },\n onAfterUpdate: () => {\n if (debug) {\n endCalcTime = performance.now()\n const executionTime =\n Math.round((endCalcTime - startCalcTime) * 100) / 100\n logTime(executionTime, true)\n }\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n : {\n onAfterUpdate: () => {\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n\n return memo({\n ...memoOptions,\n ...debugOptions,\n })\n}\n\nexport interface API<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (...args: any) => any\n memoDeps?: (depArgs?: any) => [...any] | undefined\n}\n\nexport type APIObject<TDeps extends ReadonlyArray<any>, TDepArgs> = Record<\n string,\n API<TDeps, TDepArgs>\n>\n\n/**\n * Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n */\nexport function getFunctionNameInfo(\n staticFnName: string,\n splitBy: '_' | '.' = '_',\n) {\n const [parentName, fnKey] = staticFnName.split(splitBy)\n const fnName = `${parentName}.${fnKey}`\n return { fnKey, fnName, parentName } as {\n fnKey: string\n fnName: string\n parentName: string\n }\n}\n\n/**\n * Assigns Table API methods directly to the table instance.\n * Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n */\nexport function assignTableAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n table: Table_Internal<TFeatures, TData>,\n apis: APIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n ;(table as Record<string, any>)[fnKey] = memoDeps\n ? tableMemo({\n memoDeps,\n fn,\n fnName,\n table,\n feature,\n })\n : fn\n }\n}\n\nexport interface PrototypeAPI<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (self: any, ...args: any) => any\n memoDeps?: (self: any, depArgs?: any) => [...any] | undefined\n}\n\nexport type PrototypeAPIObject<\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n> = Record<string, PrototypeAPI<TDeps, TDepArgs>>\n\n/**\n * Assigns API methods to a prototype object for memory-efficient method sharing.\n * All instances created with this prototype will share the same method references.\n *\n * For memoized methods, the memo state is lazily created and stored on each instance.\n * This provides the best of both worlds: shared method code + per-instance caching.\n */\nexport function assignPrototypeAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n prototype: Record<string, any>,\n table: Table_Internal<TFeatures, TData>,\n apis: PrototypeAPIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n if (memoDeps) {\n // For memoized methods, create a function that lazily initializes\n // the memo on first access and stores it on the instance\n const memoKey = `_memo_${fnKey}`\n\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n // Lazily create memo on first access for this instance\n if (!this[memoKey]) {\n const self = this\n this[memoKey] = tableMemo({\n memoDeps: () => memoDeps(self),\n fn: (...deps) => fn(self, ...deps),\n fnName,\n objectId: self.id,\n table,\n feature,\n })\n }\n return this[memoKey](...args)\n }\n } else {\n // Non-memoized methods just call the static function with `this`\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n return fn(this, ...args)\n }\n }\n\n setMemoFnMeta(prototype[fnKey], { originalArgsLength: fn.length })\n }\n}\n\n/**\n * Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fallback to the static method passed in.\n */\nexport function callMemoOrStaticFn<\n TObject extends Record<string, any>,\n TStaticFn extends AnyFunction,\n>(\n obj: TObject,\n fnKey: string,\n staticFn: TStaticFn,\n ...args: Parameters<TStaticFn> extends [any, ...infer Rest] ? Rest : never\n): ReturnType<TStaticFn> {\n return (\n (obj[fnKey] as Function | undefined)?.(...args) ?? staticFn(obj, ...args)\n )\n}\n"],"mappings":"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"}
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { Table, Table_Internal } from './types/Table'\nimport type { NoInfer, RowData, Updater } from './types/type-utils'\nimport type { TableFeatures } from './types/TableFeatures'\nimport type { TableState, TableState_All } from './types/TableState'\n\nexport function functionalUpdate<T>(updater: Updater<T>, input: T): T {\n return typeof updater === 'function'\n ? (updater as (i: T) => T)(input)\n : updater\n}\n\nexport function cloneState<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(cloneState) as T\n }\n\n if (value && typeof value === 'object') {\n const proto = Object.getPrototypeOf(value)\n\n if (proto !== Object.prototype && proto !== null) {\n return value\n }\n\n const copy: Record<string, unknown> = {}\n\n for (const key of Object.keys(value)) {\n copy[key] = cloneState((value as Record<string, unknown>)[key])\n }\n\n return copy as T\n }\n\n return value\n}\n\nexport function noop() {}\n\nexport function makeStateUpdater<\n TFeatures extends TableFeatures,\n K extends (string & {}) | keyof TableState_All | keyof TableState<TFeatures>,\n>(key: K, instance: Table<TFeatures, any>) {\n return (updater: Updater<TableState<any>[K & keyof TableState<any>]>) => {\n const externalAtom = (instance.options as any).atoms?.[key]\n const targetAtom = externalAtom ?? (instance.baseAtoms as any)[key]\n targetAtom.set((old: any) => functionalUpdate(updater, old))\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\nexport function isFunction<T extends AnyFunction>(d: any): d is T {\n return d instanceof Function\n}\n\nexport function isNumberArray(d: any): d is Array<number> {\n return Array.isArray(d) && d.every((val) => typeof val === 'number')\n}\n\nexport function flattenBy<TNode>(\n arr: Array<TNode>,\n getChildren: (item: TNode) => Array<TNode>,\n) {\n const flat: Array<TNode> = []\n\n const recurse = (subArr: Array<TNode>) => {\n subArr.forEach((item) => {\n flat.push(item)\n const children = getChildren(item)\n if (children.length) {\n recurse(children)\n }\n })\n }\n\n recurse(arr)\n\n return flat\n}\n\nexport const $internalMemoFnMeta = Symbol('memoFnMeta')\nexport type MemoFnMeta = { originalArgsLength?: number }\n\n/**\n * @internal\n */\nfunction setMemoFnMeta(fn: Function, meta: MemoFnMeta) {\n Object.defineProperty(fn, $internalMemoFnMeta, { value: meta })\n}\n\n/**\n * @internal\n */\nexport function getMemoFnMeta(fn: any): MemoFnMeta | null {\n return (typeof fn === 'function' && fn[$internalMemoFnMeta]) ?? null\n}\n\ninterface MemoOptions<TDeps extends ReadonlyArray<any>, TDepArgs, TResult> {\n fn: (...args: NoInfer<TDeps>) => TResult\n memoDeps?: (depArgs?: TDepArgs) => [...TDeps] | undefined\n onAfterCompare?: (depsChanged: boolean) => void\n onAfterUpdate?: (result: TResult) => void\n onBeforeCompare?: () => void\n onBeforeUpdate?: () => void\n}\n\nexport const memo = <TDeps extends ReadonlyArray<any>, TDepArgs, TResult>({\n fn,\n memoDeps,\n onAfterCompare,\n onAfterUpdate,\n onBeforeCompare,\n onBeforeUpdate,\n}: MemoOptions<TDeps, TDepArgs, TResult>): ((\n depArgs?: TDepArgs,\n) => TResult) => {\n let deps: Array<any> | undefined = []\n let result: TResult | undefined\n\n const memoizedFn = (depArgs?: TDepArgs): TResult => {\n onBeforeCompare?.()\n const newDeps = memoDeps?.(depArgs)\n const depsChanged =\n !newDeps ||\n newDeps.length !== deps?.length ||\n newDeps.some((dep: any, index: number) => deps?.[index] !== dep)\n onAfterCompare?.(depsChanged)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n onBeforeUpdate?.()\n result = fn(...(newDeps ?? ([] as any)))\n onAfterUpdate?.(result)\n\n return result\n }\n\n setMemoFnMeta(memoizedFn, { originalArgsLength: fn.length })\n\n return memoizedFn\n}\n\ninterface TableMemoOptions<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n> extends MemoOptions<TDeps, TDepArgs, TResult> {\n feature?: keyof TFeatures & string\n fnName: string\n objectId?: string\n onAfterUpdate?: () => void\n table: Table_Internal<TFeatures, any>\n}\n\nconst pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n}\n\nexport function tableMemo<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n>({\n feature,\n fnName,\n objectId,\n onAfterUpdate,\n table,\n ...memoOptions\n}: TableMemoOptions<TFeatures, TDeps, TDepArgs, TResult>) {\n let beforeCompareTime: number\n let afterCompareTime: number\n let startCalcTime: number\n let endCalcTime: number\n let runCount = 0\n let debug: boolean | undefined\n let debugCache: boolean | undefined\n\n if (process.env.NODE_ENV === 'development') {\n const { debugCache: _debugCache, debugAll } = table.options\n debugCache = _debugCache\n const { parentName } = getFunctionNameInfo(fnName, '.')\n\n const debugByParent =\n // @ts-expect-error\n table.options[\n `debug${(parentName != 'table' ? parentName + 's' : parentName).replace(\n parentName,\n parentName.charAt(0).toUpperCase() + parentName.slice(1),\n )}`\n ]\n const debugByFeature = feature\n ? // @ts-expect-error\n table.options[\n `debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`\n ]\n : false\n\n debug = debugAll || debugByParent || debugByFeature\n }\n\n function logTime(time: number, depsChanged: boolean) {\n const runType =\n runCount === 0\n ? '(1st run)'\n : depsChanged\n ? '(rerun #' + runCount + ')'\n : '(cache)'\n runCount++\n\n console.groupCollapsed(\n `%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split('.')[0]}Id: ${objectId})` : ''}`,\n `font-size: .6rem; font-weight: bold; ${\n depsChanged\n ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);`\n : ''\n } `,\n `color: ${runCount < 2 ? '#FF00FF' : '#FF1493'}`,\n 'color: #666',\n 'color: #87CEEB',\n )\n console.info({\n feature,\n state: table.store.state,\n deps: memoOptions.memoDeps?.toString(),\n })\n console.trace()\n console.groupEnd()\n }\n\n const debugOptions =\n process.env.NODE_ENV === 'development'\n ? {\n onBeforeCompare: () => {\n if (debugCache) {\n beforeCompareTime = performance.now()\n }\n },\n onAfterCompare: (depsChanged: boolean) => {\n if (debugCache) {\n afterCompareTime = performance.now()\n const compareTime =\n Math.round((afterCompareTime - beforeCompareTime) * 100) / 100\n if (!depsChanged) {\n logTime(compareTime, depsChanged)\n }\n }\n },\n onBeforeUpdate: () => {\n if (debug) {\n startCalcTime = performance.now()\n }\n },\n onAfterUpdate: () => {\n if (debug) {\n endCalcTime = performance.now()\n const executionTime =\n Math.round((endCalcTime - startCalcTime) * 100) / 100\n logTime(executionTime, true)\n }\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n : {\n onAfterUpdate: () => {\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n\n return memo({\n ...memoOptions,\n ...debugOptions,\n })\n}\n\nexport interface API<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (...args: any) => any\n memoDeps?: (depArgs?: any) => [...any] | undefined\n}\n\nexport type APIObject<TDeps extends ReadonlyArray<any>, TDepArgs> = Record<\n string,\n API<TDeps, TDepArgs>\n>\n\n/**\n * Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n */\nexport function getFunctionNameInfo(\n staticFnName: string,\n splitBy: '_' | '.' = '_',\n) {\n const [parentName, fnKey] = staticFnName.split(splitBy)\n const fnName = `${parentName}.${fnKey}`\n return { fnKey, fnName, parentName } as {\n fnKey: string\n fnName: string\n parentName: string\n }\n}\n\n/**\n * Assigns Table API methods directly to the table instance.\n * Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n */\nexport function assignTableAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n table: Table_Internal<TFeatures, TData>,\n apis: APIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n ;(table as Record<string, any>)[fnKey] = memoDeps\n ? tableMemo({\n memoDeps,\n fn,\n fnName,\n table,\n feature,\n })\n : fn\n }\n}\n\nexport interface PrototypeAPI<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (self: any, ...args: any) => any\n memoDeps?: (self: any, depArgs?: any) => [...any] | undefined\n}\n\nexport type PrototypeAPIObject<\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n> = Record<string, PrototypeAPI<TDeps, TDepArgs>>\n\n/**\n * Assigns API methods to a prototype object for memory-efficient method sharing.\n * All instances created with this prototype will share the same method references.\n *\n * For memoized methods, the memo state is lazily created and stored on each instance.\n * This provides the best of both worlds: shared method code + per-instance caching.\n */\nexport function assignPrototypeAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n prototype: Record<string, any>,\n table: Table_Internal<TFeatures, TData>,\n apis: PrototypeAPIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n if (memoDeps) {\n // For memoized methods, create a function that lazily initializes\n // the memo on first access and stores it on the instance\n const memoKey = `_memo_${fnKey}`\n\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n // Lazily create memo on first access for this instance\n if (!this[memoKey]) {\n const self = this\n this[memoKey] = tableMemo({\n memoDeps: () => memoDeps(self),\n fn: (...deps) => fn(self, ...deps),\n fnName,\n objectId: self.id,\n table,\n feature,\n })\n }\n return this[memoKey](...args)\n }\n } else {\n // Non-memoized methods just call the static function with `this`\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n return fn(this, ...args)\n }\n }\n\n setMemoFnMeta(prototype[fnKey], { originalArgsLength: fn.length })\n }\n}\n\n/**\n * Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fallback to the static method passed in.\n */\nexport function callMemoOrStaticFn<\n TObject extends Record<string, any>,\n TStaticFn extends AnyFunction,\n>(\n obj: TObject,\n fnKey: string,\n staticFn: TStaticFn,\n ...args: Parameters<TStaticFn> extends [any, ...infer Rest] ? Rest : never\n): ReturnType<TStaticFn> {\n return (\n (obj[fnKey] as Function | undefined)?.(...args) ?? staticFn(obj, ...args)\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { Table, Table_Internal } from './types/Table'\nimport type { NoInfer, RowData, Updater } from './types/type-utils'\nimport type { TableFeatures } from './types/TableFeatures'\nimport type { TableState, TableState_All } from './types/TableState'\n\nexport function functionalUpdate<T>(updater: Updater<T>, input: T): T {\n return typeof updater === 'function'\n ? (updater as (i: T) => T)(input)\n : updater\n}\n\nexport function cloneState<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(cloneState) as T\n }\n\n if (value && typeof value === 'object') {\n const proto = Object.getPrototypeOf(value)\n\n if (proto !== Object.prototype && proto !== null) {\n return value\n }\n\n const copy: Record<string, unknown> = {}\n\n for (const key of Object.keys(value)) {\n copy[key] = cloneState((value as Record<string, unknown>)[key])\n }\n\n return copy as T\n }\n\n return value\n}\n\nexport function noop() {}\n\nexport function makeStateUpdater<\n TFeatures extends TableFeatures,\n K extends (string & {}) | keyof TableState_All | keyof TableState<TFeatures>,\n>(key: K, instance: Table<TFeatures, any>) {\n return (updater: Updater<TableState<any>[K & keyof TableState<any>]>) => {\n const externalAtom = (instance.options as any).atoms?.[key]\n const targetAtom = externalAtom ?? (instance.baseAtoms as any)[key]\n targetAtom.set((old: any) => functionalUpdate(updater, old))\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\nexport function isFunction<T extends AnyFunction>(d: any): d is T {\n return d instanceof Function\n}\n\nexport function isNumberArray(d: any): d is Array<number> {\n return Array.isArray(d) && d.every((val) => typeof val === 'number')\n}\n\nexport function flattenBy<TNode>(\n arr: Array<TNode>,\n getChildren: (item: TNode) => Array<TNode>,\n) {\n const flat: Array<TNode> = []\n\n const recurse = (subArr: Array<TNode>) => {\n subArr.forEach((item) => {\n flat.push(item)\n const children = getChildren(item)\n if (children.length) {\n recurse(children)\n }\n })\n }\n\n recurse(arr)\n\n return flat\n}\n\nexport const $internalMemoFnMeta = Symbol('memoFnMeta')\nexport type MemoFnMeta = { originalArgsLength?: number }\n\n/**\n * @internal\n */\nfunction setMemoFnMeta(fn: Function, meta: MemoFnMeta) {\n Object.defineProperty(fn, $internalMemoFnMeta, { value: meta })\n}\n\n/**\n * @internal\n */\nexport function getMemoFnMeta(fn: any): MemoFnMeta | null {\n return (typeof fn === 'function' && fn[$internalMemoFnMeta]) ?? null\n}\n\ninterface MemoOptions<TDeps extends ReadonlyArray<any>, TDepArgs, TResult> {\n fn: (...args: NoInfer<TDeps>) => TResult\n memoDeps?: (depArgs?: TDepArgs) => [...TDeps] | undefined\n onAfterCompare?: (depsChanged: boolean) => void\n onAfterUpdate?: (result: TResult) => void\n onBeforeCompare?: () => void\n onBeforeUpdate?: () => void\n}\n\nexport const memo = <TDeps extends ReadonlyArray<any>, TDepArgs, TResult>({\n fn,\n memoDeps,\n onAfterCompare,\n onAfterUpdate,\n onBeforeCompare,\n onBeforeUpdate,\n}: MemoOptions<TDeps, TDepArgs, TResult>): ((\n depArgs?: TDepArgs,\n) => TResult) => {\n let deps: Array<any> | undefined = []\n let result: TResult | undefined\n\n const memoizedFn = (depArgs?: TDepArgs): TResult => {\n onBeforeCompare?.()\n const newDeps = memoDeps?.(depArgs)\n const depsChanged =\n !newDeps ||\n newDeps.length !== deps?.length ||\n newDeps.some((dep: any, index: number) => deps?.[index] !== dep)\n onAfterCompare?.(depsChanged)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n onBeforeUpdate?.()\n result = fn(...(newDeps ?? ([] as any)))\n onAfterUpdate?.(result)\n\n return result\n }\n\n setMemoFnMeta(memoizedFn, { originalArgsLength: fn.length })\n\n return memoizedFn\n}\n\ninterface TableMemoOptions<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n> extends MemoOptions<TDeps, TDepArgs, TResult> {\n feature?: keyof TFeatures & string\n fnName: string\n objectId?: string\n onAfterUpdate?: () => void\n table: Table_Internal<TFeatures, any>\n}\n\nconst pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n}\n\nexport function tableMemo<\n TFeatures extends TableFeatures,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n TResult,\n>({\n feature,\n fnName,\n objectId,\n onAfterUpdate,\n table,\n ...memoOptions\n}: TableMemoOptions<TFeatures, TDeps, TDepArgs, TResult>) {\n let beforeCompareTime: number\n let afterCompareTime: number\n let startCalcTime: number\n let endCalcTime: number\n let runCount = 0\n let debug: boolean | undefined\n let debugCache: boolean | undefined\n\n if (process.env.NODE_ENV === 'development') {\n const { debugCache: _debugCache, debugAll } = table.options\n debugCache = _debugCache\n const { parentName } = getFunctionNameInfo(fnName, '.')\n\n const debugByParent =\n // @ts-expect-error\n table.options[\n `debug${(parentName != 'table' ? parentName + 's' : parentName).replace(\n parentName,\n parentName.charAt(0).toUpperCase() + parentName.slice(1),\n )}`\n ]\n const debugByFeature = feature\n ? // @ts-expect-error\n table.options[\n `debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`\n ]\n : false\n\n debug = debugAll || debugByParent || debugByFeature\n }\n\n function logTime(time: number, depsChanged: boolean) {\n const runType =\n runCount === 0\n ? '(1st run)'\n : depsChanged\n ? '(rerun #' + runCount + ')'\n : '(cache)'\n runCount++\n\n console.groupCollapsed(\n `%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split('.')[0]}Id: ${objectId})` : ''}`,\n `font-size: .6rem; font-weight: bold; ${\n depsChanged\n ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);`\n : ''\n } `,\n `color: ${runCount < 2 ? '#FF00FF' : '#FF1493'}`,\n 'color: #666',\n 'color: #87CEEB',\n )\n console.info({\n feature,\n state: table.store.state,\n deps: memoOptions.memoDeps?.toString(),\n })\n console.trace()\n console.groupEnd()\n }\n\n const debugOptions =\n process.env.NODE_ENV === 'development'\n ? {\n onBeforeCompare: () => {\n if (debugCache) {\n beforeCompareTime = performance.now()\n }\n },\n onAfterCompare: (depsChanged: boolean) => {\n if (debugCache) {\n afterCompareTime = performance.now()\n const compareTime =\n Math.round((afterCompareTime - beforeCompareTime) * 100) / 100\n if (!depsChanged) {\n logTime(compareTime, depsChanged)\n }\n }\n },\n onBeforeUpdate: () => {\n if (debug) {\n startCalcTime = performance.now()\n }\n },\n onAfterUpdate: () => {\n if (debug) {\n endCalcTime = performance.now()\n const executionTime =\n Math.round((endCalcTime - startCalcTime) * 100) / 100\n logTime(executionTime, true)\n }\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n : {\n onAfterUpdate: () => {\n queueMicrotask(() => onAfterUpdate?.())\n },\n }\n\n return memo({\n ...memoOptions,\n ...debugOptions,\n })\n}\n\nexport interface API<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (...args: any) => any\n memoDeps?: (depArgs?: any) => [...any] | undefined\n}\n\nexport type APIObject<TDeps extends ReadonlyArray<any>, TDepArgs> = Record<\n string,\n API<TDeps, TDepArgs>\n>\n\n/**\n * Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n */\nexport function getFunctionNameInfo(\n staticFnName: string,\n splitBy: '_' | '.' = '_',\n) {\n const [parentName, fnKey] = staticFnName.split(splitBy)\n const fnName = `${parentName}.${fnKey}`\n return { fnKey, fnName, parentName } as {\n fnKey: string\n fnName: string\n parentName: string\n }\n}\n\n/**\n * Assigns Table API methods directly to the table instance.\n * Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n */\nexport function assignTableAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n table: Table_Internal<TFeatures, TData>,\n apis: APIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n ;(table as Record<string, any>)[fnKey] = memoDeps\n ? tableMemo({\n memoDeps,\n fn,\n fnName,\n table,\n feature,\n })\n : fn\n }\n}\n\nexport interface PrototypeAPI<TDeps extends ReadonlyArray<any>, TDepArgs> {\n fn: (self: any, ...args: any) => any\n memoDeps?: (self: any, depArgs?: any) => [...any] | undefined\n}\n\nexport type PrototypeAPIObject<\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n> = Record<string, PrototypeAPI<TDeps, TDepArgs>>\n\n/**\n * Assigns API methods to a prototype object for memory-efficient method sharing.\n * All instances created with this prototype will share the same method references.\n *\n * For memoized methods, the memo state is lazily created and stored on each instance.\n * This provides the best of both worlds: shared method code + per-instance caching.\n */\nexport function assignPrototypeAPIs<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TDeps extends ReadonlyArray<any>,\n TDepArgs,\n>(\n feature: keyof TFeatures & string,\n prototype: Record<string, any>,\n table: Table_Internal<TFeatures, TData>,\n apis: PrototypeAPIObject<TDeps, NoInfer<TDepArgs>>,\n): void {\n for (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n const { fnKey, fnName } = getFunctionNameInfo(staticFnName)\n\n if (memoDeps) {\n // For memoized methods, create a function that lazily initializes\n // the memo on first access and stores it on the instance\n const memoKey = `_memo_${fnKey}`\n\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n // Lazily create memo on first access for this instance\n if (!this[memoKey]) {\n const self = this\n this[memoKey] = tableMemo({\n memoDeps: () => memoDeps(self),\n fn: (...deps) => fn(self, ...deps),\n fnName,\n objectId: self.id,\n table,\n feature,\n })\n }\n return this[memoKey](...args)\n }\n } else {\n // Non-memoized methods just call the static function with `this`\n prototype[fnKey] = function (this: any, ...args: Array<any>) {\n return fn(this, ...args)\n }\n }\n\n setMemoFnMeta(prototype[fnKey], { originalArgsLength: fn.length })\n }\n}\n\n/**\n * Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fallback to the static method passed in.\n */\nexport function callMemoOrStaticFn<\n TObject extends Record<string, any>,\n TStaticFn extends AnyFunction,\n>(\n obj: TObject,\n fnKey: string,\n staticFn: TStaticFn,\n ...args: Parameters<TStaticFn> extends [any, ...infer Rest] ? Rest : never\n): ReturnType<TStaticFn> {\n return (\n (obj[fnKey] as Function | undefined)?.(...args) ?? staticFn(obj, ...args)\n )\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-alpha.36",
3
+ "version": "9.0.0-alpha.37",
4
4
  "description": "Headless UI for building powerful tables & datagrids for TS/JS.",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -100,7 +100,7 @@ export function table_getAllColumns<
100
100
  })
101
101
  }
102
102
 
103
- return recurseColumns(table.options.columns as any)
103
+ return recurseColumns(table.options.columns)
104
104
  }
105
105
 
106
106
  export function table_getAllFlatColumns<
@@ -12,7 +12,7 @@ export function createCoreRowModel<
12
12
  TData extends RowData,
13
13
  >(): (table: Table<TFeatures, TData>) => () => RowModel<TFeatures, TData> {
14
14
  return (_table) => {
15
- const table = _table as Table_Internal<TFeatures, TData>
15
+ const table: Table_Internal<TFeatures, TData> = _table
16
16
  return tableMemo({
17
17
  feature: 'coreRowModelsFeature',
18
18
  table,
@@ -52,7 +52,7 @@ export const constructRow = <
52
52
 
53
53
  // Initialize instance-specific data (e.g., caches) for features that need it
54
54
  for (const feature of Object.values(table._features)) {
55
- feature.initRowInstanceData?.(row as Row<TFeatures, TData>)
55
+ feature.initRowInstanceData?.(row)
56
56
  }
57
57
 
58
58
  return row as Row<TFeatures, TData>
@@ -12,9 +12,7 @@ export function getInitialTableState<TFeatures extends TableFeatures>(
12
12
  initialState: Partial<TableState<TFeatures>> | undefined = {},
13
13
  ): TableState<TFeatures> {
14
14
  Object.values(features).forEach((feature) => {
15
- initialState =
16
- feature.getInitialState?.(initialState as TableState<TFeatures>) ??
17
- initialState
15
+ initialState = feature.getInitialState?.(initialState) ?? initialState
18
16
  })
19
17
  return cloneState(initialState) as TableState<TFeatures>
20
18
  }
@@ -83,7 +81,7 @@ export function constructTable<
83
81
  snapshot[key] = table.atoms[key].get()
84
82
  }
85
83
  return snapshot
86
- }) as typeof table.store
84
+ })
87
85
 
88
86
  if (
89
87
  process.env.NODE_ENV === 'development' &&
@@ -13,7 +13,7 @@ export function createFacetedMinMaxValues<
13
13
  columnId: string,
14
14
  ) => () => undefined | [number, number] {
15
15
  return (_table, columnId) => {
16
- const table = _table as Table_Internal<TFeatures, TData>
16
+ const table: Table_Internal<TFeatures, TData> = _table
17
17
  return tableMemo({
18
18
  feature: 'columnFacetingFeature',
19
19
  fn: (flatRows) => _createFacetedMinMaxValues(columnId, flatRows),
@@ -18,7 +18,7 @@ export function createFacetedRowModel<
18
18
  columnId: string,
19
19
  ) => () => RowModel<TFeatures, TData> {
20
20
  return (_table, columnId) => {
21
- const table = _table as Table_Internal<TFeatures, TData>
21
+ const table: Table_Internal<TFeatures, TData> = _table
22
22
  return tableMemo({
23
23
  feature: 'columnFacetingFeature',
24
24
  table,
@@ -13,7 +13,7 @@ export function createFacetedUniqueValues<
13
13
  columnId: string,
14
14
  ) => () => Map<any, number> {
15
15
  return (_table, columnId) => {
16
- const table = _table as Table_Internal<TFeatures, TData>
16
+ const table: Table_Internal<TFeatures, TData> = _table
17
17
  return tableMemo({
18
18
  feature: 'columnFacetingFeature',
19
19
  table,
@@ -17,9 +17,8 @@ export function column_getAutoFilterFn<
17
17
  TData extends RowData,
18
18
  TValue extends CellData = CellData,
19
19
  >(column: Column_Internal<TFeatures, TData, TValue>) {
20
- const filterFns = column.table._rowModelFns.filterFns as
21
- | Record<string, FilterFn<TFeatures, TData>>
22
- | undefined
20
+ const filterFns: Record<string, FilterFn<TFeatures, TData>> | undefined =
21
+ column.table._rowModelFns.filterFns
23
22
 
24
23
  const firstRow = column.table.getCoreRowModel().flatRows[0]
25
24
 
@@ -56,9 +55,8 @@ export function column_getFilterFn<
56
55
  column: Column_Internal<TFeatures, TData, TValue>,
57
56
  ): FilterFn<TFeatures, TData> | undefined {
58
57
  let filterFn = null
59
- const filterFns = column.table._rowModelFns.filterFns as
60
- | Record<string, FilterFn<TFeatures, TData>>
61
- | undefined
58
+ const filterFns: Record<string, FilterFn<TFeatures, TData>> | undefined =
59
+ column.table._rowModelFns.filterFns
62
60
  filterFn = isFunction(column.columnDef.filterFn)
63
61
  ? column.columnDef.filterFn
64
62
  : column.columnDef.filterFn === 'auto'
@@ -203,10 +201,7 @@ export function shouldAutoRemoveFilter<
203
201
  ) {
204
202
  return (
205
203
  (filterFn && filterFn.autoRemove
206
- ? filterFn.autoRemove(
207
- value,
208
- column as Column_Internal<TFeatures, TData, unknown>,
209
- )
204
+ ? filterFn.autoRemove(value, column)
210
205
  : false) ||
211
206
  typeof value === 'undefined' ||
212
207
  (typeof value === 'string' && !value)
@@ -26,7 +26,7 @@ export function createFilteredRowModel<
26
26
  filterFns: Record<keyof FilterFns, FilterFn<TFeatures, TData>>,
27
27
  ): (table: Table<TFeatures, TData>) => () => RowModel<TFeatures, TData> {
28
28
  return (_table) => {
29
- const table = _table as Table_Internal<TFeatures, TData>
29
+ const table: Table_Internal<TFeatures, TData> = _table
30
30
  if (!table._rowModelFns.filterFns) table._rowModelFns.filterFns = filterFns
31
31
  return tableMemo({
32
32
  feature: 'columnFilteringFeature',
@@ -77,9 +77,9 @@ export function column_getAutoAggregationFn<
77
77
  TData extends RowData,
78
78
  TValue extends CellData = CellData,
79
79
  >(column: Column_Internal<TFeatures, TData, TValue>) {
80
- const aggregationFns = column.table._rowModelFns.aggregationFns as
80
+ const aggregationFns:
81
81
  | Record<string, AggregationFn<TFeatures, TData>>
82
- | undefined
82
+ | undefined = column.table._rowModelFns.aggregationFns
83
83
 
84
84
  const firstRow = column.table.getCoreRowModel().flatRows[0]
85
85
 
@@ -99,9 +99,9 @@ export function column_getAggregationFn<
99
99
  TData extends RowData,
100
100
  TValue extends CellData = CellData,
101
101
  >(column: Column_Internal<TFeatures, TData, TValue>) {
102
- const aggregationFns = column.table._rowModelFns.aggregationFns as
102
+ const aggregationFns:
103
103
  | Record<string, AggregationFn<TFeatures, TData>>
104
- | undefined
104
+ | undefined = column.table._rowModelFns.aggregationFns
105
105
 
106
106
  return isFunction(column.columnDef.aggregationFn)
107
107
  ? column.columnDef.aggregationFn
@@ -26,7 +26,7 @@ export function createGroupedRowModel<
26
26
  aggregationFns: Record<keyof AggregationFns, AggregationFn<TFeatures, TData>>,
27
27
  ): (table: Table<TFeatures, TData>) => () => RowModel<TFeatures, TData> {
28
28
  return (_table) => {
29
- const table = _table as Table_Internal<TFeatures, TData>
29
+ const table: Table_Internal<TFeatures, TData> = _table
30
30
  if (!table._rowModelFns.aggregationFns)
31
31
  table._rowModelFns.aggregationFns = aggregationFns
32
32
  return tableMemo({
@@ -31,9 +31,8 @@ export function table_getGlobalFilterFn<
31
31
  table: Table_Internal<TFeatures, TData>,
32
32
  ): FilterFn<TFeatures, TData> | FilterFn<TFeatures, TData> | undefined {
33
33
  const { globalFilterFn: globalFilterFn } = table.options
34
- const filterFns = table._rowModelFns.filterFns as
35
- | Record<string, FilterFn<TFeatures, TData>>
36
- | undefined
34
+ const filterFns: Record<string, FilterFn<TFeatures, TData>> | undefined =
35
+ table._rowModelFns.filterFns
37
36
 
38
37
  return isFunction(globalFilterFn)
39
38
  ? globalFilterFn
@@ -11,7 +11,7 @@ export function createExpandedRowModel<
11
11
  TData extends RowData = any,
12
12
  >(): (table: Table<TFeatures, TData>) => () => RowModel<TFeatures, TData> {
13
13
  return (_table) => {
14
- const table = _table as Table_Internal<TFeatures, TData>
14
+ const table: Table_Internal<TFeatures, TData> = _table
15
15
  return tableMemo({
16
16
  feature: 'rowExpandingFeature',
17
17
  table,
@@ -162,7 +162,7 @@ export function row_getIsExpanded<
162
162
  TFeatures extends TableFeatures,
163
163
  TData extends RowData,
164
164
  >(row: Row<TFeatures, TData>) {
165
- const expanded = row.table.atoms.expanded?.get() ?? ({} as ExpandedState)
165
+ const expanded: ExpandedState = row.table.atoms.expanded?.get() ?? {}
166
166
 
167
167
  return !!(
168
168
  row.table.options.getIsRowExpanded?.(row) ??
@@ -12,7 +12,7 @@ export function createPaginatedRowModel<
12
12
  TData extends RowData = any,
13
13
  >(): (table: Table<TFeatures, TData>) => () => RowModel<TFeatures, TData> {
14
14
  return (_table) => {
15
- const table = _table as Table_Internal<TFeatures, TData>
15
+ const table: Table_Internal<TFeatures, TData> = _table
16
16
  return tableMemo({
17
17
  feature: 'rowPaginationFeature',
18
18
  table,
@@ -148,8 +148,7 @@ export function table_getIsAllRowsSelected<
148
148
  TData extends RowData,
149
149
  >(table: Table_Internal<TFeatures, TData>) {
150
150
  const preGroupedFlatRows = table.getFilteredRowModel().flatRows
151
- const rowSelection =
152
- table.atoms.rowSelection?.get() ?? ({} as RowSelectionState)
151
+ const rowSelection: RowSelectionState = table.atoms.rowSelection?.get() ?? {}
153
152
 
154
153
  let isAllRowsSelected = Boolean(
155
154
  preGroupedFlatRows.length && Object.keys(rowSelection).length,
@@ -175,8 +174,7 @@ export function table_getIsAllPageRowsSelected<
175
174
  const paginationFlatRows = table
176
175
  .getPaginatedRowModel()
177
176
  .flatRows.filter((row) => row_getCanSelect(row))
178
- const rowSelection =
179
- table.atoms.rowSelection?.get() ?? ({} as RowSelectionState)
177
+ const rowSelection: RowSelectionState = table.atoms.rowSelection?.get() ?? {}
180
178
 
181
179
  let isAllPageRowsSelected = !!paginationFlatRows.length
182
180
 
@@ -16,7 +16,7 @@ export function createSortedRowModel<
16
16
  sortFns: Record<keyof SortFns, SortFn<TFeatures, TData>>,
17
17
  ): (table: Table<TFeatures, TData>) => () => RowModel<TFeatures, TData> {
18
18
  return (_table) => {
19
- const table = _table as Table_Internal<TFeatures, TData>
19
+ const table: Table_Internal<TFeatures, TData> = _table
20
20
  if (!table._rowModelFns.sortFns) table._rowModelFns.sortFns = sortFns
21
21
  return tableMemo({
22
22
  feature: 'rowSortingFeature',
@@ -62,9 +62,8 @@ function _createSortedRowModel<
62
62
  > = {}
63
63
 
64
64
  availableSorting.forEach((sortEntry) => {
65
- const column = table.getColumn(sortEntry.id) as
66
- | Column_Internal<TFeatures, TData>
67
- | undefined
65
+ const column: Column_Internal<TFeatures, TData> | undefined =
66
+ table.getColumn(sortEntry.id)
68
67
  if (!column) return
69
68
 
70
69
  columnInfoById[sortEntry.id] = {
@@ -40,9 +40,8 @@ export function column_getAutoSortFn<
40
40
  TData extends RowData,
41
41
  TValue extends CellData = CellData,
42
42
  >(column: Column_Internal<TFeatures, TData, TValue>): SortFn<TFeatures, TData> {
43
- const sortFns = column.table._rowModelFns.sortFns as
44
- | Record<string, SortFn<TFeatures, TData>>
45
- | undefined
43
+ const sortFns: Record<string, SortFn<TFeatures, TData>> | undefined =
44
+ column.table._rowModelFns.sortFns
46
45
 
47
46
  let sortFn: SortFn<TFeatures, TData> | undefined
48
47
 
@@ -94,9 +93,8 @@ export function column_getSortFn<
94
93
  TData extends RowData,
95
94
  TValue extends CellData = CellData,
96
95
  >(column: Column_Internal<TFeatures, TData, TValue>): SortFn<TFeatures, TData> {
97
- const sortFns = column.table._rowModelFns.sortFns as
98
- | Record<string, SortFn<TFeatures, TData>>
99
- | undefined
96
+ const sortFns: Record<string, SortFn<TFeatures, TData>> | undefined =
97
+ column.table._rowModelFns.sortFns
100
98
 
101
99
  return isFunction(column.columnDef.sortFn)
102
100
  ? column.columnDef.sortFn