Skip to content

Commit 841fc15

Browse files
ryansolidcursoragentClaude via Cursor
authored
feat: Solid 2.0 rc.13 — runtime parity, call-record panel, observe exclusion (#21)
* fix: build and read the rc.12 runtime (compiler parity, _x._error, store 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 <cursoragent@cursor.com> * feat: drive the server-function panel from the "call" record; hide the 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 <noreply@cursor.com> Co-authored-by: Cursor <cursoragent@cursor.com> * feat: show a call when its request is sent (the "request" record); mark 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 <noreply@cursor.com> Co-authored-by: Cursor <cursoragent@cursor.com> * chore: resolve the rc.13 runtime from the registry 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. --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Claude via Cursor <noreply@cursor.com>
1 parent 341960b commit 841fc15

18 files changed

Lines changed: 911 additions & 209 deletions
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
'@solidjs/start-devtools': patch
3+
---
4+
5+
The server-function panel is driven by the runtime's `"call"` record.
6+
7+
`observeServerFunctionCalls` was removed from `@solidjs/web/server-functions` in rc.9; the panel has shown nothing since. It now subscribes to `OBSERVE.records` for `"request"` and `"call"` with `bodies: true`: a call appears the moment its request is handed to `fetch` and completes when the caller's await settles, showing the request as sent and the response as it arrived, with unread bodies to inspect, the function's source name when the build carried one, and the call's timing. A call whose fetch itself failed is marked as failed, with the thrown value's message in place of the response.
8+
9+
The toolbar excludes its own owner from the runtime's observe layer (`OBSERVE.exclude`) and hands the app it wraps back (`OBSERVE.include`), so the toolbar's own signals and effects are never reported as the app's by diagnostics, attribution, or the performance tracks.

‎.changeset/rc12-runtime-parity.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@solidjs/start-devtools': patch
3+
---
4+
5+
Build and read the Solid 2.0.0-rc.12 runtime.
6+
7+
The toolbar is compiled with `@solidjs/compiler`, the compiler that ships with the runtime, so delegated event handlers use the key the runtime reads (`_$$click`). Every click in the reactivity and ownership panels was dead against rc.9 and later.
8+
The `solid-js` and `@solidjs/web` peers move to `^2.0.0-rc.12`.
9+
The reactivity graph reads a node's error off its extension (`_x._error`), recognises store slot nodes by the store they belong to, and hides the memo the built-in hot reload wrapper creates, which the runtime now marks as plumbing instead of naming. The ownership tree walks through that memo without a row.
10+
A server render that fails sets the 500 status and logs, without writing toolbar state.

‎package.json‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@
5252
"access": "public"
5353
},
5454
"peerDependencies": {
55-
"@solidjs/web": "^2.0.0-rc.0",
56-
"solid-js": "^2.0.0-rc.0"
55+
"@solidjs/web": "^2.0.0-rc.13",
56+
"solid-js": "^2.0.0-rc.13"
5757
},
5858
"devDependencies": {
5959
"@arethetypeswrong/cli": "^0.18.5",
6060
"@changesets/cli": "^2.30.0",
61-
"@dom-expressions/compiler": "^0.50.0-next.43",
6261
"@jridgewell/trace-mapping": "^0.3.31",
6362
"@playwright/test": "^1.62.1",
64-
"@solidjs/vite-plugin": "3.0.0-next.35",
65-
"@solidjs/web": "^2.0.0-rc.0",
63+
"@solidjs/compiler": "2.0.0-rc.13",
64+
"@solidjs/vite-plugin": "3.0.0-next.46",
65+
"@solidjs/web": "^2.0.0-rc.13",
6666
"@types/node": "^24.0.0",
6767
"error-stack-parser-es": "^2.0.1",
6868
"html-to-image": "^1.11.13",
@@ -72,7 +72,7 @@
7272
"rolldown-plugin-dts": "^0.28.2",
7373
"seroval": "^1.6.0",
7474
"shiki": "^4.3.1",
75-
"solid-js": "^2.0.0-rc.0",
75+
"solid-js": "^2.0.0-rc.13",
7676
"terracotta": "2.0.0-next.9",
7777
"typescript": "^7.0.2",
7878
"vite": "^8.2.1",

‎playwright.config.ts‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import { defineConfig } from '@playwright/test';
22

3+
// The toolbar only exists behind the `development` export condition, and the
4+
// runtime keeps render errors intact only in its development server build. The
5+
// worker processes running the server-side tests inherit this, so they resolve
6+
// solid-js and @solidjs/web the way a development server does.
7+
const conditions = '--conditions=development';
8+
if (!process.env.NODE_OPTIONS?.includes(conditions)) {
9+
process.env.NODE_OPTIONS = [process.env.NODE_OPTIONS, conditions].filter(Boolean).join(' ');
10+
}
11+
312
export default defineConfig({
413
testDir: './tests/e2e',
514
reporter: process.env.CI ? 'github' : 'list',

0 commit comments

Comments
 (0)