@tanstack/vue-table 9.0.0-beta.6 → 9.0.0-beta.61

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 (61) hide show
  1. package/README.md +2 -0
  2. package/dist/FlexRender.d.ts +1 -2
  3. package/dist/FlexRender.js +5 -5
  4. package/dist/createTableHook.d.ts +39 -13
  5. package/dist/createTableHook.js +8 -23
  6. package/dist/experimental-worker-plugin.d.ts +1 -0
  7. package/dist/experimental-worker-plugin.js +3 -0
  8. package/dist/index.d.ts +2 -2
  9. package/dist/merge-proxy.js +1 -2
  10. package/dist/reactivity.js +3 -8
  11. package/dist/useTable.d.ts +2 -10
  12. package/dist/useTable.js +4 -9
  13. package/package.json +12 -20
  14. package/skills/create-table-hook/SKILL.md +146 -0
  15. package/skills/getting-started/SKILL.md +144 -0
  16. package/skills/migrate-v8-to-v9/SKILL.md +185 -0
  17. package/skills/table-state/SKILL.md +191 -0
  18. package/skills/with-tanstack-query/SKILL.md +127 -0
  19. package/skills/with-tanstack-virtual/SKILL.md +116 -0
  20. package/dist/FlexRender.cjs +0 -80
  21. package/dist/FlexRender.cjs.map +0 -1
  22. package/dist/FlexRender.d.cts +0 -63
  23. package/dist/FlexRender.js.map +0 -1
  24. package/dist/createTableHook.cjs +0 -194
  25. package/dist/createTableHook.cjs.map +0 -1
  26. package/dist/createTableHook.d.cts +0 -135
  27. package/dist/createTableHook.js.map +0 -1
  28. package/dist/flex-render.cjs +0 -5
  29. package/dist/flex-render.d.cts +0 -2
  30. package/dist/index.cjs +0 -17
  31. package/dist/index.d.cts +0 -5
  32. package/dist/merge-proxy.cjs +0 -77
  33. package/dist/merge-proxy.cjs.map +0 -1
  34. package/dist/merge-proxy.js.map +0 -1
  35. package/dist/reactivity.cjs +0 -64
  36. package/dist/reactivity.cjs.map +0 -1
  37. package/dist/reactivity.js.map +0 -1
  38. package/dist/static-functions.cjs +0 -9
  39. package/dist/static-functions.d.cts +0 -1
  40. package/dist/useTable.cjs +0 -76
  41. package/dist/useTable.cjs.map +0 -1
  42. package/dist/useTable.d.cts +0 -43
  43. package/dist/useTable.js.map +0 -1
  44. package/skills/vue/client-to-server/SKILL.md +0 -365
  45. package/skills/vue/compose-with-tanstack-form/SKILL.md +0 -369
  46. package/skills/vue/compose-with-tanstack-pacer/SKILL.md +0 -318
  47. package/skills/vue/compose-with-tanstack-query/SKILL.md +0 -385
  48. package/skills/vue/compose-with-tanstack-store/SKILL.md +0 -301
  49. package/skills/vue/compose-with-tanstack-virtual/SKILL.md +0 -340
  50. package/skills/vue/getting-started/SKILL.md +0 -409
  51. package/skills/vue/migrate-v8-to-v9/SKILL.md +0 -375
  52. package/skills/vue/production-readiness/SKILL.md +0 -271
  53. package/skills/vue/table-state/SKILL.md +0 -403
  54. package/src/FlexRender.ts +0 -138
  55. package/src/createTableHook.ts +0 -534
  56. package/src/flex-render.ts +0 -1
  57. package/src/index.ts +0 -4
  58. package/src/merge-proxy.ts +0 -132
  59. package/src/reactivity.ts +0 -89
  60. package/src/static-functions.ts +0 -1
  61. package/src/useTable.ts +0 -181
