Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add experimental TSRX compiler frontends - #3086

Merged
ryansolid merged 17 commits into
nextfrom
tsrx-frontend
Sep 1, 2026
Merged

Add experimental TSRX compiler frontends#3086
ryansolid merged 17 commits into
nextfrom
tsrx-frontend

Conversation

@ryansolid

@ryansolidryansolid commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class .tsrx syntax routing to both @solidjs/babel-plugin and @solidjs/compiler
  • parse authored JS/TS leaves once and lower TSRX semantics directly into Oxc AST before the shared Solid JSX transforms
  • lower statement containers, control flow, dynamic tags, scoped styles, and compiler-generated deferred bindings with Babel/native parity coverage
  • reject authored lazy destructuring (&{ ... } / &[ ... ]) so Solid property and accessor reads remain explicit
  • provide authored source maps plus a compiler-owned typecheck projection with exact editor mappings and incomplete-snapshot recovery
  • compose lowered .tsrx modules with Solid's function-level \"use server\" transform while preserving path-stable IDs

Vite integration: solidjs/solid-vite-plugin#333

Test plan

  • pnpm --filter @solidjs/babel-plugin test
  • compiler Rust tests with default, no-default, and TSRX-only feature configurations
  • compiler JavaScript suite: 5,803 passed, 28 intentionally skipped
  • Clippy with warnings denied across compiler feature configurations
  • full Babel/native and cross-mode parity ratchets
  • focused TSRX runtime, typecheck projection, source-map, recovery, directive, and scoped-style coverage

Release plan

Ready for review as an RC.6 candidate. The branch is merged with current next; final release inclusion remains contingent on repository CI and maintainer review.

Made with Cursor

ryansolidand others added 5 commits August 25, 2026 16:09
.tsrx sources desugar TSRX constructs into the shared Solid JSX lowering
in @solidjs/babel-plugin (via @tsrx/core) and @solidjs/compiler (via a
pinned oxc-tsrx text projection), with byte-parity enforced by the
fixture corpus and parity harness. Also fixes DOM insert markers to ride
the following sibling's declared walk variable, matching Babel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Exercise Unicode spans, lexical traps, nested backend lowering, accessor
scope, and early-error constraints so the shared corpus catches frontend
drift. Rewrite lazy binding update targets in the native compiler to match
the Babel frontend.
Co-authored-by: Cursor <cursoragent@cursor.com>
Execute the same authored fixtures through Babel and Oxc against the real
Solid DOM and SSR runtimes, asserting reactive updates, keyed identity,
events, lazy writes, branches, and empty fallbacks independently of
code-generation parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add full lazy destructuring semantics and close parser parity gaps so both frontends support expression containers, accessor-backed patterns, and lazy arrow parameters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compile TSRX style blocks into parity-tested scoped CSS sidecars across Babel and native pipelines without runtime helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59e1502

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

This PR includes changesets to release 11 packages
NameType
@solidjs/compilerMinor
@solidjs/babel-pluginMinor
test-integrationPatch
@solidjs/diagnosticsMinor
@solidjs/elementMinor
@solidjs/hMinor
@solidjs/htmlMinor
@solidjs/signalsMinor
solid-jsMinor
@solidjs/universalMinor
@solidjs/webMinor

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

@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown

size-limit report 📦

PathSize
signals: core floor (createSignal/Memo/Effect/Root/flush)7.59 KB (0%)
signals: + createStore13.22 KB (0%)
signals: + isPending/latest9.53 KB (0%)
app: render + one signal (the simple-app floor)10.24 KB (0%)
app: hydrating (no stores) with Show/For/Loading/Errored/lazy16.9 KB (0%)
app: hydrating + every store primitive family24.33 KB (0%)
app: CSR with Show/For/Loading/Errored/lazy12.34 KB (0%)
frames: eager client consumer (frames client + transport, lazy codec)10.6 KB (0%)

@coveralls

coveralls commented Aug 28, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 33159014288

Warning

Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes.
Quick fix: rebase this PR. Learn more →

Coverage remained the same at 72.216%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines:996
Covered Lines:767
Line Coverage:77.01%
Relevant Branches:782
Covered Branches:517
Branch Coverage:66.11%
Branches in Coverage %:Yes
Coverage Strength:14.64 hits per line

💛 - Coveralls

@codspeed-hq

codspeed-hqBot commented Aug 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 136 untouched benchmarks
⏩ 132 skipped benchmarks1


Comparing tsrx-frontend (59e1502) with next (d13b1ce)

Open in CodSpeed

Footnotes

  1. 132 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

ryansolidand others added 2 commits August 27, 2026 22:25
Allow secondary compiler passes to retain the authored TSRX path so server-function IDs stay aligned with Vite's manifest.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scope selectors against known elements instead of allowing unrelated selectors whenever a dynamic child is present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Compose Oxc mappings through exact projection ranges while leaving generated scaffolding unmapped.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

socket-securityBot commented Aug 28, 2026

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​@​tsrx/​core@​0.1.63941009799100

View full report

ryansolidand others added 8 commits August 28, 2026 16:05
Centralize Solid TSRX control-flow semantics for runtime and independently typecheckable projections while fixing index-only loop callbacks, authored coordinates, and embedded payload ordering.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace runtime text projection and reparse with compiler-owned semantic lowering while retaining projection only for tooling output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin the compiler to the merged tooling projection fixes used by direct AST leaf loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
Publish fail-closed authored ranges so language tooling can use the compiler-owned typecheck projection without attributing generated helpers to user source.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consume the upstream parser recovery contract only in the typecheck projection and materialize generated placeholders without mapping them to authored text, while keeping runtime compilation strict.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Solid's reactive reads explicit while retaining the deferred-pattern machinery used internally by keyed loops and catch clauses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the parity harness conflict while retaining TSRX filename routing and the updated patch-mode matrix.
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve native JSX child shape, callback setup placement, and deferred SSR child evaluation so direct lowering matches the Babel frontend after merging next.
Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 1, 2026 20:24
@ryansolid
ryansolid merged commit 7dad3e9 into nextSep 1, 2026
5 of 7 checks passed
ryansolid added a commit to solidjs/solid-vite-plugin that referenced this pull request Sep 2, 2026
rc.6 publishes the TSRX compiler frontends this branch routes
(solidjs/solid#3086). The workspace catalog moves to ^2.0.0-rc.6
(minimumReleaseAgeExclude extended per the existing pattern), and the
plugin's @solidjs/compiler and @solidjs/babel-plugin floors move from
^2.0.0-rc.3 to ^2.0.0-rc.6 — the real requirement, since older
compilers reject .tsrx outright. The published Babel frontend resolves
TSRX parsing through its optional peer @tsrx/core (exact 0.1.63), so
the vite-8 example installs it for the Babel half of the matrix; the
native binary bundles its own frontend.
Full gate green against published rc.6 (no linking): ssr 12/12 +
boundary 8/8, css-matrix 82/82 + bridge 19/19, start-ssr 366/366 +
http-bridge 10/10, start-client 45/45, start-env 47/47, cypress e2e
1/1, and the TSRX matrix on both compiler backends: vite-8 prod
builds, vitest browser 1/1, SSR entry builds, and dev
transform/CSS-sidecar/HMR/source-map/server-function smoke checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for freeto 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.

2 participants

@ryansolid@coveralls