@tanstack/table-core 8.0.0-alpha.9 → 8.0.0-beta.0

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 (186) hide show
  1. package/build/cjs/aggregationFns.js +120 -0
  2. package/build/cjs/aggregationFns.js.map +1 -0
  3. package/build/cjs/core/cell.js +40 -0
  4. package/build/cjs/core/cell.js.map +1 -0
  5. package/build/cjs/core/column.js +88 -0
  6. package/build/cjs/core/column.js.map +1 -0
  7. package/build/cjs/core/headers.js +403 -0
  8. package/build/cjs/core/headers.js.map +1 -0
  9. package/build/cjs/core/instance.js +255 -0
  10. package/build/cjs/core/instance.js.map +1 -0
  11. package/build/cjs/core/row.js +77 -0
  12. package/build/cjs/core/row.js.map +1 -0
  13. package/build/cjs/createTable.js +36 -29
  14. package/build/cjs/createTable.js.map +1 -1
  15. package/build/cjs/features/ColumnSizing.js +157 -189
  16. package/build/cjs/features/ColumnSizing.js.map +1 -1
  17. package/build/cjs/features/Expanding.js +103 -155
  18. package/build/cjs/features/Expanding.js.map +1 -1
  19. package/build/cjs/features/Filters.js +155 -304
  20. package/build/cjs/features/Filters.js.map +1 -1
  21. package/build/cjs/features/Grouping.js +97 -157
  22. package/build/cjs/features/Grouping.js.map +1 -1
  23. package/build/cjs/features/Ordering.js +30 -41
  24. package/build/cjs/features/Ordering.js.map +1 -1
  25. package/build/cjs/features/Pagination.js +102 -105
  26. package/build/cjs/features/Pagination.js.map +1 -1
  27. package/build/cjs/features/Pinning.js +131 -89
  28. package/build/cjs/features/Pinning.js.map +1 -1
  29. package/build/cjs/features/RowSelection.js +138 -267
  30. package/build/cjs/features/RowSelection.js.map +1 -1
  31. package/build/cjs/features/Sorting.js +82 -167
  32. package/build/cjs/features/Sorting.js.map +1 -1
  33. package/build/cjs/features/Visibility.js +69 -115
  34. package/build/cjs/features/Visibility.js.map +1 -1
  35. package/build/cjs/filterFns.js +107 -0
  36. package/build/cjs/filterFns.js.map +1 -0
  37. package/build/cjs/index.js +36 -23
  38. package/build/cjs/index.js.map +1 -1
  39. package/build/cjs/sortingFns.js +124 -0
  40. package/build/cjs/sortingFns.js.map +1 -0
  41. package/build/cjs/utils/filterRowsUtils.js +117 -0
  42. package/build/cjs/utils/filterRowsUtils.js.map +1 -0
  43. package/build/cjs/utils/getCoreRowModel.js +79 -0
  44. package/build/cjs/utils/getCoreRowModel.js.map +1 -0
  45. package/build/cjs/utils/getExpandedRowModel.js +57 -0
  46. package/build/cjs/utils/getExpandedRowModel.js.map +1 -0
  47. package/build/cjs/utils/getFacetedMinMaxValues.js +54 -0
  48. package/build/cjs/utils/getFacetedMinMaxValues.js.map +1 -0
  49. package/build/cjs/utils/getFacetedRowModel.js +50 -0
  50. package/build/cjs/utils/getFacetedRowModel.js.map +1 -0
  51. package/build/cjs/utils/getFacetedUniqueValues.js +48 -0
  52. package/build/cjs/utils/getFacetedUniqueValues.js.map +1 -0
  53. package/build/cjs/utils/getFilteredRowModel.js +139 -0
  54. package/build/cjs/utils/getFilteredRowModel.js.map +1 -0
  55. package/build/cjs/utils/getGroupedRowModel.js +161 -0
  56. package/build/cjs/utils/getGroupedRowModel.js.map +1 -0
  57. package/build/cjs/utils/getPaginationRowModel.js +61 -0
  58. package/build/cjs/utils/getPaginationRowModel.js.map +1 -0
  59. package/build/cjs/utils/getSortedRowModel.js +110 -0
  60. package/build/cjs/utils/getSortedRowModel.js.map +1 -0
  61. package/build/cjs/utils.js +38 -107
  62. package/build/cjs/utils.js.map +1 -1
  63. package/build/esm/index.js +2976 -3853
  64. package/build/esm/index.js.map +1 -1
  65. package/build/stats-html.html +1 -1
  66. package/build/stats-react.json +586 -408
  67. package/build/types/aggregationFns.d.ts +13 -0
  68. package/build/types/core/cell.d.ts +9 -0
  69. package/build/types/core/column.d.ts +40 -0
  70. package/build/types/core/headers.d.ts +46 -0
  71. package/build/types/core/instance.d.ts +57 -0
  72. package/build/types/core/row.d.ts +15 -0
  73. package/build/types/createTable.d.ts +47 -26
  74. package/build/types/features/ColumnSizing.d.ts +32 -44
  75. package/build/types/features/Expanding.d.ts +15 -26
  76. package/build/types/features/Filters.d.ts +64 -63
  77. package/build/types/features/Grouping.d.ts +32 -46
  78. package/build/types/features/Ordering.d.ts +7 -10
  79. package/build/types/features/Pagination.d.ts +16 -15
  80. package/build/types/features/Pinning.d.ts +16 -17
  81. package/build/types/features/RowSelection.d.ts +13 -33
  82. package/build/types/features/Sorting.d.ts +25 -44
  83. package/build/types/features/Visibility.d.ts +16 -25
  84. package/build/types/filterFns.d.ts +13 -0
  85. package/build/types/index.d.ts +16 -10
  86. package/build/types/sortingFns.d.ts +11 -0
  87. package/build/types/types.d.ts +37 -122
  88. package/build/types/utils/filterRowsUtils.d.ts +4 -0
  89. package/build/types/utils/getCoreRowModel.d.ts +2 -0
  90. package/build/types/utils/getExpandedRowModel.d.ts +7 -0
  91. package/build/types/utils/getFacetedMinMaxValues.d.ts +2 -0
  92. package/build/types/utils/getFacetedRowModel.d.ts +2 -0
  93. package/build/types/utils/getFacetedUniqueValues.d.ts +2 -0
  94. package/build/types/utils/getFilteredRowModel.d.ts +2 -0
  95. package/build/types/utils/getGroupedRowModel.d.ts +2 -0
  96. package/build/types/utils/getPaginationRowModel.d.ts +4 -0
  97. package/build/types/utils/getSortedRowModel.d.ts +2 -0
  98. package/build/types/utils.d.ts +7 -11
  99. package/build/umd/index.development.js +3024 -3893
  100. package/build/umd/index.development.js.map +1 -1
  101. package/build/umd/index.production.js +1 -1
  102. package/build/umd/index.production.js.map +1 -1
  103. package/package.json +9 -10
  104. package/src/.DS_Store +0 -0
  105. package/src/aggregationFns.ts +123 -0
  106. package/src/core/cell.ts +48 -0
  107. package/src/core/column.ts +147 -0
  108. package/src/core/headers.ts +575 -0
  109. package/src/core/instance.ts +361 -0
  110. package/src/core/row.ts +85 -0
  111. package/src/createTable.ts +188 -0
  112. package/src/features/ColumnSizing.ts +170 -185
  113. package/src/features/Expanding.ts +122 -194
  114. package/src/features/Filters.ts +301 -381
  115. package/src/features/Grouping.ts +160 -220
  116. package/src/features/Ordering.ts +24 -25
  117. package/src/features/Pagination.ts +90 -73
  118. package/src/features/Pinning.ts +186 -63
  119. package/src/features/RowSelection.ts +107 -245
  120. package/src/features/Sorting.ts +127 -225
  121. package/src/features/Visibility.ts +116 -132
  122. package/src/filterFns.ts +135 -0
  123. package/src/index.ts +29 -0
  124. package/src/{sortTypes.ts → sortingFns.ts} +63 -85
  125. package/src/types.ts +62 -168
  126. package/src/utils/filterRowsUtils.ts +112 -0
  127. package/src/utils/getCoreRowModel.ts +84 -0
  128. package/src/utils/getExpandedRowModel.ts +54 -0
  129. package/src/utils/getFacetedMinMaxValues.ts +40 -0
  130. package/src/utils/getFacetedRowModel.ts +50 -0
  131. package/src/utils/getFacetedUniqueValues.ts +37 -0
  132. package/src/utils/getFilteredRowModel.ts +159 -0
  133. package/src/utils/getGroupedRowModel.ts +175 -0
  134. package/src/utils/getPaginationRowModel.ts +48 -0
  135. package/src/utils/getSortedRowModel.ts +116 -0
  136. package/src/utils.ts +126 -0
  137. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -112
  138. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  139. package/build/cjs/aggregationTypes.js +0 -130
  140. package/build/cjs/aggregationTypes.js.map +0 -1
  141. package/build/cjs/core.js +0 -545
  142. package/build/cjs/core.js.map +0 -1
  143. package/build/cjs/features/Headers.js +0 -630
  144. package/build/cjs/features/Headers.js.map +0 -1
  145. package/build/cjs/filterTypes.js +0 -172
  146. package/build/cjs/filterTypes.js.map +0 -1
  147. package/build/cjs/sortTypes.js +0 -122
  148. package/build/cjs/sortTypes.js.map +0 -1
  149. package/build/cjs/types.js +0 -22
  150. package/build/cjs/types.js.map +0 -1
  151. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  152. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  153. package/build/cjs/utils/expandRowsFn.js +0 -38
  154. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  155. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  156. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  157. package/build/cjs/utils/groupRowsFn.js +0 -155
  158. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  159. package/build/cjs/utils/paginateRowsFn.js +0 -44
  160. package/build/cjs/utils/paginateRowsFn.js.map +0 -1
  161. package/build/cjs/utils/sortRowsFn.js +0 -94
  162. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  163. package/build/types/aggregationTypes.d.ts +0 -22
  164. package/build/types/core.d.ts +0 -105
  165. package/build/types/features/Headers.d.ts +0 -43
  166. package/build/types/filterTypes.d.ts +0 -50
  167. package/build/types/sortTypes.d.ts +0 -18
  168. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  169. package/build/types/utils/expandRowsFn.d.ts +0 -2
  170. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  171. package/build/types/utils/groupRowsFn.d.ts +0 -2
  172. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  173. package/build/types/utils/sortRowsFn.d.ts +0 -2
  174. package/src/aggregationTypes.ts +0 -115
  175. package/src/core.tsx +0 -763
  176. package/src/createTable.tsx +0 -137
  177. package/src/features/Headers.ts +0 -747
  178. package/src/filterTypes.ts +0 -188
  179. package/src/index.tsx +0 -23
  180. package/src/utils/columnFilterRowsFn.ts +0 -113
  181. package/src/utils/expandRowsFn.ts +0 -30
  182. package/src/utils/globalFilterRowsFn.ts +0 -89
  183. package/src/utils/groupRowsFn.ts +0 -170
  184. package/src/utils/paginateRowsFn.ts +0 -28
  185. package/src/utils/sortRowsFn.ts +0 -95
  186. package/src/utils.tsx +0 -221
