zodvex 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/index.d.mts +128 -0
- package/dist/index.d.ts +128 -0
- package/dist/index.js +518 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +496 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +66 -0
- package/src/codec.ts +145 -0
- package/src/custom.ts +155 -0
- package/src/mapping.ts +190 -0
- package/src/tables.ts +58 -0
- package/src/types.ts +78 -0
- package/src/utils.ts +10 -0
- package/src/wrappers.ts +184 -0
- package/src/zodV4Compat.ts +36 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var values = require('convex/values');
|
|
4
|
+
var zod = require('zod');
|
|
5
|
+
var customFunctions = require('convex-helpers/server/customFunctions');
|
|
6
|
+
var server$1 = require('convex/server');
|
|
7
|
+
var server = require('convex-helpers/server');
|
|
8
|
+
|
|
9
|
+
var metadata = /* @__PURE__ */ new WeakMap();
|
|
10
|
+
var registryHelpers = {
|
|
11
|
+
getMetadata: (type) => metadata.get(type),
|
|
12
|
+
setMetadata: (type, meta) => metadata.set(type, meta)
|
|
13
|
+
};
|
|
14
|
+
function zid(tableName) {
|
|
15
|
+
const schema = zod.z.string().refine((val) => typeof val === "string" && val.length > 0, {
|
|
16
|
+
message: `Invalid ID for table "${tableName}"`
|
|
17
|
+
});
|
|
18
|
+
registryHelpers.setMetadata(schema, {
|
|
19
|
+
isConvexId: true,
|
|
20
|
+
tableName
|
|
21
|
+
});
|
|
22
|
+
return schema;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// src/mapping.ts
|
|
26
|
+
function makeUnion(members) {
|
|
27
|
+
const nonNull = members.filter(Boolean);
|
|
28
|
+
if (nonNull.length === 0) return values.v.any();
|
|
29
|
+
if (nonNull.length === 1) return nonNull[0];
|
|
30
|
+
return values.v.union(nonNull[0], nonNull[1], ...nonNull.slice(2));
|
|
31
|
+
}
|
|
32
|
+
function getObjectShape(obj) {
|
|
33
|
+
return obj.shape || {};
|
|
34
|
+
}
|
|
35
|
+
function analyzeZod(schema) {
|
|
36
|
+
let s = schema;
|
|
37
|
+
let optional = false;
|
|
38
|
+
let nullable = false;
|
|
39
|
+
let hasDefault = false;
|
|
40
|
+
while (s instanceof zod.z.ZodDefault || s instanceof zod.z.ZodOptional || s instanceof zod.z.ZodNullable) {
|
|
41
|
+
if (s instanceof zod.z.ZodDefault) hasDefault = true;
|
|
42
|
+
if (s instanceof zod.z.ZodOptional) optional = true;
|
|
43
|
+
if (s instanceof zod.z.ZodNullable) nullable = true;
|
|
44
|
+
const next = s.unwrap?.() ?? s;
|
|
45
|
+
if (next === s) break;
|
|
46
|
+
s = next;
|
|
47
|
+
}
|
|
48
|
+
if (s instanceof zod.z.ZodUnion) {
|
|
49
|
+
const opts = s.options;
|
|
50
|
+
if (opts && opts.some((o) => o instanceof zod.z.ZodNull)) {
|
|
51
|
+
nullable = true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { base: s, optional: optional || hasDefault, nullable, hasDefault };
|
|
55
|
+
}
|
|
56
|
+
function simpleToConvex(schema) {
|
|
57
|
+
const meta = analyzeZod(schema);
|
|
58
|
+
const inner = meta.base;
|
|
59
|
+
try {
|
|
60
|
+
const m = registryHelpers.getMetadata(inner);
|
|
61
|
+
if (m?.isConvexId && m?.tableName && typeof m.tableName === "string") {
|
|
62
|
+
return values.v.id(m.tableName);
|
|
63
|
+
}
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
if (inner instanceof zod.z.ZodString) return values.v.string();
|
|
67
|
+
if (inner instanceof zod.z.ZodNumber) return values.v.float64();
|
|
68
|
+
if (inner instanceof zod.z.ZodBigInt) return values.v.int64();
|
|
69
|
+
if (inner instanceof zod.z.ZodBoolean) return values.v.boolean();
|
|
70
|
+
if (inner instanceof zod.z.ZodDate) return values.v.float64();
|
|
71
|
+
if (inner instanceof zod.z.ZodNull) return values.v.null();
|
|
72
|
+
if (inner instanceof zod.z.ZodAny) return values.v.any();
|
|
73
|
+
if (inner instanceof zod.z.ZodUnknown) return values.v.any();
|
|
74
|
+
if (zod.z.ZodNever && inner instanceof zod.z.ZodNever) return values.v.any();
|
|
75
|
+
if (zod.z.ZodUndefined && inner instanceof zod.z.ZodUndefined) return values.v.any();
|
|
76
|
+
if (inner instanceof zod.z.ZodLiteral) {
|
|
77
|
+
return values.v.literal(inner.value);
|
|
78
|
+
}
|
|
79
|
+
if (inner instanceof zod.z.ZodEnum) {
|
|
80
|
+
const lits = inner.options.map((opt) => values.v.literal(opt));
|
|
81
|
+
return makeUnion(lits);
|
|
82
|
+
}
|
|
83
|
+
if (inner instanceof zod.z.ZodUnion) {
|
|
84
|
+
const opts = inner.options;
|
|
85
|
+
const nonNull = opts.filter((o) => !(o instanceof zod.z.ZodNull));
|
|
86
|
+
const members = nonNull.map((o) => simpleToConvex(o));
|
|
87
|
+
return makeUnion(members);
|
|
88
|
+
}
|
|
89
|
+
if (zod.z.ZodDiscriminatedUnion && inner instanceof zod.z.ZodDiscriminatedUnion) {
|
|
90
|
+
const members = inner.options.map((o) => simpleToConvex(o));
|
|
91
|
+
return makeUnion(members);
|
|
92
|
+
}
|
|
93
|
+
if (inner instanceof zod.z.ZodArray) {
|
|
94
|
+
const el = inner.element;
|
|
95
|
+
return values.v.array(simpleToConvex(el));
|
|
96
|
+
}
|
|
97
|
+
if (inner instanceof zod.z.ZodObject) {
|
|
98
|
+
const shape = getObjectShape(inner);
|
|
99
|
+
const fields = {};
|
|
100
|
+
for (const [k, child] of Object.entries(shape)) {
|
|
101
|
+
fields[k] = convertWithMeta(child, simpleToConvex(child));
|
|
102
|
+
}
|
|
103
|
+
return values.v.object(fields);
|
|
104
|
+
}
|
|
105
|
+
if (inner instanceof zod.z.ZodRecord) {
|
|
106
|
+
const valueType = inner.valueType;
|
|
107
|
+
return values.v.record(values.v.string(), valueType ? simpleToConvex(valueType) : values.v.string());
|
|
108
|
+
}
|
|
109
|
+
if (zod.z.ZodTuple && inner instanceof zod.z.ZodTuple) {
|
|
110
|
+
const items = inner._def?.items ?? [];
|
|
111
|
+
const member = items.length ? makeUnion(items.map((i) => simpleToConvex(i))) : values.v.any();
|
|
112
|
+
return values.v.array(member);
|
|
113
|
+
}
|
|
114
|
+
if (zod.z.ZodIntersection && inner instanceof zod.z.ZodIntersection) {
|
|
115
|
+
const left = inner._def?.left;
|
|
116
|
+
const right = inner._def?.right;
|
|
117
|
+
if (left instanceof zod.z.ZodObject && right instanceof zod.z.ZodObject) {
|
|
118
|
+
const l = getObjectShape(left);
|
|
119
|
+
const r = getObjectShape(right);
|
|
120
|
+
const keys = /* @__PURE__ */ new Set([...Object.keys(l), ...Object.keys(r)]);
|
|
121
|
+
const fields = {};
|
|
122
|
+
for (const k of keys) {
|
|
123
|
+
const lz = l[k];
|
|
124
|
+
const rz = r[k];
|
|
125
|
+
if (lz && rz) {
|
|
126
|
+
fields[k] = makeUnion([simpleToConvex(lz), simpleToConvex(rz)]);
|
|
127
|
+
} else {
|
|
128
|
+
const zf = lz || rz;
|
|
129
|
+
fields[k] = simpleToConvex(zf);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return values.v.object(fields);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return values.v.any();
|
|
136
|
+
}
|
|
137
|
+
function convertWithMeta(zodField, baseValidator) {
|
|
138
|
+
const meta = analyzeZod(zodField);
|
|
139
|
+
let core = baseValidator;
|
|
140
|
+
const inner = meta.base;
|
|
141
|
+
if (inner instanceof zod.z.ZodObject) {
|
|
142
|
+
const childShape = getObjectShape(inner);
|
|
143
|
+
const baseChildren = Object.fromEntries(
|
|
144
|
+
Object.entries(childShape).map(([k, v2]) => [k, simpleToConvex(v2)])
|
|
145
|
+
);
|
|
146
|
+
const rebuiltChildren = {};
|
|
147
|
+
for (const [k, childZ] of Object.entries(childShape)) {
|
|
148
|
+
rebuiltChildren[k] = convertWithMeta(childZ, baseChildren[k]);
|
|
149
|
+
}
|
|
150
|
+
core = values.v.object(rebuiltChildren);
|
|
151
|
+
} else if (inner instanceof zod.z.ZodArray) {
|
|
152
|
+
const elZod = inner.element;
|
|
153
|
+
const baseEl = simpleToConvex(elZod);
|
|
154
|
+
const rebuiltEl = convertWithMeta(elZod, baseEl);
|
|
155
|
+
core = values.v.array(rebuiltEl);
|
|
156
|
+
}
|
|
157
|
+
if (meta.nullable) {
|
|
158
|
+
core = makeUnion([core, values.v.null()]);
|
|
159
|
+
}
|
|
160
|
+
if (meta.optional) {
|
|
161
|
+
core = values.v.optional(core);
|
|
162
|
+
}
|
|
163
|
+
return core;
|
|
164
|
+
}
|
|
165
|
+
function zodToConvex(schema) {
|
|
166
|
+
return convertWithMeta(schema, simpleToConvex(schema));
|
|
167
|
+
}
|
|
168
|
+
function zodToConvexFields(shapeOrObject) {
|
|
169
|
+
let shape;
|
|
170
|
+
if (shapeOrObject instanceof zod.z.ZodObject) {
|
|
171
|
+
shape = getObjectShape(shapeOrObject);
|
|
172
|
+
} else {
|
|
173
|
+
shape = shapeOrObject;
|
|
174
|
+
}
|
|
175
|
+
const out = {};
|
|
176
|
+
for (const [key, zodField] of Object.entries(shape)) {
|
|
177
|
+
out[key] = convertWithMeta(zodField, simpleToConvex(zodField));
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
function toConvexJS(schemaOrValue, value) {
|
|
182
|
+
if (arguments.length === 1) {
|
|
183
|
+
const val = schemaOrValue;
|
|
184
|
+
if (val === void 0) return void 0;
|
|
185
|
+
if (val && typeof val === "object" && !Array.isArray(val) && !(val instanceof Date)) {
|
|
186
|
+
const out = {};
|
|
187
|
+
for (const [k, v2] of Object.entries(val)) {
|
|
188
|
+
const converted = toConvexJS(v2);
|
|
189
|
+
if (converted !== void 0) out[k] = converted;
|
|
190
|
+
}
|
|
191
|
+
return out;
|
|
192
|
+
}
|
|
193
|
+
if (Array.isArray(val)) {
|
|
194
|
+
return val.map((item) => toConvexJS(item));
|
|
195
|
+
}
|
|
196
|
+
if (val instanceof Date) {
|
|
197
|
+
return val.getTime();
|
|
198
|
+
}
|
|
199
|
+
return val;
|
|
200
|
+
}
|
|
201
|
+
const schema = schemaOrValue;
|
|
202
|
+
if (value === void 0) return void 0;
|
|
203
|
+
if (schema instanceof zod.z.ZodDefault) {
|
|
204
|
+
return toConvexJS(schema.unwrap(), value);
|
|
205
|
+
}
|
|
206
|
+
if (schema instanceof zod.z.ZodOptional) {
|
|
207
|
+
if (value === void 0) return void 0;
|
|
208
|
+
return toConvexJS(schema.unwrap(), value);
|
|
209
|
+
}
|
|
210
|
+
if (schema instanceof zod.z.ZodNullable) {
|
|
211
|
+
if (value === null) return null;
|
|
212
|
+
return toConvexJS(schema.unwrap(), value);
|
|
213
|
+
}
|
|
214
|
+
if (schema && schema.type === "pipe" && "out" in schema) {
|
|
215
|
+
return toConvexJS(schema.out, value);
|
|
216
|
+
}
|
|
217
|
+
if (schema instanceof zod.z.ZodObject && value && typeof value === "object") {
|
|
218
|
+
const shape = getObjectShape(schema);
|
|
219
|
+
const out = {};
|
|
220
|
+
for (const [k, child] of Object.entries(shape)) {
|
|
221
|
+
const v2 = toConvexJS(child, value[k]);
|
|
222
|
+
if (v2 !== void 0) out[k] = v2;
|
|
223
|
+
}
|
|
224
|
+
return out;
|
|
225
|
+
}
|
|
226
|
+
if (schema instanceof zod.z.ZodArray && Array.isArray(value)) {
|
|
227
|
+
const el = schema.element;
|
|
228
|
+
return value.map((item) => toConvexJS(el, item));
|
|
229
|
+
}
|
|
230
|
+
if (schema instanceof zod.z.ZodDate && value instanceof Date) {
|
|
231
|
+
return value.getTime();
|
|
232
|
+
}
|
|
233
|
+
return value;
|
|
234
|
+
}
|
|
235
|
+
function fromConvexJS(value, schema) {
|
|
236
|
+
if (value === void 0) return void 0;
|
|
237
|
+
if (schema && schema.type === "pipe" && "out" in schema) {
|
|
238
|
+
return fromConvexJS(value, schema.out);
|
|
239
|
+
}
|
|
240
|
+
if (schema instanceof zod.z.ZodDefault) {
|
|
241
|
+
return fromConvexJS(value, schema.unwrap());
|
|
242
|
+
}
|
|
243
|
+
if (schema instanceof zod.z.ZodOptional) {
|
|
244
|
+
if (value === void 0) return void 0;
|
|
245
|
+
return fromConvexJS(value, schema.unwrap());
|
|
246
|
+
}
|
|
247
|
+
if (schema instanceof zod.z.ZodNullable) {
|
|
248
|
+
if (value === null) return null;
|
|
249
|
+
return fromConvexJS(value, schema.unwrap());
|
|
250
|
+
}
|
|
251
|
+
if (schema instanceof zod.z.ZodObject && value && typeof value === "object") {
|
|
252
|
+
const shape = getObjectShape(schema);
|
|
253
|
+
const out = {};
|
|
254
|
+
for (const [k, child] of Object.entries(shape)) {
|
|
255
|
+
if (k in value) out[k] = fromConvexJS(value[k], child);
|
|
256
|
+
}
|
|
257
|
+
return out;
|
|
258
|
+
}
|
|
259
|
+
if (schema instanceof zod.z.ZodArray && Array.isArray(value)) {
|
|
260
|
+
const el = schema.element;
|
|
261
|
+
return value.map((item) => fromConvexJS(item, el));
|
|
262
|
+
}
|
|
263
|
+
if (schema instanceof zod.z.ZodDate && typeof value === "number") {
|
|
264
|
+
return new Date(value);
|
|
265
|
+
}
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
function convexCodec(schema) {
|
|
269
|
+
const toConvexSchema = () => {
|
|
270
|
+
if (schema instanceof zod.z.ZodObject) {
|
|
271
|
+
const shape = getObjectShape(schema);
|
|
272
|
+
return zodToConvexFields(shape);
|
|
273
|
+
}
|
|
274
|
+
return zodToConvex(schema);
|
|
275
|
+
};
|
|
276
|
+
const encode = (data) => {
|
|
277
|
+
const parsed = schema.parse(data);
|
|
278
|
+
return toConvexJS(schema, parsed);
|
|
279
|
+
};
|
|
280
|
+
const decode = (data) => fromConvexJS(data, schema);
|
|
281
|
+
const pick2 = (keys) => {
|
|
282
|
+
if (!(schema instanceof zod.z.ZodObject))
|
|
283
|
+
throw new Error("pick() is only supported on ZodObject schemas");
|
|
284
|
+
const picked = schema.pick(keys);
|
|
285
|
+
return convexCodec(picked);
|
|
286
|
+
};
|
|
287
|
+
return { schema, toConvexSchema, encode, decode, pick: pick2 };
|
|
288
|
+
}
|
|
289
|
+
function zQuery(query, input, handler, options) {
|
|
290
|
+
let zodSchema;
|
|
291
|
+
let args;
|
|
292
|
+
if (input instanceof zod.z.ZodObject) {
|
|
293
|
+
zodSchema = input;
|
|
294
|
+
args = zodToConvexFields(getObjectShape(input));
|
|
295
|
+
} else if (input instanceof zod.z.ZodType) {
|
|
296
|
+
zodSchema = zod.z.object({ value: input });
|
|
297
|
+
args = { value: zodToConvex(input) };
|
|
298
|
+
} else {
|
|
299
|
+
zodSchema = zod.z.object(input);
|
|
300
|
+
args = zodToConvexFields(input);
|
|
301
|
+
}
|
|
302
|
+
const returns = options?.returns ? zodToConvex(options.returns) : void 0;
|
|
303
|
+
return query({
|
|
304
|
+
args,
|
|
305
|
+
returns,
|
|
306
|
+
handler: async (ctx, argsObject) => {
|
|
307
|
+
const parsed = zodSchema.parse(argsObject);
|
|
308
|
+
const raw = await handler(ctx, parsed);
|
|
309
|
+
if (options?.returns) {
|
|
310
|
+
const validated = options.returns.parse(raw);
|
|
311
|
+
return toConvexJS(options.returns, validated);
|
|
312
|
+
}
|
|
313
|
+
return raw;
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
function zInternalQuery(internalQuery, input, handler, options) {
|
|
318
|
+
return zQuery(internalQuery, input, handler, options);
|
|
319
|
+
}
|
|
320
|
+
function zMutation(mutation, input, handler, options) {
|
|
321
|
+
let zodSchema;
|
|
322
|
+
let args;
|
|
323
|
+
if (input instanceof zod.z.ZodObject) {
|
|
324
|
+
zodSchema = input;
|
|
325
|
+
args = zodToConvexFields(getObjectShape(input));
|
|
326
|
+
} else if (input instanceof zod.z.ZodType) {
|
|
327
|
+
zodSchema = zod.z.object({ value: input });
|
|
328
|
+
args = { value: zodToConvex(input) };
|
|
329
|
+
} else {
|
|
330
|
+
zodSchema = zod.z.object(input);
|
|
331
|
+
args = zodToConvexFields(input);
|
|
332
|
+
}
|
|
333
|
+
const returns = options?.returns ? zodToConvex(options.returns) : void 0;
|
|
334
|
+
return mutation({
|
|
335
|
+
args,
|
|
336
|
+
returns,
|
|
337
|
+
handler: async (ctx, argsObject) => {
|
|
338
|
+
const parsed = zodSchema.parse(argsObject);
|
|
339
|
+
const raw = await handler(ctx, parsed);
|
|
340
|
+
if (options?.returns) {
|
|
341
|
+
const validated = options.returns.parse(raw);
|
|
342
|
+
return toConvexJS(options.returns, validated);
|
|
343
|
+
}
|
|
344
|
+
return raw;
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
function zInternalMutation(internalMutation, input, handler, options) {
|
|
349
|
+
return zMutation(internalMutation, input, handler, options);
|
|
350
|
+
}
|
|
351
|
+
function zAction(action, input, handler, options) {
|
|
352
|
+
let zodSchema;
|
|
353
|
+
let args;
|
|
354
|
+
if (input instanceof zod.z.ZodObject) {
|
|
355
|
+
zodSchema = input;
|
|
356
|
+
args = zodToConvexFields(getObjectShape(input));
|
|
357
|
+
} else if (input instanceof zod.z.ZodType) {
|
|
358
|
+
zodSchema = zod.z.object({ value: input });
|
|
359
|
+
args = { value: zodToConvex(input) };
|
|
360
|
+
} else {
|
|
361
|
+
zodSchema = zod.z.object(input);
|
|
362
|
+
args = zodToConvexFields(input);
|
|
363
|
+
}
|
|
364
|
+
const returns = options?.returns ? zodToConvex(options.returns) : void 0;
|
|
365
|
+
return action({
|
|
366
|
+
args,
|
|
367
|
+
returns,
|
|
368
|
+
handler: async (ctx, argsObject) => {
|
|
369
|
+
const parsed = zodSchema.parse(argsObject);
|
|
370
|
+
const raw = await handler(ctx, parsed);
|
|
371
|
+
if (options?.returns) {
|
|
372
|
+
const validated = options.returns.parse(raw);
|
|
373
|
+
return toConvexJS(options.returns, validated);
|
|
374
|
+
}
|
|
375
|
+
return raw;
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
function zInternalAction(internalAction, input, handler, options) {
|
|
380
|
+
return zAction(internalAction, input, handler, options);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// src/utils.ts
|
|
384
|
+
function pick(obj, keys) {
|
|
385
|
+
const result = {};
|
|
386
|
+
for (const key of keys) {
|
|
387
|
+
if (key in obj) result[key] = obj[key];
|
|
388
|
+
}
|
|
389
|
+
return result;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// src/custom.ts
|
|
393
|
+
function customFnBuilder(builder, customization) {
|
|
394
|
+
const customInput = customization.input ?? customFunctions.NoOp.input;
|
|
395
|
+
const inputArgs = customization.args ?? customFunctions.NoOp.args;
|
|
396
|
+
return function customBuilder(fn) {
|
|
397
|
+
const { args, handler = fn, returns: maybeObject, ...extra } = fn;
|
|
398
|
+
const returns = maybeObject && !(maybeObject instanceof zod.z.ZodType) ? zod.z.object(maybeObject) : maybeObject;
|
|
399
|
+
const returnValidator = returns && !fn.skipConvexValidation ? { returns: zodToConvex(returns) } : void 0;
|
|
400
|
+
if (args && !fn.skipConvexValidation) {
|
|
401
|
+
let argsValidator = args;
|
|
402
|
+
if (argsValidator instanceof zod.z.ZodType) {
|
|
403
|
+
if (argsValidator instanceof zod.z.ZodObject) {
|
|
404
|
+
argsValidator = argsValidator.shape;
|
|
405
|
+
} else {
|
|
406
|
+
throw new Error(
|
|
407
|
+
"Unsupported zod type as args validator: " + argsValidator.constructor.name
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
const convexValidator = zodToConvexFields(argsValidator);
|
|
412
|
+
return builder({
|
|
413
|
+
args: { ...convexValidator, ...inputArgs },
|
|
414
|
+
...returnValidator,
|
|
415
|
+
handler: async (ctx, allArgs) => {
|
|
416
|
+
const added = await customInput(ctx, pick(allArgs, Object.keys(inputArgs)), extra);
|
|
417
|
+
const rawArgs = pick(allArgs, Object.keys(argsValidator));
|
|
418
|
+
const parsed = zod.z.object(argsValidator).safeParse(rawArgs);
|
|
419
|
+
if (!parsed.success) {
|
|
420
|
+
throw new values.ConvexError({
|
|
421
|
+
ZodError: JSON.parse(JSON.stringify(parsed.error.flatten(), null, 2))
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
const result = await handler({ ...ctx, ...added }, parsed.data);
|
|
425
|
+
if (returns && !fn.skipConvexValidation) {
|
|
426
|
+
const validated = returns.parse(result);
|
|
427
|
+
return toConvexJS(returns, validated);
|
|
428
|
+
}
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
return builder({
|
|
434
|
+
args: inputArgs,
|
|
435
|
+
...returnValidator,
|
|
436
|
+
handler: async (ctx, allArgs) => {
|
|
437
|
+
const added = await customInput(ctx, pick(allArgs, Object.keys(inputArgs)), extra);
|
|
438
|
+
const result = await handler({ ...ctx, ...added }, allArgs);
|
|
439
|
+
if (returns && !fn.skipConvexValidation) {
|
|
440
|
+
const validated = returns.parse(result);
|
|
441
|
+
return toConvexJS(returns, validated);
|
|
442
|
+
}
|
|
443
|
+
return result;
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
function zCustomQuery(query, customization) {
|
|
449
|
+
return customFnBuilder(query, customization);
|
|
450
|
+
}
|
|
451
|
+
function zCustomMutation(mutation, customization) {
|
|
452
|
+
return customFnBuilder(mutation, customization);
|
|
453
|
+
}
|
|
454
|
+
function zCustomAction(action, customization) {
|
|
455
|
+
return customFnBuilder(action, customization);
|
|
456
|
+
}
|
|
457
|
+
function zodTable(name, schema) {
|
|
458
|
+
const codec = convexCodec(schema);
|
|
459
|
+
const tableDefinition = server.Table(name, codec.toConvexSchema());
|
|
460
|
+
return { ...tableDefinition, codec, schema };
|
|
461
|
+
}
|
|
462
|
+
function zCrud(table, queryBuilder, mutationBuilder) {
|
|
463
|
+
const tableName = table.name;
|
|
464
|
+
const shape = table.schema.shape;
|
|
465
|
+
return {
|
|
466
|
+
create: zMutation(mutationBuilder, shape, async (ctx, args) => {
|
|
467
|
+
return await ctx.db.insert(tableName, args);
|
|
468
|
+
}),
|
|
469
|
+
read: zQuery(queryBuilder, { id: zid(tableName) }, async (ctx, { id }) => {
|
|
470
|
+
return await ctx.db.get(id);
|
|
471
|
+
}),
|
|
472
|
+
paginate: queryBuilder({
|
|
473
|
+
args: { paginationOpts: server$1.paginationOptsValidator },
|
|
474
|
+
handler: async (ctx, { paginationOpts }) => {
|
|
475
|
+
return await ctx.db.query(tableName).paginate(paginationOpts);
|
|
476
|
+
}
|
|
477
|
+
}),
|
|
478
|
+
update: zMutation(
|
|
479
|
+
mutationBuilder,
|
|
480
|
+
{
|
|
481
|
+
id: zid(tableName),
|
|
482
|
+
patch: zod.z.object(shape).partial()
|
|
483
|
+
},
|
|
484
|
+
async (ctx, { id, patch }) => {
|
|
485
|
+
await ctx.db.patch(id, patch);
|
|
486
|
+
}
|
|
487
|
+
),
|
|
488
|
+
destroy: zMutation(mutationBuilder, { id: zid(tableName) }, async (ctx, { id }) => {
|
|
489
|
+
const doc = await ctx.db.get(id);
|
|
490
|
+
if (doc) await ctx.db.delete(id);
|
|
491
|
+
return doc;
|
|
492
|
+
})
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
exports.analyzeZod = analyzeZod;
|
|
497
|
+
exports.convexCodec = convexCodec;
|
|
498
|
+
exports.fromConvexJS = fromConvexJS;
|
|
499
|
+
exports.getObjectShape = getObjectShape;
|
|
500
|
+
exports.makeUnion = makeUnion;
|
|
501
|
+
exports.simpleToConvex = simpleToConvex;
|
|
502
|
+
exports.toConvexJS = toConvexJS;
|
|
503
|
+
exports.zAction = zAction;
|
|
504
|
+
exports.zCrud = zCrud;
|
|
505
|
+
exports.zCustomAction = zCustomAction;
|
|
506
|
+
exports.zCustomMutation = zCustomMutation;
|
|
507
|
+
exports.zCustomQuery = zCustomQuery;
|
|
508
|
+
exports.zInternalAction = zInternalAction;
|
|
509
|
+
exports.zInternalMutation = zInternalMutation;
|
|
510
|
+
exports.zInternalQuery = zInternalQuery;
|
|
511
|
+
exports.zMutation = zMutation;
|
|
512
|
+
exports.zQuery = zQuery;
|
|
513
|
+
exports.zid = zid;
|
|
514
|
+
exports.zodTable = zodTable;
|
|
515
|
+
exports.zodToConvex = zodToConvex;
|
|
516
|
+
exports.zodToConvexFields = zodToConvexFields;
|
|
517
|
+
//# sourceMappingURL=index.js.map
|
|
518
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/zodV4Compat.ts","../src/mapping.ts","../src/codec.ts","../src/wrappers.ts","../src/utils.ts","../src/custom.ts","../src/tables.ts"],"names":["z","v","pick","NoOp","ConvexError","Table","paginationOptsValidator"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Minimal compatibility for convex-helpers/server/zodV4 imports\n * This library itself IS the Zod v4 compatibility layer\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n\n// Simple registry for metadata\nconst metadata = new WeakMap<z.ZodTypeAny, any>()\n\nexport const registryHelpers = {\n getMetadata: (type: z.ZodTypeAny) => metadata.get(type),\n setMetadata: (type: z.ZodTypeAny, meta: any) => metadata.set(type, meta)\n}\n\n/**\n * Create a Zod validator for a Convex Id\n */\nexport function zid<TableName extends string>(tableName: TableName): z.ZodTypeAny {\n const schema = z\n .string()\n .refine((val): val is GenericId<TableName> => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n })\n\n // Store metadata for registry lookup\n registryHelpers.setMetadata(schema, {\n isConvexId: true,\n tableName\n })\n\n return schema as z.ZodTypeAny\n}\n\nexport type Zid<TableName extends string> = ReturnType<typeof zid<TableName>>\n","import { type Validator, v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers } from './zodV4Compat'\n\n// union helpers\nexport function makeUnion(members: any[]): any {\n const nonNull = members.filter(Boolean)\n if (nonNull.length === 0) return v.any()\n if (nonNull.length === 1) return nonNull[0]\n return v.union(nonNull[0], nonNull[1], ...nonNull.slice(2))\n}\n\nexport function getObjectShape(obj: z.ZodObject<any>): Record<string, z.ZodTypeAny> {\n return (obj.shape || {}) as Record<string, z.ZodTypeAny>\n}\n\nexport function analyzeZod(schema: z.ZodTypeAny): {\n base: z.ZodTypeAny\n optional: boolean\n nullable: boolean\n hasDefault: boolean\n} {\n let s: z.ZodTypeAny = schema\n let optional = false\n let nullable = false\n let hasDefault = false\n\n while (s instanceof z.ZodDefault || s instanceof z.ZodOptional || s instanceof z.ZodNullable) {\n if (s instanceof z.ZodDefault) hasDefault = true\n if (s instanceof z.ZodOptional) optional = true\n if (s instanceof z.ZodNullable) nullable = true\n const next = (s as any).unwrap?.() ?? s\n if (next === s) break\n s = next as z.ZodTypeAny\n }\n if (s instanceof z.ZodUnion) {\n const opts = (s as z.ZodUnion<any>).options as z.ZodTypeAny[]\n if (opts && opts.some(o => o instanceof z.ZodNull)) {\n nullable = true\n }\n }\n return { base: s, optional: optional || hasDefault, nullable, hasDefault }\n}\n\nexport function simpleToConvex(schema: z.ZodTypeAny): any {\n const meta = analyzeZod(schema)\n const inner = meta.base\n\n try {\n const m = registryHelpers.getMetadata(inner as any)\n if (m?.isConvexId && m?.tableName && typeof m.tableName === 'string') {\n return v.id(m.tableName)\n }\n } catch {\n // Ignore metadata errors - fallback to type-based conversion\n }\n\n if (inner instanceof z.ZodString) return v.string()\n if (inner instanceof z.ZodNumber) return v.float64()\n if (inner instanceof z.ZodBigInt) return v.int64()\n if (inner instanceof z.ZodBoolean) return v.boolean()\n if (inner instanceof z.ZodDate) return v.float64()\n if (inner instanceof z.ZodNull) return v.null()\n if (inner instanceof z.ZodAny) return v.any()\n if (inner instanceof z.ZodUnknown) return v.any()\n if ((z as any).ZodNever && inner instanceof (z as any).ZodNever) return v.any()\n if ((z as any).ZodUndefined && inner instanceof (z as any).ZodUndefined) return v.any()\n\n if (inner instanceof z.ZodLiteral) {\n return v.literal((inner as any).value)\n }\n\n if (inner instanceof z.ZodEnum) {\n const lits = (inner as any).options.map((opt: any) => v.literal(opt))\n return makeUnion(lits)\n }\n\n if (inner instanceof z.ZodUnion) {\n const opts: z.ZodTypeAny[] = (inner as z.ZodUnion<any>).options\n const nonNull = opts.filter(o => !(o instanceof z.ZodNull))\n const members = nonNull.map(o => simpleToConvex(o))\n return makeUnion(members)\n }\n\n if ((z as any).ZodDiscriminatedUnion && inner instanceof (z as any).ZodDiscriminatedUnion) {\n const members = (inner as any).options.map((o: z.ZodTypeAny) => simpleToConvex(o))\n return makeUnion(members)\n }\n\n if (inner instanceof z.ZodArray) {\n const el = (inner as z.ZodArray<any>).element as z.ZodTypeAny\n return v.array(simpleToConvex(el))\n }\n\n if (inner instanceof z.ZodObject) {\n const shape = getObjectShape(inner)\n const fields: Record<string, any> = {}\n for (const [k, child] of Object.entries(shape)) {\n fields[k] = convertWithMeta(child as z.ZodTypeAny, simpleToConvex(child as z.ZodTypeAny))\n }\n return v.object(fields)\n }\n\n if (inner instanceof z.ZodRecord) {\n const valueType = (inner as z.ZodRecord<any>).valueType as z.ZodTypeAny\n // When z.record(z.string()) is used, valueType is undefined and defaults to z.string()\n return v.record(v.string(), valueType ? simpleToConvex(valueType) : v.string())\n }\n\n if ((z as any).ZodTuple && inner instanceof (z as any).ZodTuple) {\n const items = ((inner as any)._def?.items ?? []) as z.ZodTypeAny[]\n const member = items.length ? makeUnion(items.map(i => simpleToConvex(i))) : v.any()\n return v.array(member)\n }\n\n if ((z as any).ZodIntersection && inner instanceof (z as any).ZodIntersection) {\n const left = (inner as any)._def?.left as z.ZodTypeAny\n const right = (inner as any)._def?.right as z.ZodTypeAny\n if (left instanceof z.ZodObject && right instanceof z.ZodObject) {\n const l = getObjectShape(left)\n const r = getObjectShape(right)\n const keys = new Set([...Object.keys(l), ...Object.keys(r)])\n const fields: Record<string, any> = {}\n for (const k of keys) {\n const lz = l[k]\n const rz = r[k]\n if (lz && rz) {\n fields[k] = makeUnion([simpleToConvex(lz), simpleToConvex(rz)])\n } else {\n const zf = (lz || rz) as z.ZodTypeAny\n fields[k] = simpleToConvex(zf)\n }\n }\n return v.object(fields)\n }\n }\n\n return v.any()\n}\n\nexport function convertWithMeta(zodField: z.ZodTypeAny, baseValidator: any): any {\n const meta = analyzeZod(zodField)\n let core = baseValidator\n\n const inner = meta.base\n if (inner instanceof z.ZodObject) {\n const childShape = getObjectShape(inner as any)\n const baseChildren: Record<string, any> = Object.fromEntries(\n Object.entries(childShape).map(([k, v]) => [k, simpleToConvex(v as z.ZodTypeAny)])\n )\n const rebuiltChildren: Record<string, any> = {}\n for (const [k, childZ] of Object.entries(childShape)) {\n rebuiltChildren[k] = convertWithMeta(childZ, baseChildren[k])\n }\n core = v.object(rebuiltChildren)\n } else if (inner instanceof z.ZodArray) {\n const elZod = (inner as z.ZodArray<any>).element as z.ZodTypeAny\n const baseEl = simpleToConvex(elZod)\n const rebuiltEl = convertWithMeta(elZod, baseEl)\n core = v.array(rebuiltEl)\n }\n\n if (meta.nullable) {\n core = makeUnion([core, v.null()])\n }\n if (meta.optional) {\n core = v.optional(core)\n }\n return core\n}\n\nexport function zodToConvex(schema: z.ZodTypeAny): Validator<any, any, any> {\n return convertWithMeta(schema, simpleToConvex(schema))\n}\n\nexport function zodToConvexFields(\n shapeOrObject: z.ZodRawShape | Record<string, z.ZodTypeAny> | z.ZodObject<any>\n): Record<string, Validator<any, any, any>> {\n let shape: Record<string, z.ZodTypeAny>\n if (shapeOrObject instanceof z.ZodObject) {\n shape = getObjectShape(shapeOrObject as z.ZodObject<any>)\n } else {\n shape = shapeOrObject as Record<string, z.ZodTypeAny>\n }\n const out: Record<string, Validator<any, any, any>> = {}\n for (const [key, zodField] of Object.entries(shape)) {\n out[key] = convertWithMeta(zodField, simpleToConvex(zodField))\n }\n return out\n}\n","import { z } from 'zod'\nimport { getObjectShape, zodToConvex, zodToConvexFields } from './mapping'\n\nexport type ConvexCodec<T = any> = {\n schema: z.ZodTypeAny\n toConvexSchema: () => any\n encode: (data: T) => any\n decode: (data: any) => T\n pick: (keys: Record<string, true>) => ConvexCodec<any>\n}\n\nexport function toConvexJS(value: any): any\nexport function toConvexJS(schema: z.ZodTypeAny, value: any): any\nexport function toConvexJS(schemaOrValue: any, value?: any): any {\n // If called with one argument, treat it as value without schema\n if (arguments.length === 1) {\n const val = schemaOrValue\n if (val === undefined) return undefined\n\n // Handle objects recursively\n if (val && typeof val === 'object' && !Array.isArray(val) && !(val instanceof Date)) {\n const out: any = {}\n for (const [k, v] of Object.entries(val)) {\n const converted = toConvexJS(v)\n if (converted !== undefined) out[k] = converted\n }\n return out\n }\n\n // Handle arrays\n if (Array.isArray(val)) {\n return val.map(item => toConvexJS(item))\n }\n\n // Convert dates to timestamps\n if (val instanceof Date) {\n return val.getTime()\n }\n\n return val\n }\n\n // Two arguments: use schema-based conversion\n const schema = schemaOrValue as z.ZodTypeAny\n if (value === undefined) return undefined\n\n if (schema instanceof z.ZodDefault) {\n return toConvexJS((schema as any).unwrap(), value)\n }\n if (schema instanceof z.ZodOptional) {\n if (value === undefined) return undefined\n return toConvexJS((schema as any).unwrap(), value)\n }\n if (schema instanceof z.ZodNullable) {\n if (value === null) return null\n return toConvexJS((schema as any).unwrap(), value)\n }\n // Pipeline: encode according to output side\n if ((schema as any) && (schema as any).type === 'pipe' && 'out' in (schema as any)) {\n return toConvexJS((schema as any).out as z.ZodTypeAny, value)\n }\n\n if (schema instanceof z.ZodObject && value && typeof value === 'object') {\n const shape = getObjectShape(schema)\n const out: any = {}\n for (const [k, child] of Object.entries(shape)) {\n const v = toConvexJS(child, (value as any)[k])\n if (v !== undefined) out[k] = v\n }\n return out\n }\n\n if (schema instanceof z.ZodArray && Array.isArray(value)) {\n const el = (schema as z.ZodArray<any>).element as z.ZodTypeAny\n return value.map(item => toConvexJS(el, item))\n }\n\n if (schema instanceof z.ZodDate && value instanceof Date) {\n return value.getTime()\n }\n return value\n}\n\nexport function fromConvexJS(value: any, schema: z.ZodTypeAny): any {\n if (value === undefined) return undefined\n\n if ((schema as any) && (schema as any).type === 'pipe' && 'out' in (schema as any)) {\n return fromConvexJS(value, (schema as any).out as z.ZodTypeAny)\n }\n if (schema instanceof z.ZodDefault) {\n return fromConvexJS(value, (schema as any).unwrap())\n }\n if (schema instanceof z.ZodOptional) {\n if (value === undefined) return undefined\n return fromConvexJS(value, (schema as any).unwrap())\n }\n if (schema instanceof z.ZodNullable) {\n if (value === null) return null\n return fromConvexJS(value, (schema as any).unwrap())\n }\n\n if (schema instanceof z.ZodObject && value && typeof value === 'object') {\n const shape = getObjectShape(schema)\n const out: any = {}\n for (const [k, child] of Object.entries(shape)) {\n if (k in (value as any)) out[k] = fromConvexJS((value as any)[k], child)\n }\n return out\n }\n\n if (schema instanceof z.ZodArray && Array.isArray(value)) {\n const el = (schema as z.ZodArray<any>).element as z.ZodTypeAny\n return value.map(item => fromConvexJS(item, el))\n }\n\n if (schema instanceof z.ZodDate && typeof value === 'number') {\n return new Date(value)\n }\n return value\n}\n\nexport function convexCodec<T = any>(schema: z.ZodTypeAny): ConvexCodec<T> {\n const toConvexSchema = () => {\n if (schema instanceof z.ZodObject) {\n const shape = getObjectShape(schema)\n return zodToConvexFields(shape)\n }\n return zodToConvex(schema)\n }\n\n const encode = (data: any) => {\n const parsed = schema.parse(data)\n return toConvexJS(schema, parsed)\n }\n const decode = (data: any) => fromConvexJS(data, schema)\n\n const pick = (keys: Record<string, true>): ConvexCodec<any> => {\n if (!(schema instanceof z.ZodObject))\n throw new Error('pick() is only supported on ZodObject schemas')\n const picked = (schema as z.ZodObject<any>).pick(keys as any)\n return convexCodec(picked)\n }\n\n return { schema, toConvexSchema, encode, decode, pick }\n}\n","import { z } from 'zod'\nimport { toConvexJS } from './codec'\nimport { getObjectShape, zodToConvex, zodToConvexFields } from './mapping'\nimport {\n type ExtractCtx,\n type InferArgs,\n type InferReturns,\n type PreserveReturnType,\n type ZodToConvexArgs\n} from './types'\n\nexport function zQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined\n>(\n query: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: InferArgs<A>\n ) => Promise<InferReturns<R>> | InferReturns<R>,\n options?: { returns?: R }\n): PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n zodSchema = input\n args = zodToConvexFields(getObjectShape(input))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as z.ZodTypeAny })\n args = { value: zodToConvex(input as z.ZodTypeAny) }\n } else {\n zodSchema = z.object(input as Record<string, z.ZodTypeAny>)\n args = zodToConvexFields(input as Record<string, z.ZodTypeAny>)\n }\n const returns = options?.returns ? zodToConvex(options.returns) : undefined\n\n return query({\n args,\n returns,\n handler: async (ctx: ExtractCtx<Builder>, argsObject: unknown) => {\n const parsed = zodSchema.parse(argsObject) as InferArgs<A>\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n }\n return raw as any\n }\n }) as PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>>\n}\n\nexport function zInternalQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined\n>(\n internalQuery: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: InferArgs<A>\n ) => Promise<InferReturns<R>> | InferReturns<R>,\n options?: { returns?: R }\n): PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>> {\n return zQuery(internalQuery, input, handler, options)\n}\n\nexport function zMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined\n>(\n mutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: InferArgs<A>\n ) => Promise<InferReturns<R>> | InferReturns<R>,\n options?: { returns?: R }\n): PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n zodSchema = input\n args = zodToConvexFields(getObjectShape(input))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as z.ZodTypeAny })\n args = { value: zodToConvex(input as z.ZodTypeAny) }\n } else {\n zodSchema = z.object(input as Record<string, z.ZodTypeAny>)\n args = zodToConvexFields(input as Record<string, z.ZodTypeAny>)\n }\n const returns = options?.returns ? zodToConvex(options.returns) : undefined\n\n return mutation({\n args,\n returns,\n handler: async (ctx: ExtractCtx<Builder>, argsObject: unknown) => {\n const parsed = zodSchema.parse(argsObject) as InferArgs<A>\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n }\n return raw as any\n }\n }) as PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>>\n}\n\nexport function zInternalMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined\n>(\n internalMutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: InferArgs<A>\n ) => Promise<InferReturns<R>> | InferReturns<R>,\n options?: { returns?: R }\n): PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>> {\n return zMutation(internalMutation, input, handler, options)\n}\n\nexport function zAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined\n>(\n action: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: InferArgs<A>\n ) => Promise<InferReturns<R>> | InferReturns<R>,\n options?: { returns?: R }\n): PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n zodSchema = input\n args = zodToConvexFields(getObjectShape(input))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as z.ZodTypeAny })\n args = { value: zodToConvex(input as z.ZodTypeAny) }\n } else {\n zodSchema = z.object(input as Record<string, z.ZodTypeAny>)\n args = zodToConvexFields(input as Record<string, z.ZodTypeAny>)\n }\n const returns = options?.returns ? zodToConvex(options.returns) : undefined\n\n return action({\n args,\n returns,\n handler: async (ctx: ExtractCtx<Builder>, argsObject: unknown) => {\n const parsed = zodSchema.parse(argsObject) as InferArgs<A>\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n }\n return raw as any\n }\n }) as PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>>\n}\n\nexport function zInternalAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined\n>(\n internalAction: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: InferArgs<A>\n ) => Promise<InferReturns<R>> | InferReturns<R>,\n options?: { returns?: R }\n): PreserveReturnType<Builder, ZodToConvexArgs<A>, InferReturns<R>> {\n return zAction(internalAction, input, handler, options)\n}\n","export function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (key in obj) result[key] = obj[key]\n }\n return result\n}\n","import {\n type FunctionVisibility,\n type GenericActionCtx,\n type GenericDataModel,\n type GenericMutationCtx,\n type GenericQueryCtx\n} from 'convex/server'\nimport { ConvexError, type PropertyValidators } from 'convex/values'\nimport { type CustomBuilder, type Customization, NoOp } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { toConvexJS } from './codec'\nimport { zodToConvex, zodToConvexFields } from './mapping'\nimport { pick } from './utils'\n\nfunction customFnBuilder(\n builder: (args: any) => any,\n customization: Customization<any, any, any, any>\n) {\n const customInput = customization.input ?? NoOp.input\n const inputArgs = customization.args ?? NoOp.args\n\n return function customBuilder(fn: any): any {\n const { args, handler = fn, returns: maybeObject, ...extra } = fn\n\n const returns =\n maybeObject && !(maybeObject instanceof z.ZodType) ? z.object(maybeObject) : maybeObject\n const returnValidator =\n returns && !fn.skipConvexValidation ? { returns: zodToConvex(returns) } : undefined\n\n if (args && !fn.skipConvexValidation) {\n let argsValidator = args\n if (argsValidator instanceof z.ZodType) {\n if (argsValidator instanceof z.ZodObject) {\n argsValidator = (argsValidator as z.ZodObject<any>).shape\n } else {\n throw new Error(\n 'Unsupported zod type as args validator: ' + argsValidator.constructor.name\n )\n }\n }\n const convexValidator = zodToConvexFields(argsValidator)\n return builder({\n args: { ...convexValidator, ...inputArgs },\n ...returnValidator,\n handler: async (ctx: any, allArgs: any) => {\n const added = await customInput(ctx, pick(allArgs, Object.keys(inputArgs)) as any, extra)\n const rawArgs = pick(allArgs, Object.keys(argsValidator))\n const parsed = z.object(argsValidator).safeParse(rawArgs)\n if (!parsed.success) {\n throw new ConvexError({\n ZodError: JSON.parse(JSON.stringify(parsed.error.flatten(), null, 2))\n })\n }\n const result = await handler({ ...ctx, ...added }, parsed.data)\n if (returns && !fn.skipConvexValidation) {\n const validated = (returns as z.ZodTypeAny).parse(result)\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n return result\n }\n })\n }\n return builder({\n args: inputArgs,\n ...returnValidator,\n handler: async (ctx: any, allArgs: any) => {\n const added = await customInput(ctx, pick(allArgs, Object.keys(inputArgs)) as any, extra)\n const result = await handler({ ...ctx, ...added }, allArgs)\n if (returns && !fn.skipConvexValidation) {\n const validated = (returns as z.ZodTypeAny).parse(result)\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n return result\n }\n })\n }\n}\n\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n DataModel extends GenericDataModel\n>(\n query: any,\n customization: Customization<\n GenericQueryCtx<DataModel>,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs\n >\n) {\n return customFnBuilder(query, customization) as CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n GenericQueryCtx<DataModel>,\n Visibility,\n Record<string, any>\n >\n}\n\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n DataModel extends GenericDataModel\n>(\n mutation: any,\n customization: Customization<\n GenericMutationCtx<DataModel>,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs\n >\n) {\n return customFnBuilder(mutation, customization) as CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n GenericMutationCtx<DataModel>,\n Visibility,\n Record<string, any>\n >\n}\n\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n DataModel extends GenericDataModel\n>(\n action: any,\n customization: Customization<\n GenericActionCtx<DataModel>,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs\n >\n) {\n return customFnBuilder(action, customization) as CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n GenericActionCtx<DataModel>,\n Visibility,\n Record<string, any>\n >\n}\n","import { paginationOptsValidator } from 'convex/server'\nimport { Table } from 'convex-helpers/server'\nimport { z } from 'zod'\nimport { convexCodec } from './codec'\nimport { zMutation, zQuery } from './wrappers'\nimport { zid } from './zodV4Compat'\n\nexport function zodTable<T extends z.ZodObject<any>, TableName extends string>(\n name: TableName,\n schema: T\n) {\n const codec = convexCodec(schema)\n const tableDefinition = Table(name, codec.toConvexSchema())\n return { ...tableDefinition, codec, schema }\n}\n\nexport function zCrud<\n TableDefinition extends ReturnType<typeof zodTable>,\n QueryBuilder extends (fn: any) => any,\n MutationBuilder extends (fn: any) => any\n>(table: TableDefinition, queryBuilder: QueryBuilder, mutationBuilder: MutationBuilder) {\n const tableName = table.name\n const shape = table.schema.shape as Record<string, z.ZodTypeAny>\n\n return {\n create: zMutation(mutationBuilder, shape, async (ctx: any, args) => {\n return await ctx.db.insert(tableName, args)\n }),\n\n read: zQuery(queryBuilder, { id: zid(tableName) }, async (ctx: any, { id }) => {\n return await ctx.db.get(id)\n }),\n\n paginate: queryBuilder({\n args: { paginationOpts: paginationOptsValidator },\n handler: async (ctx: any, { paginationOpts }: any) => {\n return await ctx.db.query(tableName).paginate(paginationOpts)\n }\n }),\n\n update: zMutation(\n mutationBuilder,\n {\n id: zid(tableName),\n patch: z.object(shape).partial()\n },\n async (ctx: any, { id, patch }) => {\n await ctx.db.patch(id, patch)\n }\n ),\n\n destroy: zMutation(mutationBuilder, { id: zid(tableName) }, async (ctx: any, { id }) => {\n const doc = await ctx.db.get(id)\n if (doc) await ctx.db.delete(id)\n return doc\n })\n }\n}\n"]}
|