Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
05bf908
Initial upgrade to solid v2
brenelz Mar 4, 2026
a26c9b4
Fix hydration mismatch
brenelz Mar 4, 2026
984a368
fixes
brenelz Mar 5, 2026
1c0efad
dedupe solid and solid-router
brenelz Mar 5, 2026
de8272b
fixture tweaks
brenelz Mar 5, 2026
ad6c458
more hackernews tweaks
brenelz Mar 5, 2026
6d3a870
fixes
brenelz Mar 6, 2026
cc134c5
upgrade to newest solid beta
brenelz Mar 6, 2026
57c529f
Reset landing page to v1 because of kobalte
brenelz Mar 7, 2026
656cda1
lockfile changes
brenelz Mar 7, 2026
91a89a8
use solidjs next version
brenelz Mar 10, 2026
3dc43fc
ugprade to beta.2
brenelz Mar 11, 2026
39e4a8f
fix lockfile
brenelz Mar 11, 2026
a7cf407
Upgrade to solid v2 beta.3
brenelz Mar 17, 2026
91720b4
Update to latest solid meta
brenelz Mar 18, 2026
b7a253d
Update router deps
brenelz Mar 19, 2026
4c7cfc9
Merge branch 'main' into upgrade-to-solid-2-beta
brenelz Mar 19, 2026
b6c3480
Fix tests
brenelz Mar 19, 2026
a4e888d
feat(2.0): terracotta@next (#2118)
lxsmnsyc Mar 21, 2026
0083bba
Merge branch 'main' into upgrade-to-solid-2-beta
brenelz Mar 21, 2026
d2867e7
upgrade to beta.4
brenelz Mar 21, 2026
480f830
Update to solid 2.0.0-beta.6
brenelz Apr 10, 2026
1da1504
chore: upgrade to solidjs beta 7
brenelz Apr 18, 2026
6a5107a
update to solidjs beta.15
brenelz Jul 3, 2026
d44294b
fix remaining beta.15 breakages: raw-value callbacks, terracotta patch
brenelz Jul 7, 2026
8c8371d
Merge remote-tracking branch 'origin/main' into upgrade-to-solid-2-beta
brenelz Jul 7, 2026
6f7587d
fix beta.15 runtime breakages surfaced after the merge
brenelz Jul 7, 2026
0208243
fix server-function-query-toplevel test route for beta.15 SSR semantics
brenelz Jul 7, 2026
ada98e1
upgrade terracotta to 2.0.0-next.6, drop the createDynamic patch
brenelz Jul 7, 2026
d53dbba
restore lazy component asset injection from main for beta.15
brenelz Jul 8, 2026
be0c681
restore JSX renderAsset, fix beta.15 crash with NoHydration wrapper
brenelz Jul 8, 2026
c597710
update to solidjs beta.16
brenelz Jul 8, 2026
6ed7d80
chore: bring back missing data deferStream in css fixture
katywings Jul 11, 2026
78557ff
fix: disable all css handling
katywings Jul 11, 2026
90cb9cd
update to solidjs beta.17
katywings Jul 11, 2026
5395db4
update to solidjs beta.18 and vite-plugin-solid 3.0.0-next.9
ryansolid Jul 15, 2026
0c61e39
adopt the runtime asset system, drop Start's own CSS/manifest machinery
ryansolid Jul 15, 2026
16a2426
adopt vite-plugin-solid's server functions compiler, share the serial…
ryansolid Jul 15, 2026
f3eb49e
adopt the @solidjs/web server-functions runtime
ryansolid Jul 16, 2026
75a3203
update to solidjs beta.20 and vite-plugin-solid 3.0.0-next.13
ryansolid Jul 18, 2026
3622d02
Merge branch 'main' into upgrade-to-solid-2-beta
brenelz Jul 20, 2026
8bdca50
test: skip unsupported Solid 2 server function cases
brenelz Jul 20, 2026
e905d97
adopt the router's server-function integration
ryansolid Jul 20, 2026
3af1d34
retire the legacy GET shim in favor of the core export
ryansolid Jul 20, 2026
712731b
update to solidjs beta.21, router 0.17.0-next.6 and vite-plugin-solid…
ryansolid Jul 20, 2026
3d5a56e
update to solid 2.0.0-beta.22 and unskip non-latin1 server function e…
ryansolid Jul 22, 2026
51b7526
update to @solidjs/router 1.0.0-next.7 and adopt the createRouter fac…
ryansolid Jul 22, 2026
696db23
chore(deps): bump @solidjs/router to 1.0.0-next.8
ryansolid Jul 22, 2026
b1342c9
chore(deps): bump vite-plugin-solid to 3.0.0-next.15
ryansolid Jul 22, 2026
ab9a641
mark Vite experimental bundledDev as unsupported until vitejs/vite#22991
ryansolid Jul 22, 2026
2e71e3f
chore(deps): bump solid to 2.0.0-beta.25
ryansolid Jul 23, 2026
eca45be
chore(deps): bump vite-plugin-solid to 3.0.0-next.16
ryansolid Jul 23, 2026
1d5b70d
chore(deps): bump solid to 2.0.0-beta.26
ryansolid Jul 27, 2026
1d8ee74
refactor: rebase file-system routing onto filesystem-routing (#2227)
brenelz Jul 27, 2026
9ace2f5
log dev-manifest misses instead of silently returning null
ryansolid Jul 28, 2026
e3de655
chore(deps): bump solid to 2.0.0-beta.28 and router to 2.0.0-next.12
ryansolid Jul 29, 2026
9e4d5fe
chore(deps): bump vite-plugin-solid to 3.0.0-next.18
ryansolid Jul 29, 2026
7e85af7
Merge branch 'main' into upgrade-to-solid-2-beta
brenelz Jul 29, 2026
93c48bc
wire the dev toolbar's server-function inspector into the new transport
brenelz Jul 29, 2026
682b7f7
capture router-initiated server-function calls in the dev toolbar
brenelz Jul 29, 2026
1683d09
encode non-JSON-safe server function arguments
brenelz Jul 29, 2026
dc76738
Merge remote-tracking branch 'origin/upgrade-to-solid-2-beta'
brenelz Jul 29, 2026
95cd6a6
fix CI: v2 router API migration, formatting, and onError seam
brenelz Jul 29, 2026
f1be731
chore: remove dead code and unused dependencies from packages/start
ryansolid Jul 29, 2026
064b0d6
refactor: drop the dev-manifest bridge and boundary modules, now owne…
ryansolid Jul 29, 2026
34dc658
chore(deps): bump vite-plugin-solid to 3.0.0-next.19
ryansolid Jul 29, 2026
6839776
fix: keep client assets in .output/public when composed with nitro
ryansolid Jul 29, 2026
a0ebc40
chore(deps): bump vite-plugin-solid to 3.0.0-next.20
ryansolid Jul 29, 2026
7b85848
revert: drop the client-build-first hook filter, fixed upstream in vi…
ryansolid Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/quick-pandas-build.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@solidjs/start": patch
---

Fix production builds shipping without client assets (and 500ing from a manifest-less server fallback) when composed with nitro, by bumping vite-plugin-solid to 3.0.0-next.20: its client-build-first `buildApp` hooks now run at normal order and defer to nitro's orchestrator instead of building the client before nitro's pre-order hook wipes `.output/`. A temporary workaround that filtered those hooks out of the solid() plugin set has been removed.
18 changes: 18 additions & 0 deletions .changeset/router-1-0-file-routes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
"@solidjs/start": patch
---

Migrate to `@solidjs/router` 1.0.0-next.7, which removes the component API in favor of the `createRouter` factory. `@solidjs/start/router` now exports the file-system route tree as a value — `fileRoutes` — instead of the `FileRoutes` component (there is no JSX children slot to mount it in anymore); apps pass it straight to the factory:

```tsx
import { createRouter } from "@solidjs/router";
import { fileRoutes } from "@solidjs/start/router";

const Router = createRouter({ routes: fileRoutes });

export default function App() {
return <Router>{props => <Loading>{props.children}</Loading>}</Router>;
}
```

Routes are immutable per router instance, so one shared tree serves every request and mount: `PageEvent.routes` (and the per-request tree build in `createPageEvent`) is gone, and the single-flight collector consumes `fileRoutes` directly. The old `root` prop becomes the render-prop child and `rootPreload` becomes the factory's `preload` option; active-link styling moves from the removed `<A>` component's `active` class to the router's anchor attribute vocabulary (`[data-active]`, `[aria-current="page"]`).
5 changes: 5 additions & 0 deletions .changeset/router-owns-single-flight-nojs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@solidjs/start": patch
---

Adopt the router's server-function integration: single-flight payload collection and the no-JS flash-cookie form convention are `@solidjs/router`'s now (its vocabulary — query cache keys, submissions — was always the payload). Start's `handleSingleFlight` (data-only app render), `createSingleFlightHeaders`, `handleNoJS`, and the flash-cookie SSR seeding are deleted; the server-function handler wires `createFlightDataCollector({ routes: createRoutes, base })` — the router's pure preload runner over the file-system route tree, no app render involved — and `createNoJSHandler({ base })` from `@solidjs/router/server` into the core handler hooks. Client-side single-flight opt-in is automatic: the router registers itself as the transport's flight-data consumer, so per-call `X-Single-Flight` headers are gone too.
3 changes: 2 additions & 1 deletion apps/fixtures/bare/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
},
"dependencies": {
"@solidjs/start": "workspace:*",
"@solidjs/web": "2.0.0-beta.28",
"nitro": "^3.0.260610-beta",
"solid-js": "^1.9.14",
"solid-js": "2.0.0-beta.28",
"vite": "^8.1.5"
},
"engines": {
Expand Down
2 changes: 1 addition & 1 deletion apps/fixtures/bare/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
"jsxImportSource": "@solidjs/web",
"allowJs": true,
"strict": true,
"noEmit": true,
Expand Down
7 changes: 4 additions & 3 deletions apps/fixtures/basic/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
"build": "vite build"
},
"dependencies": {
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^1.0.0",
"@solidjs/meta": "0.30.0-next.0",
"@solidjs/router": "2.0.0-next.12",
"@solidjs/start": "workspace:*",
"@solidjs/web": "2.0.0-beta.28",
"nitro": "^3.0.260610-beta",
"solid-js": "^1.9.14",
"solid-js": "2.0.0-beta.28",
"vite": "^8.1.5"
},
"engines": {
Expand Down
16 changes: 8 additions & 8 deletions apps/fixtures/basic/src/app.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import { MetaProvider, Title } from "@solidjs/meta";
import { Router } from "@solidjs/router";
import { FileRoutes } from "@solidjs/start/router";
import { Suspense } from "solid-js";
import { createRouter } from "@solidjs/router";
import { fileRoutes } from "@solidjs/start/router";
import { Loading } from "solid-js";
import "./app.css";

const Router = createRouter({ routes: fileRoutes });

export default function App() {
return (
<Router
root={props => (
<Router>
{props => (
<MetaProvider>
<Title>SolidStart - Basic</Title>
<a href="/">Index</a>
<a href="/about">About</a>
<Suspense>{props.children}</Suspense>
<Loading>{props.children}</Loading>
</MetaProvider>
)}
>
<FileRoutes />
</Router>
);
}
2 changes: 0 additions & 2 deletions apps/fixtures/basic/src/routes/[...404].tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import { Title } from "@solidjs/meta";
import { HttpStatusCode } from "@solidjs/start";

export default function NotFound() {
return (
<main>
<Title>Not Found</Title>
<HttpStatusCode code={404} />
<h1>Page Not Found</h1>
<p>
Expand Down
2 changes: 1 addition & 1 deletion apps/fixtures/basic/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
"jsxImportSource": "@solidjs/web",
"allowJs": true,
"strict": true,
"noEmit": true,
Expand Down
3 changes: 3 additions & 0 deletions apps/fixtures/basic/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ import { solidStart } from "../../../packages/start/src/config";

export default defineConfig({
plugins: [solidStart(), nitro()],
resolve: {
dedupe: ["solid-js", "@solidjs/web", "@solidjs/router"],
},
});
7 changes: 4 additions & 3 deletions apps/fixtures/css/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@
"start": "node .output/server/index.mjs"
},
"dependencies": {
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^1.0.0",
"@solidjs/meta": "0.30.0-next.0",
"@solidjs/router": "2.0.0-next.12",
"@solidjs/start": "workspace:*",
"@solidjs/web": "2.0.0-beta.28",
"nitro": "^3.0.260610-beta",
"solid-js": "^1.9.14",
"solid-js": "2.0.0-beta.28",
"vite": "^8.1.5"
},
"devDependencies": {
Expand Down
16 changes: 8 additions & 8 deletions apps/fixtures/css/src/app.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { MetaProvider, Title } from "@solidjs/meta";
import { Router } from "@solidjs/router";
import { FileRoutes } from "@solidjs/start/router";
import { Suspense } from "solid-js";
import { createRouter } from "@solidjs/router";
import { fileRoutes } from "@solidjs/start/router";
import { Loading } from "solid-js";
import "./app.css";

const Router = createRouter({ routes: fileRoutes });

export default function App() {
return (
<Router
root={props => (
<Router>
{props => (
<MetaProvider>
<Title>SolidStart - CSS Fixture</Title>
<div class="mx-auto max-w-5xl p-10 pt-3">
Expand All @@ -17,12 +19,10 @@ export default function App() {
<a href="/unstyled">Unstyled</a>
</header>

<Suspense>{props.children}</Suspense>
<Loading>{props.children}</Loading>
</div>
</MetaProvider>
)}
>
<FileRoutes />
</Router>
);
}
8 changes: 5 additions & 3 deletions apps/fixtures/css/src/components/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { createSignal, FlowProps, onMount } from "solid-js";
import { getRequestEvent } from "solid-js/web";
import { createSignal, FlowProps, onSettled } from "solid-js";
import { getRequestEvent } from "@solidjs/web";

const Badge = (props: FlowProps) => (
<div class="text-base text-white bg-gray-700 rounded-lg px-2 font-medium">{props.children}</div>
);

const Layout = (props: FlowProps<{ title: string }>) => {
const [mounted, setMounted] = createSignal(false);
onMount(() => setMounted(true));
onSettled(() => {
setMounted(true);
});

return (
<div class="flex gap-2 flex-col">
Expand Down
2 changes: 1 addition & 1 deletion apps/fixtures/css/src/components/test.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { JSX } from "solid-js";
import { JSX } from "@solidjs/web";

const clsx = (...args: (string | false | undefined)[]) => args.filter(Boolean).join(" ");

Expand Down
12 changes: 7 additions & 5 deletions apps/fixtures/css/src/routes/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createAsync, query } from "@solidjs/router";
import { lazy, Show } from "solid-js";
import { query } from "@solidjs/router";
import { createMemo, lazy, Show } from "solid-js";
import "virtual:virtualModule.css";
import Layout from "../components/layout";
import { CommonTests } from "../components/test";
Expand All @@ -12,8 +12,10 @@ const Lazy = lazy(() => import("../components/lazy"));
const LazyLink = lazy(() => import("../components/lazyLink"));
const LazyLinkTmp = lazy(() => import("../components/lazyLinkTmp"));

const entries = import.meta.glob("../components/lazyG*.tsx");
const LazyGlob = lazy(Object.values(entries)[0] as any);
const entries = import.meta.glob("/src/components/lazyG*.tsx");
// Solid 2 lazy() requires an explicit moduleUrl in SSR when the loader
// isn't a static dynamic import the bundler plugin can analyze.
const LazyGlob = lazy(Object.values(entries)[0] as any, Object.keys(entries)[0]!.slice(1));

const SharedChunk = lazy(() => import("../components/sharedChunk/lazy1"));
// Do not remove this.
Expand All @@ -27,7 +29,7 @@ const getData = query(async () => {
}, "data");

export default function Home() {
const data = createAsync(() => getData(), { deferStream: true });
const data = createMemo(() => getData(), { deferStream: true });

return (
<main>
Expand Down
2 changes: 1 addition & 1 deletion apps/fixtures/css/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
"jsxImportSource": "@solidjs/web",
"allowJs": true,
"strict": true,
"noEmit": true,
Expand Down
1 change: 0 additions & 1 deletion apps/fixtures/css/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ export default defineConfig({
/**
* Creates a shared chunk with two components. Needed for the "SharedChunk" test!
* The vite manifest behaves differently for such shared chunks.
* More info: packages/start/src/config/lazy.ts
*
* TODO: When switching to Rolldown, migrate this to advancedChunks
* https://vite.dev/guide/rolldown.html#manualchunks-to-advancedchunks
Expand Down
7 changes: 4 additions & 3 deletions apps/fixtures/experiments/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
"build": "vite build"
},
"dependencies": {
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^1.0.0",
"@solidjs/meta": "0.30.0-next.0",
"@solidjs/router": "2.0.0-next.12",
"@solidjs/start": "workspace:*",
"@solidjs/web": "2.0.0-beta.28",
"nitro": "^3.0.260610-beta",
"solid-js": "^1.9.14",
"solid-js": "2.0.0-beta.28",
"vite": "^8.1.5"
},
"engines": {
Expand Down
16 changes: 8 additions & 8 deletions apps/fixtures/experiments/src/app.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import { MetaProvider, Title } from "@solidjs/meta";
import { Router } from "@solidjs/router";
import { FileRoutes } from "@solidjs/start/router";
import { Suspense } from "solid-js";
import { createRouter } from "@solidjs/router";
import { fileRoutes } from "@solidjs/start/router";
import { Loading } from "solid-js";
import "./app.css";
import Provider from "./components/Provider";

const Router = createRouter({ routes: fileRoutes });

export default function App() {
return (
<Router
root={props => (
<Router>
{props => (
<MetaProvider>
<Provider initialCount={10}>
<Title>SolidStart - Bare</Title>
<a href="/">Index</a>
<a href="/about">About</a>
<Suspense>{props.children}</Suspense>
<Loading>{props.children}</Loading>
</Provider>
</MetaProvider>
)}
>
<FileRoutes />
</Router>
);
}
6 changes: 1 addition & 5 deletions apps/fixtures/experiments/src/components/Provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,5 @@ import { createSignal } from "solid-js";
import counterContext from "./counterContext";

export default function Provider(props) {
return (
<counterContext.Provider value={createSignal(props.initialCount)}>
{props.children}
</counterContext.Provider>
);
return <counterContext value={createSignal(props.initialCount)}>{props.children}</counterContext>;
}
5 changes: 2 additions & 3 deletions apps/fixtures/experiments/src/routes/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { Title } from "@solidjs/meta";
import { json } from "@solidjs/router";
import { clientOnly, GET } from "@solidjs/start";
import { getServerFunctionMeta } from "@solidjs/start/server";
import { getRequestEvent, isServer } from "solid-js/web";
import { getRequestEvent, isServer, respond } from "@solidjs/web";
import Counter from "~/components/Counter";
const BreaksOnServer = clientOnly(() => import("~/components/BreaksOnServer"));

Expand All @@ -11,7 +10,7 @@ const hello = GET(async (name: string) => {
const e = getRequestEvent()!;
const { id } = getServerFunctionMeta()!;
console.log("ID", id, e.locals.foo);
return json(
return respond(
{ hello: new Promise<string>(r => setTimeout(() => r(name), 1000)) },
{ headers: { "cache-control": "max-age=60" } },
);
Expand Down
2 changes: 1 addition & 1 deletion apps/fixtures/experiments/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
"jsxImportSource": "@solidjs/web",
"allowJs": true,
"strict": true,
"noEmit": true,
Expand Down
5 changes: 3 additions & 2 deletions apps/fixtures/hackernews/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
"build": "vite build"
},
"dependencies": {
"@solidjs/router": "^1.0.0",
"@solidjs/router": "2.0.0-next.12",
"@solidjs/start": "workspace:*",
"solid-js": "^1.9.14",
"@solidjs/web": "2.0.0-beta.28",
"solid-js": "2.0.0-beta.28",
"vite": "^8.1.5"
},
"engines": {
Expand Down
4 changes: 3 additions & 1 deletion apps/fixtures/hackernews/src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ a {
color: #fff;
}

.header a.active {
/* Router 1.0 marks exact-or-prefix matched anchors with `data-active`
(the root path only ever matches exactly, so "/" doesn't stay lit). */
.header a[data-active] {
color: #fff;
font-weight: 400;
}
Expand Down
18 changes: 8 additions & 10 deletions apps/fixtures/hackernews/src/app.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
import { Router } from "@solidjs/router";
import { FileRoutes } from "@solidjs/start/router";
import { Suspense } from "solid-js";
import { createRouter } from "@solidjs/router";
import { fileRoutes } from "@solidjs/start/router";
import { Loading } from "solid-js";
import "./app.css";
import Nav from "./components/nav";

const Router = createRouter({ routes: fileRoutes });

export default function App() {
return (
<Router
root={props => (
<Router>
{props => (
<>
<Nav />
<Suspense fallback={<div class="news-list-nav">Loading...</div>}>
{props.children}
</Suspense>
<Loading fallback={<div class="news-list-nav">Loading...</div>}>{props.children}</Loading>
</>
)}
>
<FileRoutes />
</Router>
);
}
Loading