@@ -0,0 +1,361 @@
1
+ import { flattenBy, functionalUpdate, memo, RequiredKeys } from '../utils'
2
+
3
+ import {
4
+ Updater,
5
+ TableOptionsResolved,
6
+ TableState,
7
+ TableInstance,
8
+ Renderable,
9
+ TableGenerics,
10
+ InitialTableState,
11
+ Row,
12
+ Column,
13
+ RowModel,
14
+ ColumnDef,
15
+ } from '../types'
16
+
17
+ //
18
+ import { createColumn } from './column'
19
+ import { Headers } from './headers'
20
+ //
21
+
22
+ import { ColumnSizing } from '../features/ColumnSizing'
23
+ import { Expanding } from '../features/Expanding'
24
+ import { Filters } from '../features/Filters'
25
+ import { Grouping } from '../features/Grouping'
26
+ import { Ordering } from '../features/Ordering'
27
+ import { Pagination } from '../features/Pagination'
28
+ import { Pinning } from '../features/Pinning'
29
+ import { RowSelection } from '../features/RowSelection'
30
+ import { Sorting } from '../features/Sorting'
31
+ import { Visibility } from '../features/Visibility'
32
+
33
+ export type TableFeature = {
34
+ getDefaultOptions?: (instance: any) => any
35
+ getInitialState?: (initialState?: InitialTableState) => any
36
+ createInstance?: (instance: any) => any
37
+ getDefaultColumnDef?: () => any
38
+ createColumn?: (column: any, instance: any) => any
39
+ createHeader?: (column: any, instance: any) => any
40
+ createCell?: (cell: any, column: any, row: any, instance: any) => any
41
+ createRow?: (row: any, instance: any) => any
42
+ }
43
+
44
+ const features = [
45
+ Headers,
46
+ Visibility,
47
+ Ordering,
48
+ Pinning,
49
+ Filters,
50
+ Sorting,
51
+ Grouping,
52
+ Expanding,
53
+ Pagination,
54
+ RowSelection,
55
+ ColumnSizing,
56
+ ] as const
57
+
58
+ //
59
+
60
+ export type CoreTableState = {}
61
+
62
+ export type CoreOptions<TGenerics extends TableGenerics> = {
63
+ data: TGenerics['Row'][]
64
+ state: Partial<TableState>
65
+ onStateChange: (updater: Updater<TableState>) => void
66
+ render: TGenerics['Renderer']
67
+ debugAll?: boolean
68
+ debugTable?: boolean
69
+ debugHeaders?: boolean
70
+ debugColumns?: boolean
71
+ debugRows?: boolean
72
+ initialState?: InitialTableState
73
+ autoResetAll?: boolean
74
+ mergeOptions?: <T>(defaultOptions: T, options: Partial<T>) => T
75
+ meta?: TGenerics['TableMeta']
76
+ getCoreRowModel: (
77
+ instance: TableInstance<TGenerics>
78
+ ) => () => RowModel<TGenerics>
79
+ getSubRows?: (
80
+ originalRow: TGenerics['Row'],
81
+ index: number
82
+ ) => undefined | TGenerics['Row'][]
83
+ getRowId?: (
84
+ originalRow: TGenerics['Row'],
85
+ index: number,
86
+ parent?: Row<TGenerics>
87
+ ) => string
88
+ columns: ColumnDef<TGenerics>[]
89
+ defaultColumn?: Partial<ColumnDef<TGenerics>>
90
+ }
91
+
92
+ export type CoreInstance<TGenerics extends TableGenerics> = {
93
+ initialState: TableState
94
+ reset: () => void
95
+ options: RequiredKeys<TableOptionsResolved<TGenerics>, 'state'>
96
+ setOptions: (newOptions: Updater<TableOptionsResolved<TGenerics>>) => void
97
+ getState: () => TableState
98
+ setState: (updater: Updater<TableState>) => void
99
+ _features: readonly TableFeature[]
100
+ _queue: (cb: () => void) => void
101
+ _render: <TProps>(
102
+ template: Renderable<TGenerics, TProps>,
103
+ props: TProps
104
+ ) => string | null | TGenerics['Rendered']
105
+ _getRowId: (
106
+ _: TGenerics['Row'],
107
+ index: number,
108
+ parent?: Row<TGenerics>
109
+ ) => string
110
+ getCoreRowModel: () => RowModel<TGenerics>
111
+ _getCoreRowModel?: () => RowModel<TGenerics>
112
+ getRowModel: () => RowModel<TGenerics>
113
+ getRow: (id: string) => Row<TGenerics>
114
+ _getDefaultColumnDef: () => Partial<ColumnDef<TGenerics>>
115
+ _getColumnDefs: () => ColumnDef<TGenerics>[]
116
+ _getAllFlatColumnsById: () => Record<string, Column<TGenerics>>
117
+ getAllColumns: () => Column<TGenerics>[]
118
+ getAllFlatColumns: () => Column<TGenerics>[]
119
+ getAllLeafColumns: () => Column<TGenerics>[]
120
+ getColumn: (columnId: string) => Column<TGenerics>
121
+ }
122
+
123
+ export function createTableInstance<TGenerics extends TableGenerics>(
124
+ options: TableOptionsResolved<TGenerics>
125
+ ): TableInstance<TGenerics> {
126
+ if (options.debugAll || options.debugTable) {
127
+ console.info('Creating Table Instance...')
128
+ }
129
+
130
+ let instance = { _features: features } as unknown as TableInstance<TGenerics>
131
+
132
+ const defaultOptions = instance._features.reduce((obj, feature) => {
133
+ return Object.assign(obj, feature.getDefaultOptions?.(instance))
134
+ }, {}) as TableOptionsResolved<TGenerics>
135
+
136
+ const mergeOptions = (options: TableOptionsResolved<TGenerics>) => {
137
+ if (instance.options.mergeOptions) {
138
+ return instance.options.mergeOptions(defaultOptions, options)
139
+ }
140
+
141
+ return {
142
+ ...defaultOptions,
143
+ ...options,
144
+ }
145
+ }
146
+
147
+ const coreInitialState: CoreTableState = {}
148
+
149
+ let initialState = {
150
+ ...coreInitialState,
151
+ ...(options.initialState ?? {}),
152
+ } as TableState
153
+
154
+ instance._features.forEach(feature => {
155
+ initialState = feature.getInitialState?.(initialState) ?? initialState
156
+ })
157
+
158
+ const queued: (() => void)[] = []
159
+ let queuedTimeout = false
160
+
161
+ const coreInstance: CoreInstance<TGenerics> = {
162
+ _features: features,
163
+ options: {
164
+ ...defaultOptions,
165
+ ...options,
166
+ },
167
+ initialState,
168
+ _queue: cb => {
169
+ queued.push(cb)
170
+
171
+ if (!queuedTimeout) {
172
+ queuedTimeout = true
173
+
174
+ // Schedule a microtask to run the queued callbacks after
175
+ // the current call stack (render, etc) has finished.
176
+ Promise.resolve()
177
+ .then(() => {
178
+ while (queued.length) {
179
+ queued.shift()!()
180
+ }
181
+ queuedTimeout = false
182
+ })
183
+ .catch(error =>
184
+ setTimeout(() => {
185
+ throw error
186
+ })
187
+ )
188
+ }
189
+ },
190
+ reset: () => {
191
+ instance.setState(instance.initialState)
192
+ },
193
+ setOptions: updater => {
194
+ const newOptions = functionalUpdate(updater, instance.options)
195
+ instance.options = mergeOptions(newOptions)
196
+ },
197
+ _render: (template, props) => {
198
+ if (typeof instance.options.render === 'function') {
199
+ return instance.options.render(template, props)
200
+ }
201
+
202
+ if (typeof template === 'function') {
203
+ return (template as Function)(props)
204
+ }
205
+
206
+ return template
207
+ },
208
+
209
+ getState: () => {
210
+ return instance.options.state as TableState
211
+ },
212
+
213
+ setState: (updater: Updater<TableState>) => {
214
+ instance.options.onStateChange?.(updater)
215
+ },
216
+
217
+ _getRowId: (
218
+ row: TGenerics['Row'],
219
+ index: number,
220
+ parent?: Row<TGenerics>
221
+ ) =>
222
+ instance.options.getRowId?.(row, index, parent) ??
223
+ `${parent ? [parent.id, index].join('.') : index}`,
224
+
225
+ getCoreRowModel: () => {
226
+ if (!instance._getCoreRowModel) {
227
+ instance._getCoreRowModel = instance.options.getCoreRowModel(instance)
228
+ }
229
+
230
+ return instance._getCoreRowModel()
231
+ },
232
+
233
+ // The final calls start at the bottom of the model,
234
+ // expanded rows, which then work their way up
235
+
236
+ getRowModel: () => {
237
+ return instance.getPaginationRowModel()
238
+ },
239
+ getRow: (id: string) => {
240
+ const row = instance.getRowModel().rowsById[id]
241
+
242
+ if (!row) {
243
+ if (process.env.NODE_ENV !== 'production') {
244
+ throw new Error(`getRow expected an ID, but got ${id}`)
245
+ }
246
+ throw new Error()
247
+ }
248
+
249
+ return row
250
+ },
251
+ _getDefaultColumnDef: memo(
252
+ () => [instance.options.defaultColumn],
253
+ defaultColumn => {
254
+ defaultColumn = (defaultColumn ?? {}) as Partial<ColumnDef<TGenerics>>
255
+
256
+ return {
257
+ header: props => props.header.column.id,
258
+ footer: props => props.header.column.id,
259
+ cell: props => props.getValue().toString?.() ?? null,
260
+ ...instance._features.reduce((obj, feature) => {
261
+ return Object.assign(obj, feature.getDefaultColumnDef?.())
262
+ }, {}),
263
+ ...defaultColumn,
264
+ } as Partial<ColumnDef<TGenerics>>
265
+ },
266
+ {
267
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
268
+ key: process.env.NODE_ENV === 'development' && 'getDefaultColumnDef',
269
+ }
270
+ ),
271
+
272
+ _getColumnDefs: () => instance.options.columns,
273
+
274
+ getAllColumns: memo(
275
+ () => [instance._getColumnDefs()],
276
+ columnDefs => {
277
+ const recurseColumns = (
278
+ columnDefs: ColumnDef<TGenerics>[],
279
+ parent?: Column<TGenerics>,
280
+ depth = 0
281
+ ): Column<TGenerics>[] => {
282
+ return columnDefs.map(columnDef => {
283
+ const column = createColumn(instance, columnDef, depth, parent)
284
+
285
+ column.columns = columnDef.columns
286
+ ? recurseColumns(columnDef.columns, column, depth + 1)
287
+ : []
288
+
289
+ return column
290
+ })
291
+ }
292
+
293
+ return recurseColumns(columnDefs)
294
+ },
295
+ {
296
+ key: process.env.NODE_ENV === 'development' && 'getAllColumns',
297
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
298
+ }
299
+ ),
300
+
301
+ getAllFlatColumns: memo(
302
+ () => [instance.getAllColumns()],
303
+ allColumns => {
304
+ return allColumns.flatMap(column => {
305
+ return column.getFlatColumns()
306
+ })
307
+ },
308
+ {
309
+ key: process.env.NODE_ENV === 'development' && 'getAllFlatColumns',
310
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
311
+ }
312
+ ),
313
+
314
+ _getAllFlatColumnsById: memo(
315
+ () => [instance.getAllFlatColumns()],
316
+ flatColumns => {
317
+ return flatColumns.reduce((acc, column) => {
318
+ acc[column.id] = column
319
+ return acc
320
+ }, {} as Record<string, Column<TGenerics>>)
321
+ },
322
+ {
323
+ key: process.env.NODE_ENV === 'development' && 'getAllFlatColumnsById',
324
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
325
+ }
326
+ ),
327
+
328
+ getAllLeafColumns: memo(
329
+ () => [instance.getAllColumns(), instance._getOrderColumnsFn()],
330
+ (allColumns, orderColumns) => {
331
+ let leafColumns = allColumns.flatMap(column => column.getLeafColumns())
332
+ return orderColumns(leafColumns)
333
+ },
334
+ {
335
+ key: process.env.NODE_ENV === 'development' && 'getAllLeafColumns',
336
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
337
+ }
338
+ ),
339
+
340
+ getColumn: columnId => {
341
+ const column = instance._getAllFlatColumnsById()[columnId]
342
+
343
+ if (!column) {
344
+ if (process.env.NODE_ENV !== 'production') {
345
+ console.warn(`[Table] Column with id ${columnId} does not exist.`)
346
+ }
347
+ throw new Error()
348
+ }
349
+
350
+ return column
351
+ },
352
+ }
353
+
354
+ Object.assign(instance, coreInstance)
355
+
356
+ instance._features.forEach(feature => {
357
+ return Object.assign(instance, feature.createInstance?.(instance))
358
+ })
359
+
360
+ return instance
361
+ }
@@ -0,0 +1,85 @@
1
+ import { Cell, Row, TableGenerics, TableInstance } from '../types'
2
+ import { flattenBy, memo } from '../utils'
3
+ import { createCell } from './cell'
4
+
5
+ export type CoreRow<TGenerics extends TableGenerics> = {
6
+ id: string
7
+ index: number
8
+ original?: TGenerics['Row']
9
+ depth: number
10
+ _valuesCache: Record<string, any>
11
+ getValue: (columnId: string) => any
12
+ subRows: Row<TGenerics>[]
13
+ getLeafRows: () => Row<TGenerics>[]
14
+ originalSubRows?: TGenerics['Row'][]
15
+ getAllCells: () => Cell<TGenerics>[]
16
+ _getAllCellsByColumnId: () => Record<string, Cell<TGenerics>>
17
+ }
18
+
19
+ export const createRow = <TGenerics extends TableGenerics>(
20
+ instance: TableInstance<TGenerics>,
21
+ id: string,
22
+ original: TGenerics['Row'] | undefined,
23
+ rowIndex: number,
24
+ depth: number,
25
+ subRows?: Row<TGenerics>[]
26
+ ): Row<TGenerics> => {
27
+ let row: CoreRow<TGenerics> = {
28
+ id,
29
+ index: rowIndex,
30
+ original,
31
+ depth,
32
+ _valuesCache: {},
33
+ getValue: columnId => {
34
+ if (row._valuesCache.hasOwnProperty(columnId)) {
35
+ return row._valuesCache[columnId]
36
+ }
37
+
38
+ const column = instance.getColumn(columnId)
39
+
40
+ if (!column.accessorFn) {
41
+ return undefined
42
+ }
43
+
44
+ row._valuesCache[columnId] = column.accessorFn(row.original, rowIndex)
45
+
46
+ return row._valuesCache[columnId]
47
+ },
48
+ subRows: subRows ?? [],
49
+ getLeafRows: () => flattenBy(row.subRows, d => d.subRows),
50
+ getAllCells: memo(
51
+ () => [instance.getAllLeafColumns()],
52
+ leafColumns => {
53
+ return leafColumns.map(column => {
54
+ return createCell(instance, row as Row<TGenerics>, column, column.id)
55
+ })
56
+ },
57
+ {
58
+ key: process.env.NODE_ENV === 'development' && 'row.getAllCells',
59
+ debug: () => instance.options.debugAll ?? instance.options.debugRows,
60
+ }
61
+ ),
62
+
63
+ _getAllCellsByColumnId: memo(
64
+ () => [row.getAllCells()],
65
+ allCells => {
66
+ return allCells.reduce((acc, cell) => {
67
+ acc[cell.column.id] = cell
68
+ return acc
69
+ }, {} as Record<string, Cell<TGenerics>>)
70
+ },
71
+ {
72
+ key:
73
+ process.env.NODE_ENV === 'production' && 'row.getAllCellsByColumnId',
74
+ debug: () => instance.options.debugAll ?? instance.options.debugRows,
75
+ }
76
+ ),
77
+ }
78
+
79
+ for (let i = 0; i < instance._features.length; i++) {
80
+ const feature = instance._features[i]
81
+ Object.assign(row, feature?.createRow?.(row, instance))
82
+ }
83
+
84
+ return row as Row<TGenerics>
85
+ }
@@ -0,0 +1,188 @@
1
+ import { CustomFilterFns, FilterFn } from './features/Filters'
2
+ import { AggregationFn, CustomAggregationFns } from './features/Grouping'
3
+ import { CustomSortingFns, SortingFn } from './features/Sorting'
4
+ import {
5
+ ColumnDef,
6
+ AccessorFn,
7
+ AnyRender,
8
+ TableGenerics,
9
+ TableOptionsResolved,
10
+ TableOptions,
11
+ } from './types'
12
+ import { IfDefined, Overwrite } from './utils'
13
+
14
+ export type TableFactory<TGenerics extends TableGenerics> =
15
+ () => Table<TGenerics>
16
+
17
+ export type CreateTableOptions<
18
+ TRender extends AnyRender,
19
+ TFilterFns extends CustomFilterFns<any>,
20
+ TSortingFns extends CustomSortingFns<any>,
21
+ TAggregationFns extends CustomAggregationFns<any>,
22
+ TGenerics extends TableGenerics
23
+ > = Partial<
24
+ {
25
+ render?: TRender
26
+ filterFns?: TFilterFns
27
+ sortingFns?: TSortingFns
28
+ aggregationFns?: TAggregationFns
29
+ } & Omit<
30
+ TableOptionsResolved<TGenerics>,
31
+ 'filterFns' | 'sortingFns' | 'aggregationFns'
32
+ >
33
+ >
34
+
35
+ export type Table<TGenerics extends TableGenerics> = {
36
+ generics: TGenerics
37
+ options: Partial<TableOptionsResolved<TGenerics>>
38
+ // setGenerics: <T extends TableGenerics>() => Table<T>
39
+ setRowType: <TRow>() => Table<Overwrite<TGenerics, { Row: TRow }>>
40
+ setTableMetaType: <TTableMeta>() => Table<
41
+ Overwrite<TGenerics, { TableMeta: TTableMeta }>
42
+ >
43
+ setColumnMetaType: <TColumnMeta>() => Table<
44
+ Overwrite<TGenerics, { ColumnMeta: TColumnMeta }>
45
+ >
46
+ setFilterMetaType: <TFilterMeta>() => Table<
47
+ Overwrite<TGenerics, { FilterMeta: TFilterMeta }>
48
+ >
49
+ setOptions: <
50
+ TFilterFns extends Record<string, FilterFn<TGenerics>>,
51
+ TSortingFns extends Record<string, SortingFn<TGenerics>>,
52
+ TAggregationFns extends Record<string, AggregationFn<TGenerics>>
53
+ >(
54
+ options: CreateTableOptions<
55
+ any,
56
+ TFilterFns,
57
+ TSortingFns,
58
+ TAggregationFns,
59
+ TGenerics
60
+ >
61
+ ) => Table<
62
+ Overwrite<
63
+ TGenerics,
64
+ {
65
+ FilterFns: IfDefined<TFilterFns, TGenerics['FilterFns']>
66
+ SortingFns: IfDefined<TSortingFns, TGenerics['SortingFns']>
67
+ AggregationFns: IfDefined<TAggregationFns, TGenerics['AggregationFns']>
68
+ }
69
+ >
70
+ >
71
+ createGroup: (
72
+ column: Overwrite<
73
+ | Overwrite<
74
+ ColumnDef<any>,
75
+ {
76
+ header: string
77
+ id?: string
78
+ }
79
+ >
80
+ | Overwrite<
81
+ ColumnDef<any>,
82
+ {
83
+ id: string
84
+ header?: string | ((...any: any) => any)
85
+ }
86
+ >,
87
+ {
88
+ accessorFn?: never
89
+ accessorKey?: never
90
+ columns?: ColumnDef<any>[]
91
+ }
92
+ >
93
+ ) => ColumnDef<TGenerics>
94
+ createDisplayColumn: (
95
+ column: Omit<ColumnDef<TGenerics>, 'columns'>
96
+ ) => ColumnDef<TGenerics>
97
+ createDataColumn: <
98
+ TAccessor extends AccessorFn<TGenerics['Row']> | keyof TGenerics['Row']
99
+ >(
100
+ accessor: TAccessor,
101
+ column: Overwrite<
102
+ TAccessor extends (...args: any[]) => any
103
+ ? // Accessor Fn
104
+ ColumnDef<Overwrite<TGenerics, { Value: ReturnType<TAccessor> }>>
105
+ : TAccessor extends keyof TGenerics['Row']
106
+ ? // Accessor Key
107
+ Overwrite<
108
+ ColumnDef<
109
+ Overwrite<TGenerics, { Value: TGenerics['Row'][TAccessor] }>
110
+ >,
111
+ {
112
+ id?: string
113
+ }
114
+ >
115
+ : never,
116
+ {
117
+ accessorFn?: never
118
+ accessorKey?: never
119
+ columns?: ColumnDef<any>[]
120
+ }
121
+ >
122
+ ) => ColumnDef<TGenerics>
123
+ createOptions: (options: TableOptions<TGenerics>) => TableOptions<TGenerics>
124
+ }
125
+
126
+ //
127
+
128
+ export function createTableFactory<TRenderer extends AnyRender>(opts: {
129
+ render: TRenderer
130
+ }): () => Table<{ Renderer: TRenderer; Rendered: ReturnType<TRenderer> }> {
131
+ return () => createTable(undefined, undefined, opts)
132
+ }
133
+
134
+ // A lot of returns in here are `as any` for a reason. Unless you
135
+ // can find a better way to do this, then don't worry about them
136
+ function createTable<TGenerics extends TableGenerics>(
137
+ _?: undefined,
138
+ __?: undefined,
139
+ options?: CreateTableOptions<any, any, any, any, TGenerics>
140
+ ): Table<TGenerics> {
141
+ const table: Table<TGenerics> = {
142
+ generics: undefined!,
143
+ options: options ?? {
144
+ render: (() => {
145
+ throw new Error('')
146
+ })(),
147
+ },
148
+ // setGenerics: () => table as any,
149
+ setRowType: () => table as any,
150
+ setTableMetaType: () => table as any,
151
+ setColumnMetaType: () => table as any,
152
+ setFilterMetaType: () => table as any,
153
+ setOptions: newOptions =>
154
+ createTable(_, __, {
155
+ ...options,
156
+ ...newOptions,
157
+ } as any),
158
+ createDisplayColumn: column => ({ ...column, columnDefType: 'display' }),
159
+ createGroup: column => ({ ...column, columnDefType: 'group' } as any),
160
+ createDataColumn: (accessor, column): any => {
161
+ column = {
162
+ ...column,
163
+ columnDefType: 'data',
164
+ id: column.id,
165
+ }
166
+
167
+ if (typeof accessor === 'string') {
168
+ return {
169
+ ...column,
170
+ id: column.id ?? accessor,
171
+ accessorKey: accessor,
172
+ }
173
+ }
174
+
175
+ if (typeof accessor === 'function') {
176
+ return {
177
+ ...column,
178
+ accessorFn: accessor,
179
+ }
180
+ }
181
+
182
+ throw new Error('Invalid accessor')
183
+ },
184
+ createOptions: options => options,
185
+ }
186
+
187
+ return table
188
+ }