@tanstack/table-core 8.5.18 → 8.5.20

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 (49) hide show
  1. package/build/cjs/columnHelper.js.map +1 -1
  2. package/build/cjs/core/cell.js.map +1 -1
  3. package/build/cjs/core/column.js.map +1 -1
  4. package/build/cjs/core/headers.js.map +1 -1
  5. package/build/cjs/core/row.js.map +1 -1
  6. package/build/cjs/core/table.js.map +1 -1
  7. package/build/cjs/features/ColumnSizing.js.map +1 -1
  8. package/build/cjs/features/Expanding.js.map +1 -1
  9. package/build/cjs/features/Filters.js.map +1 -1
  10. package/build/cjs/features/Grouping.js.map +1 -1
  11. package/build/cjs/features/Ordering.js.map +1 -1
  12. package/build/cjs/features/Pagination.js.map +1 -1
  13. package/build/cjs/features/Pinning.js.map +1 -1
  14. package/build/cjs/features/RowSelection.js.map +1 -1
  15. package/build/cjs/features/Sorting.js.map +1 -1
  16. package/build/cjs/features/Visibility.js.map +1 -1
  17. package/build/cjs/utils/getSortedRowModel.js +1 -1
  18. package/build/cjs/utils/getSortedRowModel.js.map +1 -1
  19. package/build/cjs/utils.js +0 -4
  20. package/build/cjs/utils.js.map +1 -1
  21. package/build/esm/index.js +1 -5
  22. package/build/esm/index.js.map +1 -1
  23. package/build/stats-html.html +1 -1
  24. package/build/stats-react.json +314 -314
  25. package/build/types/index.d.ts +253 -199
  26. package/build/umd/index.development.js +1 -5
  27. package/build/umd/index.development.js.map +1 -1
  28. package/build/umd/index.production.js +1 -1
  29. package/build/umd/index.production.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/columnHelper.ts +27 -20
  32. package/src/core/cell.ts +3 -3
  33. package/src/core/column.ts +2 -5
  34. package/src/core/headers.ts +5 -5
  35. package/src/core/row.ts +1 -1
  36. package/src/core/table.ts +6 -7
  37. package/src/features/ColumnSizing.ts +8 -8
  38. package/src/features/Expanding.ts +4 -4
  39. package/src/features/Filters.ts +17 -11
  40. package/src/features/Grouping.ts +16 -10
  41. package/src/features/Ordering.ts +5 -5
  42. package/src/features/Pagination.ts +6 -6
  43. package/src/features/Pinning.ts +8 -8
  44. package/src/features/RowSelection.ts +4 -4
  45. package/src/features/Sorting.ts +15 -9
  46. package/src/features/Visibility.ts +7 -7
  47. package/src/types.ts +133 -110
  48. package/src/utils/getSortedRowModel.ts +1 -1
  49. package/src/utils.ts +59 -46
@@ -20,18 +20,18 @@ import { isFunction, makeStateUpdater } from '../utils'
20
20
 
21
21
  export type SortDirection = 'asc' | 'desc'
22
22
 
