Skip to content

Commit ac9fd83

Browse files
committed
fix return type validators
1 parent be2bdd4 commit ac9fd83

File tree

5 files changed

+33
-24
lines changed

5 files changed

+33
-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: 16 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,22 @@ 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+
8898
export const listHistory = query({
8999
args: {
90100
maxTs: v.number(),
91101
paginationOpts: paginationOptsValidator,
92102
},
93-
returns: v.object({
94-
continueCursor: v.string(),
95-
isDone: v.boolean(),
96-
page: v.array(historyEntryValidator),
97-
}),
103+
returns: paginationResultValidator(historyEntryValidator),
98104
handler: async (ctx, args) => {
99105
const results = await paginator(ctx.db, schema)
100106
.query("history")
@@ -124,11 +130,7 @@ export const listDocumentHistory = query({
124130
maxTs: v.number(),
125131
paginationOpts: paginationOptsValidator,
126132
},
127-
returns: v.object({
128-
continueCursor: v.string(),
129-
isDone: v.boolean(),
130-
page: v.array(historyEntryValidator),
131-
}),
133+
returns: paginationResultValidator(historyEntryValidator),
132134
handler: async (ctx, args) => {
133135
const results = await paginator(ctx.db, schema)
134136
.query("history")
@@ -151,13 +153,7 @@ export const listSnapshot = query({
151153
currentTs: v.number(),
152154
paginationOpts: paginationOptsValidator,
153155
},
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-
}),
156+
returns: paginationResultValidator(historyEntryValidator),
161157
handler: async (ctx, args) => {
162158
const pageSize = args.paginationOpts.numItems;
163159
const page: HistoryEntry[] = [];
@@ -234,12 +230,13 @@ export const listSnapshot = query({
234230
page.push(extractHistoryEntry(revision));
235231
}
236232
}
237-
return {
233+
const output: Infer<ReturnType<typeof paginationResultValidator<HistoryEntry>>> = {
238234
continueCursor: allIdsBeforeCurrentTs[allIdsBeforeCurrentTs.length - 1],
239235
isDone: false,
240236
page,
241237
...maybeSplit(allIdsSeen, pageSize),
242238
};
239+
return output;
243240
},
244241
});
245242

0 commit comments

Comments
 (0)