From cb0f429a80067e8ff2a95cdee8a78fed9b52366d Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 20:53:35 +0100 Subject: [PATCH 1/7] add vite-ecosystem-ci scripts --- apps/tests/playwright.config.ts | 6 +++--- package.json | 5 ++++- 2 files changed, 7 insertions(+), 4 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", }, diff --git a/package.json b/package.json index 15552f655..5963d0133 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", + "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 cb5b48e05847b2c243d154c913042aa9a004332d Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 21:08:19 +0100 Subject: [PATCH 2/7] 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 bef551345ee98a9d23c814562aab3b52380d92a8 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 21:23:02 +0100 Subject: [PATCH 3/7] 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 9d53972c0a7035fea63706b04fc8cbec38e9721a Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 21:37:51 +0100 Subject: [PATCH 4/7] check fixture-nitro-3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5963d0133..37c783179 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "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", + "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" }, From 9af04de896ce2aac14c80c930d84f97bff612558 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 21:59:31 +0100 Subject: [PATCH 5/7] 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 6ec41881effecd01dee4862817d81a9808a66927 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 23:25:41 +0100 Subject: [PATCH 6/7] remove changeset --- .changeset/vite-ecosystem-ci-bump.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/vite-ecosystem-ci-bump.md diff --git a/.changeset/vite-ecosystem-ci-bump.md b/.changeset/vite-ecosystem-ci-bump.md deleted file mode 100644 index 0e02ea71c..000000000 --- a/.changeset/vite-ecosystem-ci-bump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@solidjs/start": patch ---- - -Add vite-ecosystem-ci scripts and support Vite 8 asset manifest loading From d77710da58e49bb0523127caea5328e823885da5 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 22 Feb 2026 23:26:39 +0100 Subject: [PATCH 7/7] revert manifest --- packages/start/src/config/manifest.ts | 37 +++------------------------ 1 file changed, 3 insertions(+), 34 deletions(-) diff --git a/packages/start/src/config/manifest.ts b/packages/start/src/config/manifest.ts index 209c91dbd..093cc7209 100644 --- a/packages/start/src/config/manifest.ts +++ b/packages/start/src/config/manifest.ts @@ -40,40 +40,9 @@ export function manifest(start: SolidStartOptions): PluginOption { v => "isEntry" in v && v.isEntry, ); if (!entry) throw new Error("No client entry found"); - 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; - rawManifest = manifestAsset.source as string; - } 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); + clientViteManifest = JSON.parse( + (globalThis.START_CLIENT_BUNDLE[".vite/manifest.json"] as any).source, + ); } return `export const clientViteManifest = ${JSON.stringify(clientViteManifest)};`; } else if (id === `\0${VIRTUAL_MODULES.middleware}`) return "export default {};";