23
- export type ColumnSort = {
23
+ export interface ColumnSort {
24
24
  id: string
25
25
  desc: boolean
26
26
  }
27
27
 
28
28
  export type SortingState = ColumnSort[]
29
29
 
30
- export type SortingTableState = {
30
+ export interface SortingTableState {
31
31
  sorting: SortingState
32
32
  }
33
33
 
34
- export type SortingFn<TData extends RowData> = {
34
+ export interface SortingFn<TData extends RowData> {
35
35
  (rowA: Row<TData>, rowB: Row<TData>, columnId: string): number
36
36
  }
37
37
 
@@ -46,7 +46,7 @@ export type SortingFnOption<TData extends RowData> =
46
46
  | BuiltInSortingFn
47
47
  | SortingFn<TData>
48
48
 
49
- export type SortingColumnDef<TData extends RowData> = {
49
+ export interface SortingColumnDef<TData extends RowData> {
50
50
  sortingFn?: SortingFnOption<TData>
51
51
  sortDescFirst?: boolean
52
52
  enableSorting?: boolean
@@ -55,7 +55,7 @@ export type SortingColumnDef<TData extends RowData> = {
55
55
  sortUndefined?: false | -1 | 1
56
56
  }
57
57
 
58
- export type SortingColumn<TData extends RowData> = {
58
+ export interface SortingColumn<TData extends RowData> {
59
59
  getAutoSortingFn: () => SortingFn<TData>
60
60
  getAutoSortDir: () => SortDirection
61
61
  getSortingFn: () => SortingFn<TData>
@@ -70,7 +70,7 @@ export type SortingColumn<TData extends RowData> = {
70
70
  getToggleSortingHandler: () => undefined | ((event: unknown) => void)
71
71
  }
72
72
 
73
- export type SortingOptions<TData extends RowData> = {
73
+ interface SortingOptionsBase {
74
74
  manualSorting?: boolean
75
75
  onSortingChange?: OnChangeFn<SortingState>
76
76
  enableSorting?: boolean
@@ -81,15 +81,21 @@ export type SortingOptions<TData extends RowData> = {
81
81
  getSortedRowModel?: (table: Table<any>) => () => RowModel<any>
82
82
  maxMultiSortColCount?: number
83
83
  isMultiSortEvent?: (e: unknown) => boolean
84
- } & (keyof SortingFns extends never
84
+ }
85
+
86
+ type ResolvedSortingFns = keyof SortingFns extends never
85
87
  ? {
86
88
  sortingFns?: Record<string, SortingFn<any>>
87
89
  }
88
90
  : {
89
91
  sortingFns: Record<keyof SortingFns, SortingFn<any>>
90
- })
92
+ }
93
+
94
+ export interface SortingOptions<TData extends RowData>
95
+ extends SortingOptionsBase,
96
+ ResolvedSortingFns {}
91
97
 
92
- export type SortingInstance<TData extends RowData> = {
98
+ export interface SortingInstance<TData extends RowData> {
93
99
  setSorting: (updater: Updater<SortingState>) => void
94
100
  resetSorting: (defaultState?: boolean) => void
95
101
  getPreSortedRowModel: () => RowModel<TData>
@@ -12,20 +12,20 @@ import { makeStateUpdater, memo } from '../utils'
12
12
 
13
13
  export type VisibilityState = Record<string, boolean>
14
14
 
15
- export type VisibilityTableState = {
15
+ export interface VisibilityTableState {
16
16
  columnVisibility: VisibilityState
17
17
  }
18
18
 
19
- export type VisibilityOptions = {
19
+ export interface VisibilityOptions {
20
20
  onColumnVisibilityChange?: OnChangeFn<VisibilityState>
21
21
  enableHiding?: boolean
22
22
  }
23
23
 
24
- export type VisibilityDefaultOptions = {
24
+ export interface VisibilityDefaultOptions {
25
25
  onColumnVisibilityChange: OnChangeFn<VisibilityState>
26
26
  }
27
27
 
28
- export type VisibilityInstance<TData extends RowData> = {
28
+ export interface VisibilityInstance<TData extends RowData> {
29
29
  getVisibleFlatColumns: () => Column<TData, unknown>[]
30
30
  getVisibleLeafColumns: () => Column<TData, unknown>[]
31
31
  getLeftVisibleLeafColumns: () => Column<TData, unknown>[]
@@ -39,16 +39,16 @@ export type VisibilityInstance<TData extends RowData> = {
39
39
  getToggleAllColumnsVisibilityHandler: () => (event: unknown) => void
40
40
  }
41
41
 
42
- export type VisibilityColumnDef = {
42
+ export interface VisibilityColumnDef {
43
43
  enableHiding?: boolean
44
44
  }
45
45
 
46
- export type VisibilityRow<TData extends RowData> = {
46
+ export interface VisibilityRow<TData extends RowData> {
47
47
  _getAllVisibleCells: () => Cell<TData, unknown>[]
48
48
  getVisibleCells: () => Cell<TData, unknown>[]
49
49
  }
50
50
 
51
- export type VisibilityColumn = {
51
+ export interface VisibilityColumn {
52
52
  getCanHide: () => boolean
53
53
  getIsVisible: () => boolean
54
54
  toggleVisibility: (value?: boolean) => void
package/src/types.ts CHANGED
@@ -27,7 +27,6 @@ import {
27
27
  HeadersInstance,
28
28
  } from './core/headers'
29
29
  import {
30
- FilterFn,
31
30
  FiltersColumn,
32
31
  FiltersColumnDef,
33
32
  FiltersInstance,
@@ -43,7 +42,6 @@ import {
43
42
  SortingTableState,
44
43
  } from './features/Sorting'
45
44
  import {
46
- CustomAggregationFns,
47
45
  GroupingCell,
48
46
  GroupingColumn,
49
47
  GroupingColumnDef,
@@ -79,15 +77,20 @@ import {
79
77
  RowSelectionTableState,
80
78
  } from './features/RowSelection'
81
79
  import { CoreRow } from './core/row'
82
- import { DeepKeys, PartialKeys, UnionToIntersection } from './utils'
80
+ import { PartialKeys, UnionToIntersection } from './utils'
83
81
  import { CellContext, CoreCell } from './core/cell'
84
82
  import { CoreColumn } from './core/column'
85
83
 
86
84
  export interface TableMeta<TData extends RowData> {}
85
+
87
86
  export interface ColumnMeta<TData extends RowData, TValue> {}
87
+
88
88
  export interface FilterMeta {}
89
+
89
90
  export interface FilterFns {}
91
+
90
92
  export interface SortingFns {}
93
+
91
94
  export interface AggregationFns {}
92
95
 
93
96
  export type Updater<T> = T | ((old: T) => T)
@@ -97,71 +100,79 @@ export type RowData = unknown | object | any[]
97
100
 
98
101
  export type AnyRender = (Comp: any, props: any) => any
99
102
 
100
- export type Table<TData extends RowData> = CoreInstance<TData> &
101
- HeadersInstance<TData> &
102
- VisibilityInstance<TData> &
103
- ColumnOrderInstance<TData> &
104
- ColumnPinningInstance<TData> &
105
- FiltersInstance<TData> &
106
- SortingInstance<TData> &
107
- GroupingInstance<TData> &
108
- ColumnSizingInstance &
109
- ExpandedInstance<TData> &
110
- PaginationInstance<TData> &
111
- RowSelectionInstance<TData>
103
+ export interface Table<TData extends RowData>
104
+ extends CoreInstance<TData>,
105
+ HeadersInstance<TData>,
106
+ VisibilityInstance<TData>,
107
+ ColumnOrderInstance<TData>,
108
+ ColumnPinningInstance<TData>,
109
+ FiltersInstance<TData>,
110
+ SortingInstance<TData>,
111
+ GroupingInstance<TData>,
112
+ ColumnSizingInstance,
113
+ ExpandedInstance<TData>,
114
+ PaginationInstance<TData>,
115
+ RowSelectionInstance<TData> {}
116
+
117
+ interface FeatureOptions<TData extends RowData>
118
+ extends VisibilityOptions,
119
+ ColumnOrderOptions,
120
+ ColumnPinningOptions,
121
+ FiltersOptions<TData>,
122
+ SortingOptions<TData>,
123
+ GroupingOptions,
124
+ ExpandedOptions<TData>,
125
+ ColumnSizingOptions,
126
+ PaginationOptions,
127
+ RowSelectionOptions<TData> {}
112
128
 
113
129
  export type TableOptionsResolved<TData extends RowData> = CoreOptions<TData> &
114
- VisibilityOptions &
115
- ColumnOrderOptions &
116
- ColumnPinningOptions &
117
- FiltersOptions<TData> &
118
- SortingOptions<TData> &
119
- GroupingOptions &
120
- ExpandedOptions<TData> &
121
- ColumnSizingOptions &
122
- PaginationOptions &
123
- RowSelectionOptions<TData>
124
-
125
- export type TableOptions<TData extends RowData> = PartialKeys<
126
- TableOptionsResolved<TData>,
127
- 'state' | 'onStateChange' | 'renderFallbackValue'
128
- >
129
-
130
- export type TableState = CoreTableState &
131
- VisibilityTableState &
132
- ColumnOrderTableState &
133
- ColumnPinningTableState &
134
- FiltersTableState &
135
- SortingTableState &
136
- ExpandedTableState &
137
- GroupingTableState &
138
- ColumnSizingTableState &
139
- PaginationTableState &
140
- RowSelectionTableState
141
-
142
- export type InitialTableState = Partial<
143
- CoreTableState &
144
- VisibilityTableState &
145
- ColumnOrderTableState &
146
- ColumnPinningTableState &
147
- FiltersTableState &
148
- SortingTableState &
149
- ExpandedTableState &
150
- GroupingTableState &
151
- ColumnSizingTableState &
152
- PaginationInitialTableState &
153
- RowSelectionTableState
154
- >
155
-
156
- export type Row<TData extends RowData> = CoreRow<TData> &
157
- VisibilityRow<TData> &
158
- ColumnPinningRow<TData> &
159
- FiltersRow<TData> &
160
- GroupingRow &
161
- RowSelectionRow &
162
- ExpandedRow
163
-
164
- export type RowModel<TData extends RowData> = {
130
+ FeatureOptions<TData>
131
+
132
+ export interface TableOptions<TData extends RowData>
133
+ extends PartialKeys<
134
+ TableOptionsResolved<TData>,
135
+ 'state' | 'onStateChange' | 'renderFallbackValue'
136
+ > {}
137
+
138
+ export interface TableState
139
+ extends CoreTableState,
140
+ VisibilityTableState,
141
+ ColumnOrderTableState,
142
+ ColumnPinningTableState,
143
+ FiltersTableState,
144
+ SortingTableState,
145
+ ExpandedTableState,
146
+ GroupingTableState,
147
+ ColumnSizingTableState,
148
+ PaginationTableState,
149
+ RowSelectionTableState {}
150
+
151
+ interface CompleteInitialTableState
152
+ extends CoreTableState,
153
+ VisibilityTableState,
154
+ ColumnOrderTableState,
155
+ ColumnPinningTableState,
156
+ FiltersTableState,
157
+ SortingTableState,
158
+ ExpandedTableState,
159
+ GroupingTableState,
160
+ ColumnSizingTableState,
161
+ PaginationInitialTableState,
162
+ RowSelectionTableState {}
163
+
164
+ export interface InitialTableState extends Partial<CompleteInitialTableState> {}
165
+
166
+ export interface Row<TData extends RowData>
167
+ extends CoreRow<TData>,
168
+ VisibilityRow<TData>,
169
+ ColumnPinningRow<TData>,
170
+ FiltersRow<TData>,
171
+ GroupingRow,
172
+ RowSelectionRow,
173
+ ExpandedRow {}
174
+
175
+ export interface RowModel<TData extends RowData> {
165
176
  rows: Row<TData>[]
166
177
  flatRows: Row<TData>[]
167
178
  rowsById: Record<string, Row<TData>>
@@ -180,12 +191,12 @@ export type StringOrTemplateHeader<TData, TValue> =
180
191
  | string
181
192
  | ColumnDefTemplate<HeaderContext<TData, TValue>>
182
193
 
183
- type StringHeaderIdentifier = {
194
+ interface StringHeaderIdentifier {
184
195
  header: string
185
196
  id?: string
186
197
  }
187
198
 
188
- type IdIdentifier<TData extends RowData, TValue> = {
199
+ interface IdIdentifier<TData extends RowData, TValue> {
189
200
  id: string
190
201
  header?: StringOrTemplateHeader<TData, TValue>
191
202
  }
@@ -196,24 +207,26 @@ type ColumnIdentifiers<TData extends RowData, TValue> =
196
207
 
197
208
  //
198
209
 
199
- export type ColumnDefBase<TData extends RowData, TValue = unknown> = {
210
+ interface ColumnDefExtensions<TData extends RowData, TValue = unknown>
211
+ extends VisibilityColumnDef,
212
+ ColumnPinningColumnDef,
213
+ FiltersColumnDef<TData>,
214
+ SortingColumnDef<TData>,
215
+ GroupingColumnDef<TData, TValue>,
216
+ ColumnSizingColumnDef {}
217
+
218
+ export interface ColumnDefBase<TData extends RowData, TValue = unknown>
219
+ extends ColumnDefExtensions<TData, TValue> {
200
220
  getUniqueValues?: AccessorFn<TData, unknown[]>
201
221
  footer?: ColumnDefTemplate<HeaderContext<TData, TValue>>
202
222
  cell?: ColumnDefTemplate<CellContext<TData, TValue>>
203
223
  meta?: ColumnMeta<TData, TValue>
204
- } & VisibilityColumnDef &
205
- ColumnPinningColumnDef &
206
- FiltersColumnDef<TData> &
207
- SortingColumnDef<TData> &
208
- GroupingColumnDef<TData, TValue> &
209
- ColumnSizingColumnDef
224
+ }
210
225
 
211
226
  //
212
227
 
213
- export type IdentifiedColumnDef<
214
- TData extends RowData,
215
- TValue = unknown
216
- > = ColumnDefBase<TData, TValue> & {
228
+ export interface IdentifiedColumnDef<TData extends RowData, TValue = unknown>
229
+ extends ColumnDefBase<TData, TValue> {
217
230
  id?: string
218
231
  header?: StringOrTemplateHeader<TData, TValue>
219
232
  }
@@ -223,28 +236,37 @@ export type DisplayColumnDef<
223
236
  TValue = unknown
224
237
  > = ColumnDefBase<TData, TValue> & ColumnIdentifiers<TData, TValue>
225
238
 
239
+ interface GroupColumnDefBase<TData extends RowData, TValue = unknown>
240
+ extends ColumnDefBase<TData, TValue> {
241
+ columns?: ColumnDef<TData, any>[]
242
+ }
243
+
226
244
  export type GroupColumnDef<
227
245
  TData extends RowData,
228
246
  TValue = unknown
229
- > = ColumnDefBase<TData, TValue> &
230
- ColumnIdentifiers<TData, TValue> & {
231
- columns?: ColumnDef<TData, any>[]
232
- }
247
+ > = GroupColumnDefBase<TData, TValue> & ColumnIdentifiers<TData, TValue>
248
+
249
+ interface AccessorFnColumnDefBase<TData extends RowData, TValue = unknown>
250
+ extends ColumnDefBase<TData, TValue> {
251
+ accessorFn: AccessorFn<TData, TValue>
252
+ }
233
253
 
234
254
  export type AccessorFnColumnDef<
235
255
  TData extends RowData,
236
256
  TValue = unknown
237
- > = ColumnDefBase<TData, TValue> &
238
- ColumnIdentifiers<TData, TValue> & {
239
- accessorFn: AccessorFn<TData, TValue>
240
- }
257
+ > = AccessorFnColumnDefBase<TData, TValue> & ColumnIdentifiers<TData, TValue>
241
258
 
242
- export type AccessorKeyColumnDef<TData extends RowData, TValue = unknown> = {
259
+ interface AccessorKeyColumnDefBase<TData extends RowData, TValue = unknown>
260
+ extends ColumnDefBase<TData, TValue> {
243
261
  id?: string
244
- } & Partial<ColumnIdentifiers<TData, TValue>> &
245
- ColumnDefBase<TData, TValue> & {
246
- accessorKey: string | keyof TData
247
- }
262
+ accessorKey: string | keyof TData
263
+ }
264
+
265
+ export type AccessorKeyColumnDef<
266
+ TData extends RowData,
267
+ TValue = unknown
268
+ > = AccessorKeyColumnDefBase<TData, TValue> &
269
+ Partial<ColumnIdentifiers<TData, TValue>>
248
270
 
249
271
  export type AccessorColumnDef<TData extends RowData, TValue = unknown> =
250
272
  | AccessorKeyColumnDef<TData, TValue>
@@ -264,21 +286,22 @@ export type ColumnDefResolved<
264
286
  accessorKey?: string
265
287
  }
266
288
 
267
- export type Column<TData extends RowData, TValue = unknown> = CoreColumn<
268
- TData,
269
- TValue
270
- > &
271
- ColumnVisibilityColumn &
272
- ColumnPinningColumn &
273
- FiltersColumn<TData> &
274
- SortingColumn<TData> &
275
- GroupingColumn<TData> &
276
- ColumnSizingColumn
277
-
278
- export type Cell<TData extends RowData, TValue> = CoreCell<TData, TValue> &
279
- GroupingCell
280
-
281
- export type Header<TData extends RowData, TValue> = CoreHeader<TData, TValue> &
282
- ColumnSizingHeader
283
-
284
- export type HeaderGroup<TData extends RowData> = CoreHeaderGroup<TData>
289
+ export interface Column<TData extends RowData, TValue = unknown>
290
+ extends CoreColumn<TData, TValue>,
291
+ ColumnVisibilityColumn,
292
+ ColumnPinningColumn,
293
+ FiltersColumn<TData>,
294
+ SortingColumn<TData>,
295
+ GroupingColumn<TData>,
296
+ ColumnSizingColumn {}
297
+
298
+ export interface Cell<TData extends RowData, TValue>
299
+ extends CoreCell<TData, TValue>,
300
+ GroupingCell {}
301
+
302
+ export interface Header<TData extends RowData, TValue>
303
+ extends CoreHeader<TData, TValue>,
304
+ ColumnSizingHeader {}
305
+
306
+ export interface HeaderGroup<TData extends RowData>
307
+ extends CoreHeaderGroup<TData> {}
@@ -44,7 +44,7 @@ export function getSortedRowModel<TData extends RowData>(): (
44
44
  const sortData = (rows: Row<TData>[]) => {
45
45
  // This will also perform a stable sorting using the row index
46
46
  // if needed.
47
- const sortedData = rows.slice()
47
+ const sortedData = [...rows]
48
48
 
49
49
  sortedData.sort((rowA, rowB) => {
50
50
  for (let i = 0; i < availableSorting.length; i += 1) {
package/src/utils.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  import { TableState, Updater } from './types'
2
2
 
3
- export type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
4
- export type RequiredKeys<T, K extends keyof T> = Omit<T, K> &
5
- Required<Pick<T, K>>
3
+ export type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<T>
4
+ export type RequiredKeys<T, K extends keyof T> = T & { [P in K]-?: T[P] }
6
5
  export type Overwrite<T, U extends { [TKey in keyof T]?: any }> = Omit<
7
6
  T,
8
7
  keyof U
@@ -18,54 +17,68 @@ export type UnionToIntersection<T> = (
18
17
  export type IsAny<T, Y, N> = 1 extends 0 & T ? Y : N
19
18
  export type IsKnown<T, Y, N> = unknown extends T ? N : Y
20
19
 
21
- type ComputeRange<
22
- N extends number,
23
- Result extends Array<unknown> = []
24
- > = Result['length'] extends N
25
- ? Result
26
- : ComputeRange<N, [...Result, Result['length']]>
27
- type Index40 = ComputeRange<40>[number]
28
-
29
- // Is this type a tuple?
30
- type IsTuple<T> = T extends readonly any[] & { length: infer Length }
31
- ? Length extends Index40
32
- ? T
20
+ type IndexableData = Record<string | number, any>
21
+ export type DeepValue<T, TProp> = T extends IndexableData
22
+ ? TProp extends `${infer TBranch}.${infer TDeepProp}`
23
+ ? DeepValue<T[TBranch], TDeepProp>
24
+ : TProp extends keyof T
25
+ ? T[TProp]
33
26
  : never
34
27
  : never
35
28
 
36
- // If this type is a tuple, what indices are allowed?
37
- type AllowedIndexes<
38
- Tuple extends ReadonlyArray<any>,
39
- Keys extends number = never
40
- > = Tuple extends readonly []
41
- ? Keys
42
- : Tuple extends readonly [infer _, ...infer Tail]
43
- ? AllowedIndexes<Tail, Keys | Tail['length']>
44
- : Keys
45
-
46
- export type DeepKeys<T> = unknown extends T
47
- ? keyof T
48
- : object extends T
49
- ? string
50
- : T extends readonly any[] & IsTuple<T>
51
- ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>>
52
- : T extends any[]
53
- ? never & 'Dynamic length array indexing is not supported'
54
- : T extends Date
55
- ? never
56
- : T extends object
57
- ? (keyof T & string) | DeepKeysPrefix<T, keyof T>
58
- : never
59
-
60
- type DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string)
61
- ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}`
29
+ type Join<K, P> = K extends string | number
30
+ ? P extends string | number
31
+ ? `${K}${'' extends P ? '' : '.'}${P}`
32
+ : never
62
33
  : never
63
34
 
64
- export type DeepValue<T, TProp> = T extends Record<string | number, any>
65
- ? TProp extends `${infer TBranch}.${infer TDeepProp}`
66
- ? DeepValue<T[TBranch], TDeepProp>
67
- : T[TProp & string]
68
- : never
35
+ type Prev = [
36
+ never,
37
+ 0,
38
+ 1,
39
+ 2,
40
+ 3,
41
+ 4,
42
+ 5,
43
+ 6,
44
+ 7,
45
+ 8,
46
+ 9,
47
+ 10,
48
+ 11,
49
+ 12,
50
+ 13,
51
+ 14,
52
+ 15,
53
+ 16,
54
+ 17,
55
+ 18,
56
+ 19,
57
+ 20,
58
+ ...0[]
59
+ ]
60
+
61
+ type ExplicitLeaves =
62
+ | Date
63
+ | Number
64
+ | BigInt
65
+ | String
66
+ | Set<unknown>
67
+ | Map<unknown, unknown>
68
+ | WeakSet<object>
69
+ | WeakMap<object, unknown>
70
+
71
+ export type DeepKeys<T, D extends number = 10> = [D] extends [never]
72
+ ? never
73
+ : T extends ExplicitLeaves
74
+ ? never
75
+ : T extends object
76
+ ? {
77
+ [K in keyof T]-?: K extends string | number
78
+ ? `${K}` | Join<K, DeepKeys<T[K], Prev[D]>>
79
+ : never
80
+ }[keyof T]
81
+ : ''
69
82
 
70
83
  export type NoInfer<T> = [T][T extends any ? 0 : never]
71
84