Repository navigation
feat: support defaultValue on <select> - #18591
Conversation
`<select>` had no way to express a default selection other than putting `selected` on the matching `<option>`, which is awkward when the options are generated and impossible when the element is spread from an object. `defaultValue` was silently ignored: `is_dom_property()` treats it as a property, so the client compiled it to `select.defaultValue = value`, which does nothing on `HTMLSelectElement`, and the server dropped it. Client-side it now marks the matching option as `selected`, which is the state the form reset algorithm restores. The call is emitted after the children so the options exist and have had their values assigned. The current selection is only preserved when something asked for a specific option, so the default takes effect on the initial render. Server-side the value falls back to `defaultValue` when no `value` is given, so SSR and hydration agree.
|
Install the latest version of pnpm add https://pkg.svelte.dev/svelte/c/1536096dae692dff342c1b24b4804aa7d1115c05Open in Note This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed. |
🦋 Changeset detectedLatest commit: 1536096 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
The client transform only applies this when there's no spread ( |
The client only handled `defaultValue` in the non-spread path, so
`<select {...props}>` compiled to `attribute_effect` and never reached
`set_default_select_value`. `set_attributes` can't apply it either,
since assigning the property does nothing on a select. It now marks the
default option from the same effect that handles `value`, after the
options exist.
Server-side the key was only read as `defaultvalue`. That is what the
compiler emits for an attribute written in the template, but a spread
passes keys through as the user wrote them, so `defaultValue` was
ignored and SSR disagreed with the client. Both spellings are accepted
now.
This is the case #18447 was filed for: `<select {...form.fields.x.as('select')}>`
in SvelteKit is always a spread.
|
You're right, and it was worse than just the client: the server read the key only as Fixed in 22c07e6. The client now marks the default option from the same effect that already handles |
`set_default_select_value` compared every option against the whole value, so a `multiple` select never matched and its default selection was lost. Mirror `select_option` instead: branch on `select.multiple` and test membership, leaving a non-array value alone. Restoring `selectedIndex` only preserves a single selection, so the multiple branch snapshots `selectedOptions` and restores each option, keeping the current selection untouched.
|
The red The job dies without running anything. Its log ends on the vitest banner with no test results at all: That's the last line — 350 lines of log, zero The same thing happened on Everything else on this run is green — Ubuntu on Node 20/22/24, macOS, Lint, TSGo, TestNoAsync, Benchmarks. Locally the new test passes ( Could someone with the right access re-run that job? I don't have permission to ( |
|
Following up here — anything else needed on the flake explanation, or is this just waiting for a re-look? |
|
Correction to my earlier comment: I was wrong about the log. The failing Windows job does produce test output — I read a truncated log and reported it as empty. The actual failure is a single test: It's still unrelated to this PR, but for a better reason than the one I gave. The same test times out on
Same job, same single test, same 30s timeout. The Windows runner takes ~176s for the suite where the others take 2-3 minutes total, so a 30s per-test timeout is marginal there. Nothing in this PR touches the signals runtime. A re-run should clear it — I don't have permission to trigger one. Happy to push a merge of |
|
Thanks for merging One data point that may be worth more than this PR: I tried to reproduce that timeout locally while you were merging, and it reproduces on clean If it keeps costing people re-runs, a larger |
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## svelte@5.57.0 ### Minor Changes - feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server` ([#18648](#18648)) - feat: add `has` function to `createContext` ([#18472](#18472)) - feat: support `defaultValue` on `<select>` ([#18591](#18591)) - feat: add getOrInsert/getOrInsertComputed to SvelteMap ([#18728](#18728)) ### Patch Changes - fix: block template store subscriptions on the promise that assigns the store ([#18582](#18582)) - fix: route $derived teardown errors through invoke_error_boundary ([#18486](#18486)) - fix: track SvelteDate snapshots in reactions ([#18700](#18700)) - fix: remove `<svelte:head>` anchors on unmount ([#18697](#18697)) - fix: warn on undeclared shorthand event handlers on `<svelte:window>`, `<svelte:document>` and `<svelte:body>` ([#18480](#18480)) - perf: reuse the cached value in the `<option>`/`<select>` value guard ([#18713](#18713)) - fix: prevent malformed AST output for `<select>` with static `value` attribute ([#18449](#18449)) - fix: apply ownership mutation ignores to binding assignments ([#18718](#18718)) - fix: prevent onoutroend from firing twice when compilerOptions.hmr is true ([#18655](#18655)) - fix: preserve whitespace after inline elements when printing ([#18685](#18685)) - perf: fold SSR block-open markers into the branch's first push ([#18712](#18712)) - fix: run `onDestroy` callbacks when a server render throws ([#18585](#18585)) - fix: report `derived_invalid_export` for `export let x = $derived(...)` in runes mode ([#18692](#18692)) - fix: never apply class hash to elements inside `<svelte:head>` ([#18160](#18160)) - fix: keep `defaultChecked` on hydrated radio inputs with spread attributes ([#18701](#18701)) - fix: accept `onfocusin`/`onfocusout` in `a11y_mouse_events_have_key_events` ([#18689](#18689)) - perf: O(n²)→O(n) Map lookups for legacy `$:` reactive statement ordering ([#18602](#18602)) - fix: distinct memoizer on style/class directives ([#18466](#18466)) - fix: measure nested transitions before applying their starting styles ([#18647](#18647)) - fix: don't turn component instances stored in `$state` into state proxies ([#18646](#18646)) - perf: emit `$.only_child` for elements with a single child ([#18717](#18717)) - fix: omit `bind:focused` from SSR output (it has no HTML attribute) ([#18724](#18724)) - fix: more robust rendering of Svelte custom element slots ([#18710](#18710)) - perf: optimize simple object destructuring in `@const` tags ([#18390](#18390)) - fix: properly apply static textarea value attribute during CSR ([#18727](#18727)) - fix: end a restored reaction context at the end of its synchronous segment ([#18694](#18694)) - fix: keep the dependencies of a reaction that throws, so deriveds it read are neither leaked nor stuck in their error ([#18703](#18703)) - fix: don't resurrect outroing elements when an ancestor block is paused and resumed ([#18431](#18431)) - perf: use `$.comment()` for single-comment templates ([#18714](#18714)) - chore: move `@types/trusted-types` to devDependencies ([#18730](#18730)) - perf: store setters cache as `Set` instead of `Array` ([#18251](#18251)) - fix: transform derived assignments and select function bindings correctly during server-side rendering ([#18669](#18669)) - fix: keep boolean attributes with an empty string value when rendering attribute objects on the server ([#18721](#18721)) - fix: sync `SvelteURL` port signal when the protocol setter clears the port ([#18705](#18705)) - fix: block declaration tags and `{@const}` on async values read inside closures ([#18533](#18533)) - fix: avoid css tree-shaking for exported Snippet ([#18540](#18540)) - perf: treat `<img loading>` as a static element again ([#18711](#18711)) - fix: prevent `selectedcontent` mutation from changing the selected option ([#18495](#18495)) - fix: avoid `NaN` keyframe values in `slide` transition for elements without a layout box ([#18430](#18430)) - fix: preserve line feed character references in attribute values ([#18691](#18691)) - fix: decode uppercase-`X` hex numeric character references (`&#X...;`) ([#18708](#18708)) - chore: clarify when `$effect.pre` runs relative to DOM updates ([#18534](#18534)) - fix: scope SSR boundary failed snippets to their boundary ([#18593](#18593)) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [svelte](https://svelte.dev) ([source](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte)) | [`5.56.10` → `5.57.0`](https://renovatebot.com/diffs/npm/svelte/5.56.10/5.57.0) |  |  | --- ### Release Notes <details> <summary>sveltejs/svelte (svelte)</summary> ### [`v5.57.0`](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5570) [Compare Source](https://github.com/sveltejs/svelte/compare/svelte@5.56.10...svelte@5.57.0) ##### Minor Changes - feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server` ([#​18648](sveltejs/svelte#18648)) - feat: add `has` function to `createContext` ([#​18472](sveltejs/svelte#18472)) - feat: support `defaultValue` on `<select>` ([#​18591](sveltejs/svelte#18591)) - feat: add getOrInsert/getOrInsertComputed to SvelteMap ([#​18728](sveltejs/svelte#18728)) ##### Patch Changes - fix: block template store subscriptions on the promise that assigns the store ([#​18582](sveltejs/svelte#18582)) - fix: route $derived teardown errors through invoke\_error\_boundary ([#​18486](sveltejs/svelte#18486)) - fix: track SvelteDate snapshots in reactions ([#​18700](sveltejs/svelte#18700)) - fix: remove `<svelte:head>` anchors on unmount ([#​18697](sveltejs/svelte#18697)) - fix: warn on undeclared shorthand event handlers on `<svelte:window>`, `<svelte:document>` and `<svelte:body>` ([#​18480](sveltejs/svelte#18480)) - perf: reuse the cached value in the `<option>`/`<select>` value guard ([#​18713](sveltejs/svelte#18713)) - fix: prevent malformed AST output for `<select>` with static `value` attribute ([#​18449](sveltejs/svelte#18449)) - fix: apply ownership mutation ignores to binding assignments ([#​18718](sveltejs/svelte#18718)) - fix: prevent onoutroend from firing twice when compilerOptions.hmr is true ([#​18655](sveltejs/svelte#18655)) - fix: preserve whitespace after inline elements when printing ([#​18685](sveltejs/svelte#18685)) - perf: fold SSR block-open markers into the branch's first push ([#​18712](sveltejs/svelte#18712)) - fix: run `onDestroy` callbacks when a server render throws ([#​18585](sveltejs/svelte#18585)) - fix: report `derived_invalid_export` for `export let x = $derived(...)` in runes mode ([#​18692](sveltejs/svelte#18692)) - fix: never apply class hash to elements inside `<svelte:head>` ([#​18160](sveltejs/svelte#18160)) - fix: keep `defaultChecked` on hydrated radio inputs with spread attributes ([#​18701](sveltejs/svelte#18701)) - fix: accept `onfocusin`/`onfocusout` in `a11y_mouse_events_have_key_events` ([#​18689](sveltejs/svelte#18689)) - perf: O(n²)→O(n) Map lookups for legacy `$:` reactive statement ordering ([#​18602](sveltejs/svelte#18602)) - fix: distinct memoizer on style/class directives ([#​18466](sveltejs/svelte#18466)) - fix: measure nested transitions before applying their starting styles ([#​18647](sveltejs/svelte#18647)) - fix: don't turn component instances stored in `$state` into state proxies ([#​18646](sveltejs/svelte#18646)) - perf: emit `$.only_child` for elements with a single child ([#​18717](sveltejs/svelte#18717)) - fix: omit `bind:focused` from SSR output (it has no HTML attribute) ([#​18724](sveltejs/svelte#18724)) - fix: more robust rendering of Svelte custom element slots ([#​18710](sveltejs/svelte#18710)) - perf: optimize simple object destructuring in `@const` tags ([#​18390](sveltejs/svelte#18390)) - fix: properly apply static textarea value attribute during CSR ([#​18727](sveltejs/svelte#18727)) - fix: end a restored reaction context at the end of its synchronous segment ([#​18694](sveltejs/svelte#18694)) - fix: keep the dependencies of a reaction that throws, so deriveds it read are neither leaked nor stuck in their error ([#​18703](sveltejs/svelte#18703)) - fix: don't resurrect outroing elements when an ancestor block is paused and resumed ([#​18431](sveltejs/svelte#18431)) - perf: use `$.comment()` for single-comment templates ([#​18714](sveltejs/svelte#18714)) - chore: move `@types/trusted-types` to devDependencies ([#​18730](sveltejs/svelte#18730)) - perf: store setters cache as `Set` instead of `Array` ([#​18251](sveltejs/svelte#18251)) - fix: transform derived assignments and select function bindings correctly during server-side rendering ([#​18669](sveltejs/svelte#18669)) - fix: keep boolean attributes with an empty string value when rendering attribute objects on the server ([#​18721](sveltejs/svelte#18721)) - fix: sync `SvelteURL` port signal when the protocol setter clears the port ([#​18705](sveltejs/svelte#18705)) - fix: block declaration tags and `{@const}` on async values read inside closures ([#​18533](sveltejs/svelte#18533)) - fix: avoid css tree-shaking for exported Snippet ([#​18540](sveltejs/svelte#18540)) - perf: treat `<img loading>` as a static element again ([#​18711](sveltejs/svelte#18711)) - fix: prevent `selectedcontent` mutation from changing the selected option ([#​18495](sveltejs/svelte#18495)) - fix: avoid `NaN` keyframe values in `slide` transition for elements without a layout box ([#​18430](sveltejs/svelte#18430)) - fix: preserve line feed character references in attribute values ([#​18691](sveltejs/svelte#18691)) - fix: decode uppercase-`X` hex numeric character references (`&#X...;`) ([#​18708](sveltejs/svelte#18708)) - chore: clarify when `$effect.pre` runs relative to DOM updates ([#​18534](sveltejs/svelte#18534)) - fix: scope SSR boundary failed snippets to their boundary ([#​18593](sveltejs/svelte#18593)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC41Mi4xIiwidXBkYXRlZEluVmVyIjoiNDQuNTIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
##### [v5.57.0](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5570) ##### Minor Changes - feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server` ([#18648](sveltejs/svelte#18648)) - feat: add `has` function to `createContext` ([#18472](sveltejs/svelte#18472)) - feat: support `defaultValue` on `<select>` ([#18591](sveltejs/svelte#18591)) - feat: add getOrInsert/getOrInsertComputed to SvelteMap ([#18728](sveltejs/svelte#18728)) ##### Patch Changes - fix: block template store subscriptions on the promise that assigns the store ([#18582](sveltejs/svelte#18582)) - fix: route $derived teardown errors through invoke\_error\_boundary ([#18486](sveltejs/svelte#18486)) - fix: track SvelteDate snapshots in reactions ([#18700](sveltejs/svelte#18700)) - fix: remove `<svelte:head>` anchors on unmount ([#18697](sveltejs/svelte#18697)) - fix: warn on undeclared shorthand event handlers on `<svelte:window>`, `<svelte:document>` and `<svelte:body>` ([#18480](sveltejs/svelte#18480)) - perf: reuse the cached value in the `<option>`/`<select>` value guard ([#18713](sveltejs/svelte#18713)) - fix: prevent malformed AST output for `<select>` with static `value` attribute ([#18449](sveltejs/svelte#18449)) - fix: apply ownership mutation ignores to binding assignments ([#18718](sveltejs/svelte#18718)) - fix: prevent onoutroend from firing twice when compilerOptions.hmr is true ([#18655](sveltejs/svelte#18655)) - fix: preserve whitespace after inline elements when printing ([#18685](sveltejs/svelte#18685)) - perf: fold SSR block-open markers into the branch's first push ([#18712](sveltejs/svelte#18712)) - fix: run `onDestroy` callbacks when a server render throws ([#18585](sveltejs/svelte#18585)) - fix: report `derived_invalid_export` for `export let x = $derived(...)` in runes mode ([#18692](sveltejs/svelte#18692)) - fix: never apply class hash to elements inside `<svelte:head>` ([#18160](sveltejs/svelte#18160)) - fix: keep `defaultChecked` on hydrated radio inputs with spread attributes ([#18701](sveltejs/svelte#18701)) - fix: accept `onfocusin`/`onfocusout` in `a11y_mouse_events_have_key_events` ([#18689](sveltejs/svelte#18689)) - perf: O(n²)→O(n) Map lookups for legacy `$:` reactive statement ordering ([#18602](sveltejs/svelte#18602)) - fix: distinct memoizer on style/class directives ([#18466](sveltejs/svelte#18466)) - fix: measure nested transitions before applying their starting styles ([#18647](sveltejs/svelte#18647)) - fix: don't turn component instances stored in `$state` into state proxies ([#18646](sveltejs/svelte#18646)) - perf: emit `$.only_child` for elements with a single child ([#18717](sveltejs/svelte#18717)) - fix: omit `bind:focused` from SSR output (it has no HTML attribute) ([#18724](sveltejs/svelte#18724)) - fix: more robust rendering of Svelte custom element slots ([#18710](sveltejs/svelte#18710)) - perf: optimize simple object destructuring in `@const` tags ([#18390](sveltejs/svelte#18390)) - fix: properly apply static textarea value attribute during CSR ([#18727](sveltejs/svelte#18727)) - fix: end a restored reaction context at the end of its synchronous segment ([#18694](sveltejs/svelte#18694)) - fix: keep the dependencies of a reaction that throws, so deriveds it read are neither leaked nor stuck in their error ([#18703](sveltejs/svelte#18703)) - fix: don't resurrect outroing elements when an ancestor block is paused and resumed ([#18431](sveltejs/svelte#18431)) - perf: use `$.comment()` for single-comment templates ([#18714](sveltejs/svelte#18714)) - chore: move `@types/trusted-types` to devDependencies ([#18730](sveltejs/svelte#18730)) - perf: store setters cache as `Set` instead of `Array` ([#18251](sveltejs/svelte#18251)) - fix: transform derived assignments and select function bindings correctly during server-side rendering ([#18669](sveltejs/svelte#18669)) - fix: keep boolean attributes with an empty string value when rendering attribute objects on the server ([#18721](sveltejs/svelte#18721)) - fix: sync `SvelteURL` port signal when the protocol setter clears the port ([#18705](sveltejs/svelte#18705)) - fix: block declaration tags and `{@const}` on async values read inside closures ([#18533](sveltejs/svelte#18533)) - fix: avoid css tree-shaking for exported Snippet ([#18540](sveltejs/svelte#18540)) - perf: treat `<img loading>` as a static element again ([#18711](sveltejs/svelte#18711)) - fix: prevent `selectedcontent` mutation from changing the selected option ([#18495](sveltejs/svelte#18495)) - fix: avoid `NaN` keyframe values in `slide` transition for elements without a layout box ([#18430](sveltejs/svelte#18430)) - fix: preserve line feed character references in attribute values ([#18691](sveltejs/svelte#18691)) - fix: decode uppercase-`X` hex numeric character references (`&#X...;`) ([#18708](sveltejs/svelte#18708)) - chore: clarify when `$effect.pre` runs relative to DOM updates ([#18534](sveltejs/svelte#18534)) - fix: scope SSR boundary failed snippets to their boundary ([#18593](sveltejs/svelte#18593))
##### [v5.57.0](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5570) ##### Minor Changes - feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server` ([#18648](sveltejs/svelte#18648)) - feat: add `has` function to `createContext` ([#18472](sveltejs/svelte#18472)) - feat: support `defaultValue` on `<select>` ([#18591](sveltejs/svelte#18591)) - feat: add getOrInsert/getOrInsertComputed to SvelteMap ([#18728](sveltejs/svelte#18728)) ##### Patch Changes - fix: block template store subscriptions on the promise that assigns the store ([#18582](sveltejs/svelte#18582)) - fix: route $derived teardown errors through invoke\_error\_boundary ([#18486](sveltejs/svelte#18486)) - fix: track SvelteDate snapshots in reactions ([#18700](sveltejs/svelte#18700)) - fix: remove `<svelte:head>` anchors on unmount ([#18697](sveltejs/svelte#18697)) - fix: warn on undeclared shorthand event handlers on `<svelte:window>`, `<svelte:document>` and `<svelte:body>` ([#18480](sveltejs/svelte#18480)) - perf: reuse the cached value in the `<option>`/`<select>` value guard ([#18713](sveltejs/svelte#18713)) - fix: prevent malformed AST output for `<select>` with static `value` attribute ([#18449](sveltejs/svelte#18449)) - fix: apply ownership mutation ignores to binding assignments ([#18718](sveltejs/svelte#18718)) - fix: prevent onoutroend from firing twice when compilerOptions.hmr is true ([#18655](sveltejs/svelte#18655)) - fix: preserve whitespace after inline elements when printing ([#18685](sveltejs/svelte#18685)) - perf: fold SSR block-open markers into the branch's first push ([#18712](sveltejs/svelte#18712)) - fix: run `onDestroy` callbacks when a server render throws ([#18585](sveltejs/svelte#18585)) - fix: report `derived_invalid_export` for `export let x = $derived(...)` in runes mode ([#18692](sveltejs/svelte#18692)) - fix: never apply class hash to elements inside `<svelte:head>` ([#18160](sveltejs/svelte#18160)) - fix: keep `defaultChecked` on hydrated radio inputs with spread attributes ([#18701](sveltejs/svelte#18701)) - fix: accept `onfocusin`/`onfocusout` in `a11y_mouse_events_have_key_events` ([#18689](sveltejs/svelte#18689)) - perf: O(n²)→O(n) Map lookups for legacy `$:` reactive statement ordering ([#18602](sveltejs/svelte#18602)) - fix: distinct memoizer on style/class directives ([#18466](sveltejs/svelte#18466)) - fix: measure nested transitions before applying their starting styles ([#18647](sveltejs/svelte#18647)) - fix: don't turn component instances stored in `$state` into state proxies ([#18646](sveltejs/svelte#18646)) - perf: emit `$.only_child` for elements with a single child ([#18717](sveltejs/svelte#18717)) - fix: omit `bind:focused` from SSR output (it has no HTML attribute) ([#18724](sveltejs/svelte#18724)) - fix: more robust rendering of Svelte custom element slots ([#18710](sveltejs/svelte#18710)) - perf: optimize simple object destructuring in `@const` tags ([#18390](sveltejs/svelte#18390)) - fix: properly apply static textarea value attribute during CSR ([#18727](sveltejs/svelte#18727)) - fix: end a restored reaction context at the end of its synchronous segment ([#18694](sveltejs/svelte#18694)) - fix: keep the dependencies of a reaction that throws, so deriveds it read are neither leaked nor stuck in their error ([#18703](sveltejs/svelte#18703)) - fix: don't resurrect outroing elements when an ancestor block is paused and resumed ([#18431](sveltejs/svelte#18431)) - perf: use `$.comment()` for single-comment templates ([#18714](sveltejs/svelte#18714)) - chore: move `@types/trusted-types` to devDependencies ([#18730](sveltejs/svelte#18730)) - perf: store setters cache as `Set` instead of `Array` ([#18251](sveltejs/svelte#18251)) - fix: transform derived assignments and select function bindings correctly during server-side rendering ([#18669](sveltejs/svelte#18669)) - fix: keep boolean attributes with an empty string value when rendering attribute objects on the server ([#18721](sveltejs/svelte#18721)) - fix: sync `SvelteURL` port signal when the protocol setter clears the port ([#18705](sveltejs/svelte#18705)) - fix: block declaration tags and `{@const}` on async values read inside closures ([#18533](sveltejs/svelte#18533)) - fix: avoid css tree-shaking for exported Snippet ([#18540](sveltejs/svelte#18540)) - perf: treat `<img loading>` as a static element again ([#18711](sveltejs/svelte#18711)) - fix: prevent `selectedcontent` mutation from changing the selected option ([#18495](sveltejs/svelte#18495)) - fix: avoid `NaN` keyframe values in `slide` transition for elements without a layout box ([#18430](sveltejs/svelte#18430)) - fix: preserve line feed character references in attribute values ([#18691](sveltejs/svelte#18691)) - fix: decode uppercase-`X` hex numeric character references (`&#X...;`) ([#18708](sveltejs/svelte#18708)) - chore: clarify when `$effect.pre` runs relative to DOM updates ([#18534](sveltejs/svelte#18534)) - fix: scope SSR boundary failed snippets to their boundary ([#18593](sveltejs/svelte#18593))
##### [v5.57.0](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5570) ##### Minor Changes - feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server` ([#18648](sveltejs/svelte#18648)) - feat: add `has` function to `createContext` ([#18472](sveltejs/svelte#18472)) - feat: support `defaultValue` on `<select>` ([#18591](sveltejs/svelte#18591)) - feat: add getOrInsert/getOrInsertComputed to SvelteMap ([#18728](sveltejs/svelte#18728)) ##### Patch Changes - fix: block template store subscriptions on the promise that assigns the store ([#18582](sveltejs/svelte#18582)) - fix: route $derived teardown errors through invoke\_error\_boundary ([#18486](sveltejs/svelte#18486)) - fix: track SvelteDate snapshots in reactions ([#18700](sveltejs/svelte#18700)) - fix: remove `<svelte:head>` anchors on unmount ([#18697](sveltejs/svelte#18697)) - fix: warn on undeclared shorthand event handlers on `<svelte:window>`, `<svelte:document>` and `<svelte:body>` ([#18480](sveltejs/svelte#18480)) - perf: reuse the cached value in the `<option>`/`<select>` value guard ([#18713](sveltejs/svelte#18713)) - fix: prevent malformed AST output for `<select>` with static `value` attribute ([#18449](sveltejs/svelte#18449)) - fix: apply ownership mutation ignores to binding assignments ([#18718](sveltejs/svelte#18718)) - fix: prevent onoutroend from firing twice when compilerOptions.hmr is true ([#18655](sveltejs/svelte#18655)) - fix: preserve whitespace after inline elements when printing ([#18685](sveltejs/svelte#18685)) - perf: fold SSR block-open markers into the branch's first push ([#18712](sveltejs/svelte#18712)) - fix: run `onDestroy` callbacks when a server render throws ([#18585](sveltejs/svelte#18585)) - fix: report `derived_invalid_export` for `export let x = $derived(...)` in runes mode ([#18692](sveltejs/svelte#18692)) - fix: never apply class hash to elements inside `<svelte:head>` ([#18160](sveltejs/svelte#18160)) - fix: keep `defaultChecked` on hydrated radio inputs with spread attributes ([#18701](sveltejs/svelte#18701)) - fix: accept `onfocusin`/`onfocusout` in `a11y_mouse_events_have_key_events` ([#18689](sveltejs/svelte#18689)) - perf: O(n²)→O(n) Map lookups for legacy `$:` reactive statement ordering ([#18602](sveltejs/svelte#18602)) - fix: distinct memoizer on style/class directives ([#18466](sveltejs/svelte#18466)) - fix: measure nested transitions before applying their starting styles ([#18647](sveltejs/svelte#18647)) - fix: don't turn component instances stored in `$state` into state proxies ([#18646](sveltejs/svelte#18646)) - perf: emit `$.only_child` for elements with a single child ([#18717](sveltejs/svelte#18717)) - fix: omit `bind:focused` from SSR output (it has no HTML attribute) ([#18724](sveltejs/svelte#18724)) - fix: more robust rendering of Svelte custom element slots ([#18710](sveltejs/svelte#18710)) - perf: optimize simple object destructuring in `@const` tags ([#18390](sveltejs/svelte#18390)) - fix: properly apply static textarea value attribute during CSR ([#18727](sveltejs/svelte#18727)) - fix: end a restored reaction context at the end of its synchronous segment ([#18694](sveltejs/svelte#18694)) - fix: keep the dependencies of a reaction that throws, so deriveds it read are neither leaked nor stuck in their error ([#18703](sveltejs/svelte#18703)) - fix: don't resurrect outroing elements when an ancestor block is paused and resumed ([#18431](sveltejs/svelte#18431)) - perf: use `$.comment()` for single-comment templates ([#18714](sveltejs/svelte#18714)) - chore: move `@types/trusted-types` to devDependencies ([#18730](sveltejs/svelte#18730)) - perf: store setters cache as `Set` instead of `Array` ([#18251](sveltejs/svelte#18251)) - fix: transform derived assignments and select function bindings correctly during server-side rendering ([#18669](sveltejs/svelte#18669)) - fix: keep boolean attributes with an empty string value when rendering attribute objects on the server ([#18721](sveltejs/svelte#18721)) - fix: sync `SvelteURL` port signal when the protocol setter clears the port ([#18705](sveltejs/svelte#18705)) - fix: block declaration tags and `{@const}` on async values read inside closures ([#18533](sveltejs/svelte#18533)) - fix: avoid css tree-shaking for exported Snippet ([#18540](sveltejs/svelte#18540)) - perf: treat `<img loading>` as a static element again ([#18711](sveltejs/svelte#18711)) - fix: prevent `selectedcontent` mutation from changing the selected option ([#18495](sveltejs/svelte#18495)) - fix: avoid `NaN` keyframe values in `slide` transition for elements without a layout box ([#18430](sveltejs/svelte#18430)) - fix: preserve line feed character references in attribute values ([#18691](sveltejs/svelte#18691)) - fix: decode uppercase-`X` hex numeric character references (`&#X...;`) ([#18708](sveltejs/svelte#18708)) - chore: clarify when `$effect.pre` runs relative to DOM updates ([#18534](sveltejs/svelte#18534)) - fix: scope SSR boundary failed snippets to their boundary ([#18593](sveltejs/svelte#18593))
##### [v5.57.0](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5570) ##### Minor Changes - feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server` ([#18648](sveltejs/svelte#18648)) - feat: add `has` function to `createContext` ([#18472](sveltejs/svelte#18472)) - feat: support `defaultValue` on `<select>` ([#18591](sveltejs/svelte#18591)) - feat: add getOrInsert/getOrInsertComputed to SvelteMap ([#18728](sveltejs/svelte#18728)) ##### Patch Changes - fix: block template store subscriptions on the promise that assigns the store ([#18582](sveltejs/svelte#18582)) - fix: route $derived teardown errors through invoke\_error\_boundary ([#18486](sveltejs/svelte#18486)) - fix: track SvelteDate snapshots in reactions ([#18700](sveltejs/svelte#18700)) - fix: remove `<svelte:head>` anchors on unmount ([#18697](sveltejs/svelte#18697)) - fix: warn on undeclared shorthand event handlers on `<svelte:window>`, `<svelte:document>` and `<svelte:body>` ([#18480](sveltejs/svelte#18480)) - perf: reuse the cached value in the `<option>`/`<select>` value guard ([#18713](sveltejs/svelte#18713)) - fix: prevent malformed AST output for `<select>` with static `value` attribute ([#18449](sveltejs/svelte#18449)) - fix: apply ownership mutation ignores to binding assignments ([#18718](sveltejs/svelte#18718)) - fix: prevent onoutroend from firing twice when compilerOptions.hmr is true ([#18655](sveltejs/svelte#18655)) - fix: preserve whitespace after inline elements when printing ([#18685](sveltejs/svelte#18685)) - perf: fold SSR block-open markers into the branch's first push ([#18712](sveltejs/svelte#18712)) - fix: run `onDestroy` callbacks when a server render throws ([#18585](sveltejs/svelte#18585)) - fix: report `derived_invalid_export` for `export let x = $derived(...)` in runes mode ([#18692](sveltejs/svelte#18692)) - fix: never apply class hash to elements inside `<svelte:head>` ([#18160](sveltejs/svelte#18160)) - fix: keep `defaultChecked` on hydrated radio inputs with spread attributes ([#18701](sveltejs/svelte#18701)) - fix: accept `onfocusin`/`onfocusout` in `a11y_mouse_events_have_key_events` ([#18689](sveltejs/svelte#18689)) - perf: O(n²)→O(n) Map lookups for legacy `$:` reactive statement ordering ([#18602](sveltejs/svelte#18602)) - fix: distinct memoizer on style/class directives ([#18466](sveltejs/svelte#18466)) - fix: measure nested transitions before applying their starting styles ([#18647](sveltejs/svelte#18647)) - fix: don't turn component instances stored in `$state` into state proxies ([#18646](sveltejs/svelte#18646)) - perf: emit `$.only_child` for elements with a single child ([#18717](sveltejs/svelte#18717)) - fix: omit `bind:focused` from SSR output (it has no HTML attribute) ([#18724](sveltejs/svelte#18724)) - fix: more robust rendering of Svelte custom element slots ([#18710](sveltejs/svelte#18710)) - perf: optimize simple object destructuring in `@const` tags ([#18390](sveltejs/svelte#18390)) - fix: properly apply static textarea value attribute during CSR ([#18727](sveltejs/svelte#18727)) - fix: end a restored reaction context at the end of its synchronous segment ([#18694](sveltejs/svelte#18694)) - fix: keep the dependencies of a reaction that throws, so deriveds it read are neither leaked nor stuck in their error ([#18703](sveltejs/svelte#18703)) - fix: don't resurrect outroing elements when an ancestor block is paused and resumed ([#18431](sveltejs/svelte#18431)) - perf: use `$.comment()` for single-comment templates ([#18714](sveltejs/svelte#18714)) - chore: move `@types/trusted-types` to devDependencies ([#18730](sveltejs/svelte#18730)) - perf: store setters cache as `Set` instead of `Array` ([#18251](sveltejs/svelte#18251)) - fix: transform derived assignments and select function bindings correctly during server-side rendering ([#18669](sveltejs/svelte#18669)) - fix: keep boolean attributes with an empty string value when rendering attribute objects on the server ([#18721](sveltejs/svelte#18721)) - fix: sync `SvelteURL` port signal when the protocol setter clears the port ([#18705](sveltejs/svelte#18705)) - fix: block declaration tags and `{@const}` on async values read inside closures ([#18533](sveltejs/svelte#18533)) - fix: avoid css tree-shaking for exported Snippet ([#18540](sveltejs/svelte#18540)) - perf: treat `<img loading>` as a static element again ([#18711](sveltejs/svelte#18711)) - fix: prevent `selectedcontent` mutation from changing the selected option ([#18495](sveltejs/svelte#18495)) - fix: avoid `NaN` keyframe values in `slide` transition for elements without a layout box ([#18430](sveltejs/svelte#18430)) - fix: preserve line feed character references in attribute values ([#18691](sveltejs/svelte#18691)) - fix: decode uppercase-`X` hex numeric character references (`&#X...;`) ([#18708](sveltejs/svelte#18708)) - chore: clarify when `$effect.pre` runs relative to DOM updates ([#18534](sveltejs/svelte#18534)) - fix: scope SSR boundary failed snippets to their boundary ([#18593](sveltejs/svelte#18593)) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Closes #18447.
<select>accepted nodefaultValue, so the only way to say which option starts selected was to putselectedon the matching<option>. That falls apart when the options come from an#each, and it's impossible when the element is spread from an object, which is what the linked SvelteKit issue about resetting remote forms runs into.Writing it didn't error, it just did nothing.
is_dom_property()countsdefaultValueas a property, so the client compiled<select defaultValue="b">down toselect.defaultValue = 'b', andHTMLSelectElementhas no such property. The server dropped the attribute on the floor.The fix marks the matching option
selected, since that attribute is the default state the form reset algorithm restores. Two details were needed to make it behave. The call has to be emitted after the children, otherwise it runs before the options have their values assigned and matches nothing. And the current selection is only restored afterwards when something actually asked for an option throughvalueorbind:value; without that check the initial default never took effect, because restoringselectedIndexput the browser's implicit "first option" choice back.Server-side
select_valuenow falls back todefaultValuewhen there's novalue, so SSR emits the sameselectedattribute the client produces and hydration agrees.An explicit
valuestill wins overdefaultValuewhile the form is live, and resetting the form goes back to the default, matching how<input defaultValue>already behaves.Added
tests/runtime-runes/samples/form-default-value-select, which covers the three cases and a form reset. It fails on main and passes here. Ran the full suite (7546 passing) plustscand eslint. Theruntime-browserfile fails on my machine because the Playwright browser isn't installed, and it fails the same way on a clean checkout of main.Written with Claude Code (Claude Opus 5); I reviewed and tested everything before submitting.