- 
          
- 
                Notifications
    You must be signed in to change notification settings 
- Fork 2.1k
Description
Describe the bug
Hi, in my schema, I depend on valibot's variant (I believe that is Zod's discriminatedUnion) quite a lot. This allows you to define conditions (if the user has selected type a earlier, ask for email, otherwise ask for telefone).
However, this does not work on the frontend. Or maybe I'm just doing it wrong? EDIT: It actually does work on the frontend if you do myForm.fields.myField.value == "type1" in the condition, but TypeScript complains (see below).
Reproduction
I'd expect that those properties either always exist or exist conditionally. However, they just don't really work at all? with the  EDIT: The code below works at runtime, but in operator, I can make TypeScript happy, but it does not work in the runtime.svelte check fails. If I replace {#if myForm.fields.differing.type.value() == "a"} with {#if "propA" in myForm.fields.differing}, TS is happy, but then it does not work anymore (the condition is always false).
Schema:
export const schema = v.object({
  alwaysExisting: v.string(),
  differing: v.variant('type', [
    v.object({
      type: v.literal('a'),
      propA: v.string(),
    }),
    v.object({
      type: v.literal('b'),
      propB: v.string(),
    }),
  ]),
});UI:
<form {...myForm}>
	Always: <input {...myForm.fields.alwaysExisting.as("text")}>
	<br>
	Differing:
	<select {...myForm.fields.differing.type.as("select")}>
		<option value="a">a</option>
		<option value="b">b</option>
	</select>
	{#if myForm.fields.differing.type.value() == "a"}
		PropA: <input {...myForm.fields.differing.propA.as("text")}>
	{:else}
		PropB: <input {...myForm.fields.differing.propB.as("text")}>
	{/if}
	<br>
	propA in myForm.fields.differing: {"propA" in myForm.fields.differing}<br>
	propB in myForm.fields.differing: {"propB" in myForm.fields.differing}<br>
</form>Backend types (they are ok):
export const myForm = form(schema, async (data) => {
  console.log(data.alwaysExisting);
  console.log(data.differing.type);
  if (data.differing.type == 'a') {
    console.log(data.differing.propA);
  } else {
    console.log(data.differing.propB);
  }
});Logs
-System Info
System:
    OS: macOS 15.7.1
    CPU: (14) arm64 Apple M3 Max
    Memory: 145.41 MB / 36.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 22.17.0 - /Users/hannes/.nvm/versions/node/v22.17.0/bin/node
    Yarn: 4.9.3 - /Users/hannes/.nvm/versions/node/v22.17.0/bin/yarn
    npm: 11.5.2 - /Users/hannes/.nvm/versions/node/v22.17.0/bin/npm
    bun: 1.2.23 - /opt/homebrew/bin/bun
    Deno: 2.5.3 - /opt/homebrew/bin/deno
  Browsers:
    Chrome: 141.0.7390.65
    Firefox: 143.0.4
    Safari: 26.0.1
  npmPackages:
    @sveltejs/adapter-node: ^5.3.3 => 5.3.3 
    @sveltejs/kit: ^2.46.4 => 2.46.4 
    @sveltejs/vite-plugin-svelte: ^6.2.1 => 6.2.1 
    vite: 6 => 6.3.6Severity
blocking an upgrade
Additional Information
Blocking the upgrade to using remote functions instead of my old custom validation implementation.