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 @@ + + +
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;