Skip to content

Commit 0f3a602

Browse files
authored
Merge pull request #3 from get-convex/lee/return-types
2 parents c943043 + f0bf9bf commit 0f3a602

File tree

5 files changed

+34
-24
lines changed

5 files changed

+34
-24
lines changed

example/convex/_generated/api.d.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ export declare const components: {
6565
isDeleted: boolean;
6666
ts: number;
6767
}>;
68+
pageStatus?: null | "SplitRequired" | "SplitRecommended";
69+
splitCursor?: null | string;
6870
}
6971
>;
7072
listHistory: FunctionReference<
@@ -91,6 +93,8 @@ export declare const components: {
9193
isDeleted: boolean;
9294
ts: number;
9395
}>;
96+
pageStatus?: null | "SplitRequired" | "SplitRecommended";
97+
splitCursor?: null | string;
9498
}
9599
>;
96100
listSnapshot: FunctionReference<
@@ -118,8 +122,8 @@ export declare const components: {
118122
isDeleted: boolean;
119123
ts: number;
120124
}>;
121-
pageStatus?: "SplitRecommended";
122-
splitCursor?: string;
125+
pageStatus?: null | "SplitRequired" | "SplitRecommended";
126+
splitCursor?: null | string;
123127
}
124128
>;
125129
update: FunctionReference<

example/convex/example.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { paginationOptsValidator } from "convex/server";
66
import { Triggers } from "convex-helpers/server/triggers";
77
import { DataModel } from "./_generated/dataModel";
88
import { customCtx, customMutation } from "convex-helpers/server/customFunctions";
9+
import { PaginatedQueryReference } from "convex/react";
10+
import { api } from "./_generated/api";
911

1012
const userAuditLog = new TableHistory<DataModel, "users">(components.userAuditLog, {
1113
serializability: "wallclock",
@@ -65,6 +67,8 @@ export const listDocumentHistory = query({
6567
},
6668
});
6769

70+
const _typeAssertion: PaginatedQueryReference = api.example.listDocumentHistory;
71+
6872
export const listSnapshot = query({
6973
args: {
7074
snapshotTs: v.number(),

src/client/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ type RunMutationCtx = {
143143
runMutation: GenericMutationCtx<GenericDataModel>["runMutation"];
144144
};
145145

146-
export type OpaqueIds<T> = T extends GenericId<infer _T> | string
146+
export type OpaqueIds<T> = T extends GenericId<infer _T>
147147
? string
148148
: T extends (infer U)[]
149149
? OpaqueIds<U>[]

src/component/_generated/api.d.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ export type Mounts = {
5353
isDeleted: boolean;
5454
ts: number;
5555
}>;
56+
pageStatus?: null | "SplitRequired" | "SplitRecommended";
57+
splitCursor?: null | string;
5658
}
5759
>;
5860
listHistory: FunctionReference<
@@ -79,6 +81,8 @@ export type Mounts = {
7981
isDeleted: boolean;
8082
ts: number;
8183
}>;
84+
pageStatus?: null | "SplitRequired" | "SplitRecommended";
85+
splitCursor?: null | string;
8286
}
8387
>;
8488
listSnapshot: FunctionReference<
@@ -106,8 +110,8 @@ export type Mounts = {
106110
isDeleted: boolean;
107111
ts: number;
108112
}>;
109-
pageStatus?: "SplitRecommended";
110-
splitCursor?: string;
113+
pageStatus?: null | "SplitRequired" | "SplitRecommended";
114+
splitCursor?: null | string;
111115
}
112116
>;
113117
update: FunctionReference<

src/component/lib.ts

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { v, Infer } from "convex/values";
1+
import { v, Infer, Validator } from "convex/values";
22
import { internalMutation, mutation, query, QueryCtx } from "./_generated/server";
33
import { paginator } from "convex-helpers/server/pagination";
44
import schema from "./schema.js";
@@ -85,16 +85,23 @@ export const update = mutation({
8585
},
8686
});
8787

88+
function paginationResultValidator<T>(itemValidator: Validator<T, "required", string>) {
89+
return v.object({
90+
continueCursor: v.string(),
91+
isDone: v.boolean(),
92+
page: v.array(itemValidator),
93+
pageStatus: v.optional(v.union(v.null(), v.literal("SplitRequired"), v.literal("SplitRecommended"))),
94+
splitCursor: v.optional(v.union(v.null(), v.string())),
95+
});
96+
}
97+
export type PaginationResult<T> = Infer<ReturnType<typeof paginationResultValidator<T>>>;
98+
8899
export const listHistory = query({
89100
args: {
90101
maxTs: v.number(),
91102
paginationOpts: paginationOptsValidator,
92103
},
93-
returns: v.object({
94-
continueCursor: v.string(),
95-
isDone: v.boolean(),
96-
page: v.array(historyEntryValidator),
97-
}),
104+
returns: paginationResultValidator(historyEntryValidator),
98105
handler: async (ctx, args) => {
99106
const results = await paginator(ctx.db, schema)
100107
.query("history")
@@ -124,11 +131,7 @@ export const listDocumentHistory = query({
124131
maxTs: v.number(),
125132
paginationOpts: paginationOptsValidator,
126133
},
127-
returns: v.object({
128-
continueCursor: v.string(),
129-
isDone: v.boolean(),
130-
page: v.array(historyEntryValidator),
131-
}),
134+
returns: paginationResultValidator(historyEntryValidator),
132135
handler: async (ctx, args) => {
133136
const results = await paginator(ctx.db, schema)
134137
.query("history")
@@ -151,13 +154,7 @@ export const listSnapshot = query({
151154
currentTs: v.number(),
152155
paginationOpts: paginationOptsValidator,
153156
},
154-
returns: v.object({
155-
continueCursor: v.string(),
156-
isDone: v.boolean(),
157-
page: v.array(historyEntryValidator),
158-
splitCursor: v.optional(v.string()),
159-
pageStatus: v.optional(v.literal("SplitRecommended")),
160-
}),
157+
returns: paginationResultValidator(historyEntryValidator),
161158
handler: async (ctx, args) => {
162159
const pageSize = args.paginationOpts.numItems;
163160
const page: HistoryEntry[] = [];
@@ -234,12 +231,13 @@ export const listSnapshot = query({
234231
page.push(extractHistoryEntry(revision));
235232
}
236233
}
237-
return {
234+
const output: PaginationResult<HistoryEntry> = {
238235
continueCursor: allIdsBeforeCurrentTs[allIdsBeforeCurrentTs.length - 1],
239236
isDone: false,
240237
page,
241238
...maybeSplit(allIdsSeen, pageSize),
242239
};
240+
return output;
243241
},
244242
});
245243

0 commit comments

Comments
 (0)