@tanstack/svelte-table 9.0.0-alpha.5 → 9.0.0-alpha.50

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 (63) hide show
  1. package/README.md +127 -0
  2. package/dist/AppCell.svelte +13 -0
  3. package/dist/AppCell.svelte.d.ts +9 -0
  4. package/dist/AppHeader.svelte +13 -0
  5. package/dist/AppHeader.svelte.d.ts +9 -0
  6. package/dist/AppTable.svelte +11 -0
  7. package/dist/AppTable.svelte.d.ts +7 -0
  8. package/dist/FlexRender.svelte +103 -0
  9. package/dist/FlexRender.svelte.d.ts +51 -0
  10. package/dist/context-keys.d.ts +3 -0
  11. package/dist/context-keys.js +3 -0
  12. package/dist/createTable.svelte.d.ts +38 -0
  13. package/dist/createTable.svelte.js +79 -0
  14. package/dist/createTableHook.svelte.d.ts +235 -0
  15. package/dist/createTableHook.svelte.js +170 -0
  16. package/dist/createTableState.svelte.d.ts +17 -0
  17. package/dist/createTableState.svelte.js +27 -0
  18. package/dist/flex-render.d.ts +1 -0
  19. package/dist/flex-render.js +2 -0
  20. package/dist/index.d.ts +8 -3
  21. package/dist/index.js +6 -3
  22. package/dist/merge-objects.d.ts +24 -0
  23. package/dist/merge-objects.js +45 -0
  24. package/dist/reactivity.svelte.d.ts +9 -0
  25. package/dist/reactivity.svelte.js +55 -0
  26. package/dist/render-component.d.ts +66 -9
  27. package/dist/render-component.js +62 -4
  28. package/dist/static-functions.d.ts +1 -0
  29. package/dist/static-functions.js +1 -0
  30. package/dist/subscribe.d.ts +24 -0
  31. package/dist/subscribe.js +4 -0
  32. package/package.json +31 -11
  33. package/skills/svelte/client-to-server/SKILL.md +238 -0
  34. package/skills/svelte/compose-with-tanstack-form/SKILL.md +295 -0
  35. package/skills/svelte/compose-with-tanstack-pacer/SKILL.md +176 -0
  36. package/skills/svelte/compose-with-tanstack-query/SKILL.md +299 -0
  37. package/skills/svelte/compose-with-tanstack-store/SKILL.md +277 -0
  38. package/skills/svelte/compose-with-tanstack-virtual/SKILL.md +286 -0
  39. package/skills/svelte/getting-started/SKILL.md +340 -0
  40. package/skills/svelte/migrate-v8-to-v9/SKILL.md +256 -0
  41. package/skills/svelte/production-readiness/SKILL.md +256 -0
  42. package/skills/svelte/table-state/SKILL.md +441 -0
  43. package/src/AppCell.svelte +13 -0
  44. package/src/AppHeader.svelte +13 -0
  45. package/src/AppTable.svelte +11 -0
  46. package/src/FlexRender.svelte +103 -0
  47. package/src/context-keys.ts +3 -0
  48. package/src/createTable.svelte.ts +127 -0
  49. package/src/createTableHook.svelte.ts +639 -0
  50. package/src/createTableState.svelte.ts +30 -0
  51. package/src/flex-render.ts +3 -0
  52. package/src/index.ts +20 -3
  53. package/src/merge-objects.ts +79 -0
  54. package/src/reactivity.svelte.ts +74 -0
  55. package/src/render-component.ts +75 -9
  56. package/src/static-functions.ts +1 -0
  57. package/src/subscribe.ts +46 -0
  58. package/dist/flex-render.svelte +0 -35
  59. package/dist/flex-render.svelte.d.ts +0 -28
  60. package/dist/table.svelte.d.ts +0 -28
  61. package/dist/table.svelte.js +0 -87
  62. package/src/flex-render.svelte +0 -35
  63. package/src/table.svelte.ts +0 -117
