Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid
, '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

Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid
, '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

Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid
, '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

Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid
, '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

Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid
, '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

Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid
, '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

Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid
, '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

Adopt path-based server function addressing - #590

Merged
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing
Aug 28, 2026
Merged

Adopt path-based server function addressing#590
ryansolid merged 2 commits into
nextfrom
server-function-path-addressing

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Summary

Downstream adoption of solidjs/solid#3076, which moved the server function id into the path (<endpoint>/<id>) and retired both the X-Server-Function-Id header and the ?id= query fallback.

  • The generic form-action fallback (createServerFormAction) reads the id back through the runtime's new parseServerFunctionUrl instead of parsing ?id= by hand — the router no longer hard-codes the addressing scheme.
  • Bound ?args composition (action.with) is untouched: arguments stayed in the query per the #3072 discussion, and hashKey already emits the plain JSON the server-side convention decodes.
  • "Not an address" now means a malformed path (bare endpoint, extra segments) rather than a missing ?id; the native-submission fallbacks keep working through the runtime's parse answering null.
  • actionBase prefix interception is unchanged — /_server/<id> still lives under /_server.

Draft until

@solidjs/web publishes the addressing change (anything newer than 2.0.0-rc.3). The ^2.0.0-rc.3 range picks the new build up on publish; CI here will fail on the missing parseServerFunctionUrl export until then.

Test plan

  • Full suite (dom + server configs + type tests) passes locally against a file: link to the @solidjs/web build from solid next — 382 + 33 passing.
  • Re-run CI once the next @solidjs/web prerelease is published.

Made with Cursor

solidjs/solid#3076 moved the function id into the path
(`<endpoint>/<id>`), retiring both the X-Server-Function-Id header and
the `?id=` query fallback. The generic form-action fallback now reads
the id back through the runtime's parseServerFunctionUrl rather than
parsing the query by hand — the router no longer hard-codes the
addressing scheme. Bound `?args` composition is untouched: arguments
stayed in the query, and hashKey already emits the plain JSON the
server-side convention reads.
"Not an address" now means a malformed path (extra segments, bare
endpoint) rather than a missing `?id`; the native-submission fallbacks
keep working through the runtime's parse answering null.
Requires @solidjs/web newer than 2.0.0-rc.3.
Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot

changeset-botBot commented Aug 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 701ccf8

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

This PR includes changesets to release 1 package
NameType
@solidjs/routerPatch

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

@ryansolid

Copy link
Copy Markdown
MemberAuthor

Companion plugin PR: solidjs/solid-vite-plugin#332 (endpoint prefix-matching + path-based module preload in the dev middleware). Both are draft until the next @solidjs/web prerelease publishes the addressing change.

The dist-types check failed because the lockfile still resolved
@solidjs/web 2.0.0-rc.3, which predates parseServerFunctionUrl — the
runtime half of the addressing scheme this branch adopts. The peer and
dev floors now say what the code means: ^2.0.0-rc.4.
The vite plugin moves to 3.0.0-next.35 (the plugin half of
solidjs/solid#3076), which requires vite 8, which requires vitest 4 —
test-toolchain-only, but vitest 4 constructs `new FormData()` through
the mock's implementation, so the arrow-function stubs become real
functions (arrows aren't constructable), and one Mock type annotation
gains its signature.
Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

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

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedvitest@​4.1.11981007998100
Addedvite@​8.2.2981008296100
Added@​solidjs/​web@​2.0.0-rc.4991008397100
Added@​solidjs/​vite-plugin@​3.0.0-next.359610010094100
Addedsolid-js@​2.0.0-rc.41001009596100

View full report

@ryansolid
ryansolid marked this pull request as ready for review August 28, 2026 22:17
@ryansolid
ryansolid merged commit 60291cc into nextAug 28, 2026
3 checks passed
@ryansolidryansolid mentioned this pull request Aug 29, 2026
2 tasks
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.

1 participant

@ryansolid