Skip to content

Commit 6b095b8

Browse files
committed
fix: form.fields.set() triggers form.fields.value() updates
1 parent bc3ec26 commit 6b095b8

File tree

5 files changed

+64
-0
lines changed

5 files changed

+64
-0
lines changed

.changeset/fluffy-lights-know.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
fix: `form.fields.set()` triggers `form.fields.value()` updates

packages/kit/src/runtime/client/remote-functions/form.svelte.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,15 @@ export function form(id) {
540540
} else {
541541
input = deep_set(input, path.map(String), value);
542542
}
543+
544+
const copy = path.slice();
545+
546+
do {
547+
const name = build_path_string(copy);
548+
549+
versions[name] ??= 0;
550+
versions[name] += 1;
551+
} while (copy.pop() !== undefined);
543552
},
544553
() => issues
545554
)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<script>
2+
import { values } from './value.remote.js';
3+
</script>
4+
5+
<h1>Remote Form Set Test</h1>
6+
7+
<form {...values}>
8+
<label>
9+
Leaf:
10+
<input {...values.fields.leaf.as('text')} />
11+
</label>
12+
13+
<button>Submit</button>
14+
</form>
15+
16+
<h2>Full Form Value</h2>
17+
<pre id="full-value">{JSON.stringify(values.fields.value(), null, ' ')}</pre>
18+
19+
<button id="update-value" onclick={() => values.fields.leaf.set('new value')}>Update Value</button>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { form } from '$app/server';
2+
import * as v from 'valibot';
3+
4+
export const values = form(
5+
v.object({
6+
leaf: v.string()
7+
}),
8+
async (data) => {
9+
return { success: true, data };
10+
}
11+
);

packages/kit/test/apps/basics/test/test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1982,6 +1982,26 @@ test.describe('remote functions', () => {
19821982
expect(JSON.parse(arrayValue)).toEqual([{ leaf: 'array-0-leaf' }, { leaf: 'array-1-leaf' }]);
19831983
});
19841984

1985+
test('form.fields.set() triggers form.fields.value() updates', async ({
1986+
page,
1987+
javaScriptEnabled
1988+
}) => {
1989+
if (!javaScriptEnabled) return;
1990+
1991+
await page.goto('/remote/form/set');
1992+
1993+
const before = await page.locator('#full-value').textContent();
1994+
expect(JSON.parse(before)).toEqual({});
1995+
1996+
await page.locator('#update-value').click();
1997+
1998+
const leafValue = await page.locator('input[name="leaf"]').inputValue();
1999+
expect(leafValue).toBe('new value');
2000+
2001+
const after = await page.locator('#full-value').textContent();
2002+
expect(JSON.parse(after)).toEqual({ leaf: 'new value' });
2003+
});
2004+
19852005
test('selects are not nuked when unrelated controls change', async ({
19862006
page,
19872007
javaScriptEnabled

0 commit comments

Comments
 (0)