@@ -1,534 +0,0 @@
1
- import { createColumnHelper as coreCreateColumnHelper } from '@tanstack/table-core'
2
- import { defineComponent, h, inject, provide } from 'vue'
3
- import { FlexRender } from './FlexRender'
4
- import { mergeProxy } from './merge-proxy'
5
- import { useTable } from './useTable'
6
- import type { TableOptionsWithReactiveData, VueTable } from './useTable'
7
- import type { FlexRenderCell, FlexRenderHeader } from './FlexRender'
8
- import type { Component, InjectionKey, PropType, VNodeChild } from 'vue'
9
- import type {
10
- AccessorFn,
11
- AccessorFnColumnDef,
12
- AccessorKeyColumnDef,
13
- Cell,
14
- CellContext,
15
- CellData,
16
- Column,
17
- ColumnDef,
18
- DeepKeys,
19
- DeepValue,
20
- DisplayColumnDef,
21
- GroupColumnDef,
22
- Header,
23
- IdentifiedColumnDef,
24
- NoInfer,
25
- Row,
26
- RowData,
27
- Table,
28
- TableFeatures,
29
- TableState,
30
- } from '@tanstack/table-core'
31
-
32
- export type ComponentType<T extends Record<string, any>> = Component<T>
33
-
34
- export type AppCellContext<
35
- TFeatures extends TableFeatures,
36
- TData extends RowData,
37
- TValue extends CellData,
38
- TCellComponents extends Record<string, ComponentType<any>>,
39
- > = {
40
- cell: Cell<TFeatures, TData, TValue> &
41
- TCellComponents & { FlexRender: Component }
42
- column: Column<TFeatures, TData, TValue>
43
- getValue: CellContext<TFeatures, TData, TValue>['getValue']
44
- renderValue: CellContext<TFeatures, TData, TValue>['renderValue']
45
- row: Row<TFeatures, TData>
46
- table: Table<TFeatures, TData>
47
- }
48
-
49
- export type AppHeaderContext<
50
- TFeatures extends TableFeatures,
51
- TData extends RowData,
52
- TValue extends CellData,
53
- THeaderComponents extends Record<string, ComponentType<any>>,
54
- > = {
55
- column: Column<TFeatures, TData, TValue>
56
- header: Header<TFeatures, TData, TValue> &
57
- THeaderComponents & { FlexRender: Component }
58
- table: Table<TFeatures, TData>
59
- }
60
-
61
- export type AppColumnDefTemplate<TProps extends object> =
62
- | string
63
- | ((props: TProps) => any)
64
-
65
- export type AppColumnDefBase<
66
- TFeatures extends TableFeatures,
67
- TData extends RowData,
68
- TValue extends CellData,
69
- TCellComponents extends Record<string, ComponentType<any>>,
70
- THeaderComponents extends Record<string, ComponentType<any>>,
71
- > = Omit<
72
- IdentifiedColumnDef<TFeatures, TData, TValue>,
73
- 'cell' | 'header' | 'footer'
74
- > & {
75
- cell?: AppColumnDefTemplate<
76
- AppCellContext<TFeatures, TData, TValue, TCellComponents>
77
- >
78
- header?: AppColumnDefTemplate<
79
- AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>
80
- >
81
- footer?: AppColumnDefTemplate<
82
- AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>
83
- >
84
- }
85
-
86
- export type AppDisplayColumnDef<
87
- TFeatures extends TableFeatures,
88
- TData extends RowData,
89
- TCellComponents extends Record<string, ComponentType<any>>,
90
- THeaderComponents extends Record<string, ComponentType<any>>,
91
- > = Omit<
92
- DisplayColumnDef<TFeatures, TData, unknown>,
93
- 'cell' | 'header' | 'footer'
94
- > & {
95
- cell?: AppColumnDefTemplate<
96
- AppCellContext<TFeatures, TData, unknown, TCellComponents>
97
- >
98
- header?: AppColumnDefTemplate<
99
- AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>
100
- >
101
- footer?: AppColumnDefTemplate<
102
- AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>
103
- >
104
- }
105
-
106
- export type AppGroupColumnDef<
107
- TFeatures extends TableFeatures,
108
- TData extends RowData,
109
- TCellComponents extends Record<string, ComponentType<any>>,
110
- THeaderComponents extends Record<string, ComponentType<any>>,
111
- > = Omit<
112
- GroupColumnDef<TFeatures, TData, unknown>,
113
- 'cell' | 'header' | 'footer' | 'columns'
114
- > & {
115
- cell?: AppColumnDefTemplate<
116
- AppCellContext<TFeatures, TData, unknown, TCellComponents>
117
- >
118
- header?: AppColumnDefTemplate<
119
- AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>
120
- >
121
- footer?: AppColumnDefTemplate<
122
- AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>
123
- >
124
- columns?: Array<ColumnDef<TFeatures, TData, unknown>>
125
- }
126
-
127
- export type AppColumnHelper<
128
- TFeatures extends TableFeatures,
129
- TData extends RowData,
130
- TCellComponents extends Record<string, ComponentType<any>>,
131
- THeaderComponents extends Record<string, ComponentType<any>>,
132
- > = {
133
- accessor: <
134
- TAccessor extends AccessorFn<TData> | DeepKeys<TData>,
135
- TValue extends TAccessor extends AccessorFn<TData, infer TReturn>
136
- ? TReturn
137
- : TAccessor extends DeepKeys<TData>
138
- ? DeepValue<TData, TAccessor>
139
- : never,
140
- >(
141
- accessor: TAccessor,
142
- column: TAccessor extends AccessorFn<TData>
143
- ? AppColumnDefBase<
144
- TFeatures,
145
- TData,
146
- TValue,
147
- TCellComponents,
148
- THeaderComponents
149
- > & { id: string }
150
- : AppColumnDefBase<
151
- TFeatures,
152
- TData,
153
- TValue,
154
- TCellComponents,
155
- THeaderComponents
156
- >,
157
- ) => TAccessor extends AccessorFn<TData>
158
- ? AccessorFnColumnDef<TFeatures, TData, TValue>
159
- : AccessorKeyColumnDef<TFeatures, TData, TValue>
160
- columns: <TColumns extends ReadonlyArray<ColumnDef<TFeatures, TData, any>>>(
161
- columns: [...TColumns],
162
- ) => Array<ColumnDef<TFeatures, TData, any>> & [...TColumns]
163
- display: (
164
- column: AppDisplayColumnDef<
165
- TFeatures,
166
- TData,
167
- TCellComponents,
168
- THeaderComponents
169
- >,
170
- ) => DisplayColumnDef<TFeatures, TData, unknown>
171
- group: (
172
- column: AppGroupColumnDef<
173
- TFeatures,
174
- TData,
175
- TCellComponents,
176
- THeaderComponents
177
- >,
178
- ) => GroupColumnDef<TFeatures, TData, unknown>
179
- }
180
-
181
- export type CreateTableHookOptions<
182
- TFeatures extends TableFeatures,
183
- TTableComponents extends Record<string, ComponentType<any>>,
184
- TCellComponents extends Record<string, ComponentType<any>>,
185
- THeaderComponents extends Record<string, ComponentType<any>>,
186
- > = Omit<
187
- TableOptionsWithReactiveData<TFeatures, any>,
188
- 'columns' | 'data' | 'store' | 'state' | 'initialState'
189
- > & {
190
- tableComponents?: TTableComponents
191
- cellComponents?: TCellComponents
192
- headerComponents?: THeaderComponents
193
- }
194
-
195
- export interface AppTableProps {}
196
-
197
- export interface AppCellProps<
198
- TFeatures extends TableFeatures,
199
- TData extends RowData,
200
- TValue extends CellData = CellData,
201
- > {
202
- cell: Cell<TFeatures, TData, TValue>
203
- }
204
-
205
- export interface AppHeaderProps<
206
- TFeatures extends TableFeatures,
207
- TData extends RowData,
208
- TValue extends CellData = CellData,
209
- > {
210
- header: Header<TFeatures, TData, TValue>
211
- }
212
-
213
- export type AppVueTable<
214
- TFeatures extends TableFeatures,
215
- TData extends RowData,
216
- TSelected,
217
- TTableComponents extends Record<string, ComponentType<any>>,
218
- TCellComponents extends Record<string, ComponentType<any>>,
219
- THeaderComponents extends Record<string, ComponentType<any>>,
220
- > = VueTable<TFeatures, TData> &
221
- NoInfer<TTableComponents> & {
222
- AppTable: Component<AppTableProps>
223
- AppCell: Component<AppCellProps<TFeatures, TData>>
224
- AppHeader: Component<AppHeaderProps<TFeatures, TData>>
225
- AppFooter: Component<AppHeaderProps<TFeatures, TData>>
226
- FlexRender: typeof AppFlexRender
227
- }
228
-
229
- export const AppFlexRender = defineComponent({
230
- name: 'TableFlexRender',
231
- props: {
232
- cell: {
233
- type: Object as PropType<FlexRenderCell>,
234
- default: undefined,
235
- },
236
- header: {
237
- type: Object as PropType<FlexRenderHeader>,
238
- default: undefined,
239
- },
240
- footer: {
241
- type: Object as PropType<FlexRenderHeader>,
242
- default: undefined,
243
- },
244
- },
245
- setup(props) {
246
- return () => {
247
- if (props.cell) {
248
- return h(FlexRender, {
249
- render: props.cell.column.columnDef.cell,
250
- props: props.cell.getContext(),
251
- })
252
- }
253
-
254
- if (props.header) {
255
- return h(FlexRender, {
256
- render: props.header.column.columnDef.header,
257
- props: props.header.getContext(),
258
- })
259
- }
260
-
261
- if (props.footer) {
262
- return h(FlexRender, {
263
- render: props.footer.column.columnDef.footer,
264
- props: props.footer.getContext(),
265
- })
266
- }
267
-
268
- return null
269
- }
270
- },
271
- })
272
-
273
- /**
274
- * Creates app-scoped Vue table helpers with features, row models, and
275
- * renderable component maps pre-bound.
276
- *
277
- * Use this when an app or design system wants typed `useAppTable`, a pre-bound
278
- * column helper, and context helpers for table, cell, and header components.
279
- *
280
- * @example
281
- * ```ts
282
- * const { useAppTable, createAppColumnHelper } = createTableHook({
283
- * features,
284
- * rowModels: {},
285
- * tableComponents: {},
286
- * cellComponents: {},
287
- * headerComponents: {},
288
- * })
289
- * ```
290
- */
291
- export function createTableHook<
292
- TFeatures extends TableFeatures,
293
- const TTableComponents extends Record<string, ComponentType<any>>,
294
- const TCellComponents extends Record<string, ComponentType<any>>,
295
- const THeaderComponents extends Record<string, ComponentType<any>>,
296
- >({
297
- tableComponents,
298
- cellComponents,
299
- headerComponents,
300
- ...defaultTableOptions
301
- }: CreateTableHookOptions<
302
- TFeatures,
303
- TTableComponents,
304
- TCellComponents,
305
- THeaderComponents
306
- >) {
307
- const TableContext = Symbol('TableContext') as InjectionKey<
308
- VueTable<TFeatures, any>
309
- >
310
- const CellContext = Symbol('CellContext') as InjectionKey<
311
- Cell<TFeatures, any, any>
312
- >
313
- const HeaderContext = Symbol('HeaderContext') as InjectionKey<
314
- Header<TFeatures, any, any>
315
- >
316
-
317
- function createAppColumnHelper<TData extends RowData>(): AppColumnHelper<
318
- TFeatures,
319
- TData,
320
- TCellComponents,
321
- THeaderComponents
322
- > {
323
- return coreCreateColumnHelper<TFeatures, TData>() as AppColumnHelper<
324
- TFeatures,
325
- TData,
326
- TCellComponents,
327
- THeaderComponents
328
- >
329
- }
330
-
331
- function useTableContext<TData extends RowData = RowData>(): VueTable<
332
- TFeatures,
333
- TData
334
- > {
335
- const table = inject(TableContext)
336
-
337
- if (!table) {
338
- throw new Error(
339
- '`useTableContext` must be used within an `AppTable` component. ' +
340
- 'Make sure your component is wrapped with `<table.AppTable>...</table.AppTable>`.',
341
- )
342
- }
343
-
344
- return table as VueTable<TFeatures, TData>
345
- }
346
-
347
- function useCellContext<TValue extends CellData = CellData>(): Cell<
348
- TFeatures,
349
- any,
350
- TValue
351
- > {
352
- const cell = inject(CellContext)
353
-
354
- if (!cell) {
355
- throw new Error(
356
- '`useCellContext` must be used within an `AppCell` component. ' +
357
- 'Make sure your component is wrapped with `<table.AppCell :cell="cell">...</table.AppCell>`.',
358
- )
359
- }
360
-
361
- return cell as Cell<TFeatures, any, TValue>
362
- }
363
-
364
- function useHeaderContext<TValue extends CellData = CellData>(): Header<
365
- TFeatures,
366
- any,
367
- TValue
368
- > {
369
- const header = inject(HeaderContext)
370
-
371
- if (!header) {
372
- throw new Error(
373
- '`useHeaderContext` must be used within an `AppHeader` or `AppFooter` component.',
374
- )
375
- }
376
-
377
- return header as Header<TFeatures, any, TValue>
378
- }
379
-
380
- const CellFlexRender = defineComponent({
381
- name: 'AppCellFlexRender',
382
- setup() {
383
- const cell = useCellContext()
384
- return () => h(AppFlexRender, { cell })
385
- },
386
- })
387
-
388
- const HeaderFlexRender = defineComponent({
389
- name: 'AppHeaderFlexRender',
390
- setup() {
391
- const header = useHeaderContext()
392
- return () => h(AppFlexRender, { header })
393
- },
394
- })
395
-
396
- const FooterFlexRender = defineComponent({
397
- name: 'AppFooterFlexRender',
398
- setup() {
399
- const header = useHeaderContext()
400
- return () => h(AppFlexRender, { footer: header })
401
- },
402
- })
403
-
404
- function useAppTable<TData extends RowData>(
405
- tableOptions: Omit<
406
- TableOptionsWithReactiveData<TFeatures, TData>,
407
- 'features' | 'rowModels'
408
- >,
409
- ): AppVueTable<
410
- TFeatures,
411
- TData,
412
- TableState<TFeatures>,
413
- TTableComponents,
414
- TCellComponents,
415
- THeaderComponents
416
- > {
417
- const mergedOptions = mergeProxy(
418
- defaultTableOptions,
419
- tableOptions,
420
- ) as TableOptionsWithReactiveData<TFeatures, TData>
421
-
422
- const table = useTable<TFeatures, TData>(mergedOptions)
423
-
424
- const AppTable = defineComponent({
425
- name: 'AppTable',
426
- setup(_, { slots }) {
427
- provide(TableContext, table)
428
- return () => {
429
- return slots.default?.()
430
- }
431
- },
432
- })
433
-
434
- const AppCell = defineComponent({
435
- name: 'AppCell',
436
- props: {
437
- cell: {
438
- type: Object as PropType<object>,
439
- required: true,
440
- },
441
- },
442
- setup(props, { slots }) {
443
- const cell = props.cell as Cell<TFeatures, TData, any>
444
-
445
- provide(CellContext, cell)
446
-
447
- const extendedCell = Object.assign(cell, {
448
- FlexRender: CellFlexRender,
449
- ...(cellComponents ?? {}),
450
- }) as Cell<TFeatures, TData, any> &
451
- TCellComponents & { FlexRender: Component }
452
-
453
- return () => {
454
- return slots.default?.({ cell: extendedCell })
455
- }
456
- },
457
- })
458
-
459
- const AppHeader = defineComponent({
460
- name: 'AppHeader',
461
- props: {
462
- header: {
463
- type: Object as PropType<object>,
464
- required: true,
465
- },
466
- },
467
- setup(props, { slots }) {
468
- const header = props.header as Header<TFeatures, TData, any>
469
-
470
- provide(HeaderContext, header)
471
-
472
- const extendedHeader = Object.assign(header, {
473
- FlexRender: HeaderFlexRender,
474
- ...(headerComponents ?? {}),
475
- }) as Header<TFeatures, TData, any> &
476
- THeaderComponents & { FlexRender: Component }
477
-
478
- return () => {
479
- return slots.default?.({ header: extendedHeader })
480
- }
481
- },
482
- })
483
-
484
- const AppFooter = defineComponent({
485
- name: 'AppFooter',
486
- props: {
487
- header: {
488
- type: Object as PropType<object>,
489
- required: true,
490
- },
491
- },
492
- setup(props, { slots }) {
493
- const header = props.header as Header<TFeatures, TData, any>
494
-
495
- provide(HeaderContext, header)
496
-
497
- const extendedHeader = Object.assign(header, {
498
- FlexRender: FooterFlexRender,
499
- ...(headerComponents ?? {}),
500
- }) as Header<TFeatures, TData, any> &
501
- THeaderComponents & { FlexRender: Component }
502
-
503
- return () => {
504
- return slots.default?.({ header: extendedHeader })
505
- }
506
- },
507
- })
508
-
509
- return Object.assign(table, {
510
- AppTable,
511
- AppCell,
512
- AppHeader,
513
- AppFooter,
514
- FlexRender: AppFlexRender,
515
- ...(tableComponents ?? {}),
516
- }) as AppVueTable<
517
- TFeatures,
518
- TData,
519
- TableState<TFeatures>,
520
- TTableComponents,
521
- TCellComponents,
522
- THeaderComponents
523
- >
524
- }
525
-
526
- return {
527
- appFeatures: defaultTableOptions.features as TFeatures,
528
- createAppColumnHelper,
529
- useAppTable,
530
- useTableContext,
531
- useCellContext,
532
- useHeaderContext,
533
- }
534
- }
@@ -1 +0,0 @@
1
- export * from './FlexRender'
package/src/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './FlexRender'
2
- export * from './createTableHook'
3
- export * from './useTable'
4
- export * from '@tanstack/table-core'
@@ -1,132 +0,0 @@
1
- function trueFn() {
2
- return true
3
- }
4
-
5
- const $PROXY = Symbol('merge-proxy')
6
- const $SOURCES = Symbol('merge-proxy-sources')
7
-
8
- // https://github.com/solidjs/solid/blob/c20ca4fd8c36bc0522fedb2c7f38a110b7ee2663/packages/solid/src/render/component.ts#L51-L118
9
- const propTraps: ProxyHandler<{
10
- get: (k: string | number | symbol) => any
11
- has: (k: string | number | symbol) => boolean
12
- keys: () => Array<string>
13
- sources: Array<any>
14
- }> = {
15
- get(_, property, receiver) {
16
- if (property === $PROXY) return receiver
17
- if (property === $SOURCES) return _.sources
18
- return _.get(property)
19
- },
20
- has(_, property) {
21
- return _.has(property)
22
- },
23
- set: trueFn,
24
- deleteProperty: trueFn,
25
- getOwnPropertyDescriptor(_, property) {
26
- return {
27
- configurable: true,
28
- enumerable: true,
29
- get() {
30
- return _.get(property)
31
- },
32
- set: trueFn,
33
- deleteProperty: trueFn,
34
- }
35
- },
36
- ownKeys(_) {
37
- return _.keys()
38
- },
39
- }
40
-
41
- type UnboxLazy<T> = T extends () => infer U ? U : T
42
- type BoxedTupleTypes<T extends Array<any>> = {
43
- [P in keyof T]: [UnboxLazy<T[P]>]
44
- }[Exclude<keyof T, keyof Array<any>>]
45
- type UnionToIntersection<T> = (T extends any ? (k: T) => void : never) extends (
46
- k: infer I,
47
- ) => void
48
- ? I
49
- : never
50
- type UnboxIntersection<T> = T extends { 0: infer U } ? U : never
51
- type MergeProxy<T extends Array<any>> = UnboxIntersection<
52
- UnionToIntersection<BoxedTupleTypes<T>>
53
- >
54
-
55
- function resolveSource(s: any) {
56
- return s && typeof s === 'object' && 'value' in s ? s.value : s
57
- }
58
-
59
- export function mergeProxy<T extends Array<any>>(...sources: T): MergeProxy<T>
60
- export function mergeProxy(...sources: any): any {
61
- const flattenedSources = sources.flatMap((source: any) => {
62
- if (
63
- typeof source === 'object' &&
64
- source !== null &&
65
- $SOURCES in source &&
66
- Array.isArray(source[$SOURCES])
67
- ) {
68
- return source[$SOURCES]
69
- }
70
-
71
- return [source]
72
- })
73
-
74
- return new Proxy(
75
- {
76
- sources: flattenedSources,
77
- get(property: string | number | symbol) {
78
- for (let i = flattenedSources.length - 1; i >= 0; i--) {
79
- const v = resolveSource(flattenedSources[i])[property]
80
- if (v !== undefined) return v
81
- }
82
- },
83
- has(property: string | number | symbol) {
84
- for (let i = flattenedSources.length - 1; i >= 0; i--) {
85
- if (property in resolveSource(flattenedSources[i])) return true
86
- }
87
- return false
88
- },
89
- keys() {
90
- const keys = []
91
- for (const source of flattenedSources)
92
- keys.push(...Object.keys(resolveSource(source)))
93
- return [...Array.from(new Set(keys))]
94
- },
95
- },
96
- propTraps,
97
- )
98
- }
99
-
100
- /**
101
- * Merges objects together by eagerly resolving all values into a flat object.
102
- *
103
- * Unlike `mergeProxy`, this does not preserve lazy proxy getters. Use this for
104
- * repeated option update paths so each merge produces a plain object instead
105
- * of accumulating a longer source list over time.
106
- */
107
- export function flatMerge<T>(source: T): T
108
- export function flatMerge<T, U>(source: T, source1: U): T & U
109
- export function flatMerge<T, U, V>(source: T, source1: U, source2: V): T & U & V
110
- export function flatMerge<T, U, V, W>(
111
- source: T,
112
- source1: U,
113
- source2: V,
114
- source3: W,
115
- ): T & U & V & W
116
- export function flatMerge(...sources: any): any {
117
- const result: Record<PropertyKey, unknown> = {}
118
-
119
- for (let source of sources) {
120
- source = resolveSource(source)
121
- if (!source) continue
122
-
123
- for (const key of Reflect.ownKeys(source)) {
124
- const value = (source as Record<PropertyKey, unknown>)[key]
125
- if (value !== undefined) {
126
- result[key] = value
127
- }
128
- }
129
- }
130
-
131
- return result
132
- }