From d64758f6deb2cc605b2c459fe98624de36a800bb Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 21:08:19 +0100 Subject: [PATCH 01/12] vite 8 compat manifest plugin --- packages/start/src/config/manifest.ts | 45 +++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/start/src/config/manifest.ts b/packages/start/src/config/manifest.ts index 093cc7209..58a88b9e8 100644 --- a/packages/start/src/config/manifest.ts +++ b/packages/start/src/config/manifest.ts @@ -40,9 +40,48 @@ export function manifest(start: SolidStartOptions): PluginOption { v => "isEntry" in v && v.isEntry, ); if (!entry) throw new Error("No client entry found"); - clientViteManifest = JSON.parse( - (globalThis.START_CLIENT_BUNDLE[".vite/manifest.json"] as any).source, - ); + let viteStrVersion = (devServer?.config?.logger as any)?.config?.version; + if (!viteStrVersion) { + try { + viteStrVersion = await import("vite").then(m => m.version); + } catch (e) { + // ignore + } + } + + let rawManifest: string | undefined; + + const viteMajor = parseInt(viteStrVersion!.split('.')[0], 10); + + const manifestKey = Object.keys(globalThis.START_CLIENT_BUNDLE).find(k => k.endsWith("manifest.json")); + if (manifestKey && viteMajor < 8) { + const manifestAsset = globalThis.START_CLIENT_BUNDLE[manifestKey] as any; + if (manifestAsset.type === "asset") { + rawManifest = manifestAsset.source as string; + } else if (manifestAsset.type === "chunk") { + rawManifest = manifestAsset.code as string; + } else if (typeof manifestAsset === "string") { + rawManifest = manifestAsset; + } else { + rawManifest = manifestAsset.source || manifestAsset.code || JSON.stringify(manifestAsset); + } + } else { + const fs = await import("node:fs"); + const path = await import("node:path"); + try { + const appRoot = (start as any).appRoot || "./src"; + const manifestPath = path.resolve(appRoot, "..", ".solid-start/client/.vite/manifest.json"); + rawManifest = fs.readFileSync(manifestPath, "utf-8"); + } catch (e) { + throw new Error(`Manifest asset not found in bundle and could not be read from disk. Keys: ${Object.keys(globalThis.START_CLIENT_BUNDLE).join(", ")}. Error: ${e}`); + } + } + + if (!rawManifest) { + throw new Error("Failed to extract or read raw manifest."); + } + + clientViteManifest = JSON.parse(rawManifest); } return `export const clientViteManifest = ${JSON.stringify(clientViteManifest)};`; } else if (id === `\0${VIRTUAL_MODULES.middleware}`) return "export default {};"; From 6985e157b0b857804bcb313deecda0214819c17d Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 21:23:02 +0100 Subject: [PATCH 02/12] changeset --- .changeset/vite-ecosystem-ci-bump.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/vite-ecosystem-ci-bump.md diff --git a/.changeset/vite-ecosystem-ci-bump.md b/.changeset/vite-ecosystem-ci-bump.md new file mode 100644 index 000000000..0e02ea71c --- /dev/null +++ b/.changeset/vite-ecosystem-ci-bump.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": patch +--- + +Add vite-ecosystem-ci scripts and support Vite 8 asset manifest loading From 7bdee5962325534830b4e7a74e7eb20e287a1f6d Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 21:59:31 +0100 Subject: [PATCH 03/12] only check source for vite 7 manifest --- packages/start/src/config/manifest.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/start/src/config/manifest.ts b/packages/start/src/config/manifest.ts index 58a88b9e8..209c91dbd 100644 --- a/packages/start/src/config/manifest.ts +++ b/packages/start/src/config/manifest.ts @@ -56,15 +56,7 @@ export function manifest(start: SolidStartOptions): PluginOption { const manifestKey = Object.keys(globalThis.START_CLIENT_BUNDLE).find(k => k.endsWith("manifest.json")); if (manifestKey && viteMajor < 8) { const manifestAsset = globalThis.START_CLIENT_BUNDLE[manifestKey] as any; - if (manifestAsset.type === "asset") { - rawManifest = manifestAsset.source as string; - } else if (manifestAsset.type === "chunk") { - rawManifest = manifestAsset.code as string; - } else if (typeof manifestAsset === "string") { - rawManifest = manifestAsset; - } else { - rawManifest = manifestAsset.source || manifestAsset.code || JSON.stringify(manifestAsset); - } + rawManifest = manifestAsset.source as string; } else { const fs = await import("node:fs"); const path = await import("node:path"); From 800cf365c1d32aeaead2f49df89ed88a29d15e84 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 23:23:53 +0100 Subject: [PATCH 04/12] vite 8 compat --- .changeset/vite-ecosystem-ci-bump.md | 4 ++-- package.json | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.changeset/vite-ecosystem-ci-bump.md b/.changeset/vite-ecosystem-ci-bump.md index 0e02ea71c..743534212 100644 --- a/.changeset/vite-ecosystem-ci-bump.md +++ b/.changeset/vite-ecosystem-ci-bump.md @@ -1,5 +1,5 @@ --- -"@solidjs/start": patch +"@solidjs/start": minor --- -Add vite-ecosystem-ci scripts and support Vite 8 asset manifest loading +Add support for Vite 8 asset manifest loading diff --git a/package.json b/package.json index 37c783179..15552f655 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,7 @@ "clean:test": "pnpx rimraf .tmp", "release": "pnpm build && changeset publish", "format": "pnpm oxfmt", - "rewrite-exports": "pnpm --filter='./packages/*' -c exec \"echo \\$(cat package.json | jq '.exports = .publishConfig.exports') > package.json\"", - "vite-ecosystem-ci:build": "pnpm run build:all && pnpm --filter fixture-nitro-3 build", - "vite-ecosystem-ci:before-test": "pnpm --filter tests exec playwright install chromium", - "vite-ecosystem-ci:test": "pnpm --filter tests run test:all" + "rewrite-exports": "pnpm --filter='./packages/*' -c exec \"echo \\$(cat package.json | jq '.exports = .publishConfig.exports') > package.json\"" }, "devDependencies": { "@changesets/cli": "^2.29.8", From b32d94d9fc643a0fe8a7a85357cb5040a11ccb64 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 23:29:46 +0100 Subject: [PATCH 05/12] don't incl playwright --- apps/tests/playwright.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/tests/playwright.config.ts b/apps/tests/playwright.config.ts index 2625f3613..8db7460dc 100644 --- a/apps/tests/playwright.config.ts +++ b/apps/tests/playwright.config.ts @@ -5,15 +5,15 @@ export default defineConfig({ testMatch: "**/*.test.ts", webServer: { - command: "pnpm run dev --host 127.0.0.1 --port 3000 --strictPort", - url: "http://127.0.0.1:3000", + command: "pnpm run dev", + url: "http://localhost:3000", reuseExistingServer: true, stdout: "pipe", stderr: "pipe", }, use: { - baseURL: "http://127.0.0.1:3000", + baseURL: "http://localhost:3000", trace: "on-first-retry", }, From 20a79e75a13f0a0c062494d4abc88bf103c14798 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 23:38:30 +0100 Subject: [PATCH 06/12] changset --- .changeset/vite-ecosystem-ci-bump.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/vite-ecosystem-ci-bump.md b/.changeset/vite-ecosystem-ci-bump.md index 743534212..c5136010f 100644 --- a/.changeset/vite-ecosystem-ci-bump.md +++ b/.changeset/vite-ecosystem-ci-bump.md @@ -1,5 +1,5 @@ --- -"@solidjs/start": minor +"@solidjs/start": patch --- Add support for Vite 8 asset manifest loading From 613985f998ae8e268bbcc85408938b6642e7cef4 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Mon, 23 Feb 2026 00:06:59 +0100 Subject: [PATCH 07/12] fix jsx build error --- packages/start/src/config/index.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/start/src/config/index.ts b/packages/start/src/config/index.ts index b8cf5bf58..8e883c3b1 100644 --- a/packages/start/src/config/index.ts +++ b/packages/start/src/config/index.ts @@ -91,6 +91,16 @@ export function solidStart(options?: SolidStartOptions): Array { return { appType: "custom", build: { assetsDir: "_build/assets" }, + optimizeDeps: { + // Suppress TS errors from Vite 7 types when configuring Vite 8's Rolldown + ...({ + rolldownOptions: { + transform: { + jsx: "react", + }, + }, + } as any), + }, environments: { [VITE_ENVIRONMENTS.client]: { consumer: "client", From b0ffe95e4cd12839783c88de3d12a77edb595fd1 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Mon, 23 Feb 2026 00:08:28 +0100 Subject: [PATCH 08/12] dynamic manifest path --- packages/start/src/config/index.ts | 3 ++- packages/start/src/config/manifest.ts | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/start/src/config/index.ts b/packages/start/src/config/index.ts index 8e883c3b1..19cee234c 100644 --- a/packages/start/src/config/index.ts +++ b/packages/start/src/config/index.ts @@ -243,8 +243,9 @@ export function solidStart(options?: SolidStartOptions): Array { { name: "solid-start:capture-client-bundle", enforce: "post", - generateBundle(_options, bundle) { + generateBundle(options, bundle) { globalThis.START_CLIENT_BUNDLE = bundle; + (globalThis as any).START_CLIENT_OUT_DIR = options.dir; }, }, devServer(), diff --git a/packages/start/src/config/manifest.ts b/packages/start/src/config/manifest.ts index 209c91dbd..b2997a805 100644 --- a/packages/start/src/config/manifest.ts +++ b/packages/start/src/config/manifest.ts @@ -62,7 +62,15 @@ export function manifest(start: SolidStartOptions): PluginOption { const path = await import("node:path"); try { const appRoot = (start as any).appRoot || "./src"; - const manifestPath = path.resolve(appRoot, "..", ".solid-start/client/.vite/manifest.json"); + let outDir = ".solid-start/client"; + if (devServer?.environments?.client?.config?.build?.outDir) { + outDir = devServer.environments.client.config.build.outDir; + } else if (this.environment?.config?.build?.outDir && this.environment?.config?.consumer === "client") { + outDir = this.environment.config.build.outDir; + } else if ((globalThis as any).START_CLIENT_OUT_DIR) { + outDir = (globalThis as any).START_CLIENT_OUT_DIR; + } + const manifestPath = path.resolve(appRoot, "..", outDir, ".vite/manifest.json"); rawManifest = fs.readFileSync(manifestPath, "utf-8"); } catch (e) { throw new Error(`Manifest asset not found in bundle and could not be read from disk. Keys: ${Object.keys(globalThis.START_CLIENT_BUNDLE).join(", ")}. Error: ${e}`); From 02eb822314b4c77d266a83fbba626040d545a8f9 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Mon, 23 Feb 2026 00:50:23 +0100 Subject: [PATCH 09/12] fix nitro preview --- packages/start/src/config/fs-routes/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/start/src/config/fs-routes/index.ts b/packages/start/src/config/fs-routes/index.ts index 272f7abaa..80f9ecb1a 100644 --- a/packages/start/src/config/fs-routes/index.ts +++ b/packages/start/src/config/fs-routes/index.ts @@ -55,8 +55,8 @@ export function fsRoutes({ routers }: FsRoutesArgs): Array { const buildId = `${v.src}?${v.pick.map((p: any) => `pick=${p}`).join("&")}`; return { src: relative(root, buildId), - build: isBuild ? `_$() => import(/* @vite-ignore */ '${buildId}')$_` : undefined, - import: `_$() => import(/* @vite-ignore */ '${buildId}')$_`, + build: isBuild ? `_$() => import('${buildId}')$_` : undefined, + import: `_$() => import('${buildId}')$_`, }; } return v; From 43f09f0585905e4e3cc7375f6302809d8209637f Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 27 Feb 2026 07:53:08 +0100 Subject: [PATCH 10/12] revert packge.json --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 15552f655..37c783179 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,10 @@ "clean:test": "pnpx rimraf .tmp", "release": "pnpm build && changeset publish", "format": "pnpm oxfmt", - "rewrite-exports": "pnpm --filter='./packages/*' -c exec \"echo \\$(cat package.json | jq '.exports = .publishConfig.exports') > package.json\"" + "rewrite-exports": "pnpm --filter='./packages/*' -c exec \"echo \\$(cat package.json | jq '.exports = .publishConfig.exports') > package.json\"", + "vite-ecosystem-ci:build": "pnpm run build:all && pnpm --filter fixture-nitro-3 build", + "vite-ecosystem-ci:before-test": "pnpm --filter tests exec playwright install chromium", + "vite-ecosystem-ci:test": "pnpm --filter tests run test:all" }, "devDependencies": { "@changesets/cli": "^2.29.8", From f9cf109c06f8ad497780b5ef35f8ec18ddffd274 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 27 Feb 2026 07:53:35 +0100 Subject: [PATCH 11/12] changeset --- .changeset/{vite-ecosystem-ci-bump.md => vite-8-compat.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .changeset/{vite-ecosystem-ci-bump.md => vite-8-compat.md} (100%) diff --git a/.changeset/vite-ecosystem-ci-bump.md b/.changeset/vite-8-compat.md similarity index 100% rename from .changeset/vite-ecosystem-ci-bump.md rename to .changeset/vite-8-compat.md From 0b0466ba9c1f895db37c2239ebae2cd368470ea0 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 27 Feb 2026 07:54:13 +0100 Subject: [PATCH 12/12] reset playwright --- apps/tests/playwright.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/tests/playwright.config.ts b/apps/tests/playwright.config.ts index 8db7460dc..2625f3613 100644 --- a/apps/tests/playwright.config.ts +++ b/apps/tests/playwright.config.ts @@ -5,15 +5,15 @@ export default defineConfig({ testMatch: "**/*.test.ts", webServer: { - command: "pnpm run dev", - url: "http://localhost:3000", + command: "pnpm run dev --host 127.0.0.1 --port 3000 --strictPort", + url: "http://127.0.0.1:3000", reuseExistingServer: true, stdout: "pipe", stderr: "pipe", }, use: { - baseURL: "http://localhost:3000", + baseURL: "http://127.0.0.1:3000", trace: "on-first-retry", },