Repository navigation
Release RC packages (rc) - #4192
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/next
branch
15 times, most recently
from
October 22, 2026 01:34
1408a1e to
329e89f
Compare
github-actions
Bot
force-pushed
the
changeset-release/next
branch
from
October 22, 2026 01:36
329e89f to
46f8929
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release 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 next, this PR will be updated.
nextis currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, runchangeset pre exitonnext.Releases
@solidjs/babel-plugin@2.0.0-rc.17
Patch Changes
3e72783: The removed Solid 1.x attribute forms are now compile errors on native elements in the
domandssrgenerates ([2.0] Removed 1.x namespaces (use:,attr:,bool:) andclassListcompile to literal attributes with no diagnostic #4187).on:,oncapture:,attr:,bool:,use:andclassListused to compile silently into literal attributes (<div use:tip="() => {}">,classlist="[object Object]"). Both compilers now reject them with the same message, which names the 2.0 replacement: a camelCase handler or arefcallback foron:, a plain attribute forattr:, a boolean value forbool:, arefdirective factory foruse:, and an object or arrayclassforclassList. Components, the universal generate,prop:and the XML namespaces (xlink:,xml:,xmlns:) are unaffected. The check runs only at compile time and adds no runtime code.6cca8b5: Dev builds now warn with
UNCOMMITTED_INPUT_OVERWRITTEN([2.0] Avaluebinding rewrites the input whenever another attribute in its compiled effect changes, wiping typed text #4186) when a stateful DOM property binding (value/checkedon an input,valueon a textarea,value/selectedon an option,mutedon media) is about to re-write the value it wrote last time over an edit the user never committed to the bound signal — e.g.value={props.name} onChange={commit}with no draft signal, when another dynamic attribute in the same template changes. Runtime behavior is unchanged: the write still happens, once per element and property the warning names the fix (write the signal fromonInput, usedefaultValue/defaultCheckedfor an uncontrolled element, or write a rejected edit back withe.currentTarget.value = next).Production output is unchanged byte for byte. In dev DOM output both compilers write stateful properties through a new
setStatefulProperty(el, name, value)helper instead of the inlineel.name = value; hydratable output keepssetProperty, andspread/assigncheck in the runtime. The check lives only in@solidjs/web's dev build; the production entry carries a plainnode[name] = valuestub that no production-compiled module imports, so it tree-shakes away.The "Form inputs" section of the DOM RFC, the cheatsheet and the solid-2.0 skill now say that a change to any other dynamic attribute in the same template re-runs a stateful binding, link the new code, and drop
equals: falseas a way to reject input (it is what the warning reports); write the accepted value back withe.currentTarget.value = nextinstead.2ba1c4a: A valueless
prop:attribute (<el prop:active />) now compiles asprop:active={true}, matching bare plain attributes, instead of being dropped silently ([compiler] A valuelessprop:attribute is dropped silently by both compilers #4180).@solidjs/compiler@2.0.0-rc.17
Patch Changes
a40b6cd: The directives pass rejects a
broadcast()render that reads the server function's outer body. The render is shared by every caller with the same arguments, but the body runs per caller, so the first caller's value would show for everyone. The returned component, and any local function it renders, may read the function's parameters, its own locals and module scope.3e72783: The removed Solid 1.x attribute forms are now compile errors on native elements in the
domandssrgenerates ([2.0] Removed 1.x namespaces (use:,attr:,bool:) andclassListcompile to literal attributes with no diagnostic #4187).on:,oncapture:,attr:,bool:,use:andclassListused to compile silently into literal attributes (<div use:tip="() => {}">,classlist="[object Object]"). Both compilers now reject them with the same message, which names the 2.0 replacement: a camelCase handler or arefcallback foron:, a plain attribute forattr:, a boolean value forbool:, arefdirective factory foruse:, and an object or arrayclassforclassList. Components, the universal generate,prop:and the XML namespaces (xlink:,xml:,xmlns:) are unaffected. The check runs only at compile time and adds no runtime code.6cca8b5: Dev builds now warn with
UNCOMMITTED_INPUT_OVERWRITTEN([2.0] Avaluebinding rewrites the input whenever another attribute in its compiled effect changes, wiping typed text #4186) when a stateful DOM property binding (value/checkedon an input,valueon a textarea,value/selectedon an option,mutedon media) is about to re-write the value it wrote last time over an edit the user never committed to the bound signal — e.g.value={props.name} onChange={commit}with no draft signal, when another dynamic attribute in the same template changes. Runtime behavior is unchanged: the write still happens, once per element and property the warning names the fix (write the signal fromonInput, usedefaultValue/defaultCheckedfor an uncontrolled element, or write a rejected edit back withe.currentTarget.value = next).Production output is unchanged byte for byte. In dev DOM output both compilers write stateful properties through a new
setStatefulProperty(el, name, value)helper instead of the inlineel.name = value; hydratable output keepssetProperty, andspread/assigncheck in the runtime. The check lives only in@solidjs/web's dev build; the production entry carries a plainnode[name] = valuestub that no production-compiled module imports, so it tree-shakes away.The "Form inputs" section of the DOM RFC, the cheatsheet and the solid-2.0 skill now say that a change to any other dynamic attribute in the same template re-runs a stateful binding, link the new code, and drop
equals: falseas a way to reject input (it is what the warning reports); write the accepted value back withe.currentTarget.value = nextinstead.2ba1c4a: A valueless
prop:attribute (<el prop:active />) now compiles asprop:active={true}, matching bare plain attributes, instead of being dropped silently ([compiler] A valuelessprop:attribute is dropped silently by both compilers #4180).@solidjs/diagnostics@2.0.0-rc.17
Patch Changes
@solidjs/element@2.0.0-rc.17
Patch Changes
@solidjs/h@2.0.0-rc.17
Patch Changes
@solidjs/html@2.0.0-rc.17
Patch Changes
@solidjs/signals@2.0.0-rc.17
Patch Changes
db8241c: A cleanup (
onCleanupor an effect's returned cleanup) that throws no longer aborts the rest of the teardown: every other cleanup in the tree still runs, and the first error is rethrown once the teardown is done. Outside a flush (a root'sdispose()), the dispose call rethrows it. Inside a flush (a branch switch retiring a frame, a pass replacing an uncommitted one, an effect disposing a root),flush()rethrows it after the flush has finished, so commits and effects are never left half-applied, and lazy nodes released before the throw are still released. Anunobservedhook that throws is handled the same way. If an uncaught error halts the reactive system, a collected cleanup error is dropped rather than surfacing later from an unrelateddispose(). On the server,disposeOwnerruns every cleanup the same way, sorenderToStream's final dispose still reports the error ([2.0 rc.16 / next] renderToStream: serializer errors and normal-completion cleanup errors bypass the ambient error hook #4193).690228a: Clearer dev message for
ContextNotFoundError([2.0]createContext(undefined)throws ContextNotFoundError, even when a provider passesundefined#4181).undefinedstill means "not provided" for context, but the message now names the context and says which case it hit: no provider and no default; acreateContext(undefined)default, which is no default; or a provider that passedundefined, which counts as not provided. Each suggestsnullas the explicit empty value (createContext<T | null>(null)). Applies on the client and the server. Production messages and bundles are unchanged. The context docs and cheatsheet now say thatundefinedis "not provided" and thatnullis how to make a context optional.3373ae1: Retain successful falsy fallbacks in mapArray and repeat when their input remains empty, while preserving retries after suspended fallback creation.
411f73b: The dev
REACTIVITY_HALTEDmessage now says where the uncaught error escaped: it ends with the owner path of the computation that threw (in <App> › <Composer> › effect, plus theatsource line when there is one), and the "Update ignored" notice a later write logs repeats it ([2.0] A dev diagnostic thrown in one effect halts the whole app unless an error boundary wraps it #4178). The structured event carries the sameownerPath. A computed that throws into the effect reading it is named, not the effect. Behaviour is unchanged (the system still halts), and production bundles do not change.ee4963a: A keyed optimistic store's arrangement guess is no longer voided when the source answers with something different while the guess's action is open: the answer folds beneath it until the hold commits, and rows then match by key. Two overlapping actions on one list used to leave the store torn after the first one's echo (a hole at its index,
lengthfrom the guess, a raw target served for a row), and the confirmed row remounted twice at the commit, taking an open editor and its draft with it. Now the screen keeps both guesses whole, nothing remounts, and a row another tab added shows when the write settles. Memos and effects outside the optimistic lane still derive from the answer right away and are held with it, andlatest()shows it.2c442c4: A projection whose re-run throws in a flush (a signal it reads written just before its promise rejects) reaches the error boundary again (2.0.0-rc.16: a projection's error never reaches
<Errored>when a signal it reads is written just before its promise rejects (regression from fb6006eb, #4156) #4189).b2d9ed0: Restore deferred lazy releases when an unfinished frame's cleanup throws, so later unrelated lazy memos still clean up when their last observer is removed.
f7f30b9: Dispose superseded createReaction arms even when their initial tracking read suspends or throws.
a99550e: Dev: writing to a store proxy outside its setter (
store.n = 5,store.items.push(x),delete store.user,Object.defineProperty(store, …)) is still ignored, but no longer silently — a newSTORE_WRITE_OUTSIDE_SETTERwarning reports it once per store object and key, with thesetStore(s => { s.key = value })form of the write ([2.0] Writing to a store outside its setter is silently ignored #4179). No production bytes.6cca8b5: Dev builds now warn with
UNCOMMITTED_INPUT_OVERWRITTEN([2.0] Avaluebinding rewrites the input whenever another attribute in its compiled effect changes, wiping typed text #4186) when a stateful DOM property binding (value/checkedon an input,valueon a textarea,value/selectedon an option,mutedon media) is about to re-write the value it wrote last time over an edit the user never committed to the bound signal — e.g.value={props.name} onChange={commit}with no draft signal, when another dynamic attribute in the same template changes. Runtime behavior is unchanged: the write still happens, once per element and property the warning names the fix (write the signal fromonInput, usedefaultValue/defaultCheckedfor an uncontrolled element, or write a rejected edit back withe.currentTarget.value = next).Production output is unchanged byte for byte. In dev DOM output both compilers write stateful properties through a new
setStatefulProperty(el, name, value)helper instead of the inlineel.name = value; hydratable output keepssetProperty, andspread/assigncheck in the runtime. The check lives only in@solidjs/web's dev build; the production entry carries a plainnode[name] = valuestub that no production-compiled module imports, so it tree-shakes away.The "Form inputs" section of the DOM RFC, the cheatsheet and the solid-2.0 skill now say that a change to any other dynamic attribute in the same template re-runs a stateful binding, link the new code, and drop
equals: falseas a way to reject input (it is what the warning reports); write the accepted value back withe.currentTarget.value = nextinstead.0117658: A
<Loading>that a verdict reader (<Show when={latest(x) ?? x()}>) mounts reveals its content again when a component inside it writes a signal during its mount and creates a memo that reads it and stays pending with no reader: that memo holds nothing and reaches no boundary ([2.0 rc.16] A<Loading>mounted throughlatest()never reveals while an unread memo stays pending (regression from dc063a65, #4171) #4203, a regression from [2.0 rc.15 + next] Incomplete #3851 fix: verdict-mounted Loading exposes held DOM content early #4166's fix).solid-js@2.0.0-rc.17
Patch Changes
db8241c: A cleanup (
onCleanupor an effect's returned cleanup) that throws no longer aborts the rest of the teardown: every other cleanup in the tree still runs, and the first error is rethrown once the teardown is done. Outside a flush (a root'sdispose()), the dispose call rethrows it. Inside a flush (a branch switch retiring a frame, a pass replacing an uncommitted one, an effect disposing a root),flush()rethrows it after the flush has finished, so commits and effects are never left half-applied, and lazy nodes released before the throw are still released. Anunobservedhook that throws is handled the same way. If an uncaught error halts the reactive system, a collected cleanup error is dropped rather than surfacing later from an unrelateddispose(). On the server,disposeOwnerruns every cleanup the same way, sorenderToStream's final dispose still reports the error ([2.0 rc.16 / next] renderToStream: serializer errors and normal-completion cleanup errors bypass the ambient error hook #4193).690228a: Clearer dev message for
ContextNotFoundError([2.0]createContext(undefined)throws ContextNotFoundError, even when a provider passesundefined#4181).undefinedstill means "not provided" for context, but the message now names the context and says which case it hit: no provider and no default; acreateContext(undefined)default, which is no default; or a provider that passedundefined, which counts as not provided. Each suggestsnullas the explicit empty value (createContext<T | null>(null)). Applies on the client and the server. Production messages and bundles are unchanged. The context docs and cheatsheet now say thatundefinedis "not provided" and thatnullis how to make a context optional.a2a5b6f: The migration guide notes when a
from()async generator's cleanup runs, the cheatsheet addscreateDeferred, and the docs note thatSETTLED_CLEANUP_UNOWNEDthrows in development (docs: fix the from() migration snippet, add createDeferred to the cheatsheet, note SETTLED_CLEANUP_UNOWNED throws #4183).0771dc8: Docs: effects never compare compute values. The effect half (and the previous cleanup) runs every time the compute half re-runs, even when compute returned an equal value. To skip work on an unchanged value, read a
createMemo(optionally withequals) in the compute. Noted in thesolid-2.0skill and the cheatsheet ([2.0] Effects re-run (and run cleanup) when the compute returns an equal value; there's noequalsoption #4184).d682022: Document how form inputs work with
value/checkedbindings: draft signals for editable fields, writing rejected input back in the handler (orequals: false), uncontrolled inputs, and spreads ([2.0] An input bound withvalue={signal()}keeps text the handler rejected #4185).6cca8b5: Dev builds now warn with
UNCOMMITTED_INPUT_OVERWRITTEN([2.0] Avaluebinding rewrites the input whenever another attribute in its compiled effect changes, wiping typed text #4186) when a stateful DOM property binding (value/checkedon an input,valueon a textarea,value/selectedon an option,mutedon media) is about to re-write the value it wrote last time over an edit the user never committed to the bound signal — e.g.value={props.name} onChange={commit}with no draft signal, when another dynamic attribute in the same template changes. Runtime behavior is unchanged: the write still happens, once per element and property the warning names the fix (write the signal fromonInput, usedefaultValue/defaultCheckedfor an uncontrolled element, or write a rejected edit back withe.currentTarget.value = next).Production output is unchanged byte for byte. In dev DOM output both compilers write stateful properties through a new
setStatefulProperty(el, name, value)helper instead of the inlineel.name = value; hydratable output keepssetProperty, andspread/assigncheck in the runtime. The check lives only in@solidjs/web's dev build; the production entry carries a plainnode[name] = valuestub that no production-compiled module imports, so it tree-shakes away.The "Form inputs" section of the DOM RFC, the cheatsheet and the solid-2.0 skill now say that a change to any other dynamic attribute in the same template re-runs a stateful binding, link the new code, and drop
equals: falseas a way to reject input (it is what the warning reports); write the accepted value back withe.currentTarget.value = nextinstead.Updated dependencies [db8241c]
Updated dependencies [690228a]
Updated dependencies [3373ae1]
Updated dependencies [411f73b]
Updated dependencies [ee4963a]
Updated dependencies [2c442c4]
Updated dependencies [b2d9ed0]
Updated dependencies [f7f30b9]
Updated dependencies [a99550e]
Updated dependencies [6cca8b5]
Updated dependencies [0117658]
@solidjs/universal@2.0.0-rc.17
Patch Changes
@solidjs/web@2.0.0-rc.17
Patch Changes
a40b6cd: Experimental
broadcast(fn): a live server function whose answer is the same for every viewer. It implieslive(and soGET); at the live address every caller with the same arguments shares one server render, and each viewer is a tap on it. A viewer that joins later gets the frame as it stands, then the shared batches; the render ends with its last viewer. The outer body still runs per call (auth, redirects), and the shared render runs under its own request event, so per-viewer state such as the router's query cache never reaches it.9f64ca9:
live(fn)now impliesGET: a live source is a read by contract, so the declaration grants GET dispatch on the server and connects over the GET transport on the client.live(GET(fn))keeps working and is equivalent. The client's POST-at-the-live-address path is gone, which trims live pages by ~144 B minified.0222d68: With
enableRichArguments(), a server function can take files and blobs anywhere in its arguments. Calls likeupload(file, { tags }),upload({ file })andupload(formData, 1)used to fail before sending. They now send multipart form data, with each file as its own part instead of encoded inside the arguments.ee4963a: A live server component's slot record that a commit changes now leaves in the same write as the holes that commit moved, with every arg current. Before, each arg of the occurrence re-sent the record as it updated, so the first copy went out alone with the other args still at their previous values, ahead of the hole. A client fill reading those args could show a state no commit had: the chat's pending message left the outbox before the thread showed its row.
5c0d190:
renderToStreamnow reports two failures through the server error hook even when the render has noonErrorof its own ([2.0 rc.16 / next] renderToStream: serializer errors and normal-completion cleanup errors bypass the ambient error hook #4193). A value the serializer cannot handle reaches the render's hook, else the one set withconfigureServerErrors, as{ kind: "render", handling: "serialize" }, and the render settles. Before, it was an unhandled rejection and the render stayed pending forever. With no hook anywhere, the failure goes toconsole.error. AnonCleanupthat throws when the render is disposed after a normal completion is now contained asabandon()already did (renderToStream: an onCleanup that throws during signal abort crashes the server process #4029): it is reported as{ kind: "render", handling: "failed" }instead of escaping as an unhandled rejection.6cca8b5: Dev builds now warn with
UNCOMMITTED_INPUT_OVERWRITTEN([2.0] Avaluebinding rewrites the input whenever another attribute in its compiled effect changes, wiping typed text #4186) when a stateful DOM property binding (value/checkedon an input,valueon a textarea,value/selectedon an option,mutedon media) is about to re-write the value it wrote last time over an edit the user never committed to the bound signal — e.g.value={props.name} onChange={commit}with no draft signal, when another dynamic attribute in the same template changes. Runtime behavior is unchanged: the write still happens, once per element and property the warning names the fix (write the signal fromonInput, usedefaultValue/defaultCheckedfor an uncontrolled element, or write a rejected edit back withe.currentTarget.value = next).Production output is unchanged byte for byte. In dev DOM output both compilers write stateful properties through a new
setStatefulProperty(el, name, value)helper instead of the inlineel.name = value; hydratable output keepssetProperty, andspread/assigncheck in the runtime. The check lives only in@solidjs/web's dev build; the production entry carries a plainnode[name] = valuestub that no production-compiled module imports, so it tree-shakes away.The "Form inputs" section of the DOM RFC, the cheatsheet and the solid-2.0 skill now say that a change to any other dynamic attribute in the same template re-runs a stateful binding, link the new code, and drop
equals: falseas a way to reject input (it is what the warning reports); write the accepted value back withe.currentTarget.value = nextinstead.Updated dependencies [db8241c]
Updated dependencies [690228a]
Updated dependencies [a2a5b6f]
Updated dependencies [0771dc8]
Updated dependencies [d682022]
Updated dependencies [6cca8b5]
board-example@0.0.1-rc.2
Patch Changes
server-dbmon-example@0.0.1-rc.1
Patch Changes
todos-server-example@0.0.1-rc.5
Patch Changes
test-integration@2.0.0-rc.17
Patch Changes