-
-
Notifications
You must be signed in to change notification settings - Fork 100
Open
Labels
bugSomething isn't workingSomething isn't working
Description
Minimal reproduction: NicoRio42/sveltekit-superforms-zod4-date
First, thank you for this amazing library.
I'm encountering an issue when using a Zod 4 schema with a date field in combination with Sveltekit Superforms and dateProxy. When submitting a form with input type="datetime-local", the validation fails with:
Invalid input: expected date, received string
The validation works fine if I use Zod 3.
form-schema.ts
:
import z4 from "zod/v4";
export const v4FormSchema = z4.object({
dateTime: z4.date(),
});
+page.server.ts
:
import { fail, superValidate } from "sveltekit-superforms";
import { zod4 } from "sveltekit-superforms/adapters";
import { v4FormSchema } from "./form-schema";
export async function load() {
const v4Form = await superValidate(zod4(v4FormSchema));
return { v4Form };
}
export const actions = {
default: async ({ request }) => {
const form = await superValidate(request, zod4(v4FormSchema));
if (!form.valid) return fail(400, { form });
console.log("Form submitted successfully:", form.data);
return { form };
},
};
+page.svelte
:
<script lang="ts">
import { dateProxy, superForm } from "sveltekit-superforms";
import { zod4Client } from "sveltekit-superforms/adapters";
import { v4FormSchema } from "./form-schema";
let { data } = $props();
const v4Form = superForm(data.v4Form, {
validators: zod4Client(v4FormSchema),
});
const { errors: v4Errors, enhance: v4Enhance } = v4Form;
const v4DateValue = dateProxy(v4Form, "dateTime", {
format: "datetime-local",
});
</script>
<form method="post" use:v4Enhance>
<input type="datetime-local" name="dateTime" bind:value={$v4DateValue} />
{#if $v4Errors.dateTime}
{#each $v4Errors.dateTime as error}
<small>{error}</small>
{/each}
{/if}
<button>Submit</button>
</form>
You can find a minimal reproduction in this repo: NicoRio42/sveltekit-superforms-zod4-date
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working