solidjs

solid

A declarative, efficient, and flexible JavaScript library for building user interfaces.

by solidjs

TypeScript

TypeScript73.6%
JavaScript26.2%
CSS0.2%

Commit activity

Last 12 weeks · 18 commits

Full graph →

Community health

5 of 6 standards met

Community profile →
87
✓README✓License✓Contributing✓Code of Conduct○Issue Template✓PR Template

Recent PRs & issues

Active · Last activity 11m ago
See all on GitHub →
ryansolid

Ported onto L2 (2026-10-04) The PR was authored against the pre-L2 core. The branch was rebuilt in place on (now ): the PR's semantics re-implemented on the hold model, nothing pre-L2 revived. The pre-L2 head is kept as tag (). Spec: (D1–D11, §6 "On L2", §8.3, §10 review brief). The model on L2 Clamp = the commit-#0 loading window. () wraps the memo's compute: every answered pass re-opens , registers an async-shaped result through itself, and keeps the window open only for a flight still in the air. Readers are served the committed value ('s serve branch); no , never , so no frame observes it and no transaction is blocked by it (D1; never sees it). A sync-resolved thenable never opens a flight (A10). Verdict = an mark whose scope is the flight. marks + wakes the verdict readers; the mark drops in ahead of the landing's write (, as clears a plain memo's pending ahead of it) so the readers the write re-runs read the landing as final; follows A19 unchanged (D4). The seam sweep (, riding ) closes what no landing reports (a rejected flight, a dead node) and re-opens a window a commit closed under a newer question. "Never leads" = the seam's own hold decision. A flight asked inside a flush is queued as a pending node of that flush with nothing staged ( → ); a parking flush holds it (), its landing re-enters the hold (A34 (1)), a committing flush sweeps it ('s close is gated on a staged value). Inside an action the flight is the action's work and never delays it. Boundary. `createDeferred = createMemountilrefreshunansweredFlightGlobalQueue._slotDerivecountd1 = createDeferredm1 = createMemo(async){}countd1m1:execm1:doned1m1d1recomputem1m1m1:done(0)m1signaldeferredm1m1fix(createDeferred): a re-ask over a held landing keeps it…signals(createDeferred): a lagging question is not an answer…CONFIG_DEFERREDm1()createDeferred@solidjs/signalssolid-jscreateDeferred(compute, options?)createMemoloadingValuecreateMemocreateDeferredcommitPendingNode_loadingGlobalQueue._deferredLandedGlobalQueue._slotDeriveaffects.tsunmarkonSeamCONFIG_DEFERRED = 1 loadingValuerefresh(d)until(...)untilcreateMemopackages/signals/docs/create-deferred.mdtests/createDeferred.test.tscreateDeferred@solidjs/signalscreateMemocreateDeferredsolid-jscreateMemocreateMemocreateDeferredcommitPendingNodepackages/signals/src/core/deferred.tsoptimistic.tsverdict.ts_loading = trueloadingValueisPendingaffects()markWalkactiveAffectsMarksrefreshuntilread()yield until(...)recomputeREACTIVE_REASKfinallycommitPendingNodeGlobalQueue._deferredLanded?.commitPendingNodeasyncWritenextSize-Exception:handleAsyncMockPromiseisPendingpackages/signalscreateDeferred.test.tspackages/solidpackages/webtsc -p tsconfig.build.jsonRULES-INDEX.mdscripts/sizeorigin/next`.

ryansolid · 2m ago
ethan-huo

Describe the bug Your Example Website or App Standalone source, one-command setup and README. Steps to Reproduce the Bug or Issue The test mounts Feedback in the persistent Router shell, navigates to unresolved lazy route children, waits 400 ms, then releases the route promise. The README also supplies a one-command clean setup and a next-tag switch. Expected behavior The status indicator appears beside the old page at the old URL. It remains absent although routing is true and the timer fires. Release commits the new page normally. Platform Solid rc.15 and next e3716454129f; Router next.39 / HEAD 4a1685ec8f1a; Bun 1.4.2, system Chrome; development and production. Additional context With Router next.30 fixed, Solid rc.13 passes and rc.14 first fails. Compiler rc.13/rc.14 swaps follow the runtime. Router next.39 and built Router HEAD also reproduce. Related #3884 concerns supersession timing rather than this single-navigation feedback failure. Tested hand-rolled transitions without Router pass; the exact runtime trigger remains unisolated.

ethan-huo · 59m ago
ryansolid

_Requested by Ryan · project thread_ Summary Before: a `mapFnmapArraypackages/solid/src/server/signals.ts{ items, rows }sharedConfig.context.liveHoles.sweepingsameItem(prev.items[i], items[i])===$key.messages > li:not(:last-child) form.againRepeatpackages/web/test/server/live-hole-for-rows-4056.spec.tsxmapFnA,B,BBA,A,A,B,A,BB,A,BBsolid-js.nvmrcvite buildcheck-bundle` are clean. In a browser after six replies, only the last message's Regenerate form is visible. Chat benchmark, run locally and not committed: simulated model, 12 KB replies, about 258 writes each, client CPU at 4x. \*The first reply includes server warm-up. Markdown calls show the row reuse directly: they stay at about one per write however long the thread gets. The wire was flat in both runs, at about 27 KB brotli per reply. Client time is essentially unchanged: the wire still carries whole-hole HTML. Per-row ops on the wire are the follow-up in #4056. 🤖 Generated with Claude Code https://claude.ai/code/session_01VywmD8RauUVvMzG8pYPUX8

ryansolid · 32m ago
ryansolid

On (4937f0a), an element inside a `data-lhalha:1data-lha="0"data-lha="1""1"data-lha="0""1"applied: falsecollect()packages/web/test/server/document-live-holes.spec.tsxdata-lha="1" data-lha="0"2,03,1.map2,01,0000live.sweepingssr()captureStart()packages/web/src/server.ts data-lha="N"cap.basecap = nullctx.ssr(pending.t, ...pending.h)packages/solid/src/server/hydration.ts:671signals.ts:3635captureStart() data-lha="0"cap.base#applyAttrspackages/web/frames/src/frame-client.tsdata-lhadata-lha="0"cap = nullcaptureStart data-lha="…"#applyAttrsdata-lha`, as the removal loop already does.

ryansolid · 36m ago
ryansolid

In an app with , a data server function (one that returns data, not a component) called during hydration never sends its request. The frames client's intercept parks the call waiting for a `examples/room/livenext/_server/live/*/_server/data/summary_$HY.done === true//livecomponents: trueexamples/boardcomponents: truepackages/web/frames/src/client.tsinterceptcreateServerComponentHandlerboundaryMayArrive()_$HY.doneawaitBoundary(id)arrivalssubFetchpackages/solid/src/client/hydration.tsPromiseMockPromisenew Promise(r => (resolve = r))awaitBoundaryresolvearrivalstypeof resolve === "undefined"Promise !== nativeTypeError: arrival.resolve is not a functiontracingPromisehy.done && !hy.fr.pending()donepending()_$HY.done = truesetTimeoutdrainHydrationCallbacksssrSource: "client"doneGET /_server/data/summaryboundaryMayArrive()donecomponents: trueonHydrationEndawaitBoundaryboundaryMayArrive` code predates the held-swap policy note (#2964) in the comments, and an older build (around 06c7717dd) behaves the same.

ryansolid · 36m ago
Structured data for AI agents

Repository: solidjs/solid. Description: A declarative, efficient, and flexible JavaScript library for building user interfaces. Stars: 36125, Forks: 1123. Primary language: TypeScript. Languages: TypeScript (73.6%), JavaScript (26.2%), CSS (0.2%). License: MIT. Homepage: https://solidjs.com Topics: declarative, fine-grained, javascript, jsx, performance, proxies, reactive, solid. Latest release: v1.9.0 (2y ago). Open PRs: 14, open issues: 24. Last activity: 11m ago. Community health: 87%. Top contributors: ryansolid, thetarnav, otonashixav, Jutanium, trusktr, dependabot[bot], davedbase, bikeshedder, aminya, Gavin-Gong and others.