Skip to content

Commit 8490711

Browse files
authored
fix: ensure uniqueness of form.for(...) across form functions (#14327)
Fixes #14305
1 parent 1cab1b2 commit 8490711

File tree

4 files changed

+20
-3
lines changed

4 files changed

+20
-3
lines changed

.changeset/thin-hornets-read.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: ensure uniqueness of `form.for(...)` across form functions

packages/kit/src/runtime/app/server/remote/form.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,15 @@ export function form(fn) {
108108
/** @type {RemoteForm<any>['for']} */
109109
value: (key) => {
110110
const { state } = get_request_store();
111-
let instance = (state.form_instances ??= new Map()).get(key);
111+
const cache_key = __.id + '|' + JSON.stringify(key);
112+
let instance = (state.form_instances ??= new Map()).get(cache_key);
112113

113114
if (!instance) {
114115
instance = create_instance(key);
115116
instance.__.id = `${__.id}/${encodeURIComponent(JSON.stringify(key))}`;
116117
instance.__.name = __.name;
117118

118-
state.form_instances.set(key, instance);
119+
state.form_instances.set(cache_key, instance);
119120
}
120121

121122
return instance;

packages/kit/test/apps/basics/src/routes/remote/form/+page.svelte

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,9 @@
8585
<button id="submit-btn-item-{item}">Task One for {item}</button>
8686
</form>
8787
{/each}
88+
89+
<form {...task_two.for('foo')}>
90+
<span id="form-result-2-foo">{task_two.for('foo').result}</span>
91+
<input name="task" value="foo2" />
92+
<button id="submit-btn-item-2-foo">Task Two for foo</button>
93+
</form>

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1640,12 +1640,17 @@ test.describe('remote functions', () => {
16401640
);
16411641
});
16421642

1643-
test('form.for(...) scopes form submission', async ({ page }) => {
1643+
test('form.for(...) scopes form submission', async ({ page, javaScriptEnabled }) => {
16441644
await page.goto('/remote/form');
16451645
await page.click('#submit-btn-item-foo');
16461646
await expect(page.locator('#form-result-foo')).toHaveText('foo');
16471647
await expect(page.locator('#form-result-bar')).toHaveText('');
16481648
await expect(page.locator('#form-result-1')).toHaveText('');
1649+
1650+
await page.click('#submit-btn-item-2-foo');
1651+
await expect(page.locator('#form-result-2-foo')).toHaveText('foo2');
1652+
await expect(page.locator('#form-result-foo')).toHaveText(javaScriptEnabled ? 'foo' : '');
1653+
await expect(page.locator('#form-result-2')).toHaveText('');
16491654
});
16501655

16511656
test('prerendered entries not called in prod', async ({ page, clicknav }) => {

0 commit comments

Comments
 (0)