diff --git a/.changeset/olive-icons-jump.md b/.changeset/olive-icons-jump.md new file mode 100644 index 000000000000..50feb75d08b3 --- /dev/null +++ b/.changeset/olive-icons-jump.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: `fields.value()` initial data missing diff --git a/packages/kit/src/runtime/app/server/remote/form.js b/packages/kit/src/runtime/app/server/remote/form.js index bf69e0200bce..ad90bea3e71c 100644 --- a/packages/kit/src/runtime/app/server/remote/form.js +++ b/packages/kit/src/runtime/app/server/remote/form.js @@ -197,24 +197,22 @@ export function form(validate_or_fn, maybe_fn) { Object.defineProperty(instance, 'fields', { get() { - const data = get_cache(__)?.['']; - const issues = flatten_issues(data?.issues ?? []); - return create_field_proxy( {}, - () => data?.input ?? {}, + () => (get_cache(__)[''] ?? {}).input ?? {}, (path, value) => { - if (data?.submission) { + const data = (get_cache(__)[''] ??= {}); + if (data.submission) { // don't override a submission return; } const input = - path.length === 0 ? value : deep_set(data?.input ?? {}, path.map(String), value); + path.length === 0 ? value : deep_set(data.input ?? {}, path.map(String), value); - (get_cache(__)[''] ??= {}).input = input; + data.input = input; }, - () => issues + () => flatten_issues((get_cache(__)[''] ?? {}).issues ?? []) ); } }); diff --git a/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/+page.svelte b/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/+page.svelte new file mode 100644 index 000000000000..c0c1f3d04581 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/+page.svelte @@ -0,0 +1,11 @@ + + +

Remote Form Initial Value Test

+ +
Initial: {JSON.stringify(initial_value)}
+
Value: {JSON.stringify(fields.value())}
diff --git a/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/+page.ts b/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/+page.ts new file mode 100644 index 000000000000..26bb5688768d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/+page.ts @@ -0,0 +1 @@ +export const csr = false; diff --git a/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/value.remote.ts b/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/value.remote.ts new file mode 100644 index 000000000000..573f323eb3df --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/remote/form/initial-value/value.remote.ts @@ -0,0 +1,11 @@ +import { form } from '$app/server'; +import * as v from 'valibot'; + +export const values = form( + v.object({ + val: v.string() + }), + async (data) => { + return { success: true, data }; + } +); diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index f464265b9a31..6d8fbb50e59a 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1818,6 +1818,15 @@ test.describe('remote functions', () => { ); }); + test('form initial value works', async ({ page, javaScriptEnabled }) => { + if (javaScriptEnabled) return; + + await page.goto('/remote/form/initial-value'); + + await expect(page.locator('#initial')).toHaveText('Initial: {"val":"initial"}'); + await expect(page.locator('#value')).toHaveText('Value: {"val":"initial"}'); + }); + test('form preflight works', async ({ page, javaScriptEnabled }) => { if (!javaScriptEnabled) return;