From 2ccf8c5fee6b501c79d4434b680ae1a082b6bc30 Mon Sep 17 00:00:00 2001 From: Kyrre Gjerstad Date: Tue, 23 Dec 2025 01:58:47 +0100 Subject: [PATCH 1/3] docs(use-search-params): add warning about default values for schema fields --- .../src/content/utilities/use-search-params.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sites/docs/src/content/utilities/use-search-params.md b/sites/docs/src/content/utilities/use-search-params.md index d9cbfe63..79cffc4c 100644 --- a/sites/docs/src/content/utilities/use-search-params.md +++ b/sites/docs/src/content/utilities/use-search-params.md @@ -42,6 +42,19 @@ export const productSearchSchema = z.object({ }); ``` + + +**All schema fields must have explicit default values.** Using `.optional()` without a default will cause fields to be silently ignored and not update the URL. + +```ts +// ❌ This won't work +z.string().optional() +``` + +This is because `useSearchParams` extracts field information by validating an empty object against your schema. Fields without defaults won't appear in the result, so the hook won't recognize them as valid parameters. + + + In your svelte code: ```svelte @@ -479,6 +492,7 @@ const searchSchema = z.object({ birthDate: dateOnlyCodec.default(new Date("1990-01-15")), // Compact product IDs + // Note: .optional() without default works for reading from URL, but won't be writable productId: compactIdCodec.optional() }); @@ -509,6 +523,7 @@ const params = useSearchParams(searchSchema); // Date-only for event date (more readable in URL) eventDate: dateOnly.default(new Date()), // Unix timestamp for filters (more compact) + // Note: .optional() without default works for reading from URL, but won't be writable createdAfter: unixTimestamp.optional(), updatedSince: unixTimestamp.optional() }); From d0f05ed1639feffca9fa90258520e5158e037e72 Mon Sep 17 00:00:00 2001 From: Kyrre Gjerstad Date: Tue, 23 Dec 2025 02:16:25 +0100 Subject: [PATCH 2/3] fix(use-search-params): add console warning for missing schema fields --- .../use-search-params/use-search-params.svelte.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/runed/src/lib/utilities/use-search-params/use-search-params.svelte.ts b/packages/runed/src/lib/utilities/use-search-params/use-search-params.svelte.ts index b250812e..6cf4e3fb 100644 --- a/packages/runed/src/lib/utilities/use-search-params/use-search-params.svelte.ts +++ b/packages/runed/src/lib/utilities/use-search-params/use-search-params.svelte.ts @@ -2071,6 +2071,16 @@ export function useSearchParams( target.set(prop as keyof StandardSchemaV1.InferOutput & string, value); return true; } + + if (import.meta.env?.DEV && typeof prop === "string") { + console.warn( + `[useSearchParams] Field "${prop}" not found in schema.\n` + + `Either:\n` + + ` 1. It's a typo (check your schema)\n` + + ` 2. It's optional without default (add .default())` + ); + } + return Reflect.set(target, prop, value); }, }; From c10636b307b23e3d519e29f4c4c22acab7c6040a Mon Sep 17 00:00:00 2001 From: Kyrre Gjerstad Date: Tue, 23 Dec 2025 02:18:40 +0100 Subject: [PATCH 3/3] add changeset --- .changeset/dev-warning-optional-fields.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dev-warning-optional-fields.md diff --git a/.changeset/dev-warning-optional-fields.md b/.changeset/dev-warning-optional-fields.md new file mode 100644 index 00000000..1ea13a7b --- /dev/null +++ b/.changeset/dev-warning-optional-fields.md @@ -0,0 +1,5 @@ +--- +"runed": patch +--- + +Add dev mode warning when setting fields not found in schema