Skip to content

fix: round-trip .as('hidden', booleanValue) correctly#15858

Merged
teemingc merged 4 commits into
sveltejs:mainfrom
hjaber:fix/as-hidden-boolean-roundtrip
May 18, 2026
Merged

fix: round-trip .as('hidden', booleanValue) correctly#15858
teemingc merged 4 commits into
sveltejs:mainfrom
hjaber:fix/as-hidden-boolean-roundtrip

Conversation

@hjaber

@hjaber hjaber commented May 16, 2026

Copy link
Copy Markdown
Contributor

closes #15840

.as('hidden', booleanValue) (added in #15802, shipped in 2.60.0) renders correctly on the client — <input value="true" name="b:flag"> — but the receive path was missed. convert_formdata only recognised the 'on' literal that checkboxes emit, so the server-side 'true' was coerced to false. The schema validates either way (v.boolean() accepts both), so handlers ran silently with the wrong data.

'true' always corrupts to false. 'false' coincidentally lands as false. Number .as('hidden', n) is unaffected because n: keys go through a separate parseFloat branch.

The fix is one line in convert_formdata — accept both writers of b: keys. The added unit test would have caught this had it existed when #15802 landed; the e2e test added there only asserts schema validation (which passes either way).


Please don't delete this checklist! Before submitting the PR, please make sure you do the following:

  • It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
  • This message body should clearly illustrate what problems it solves.
  • Ideally, include a test that fails without this PR but passes with it.

Tests

  • Run the tests with pnpm test and lint the project with pnpm lint and pnpm check

Changesets

  • If your PR makes a change that should be noted in one or more packages' changelogs, generate a changeset by running pnpm changeset and following the prompts. Changesets that add features should be minor and those that fix bugs should be patch. Please prefix changeset messages with feat:, fix:, or chore:.

Edits

  • Please ensure that 'Allow edits from maintainers' is checked. PRs without this option may be closed.

@changeset-bot

changeset-bot Bot commented May 16, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6ce3e91

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/kit Patch

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

@vercel vercel Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additional Suggestion:

Hidden boolean inputs with value 'true' are incorrectly converted to false in set_nested_value

Fix on Vercel

@ottomated

Copy link
Copy Markdown
Contributor

Better to just send "on" | "off" for hidden inputs maybe?

@hjaber

hjaber commented May 16, 2026

Copy link
Copy Markdown
Contributor Author

Agreed, that's cleaner. Keeps convert_formdata as a single literal check and treats b: keys as a single canonical wire format regardless of writer.

Pushed 589da34:

  • emit 'on' / 'off' from the submit/hidden branch in create_field_proxy when input_value is boolean (rather than letting true/false stringify into the value attribute)
  • regression test asserts 'on' and 'off' round-trip via convert_formdata

@hjaber hjaber force-pushed the fix/as-hidden-boolean-roundtrip branch from 8028f39 to 589da34 Compare May 17, 2026 01:03
@teemingc teemingc added the forms Stuff relating to forms and form actions label May 18, 2026

@teemingc teemingc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! I've only replaced the test with another one because it was passing even without the fix.

@teemingc teemingc merged commit eea3007 into sveltejs:main May 18, 2026
26 checks passed
This was referenced May 18, 2026
Rich-Harris pushed a commit that referenced this pull request May 22, 2026
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
## @sveltejs/kit@2.61.0

### Minor Changes

- breaking: the `.run()` method has been removed from remote queries on
both the client and the server. Use `await query()` directly instead —
it now works everywhere
([#15779](#15779))


- feat: remote queries can now be awaited in any context (event
handlers, module scope, async callbacks), not just inside reactive
contexts. The cache is shared across reactive and non-reactive
subscribers, so awaiting a query in an event handler will dedupe with
components that have already subscribed to the same query.
([#15779](#15779))


- feat: live query instances are now themselves async-iterable
([#15878](#15878))


- feat: add programmatic `submit` method to `form` remote function
instances ([#15657](#15657))


- feat: pass `form` remote function instance into `enhance` callback
([#15657](#15657))

### Patch Changes

- fix: resolve the app payload without using `process.env.NODE_ENV`
([#15852](#15852))


- fix: support `exactOptionalPropertyTypes` for optional route params
([#15825](#15825))


- fix: correctly send `true` value to the server for 'submit' and
'hidden' form fields
([#15858](#15858))


- fix: avoid build warnings about undefined universal hooks
([#15895](#15895))


- fix: prefer default error page when failing to decode the URL pathname
([#15744](#15744))


- fix: disable link prefetching on slow internet connections
([#15885](#15885))


- fix: allow routes ending with optional parameters next to more
specific routes ([#15861](#15861))


- fix: remove reliance on Content-Length header in
deserialize_binary_form, which caused failures when proxies (e.g.
Vercel, Azure) strip the header and use chunked transfer encoding
([#15796](#15796))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

forms Stuff relating to forms and form actions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.as('hidden', booleanValue) silently submits as false (regression in 2.60.0, follow-up to #15802)

3 participants