diff --git a/.changeset/vite-ecosystem-ci-bump.md b/.changeset/vite-ecosystem-ci-bump.md new file mode 100644 index 000000000..c5136010f --- /dev/null +++ b/.changeset/vite-ecosystem-ci-bump.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": patch +--- + +Add support for Vite 8 asset manifest loading 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; diff --git a/packages/start/src/config/index.ts b/packages/start/src/config/index.ts index 4b1c82179..aa693613c 100644 --- a/packages/start/src/config/index.ts +++ b/packages/start/src/config/index.ts @@ -80,6 +80,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", @@ -221,8 +231,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 093cc7209..b2997a805 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; + 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"; + 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}`); + } + } + + 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 {};";