Skip to content

Commit 0645f07

Browse files
committed
chore: migrate to defineQuery
1 parent d10d16c commit 0645f07

File tree

7 files changed

+115
-367
lines changed

7 files changed

+115
-367
lines changed

README.md

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -103,39 +103,7 @@ For more information on disabling legacy mutators and queries, see the [Zero doc
103103
type resolution to work. If they are not included, there will be an error similar to
104104
`Failed to find type definitions`.
105105

106-
### Use Zero schema file
107-
108-
Use the generated Zero schema:
109-
110-
```tsx
111-
import {useEffect, useState} from 'react';
112-
import {useZero} from '@rocicorp/zero/react';
113-
import {syncedQuery} from '@rocicorp/zero';
114-
import {zql} from '../zero-schema.gen.ts';
115-
116-
const postsQuery = syncedQuery('allPosts', z.tuple([]), () =>
117-
zql.posts.related('author').limit(10),
118-
);
119-
120-
function PostList() {
121-
const z = useZero();
122-
123-
const [posts] = useQuery(postsQuery());
124-
125-
return (
126-
<div>
127-
{posts.map(post => (
128-
<div key={post.id} className="post">
129-
{/* Access the JSON content from Drizzle */}
130-
<p>{post.content.textValue}</p>
131-
<p>By: {post.author?.name}</p>
132-
<p>Email: {post.author?.email}</p>
133-
</div>
134-
))}
135-
</div>
136-
);
137-
}
138-
```
106+
Please reference the Zero docs for how to use your new Zero schema: [https://zero.rocicorp.dev/docs/reading-data](https://zero.rocicorp.dev/docs/reading-data).
139107

140108
### Customize with `drizzle-zero.config.ts`
141109

integration/get-queries-server.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,21 @@
11
import {serve} from '@hono/node-server';
2-
import {withValidation} from '@rocicorp/zero';
3-
import {handleGetQueriesRequest} from '@rocicorp/zero/server';
2+
import {mustGetQuery} from '@rocicorp/zero';
3+
import {handleQueryRequest} from '@rocicorp/zero/server';
44
import {Hono} from 'hono';
55
import type {Server} from 'http';
6-
import * as queries from './synced-queries';
6+
import {queries} from './synced-queries';
77
import {schema} from './zero-schema.gen';
88

9-
const validated = Object.fromEntries(
10-
Object.values(queries).map(q => [q.queryName, withValidation(q)]),
11-
);
12-
139
const app = new Hono();
1410

1511
app.post('/get-queries', async c => {
1612
try {
1713
const jsonBody = await c.req.json();
1814

19-
const response = await handleGetQueriesRequest(
15+
const response = await handleQueryRequest(
2016
(name, args) => {
21-
const q = validated[name];
22-
if (!q) {
23-
throw new Error(`Unknown query: ${name}`);
24-
}
25-
26-
console.log('name', name, 'args', args);
27-
28-
return {query: q(undefined, ...args)};
17+
const q = mustGetQuery(queries, name);
18+
return q.fn({args, ctx: undefined});
2919
},
3020
schema,
3121
jsonBody,

integration/synced-queries.ts

Lines changed: 52 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,56 @@
1-
import {syncedQueryWithContext} from '@rocicorp/zero';
1+
import {defineQueriesWithType, defineQuery} from '@rocicorp/zero';
22
import {z} from 'zod';
3-
import {zql} from './zero-schema.gen';
3+
import {type Schema, zql} from './zero-schema.gen';
44

5-
export const allUsers = syncedQueryWithContext(
6-
'integration.allUsers',
7-
z.tuple([]),
8-
_ctx => zql.user.orderBy('id', 'asc'),
9-
);
10-
11-
export const filtersWithChildren = syncedQueryWithContext(
12-
'integration.filtersWithChildren',
13-
z.tuple([z.string()]),
14-
(_ctx, rootId) =>
5+
export const queries = defineQueriesWithType<Schema>()({
6+
allUsers: defineQuery(() => zql.user.orderBy('id', 'asc')),
7+
filtersWithChildren: defineQuery(z.string(), ({args}) =>
158
zql.filters
16-
.where(q => q.cmp('id', '=', rootId))
9+
.where(q => q.cmp('id', '=', args))
1710
.related('children', q => q.related('children').orderBy('id', 'asc')),
18-
);
19-
20-
export const messagesBySender = syncedQueryWithContext(
21-
'integration.messagesBySender',
22-
z.tuple([z.string()]),
23-
(_ctx, senderId) =>
24-
zql.message
25-
.where(q => q.cmp('senderId', '=', senderId))
26-
.orderBy('id', 'asc'),
27-
);
28-
29-
export const messagesByBody = syncedQueryWithContext(
30-
'integration.messagesByBody',
31-
z.tuple([z.string()]),
32-
(_ctx, body) =>
33-
zql.message.where(q => q.cmp('body', '=', body)).orderBy('id', 'asc'),
34-
);
35-
36-
export const messageWithRelations = syncedQueryWithContext(
37-
'integration.messageWithRelations',
38-
z.tuple([z.string()]),
39-
(_ctx, id) =>
11+
),
12+
messagesBySender: defineQuery(z.string(), ({args}) =>
13+
zql.message.where(q => q.cmp('senderId', '=', args)).orderBy('id', 'asc'),
14+
),
15+
messagesByBody: defineQuery(z.string(), ({args}) =>
16+
zql.message.where(q => q.cmp('body', '=', args)).orderBy('id', 'asc'),
17+
),
18+
messageWithRelations: defineQuery(z.string(), ({args}) =>
4019
zql.message
41-
.where(q => q.cmp('id', '=', id))
20+
.where(q => q.cmp('id', '=', args))
4221
.related('medium')
4322
.related('sender')
4423
.one(),
45-
);
46-
47-
export const userWithMediums = syncedQueryWithContext(
48-
'integration.userWithMediums',
49-
z.tuple([z.string()]),
50-
(_ctx, id) =>
51-
zql.user
52-
.where(q => q.cmp('id', '=', id))
53-
.related('mediums')
54-
.one(),
55-
);
56-
57-
export const userWithFriends = syncedQueryWithContext(
58-
'integration.userWithFriends',
59-
z.tuple([z.string()]),
60-
(_ctx, id) =>
61-
zql.user
62-
.where(q => q.cmp('id', '=', id))
63-
.related('friends')
64-
.one(),
65-
);
66-
67-
export const messageById = syncedQueryWithContext(
68-
'integration.messageById',
69-
z.tuple([z.string()]),
70-
(_ctx, id) => zql.message.where(q => q.cmp('id', '=', id)).one(),
71-
);
72-
73-
export const mediumById = syncedQueryWithContext(
74-
'integration.mediumById',
75-
z.tuple([z.string()]),
76-
(_ctx, id) => zql.medium.where(q => q.cmp('id', '=', id)).one(),
77-
);
78-
79-
export const allTypesById = syncedQueryWithContext(
80-
'integration.allTypesById',
81-
z.tuple([z.string()]),
82-
(_ctx, id) => zql.allTypes.where(q => q.cmp('id', '=', id)).one(),
83-
);
84-
85-
export const allTypesByStatus = syncedQueryWithContext(
86-
'integration.allTypesByStatus',
87-
z.tuple([z.enum(['active', 'inactive', 'pending'])]),
88-
(_ctx, status) => zql.allTypes.where(q => q.cmp('status', '=', status)).one(),
89-
);
90-
91-
export const complexOrderWithEverything = syncedQueryWithContext(
92-
'integration.complexOrderWithEverything',
93-
z.tuple([z.string()]),
94-
(_ctx, orderId) =>
24+
),
25+
messageById: defineQuery(z.string(), ({args}) =>
26+
zql.message.where(q => q.cmp('id', '=', args)).one(),
27+
),
28+
mediumById: defineQuery(z.string(), ({args}) =>
29+
zql.medium.where(q => q.cmp('id', '=', args)).one(),
30+
),
31+
allTypesById: defineQuery(z.string(), ({args}) =>
32+
zql.allTypes.where(q => q.cmp('id', '=', args)).one(),
33+
),
34+
complexOrderWithEverything: defineQuery(z.string(), ({args}) =>
9535
zql.orderTable
96-
.where(q => q.cmp('id', '=', orderId))
36+
.where(q => q.cmp('id', '=', args))
9737
.related('customer', q =>
98-
q
99-
.related('messages', q2 =>
100-
q2
101-
.related('medium', q3 =>
102-
q3.related('messages', q4 =>
103-
q4.related('sender').related('medium').orderBy('id', 'asc'),
104-
),
105-
)
106-
.related('sender', q3 =>
107-
q3.related('messages').related('friends'),
108-
)
109-
.orderBy('id', 'asc'),
110-
)
111-
.related('friends', q2 =>
112-
q2
113-
.related('messages', q3 =>
114-
q3.related('medium').related('sender').orderBy('id', 'asc'),
115-
)
116-
.related('friends', q3 => q3.related('messages')),
117-
),
38+
q.related('messages', q2 =>
39+
q2
40+
.related('medium', q3 =>
41+
q3.related('messages', q4 =>
42+
q4.related('sender').related('medium').orderBy('id', 'asc'),
43+
),
44+
)
45+
.related('sender', q3 => q3.related('messages'))
46+
.orderBy('id', 'asc'),
47+
),
11848
)
11949
.related('opportunity', q =>
12050
q
12151
.related('account', q2 =>
12252
q2
123-
.related('owner', q3 => q3.related('messages').related('friends'))
53+
.related('owner', q3 => q3.related('messages'))
12454
.related('contacts', q3 =>
12555
q3
12656
.related('account', q4 =>
@@ -138,19 +68,15 @@ export const complexOrderWithEverything = syncedQueryWithContext(
13868
.related('opportunity', q5 =>
13969
q5.related('account').related('stage'),
14070
)
141-
.related('performer', q5 =>
142-
q5.related('messages').related('friends'),
143-
)
71+
.related('performer', q5 => q5.related('messages'))
14472
.related('account', q5 =>
14573
q5.related('opportunities').related('contacts'),
14674
)
147-
.orderBy('contactId', 'asc'),
75+
.orderBy('id', 'asc'),
14876
)
14977
.related('notes', q4 =>
15078
q4
151-
.related('author', q5 =>
152-
q5.related('messages').related('friends'),
153-
)
79+
.related('author', q5 => q5.related('messages'))
15480
.related('contact', q5 =>
15581
q5.related('account').related('activities'),
15682
)
@@ -184,9 +110,7 @@ export const complexOrderWithEverything = syncedQueryWithContext(
184110
.related('activities', q4 =>
185111
q4
186112
.related('type', q5 => q5.related('activities'))
187-
.related('performer', q5 =>
188-
q5.related('messages').related('friends'),
189-
)
113+
.related('performer', q5 => q5.related('messages'))
190114
.related('account', q5 => q5.related('opportunities'))
191115
.related('contact', q5 => q5.related('notes'))
192116
.related('opportunity', q5 => q5.related('stage'))
@@ -198,9 +122,7 @@ export const complexOrderWithEverything = syncedQueryWithContext(
198122
q5.related('stage').related('account'),
199123
)
200124
.related('stage', q5 => q5.related('opportunities'))
201-
.related('changedBy', q5 =>
202-
q5.related('messages').related('friends'),
203-
)
125+
.related('changedBy', q5 => q5.related('messages'))
204126
.orderBy('id', 'asc'),
205127
)
206128
.orderBy('id', 'asc'),
@@ -217,9 +139,7 @@ export const complexOrderWithEverything = syncedQueryWithContext(
217139
q4.related('stage').related('account'),
218140
)
219141
.related('type', q4 => q4.related('activities'))
220-
.related('performer', q4 =>
221-
q4.related('friends').related('messages'),
222-
)
142+
.related('performer')
223143
.orderBy('id', 'asc'),
224144
)
225145
.related('notes', q3 =>
@@ -230,9 +150,7 @@ export const complexOrderWithEverything = syncedQueryWithContext(
230150
.related('contact', q4 =>
231151
q4.related('activities').related('account'),
232152
)
233-
.related('author', q4 =>
234-
q4.related('messages').related('friends'),
235-
)
153+
.related('author', q4 => q4.related('messages'))
236154
.orderBy('id', 'asc'),
237155
),
238156
)
@@ -274,17 +192,15 @@ export const complexOrderWithEverything = syncedQueryWithContext(
274192
.related('stage', q3 =>
275193
q3.related('opportunities').related('historyEntries'),
276194
)
277-
.related('changedBy', q3 => q3.related('friends'))
195+
.related('changedBy')
278196
.orderBy('id', 'asc'),
279197
),
280198
)
281199
.related('items', q =>
282200
q
283201
.related('order', q2 =>
284202
q2
285-
.related('customer', q3 =>
286-
q3.related('messages').related('friends'),
287-
)
203+
.related('customer', q3 => q3.related('messages'))
288204
.related('opportunity', q3 =>
289205
q3.related('account').related('stage').related('activities'),
290206
)
@@ -389,9 +305,7 @@ export const complexOrderWithEverything = syncedQueryWithContext(
389305
q
390306
.related('order', q2 =>
391307
q2
392-
.related('customer', q3 =>
393-
q3.related('messages').related('friends'),
394-
)
308+
.related('customer', q3 => q3.related('messages'))
395309
.related('opportunity', q3 =>
396310
q3.related('account').related('stage'),
397311
)
@@ -410,9 +324,7 @@ export const complexOrderWithEverything = syncedQueryWithContext(
410324
q
411325
.related('order', q2 =>
412326
q2
413-
.related('customer', q3 =>
414-
q3.related('messages').related('friends'),
415-
)
327+
.related('customer', q3 => q3.related('messages'))
416328
.related('opportunity', q3 =>
417329
q3.related('account').related('historyEntries'),
418330
)
@@ -431,9 +343,7 @@ export const complexOrderWithEverything = syncedQueryWithContext(
431343
q3
432344
.related('order', q4 =>
433345
q4
434-
.related('customer', q5 =>
435-
q5.related('messages').related('friends'),
436-
)
346+
.related('customer', q5 => q5.related('messages'))
437347
.related('opportunity', q5 =>
438348
q5.related('account').related('stage'),
439349
)
@@ -456,4 +366,5 @@ export const complexOrderWithEverything = syncedQueryWithContext(
456366
.orderBy('id', 'asc'),
457367
)
458368
.one(),
459-
);
369+
),
370+
});

0 commit comments

Comments
 (0)