Skip to content

Solid 2.0 rc.13: runtime parity, call-record panel, observe exclusion - #21

Merged
ryansolid merged 4 commits into
mainfrom
feat/rc12-observe
Sep 30, 2026
Merged

ryansolid merged 4 commits into
mainfrom
feat/rc12-observe

Conversation

@ryansolid

@ryansolid ryansolid commented Sep 29, 2026 •

Copy link
Copy Markdown
Member

Ports the devtools from the rc.0 runtime they were written against onto Solid 2.0 rc.13. Three feature commits plus a final one that resolves the published runtime: the first makes the toolbar build and read the current runtime again; the second puts the server-function panel back on a live data source and keeps the toolbar out of the runtime's observe layer; the third shows a call the moment its request is sent; the last regenerates the lockfile against npm.

Runtime

Peer floor is ^2.0.0-rc.13 for solid-js / @solidjs/web (and @solidjs/compiler pinned to 2.0.0-rc.13). 2.0.0-rc.12 was never published — npm goes rc.11 → rc.13 — and the floor is the lowest published version that carries both features commits 2 and 3 depend on: OBSERVE.include / CallLive.request / OBSERVE.records.subscribe(type, fn, { bodies: true }) (solidjs/solid#3705) and the "request" record / CallRequestEvent (solidjs/solid#3708). rc.11's @solidjs/web types contain neither; rc.13's contain both.

pnpm-lock.yaml now resolves from the registry (no link: overrides were ever committed; the branch was developed against local links). pnpm added the rc.13 Solid packages to minimumReleaseAgeExclude in pnpm-workspace.yaml so the fresh release installs. All suites were re-run against the published packages: vitest 96/96, tsc clean, build emits only _$$click (16×), Playwright 8/8, publint + attw clean.

Commit 1 — build and read the rc.13 runtime (282e395)

  • Delegated events were dead. The build compiled JSX with @dom-expressions/[email protected], which emits $$click; the rc.9+ runtime reads _$$click. Every click in the reactivity and ownership panels was a no-op. The build (and the e2e fixture) now compile with @solidjs/compiler, the compiler that ships with the runtime. Dist before: 16× $$click, 0× _$$click; after: 0× $$click, 16× _$$click.
  • Node errors are read off the extension: node._x?._error (was node._error).
  • Store slot nodes are recognised by their _host backref (the previous _isStoreNode field never existed); they render as store again.
  • The built-in hot-reload wrapper memo is now created with _plumbing (CONFIG_PLUMBING = 1 << 25) and unnamed, rather than named [solid-refresh]…. The graph hides plumbing nodes and the ownership tree walks through them without a row. Prefix handling kept.
  • e2e: the production server build now sanitizes render errors to Internal Server Error, so Playwright runs with NODE_OPTIONS=--conditions=development (the toolbar only ships under that condition).
  • The server-side Errored fallback wrote signals during SSR, which rc.11 reports as SERVER_WRITE (deprecated, becoming an error). On the server it now sets the 500 status and logs only.
  • registry.test.ts's "no dev runtime" suite relied on Node resolving solid-js to a build without DEV; rc.11's node → development condition resolves server.dev.js, so the suite mocks solid-js with a switchable DEV.

Commit 2 — call record + observe exclusion (b1911ae)

  • observeServerFunctionCalls was removed from @solidjs/web/server-functions in rc.9; the panel has shown nothing since. src/index.tsx now subscribes to OBSERVE.records for "call" with { bodies: true } and maps each settled record into the tracker's existing request/response events (callRecordToEvents, unit-tested): request at event.at, response at at + durationMs, meta.name from the record's source name, a fetch-rejected call as request-only with the failure on meta.error, nothing when no request was built.
  • DevToolbar marks its owner with OBSERVE.exclude; AppScope hands the wrapped app back with OBSERVE.include (nearest marked ancestor answers), so the toolbar's own signals and effects are never reported as the app's by diagnostics, attribution or the performance tracks — which the Vite plugin now enables by default in vite dev.

Commit 3 — a call appears when its request is sent (05b6c73)

  • The "call" record arrives at settle, so a slow or hung call never appeared. The panel now also subscribes to the "request" record (solidjs/solid#3708): a row appears the moment the request is handed to fetch, and the "call" record completes it — joined by the live object the runtime hands to both listeners (a WeakMap<CallLive, instance>). A settled call whose request was never seen (subscription came mid-call) is shown whole from its "call" record.
  • A fetch that itself rejected re-shows the row as failed: "Request failed: " in place of "Waiting for response.", and an ERR badge in the list.
  • connectCallRecords(records) owns the wiring behind a structural channel type so tests drive it with a fake; requestRecordToEvent / settleRecordToEvents are the pure mappings beside the settle-only callRecordToEvents.

Commit 4 — resolve the rc.13 runtime from the registry (ac9fdd4)

  • package.json: peers and devDeps solid-js / @solidjs/web ^2.0.0-rc.13, @solidjs/compiler 2.0.0-rc.13.
  • pnpm-lock.yaml regenerated from npm; pnpm-workspace.yaml gains the rc.13 minimumReleaseAgeExclude entries pnpm wrote during install.

Public API changes

  • Peer dependencies solid-js / @solidjs/web: ^2.0.0-rc.0 → ^2.0.0-rc.13 (breaking for consumers on earlier RCs; the package was already non-functional on rc.9+).
  • Build devDependency: @dom-expressions/compiler → @solidjs/compiler; @solidjs/vite-plugin devDependency 3.0.0-next.35 → 3.0.0-next.46.
  • No changes to the package's exports (DevToolbar, mountDevToolbar, pushServerFunctionCall, ServerFunctionCall unchanged).

Behavior changes

  • A server-function call appears when its request is handed to fetch and completes at settle; a fetch that fails is marked as failed. request.time is the send time (after serialization and prepareRequest), as it was under the rc.0 probe, so the displayed duration is wire + decode.
  • SSR render errors no longer seed the toolbar's error-panel state during the server render (it never survived hydration; the 500 status and the log remain).

Tests

Unit 73/75 → 96/96 (vitest), typecheck clean, e2e 7/8 → 8/8 (Playwright), publint + attw clean. Verified against the published 2.0.0-rc.13 packages resolved from npm.

— Claude via Cursor

ryansolid and others added 2 commits September 28, 2026 16:04
…ore nodes, HMR plumbing)

Compile with @solidjs/compiler instead of @dom-expressions/compiler, so
delegated handlers use the `_$$click` key the rc.9+ runtime reads. Every
delegated click in the reactivity and ownership panels was dead. Peers and
dev deps move to solid-js / @solidjs/web ^2.0.0-rc.12 and
@solidjs/vite-plugin 3.0.0-next.46.

Runtime field parity with rc.11/rc.12:
- a node's error lives on its extension (`_x._error`)
- store slot nodes are signals carrying the store target as `_host`
  (`_isStoreNode` never existed); classified as `'store'`
- the built-in refresh wraps components in an unnamed memo flagged
  `CONFIG_PLUMBING` (1 << 25) on `_config`; the graph hides it and owner
  paths and the ownership tree walk through it

The server-side Errored fallback sets the 500 status and logs without
writing toolbar state (the dev runtime now flags server signal writes).

Tests: the "no dev runtime" registry suite mocks `DEV` (rc.11 solid-js
resolves `node.development` to server.dev.js, which ships DEV); new cases
for `_x._error`, `_host`, and plumbing in registry and tree. Playwright
workers run under `--conditions=development`, matching the toolbar's own
export condition; the prod server build now sanitizes render errors.

The lockfile is left at its previous state: 2.0.0-rc.12 is not published
yet and must be regenerated once it lands.

Co-authored-by: Cursor <[email protected]>
…e toolbar from the observe layer

- `observeServerFunctionCalls` was removed from `@solidjs/web/server-functions`
  in rc.9, so the panel has received nothing since. `src/index.tsx` now
  subscribes to `OBSERVE.records` for `"call"` with `{ bodies: true }` and
  maps each settled record into the tracker's existing request/response
  events (`callRecordToEvents`): request at `event.at`, response at
  `at + durationMs`, `meta.name` from the record's source name, a
  fetch-rejected call as request-only with the failure on `meta.error`, and
  nothing when no request was built.
- `DevToolbar` marks its owner with `OBSERVE.exclude`; `AppScope` hands the
  wrapped app back with `OBSERVE.include`, so the toolbar's own signals and
  effects are never reported as the app's by diagnostics, attribution or the
  performance tracks (nearest marked ancestor answers).
- `pushServerFunctionCall` / `ServerFunctionCall` stay exported.

Requires solid-js / @solidjs/web 2.0.0-rc.12 (solidjs/solid#3705).

Co-authored-by: Claude via Cursor <[email protected]>
Co-authored-by: Cursor <[email protected]>
@socket-security

socket-security Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updated@​solidjs/​web@​2.0.0-rc.0 ⏵ 2.0.0-rc.13100 +510083 +197 +1100
Updated@​solidjs/​compiler@​2.0.0-rc.7 ⏵ 2.0.0-rc.1396 +16100100 +195 +3100
Updatedsolid-js@​2.0.0-rc.0 ⏵ 2.0.0-rc.1310010095 +196 +1100
Updated@​solidjs/​vite-plugin@​3.0.0-next.35 ⏵ 3.0.0-next.4696100100 +196 +2100

View full report

ryansolid and others added 2 commits September 29, 2026 08:56
…rk failed fetches

The `"call"` record arrives at settle, so a slow or hung call never
appeared in the panel. The panel now also subscribes to the `"request"`
record (solidjs/solid#3708): a call shows up the moment its request is
handed to `fetch`, and its `"call"` record completes the row — the two are
joined by the `live` object the runtime hands to both listeners. A settled
call whose request was never seen (the subscription came mid-call) is shown
whole from its `"call"` record. A fetch that itself rejected re-shows the
row as failed (`meta.error`): "Request failed: <message>" in place of
"Waiting for response." and an ERR badge in the list.

`connectCallRecords(records)` owns the wiring (structural channel type, so
tests drive it with a fake); `requestRecordToEvent` / `settleRecordToEvents`
are the pure mappings beside the settle-only `callRecordToEvents`. No
exported type changes.

Co-authored-by: Claude via Cursor <[email protected]>
Co-authored-by: Cursor <[email protected]>
Solid 2.0.0-rc.13 is published; rc.12 never was (npm goes rc.11 -> rc.13).
The peer floor is the lowest published version carrying both features this
branch depends on — OBSERVE.include (solidjs/solid#3705) and the "request"
call record / CallRequestEvent / subscribe(..., { bodies: true })
(solidjs/solid#3708). rc.11's @solidjs/web types have neither; rc.13's do.
So peers and devDeps move to ^2.0.0-rc.13 and @solidjs/compiler pins
2.0.0-rc.13.

pnpm-lock.yaml is regenerated from the registry (no link: overrides; the
branch was developed against local links that were never committed).
pnpm added the rc.13 Solid packages (solid-js, @solidjs/web,
@solidjs/signals, @solidjs/compiler and its platform binaries) to
minimumReleaseAgeExclude so the fresh release installs.

Re-run against the published packages: vitest 96/96, tsc clean, build
emits only _$$click, playwright 8/8, publint + attw clean.
@socket-security

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Priority Alert  (click "▶" to expand/collapse) Action
Low priority
Low adoption: npm @solidjs/compiler-darwin-arm64

Location: Package overview

From: pnpm-lock.yaml → npm/@solidjs/[email protected] → npm/@solidjs/[email protected]

ℹ Read more on: This package | This alert | What are unpopular packages?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at [email protected].

Suggestion: Unpopular packages may have less maintenance and contain other problems.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@solidjs/[email protected]. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn
Low priority
Low adoption: npm @solidjs/compiler-darwin-x64

Location: Package overview

From: pnpm-lock.yaml → npm/@solidjs/[email protected] → npm/@solidjs/[email protected]

ℹ Read more on: This package | This alert | What are unpopular packages?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at [email protected].

Suggestion: Unpopular packages may have less maintenance and contain other problems.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@solidjs/[email protected]. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn
Low priority
Low adoption: npm @solidjs/compiler-darwin-x64

Location: Package overview

From: pnpm-lock.yaml → npm/@solidjs/[email protected] → npm/@solidjs/[email protected]

ℹ Read more on: This package | This alert | What are unpopular packages?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at [email protected].

Suggestion: Unpopular packages may have less maintenance and contain other problems.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@solidjs/[email protected]. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn
Low priority
Low adoption: npm @solidjs/compiler-linux-arm64-gnu

Location: Package overview

From: pnpm-lock.yaml → npm/@solidjs/[email protected] → npm/@solidjs/[email protected]

ℹ Read more on: This package | This alert | What are unpopular packages?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at [email protected].

Suggestion: Unpopular packages may have less maintenance and contain other problems.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@solidjs/[email protected]. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn
Low priority
Low adoption: npm @solidjs/compiler-win32-x64-msvc

Location: Package overview

From: pnpm-lock.yaml → npm/@solidjs/[email protected] → npm/@solidjs/[email protected]

ℹ Read more on: This package | This alert | What are unpopular packages?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at [email protected].

Suggestion: Unpopular packages may have less maintenance and contain other problems.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@solidjs/[email protected]. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn

View full report

@ryansolid ryansolid changed the title Solid 2.0 rc.12: runtime parity, call-record panel, observe exclusion Solid 2.0 rc.13: runtime parity, call-record panel, observe exclusion Sep 30, 2026
@ryansolid
ryansolid marked this pull request as ready for review September 30, 2026 06:47
@ryansolid
ryansolid merged commit 841fc15 into main Sep 30, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant