Skip to content

Commit 9d2adb7

Browse files
committed
Zod adapter now supports ZodType.
1 parent 5767eb8 commit 9d2adb7

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1616
- Empty file entries didn't return `null` for nullable schema fields. **Ensure that all required file fields aren't set to nullable.**
1717
- Allowed `string` index in `$errors` and `$tainted`.
1818
- `submit` can now be passed directly to event handlers.
19-
- Updated to latest `valibot-json-schema`, with support for [enum_](https://valibot.dev/guides/enums/), amongst others.
19+
- Updated to latest `valibot-json-schema`, with support for [enum\_](https://valibot.dev/guides/enums/), amongst others.
20+
- Zod adapter now supports `ZodType`.
2021

2122
## [2.6.2] - 2024-02-25
2223

src/lib/adapters/zod.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { AnyZodObject, ZodDefault, ZodEffects, ZodUnion } from 'zod';
1+
import type { AnyZodObject, ZodDefault, ZodEffects, ZodType, ZodTypeDef, ZodUnion } from 'zod';
22
import type { JSONSchema7 } from 'json-schema';
33
import {
44
type AdapterOptions,
@@ -27,7 +27,11 @@ type ZodObjectUnion<T extends AnyZodObject> = ZodUnion<
2727
[ZodValidation<T>, ZodValidation<T>, ...ZodValidation<T>[]]
2828
>;
2929

30-
export type ZodValidation<T extends AnyZodObject | ZodObjectUnion<AnyZodObject>> =
30+
type ZodObjectType = ZodType<Record<string, unknown>, ZodTypeDef, Record<string, unknown>>;
31+
32+
type ZodObjectTypes = AnyZodObject | ZodObjectUnion<AnyZodObject> | ZodObjectType;
33+
34+
export type ZodValidation<T extends ZodObjectTypes> =
3135
| T
3236
| ZodEffects<T>
3337
| ZodEffects<ZodEffects<T>>
@@ -47,7 +51,7 @@ export type ZodValidation<T extends AnyZodObject | ZodObjectUnion<AnyZodObject>>
4751
ZodEffects<ZodEffects<ZodEffects<ZodEffects<ZodEffects<ZodEffects<ZodEffects<T>>>>>>>
4852
>;
4953

50-
async function validate<T extends ZodValidation<AnyZodObject | ZodObjectUnion<AnyZodObject>>>(
54+
async function validate<T extends ZodValidation<ZodObjectTypes>>(
5155
schema: T,
5256
data: unknown
5357
): Promise<ValidationResult<Infer<T>>> {
@@ -64,7 +68,7 @@ async function validate<T extends ZodValidation<AnyZodObject | ZodObjectUnion<An
6468
};
6569
}
6670

67-
function _zod<T extends ZodValidation<AnyZodObject | ZodObjectUnion<AnyZodObject>>>(
71+
function _zod<T extends ZodValidation<ZodObjectTypes>>(
6872
schema: T,
6973
options?: AdapterOptions<T>
7074
): ValidationAdapter<Infer<T>, InferIn<T>> {
@@ -76,7 +80,7 @@ function _zod<T extends ZodValidation<AnyZodObject | ZodObjectUnion<AnyZodObject
7680
});
7781
}
7882

79-
function _zodClient<T extends ZodValidation<AnyZodObject | ZodObjectUnion<AnyZodObject>>>(
83+
function _zodClient<T extends ZodValidation<ZodObjectTypes>>(
8084
schema: T
8185
): ClientValidationAdapter<Infer<T>, InferIn<T>> {
8286
return {

src/tests/superValidate.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import { vine } from '$lib/adapters/vine.js';
4747
import Vine from '@vinejs/vine';
4848
import { traversePath } from '$lib/traversal.js';
4949
import { splitPath } from '$lib/stringPath.js';
50+
import { SchemaError } from '$lib/index.js';
5051

5152
///// Test data /////////////////////////////////////////////////////
5253

@@ -439,6 +440,26 @@ describe('Zod', () => {
439440
expect(adapter.constraints.letter?.required).toBe(true);
440441
});
441442

443+
it('should accept ZodType for the adapter', () => {
444+
type User = {
445+
userId: string;
446+
name: string;
447+
manager?: User | null;
448+
};
449+
450+
const UserSchema: z.ZodType<User> = z.object({
451+
userId: z.string().uuid(),
452+
name: z.string(),
453+
manager: z.union([z.null(), z.lazy(() => UserSchema)])
454+
});
455+
456+
zod(UserSchema);
457+
458+
const NumberSchema: z.ZodType<number> = z.number().int();
459+
// @ts-expect-error Not an object schema
460+
expect(() => zod(NumberSchema)).toThrowError(SchemaError);
461+
});
462+
442463
schemaTest(zod(schema));
443464
});
444465

0 commit comments

Comments
 (0)