diff --git a/package.json b/package.json index a76219820..0a5e50140 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "tsup": "^8.1.0", "tsx": "^4.16.2", "typescript": "^5.5.4", - "vite": "^5.3.3", + "vite": "6.0.0-alpha.19", "vitest": "^2.0.1", "wrangler": "^3.72.2" }, diff --git a/packages/react-server/examples/basic/e2e/basic.test.ts b/packages/react-server/examples/basic/e2e/basic.test.ts index 14dbde76c..5f59c18a0 100644 --- a/packages/react-server/examples/basic/e2e/basic.test.ts +++ b/packages/react-server/examples/basic/e2e/basic.test.ts @@ -367,7 +367,7 @@ test("rsc + client + rsc hmr @dev", async ({ page }) => { await waitForHydration(page); }); -test("module invalidation @dev", async ({ page }) => { +test.skip("module invalidation @dev", async ({ page }) => { checkNoError(page); await page.goto("/test"); diff --git a/packages/vite-node-miniflare/examples/basic/vite.config.ts b/packages/vite-node-miniflare/examples/basic/vite.config.ts index 74c437143..5ed0dc05c 100644 --- a/packages/vite-node-miniflare/examples/basic/vite.config.ts +++ b/packages/vite-node-miniflare/examples/basic/vite.config.ts @@ -1,6 +1,6 @@ import fs from "node:fs"; import { tinyReactVitePlugin } from "@hiogawa/tiny-react/dist/plugins/vite"; -import { vitePluginViteNodeMiniflare } from "@hiogawa/vite-node-miniflare"; +import { vitePluginWorkerd } from "@hiogawa/vite-node-miniflare"; import { vitePluginSimpleHmr } from "@hiogawa/vite-plugin-simple-hmr"; import { Log } from "miniflare"; import { type Plugin, type ViteDevServer, defineConfig } from "vite"; @@ -8,24 +8,27 @@ import { type Plugin, type ViteDevServer, defineConfig } from "vite"; export default defineConfig({ clearScreen: false, appType: "custom", - ssr: { - noExternal: true, - }, plugins: [ vitePluginSimpleHmr({ include: new URL("./src/**/*.tsx", import.meta.url).pathname, }), - vitePluginViteNodeMiniflare({ - debug: true, - hmr: true, - entry: "/src/worker-entry.ts", - miniflareOptions(options) { - options.log = new Log(); + vitePluginWorkerd({ + entry: "/src/worker-entry", + miniflare: { + log: new Log(), }, }), tinyReactVitePlugin(), vitePluginVirtualIndexHtml(), ], + environments: { + workerd: { + webCompatible: true, + resolve: { + noExternal: true, + }, + }, + }, }); export function vitePluginVirtualIndexHtml(): Plugin { diff --git a/packages/vite-node-miniflare/examples/react-router/vite.config.ts b/packages/vite-node-miniflare/examples/react-router/vite.config.ts index c90c08b3c..e13f86f05 100644 --- a/packages/vite-node-miniflare/examples/react-router/vite.config.ts +++ b/packages/vite-node-miniflare/examples/react-router/vite.config.ts @@ -1,5 +1,5 @@ import globRoutesPlugin from "@hiogawa/vite-glob-routes"; -import { vitePluginViteNodeMiniflare } from "@hiogawa/vite-node-miniflare"; +import { vitePluginWorkerd } from "@hiogawa/vite-node-miniflare"; import react from "@vitejs/plugin-react"; import { Log } from "miniflare"; import { defineConfig } from "vite"; @@ -7,30 +7,36 @@ import { vitePluginVirtualIndexHtml } from "../basic/vite.config"; export default defineConfig({ clearScreen: false, - ssr: { - resolve: { - conditions: ["workerd"], - }, - optimizeDeps: { - include: [ - "react", - "react/jsx-dev-runtime", - "react-dom", - "react-dom/server", - ], - }, - }, + appType: "custom", plugins: [ + react(), globRoutesPlugin({ root: "/src/routes" }), - vitePluginViteNodeMiniflare({ - debug: true, - entry: "/src/server/worker-entry.ts", - miniflareOptions(options) { - options.log = new Log(); - options.compatibilityFlags = ["nodejs_compat"]; + vitePluginWorkerd({ + entry: "/src/server/worker-entry", + miniflare: { + log: new Log(), + compatibilityFlags: ["nodejs_compat"], }, }), - react(), vitePluginVirtualIndexHtml(), ], + environments: { + workerd: { + webCompatible: true, + resolve: { + noExternal: true, + conditions: ["workerd"], + }, + dev: { + optimizeDeps: { + include: [ + "react", + "react/jsx-dev-runtime", + "react-dom", + "react-dom/server", + ], + }, + }, + }, + }, }); diff --git a/packages/vite-node-miniflare/examples/react/vite.config.ts b/packages/vite-node-miniflare/examples/react/vite.config.ts index 9cb465ed6..c28474e75 100644 --- a/packages/vite-node-miniflare/examples/react/vite.config.ts +++ b/packages/vite-node-miniflare/examples/react/vite.config.ts @@ -1,4 +1,4 @@ -import { vitePluginViteNodeMiniflare } from "@hiogawa/vite-node-miniflare"; +import { vitePluginWorkerd } from "@hiogawa/vite-node-miniflare"; import react from "@vitejs/plugin-react"; import { Log } from "miniflare"; import { defineConfig } from "vite"; @@ -6,28 +6,34 @@ import { vitePluginVirtualIndexHtml } from "../basic/vite.config"; export default defineConfig({ clearScreen: false, - optimizeDeps: { - // for debugging - // DEBUG=vite:deps pnpm -C examples/react dev - // force: true, - }, - ssr: { - resolve: { - conditions: ["workerd"], - }, - optimizeDeps: { - include: ["react", "react/jsx-dev-runtime", "react-dom/server"], - }, - }, + appType: "custom", plugins: [ - vitePluginViteNodeMiniflare({ - debug: true, - entry: "/src/worker-entry.tsx", - miniflareOptions(options) { - options.log = new Log(); + react(), + vitePluginWorkerd({ + entry: "/src/worker-entry", + miniflare: { + log: new Log(), }, }), - react(), vitePluginVirtualIndexHtml(), ], + environments: { + workerd: { + webCompatible: true, + resolve: { + noExternal: true, + conditions: ["workerd"], + }, + dev: { + optimizeDeps: { + include: [ + "react", + "react/jsx-runtime", + "react/jsx-dev-runtime", + "react-dom/server", + ], + }, + }, + }, + }, }); diff --git a/packages/vite-node-miniflare/examples/remix/.gitignore b/packages/vite-node-miniflare/examples/remix/.gitignore index 796b96d1c..2107070b7 100644 --- a/packages/vite-node-miniflare/examples/remix/.gitignore +++ b/packages/vite-node-miniflare/examples/remix/.gitignore @@ -1 +1,2 @@ /build +.mf diff --git a/packages/vite-node-miniflare/examples/remix/package.json b/packages/vite-node-miniflare/examples/remix/package.json index 847b34fa0..62b51595a 100644 --- a/packages/vite-node-miniflare/examples/remix/package.json +++ b/packages/vite-node-miniflare/examples/remix/package.json @@ -19,6 +19,7 @@ "@hiogawa/vite-node-miniflare": "workspace:*", "@remix-run/dev": "2.8.1", "@types/react": "latest", - "@types/react-dom": "latest" + "@types/react-dom": "latest", + "wrangler": "^3.72.2" } } diff --git a/packages/vite-node-miniflare/examples/remix/vite.config.ts b/packages/vite-node-miniflare/examples/remix/vite.config.ts index f7cc84037..13608218c 100644 --- a/packages/vite-node-miniflare/examples/remix/vite.config.ts +++ b/packages/vite-node-miniflare/examples/remix/vite.config.ts @@ -1,33 +1,19 @@ -import { vitePluginViteNodeMiniflare } from "@hiogawa/vite-node-miniflare"; +import { vitePluginWorkerd } from "@hiogawa/vite-node-miniflare"; import { vitePlugin as remix } from "@remix-run/dev"; import { Log, Response as MiniflareResponse } from "miniflare"; import { defineConfig } from "vite"; +import { vitePluginVirtualIndexHtml } from "../basic/vite.config"; export default defineConfig({ clearScreen: false, - ssr: { - resolve: { - conditions: ["workerd"], - }, - optimizeDeps: { - include: [ - "react", - "react/jsx-dev-runtime", - "react-dom", - "react-dom/server", - "@remix-run/server-runtime", - ], - }, - }, plugins: [ - vitePluginViteNodeMiniflare({ - debug: true, - entry: "/app/worker-entry.ts", - miniflareOptions(options) { - options.log = new Log(); - options.kvNamespaces = { kv: "0".repeat(32) }; - options.kvPersist = ".wrangler/state/v3/kv"; - options.serviceBindings = { + // TODO: how to avoid spawning this for remix child compiler + vitePluginWorkerd({ + entry: "/app/worker-entry", + miniflare: { + log: new Log(), + kvPersist: true, + serviceBindings: { // DevServerHook is implemented via serviceBindings based rpc // https://github.com/remix-run/remix/blob/db4471d2e32a175abdcb907b877f9a510c735d8b/packages/remix-server-runtime/dev.ts#L37-L48 __remixGetCriticalCss: async (request) => { @@ -37,9 +23,33 @@ export default defineConfig({ ].getCriticalCss(...args); return new MiniflareResponse(JSON.stringify({ result })); }, - }; + }, + }, + wrangler: { + configPath: "./wrangler.toml", }, }), + vitePluginVirtualIndexHtml(), remix(), ], + environments: { + workerd: { + webCompatible: true, + resolve: { + noExternal: true, + conditions: ["workerd"], + }, + dev: { + optimizeDeps: { + include: [ + "react", + "react/jsx-dev-runtime", + "react-dom", + "react-dom/server", + "@remix-run/server-runtime", + ], + }, + }, + }, + }, }); diff --git a/packages/vite-node-miniflare/examples/remix/wrangler.toml b/packages/vite-node-miniflare/examples/remix/wrangler.toml new file mode 100644 index 000000000..681468d39 --- /dev/null +++ b/packages/vite-node-miniflare/examples/remix/wrangler.toml @@ -0,0 +1,5 @@ +compatibility_date = "2024-01-01" +compatibility_flags = ["nodejs_compat"] +kv_namespaces = [ + { binding = "kv", id = "test-namespace" } +] diff --git a/packages/vite-node-miniflare/package.json b/packages/vite-node-miniflare/package.json index d3e03df6b..87ab4de9d 100644 --- a/packages/vite-node-miniflare/package.json +++ b/packages/vite-node-miniflare/package.json @@ -22,18 +22,23 @@ "scripts": { "dev": "tsup --watch", "build": "tsup", - "prepack": "tsup --clean", - "release": "pnpm publish --no-git-checks --access public" - }, - "dependencies": { - "@hattip/adapter-node": "^0.0.44", - "@hattip/compose": "^0.0.44", - "miniflare": "^3.20240821.0" + "prepack": "tsup --clean" }, + "dependencies": {}, "devDependencies": { - "@hiogawa/tiny-rpc": "0.2.3-pre.18" + "@cloudflare/workers-types": "^4.20240821.1", + "@hiogawa/utils-node": "^0.0.2", + "miniflare": "^3.20240821.0", + "wrangler": "^3.72.2" }, "peerDependencies": { - "vite": "*" + "miniflare": "*", + "vite": "*", + "wrangler": "*" + }, + "peerDependenciesMeta": { + "wrangler": { + "optional": true + } } } diff --git a/packages/vite-node-miniflare/src/client/worker-entry.ts b/packages/vite-node-miniflare/src/client/worker-entry.ts deleted file mode 100644 index 2819b88b6..000000000 --- a/packages/vite-node-miniflare/src/client/worker-entry.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { - exposeTinyRpc, - httpClientAdapter, - httpServerAdapter, - proxyTinyRpc, -} from "@hiogawa/tiny-rpc"; -import { once } from "@hiogawa/utils"; -import type { HMRPayload } from "vite"; -import { ViteRuntime } from "vite/runtime"; -import type { ClientRpc, ServerRpc } from "../server/plugin"; -import { CLIENT_RPC_PATH, SERVER_RPC_PATH } from "../shared"; - -interface Env { - __UNSAFE_EVAL: any; - __VITE_NODE_SERVER_RPC_URL: string; - __VITE_NODE_DEBUG: boolean; - __VITE_RUNTIME_ROOT: string; - __VITE_RUNTIME_HMR: boolean; - __WORKER_ENTRY: string; - __WORKER_NODE_BUILTINS: string[]; -} - -export default { - async fetch(request: Request, env: Env, ctx: unknown) { - try { - const fetchHandler = await createFetchHandlerOnce({ - workerEntry: env.__WORKER_ENTRY, - baseUrl: new URL(request.url).origin, - unsafeEval: env.__UNSAFE_EVAL, - root: env.__VITE_RUNTIME_ROOT, - debug: env.__VITE_NODE_DEBUG, - hmr: env.__VITE_RUNTIME_HMR, - allowedExternals: env.__WORKER_NODE_BUILTINS, - }); - return await fetchHandler(request, env, ctx); - } catch (e) { - console.error(e); - let body = "[vite-node-miniflare error]\n"; - if (e instanceof Error) { - body += `${e.stack ?? e.message}`; - } - return new Response(body, { status: 500 }); - } - }, -}; - -type FetchHandler = ( - request: Request, - env: Env, - ctx: unknown, -) => Promise; - -const createFetchHandlerOnce = once(createFetchHandler); - -async function createFetchHandler(options: { - workerEntry: string; - baseUrl: string; - unsafeEval: any; - root: string; - debug: boolean; - hmr: boolean; - allowedExternals: string[]; -}) { - // ServerRpc proxy - const serverRpc = proxyTinyRpc({ - adapter: httpClientAdapter({ url: options.baseUrl + SERVER_RPC_PATH }), - }); - await serverRpc.setupClient(options.baseUrl); - - // ClientRpc implementation - const clientRpcHandler = exposeTinyRpc({ - adapter: httpServerAdapter({ endpoint: CLIENT_RPC_PATH }), - routes: { - async onUpdate(payload) { - await customOnUpdateFn(onUpdateCallback, runtime, options)(payload); - }, - } satisfies ClientRpc, - }); - - let onUpdateCallback!: OnUpdateFn; - - const runtime = new ViteRuntime( - { - root: options.root, - fetchModule(id, importer) { - return serverRpc.ssrFetchModule(id, importer); - }, - sourcemapInterceptor: "prepareStackTrace", - hmr: { - connection: { - isReady: () => true, - onUpdate(callback) { - onUpdateCallback = callback as any; - }, - send(messages) { - serverRpc.send(messages); - }, - }, - logger: console, - }, - }, - { - async runViteModule(context, transformed, id) { - // do same as vite-node/client - // https://github.com/vitest-dev/vitest/blob/c6e04125fb4a0af2db8bd58ea193b965d50d415f/packages/vite-node/src/client.ts#L415 - const codeDefinition = `'use strict';async (${Object.keys(context).join( - ",", - )})=>{{`; - const code = `${codeDefinition}${transformed}\n}}`; - const fn = options.unsafeEval.eval(code, id); - await fn(...Object.values(context)); - Object.freeze(context.__vite_ssr_exports__); - }, - - runExternalModule(filepath) { - if (options.allowedExternals.includes(filepath)) - return import(filepath); - console.error("[vite-node-miniflare] runExternalModule:", filepath); - throw new Error(`[vite-node-miniflare] runExternalModule: ${filepath}`); - }, - }, - ); - - const fetchHandler: FetchHandler = async (request, env, ctx) => { - const response = await clientRpcHandler({ request }); - if (response) { - return response; - } - - const workerEntry = await runtime.executeEntrypoint(options.workerEntry); - const workerEnv = { - ...env, - __RPC: serverRpc, // extend for customRpc usage - }; - return workerEntry.default.fetch(request, workerEnv, ctx); - }; - return fetchHandler; -} - -type OnUpdateFn = (payload: HMRPayload) => Promise; - -function customOnUpdateFn( - originalFn: OnUpdateFn, - runtime: ViteRuntime, - options: { debug: boolean; hmr: boolean }, -): OnUpdateFn { - return async (payload) => { - if (options.debug) { - console.log("[vite-node-miniflare] HMRPayload:", payload); - } - // use simple module tree invalidation for non-hmr mode - if (!options.hmr && payload.type === "update") { - for (const update of payload.updates) { - const invalidated = runtime.moduleCache.invalidateDepTree([ - update.path, - ]); - if (options.debug) { - console.log("[vite-node-miniflare] invalidateDepTree:", [ - ...invalidated, - ]); - } - } - return; - } - // Workerd needs to wait until promise is resolved during the request handling - await originalFn(payload); - }; -} diff --git a/packages/vite-node-miniflare/src/index.ts b/packages/vite-node-miniflare/src/index.ts index f98aaf8a9..39b9a61b2 100644 --- a/packages/vite-node-miniflare/src/index.ts +++ b/packages/vite-node-miniflare/src/index.ts @@ -1 +1 @@ -export { vitePluginViteNodeMiniflare } from "./server/plugin"; +export * from "./plugin"; diff --git a/packages/vite-node-miniflare/src/plugin.ts b/packages/vite-node-miniflare/src/plugin.ts new file mode 100644 index 000000000..4a4e32d29 --- /dev/null +++ b/packages/vite-node-miniflare/src/plugin.ts @@ -0,0 +1,264 @@ +import { fileURLToPath } from "url"; +import { DefaultMap, tinyassert } from "@hiogawa/utils"; +import { webToNodeHandler } from "@hiogawa/utils-node"; +import { + Miniflare, + Response as MiniflareResponse, + type SharedOptions, + type WorkerOptions, + mergeWorkerOptions, +} from "miniflare"; +import { + type CustomPayload, + DevEnvironment, + type HotChannel, + type Plugin, + type ResolvedConfig, +} from "vite"; +import type { SourcelessWorkerOptions } from "wrangler"; +import { + ANY_URL, + type FetchMetadata, + RUNNER_INIT_PATH, + type RunnerEnv, +} from "./shared"; + +interface WorkerdPluginOptions extends WorkerdEnvironmentOptions { + entry: string; +} + +interface WorkerdEnvironmentOptions { + miniflare?: SharedOptions & SourcelessWorkerOptions; + wrangler?: { + configPath?: string; + }; + hmr?: boolean; +} + +export function vitePluginWorkerd(pluginOptions: WorkerdPluginOptions): Plugin { + return { + name: vitePluginWorkerd.name, + async config(_config, _env) { + return { + environments: { + workerd: { + dev: { + createEnvironment: (name, config) => + createWorkerdDevEnvironment(name, config, pluginOptions), + }, + build: pluginOptions.entry + ? { + ssr: true, + rollupOptions: { + input: { + index: pluginOptions.entry, + }, + }, + } + : undefined, + }, + }, + }; + }, + + configureServer(server) { + const entry = pluginOptions.entry; + if (!entry) { + return; + } + const devEnv = server.environments["workerd"] as WorkerdDevEnvironment; + const nodeMiddleware = webToNodeHandler((request) => + devEnv.api.dispatchFetch(entry, request), + ); + return () => { + server.middlewares.use(nodeMiddleware); + }; + }, + }; +} + +export type WorkerdDevEnvironment = DevEnvironment & { + api: WorkerdDevApi; +}; + +type WorkerdDevApi = { + dispatchFetch: (entry: string, request: Request) => Promise; +}; + +export async function createWorkerdDevEnvironment( + name: string, + config: ResolvedConfig, + pluginOptions: WorkerdEnvironmentOptions, +) { + // setup miniflare with a durable object script to run vite module runner + let runnerWorkerOptions: WorkerOptions = { + modulesRoot: "/", + modules: [ + { + type: "ESModule", + path: fileURLToPath(new URL("./worker.js", import.meta.url)), + }, + ], + durableObjects: { + __viteRunner: "RunnerObject", + }, + unsafeEvalBinding: "__viteUnsafeEval", + serviceBindings: { + __viteFetchModule: async (request) => { + const args = await request.json(); + try { + const result = await devEnv.fetchModule(...(args as [any, any])); + return new MiniflareResponse(JSON.stringify(result)); + } catch (error) { + console.error("[fetchModule]", args, error); + throw error; + } + }, + }, + bindings: { + __viteOptions: { + root: config.root, + hmr: !!pluginOptions.hmr, + } satisfies RunnerEnv["__viteOptions"], + }, + }; + + // https://github.com/cloudflare/workers-sdk/blob/2789f26a87c769fc6177b0bdc79a839a15f4ced1/packages/vitest-pool-workers/src/pool/config.ts#L174-L195 + if (pluginOptions.wrangler?.configPath) { + const wrangler = await import("wrangler"); + const wranglerOptions = wrangler.unstable_getMiniflareWorkerOptions( + pluginOptions.wrangler.configPath, + ); + // TODO: could this be useful to not delete? + delete wranglerOptions.workerOptions.sitePath; + runnerWorkerOptions = mergeWorkerOptions( + wranglerOptions.workerOptions, + runnerWorkerOptions, + ) as WorkerOptions; + } + + if (pluginOptions.miniflare) { + runnerWorkerOptions = mergeWorkerOptions( + pluginOptions.miniflare, + runnerWorkerOptions, + ) as WorkerOptions; + } + + const miniflare = new Miniflare({ + ...pluginOptions.miniflare, + workers: [runnerWorkerOptions], + }); + + // get durable object singleton + const ns = await miniflare.getDurableObjectNamespace("__viteRunner"); + const runnerObject = ns.get(ns.idFromName("")); + + // initial request to setup websocket + const initResponse = await runnerObject.fetch(ANY_URL + RUNNER_INIT_PATH, { + headers: { + Upgrade: "websocket", + }, + }); + tinyassert(initResponse.webSocket); + const { webSocket } = initResponse; + webSocket.accept(); + + // websocket hmr channgel + const hot = createSimpleHMRChannel({ + post: (data) => webSocket.send(data), + on: (listener) => { + webSocket.addEventListener("message", listener); + return () => { + webSocket.removeEventListener("message", listener); + }; + }, + serialize: (v) => JSON.stringify(v), + deserialize: (v) => JSON.parse(v.data), + }); + + // TODO: move initialization code to `init`? + // inheritance to extend dispose + class WorkerdDevEnvironmentImpl extends DevEnvironment { + override async close() { + await super.close(); + await miniflare.dispose(); + } + } + + const devEnv = new WorkerdDevEnvironmentImpl(name, config, { hot }); + + // custom environment api + const api: WorkerdDevApi = { + // fetch proxy + async dispatchFetch(entry: string, request: Request) { + const headers = new Headers(request.headers); + headers.set( + "x-vite-fetch", + JSON.stringify({ entry } satisfies FetchMetadata), + ); + const fetch_ = runnerObject.fetch as any as typeof fetch; // fix web/undici types + const res = await fetch_(request.url, { + method: request.method, + headers, + body: request.body as any, + redirect: "manual", + // @ts-ignore undici + duplex: "half", + }); + return new Response(res.body, { + status: res.status, + statusText: res.statusText, + headers: res.headers, + }); + }, + }; + + return Object.assign(devEnv, { api }) as WorkerdDevEnvironment; +} + +// cf. +// https://github.com/vitejs/vite/blob/feat/environment-api/packages/vite/src/node/server/hmr.ts/#L909-L910 +// https://github.com/vitejs/vite/blob/feat/environment-api/packages/vite/src/node/ssr/runtime/serverHmrConnector.ts/#L33-L34 +function createSimpleHMRChannel(options: { + post: (data: any) => any; + on: (listener: (data: any) => void) => () => void; + serialize: (v: any) => any; + deserialize: (v: any) => any; +}): HotChannel { + const listerMap = new DefaultMap>(() => new Set()); + let dispose: (() => void) | undefined; + + return { + listen() { + dispose = options.on((data) => { + const payload = options.deserialize(data) as CustomPayload; + for (const f of listerMap.get(payload.event)) { + f(payload.data); + } + }); + }, + close() { + dispose?.(); + dispose = undefined; + }, + on(event: string, listener: (...args: any[]) => any) { + listerMap.get(event).add(listener); + }, + off(event: string, listener: (...args: any[]) => any) { + listerMap.get(event).delete(listener); + }, + send(...args: any[]) { + let payload: any; + if (typeof args[0] === "string") { + payload = { + type: "custom", + event: args[0], + data: args[1], + }; + } else { + payload = args[0]; + } + options.post(options.serialize(payload)); + }, + }; +} diff --git a/packages/vite-node-miniflare/src/server/plugin.ts b/packages/vite-node-miniflare/src/server/plugin.ts deleted file mode 100644 index 50fbd45ff..000000000 --- a/packages/vite-node-miniflare/src/server/plugin.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { fileURLToPath } from "node:url"; -import * as httipAdapterNode from "@hattip/adapter-node/native-fetch"; -import * as httipCompose from "@hattip/compose"; -import { - type TinyRpcProxy, - exposeTinyRpc, - httpClientAdapter, - httpServerAdapter, - proxyTinyRpc, -} from "@hiogawa/tiny-rpc"; -import { - Miniflare, - type MiniflareOptions, - type Request as MiniflareRequest, - type WorkerOptions, -} from "miniflare"; -import { - type HMRPayload, - type Plugin, - ServerHMRConnector, - type ViteDevServer, - fetchModule, -} from "vite"; -import { name as packageName } from "../../package.json"; -import { CLIENT_RPC_PATH, SERVER_RPC_PATH } from "../shared"; - -export interface ServerRpc { - ssrFetchModule: ViteDevServer["ssrFetchModule"]; - send: ServerHMRConnector["send"]; - transformIndexHtml: ViteDevServer["transformIndexHtml"]; - setupClient: (baseUrl: string) => void; -} - -export interface ClientRpc { - onUpdate: (payload: HMRPayload) => void; -} - -export function vitePluginViteNodeMiniflare(pluginOptions: { - entry: string; - debug?: boolean; - hmr?: boolean; // for now disable ssr hmr by default for react plugin - miniflareOptions?: (options: MiniflareOptions & WorkerOptions) => void; - customRpc?: Record; -}): Plugin { - // Initialize miniflare lazily on first request and - // dispose on server close (e.g. server restart on user vite config change). - // Otherwise multiple Miniflare could be spawned for example when framework makes use of - // multiple ViteDevServer (e.g. Remix). - let miniflare: Miniflare | undefined; - - return { - name: packageName, - apply: "serve", - config(_config, _env) { - return { - appType: "custom", - ssr: { - // force "webworker" since Vite injects "require" banner if `target: "node"` - // https://github.com/vitejs/vite/blob/a3008671de5b44ced2952f796219c0c4576125ac/packages/vite/src/node/optimizer/index.ts#L824-L830 - target: "webworker", - noExternal: true, - }, - }; - }, - async configureServer(server) { - // ClientRpc proxy - let clientRpc: TinyRpcProxy | undefined; - - // we proxy builtin ServerHMRConnector.send/onUpdate via RPC - // instead of implementing entire HMRChannel on our own - const connector = new ServerHMRConnector(server); - connector.onUpdate((payload) => { - clientRpc?.onUpdate(payload); - }); - - // ServerRpc implementation - const serverRpcHandler = exposeTinyRpc({ - adapter: httpServerAdapter({ endpoint: SERVER_RPC_PATH }), - routes: { - setupClient: (baseUrl) => { - clientRpc = proxyTinyRpc({ - adapter: httpClientAdapter({ url: baseUrl + CLIENT_RPC_PATH }), - }); - }, - transformIndexHtml: server.transformIndexHtml, - ssrFetchModule: (id, importer) => { - // not using default `viteDevServer.ssrFetchModule` since its source map expects mysterious two empty lines, - // which doesn't exist in workerd's unsafe eval - // https://github.com/vitejs/vite/pull/12165#issuecomment-1910686678 - return fetchModule(server, id, importer); - }, - send: (messages: string) => { - connector.send(messages); - }, - // allow framework to extend RPC to implement some features on main Vite process and expose them to Workerd - // (e.g. Remix's DevServerHooks) - ...pluginOptions.customRpc, - } satisfies ServerRpc, - }); - - // lazy setup miniflare + proxy - const miniflareHandler: httipCompose.RequestHandler = async (ctx) => { - if (!miniflare) { - // initialize miniflare on first request - const miniflareOptions: MiniflareOptions = { - // explicitly pass `modules` to avoid Miniflare's ModuleLocator analysis error - modules: [ - { - type: "ESModule", - path: fileURLToPath( - new URL("./worker-entry.js", import.meta.url), - ), - }, - ], - modulesRoot: "/", - // reasonable default? (for react-dom/server renderToReadableStream) - compatibilityDate: "2023-08-01", - unsafeEvalBinding: "__UNSAFE_EVAL", - bindings: { - __WORKER_ENTRY: pluginOptions.entry, - __VITE_NODE_DEBUG: pluginOptions.debug ?? false, - __VITE_RUNTIME_ROOT: server.config.root, - __VITE_RUNTIME_HMR: pluginOptions.hmr ?? false, - }, - }; - pluginOptions.miniflareOptions?.(miniflareOptions); - miniflareOptions.bindings!["__WORKER_NODE_BUILTINS"] = - miniflareOptions.compatibilityFlags?.includes("nodejs_compat") - ? [ - "node:assert", - "node:async_hooks", - "node:buffer", - "node:crypto", - "node:diagnostics_channel", - "node:events", - "node:path", - "node:process", - "node:stream", - "node:string_decoder", - "node:util", - ] - : miniflareOptions.compatibilityFlags?.includes("nodejs_als") - ? ["node:async_hooks"] - : []; - miniflare = new Miniflare(miniflareOptions); - await miniflare.ready; - } - - // fix typings between "lib.dom" and "miniflare" - const request = ctx.request as any as MiniflareRequest; - return miniflare.dispatchFetch(request.url, { - method: request.method, - headers: request.headers, - body: request.body, - duplex: "half", - redirect: "manual", - }) as any as Response; - }; - - const middleware = httipAdapterNode.createMiddleware( - httipCompose.compose(serverRpcHandler, miniflareHandler), - { - alwaysCallNext: false, - }, - ); - return () => server.middlewares.use(middleware); - }, - - async buildEnd() { - if (miniflare) { - await miniflare.dispose(); - miniflare = undefined; - } - }, - }; -} diff --git a/packages/vite-node-miniflare/src/shared.ts b/packages/vite-node-miniflare/src/shared.ts index c11ac637f..8ca40af24 100644 --- a/packages/vite-node-miniflare/src/shared.ts +++ b/packages/vite-node-miniflare/src/shared.ts @@ -1,2 +1,21 @@ -export const SERVER_RPC_PATH = "/__server_rpc__"; -export const CLIENT_RPC_PATH = "/__client_rpc__"; +export const RUNNER_INIT_PATH = "/__viteInit"; +export const RUNNER_EVAL_PATH = "/__viteEval"; +export const ANY_URL = "https://any.local"; + +export type RunnerEnv = { + __viteUnsafeEval: { + eval: (code: string, filename?: string) => any; + }; + __viteFetchModule: { + fetch: (request: Request) => Promise; + }; + __viteRunner: DurableObject; + __viteOptions: { + root: string; + hmr: boolean; + }; +}; + +export type FetchMetadata = { + entry: string; +}; diff --git a/packages/vite-node-miniflare/src/worker.ts b/packages/vite-node-miniflare/src/worker.ts new file mode 100644 index 000000000..9586c07b6 --- /dev/null +++ b/packages/vite-node-miniflare/src/worker.ts @@ -0,0 +1,106 @@ +import { tinyassert } from "@hiogawa/utils"; +import { ModuleRunner } from "vite/module-runner"; +import { + ANY_URL, + type FetchMetadata, + RUNNER_INIT_PATH, + type RunnerEnv, +} from "./shared"; + +export class RunnerObject implements DurableObject { + #env: RunnerEnv; + #runner?: ModuleRunner; + + constructor(_state: DurableObjectState, env: RunnerEnv) { + this.#env = env; + } + + async fetch(request: Request) { + try { + return await this.#fetch(request); + } catch (e) { + console.error(e); + let body = "[vite-node-miniflare error]\n"; + if (e instanceof Error) { + body += `${e.stack ?? e.message}`; + } + return new Response(body, { status: 500 }); + } + } + + async #fetch(request: Request) { + const url = new URL(request.url); + + if (url.pathname === RUNNER_INIT_PATH) { + const pair = new WebSocketPair(); + (pair[0] as any).accept(); + tinyassert(!this.#runner); + this.#runner = createRunner(this.#env, pair[0]); + return new Response(null, { status: 101, webSocket: pair[1] }); + } + + tinyassert(this.#runner); + const options = JSON.parse( + request.headers.get("x-vite-fetch")!, + ) as FetchMetadata; + const mod = await this.#runner.import(options.entry); + const handler = mod.default as ExportedHandler; + tinyassert(handler.fetch); + + return handler.fetch(request, this.#env, { + waitUntil(_promise: Promise) {}, + passThroughOnException() {}, + abort(_reason?: any) {}, + }); + } +} + +function createRunner(env: RunnerEnv, webSocket: WebSocket) { + return new ModuleRunner( + { + root: env.__viteOptions.root, + sourcemapInterceptor: "prepareStackTrace", + transport: { + fetchModule: async (...args) => { + const response = await env.__viteFetchModule.fetch( + new Request(ANY_URL, { + method: "POST", + body: JSON.stringify(args), + }), + ); + tinyassert(response.ok); + const result = response.json(); + return result as any; + }, + }, + hmr: env.__viteOptions.hmr && { + connection: { + isReady: () => true, + onUpdate(callback) { + webSocket.addEventListener("message", (event) => { + callback(JSON.parse(event.data)); + }); + }, + send(messages) { + webSocket.send(JSON.stringify(messages)); + }, + }, + }, + }, + { + runInlinedModule: async (context, transformed, id) => { + const codeDefinition = `'use strict';async (${Object.keys(context).join( + ",", + )})=>{{`; + const code = `${codeDefinition}${transformed}\n}}`; + const fn = env.__viteUnsafeEval.eval(code, id); + await fn(...Object.values(context)); + Object.freeze(context.__vite_ssr_exports__); + }, + async runExternalModule(filepath) { + // with nodejs_compat, workerd can import node:util etc... as external module + return import(filepath); + }, + }, + ); +} diff --git a/packages/vite-node-miniflare/tsconfig.json b/packages/vite-node-miniflare/tsconfig.json index c90802e5f..b56f105eb 100644 --- a/packages/vite-node-miniflare/tsconfig.json +++ b/packages/vite-node-miniflare/tsconfig.json @@ -1,4 +1,7 @@ { "extends": "../../tsconfig.base.json", - "include": ["src", "tsup.config.ts"] + "include": ["src", "tsup.config.ts"], + "compilerOptions": { + "types": ["@cloudflare/workers-types/experimental"] + } } diff --git a/packages/vite-node-miniflare/tsup.config.ts b/packages/vite-node-miniflare/tsup.config.ts index 4ecc39f09..8748be8d8 100644 --- a/packages/vite-node-miniflare/tsup.config.ts +++ b/packages/vite-node-miniflare/tsup.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "tsup"; export default [ defineConfig({ - entry: ["src/client/worker-entry.ts"], + entry: ["src/worker.ts"], format: ["esm"], platform: "browser", noExternal: [/.*/], diff --git a/packages/vite-plugin-simple-hmr/examples/react/vite.config.ts b/packages/vite-plugin-simple-hmr/examples/react/vite.config.ts index 24e58e177..4f540ed46 100644 --- a/packages/vite-plugin-simple-hmr/examples/react/vite.config.ts +++ b/packages/vite-plugin-simple-hmr/examples/react/vite.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ }), vitePluginSsrMiddleware({ entry: "/src/entry-server.tsx", - mode: "ViteRuntime", + mode: "ModuleRunner", }), ], }); diff --git a/packages/vite-plugin-ssr-middleware/examples/react/vite.config.ts b/packages/vite-plugin-ssr-middleware/examples/react/vite.config.ts index 728a5eb1b..13646493a 100644 --- a/packages/vite-plugin-ssr-middleware/examples/react/vite.config.ts +++ b/packages/vite-plugin-ssr-middleware/examples/react/vite.config.ts @@ -14,7 +14,7 @@ export default defineConfig((env) => ({ vitePluginSsrMiddleware({ entry: "/src/entry-server.tsx", preview: path.resolve("./dist/server/index.js"), - mode: "ViteRuntime-no-hmr", + mode: "ModuleRunner", }), ], build: { diff --git a/packages/vite-plugin-ssr-middleware/package.json b/packages/vite-plugin-ssr-middleware/package.json index 260230ad5..d7db626c9 100644 --- a/packages/vite-plugin-ssr-middleware/package.json +++ b/packages/vite-plugin-ssr-middleware/package.json @@ -21,6 +21,7 @@ "types": "./dist/index.d.ts", "files": ["dist"], "scripts": { + "dev": "tsup --watch", "build": "tsup", "release": "pnpm publish --no-git-checks --access public" }, diff --git a/packages/vite-plugin-ssr-middleware/src/plugin.ts b/packages/vite-plugin-ssr-middleware/src/plugin.ts index c96aa9598..c6c233b69 100644 --- a/packages/vite-plugin-ssr-middleware/src/plugin.ts +++ b/packages/vite-plugin-ssr-middleware/src/plugin.ts @@ -8,7 +8,7 @@ export function vitePluginSsrMiddleware({ }: { entry: string; preview?: string; - mode?: "ssrLoadModule" | "ViteRuntime" | "ViteRuntime-no-hmr"; + mode?: "ssrLoadModule" | "ModuleRunner" | "ModuleRunner-HMR"; }): Plugin { return { name: packageName, @@ -41,28 +41,12 @@ export function vitePluginSsrMiddleware({ async configureServer(server) { let loadModule = server.ssrLoadModule; - if (mode === "ViteRuntime" || mode === "ViteRuntime-no-hmr") { - const { createViteRuntime, ServerHMRConnector } = await import("vite"); - if (mode === "ViteRuntime") { - // simple default vite runtime - const runtime = await createViteRuntime(server); - loadModule = runtime.executeEntrypoint.bind(runtime); - } else { - // manual invalidation mode without hmr - const runtime = await createViteRuntime(server, { hmr: false }); - const connection = new ServerHMRConnector(server); - connection.onUpdate(async (payload) => { - if (payload.type === "update") { - // unwrapId? - runtime.moduleCache.invalidateDepTree( - payload.updates.map((update) => update.path), - ); - } else if (payload.type === "full-reload") { - runtime.moduleCache.clear(); - } - }); - loadModule = runtime.executeEntrypoint.bind(runtime); - } + if (mode === "ModuleRunner" || mode === "ModuleRunner-HMR") { + const { createServerModuleRunner } = await import("vite"); + const runner = createServerModuleRunner(server.environments.ssr, { + hmr: mode === "ModuleRunner-HMR" ? undefined : false, + }); + loadModule = (id: string) => runner.import(id); } const handler: Connect.NextHandleFunction = async (req, res, next) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a21effeba..369fe7655 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 react: 19.0.0-rc-eb3ad065-20240822 react-dom: 19.0.0-rc-eb3ad065-20240822 react-is: 19.0.0-rc-eb3ad065-20240822 @@ -40,10 +40,10 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(@swc/helpers@0.5.12)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 3.7.0(@swc/helpers@0.5.12)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) esbuild: specifier: ^0.23.0 version: 0.23.0 @@ -69,8 +69,8 @@ importers: specifier: ^5.5.4 version: 5.5.4 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) vitest: specifier: ^2.0.1 version: 2.0.1(@types/node@20.14.10)(terser@5.31.2) @@ -81,8 +81,8 @@ importers: packages/error-overlay: dependencies: vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/error-overlay/examples/basic: dependencies: @@ -99,8 +99,8 @@ importers: specifier: ^0.30.8 version: 0.30.10 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) devDependencies: esbuild: specifier: ^0.21.5 @@ -125,8 +125,8 @@ importers: specifier: latest version: link:../.. vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/react-server: dependencies: @@ -149,11 +149,11 @@ importers: specifier: 19.0.0-rc-eb3ad065-20240822 version: 19.0.0-rc-eb3ad065-20240822(react-dom@19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822))(react@19.0.0-rc-eb3ad065-20240822)(webpack@5.93.0(@swc/core@1.6.13(@swc/helpers@0.5.12))(esbuild@0.23.0)) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) vitefu: specifier: ^0.2.5 - version: 0.2.5(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 0.2.5(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) devDependencies: '@edge-runtime/cookies': specifier: ^5.0.0 @@ -178,7 +178,7 @@ importers: version: 0.6.2 '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(@swc/helpers@0.5.12)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 3.7.0(@swc/helpers@0.5.12)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) esbuild: specifier: ^0.20.2 version: 0.20.2 @@ -192,11 +192,11 @@ importers: specifier: 19.0.0-rc-eb3ad065-20240822 version: 19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.2(typescript@5.5.4)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) devDependencies: '@hiogawa/react-server': specifier: workspace:* @@ -243,7 +243,7 @@ importers: devDependencies: '@hiogawa/unocss-preset-antd': specifier: 2.2.1-pre.7 - version: 2.2.1-pre.7(unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))) + version: 2.2.1-pre.7(unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))) '@hiogawa/utils': specifier: latest version: 1.7.0 @@ -279,16 +279,16 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) magic-string: specifier: ^0.30.8 version: 0.30.10 unocss: specifier: ^0.58.6 - version: 0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/react-server/examples/custom-out-dir: dependencies: @@ -318,8 +318,8 @@ importers: specifier: 18.3.0 version: 18.3.0 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/react-server/examples/minimal: dependencies: @@ -346,8 +346,8 @@ importers: specifier: 18.3.0 version: 18.3.0 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/react-server/examples/next: dependencies: @@ -377,8 +377,8 @@ importers: specifier: 18.3.0 version: 18.3.0 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/react-server/examples/postcss-tailwind: dependencies: @@ -443,10 +443,10 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: latest - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/react-server/examples/starter: dependencies: @@ -477,10 +477,10 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/server-asset: dependencies: @@ -488,14 +488,14 @@ importers: specifier: ^0.30.8 version: 0.30.10 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/ssr-css: dependencies: vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/transforms: dependencies: @@ -516,8 +516,8 @@ importers: packages/vite-glob-routes: dependencies: vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) devDependencies: '@hattip/compose': specifier: ^0.0.44 @@ -545,7 +545,7 @@ importers: version: 0.1.1-pre.3 '@hiogawa/theme-script': specifier: 0.0.4-pre.3 - version: 0.0.4-pre.3(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 0.0.4-pre.3(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) '@hiogawa/tiny-cli': specifier: 0.0.4-pre.1 version: 0.0.4-pre.1 @@ -566,7 +566,7 @@ importers: version: 0.1.1-pre.10(react@19.0.0-rc-eb3ad065-20240822) '@hiogawa/unocss-preset-antd': specifier: 2.2.1-pre.7 - version: 2.2.1-pre.7(unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))) + version: 2.2.1-pre.7(unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))) '@hiogawa/vite-glob-routes': specifier: workspace:* version: link:../.. @@ -605,7 +605,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) cookie: specifier: ^0.6.0 version: 0.6.0 @@ -626,7 +626,7 @@ importers: version: 6.22.3(react-dom@19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822))(react@19.0.0-rc-eb3ad065-20240822) unocss: specifier: ^0.58.6 - version: 0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) zod: specifier: ^3.22.4 version: 3.23.8 @@ -650,7 +650,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) react: specifier: 19.0.0-rc-eb3ad065-20240822 version: 19.0.0-rc-eb3ad065-20240822 @@ -661,8 +661,8 @@ importers: specifier: ^6.22.3 version: 6.22.3(react-dom@19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822))(react@19.0.0-rc-eb3ad065-20240822) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-glob-routes/examples/ssr: devDependencies: @@ -698,7 +698,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) esbuild: specifier: ^0.20.2 version: 0.20.2 @@ -715,39 +715,39 @@ importers: specifier: ^6.22.3 version: 6.22.3(react-dom@19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822))(react@19.0.0-rc-eb3ad065-20240822) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-import-dev-server: dependencies: vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-node-miniflare: dependencies: - '@hattip/adapter-node': - specifier: ^0.0.44 - version: 0.0.44 - '@hattip/compose': - specifier: ^0.0.44 - version: 0.0.44 + vite: + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) + devDependencies: + '@cloudflare/workers-types': + specifier: ^4.20240821.1 + version: 4.20240821.1 + '@hiogawa/utils-node': + specifier: ^0.0.2 + version: 0.0.2 miniflare: specifier: ^3.20240821.0 version: 3.20240821.0 - vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) - devDependencies: - '@hiogawa/tiny-rpc': - specifier: 0.2.3-pre.18 - version: 0.2.3-pre.18 + wrangler: + specifier: ^3.72.2 + version: 3.72.2(@cloudflare/workers-types@4.20240821.1) packages/vite-node-miniflare/examples/basic: dependencies: '@hiogawa/tiny-react': specifier: 0.0.2-pre.9 - version: 0.0.2-pre.9(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 0.0.2-pre.9(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) '@hiogawa/vite-node-miniflare': specifier: latest version: link:../.. @@ -758,8 +758,8 @@ importers: specifier: ^3.20240821.0 version: 3.20240821.0 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-node-miniflare/examples/react: dependencies: @@ -774,7 +774,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) miniflare: specifier: ^3.20240821.0 version: 3.20240821.0 @@ -785,8 +785,8 @@ importers: specifier: 19.0.0-rc-eb3ad065-20240822 version: 19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-node-miniflare/examples/react-router: dependencies: @@ -810,7 +810,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) miniflare: specifier: ^3.20240821.0 version: 3.20240821.0 @@ -824,8 +824,8 @@ importers: specifier: ^6.22.3 version: 6.22.3(react-dom@19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822))(react@19.0.0-rc-eb3ad065-20240822) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-node-miniflare/examples/remix: dependencies: @@ -853,13 +853,16 @@ importers: version: link:../.. '@remix-run/dev': specifier: 2.8.1 - version: 2.8.1(@types/node@20.14.10)(terser@5.31.2)(typescript@5.5.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))(wrangler@3.72.2(@cloudflare/workers-types@4.20240821.1)) + version: 2.8.1(@types/node@20.14.10)(terser@5.31.2)(typescript@5.5.4)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))(wrangler@3.72.2(@cloudflare/workers-types@4.20240821.1)) '@types/react': specifier: 18.3.3 version: 18.3.3 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 + wrangler: + specifier: ^3.72.2 + version: 3.72.2(@cloudflare/workers-types@4.20240821.1) packages/vite-null-export: dependencies: @@ -867,8 +870,8 @@ importers: specifier: ^1.4.1 version: 1.5.4 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-plugin-simple-hmr: dependencies: @@ -876,8 +879,8 @@ importers: specifier: ^0.30.8 version: 0.30.10 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) devDependencies: '@types/estree': specifier: ^1.0.5 @@ -895,8 +898,8 @@ importers: packages/vite-plugin-ssr-middleware: dependencies: vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages/vite-plugin-ssr-middleware/examples/react: dependencies: @@ -911,7 +914,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + version: 4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) react: specifier: 19.0.0-rc-eb3ad065-20240822 version: 19.0.0-rc-eb3ad065-20240822 @@ -919,8 +922,8 @@ importers: specifier: 19.0.0-rc-eb3ad065-20240822 version: 19.0.0-rc-eb3ad065-20240822(react@19.0.0-rc-eb3ad065-20240822) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + specifier: 6.0.0-alpha.19 + version: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) packages: @@ -1960,7 +1963,7 @@ packages: '@hiogawa/theme-script@0.0.4-pre.3': resolution: {integrity: sha512-2uxVhemdAMUFE/OaUcaTT2QeZsXnxtnF/CLNs+CcrlgwaUXXfsnXUTvUZCz8MTmxzzz4Vp5hfAyi4pp58XHJCQ==} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 peerDependenciesMeta: vite: optional: true @@ -1991,7 +1994,7 @@ packages: '@hiogawa/tiny-react@0.0.2-pre.9': resolution: {integrity: sha512-q5zIFwmJMMLbq4g0e/2/AKaggjsOl0dQ6fAiG7k/PjOdj3/xWJvcxr7oCOzybEuxR7oNIOgsBhydBqZPRQ+BLQ==} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 peerDependenciesMeta: vite: optional: true @@ -2126,7 +2129,7 @@ packages: peerDependencies: '@remix-run/serve': ^2.8.1 typescript: ^5.1.0 - vite: ^5.3.3 + vite: 6.0.0-alpha.19 wrangler: ^3.28.2 peerDependenciesMeta: '@remix-run/serve': @@ -2514,7 +2517,7 @@ packages: '@unocss/astro@0.58.6': resolution: {integrity: sha512-0BvbhEp5Ln6wFNnhISusB2hcfycWkdgnjlFMcLT69efvj4G39MzB6JYT/1qiidLfpj35HcqkpBz7TfZ4bUmOAw==} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 peerDependenciesMeta: vite: optional: true @@ -2595,7 +2598,7 @@ packages: '@unocss/vite@0.58.6': resolution: {integrity: sha512-DPXCoYU/Ozqc/Jeptd41XvtW8MSgVxmtTyhpMAsm/hJuBfwIV7Fy3TZquf4V9BpaTb4ao1LVXzgXmVUmj2HXpA==} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 '@vanilla-extract/babel-plugin-debug-ids@1.0.5': resolution: {integrity: sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==} @@ -2616,13 +2619,13 @@ packages: '@vitejs/plugin-react-swc@3.7.0': resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 '@vitejs/plugin-react@4.3.1': resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 '@vitest/expect@2.0.1': resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} @@ -5226,7 +5229,7 @@ packages: engines: {node: '>=14'} peerDependencies: '@unocss/webpack': 0.58.6 - vite: ^5.3.3 + vite: 6.0.0-alpha.19 peerDependenciesMeta: '@unocss/webpack': optional: true @@ -5305,13 +5308,13 @@ packages: vite-tsconfig-paths@4.3.2: resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 peerDependenciesMeta: vite: optional: true - vite@5.3.3: - resolution: {integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==} + vite@6.0.0-alpha.19: + resolution: {integrity: sha512-2V6xvCnK+JWOQlbNdNJ3f8slenE9PayJg0USD01gYemny7bAfP7RPJ4yuXIjZmx9LfGLHIQOIqJ3haEYw0/3ew==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5341,7 +5344,7 @@ packages: vitefu@0.2.5: resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: - vite: ^5.3.3 + vite: 6.0.0-alpha.19 peerDependenciesMeta: vite: optional: true @@ -6221,9 +6224,9 @@ snapshots: dependencies: react: 19.0.0-rc-eb3ad065-20240822 - '@hiogawa/theme-script@0.0.4-pre.3(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))': + '@hiogawa/theme-script@0.0.4-pre.3(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))': optionalDependencies: - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) '@hiogawa/tiny-cli@0.0.4-pre.1': {} @@ -6237,9 +6240,9 @@ snapshots: optionalDependencies: react: 19.0.0-rc-eb3ad065-20240822 - '@hiogawa/tiny-react@0.0.2-pre.9(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))': + '@hiogawa/tiny-react@0.0.2-pre.9(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))': optionalDependencies: - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) '@hiogawa/tiny-rpc@0.2.3-pre.18': {} @@ -6247,9 +6250,9 @@ snapshots: optionalDependencies: react: 19.0.0-rc-eb3ad065-20240822 - '@hiogawa/unocss-preset-antd@2.2.1-pre.7(unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)))': + '@hiogawa/unocss-preset-antd@2.2.1-pre.7(unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)))': dependencies: - unocss: 0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + unocss: 0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) '@hiogawa/utils-node@0.0.2': {} @@ -6433,7 +6436,7 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@remix-run/dev@2.8.1(@types/node@20.14.10)(terser@5.31.2)(typescript@5.5.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))(wrangler@3.72.2(@cloudflare/workers-types@4.20240821.1))': + '@remix-run/dev@2.8.1(@types/node@20.14.10)(terser@5.31.2)(typescript@5.5.4)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))(wrangler@3.72.2(@cloudflare/workers-types@4.20240821.1))': dependencies: '@babel/core': 7.24.7 '@babel/generator': 7.24.7 @@ -6490,7 +6493,7 @@ snapshots: ws: 7.5.9 optionalDependencies: typescript: 5.5.4 - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) wrangler: 3.72.2(@cloudflare/workers-types@4.20240821.1) transitivePeerDependencies: - '@types/node' @@ -6858,13 +6861,13 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.58.6(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))': + '@unocss/astro@0.58.6(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))': dependencies: '@unocss/core': 0.58.6 '@unocss/reset': 0.58.6 - '@unocss/vite': 0.58.6(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + '@unocss/vite': 0.58.6(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) optionalDependencies: - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - rollup @@ -6995,7 +6998,7 @@ snapshots: dependencies: '@unocss/core': 0.58.6 - '@unocss/vite@0.58.6(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))': + '@unocss/vite@0.58.6(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.0(rollup@4.18.1) @@ -7007,7 +7010,7 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.10 - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - rollup @@ -7044,7 +7047,7 @@ snapshots: lodash: 4.17.21 mlly: 1.6.1 outdent: 0.8.0 - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) vite-node: 1.4.0(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - '@types/node' @@ -7064,21 +7067,21 @@ snapshots: satori: 0.10.9 yoga-wasm-web: 0.3.3 - '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.12)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))': + '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.12)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))': dependencies: '@swc/core': 1.6.13(@swc/helpers@0.5.12) - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.1(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2))': + '@vitejs/plugin-react@4.3.1(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - supports-color @@ -10284,9 +10287,9 @@ snapshots: universalify@2.0.1: {} - unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)): + unocss@0.58.6(postcss@8.4.39)(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)): dependencies: - '@unocss/astro': 0.58.6(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + '@unocss/astro': 0.58.6(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) '@unocss/cli': 0.58.6(rollup@4.18.1) '@unocss/core': 0.58.6 '@unocss/extractor-arbitrary-variants': 0.58.6 @@ -10305,9 +10308,9 @@ snapshots: '@unocss/transformer-compile-class': 0.58.6 '@unocss/transformer-directives': 0.58.6 '@unocss/transformer-variant-group': 0.58.6 - '@unocss/vite': 0.58.6(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)) + '@unocss/vite': 0.58.6(rollup@4.18.1)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)) optionalDependencies: - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - postcss - rollup @@ -10396,7 +10399,7 @@ snapshots: debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - '@types/node' - less @@ -10413,7 +10416,7 @@ snapshots: debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - '@types/node' - less @@ -10424,18 +10427,18 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)): + vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)): dependencies: debug: 4.3.5 globrex: 0.1.2 tsconfck: 3.1.0(typescript@5.5.4) optionalDependencies: - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) transitivePeerDependencies: - supports-color - typescript - vite@5.3.3(@types/node@20.14.10)(terser@5.31.2): + vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2): dependencies: esbuild: 0.21.5 postcss: 8.4.39 @@ -10445,9 +10448,9 @@ snapshots: fsevents: 2.3.3 terser: 5.31.2 - vitefu@0.2.5(vite@5.3.3(@types/node@20.14.10)(terser@5.31.2)): + vitefu@0.2.5(vite@6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2)): optionalDependencies: - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) vitest@2.0.1(@types/node@20.14.10)(terser@5.31.2): dependencies: @@ -10466,7 +10469,7 @@ snapshots: std-env: 3.7.0 tinybench: 2.8.0 tinypool: 1.0.0 - vite: 5.3.3(@types/node@20.14.10)(terser@5.31.2) + vite: 6.0.0-alpha.19(@types/node@20.14.10)(terser@5.31.2) vite-node: 2.0.1(@types/node@20.14.10)(terser@5.31.2) why-is-node-running: 2.3.0 optionalDependencies: