Skip to content

Commit efe9250

Browse files
feat: change api
1 parent 0d7b1a2 commit efe9250

File tree

2 files changed

+57
-63
lines changed

2 files changed

+57
-63
lines changed

packages/vue-db/src/useLiveQuery.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ import type {
99
ResultsFromContext,
1010
Schema,
1111
} from "@tanstack/db"
12-
import type { Ref } from "vue"
1312

1413
export interface UseLiveQueryReturn<T extends object> {
15-
state: Readonly<Ref<Map<string, T>>>
16-
data: Readonly<Ref<Array<T>>>
17-
collection: Readonly<Ref<Collection<T>>>
14+
state: () => Readonly<Map<string, T>>
15+
data: () => Readonly<Array<T>>
16+
collection: () => Collection<T>
1817
}
1918

2019
export function useLiveQuery<
@@ -24,14 +23,9 @@ export function useLiveQuery<
2423
q: InitialQueryBuilder<Context<Schema>>
2524
) => QueryBuilder<TResultContext>
2625
): UseLiveQueryReturn<ResultsFromContext<TResultContext>> {
27-
const results = shallowRef() as Ref<
28-
ReturnType<typeof compileQuery<TResultContext>>[`results`]
29-
>
30-
31-
const state = shallowRef() as Ref<
32-
Map<string, ResultsFromContext<TResultContext>>
33-
>
34-
const data = shallowRef() as Ref<Array<ResultsFromContext<TResultContext>>>
26+
const results = shallowRef()
27+
const state = shallowRef()
28+
const data = shallowRef()
3529

3630
watchEffect(() => {
3731
const query = queryFn(queryBuilder())
@@ -72,8 +66,8 @@ export function useLiveQuery<
7266
})
7367

7468
return {
75-
state,
76-
data,
77-
collection: results,
69+
state: () => state.value,
70+
data: () => data.value,
71+
collection: () => results.value,
7872
}
7973
}

packages/vue-db/tests/useLiveQuery.test.ts

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,15 @@ describe(`Query Collections`, () => {
118118
.orderBy({ "@id": `asc` })
119119
)
120120

121-
expect(state.value.size).toBe(1)
122-
expect(state.value.get(`3`)).toEqual({
121+
expect(state().size).toBe(1)
122+
expect(state().get(`3`)).toEqual({
123123
_orderByIndex: 0,
124124
id: `3`,
125125
name: `John Smith`,
126126
})
127127

128-
expect(data.value.length).toBe(1)
129-
expect(data.value[0]).toEqual({
128+
expect(data().length).toBe(1)
129+
expect(data()[0]).toEqual({
130130
_orderByIndex: 0,
131131
id: `3`,
132132
name: `John Smith`,
@@ -149,25 +149,25 @@ describe(`Query Collections`, () => {
149149

150150
await waitForChanges()
151151

152-
expect(state.value.size).toBe(2)
153-
expect(state.value.get(`3`)).toEqual({
152+
expect(state().size).toBe(2)
153+
expect(state().get(`3`)).toEqual({
154154
_orderByIndex: 0,
155155
id: `3`,
156156
name: `John Smith`,
157157
})
158-
expect(state.value.get(`4`)).toEqual({
158+
expect(state().get(`4`)).toEqual({
159159
_orderByIndex: 1,
160160
id: `4`,
161161
name: `Kyle Doe`,
162162
})
163163

164-
expect(data.value.length).toBe(2)
165-
expect(data.value).toContainEqual({
164+
expect(data().length).toBe(2)
165+
expect(data()).toContainEqual({
166166
_orderByIndex: 0,
167167
id: `3`,
168168
name: `John Smith`,
169169
})
170-
expect(data.value).toContainEqual({
170+
expect(data()).toContainEqual({
171171
_orderByIndex: 1,
172172
id: `4`,
173173
name: `Kyle Doe`,
@@ -186,15 +186,15 @@ describe(`Query Collections`, () => {
186186

187187
await waitForChanges()
188188

189-
expect(state.value.size).toBe(2)
190-
expect(state.value.get(`4`)).toEqual({
189+
expect(state().size).toBe(2)
190+
expect(state().get(`4`)).toEqual({
191191
_orderByIndex: 1,
192192
id: `4`,
193193
name: `Kyle Doe 2`,
194194
})
195195

196-
expect(data.value.length).toBe(2)
197-
expect(data.value).toContainEqual({
196+
expect(data().length).toBe(2)
197+
expect(data()).toContainEqual({
198198
_orderByIndex: 1,
199199
id: `4`,
200200
name: `Kyle Doe 2`,
@@ -210,11 +210,11 @@ describe(`Query Collections`, () => {
210210

211211
await waitForChanges()
212212

213-
expect(state.value.size).toBe(1)
214-
expect(state.value.get(`4`)).toBeUndefined()
213+
expect(state().size).toBe(1)
214+
expect(state().get(`4`)).toBeUndefined()
215215

216-
expect(data.value.length).toBe(1)
217-
expect(data.value).toContainEqual({
216+
expect(data().length).toBe(1)
217+
expect(data()).toContainEqual({
218218
_orderByIndex: 0,
219219
id: `3`,
220220
name: `John Smith`,
@@ -299,21 +299,21 @@ describe(`Query Collections`, () => {
299299
await waitForChanges()
300300

301301
// Verify that we have the expected joined results
302-
expect(state.value.size).toBe(3)
302+
expect(state().size).toBe(3)
303303

304-
expect(state.value.get(`1`)).toEqual({
304+
expect(state().get(`1`)).toEqual({
305305
id: `1`,
306306
name: `John Doe`,
307307
title: `Issue 1`,
308308
})
309309

310-
expect(state.value.get(`2`)).toEqual({
310+
expect(state().get(`2`)).toEqual({
311311
id: `2`,
312312
name: `Jane Doe`,
313313
title: `Issue 2`,
314314
})
315315

316-
expect(state.value.get(`3`)).toEqual({
316+
expect(state().get(`3`)).toEqual({
317317
id: `3`,
318318
name: `John Doe`,
319319
title: `Issue 3`,
@@ -335,8 +335,8 @@ describe(`Query Collections`, () => {
335335

336336
await waitForChanges()
337337

338-
expect(state.value.size).toBe(4)
339-
expect(state.value.get(`4`)).toEqual({
338+
expect(state().size).toBe(4)
339+
expect(state().get(`4`)).toEqual({
340340
id: `4`,
341341
name: `Jane Doe`,
342342
title: `Issue 4`,
@@ -356,7 +356,7 @@ describe(`Query Collections`, () => {
356356
await waitForChanges()
357357

358358
// The updated title should be reflected in the joined results
359-
expect(state.value.get(`2`)).toEqual({
359+
expect(state().get(`2`)).toEqual({
360360
id: `2`,
361361
name: `Jane Doe`,
362362
title: `Updated Issue 2`,
@@ -373,7 +373,7 @@ describe(`Query Collections`, () => {
373373
await waitForChanges()
374374

375375
// After deletion, user 3 should no longer have a joined result
376-
expect(state.value.get(`3`)).toBeUndefined()
376+
expect(state().get(`3`)).toBeUndefined()
377377
})
378378

379379
it(`should recompile query when parameters change and change results`, async () => {
@@ -423,8 +423,8 @@ describe(`Query Collections`, () => {
423423
})
424424

425425
// Initially should return only people older than 30
426-
expect(state.value.size).toBe(1)
427-
expect(state.value.get(`3`)).toEqual({
426+
expect(state().size).toBe(1)
427+
expect(state().get(`3`)).toEqual({
428428
id: `3`,
429429
name: `John Smith`,
430430
age: 35,
@@ -436,18 +436,18 @@ describe(`Query Collections`, () => {
436436
await waitForChanges()
437437

438438
// Now should return all people as they're all older than 20
439-
expect(state.value.size).toBe(3)
440-
expect(state.value.get(`1`)).toEqual({
439+
expect(state().size).toBe(3)
440+
expect(state().get(`1`)).toEqual({
441441
id: `1`,
442442
name: `John Doe`,
443443
age: 30,
444444
})
445-
expect(state.value.get(`2`)).toEqual({
445+
expect(state().get(`2`)).toEqual({
446446
id: `2`,
447447
name: `Jane Doe`,
448448
age: 25,
449449
})
450-
expect(state.value.get(`3`)).toEqual({
450+
expect(state().get(`3`)).toEqual({
451451
id: `3`,
452452
name: `John Smith`,
453453
age: 35,
@@ -459,7 +459,7 @@ describe(`Query Collections`, () => {
459459
await waitForChanges()
460460

461461
// Should now be empty
462-
expect(state.value.size).toBe(0)
462+
expect(state().size).toBe(0)
463463
})
464464

465465
it(`should stop old query when parameters change`, async () => {
@@ -604,15 +604,15 @@ describe(`Query Collections`, () => {
604604
// Grouped query derived from initial query
605605
const groupedResult = useLiveQuery((q) =>
606606
q
607-
.from({ queryResult: result.collection.value })
607+
.from({ queryResult: result.collection() })
608608
.groupBy(`@team`)
609609
.keyBy(`@team`)
610610
.select(`@team`, { count: { COUNT: `@id` } })
611611
)
612612

613613
// Verify initial grouped results
614-
expect(groupedResult.state.value.size).toBe(1)
615-
expect(groupedResult.state.value.get(`team1`)).toEqual({
614+
expect(groupedResult.state().size).toBe(1)
615+
expect(groupedResult.state().get(`team1`)).toEqual({
616616
team: `team1`,
617617
count: 1,
618618
})
@@ -648,12 +648,12 @@ describe(`Query Collections`, () => {
648648
await waitForChanges()
649649

650650
// Verify the grouped results include the new team members
651-
expect(groupedResult.state.value.size).toBe(2)
652-
expect(groupedResult.state.value.get(`team1`)).toEqual({
651+
expect(groupedResult.state().size).toBe(2)
652+
expect(groupedResult.state().get(`team1`)).toEqual({
653653
team: `team1`,
654654
count: 2,
655655
})
656-
expect(groupedResult.state.value.get(`team2`)).toEqual({
656+
expect(groupedResult.state().get(`team2`)).toEqual({
657657
team: `team2`,
658658
count: 1,
659659
})
@@ -747,17 +747,17 @@ describe(`Query Collections`, () => {
747747
// Track each render state
748748
watchEffect(() => {
749749
renderStates.push({
750-
stateSize: state.value.size,
751-
hasTempKey: state.value.has(`temp-key`),
752-
hasPermKey: state.value.has(`4`),
750+
stateSize: state().size,
751+
hasTempKey: state().has(`temp-key`),
752+
hasPermKey: state().has(`4`),
753753
timestamp: Date.now(),
754754
})
755755
})
756756

757757
await waitForChanges()
758758

759759
// Verify initial state
760-
expect(state.value.size).toBe(3)
760+
expect(state().size).toBe(3)
761761

762762
// Reset render states array for clarity in the remaining test
763763
renderStates.length = 0
@@ -795,8 +795,8 @@ describe(`Query Collections`, () => {
795795
)
796796

797797
// Verify optimistic state is immediately reflected
798-
expect(state.value.size).toBe(4)
799-
expect(state.value.get(`temp-key`)).toEqual({
798+
expect(state().size).toBe(4)
799+
expect(state().get(`temp-key`)).toEqual({
800800
id: `temp-key`,
801801
name: `John Doe`,
802802
title: `New Issue`,
@@ -814,9 +814,9 @@ describe(`Query Collections`, () => {
814814
expect(hadFlicker).toBe(false)
815815

816816
// Verify the temporary key is replaced by the permanent one
817-
expect(state.value.size).toBe(4)
818-
expect(state.value.get(`temp-key`)).toBeUndefined()
819-
expect(state.value.get(`4`)).toEqual({
817+
expect(state().size).toBe(4)
818+
expect(state().get(`temp-key`)).toBeUndefined()
819+
expect(state().get(`4`)).toEqual({
820820
id: `4`,
821821
name: `John Doe`,
822822
title: `New Issue`,

0 commit comments

Comments
 (0)