@@ -0,0 +1,127 @@
1
+ import { constructTable } from '@tanstack/table-core'
2
+ import { useSelector } from '@tanstack/svelte-store'
3
+ import { untrack } from 'svelte'
4
+ import { flatMerge, mergeObjects } from './merge-objects'
5
+ import { svelteReactivity } from './reactivity.svelte'
6
+ import type {
7
+ RowData,
8
+ Table,
9
+ TableFeatures,
10
+ TableOptions,
11
+ TableState,
12
+ } from '@tanstack/table-core'
13
+
14
+ export type SvelteTable<
15
+ TFeatures extends TableFeatures,
16
+ TData extends RowData,
17
+ TSelected = TableState<TFeatures>,
18
+ > = Table<TFeatures, TData> & {
19
+ /**
20
+ * The selected state of the table. This state may not match the structure of `table.store.state` because it is selected by the `selector` function that you pass as the 2nd argument to `createTable`.
21
+ *
22
+ * @example
23
+ * const table = createTable(options, (state) => ({ globalFilter: state.globalFilter })) // only globalFilter is part of the selected state
24
+ *
25
+ * console.log(table.state.globalFilter)
26
+ */
27
+ readonly state: Readonly<TSelected>
28
+ }
29
+
30
+ /**
31
+ * Creates a Svelte 5 table instance backed by rune-aware TanStack Store atoms.
32
+ *
33
+ * The optional selector projects from `table.store`; the selected value is
34
+ * exposed on `table.state`. The adapter syncs options in `$effect.pre`, so
35
+ * reactive option getters and external `$state` values are applied before DOM
36
+ * updates read table APIs such as `getRowModel()`.
37
+ *
38
+ * @example
39
+ * ```svelte
40
+ * <script lang="ts">
41
+ * const table = createTable(
42
+ * {
43
+ * _features,
44
+ * _rowModels: {},
45
+ * columns,
46
+ * data,
47
+ * },
48
+ * (state) => ({ pagination: state.pagination }),
49
+ * )
50
+ * </script>
51
+ *
52
+ * {table.state.pagination.pageIndex}
53
+ * ```
54
+ */
55
+ export function createTable<
56
+ TFeatures extends TableFeatures,
57
+ TData extends RowData,
58
+ TSelected = TableState<TFeatures>,
59
+ >(
60
+ tableOptions: TableOptions<TFeatures, TData>,
61
+ selector?: (state: TableState<TFeatures>) => TSelected,
62
+ ): SvelteTable<TFeatures, TData, TSelected> {
63
+ // 1. Merge reactivity into options using mergeObjects (preserves getters)
64
+ const mergedOptions = mergeObjects(tableOptions, {
65
+ _features: {
66
+ coreReativityFeature: svelteReactivity(),
67
+ ...tableOptions._features,
68
+ },
69
+ }) as TableOptions<TFeatures, TData>
70
+
71
+ // 2. Set up resolved options with mergeOptions handler
72
+ const resolvedOptions = mergeObjects(
73
+ {
74
+ mergeOptions: (
75
+ defaultOptions: TableOptions<TFeatures, TData>,
76
+ newOptions: Partial<TableOptions<TFeatures, TData>>,
77
+ ) => {
78
+ return flatMerge(defaultOptions, newOptions)
79
+ },
80
+ },
81
+ mergedOptions,
82
+ ) as TableOptions<TFeatures, TData>
83
+
84
+ // 3. Construct table
85
+ const table = constructTable(resolvedOptions) as SvelteTable<
86
+ TFeatures,
87
+ TData,
88
+ TSelected
89
+ >
90
+
91
+ // 4. Sync options reactively. When controlled state changes (e.g., $state
92
+ // inside createTableState), the effect re-runs and calls setOptions.
93
+ // Use $effect.pre so the table sees updated options BEFORE the DOM renders,
94
+ // ensuring getRowModel() returns current data (not stale, one-frame-behind data).
95
+ // The reactive reads (state getters, data getter) happen OUTSIDE untrack
96
+ // so they become dependencies. The setOptions call is INSIDE untrack so
97
+ // option writes do not subscribe this effect to table internals.
98
+ $effect.pre(() => {
99
+ // Read reactive getters to create $effect dependencies on external state
100
+ const state: Record<string, unknown> | undefined = mergedOptions.state
101
+ if (state) {
102
+ for (const key in state) {
103
+ void state[key]
104
+ }
105
+ }
106
+ void mergedOptions.data
107
+
108
+ untrack(() => {
109
+ table.setOptions((prev) => {
110
+ return flatMerge(prev, mergedOptions)
111
+ })
112
+ })
113
+ })
114
+
115
+ // 5. State selector
116
+ const stateStore = useSelector(table.store, selector)
117
+
118
+ Object.defineProperty(table, 'state', {
119
+ get() {
120
+ return stateStore.current
121
+ },
122
+ configurable: true,
123
+ enumerable: true,
124
+ })
125
+
126
+ return table
127
+ }