From 609ac3da5a6a020c829990dfda52f1d14a79ad69 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Wed, 13 Aug 2025 00:44:25 +0200 Subject: [PATCH 01/14] chore(router): don't prop-drill serdes --- .../src/buildtime/vite/dev-server.ts | 8 +--- .../qwik-router/src/buildtime/vite/plugin.ts | 8 ---- .../src/middleware/azure-swa/index.ts | 9 +---- .../qwik-router/src/middleware/bun/index.ts | 4 +- .../src/middleware/cloudflare-pages/index.ts | 4 +- .../qwik-router/src/middleware/deno/index.ts | 9 +---- .../src/middleware/netlify-edge/index.ts | 9 +---- .../qwik-router/src/middleware/node/index.ts | 10 +---- .../middleware.request-handler.api.md | 6 +-- .../request-handler/request-event.ts | 18 +++------ .../request-handler/request-handler.ts | 8 ++-- .../resolve-request-handlers.ts | 38 +++++++------------ .../request-handler/user-response.ts | 19 +++------- .../src/middleware/vercel-edge/index.ts | 9 +---- packages/qwik-router/src/ssg/worker-thread.ts | 14 ++----- 15 files changed, 41 insertions(+), 132 deletions(-) diff --git a/packages/qwik-router/src/buildtime/vite/dev-server.ts b/packages/qwik-router/src/buildtime/vite/dev-server.ts index 4b43545c0f9..4495e804290 100644 --- a/packages/qwik-router/src/buildtime/vite/dev-server.ts +++ b/packages/qwik-router/src/buildtime/vite/dev-server.ts @@ -9,7 +9,6 @@ import { resolveRequestHandlers, } from '../../middleware/request-handler/resolve-request-handlers'; import { getQwikRouterServerData } from '../../middleware/request-handler/response-page'; -import type { QwikSerializer } from '../../middleware/request-handler/types'; import { QDATA_JSON, getRouteMatchPathname, @@ -226,10 +225,6 @@ export function ssrDevMiddleware(ctx: BuildContext, server: ViteDevServer) { const serverRequestEv = await fromNodeHttp(url, req, res, 'dev'); Object.assign(serverRequestEv.platform, ctx.opts.platform); - const { _deserialize, _serialize, _verifySerializable } = - await server.ssrLoadModule('@qwik-serializer'); - const qwikSerializer: QwikSerializer = { _deserialize, _serialize, _verifySerializable }; - const rebuildRouteInfo: RebuildRouteInfoInternal = async (url: URL) => { const { serverPlugins, loadedRoute } = await resolveRoute(routeModulePaths, url); const requestHandlers = resolveRequestHandlers( @@ -251,8 +246,7 @@ export function ssrDevMiddleware(ctx: BuildContext, server: ViteDevServer) { loadedRoute, requestHandlers, rebuildRouteInfo, - ctx.opts.basePathname, - qwikSerializer + ctx.opts.basePathname ); const result = await completion; if (result != null) { diff --git a/packages/qwik-router/src/buildtime/vite/plugin.ts b/packages/qwik-router/src/buildtime/vite/plugin.ts index 50de22c9edc..c612deac3e1 100644 --- a/packages/qwik-router/src/buildtime/vite/plugin.ts +++ b/packages/qwik-router/src/buildtime/vite/plugin.ts @@ -23,7 +23,6 @@ import type { } from './types'; import { validatePlugin } from './validate-plugin'; -const QWIK_SERIALIZER = '@qwik-serializer'; export const QWIK_ROUTER_CONFIG_ID = '@qwik-router-config'; const QWIK_ROUTER_ENTRIES_ID = '@qwik-router-entries'; const QWIK_ROUTER = '@qwik.dev/router'; @@ -160,9 +159,6 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { }, resolveId(id) { - if (id === QWIK_SERIALIZER) { - return join(rootDir!, id); - } if (id === QWIK_ROUTER_CONFIG_ID || id === QWIK_ROUTER_ENTRIES_ID) { return { id: join(rootDir!, id), @@ -184,10 +180,6 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { // @qwik-router-entries return generateQwikRouterEntries(ctx); } - const isSerializer = id.endsWith(QWIK_SERIALIZER); - if (isSerializer) { - return `export {_deserialize, _serialize, _verifySerializable} from '@qwik.dev/core'`; - } const isRouterConfig = id.endsWith(QWIK_ROUTER_CONFIG_ID); const isSwRegister = id.endsWith(QWIK_ROUTER_SW_REGISTER); if (isRouterConfig || isSwRegister) { diff --git a/packages/qwik-router/src/middleware/azure-swa/index.ts b/packages/qwik-router/src/middleware/azure-swa/index.ts index 449c8c3a7b3..f395ae6ad8d 100644 --- a/packages/qwik-router/src/middleware/azure-swa/index.ts +++ b/packages/qwik-router/src/middleware/azure-swa/index.ts @@ -1,5 +1,4 @@ import type { AzureFunction, Context, HttpRequest } from '@azure/functions'; -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; import { setServerPlatform } from '@qwik.dev/core/server'; import type { ServerRenderOptions, @@ -11,7 +10,6 @@ import { requestHandler, } from '@qwik.dev/router/middleware/request-handler'; import { parseString } from 'set-cookie-parser'; -import type { QwikSerializer } from '../request-handler/types'; // @qwik.dev/router/middleware/azure-swa @@ -56,11 +54,6 @@ export function createQwikRouter(opts: QwikRouterAzureOptions): AzureFunction { console.warn('qwikCityPlan is deprecated. Simply remove it.'); opts.qwikRouterConfig = opts.qwikCityPlan; } - const qwikSerializer: QwikSerializer = { - _deserialize, - _serialize, - _verifySerializable, - }; if (opts.manifest) { setServerPlatform(opts.manifest); } @@ -116,7 +109,7 @@ export function createQwikRouter(opts: QwikRouterAzureOptions): AzureFunction { }; // send request to qwik router request handler - const handledResponse = await requestHandler(serverRequestEv, opts, qwikSerializer); + const handledResponse = await requestHandler(serverRequestEv, opts); if (handledResponse) { handledResponse.completion.then((err) => { if (err) { diff --git a/packages/qwik-router/src/middleware/bun/index.ts b/packages/qwik-router/src/middleware/bun/index.ts index 8ad8f2a24c0..510aaa9077a 100644 --- a/packages/qwik-router/src/middleware/bun/index.ts +++ b/packages/qwik-router/src/middleware/bun/index.ts @@ -1,5 +1,4 @@ /// -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; import { setServerPlatform } from '@qwik.dev/core/server'; import type { ClientConn, @@ -26,7 +25,6 @@ export function createQwikRouter(opts: QwikRouterBunOptions) { // still missing from bun: last check was bun version 1.1.8 globalThis.TextEncoderStream ||= _TextEncoderStream_polyfill; - const qwikSerializer = { _deserialize, _serialize, _verifySerializable }; if (opts.manifest) { setServerPlatform(opts.manifest); } @@ -66,7 +64,7 @@ export function createQwikRouter(opts: QwikRouterBunOptions) { }; // send request to qwik router request handler - const handledResponse = await requestHandler(serverRequestEv, opts, qwikSerializer); + const handledResponse = await requestHandler(serverRequestEv, opts); if (handledResponse) { handledResponse.completion.then((v) => { if (v) { diff --git a/packages/qwik-router/src/middleware/cloudflare-pages/index.ts b/packages/qwik-router/src/middleware/cloudflare-pages/index.ts index 86d8b408bf3..fc463385504 100644 --- a/packages/qwik-router/src/middleware/cloudflare-pages/index.ts +++ b/packages/qwik-router/src/middleware/cloudflare-pages/index.ts @@ -1,4 +1,3 @@ -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; import { setServerPlatform } from '@qwik.dev/core/server'; import type { ServerRenderOptions, @@ -27,7 +26,6 @@ export function createQwikRouter(opts: QwikRouterCloudflarePagesOptions) { } catch { globalThis.TextEncoderStream = _TextEncoderStream_polyfill; } - const qwikSerializer = { _deserialize, _serialize, _verifySerializable }; if (opts.manifest) { setServerPlatform(opts.manifest); } @@ -92,7 +90,7 @@ export function createQwikRouter(opts: QwikRouterCloudflarePagesOptions) { }; // send request to qwik router request handler - const handledResponse = await requestHandler(serverRequestEv, opts, qwikSerializer); + const handledResponse = await requestHandler(serverRequestEv, opts); if (handledResponse) { handledResponse.completion.then((v) => { if (v) { diff --git a/packages/qwik-router/src/middleware/deno/index.ts b/packages/qwik-router/src/middleware/deno/index.ts index 87b07248c97..8d3ccd3f2ab 100644 --- a/packages/qwik-router/src/middleware/deno/index.ts +++ b/packages/qwik-router/src/middleware/deno/index.ts @@ -1,4 +1,3 @@ -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; import { setServerPlatform } from '@qwik.dev/core/server'; import type { ClientConn, @@ -14,7 +13,6 @@ import { import { MIME_TYPES } from '../request-handler/mime-types'; // @ts-ignore import { extname, fromFileUrl, join } from 'https://deno.land/std/path/mod.ts'; -import type { QwikSerializer } from '../request-handler/types'; // @qwik.dev/router/middleware/deno @@ -36,11 +34,6 @@ export function createQwikRouter(opts: QwikRouterDenoOptions) { console.warn('qwikCityPlan is deprecated. Simply remove it.'); opts.qwikRouterConfig = opts.qwikCityPlan; } - const qwikSerializer: QwikSerializer = { - _deserialize, - _serialize, - _verifySerializable, - }; if (opts.manifest) { setServerPlatform(opts.manifest); } @@ -80,7 +73,7 @@ export function createQwikRouter(opts: QwikRouterDenoOptions) { }; // send request to qwik router request handler - const handledResponse = await requestHandler(serverRequestEv, opts, qwikSerializer); + const handledResponse = await requestHandler(serverRequestEv, opts); if (handledResponse) { handledResponse.completion.then((v) => { if (v) { diff --git a/packages/qwik-router/src/middleware/netlify-edge/index.ts b/packages/qwik-router/src/middleware/netlify-edge/index.ts index ff990a6a293..54982702c32 100644 --- a/packages/qwik-router/src/middleware/netlify-edge/index.ts +++ b/packages/qwik-router/src/middleware/netlify-edge/index.ts @@ -4,7 +4,6 @@ import type { ServerRequestEvent, } from '@qwik.dev/router/middleware/request-handler'; -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; import { setServerPlatform } from '@qwik.dev/core/server'; import { getNotFound, @@ -12,7 +11,6 @@ import { mergeHeadersCookies, requestHandler, } from '@qwik.dev/router/middleware/request-handler'; -import type { QwikSerializer } from '../request-handler/types'; // @qwik.dev/router/middleware/netlify-edge @@ -23,11 +21,6 @@ export function createQwikRouter(opts: QwikRouterNetlifyOptions) { console.warn('qwikCityPlan is deprecated. Simply remove it.'); opts.qwikRouterConfig = opts.qwikCityPlan; } - const qwikSerializer: QwikSerializer = { - _deserialize, - _serialize, - _verifySerializable, - }; if (opts.manifest) { setServerPlatform(opts.manifest); } @@ -65,7 +58,7 @@ export function createQwikRouter(opts: QwikRouterNetlifyOptions) { }; // send request to qwik router request handler - const handledResponse = await requestHandler(serverRequestEv, opts, qwikSerializer); + const handledResponse = await requestHandler(serverRequestEv, opts); if (handledResponse) { handledResponse.completion.then((v) => { if (v) { diff --git a/packages/qwik-router/src/middleware/node/index.ts b/packages/qwik-router/src/middleware/node/index.ts index 460e43a58bb..a09764ca540 100644 --- a/packages/qwik-router/src/middleware/node/index.ts +++ b/packages/qwik-router/src/middleware/node/index.ts @@ -1,4 +1,3 @@ -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; import { setServerPlatform } from '@qwik.dev/core/server'; import type { ClientConn, ServerRenderOptions } from '@qwik.dev/router/middleware/request-handler'; import { @@ -12,7 +11,6 @@ import type { Http2ServerRequest } from 'node:http2'; import { basename, extname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { MIME_TYPES } from '../request-handler/mime-types'; -import type { QwikSerializer } from '../request-handler/types'; import { computeOrigin, fromNodeHttp, getUrl } from './http'; // @qwik.dev/router/middleware/node @@ -24,12 +22,6 @@ export function createQwikRouter(opts: QwikRouterNodeRequestOptions | QwikCityNo opts.qwikRouterConfig = opts.qwikCityPlan; } - const qwikSerializer: QwikSerializer = { - _deserialize, - _serialize, - _verifySerializable, - }; - if (opts.manifest) { setServerPlatform(opts.manifest); } @@ -50,7 +42,7 @@ export function createQwikRouter(opts: QwikRouterNodeRequestOptions | QwikCityNo 'server', opts.getClientConn ); - const handled = await requestHandler(serverRequestEv, opts, qwikSerializer); + const handled = await requestHandler(serverRequestEv, opts); if (handled) { const err = await handled.completion; if (err) { diff --git a/packages/qwik-router/src/middleware/request-handler/middleware.request-handler.api.md b/packages/qwik-router/src/middleware/request-handler/middleware.request-handler.api.md index b6051a88803..b430ba87592 100644 --- a/packages/qwik-router/src/middleware/request-handler/middleware.request-handler.api.md +++ b/packages/qwik-router/src/middleware/request-handler/middleware.request-handler.api.md @@ -5,7 +5,6 @@ ```ts import type { Action } from '@qwik.dev/router'; -import type { _deserialize } from '@qwik.dev/core/internal'; import type { EnvGetter as EnvGetter_2 } from '@qwik.dev/router/middleware/request-handler'; import type { FailReturn } from '@qwik.dev/router'; import type { Loader as Loader_2 } from '@qwik.dev/router'; @@ -18,9 +17,7 @@ import { RequestEvent as RequestEvent_2 } from '@qwik.dev/router/middleware/requ import type { RequestHandler as RequestHandler_2 } from '@qwik.dev/router/middleware/request-handler'; import type { ResolveSyncValue as ResolveSyncValue_2 } from '@qwik.dev/router/middleware/request-handler'; import { SerializationStrategy } from '@qwik.dev/core/internal'; -import type { _serialize } from '@qwik.dev/core/internal'; import type { ValueOrPromise } from '@qwik.dev/core'; -import type { _verifySerializable } from '@qwik.dev/core/internal'; // @public (undocumented) export class AbortMessage { @@ -171,11 +168,10 @@ export const RequestEvShareQData = "qData"; // @public (undocumented) export type RequestHandler = (ev: RequestEvent) => Promise | void; -// Warning: (ae-forgotten-export) The symbol "QwikSerializer" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "QwikRouterRun" needs to be exported by the entry point index.d.ts // // @public -export function requestHandler(serverRequestEv: ServerRequestEvent, opts: ServerRenderOptions, qwikSerializer: QwikSerializer): Promise | null>; +export function requestHandler(serverRequestEv: ServerRequestEvent, opts: ServerRenderOptions): Promise | null>; // @public (undocumented) export interface ResolveSyncValue { diff --git a/packages/qwik-router/src/middleware/request-handler/request-event.ts b/packages/qwik-router/src/middleware/request-handler/request-event.ts index 9cdadfe9055..2c83d569123 100644 --- a/packages/qwik-router/src/middleware/request-handler/request-event.ts +++ b/packages/qwik-router/src/middleware/request-handler/request-event.ts @@ -1,5 +1,5 @@ import type { ValueOrPromise } from '@qwik.dev/core'; -import { _UNINITIALIZED, type SerializationStrategy } from '@qwik.dev/core/internal'; +import { _deserialize, _UNINITIALIZED, type SerializationStrategy } from '@qwik.dev/core/internal'; import { QDATA_KEY } from '../../runtime/src/constants'; import { LoadedRouteProp, @@ -23,7 +23,6 @@ import { encoder, getRouteLoaderPromise } from './resolve-request-handlers'; import type { CacheControl, CacheControlTarget, - QwikSerializer, RequestEvent, RequestEventCommon, RequestEventLoader, @@ -37,7 +36,6 @@ import { IsQData, QDATA_JSON, QDATA_JSON_LEN } from './user-response'; const RequestEvLoaders = Symbol('RequestEvLoaders'); const RequestEvMode = Symbol('RequestEvMode'); const RequestEvRoute = Symbol('RequestEvRoute'); -export const RequestEvQwikSerializer = Symbol('RequestEvQwikSerializer'); export const RequestEvLoaderSerializationStrategyMap = Symbol( 'RequestEvLoaderSerializationStrategyMap' ); @@ -55,7 +53,6 @@ export function createRequestEvent( loadedRoute: LoadedRoute | null, requestHandlers: RequestHandler[], basePathname: string, - qwikSerializer: QwikSerializer, resolved: (response: any) => void ) { const { request, platform, env } = serverRequestEv; @@ -160,7 +157,6 @@ export function createRequestEvent( get [RequestEvRoute]() { return loadedRoute; }, - [RequestEvQwikSerializer]: qwikSerializer, cookie, headers, env, @@ -213,7 +209,7 @@ export function createRequestEvent( } if (loaders[id] === _UNINITIALIZED) { const isDev = getRequestMode(requestEv) === 'dev'; - await getRouteLoaderPromise(loaderOrAction, loaders, requestEv, isDev, qwikSerializer); + await getRouteLoaderPromise(loaderOrAction, loaders, requestEv, isDev); } } @@ -295,7 +291,7 @@ export function createRequestEvent( if (requestData !== undefined) { return requestData; } - return (requestData = parseRequest(requestEv, sharedMap, qwikSerializer)); + return (requestData = parseRequest(requestEv, sharedMap)); }, json: (statusCode: number, data: any) => { @@ -341,7 +337,6 @@ export interface RequestEventInternal extends RequestEvent, RequestEventLoader { [RequestEvLoaderSerializationStrategyMap]: Map; [RequestEvMode]: ServerRequestMode; [RequestEvRoute]: LoadedRoute | null; - [RequestEvQwikSerializer]: QwikSerializer; /** * Check if this request is already written to. @@ -384,8 +379,7 @@ const ABORT_INDEX = Number.MAX_SAFE_INTEGER; const parseRequest = async ( { request, method, query }: RequestEventInternal, - sharedMap: Map, - qwikSerializer: QwikSerializer + sharedMap: Map ): Promise => { const type = request.headers.get('content-type')?.split(/[;,]/, 1)[0].trim() ?? ''; if (type === 'application/x-www-form-urlencoded' || type === 'multipart/form-data') { @@ -400,13 +394,13 @@ const parseRequest = async ( const data = query.get(QDATA_KEY); if (data) { try { - return qwikSerializer._deserialize(decodeURIComponent(data)) as JSONValue; + return _deserialize(decodeURIComponent(data)) as JSONValue; } catch { // } } } - return qwikSerializer._deserialize(await request.text()) as JSONValue; + return _deserialize(await request.text()) as JSONValue; } return undefined; }; diff --git a/packages/qwik-router/src/middleware/request-handler/request-handler.ts b/packages/qwik-router/src/middleware/request-handler/request-handler.ts index 3d6c19eac68..be1c45552a9 100644 --- a/packages/qwik-router/src/middleware/request-handler/request-handler.ts +++ b/packages/qwik-router/src/middleware/request-handler/request-handler.ts @@ -2,7 +2,7 @@ import type { Render } from '@qwik.dev/core/server'; import { loadRoute } from '../../runtime/src/routing'; import type { QwikRouterConfig, RebuildRouteInfoInternal } from '../../runtime/src/types'; import { renderQwikMiddleware, resolveRequestHandlers } from './resolve-request-handlers'; -import type { QwikSerializer, ServerRenderOptions, ServerRequestEvent } from './types'; +import type { ServerRenderOptions, ServerRequestEvent } from './types'; import { getRouteMatchPathname, runQwikRouter, type QwikRouterRun } from './user-response'; /** @@ -17,8 +17,7 @@ let qwikRouterConfigActual: QwikRouterConfig; */ export async function requestHandler( serverRequestEv: ServerRequestEvent, - opts: ServerRenderOptions, - qwikSerializer: QwikSerializer + opts: ServerRenderOptions ): Promise | null> { const { render, checkOrigin } = opts; let { qwikRouterConfig } = opts; @@ -70,8 +69,7 @@ export async function requestHandler( route, requestHandlers, rebuildRouteInfo, - qwikRouterConfig.basePathname, - qwikSerializer + qwikRouterConfig.basePathname ); } return null; diff --git a/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts b/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts index 5a272ba6021..b73fc9e0816 100644 --- a/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts +++ b/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts @@ -1,5 +1,5 @@ import { type QRL } from '@qwik.dev/core'; -import { _UNINITIALIZED } from '@qwik.dev/core/internal'; +import { _serialize, _UNINITIALIZED, _verifySerializable } from '@qwik.dev/core/internal'; import type { Render, RenderToStringResult } from '@qwik.dev/core/server'; import { QACTION_KEY, QFN_KEY, QLOADER_KEY } from '../../runtime/src/constants'; import { @@ -17,7 +17,6 @@ import { import { HttpStatus } from './http-status-codes'; import { RequestEvIsRewrite, - RequestEvQwikSerializer, RequestEvShareQData, RequestEvShareServerTiming, RequestEvSharedActionId, @@ -28,13 +27,7 @@ import { type RequestEventInternal, } from './request-event'; import { getQwikRouterServerData } from './response-page'; -import type { - ErrorCodes, - QwikSerializer, - RequestEvent, - RequestEventBase, - RequestHandler, -} from './types'; +import type { ErrorCodes, RequestEvent, RequestEventBase, RequestHandler } from './types'; import { IsQData, QDATA_JSON } from './user-response'; // Import separately to avoid duplicate imports in the vite dev server import { RedirectMessage, ServerError } from '@qwik.dev/router/middleware/request-handler'; @@ -189,7 +182,6 @@ export function actionsMiddleware(routeActions: ActionInternal[]): RequestHandle const { method } = requestEv; const loaders = getRequestLoaders(requestEv); const isDev = getRequestMode(requestEv) === 'dev'; - const qwikSerializer = requestEv[RequestEvQwikSerializer]; if (isDev && method === 'GET') { if (requestEv.query.has(QACTION_KEY)) { console.warn( @@ -224,7 +216,7 @@ export function actionsMiddleware(routeActions: ActionInternal[]): RequestHandle ) : await action.__qrl.call(requestEv, result.data as JSONObject, requestEv); if (isDev) { - verifySerializable(qwikSerializer, actionResolved, action.__qrl); + verifySerializable(actionResolved, action.__qrl); } loaders[selectedActionId] = actionResolved; } @@ -243,7 +235,6 @@ export function loadersMiddleware(routeLoaders: LoaderInternal[]): RequestHandle } const loaders = getRequestLoaders(requestEv); const isDev = getRequestMode(requestEv) === 'dev'; - const qwikSerializer = requestEv[RequestEvQwikSerializer]; if (routeLoaders.length > 0) { let currentLoaders: LoaderInternal[] = []; if (requestEv.query.has(QLOADER_KEY)) { @@ -259,7 +250,7 @@ export function loadersMiddleware(routeLoaders: LoaderInternal[]): RequestHandle currentLoaders = routeLoaders; } const resolvedLoadersPromises = currentLoaders.map((loader) => - getRouteLoaderPromise(loader, loaders, requestEv, isDev, qwikSerializer) + getRouteLoaderPromise(loader, loaders, requestEv, isDev) ); await Promise.all(resolvedLoadersPromises); } @@ -270,8 +261,7 @@ export async function getRouteLoaderPromise( loader: LoaderInternal, loaders: Record, requestEv: RequestEventInternal, - isDev: boolean, - qwikSerializer: QwikSerializer + isDev: boolean ) { const loaderId = loader.__id; loaders[loaderId] = runValidators( @@ -298,7 +288,7 @@ export async function getRouteLoaderPromise( loaders[loaderId] = resolvedLoader(); } else { if (isDev) { - verifySerializable(qwikSerializer, resolvedLoader, loader.__qrl); + verifySerializable(resolvedLoader, loader.__qrl); } loaders[loaderId] = resolvedLoader; } @@ -351,7 +341,6 @@ async function pureServerFunction(ev: RequestEvent) { ) { ev.exit(); const isDev = getRequestMode(ev) === 'dev'; - const qwikSerializer = (ev as RequestEventInternal)[RequestEvQwikSerializer]; const data = await ev.parseBody(); if (Array.isArray(data)) { const [qrl, ...args] = data; @@ -377,9 +366,9 @@ async function pureServerFunction(ev: RequestEvent) { const stream = writable.getWriter(); for await (const item of result) { if (isDev) { - verifySerializable(qwikSerializer, item, qrl); + verifySerializable(item, qrl); } - const message = await qwikSerializer._serialize([item]); + const message = await _serialize([item]); if (ev.signal.aborted) { break; } @@ -387,9 +376,9 @@ async function pureServerFunction(ev: RequestEvent) { } stream.close(); } else { - verifySerializable(qwikSerializer, result, qrl); + verifySerializable(result, qrl); ev.headers.set('Content-Type', 'application/qwik-json'); - const message = await qwikSerializer._serialize([result]); + const message = await _serialize([result]); ev.send(200, message); } return; @@ -424,9 +413,9 @@ function fixTrailingSlash(ev: RequestEvent) { } } -export function verifySerializable(qwikSerializer: QwikSerializer, data: any, qrl: QRL) { +export function verifySerializable(data: any, qrl: QRL) { try { - qwikSerializer._verifySerializable(data, undefined); + _verifySerializable(data, undefined); } catch (e: any) { if (e instanceof Error && qrl.dev) { (e as any).loc = qrl.dev; @@ -640,9 +629,8 @@ export async function renderQData(requestEv: RequestEvent) { isRewrite: requestEv.sharedMap.get(RequestEvIsRewrite), }; const writer = requestEv.getWritableStream().getWriter(); - const qwikSerializer = (requestEv as RequestEventInternal)[RequestEvQwikSerializer]; // write just the page json data to the response body - const data = await qwikSerializer._serialize([qData]); + const data = await _serialize([qData]); writer.write(encoder.encode(data)); requestEv.sharedMap.set(RequestEvShareQData, qData); diff --git a/packages/qwik-router/src/middleware/request-handler/user-response.ts b/packages/qwik-router/src/middleware/request-handler/user-response.ts index f37ca8a8c17..e92f0a0edb7 100644 --- a/packages/qwik-router/src/middleware/request-handler/user-response.ts +++ b/packages/qwik-router/src/middleware/request-handler/user-response.ts @@ -1,3 +1,4 @@ +import { _serialize } from '@qwik.dev/core/internal'; import type { LoadedRoute, RebuildRouteInfoInternal, @@ -5,20 +6,15 @@ import type { RequestHandler, } from '../../runtime/src/types'; import { getErrorHtml } from './error-handler'; -import { - RequestEvQwikSerializer, - createRequestEvent, - getRequestMode, - type RequestEventInternal, -} from './request-event'; +import { createRequestEvent, getRequestMode, type RequestEventInternal } from './request-event'; import { encoder } from './resolve-request-handlers'; -import type { QwikSerializer, ServerRequestEvent, StatusCodes } from './types'; +import type { ServerRequestEvent, StatusCodes } from './types'; // Import separately to avoid duplicate imports in the vite dev server import { AbortMessage, RedirectMessage, - ServerError, RewriteMessage, + ServerError, } from '@qwik.dev/router/middleware/request-handler'; export interface QwikRouterRun { @@ -46,8 +42,7 @@ export function runQwikRouter( loadedRoute: LoadedRoute | null, requestHandlers: RequestHandler[], rebuildRouteInfo: RebuildRouteInfoInternal, - basePathname = '/', - qwikSerializer: QwikSerializer + basePathname = '/' ): QwikRouterRun { let resolve: (value: T) => void; const responsePromise = new Promise((r) => (resolve = r)); @@ -56,7 +51,6 @@ export function runQwikRouter( loadedRoute, requestHandlers, basePathname, - qwikSerializer, resolve! ); @@ -100,9 +94,8 @@ async function runNext( const status = e.status as StatusCodes; const accept = requestEv.request.headers.get('Accept'); if (accept && !accept.includes('text/html')) { - const qwikSerializer = requestEv[RequestEvQwikSerializer]; requestEv.headers.set('Content-Type', 'application/qwik-json'); - requestEv.send(status, await qwikSerializer._serialize([e.data])); + requestEv.send(status, await _serialize([e.data])); } else { const html = getErrorHtml(e.status, e.data); requestEv.html(status, html); diff --git a/packages/qwik-router/src/middleware/vercel-edge/index.ts b/packages/qwik-router/src/middleware/vercel-edge/index.ts index ce4d5205a72..5795ccba2b3 100644 --- a/packages/qwik-router/src/middleware/vercel-edge/index.ts +++ b/packages/qwik-router/src/middleware/vercel-edge/index.ts @@ -1,4 +1,3 @@ -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; import { setServerPlatform } from '@qwik.dev/core/server'; import type { ServerRenderOptions, @@ -10,7 +9,6 @@ import { mergeHeadersCookies, requestHandler, } from '@qwik.dev/router/middleware/request-handler'; -import type { QwikSerializer } from '../request-handler/types'; // @qwik.dev/router/middleware/vercel-edge const COUNTRY_HEADER_NAME = 'x-vercel-ip-country'; @@ -26,11 +24,6 @@ export function createQwikRouter(opts: QwikRouterVercelEdgeOptions) { console.warn('qwikCityPlan is deprecated. Simply remove it.'); opts.qwikRouterConfig = opts.qwikCityPlan; } - const qwikSerializer: QwikSerializer = { - _deserialize, - _serialize, - _verifySerializable, - }; if (opts.manifest) { setServerPlatform(opts.manifest); } @@ -92,7 +85,7 @@ export function createQwikRouter(opts: QwikRouterVercelEdgeOptions) { }; // send request to qwik router request handler - const handledResponse = await requestHandler(serverRequestEv, opts, qwikSerializer); + const handledResponse = await requestHandler(serverRequestEv, opts); if (handledResponse) { handledResponse.completion.then((v) => { if (v) { diff --git a/packages/qwik-router/src/ssg/worker-thread.ts b/packages/qwik-router/src/ssg/worker-thread.ts index 830bb38c31e..4c1beb02120 100644 --- a/packages/qwik-router/src/ssg/worker-thread.ts +++ b/packages/qwik-router/src/ssg/worker-thread.ts @@ -1,15 +1,14 @@ -import { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal'; +import { _serialize } from '@qwik.dev/core/internal'; import type { ServerRequestEvent } from '@qwik.dev/router/middleware/request-handler'; -import { requestHandler, RequestEvShareQData } from '@qwik.dev/router/middleware/request-handler'; +import { RequestEvShareQData, requestHandler } from '@qwik.dev/router/middleware/request-handler'; import { WritableStream } from 'node:stream/web'; import { pathToFileURL } from 'node:url'; -import type { QwikSerializer } from '../middleware/request-handler/types'; import type { ClientPageData } from '../runtime/src/types'; import type { SsgHandlerOptions, SsgRoute, - StaticStreamWriter, SsgWorkerRenderResult, + StaticStreamWriter, System, } from './types'; @@ -72,11 +71,6 @@ async function workerRender( pendingPromises: Set>, callback: (result: SsgWorkerRenderResult) => void ) { - const qwikSerializer: QwikSerializer = { - _deserialize, - _serialize, - _verifySerializable, - }; // pathname and origin already normalized at this point const url = new URL(staticRoute.pathname, opts.origin); @@ -237,7 +231,7 @@ async function workerRender( }, }; - const promise = requestHandler(requestCtx, opts, qwikSerializer) + const promise = requestHandler(requestCtx, opts) .then((rsp) => { if (rsp != null) { return rsp.completion.then((r) => { From 2f8a9ae6adfc5935f0975664b4a35b7de6cb9399 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Fri, 15 Aug 2025 17:35:21 +0200 Subject: [PATCH 02/14] fix(ssg): workaround for hanging after ssg --- .../src/adapters/shared/vite/index.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/qwik-router/src/adapters/shared/vite/index.ts b/packages/qwik-router/src/adapters/shared/vite/index.ts index ad910396d37..708e54926b4 100644 --- a/packages/qwik-router/src/adapters/shared/vite/index.ts +++ b/packages/qwik-router/src/adapters/shared/vite/index.ts @@ -195,6 +195,34 @@ export function viteAdapter(opts: ViteAdapterPluginOptions) { `\nSee https://qwik.dev/docs/deployments/#cache-headers for more information.` + `\n==============================================` ); + if (opts.ssg !== null) { + /** + * HACK: for some reason the build hangs after SSG. `why-is-node-running` shows 4 + * culprits: + * + * ``` + * There are 4 handle(s) keeping the process running. + * + * # CustomGC + * ./node_modules/.pnpm/lightningcss@1.30.1/node_modules/lightningcss/node/index.js:20 - module.exports = require(`lightningcss-${parts.join('-')}`); + * + * # CustomGC + * ./node_modules/.pnpm/@tailwindcss+oxide@4.1.12/node_modules/@tailwindcss/oxide/index.js:229 - return require('@tailwindcss/oxide-linux-x64-gnu') + * + * # Timeout + * node_modules/.vite-temp/vite.config.timestamp-1755270314169-a2a97ad5233f9.mjs:357 + * ./node_modules/.pnpm/vite@7.1.2_@types+node@24.3.0_jiti@2.5.1_lightningcss@1.30.1_terser@5.43.1_tsx@4.20.4_yaml@2.8.1/node_modules/vite/dist/node/chunks/dep-CMEinpL-.js:36657 - return (await import(pathToFileURL(tempFileName).href)).default; + * + * # CustomGC + * ./packages/qwik/dist/optimizer.mjs:1328 - const mod2 = module.default.createRequire(import.meta.url)(`../bindings/${triple.platformArchABI}`); + * ``` + * + * For now, we'll force exit the process after SSG with some delay. + */ + setTimeout(() => { + process.exit(0); + }, 5000).unref(); + } } }, }, From 90d281623860b08c8d156745c0e747f5ab76d838 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Fri, 22 Aug 2025 20:52:24 +0200 Subject: [PATCH 03/14] chore: remove bad unicode characters --- .../docs/(qwik)/components/context/index.mdx | 2 +- .../(qwikrouter)/html-attributes/index.mdx | 4 +- .../routes/docs/integrations/authjs/index.mdx | 4 +- .../docs/integrations/bootstrap/index.mdx | 2 +- patches/density-clustering@1.3.0.patch | 188 +++++++++--------- pnpm-lock.yaml | 6 +- 6 files changed, 103 insertions(+), 103 deletions(-) diff --git a/packages/docs/src/routes/docs/(qwik)/components/context/index.mdx b/packages/docs/src/routes/docs/(qwik)/components/context/index.mdx index 21b9d29c1d8..1e34a4196b8 100644 --- a/packages/docs/src/routes/docs/(qwik)/components/context/index.mdx +++ b/packages/docs/src/routes/docs/(qwik)/components/context/index.mdx @@ -117,7 +117,7 @@ export const Parent = component$(() => { - `ContextId`: A previously created Context must be supplied, serving as an identifier for the data being provided as the second parameter. -- `data`: You can provide any data type, such as Qwik's useSignal, useStore, arrays, or objects. +- `data`: You can provide any data type, such as Qwik's useSignal, useStore, arrays, or objects. ### Caveats diff --git a/packages/docs/src/routes/docs/(qwikrouter)/html-attributes/index.mdx b/packages/docs/src/routes/docs/(qwikrouter)/html-attributes/index.mdx index 2fc54c6d3ce..5d801008b1a 100644 --- a/packages/docs/src/routes/docs/(qwikrouter)/html-attributes/index.mdx +++ b/packages/docs/src/routes/docs/(qwikrouter)/html-attributes/index.mdx @@ -10,7 +10,7 @@ created_at: '2023-08-23T23:06:42Z' # HTML attributes -Occasionally, it is necessary to add attributes to a website to enable specific functionalities, such as controlling the application's theme, determining text direction with the `dir` attribute, or setting the page language with the `lang` attribute. Typically, adding these attributes to the HTML tag is practical since it generally serves as the application's container. +Occasionally, it is necessary to add attributes to a website to enable specific functionalities, such as controlling the application's theme, determining text direction with the `dir` attribute, or setting the page language with the `lang` attribute. Typically, adding these attributes to the HTML tag is practical since it generally serves as the application's container. To apply these attributes in Qwik router, add them to `containerAttributes` in the `src/entry.ssr.tsx` file: @@ -28,7 +28,7 @@ export default function (opts: RenderToStreamOptions) { } ``` -In addition, the `opts.serverData` object and nested objects allow you to access information about the request, including `request headers`, `url`, `route params`, and more. Leveraging this information enables you to do the following: +In addition, the `opts.serverData` object and nested objects allow you to access information about the request, including `request headers`, `url`, `route params`, and more. Leveraging this information enables you to do the following: ```tsx export default function (opts: RenderToStreamOptions) { diff --git a/packages/docs/src/routes/docs/integrations/authjs/index.mdx b/packages/docs/src/routes/docs/integrations/authjs/index.mdx index b3122ce4336..91c4d8c04a3 100644 --- a/packages/docs/src/routes/docs/integrations/authjs/index.mdx +++ b/packages/docs/src/routes/docs/integrations/authjs/index.mdx @@ -69,9 +69,9 @@ and create a new file named `plugin@auth.ts` with an example configuration. > **Note on Manual Deployments with Node** > When deploying applications manually using Node.js, particularly with frameworks like Express, the server or Node process does not inherently know if it's being served under HTTP or HTTPS. -> Unlike hosting services like Vercel, Netlify, or Cloudflare, where the ORIGIN configuration is automatically managed, manual setups require explicit specification. To ensure that your Node.js application recognizes the correct protocol and host it is being served under, set the following **environment variables**: +> Unlike hosting services like Vercel, Netlify, or Cloudflare, where the ORIGIN configuration is automatically managed, manual setups require explicit specification. To ensure that your Node.js application recognizes the correct protocol and host it is being served under, set the following **environment variables**: -> - ORIGIN: Set this to the URL of your application. For example: +> - ORIGIN: Set this to the URL of your application. For example: > ORIGIN=https://your-app-name.example.com > - PROTOCOL_HEADER: This is used to indicate the original protocol requested by the client. Commonly, this is specified in proxy configurations. Set this variable to: > PROTOCOL_HEADER=X-Forwarded-Proto diff --git a/packages/docs/src/routes/docs/integrations/bootstrap/index.mdx b/packages/docs/src/routes/docs/integrations/bootstrap/index.mdx index c25aa97c734..02ba701e124 100644 --- a/packages/docs/src/routes/docs/integrations/bootstrap/index.mdx +++ b/packages/docs/src/routes/docs/integrations/bootstrap/index.mdx @@ -67,7 +67,7 @@ It also adds new files inside to your project folder: ## After integrating Bootstrap -After integrating Bootstrap, you can access the /bootstrap/ route where you will find all the examples available for this integration. +After integrating Bootstrap, you can access the /bootstrap/ route where you will find all the examples available for this integration. ## Interesting info about Bootstrap diff --git a/patches/density-clustering@1.3.0.patch b/patches/density-clustering@1.3.0.patch index db7b1e49263..ce138923c9e 100644 --- a/patches/density-clustering@1.3.0.patch +++ b/patches/density-clustering@1.3.0.patch @@ -1,9 +1,9 @@ -diff --git a/.history/lib/DBSCAN_20231205115425.js b/.history/lib/DBSCAN_20231205115425.js -new file mode 100644 -index 0000000000000000000000000000000000000000..433b454c8d1e27ed951c7ba53052a4036e25f43d ---- /dev/null -+++ b/.history/lib/DBSCAN_20231205115425.js -@@ -0,0 +1,236 @@ +diff --git a/.history/lib/DBSCAN_20231205115425.js b/.history/lib/DBSCAN_20231205115425.js +new file mode 100644 +index 0000000000000000000000000000000000000000..433b454c8d1e27ed951c7ba53052a4036e25f43d +--- /dev/null ++++ b/.history/lib/DBSCAN_20231205115425.js +@@ -0,0 +1,236 @@ +/** + * DBSCAN - Density based clustering + * @@ -240,12 +240,12 @@ index 0000000000000000000000000000000000000000..433b454c8d1e27ed951c7ba53052a403 +if (typeof module !== 'undefined' && module.exports) { + module.exports = DBSCAN; +} -diff --git a/.history/lib/DBSCAN_20231205115515.js b/.history/lib/DBSCAN_20231205115515.js -new file mode 100644 -index 0000000000000000000000000000000000000000..54f8c4438faba26ebafd22ec9d7a228f6dfdef94 ---- /dev/null -+++ b/.history/lib/DBSCAN_20231205115515.js -@@ -0,0 +1,236 @@ +diff --git a/.history/lib/DBSCAN_20231205115515.js b/.history/lib/DBSCAN_20231205115515.js +new file mode 100644 +index 0000000000000000000000000000000000000000..54f8c4438faba26ebafd22ec9d7a228f6dfdef94 +--- /dev/null ++++ b/.history/lib/DBSCAN_20231205115515.js +@@ -0,0 +1,236 @@ +/** + * DBSCAN - Density based clustering + * @@ -482,12 +482,12 @@ index 0000000000000000000000000000000000000000..54f8c4438faba26ebafd22ec9d7a228f +if (module.exports) { + module.exports = DBSCAN; +} -diff --git a/.history/lib/DBSCAN_20231205115526.js b/.history/lib/DBSCAN_20231205115526.js -new file mode 100644 -index 0000000000000000000000000000000000000000..54f8c4438faba26ebafd22ec9d7a228f6dfdef94 ---- /dev/null -+++ b/.history/lib/DBSCAN_20231205115526.js -@@ -0,0 +1,236 @@ +diff --git a/.history/lib/DBSCAN_20231205115526.js b/.history/lib/DBSCAN_20231205115526.js +new file mode 100644 +index 0000000000000000000000000000000000000000..54f8c4438faba26ebafd22ec9d7a228f6dfdef94 +--- /dev/null ++++ b/.history/lib/DBSCAN_20231205115526.js +@@ -0,0 +1,236 @@ +/** + * DBSCAN - Density based clustering + * @@ -724,13 +724,13 @@ index 0000000000000000000000000000000000000000..54f8c4438faba26ebafd22ec9d7a228f +if (module.exports) { + module.exports = DBSCAN; +} -diff --git a/.history/lib/KMEANS_20231205115425.js b/.history/lib/KMEANS_20231205115425.js -new file mode 100644 -index 0000000000000000000000000000000000000000..21646f447f20fa710a7d855e597a9b9f9643b2f5 ---- /dev/null -+++ b/.history/lib/KMEANS_20231205115425.js -@@ -0,0 +1,213 @@ -+/** +diff --git a/.history/lib/KMEANS_20231205115425.js b/.history/lib/KMEANS_20231205115425.js +new file mode 100644 +index 0000000000000000000000000000000000000000..21646f447f20fa710a7d855e597a9b9f9643b2f5 +--- /dev/null ++++ b/.history/lib/KMEANS_20231205115425.js +@@ -0,0 +1,213 @@ ++ /** + * KMEANS clustering + * + * @author Lukasz Krawczyk @@ -943,13 +943,13 @@ index 0000000000000000000000000000000000000000..21646f447f20fa710a7d855e597a9b9f +if (typeof module !== 'undefined' && module.exports) { + module.exports = KMEANS; +} -diff --git a/.history/lib/KMEANS_20231205115515.js b/.history/lib/KMEANS_20231205115515.js -new file mode 100644 -index 0000000000000000000000000000000000000000..a6fab6e802b5ce7c9f7f8ac4183faff29181b22d ---- /dev/null -+++ b/.history/lib/KMEANS_20231205115515.js -@@ -0,0 +1,213 @@ -+/** +diff --git a/.history/lib/KMEANS_20231205115515.js b/.history/lib/KMEANS_20231205115515.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a6fab6e802b5ce7c9f7f8ac4183faff29181b22d +--- /dev/null ++++ b/.history/lib/KMEANS_20231205115515.js +@@ -0,0 +1,213 @@ ++ /** + * KMEANS clustering + * + * @author Lukasz Krawczyk @@ -1162,12 +1162,12 @@ index 0000000000000000000000000000000000000000..a6fab6e802b5ce7c9f7f8ac4183faff2 +if (module.exports) { + module.exports = KMEANS; +} -diff --git a/.history/lib/OPTICS_20231205115425.js b/.history/lib/OPTICS_20231205115425.js -new file mode 100644 -index 0000000000000000000000000000000000000000..867e081630c3a4ee2d2615d902642e11249f4981 ---- /dev/null -+++ b/.history/lib/OPTICS_20231205115425.js -@@ -0,0 +1,269 @@ +diff --git a/.history/lib/OPTICS_20231205115425.js b/.history/lib/OPTICS_20231205115425.js +new file mode 100644 +index 0000000000000000000000000000000000000000..867e081630c3a4ee2d2615d902642e11249f4981 +--- /dev/null ++++ b/.history/lib/OPTICS_20231205115425.js +@@ -0,0 +1,269 @@ + +/** + * @requires ./PriorityQueue.js @@ -1437,12 +1437,12 @@ index 0000000000000000000000000000000000000000..867e081630c3a4ee2d2615d902642e11 +if (typeof module !== 'undefined' && module.exports) { + module.exports = OPTICS; +} -diff --git a/.history/lib/OPTICS_20231205115515.js b/.history/lib/OPTICS_20231205115515.js -new file mode 100644 -index 0000000000000000000000000000000000000000..1a2f86f294a6ee1589272cb7d20fe4fa697cc62c ---- /dev/null -+++ b/.history/lib/OPTICS_20231205115515.js -@@ -0,0 +1,269 @@ +diff --git a/.history/lib/OPTICS_20231205115515.js b/.history/lib/OPTICS_20231205115515.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1a2f86f294a6ee1589272cb7d20fe4fa697cc62c +--- /dev/null ++++ b/.history/lib/OPTICS_20231205115515.js +@@ -0,0 +1,269 @@ + +/** + * @requires ./PriorityQueue.js @@ -1712,12 +1712,12 @@ index 0000000000000000000000000000000000000000..1a2f86f294a6ee1589272cb7d20fe4fa +if (module.exports) { + module.exports = OPTICS; +} -diff --git a/.history/lib/PriorityQueue_20231205115425.js b/.history/lib/PriorityQueue_20231205115425.js -new file mode 100644 -index 0000000000000000000000000000000000000000..beda2305bf1585d672f92c93a55391c393dac43d ---- /dev/null -+++ b/.history/lib/PriorityQueue_20231205115425.js -@@ -0,0 +1,180 @@ +diff --git a/.history/lib/PriorityQueue_20231205115425.js b/.history/lib/PriorityQueue_20231205115425.js +new file mode 100644 +index 0000000000000000000000000000000000000000..beda2305bf1585d672f92c93a55391c393dac43d +--- /dev/null ++++ b/.history/lib/PriorityQueue_20231205115425.js +@@ -0,0 +1,180 @@ +/** + * PriorityQueue + * Elements in this queue are sorted according to their value @@ -1898,12 +1898,12 @@ index 0000000000000000000000000000000000000000..beda2305bf1585d672f92c93a55391c3 +if (typeof module !== 'undefined' && module.exports) { + module.exports = PriorityQueue; +} -diff --git a/.history/lib/PriorityQueue_20231205115515.js b/.history/lib/PriorityQueue_20231205115515.js -new file mode 100644 -index 0000000000000000000000000000000000000000..23be5a7061c311446a76fca1e17fd68539738648 ---- /dev/null -+++ b/.history/lib/PriorityQueue_20231205115515.js -@@ -0,0 +1,180 @@ +diff --git a/.history/lib/PriorityQueue_20231205115515.js b/.history/lib/PriorityQueue_20231205115515.js +new file mode 100644 +index 0000000000000000000000000000000000000000..23be5a7061c311446a76fca1e17fd68539738648 +--- /dev/null ++++ b/.history/lib/PriorityQueue_20231205115515.js +@@ -0,0 +1,180 @@ +/** + * PriorityQueue + * Elements in this queue are sorted according to their value @@ -2084,12 +2084,12 @@ index 0000000000000000000000000000000000000000..23be5a7061c311446a76fca1e17fd685 +if (module.exports) { + module.exports = PriorityQueue; +} -diff --git a/.history/lib/index_20231205115425.js b/.history/lib/index_20231205115425.js -new file mode 100644 -index 0000000000000000000000000000000000000000..a9c5d52a2d5dde2a22ba5f03e54abf3b68f796d8 ---- /dev/null -+++ b/.history/lib/index_20231205115425.js -@@ -0,0 +1,9 @@ +diff --git a/.history/lib/index_20231205115425.js b/.history/lib/index_20231205115425.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a9c5d52a2d5dde2a22ba5f03e54abf3b68f796d8 +--- /dev/null ++++ b/.history/lib/index_20231205115425.js +@@ -0,0 +1,9 @@ + +if (typeof module !== 'undefined' && module.exports) { + module.exports = { @@ -2099,12 +2099,12 @@ index 0000000000000000000000000000000000000000..a9c5d52a2d5dde2a22ba5f03e54abf3b + PriorityQueue: require('./PriorityQueue.js') + }; +} -diff --git a/.history/lib/index_20231205115515.js b/.history/lib/index_20231205115515.js -new file mode 100644 -index 0000000000000000000000000000000000000000..b5a7a8cc312a1c0468259231a06641211c8e11cc ---- /dev/null -+++ b/.history/lib/index_20231205115515.js -@@ -0,0 +1,9 @@ +diff --git a/.history/lib/index_20231205115515.js b/.history/lib/index_20231205115515.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b5a7a8cc312a1c0468259231a06641211c8e11cc +--- /dev/null ++++ b/.history/lib/index_20231205115515.js +@@ -0,0 +1,9 @@ + +if (module.exports) { + module.exports = { @@ -2114,11 +2114,11 @@ index 0000000000000000000000000000000000000000..b5a7a8cc312a1c0468259231a0664121 + PriorityQueue: require('./PriorityQueue.js') + }; +} -diff --git a/lib/DBSCAN.js b/lib/DBSCAN.js -index 433b454c8d1e27ed951c7ba53052a4036e25f43d..54f8c4438faba26ebafd22ec9d7a228f6dfdef94 100644 ---- a/lib/DBSCAN.js -+++ b/lib/DBSCAN.js -@@ -231,6 +231,6 @@ DBSCAN.prototype._euclideanDistance = function(p, q) { +diff --git a/lib/DBSCAN.js b/lib/DBSCAN.js +index 433b454c8d1e27ed951c7ba53052a4036e25f43d..54f8c4438faba26ebafd22ec9d7a228f6dfdef94 100644 +--- a/lib/DBSCAN.js ++++ b/lib/DBSCAN.js +@@ -231,6 +231,6 @@ DBSCAN.prototype._euclideanDistance = function(p, q) { return Math.sqrt(sum); }; @@ -2126,11 +2126,11 @@ index 433b454c8d1e27ed951c7ba53052a4036e25f43d..54f8c4438faba26ebafd22ec9d7a228f +if (module.exports) { module.exports = DBSCAN; } -diff --git a/lib/KMEANS.js b/lib/KMEANS.js -index 21646f447f20fa710a7d855e597a9b9f9643b2f5..a6fab6e802b5ce7c9f7f8ac4183faff29181b22d 100644 ---- a/lib/KMEANS.js -+++ b/lib/KMEANS.js -@@ -208,6 +208,6 @@ KMEANS.prototype.distance = function(p, q) { +diff --git a/lib/KMEANS.js b/lib/KMEANS.js +index 21646f447f20fa710a7d855e597a9b9f9643b2f5..a6fab6e802b5ce7c9f7f8ac4183faff29181b22d 100644 +--- a/lib/KMEANS.js ++++ b/lib/KMEANS.js +@@ -208,6 +208,6 @@ KMEANS.prototype.distance = function(p, q) { return Math.sqrt(sum); }; @@ -2138,11 +2138,11 @@ index 21646f447f20fa710a7d855e597a9b9f9643b2f5..a6fab6e802b5ce7c9f7f8ac4183faff2 +if (module.exports) { module.exports = KMEANS; } -diff --git a/lib/OPTICS.js b/lib/OPTICS.js -index 867e081630c3a4ee2d2615d902642e11249f4981..1a2f86f294a6ee1589272cb7d20fe4fa697cc62c 100644 ---- a/lib/OPTICS.js -+++ b/lib/OPTICS.js -@@ -3,7 +3,7 @@ +diff --git a/lib/OPTICS.js b/lib/OPTICS.js +index 867e081630c3a4ee2d2615d902642e11249f4981..1a2f86f294a6ee1589272cb7d20fe4fa697cc62c 100644 +--- a/lib/OPTICS.js ++++ b/lib/OPTICS.js +@@ -3,7 +3,7 @@ * @requires ./PriorityQueue.js */ @@ -2151,7 +2151,7 @@ index 867e081630c3a4ee2d2615d902642e11249f4981..1a2f86f294a6ee1589272cb7d20fe4fa var PriorityQueue = require('./PriorityQueue.js'); } -@@ -264,6 +264,6 @@ OPTICS.prototype._euclideanDistance = function(p, q) { +@@ -264,6 +264,6 @@ OPTICS.prototype._euclideanDistance = function(p, q) { return Math.sqrt(sum); }; @@ -2159,11 +2159,11 @@ index 867e081630c3a4ee2d2615d902642e11249f4981..1a2f86f294a6ee1589272cb7d20fe4fa +if (module.exports) { module.exports = OPTICS; } -diff --git a/lib/PriorityQueue.js b/lib/PriorityQueue.js -index beda2305bf1585d672f92c93a55391c393dac43d..23be5a7061c311446a76fca1e17fd68539738648 100644 ---- a/lib/PriorityQueue.js -+++ b/lib/PriorityQueue.js -@@ -175,6 +175,6 @@ PriorityQueue.prototype._insertAt = function(ele, priority, index) { +diff --git a/lib/PriorityQueue.js b/lib/PriorityQueue.js +index beda2305bf1585d672f92c93a55391c393dac43d..23be5a7061c311446a76fca1e17fd68539738648 100644 +--- a/lib/PriorityQueue.js ++++ b/lib/PriorityQueue.js +@@ -175,6 +175,6 @@ PriorityQueue.prototype._insertAt = function(ele, priority, index) { } }; @@ -2171,11 +2171,11 @@ index beda2305bf1585d672f92c93a55391c393dac43d..23be5a7061c311446a76fca1e17fd685 +if (module.exports) { module.exports = PriorityQueue; } -diff --git a/lib/index.js b/lib/index.js -index a9c5d52a2d5dde2a22ba5f03e54abf3b68f796d8..b5a7a8cc312a1c0468259231a06641211c8e11cc 100644 ---- a/lib/index.js -+++ b/lib/index.js -@@ -1,5 +1,5 @@ +diff --git a/lib/index.js b/lib/index.js +index a9c5d52a2d5dde2a22ba5f03e54abf3b68f796d8..b5a7a8cc312a1c0468259231a06641211c8e11cc 100644 +--- a/lib/index.js ++++ b/lib/index.js +@@ -1,5 +1,5 @@ -if (typeof module !== 'undefined' && module.exports) { +if (module.exports) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2bbcab7aa37..c795d013f36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ overrides: patchedDependencies: density-clustering@1.3.0: - hash: paref3ytou2g7wggtennsfvlli + hash: mnbcvyb7fvcqj6bvpy5biobbky path: patches/density-clustering@1.3.0.patch importers: @@ -470,7 +470,7 @@ importers: version: 0.10.1 density-clustering: specifier: ^1.3.0 - version: 1.3.0(patch_hash=paref3ytou2g7wggtennsfvlli) + version: 1.3.0(patch_hash=mnbcvyb7fvcqj6bvpy5biobbky) dotenv: specifier: ^16.5.0 version: 16.5.0 @@ -13558,7 +13558,7 @@ snapshots: delegates@1.0.0: {} - density-clustering@1.3.0(patch_hash=paref3ytou2g7wggtennsfvlli): {} + density-clustering@1.3.0(patch_hash=mnbcvyb7fvcqj6bvpy5biobbky): {} depd@1.1.2: {} From 82e76521d58e4f7802cdff68cabf8d48e7c0c71a Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Sun, 31 Aug 2025 11:48:17 +0200 Subject: [PATCH 04/14] fix(router): no html 404 unless wanted --- packages/qwik-router/src/middleware/azure-swa/index.ts | 7 ++++--- packages/qwik-router/src/middleware/bun/index.ts | 8 +++++--- .../qwik-router/src/middleware/cloudflare-pages/index.ts | 8 +++++--- packages/qwik-router/src/middleware/deno/index.ts | 8 +++++--- packages/qwik-router/src/middleware/netlify-edge/index.ts | 8 +++++--- packages/qwik-router/src/middleware/node/index.ts | 7 ++++--- packages/qwik-router/src/middleware/vercel-edge/index.ts | 8 +++++--- 7 files changed, 33 insertions(+), 21 deletions(-) diff --git a/packages/qwik-router/src/middleware/azure-swa/index.ts b/packages/qwik-router/src/middleware/azure-swa/index.ts index f395ae6ad8d..9b0c6dfa0f8 100644 --- a/packages/qwik-router/src/middleware/azure-swa/index.ts +++ b/packages/qwik-router/src/middleware/azure-swa/index.ts @@ -128,9 +128,10 @@ export function createQwikRouter(opts: QwikRouterAzureOptions): AzureFunction { // In the development server, we replace the getNotFound function // For static paths, we assign a static "Not Found" message. // This ensures consistency between development and production environments for specific URLs. - const notFoundHtml = isStaticPath(req.method || 'GET', url) - ? 'Not Found' - : getNotFound(url.pathname); + const notFoundHtml = + !req.headers.accept?.includes('text/html') || isStaticPath(req.method || 'GET', url) + ? 'Not Found' + : getNotFound(url.pathname); return { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8', 'X-Not-Found': url.pathname }, diff --git a/packages/qwik-router/src/middleware/bun/index.ts b/packages/qwik-router/src/middleware/bun/index.ts index 510aaa9077a..1da3437b2a2 100644 --- a/packages/qwik-router/src/middleware/bun/index.ts +++ b/packages/qwik-router/src/middleware/bun/index.ts @@ -103,9 +103,11 @@ export function createQwikRouter(opts: QwikRouterBunOptions) { // In the development server, we replace the getNotFound function // For static paths, we assign a static "Not Found" message. // This ensures consistency between development and production environments for specific URLs. - const notFoundHtml = isStaticPath(request.method || 'GET', url) - ? 'Not Found' - : getNotFound(url.pathname); + const notFoundHtml = + !request.headers.get('accept')?.includes('text/html') || + isStaticPath(request.method || 'GET', url) + ? 'Not Found' + : getNotFound(url.pathname); return new Response(notFoundHtml, { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8', 'X-Not-Found': url.pathname }, diff --git a/packages/qwik-router/src/middleware/cloudflare-pages/index.ts b/packages/qwik-router/src/middleware/cloudflare-pages/index.ts index fc463385504..668c195b4d4 100644 --- a/packages/qwik-router/src/middleware/cloudflare-pages/index.ts +++ b/packages/qwik-router/src/middleware/cloudflare-pages/index.ts @@ -115,9 +115,11 @@ export function createQwikRouter(opts: QwikRouterCloudflarePagesOptions) { // In the development server, we replace the getNotFound function // For static paths, we assign a static "Not Found" message. // This ensures consistency between development and production environments for specific URLs. - const notFoundHtml = isStaticPath(request.method || 'GET', url) - ? 'Not Found' - : getNotFound(url.pathname); + const notFoundHtml = + !request.headers.get('accept')?.includes('text/html') || + isStaticPath(request.method || 'GET', url) + ? 'Not Found' + : getNotFound(url.pathname); return new Response(notFoundHtml, { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8', 'X-Not-Found': url.pathname }, diff --git a/packages/qwik-router/src/middleware/deno/index.ts b/packages/qwik-router/src/middleware/deno/index.ts index 8d3ccd3f2ab..e4e1849cc07 100644 --- a/packages/qwik-router/src/middleware/deno/index.ts +++ b/packages/qwik-router/src/middleware/deno/index.ts @@ -104,9 +104,11 @@ export function createQwikRouter(opts: QwikRouterDenoOptions) { // In the development server, we replace the getNotFound function // For static paths, we assign a static "Not Found" message. // This ensures consistency between development and production environments for specific URLs. - const notFoundHtml = isStaticPath(request.method || 'GET', url) - ? 'Not Found' - : getNotFound(url.pathname); + const notFoundHtml = + !request.headers.get('accept')?.includes('text/html') || + isStaticPath(request.method || 'GET', url) + ? 'Not Found' + : getNotFound(url.pathname); return new Response(notFoundHtml, { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8', 'X-Not-Found': url.pathname }, diff --git a/packages/qwik-router/src/middleware/netlify-edge/index.ts b/packages/qwik-router/src/middleware/netlify-edge/index.ts index 54982702c32..ca49a4d6a8c 100644 --- a/packages/qwik-router/src/middleware/netlify-edge/index.ts +++ b/packages/qwik-router/src/middleware/netlify-edge/index.ts @@ -77,9 +77,11 @@ export function createQwikRouter(opts: QwikRouterNetlifyOptions) { // In the development server, we replace the getNotFound function // For static paths, we assign a static "Not Found" message. // This ensures consistency between development and production environments for specific URLs. - const notFoundHtml = isStaticPath(request.method || 'GET', url) - ? 'Not Found' - : getNotFound(url.pathname); + const notFoundHtml = + !request.headers.get('accept')?.includes('text/html') || + isStaticPath(request.method || 'GET', url) + ? 'Not Found' + : getNotFound(url.pathname); return new Response(notFoundHtml, { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8', 'X-Not-Found': url.pathname }, diff --git a/packages/qwik-router/src/middleware/node/index.ts b/packages/qwik-router/src/middleware/node/index.ts index a09764ca540..ce63c6a5ed5 100644 --- a/packages/qwik-router/src/middleware/node/index.ts +++ b/packages/qwik-router/src/middleware/node/index.ts @@ -72,9 +72,10 @@ export function createQwikRouter(opts: QwikRouterNodeRequestOptions | QwikCityNo // In the development server, we replace the getNotFound function // For static paths, we assign a static "Not Found" message. // This ensures consistency between development and production environments for specific URLs. - const notFoundHtml = isStaticPath(req.method || 'GET', url) - ? 'Not Found' - : getNotFound(url.pathname); + const notFoundHtml = + !req.headers.accept?.includes('text/html') || isStaticPath(req.method || 'GET', url) + ? 'Not Found' + : getNotFound(url.pathname); res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8', 'X-Not-Found': url.pathname, diff --git a/packages/qwik-router/src/middleware/vercel-edge/index.ts b/packages/qwik-router/src/middleware/vercel-edge/index.ts index 5795ccba2b3..d28c7312c03 100644 --- a/packages/qwik-router/src/middleware/vercel-edge/index.ts +++ b/packages/qwik-router/src/middleware/vercel-edge/index.ts @@ -104,9 +104,11 @@ export function createQwikRouter(opts: QwikRouterVercelEdgeOptions) { // In the development server, we replace the getNotFound function // For static paths, we assign a static "Not Found" message. // This ensures consistency between development and production environments for specific URLs. - const notFoundHtml = isStaticPath(request.method || 'GET', url) - ? 'Not Found' - : getNotFound(url.pathname); + const notFoundHtml = + !request.headers.get('accept')?.includes('text/html') || + isStaticPath(request.method || 'GET', url) + ? 'Not Found' + : getNotFound(url.pathname); return new Response(notFoundHtml, { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8', 'X-Not-Found': url.pathname }, From 17f35c4958b1221104b974a6736551c7adfbb12e Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Fri, 15 Aug 2025 00:21:04 +0200 Subject: [PATCH 05/14] fix(router): more external deps, remove core from vite plugin still gets core via dev server --- package.json | 1 + packages/docs/package.json | 10 +- packages/qwik-router/package.json | 50 +- .../src/adapters/netlify-edge/vite/index.ts | 3 +- .../qwik-router/src/runtime/src/deepFreeze.ts | 13 + .../qwik-router/src/runtime/src/routing.ts | 2 +- .../src/runtime/src/server-functions.ts | 2 +- packages/qwik-router/src/runtime/src/utils.ts | 14 - packages/qwik-router/src/ssg/index.ts | 26 +- .../qwik/src/optimizer/src/plugins/vite.ts | 8 +- pnpm-lock.yaml | 257 +++--- scripts/qwik-router.ts | 871 +++++------------- 12 files changed, 420 insertions(+), 837 deletions(-) create mode 100644 packages/qwik-router/src/runtime/src/deepFreeze.ts diff --git a/package.json b/package.json index ec9c9d2f795..b6ca9bd7539 100644 --- a/package.json +++ b/package.json @@ -177,6 +177,7 @@ "overrides": { "@builder.io/qwik": "npm:@qwik.dev/core@*", "@builder.io/qwik-city": "npm:@qwik.dev/router", + "@types/estree": "1.0.8", "prettier": "3.6.2", "typescript": "5.8.3", "vfile": "6.0.3" diff --git a/packages/docs/package.json b/packages/docs/package.json index 4760bf015e4..0bce1b53282 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -19,10 +19,10 @@ "@qwik.dev/partytown": "0.11.2", "@qwik.dev/react": "workspace:*", "@qwik.dev/router": "workspace:*", - "@shikijs/colorized-brackets": "3.9.1", - "@shikijs/rehype": "3.9.1", - "@shikijs/transformers": "3.9.1", - "@shikijs/types": "3.9.1", + "@shikijs/colorized-brackets": "3.9.2", + "@shikijs/rehype": "3.9.2", + "@shikijs/transformers": "3.9.2", + "@shikijs/types": "3.9.2", "@supabase/supabase-js": "2.53.0", "@tailwindcss/vite": "4.1.11", "@types/leaflet": "1.9.20", @@ -44,7 +44,7 @@ "qwik-image": "0.0.16", "react": "18.3.1", "react-dom": "18.3.1", - "shiki": "3.9.1", + "shiki": "3.9.2", "snarkdown": "2.0.0", "tailwindcss": "4.1.11", "terser": "5.43.1", diff --git a/packages/qwik-router/package.json b/packages/qwik-router/package.json index eece9779d81..6734bc0dea7 100644 --- a/packages/qwik-router/package.json +++ b/packages/qwik-router/package.json @@ -4,44 +4,42 @@ "version": "2.0.0-beta.8", "bugs": "https://github.com/QwikDev/qwik/issues", "dependencies": { + "@azure/functions": "3.5.1", "@mdx-js/mdx": "^3.1.0", + "@netlify/edge-functions": "^2.17.0", "@types/mdx": "^2.0.13", + "estree-util-value-to-estree": "^3.4.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^2.1.1", + "hast-util-to-string": "^2.0.0", + "kleur": "^4.1.5", + "marked": "^12.0.2", + "mdast-util-mdx": "^3.0.0", + "refractor": "^4.8.1", + "rehype-autolink-headings": "^7.1.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "set-cookie-parser": "^2.7.1", "source-map": "^0.7.4", "svgo": "^3.3.2", - "undici": "*", + "typescript": "^5.8.3", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", "valibot": ">=0.36.0 <2", - "vfile": "6.0.3", + "vfile": "^6.0.3", "vite-imagetools": "^7.1.0", - "zod": "3.25.48" + "yaml": "^2.6.1", + "zod": "^3.25.40" }, "devDependencies": { - "@azure/functions": "3.5.1", - "@microsoft/api-extractor": "7.52.10", - "@netlify/edge-functions": "2.17.0", "@qwik.dev/core": "workspace:*", + "@microsoft/api-extractor": "7.52.10", "@types/mdast": "4.0.4", "@types/node": "24.2.1", "@types/refractor": "3.4.1", "@types/set-cookie-parser": "2.4.10", - "estree-util-value-to-estree": "3.4.0", - "github-slugger": "2.0.0", - "hast-util-heading-rank": "2.1.1", - "hast-util-to-string": "2.0.0", - "kleur": "4.1.5", - "marked": "12.0.2", - "mdast-util-mdx": "3.0.0", - "refractor": "4.8.1", - "rehype-autolink-headings": "7.1.0", - "remark-frontmatter": "5.0.0", - "remark-gfm": "4.0.1", - "set-cookie-parser": "2.7.1", "tsm": "2.3.0", - "typescript": "5.8.3", - "unified": "11.0.5", - "unist-util-visit": "5.0.0", - "uvu": "0.5.6", - "vite": "7.1.0", - "yaml": "2.6.1" + "uvu": "0.5.6" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -186,6 +184,10 @@ "homepage": "https://qwik.dev/", "license": "MIT", "main": "./lib/index.qwik.mjs", + "peerDependencies": { + "@qwik.dev/core": "workspace:^", + "vite": ">=5 <8" + }, "publishConfig": { "access": "public" }, diff --git a/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts b/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts index 0261b4fa485..26dbade0b40 100644 --- a/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts +++ b/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts @@ -1,4 +1,3 @@ -import { basePathname } from '@qwik-router-config'; import type { SsgRenderOptions } from 'packages/qwik-router/src/ssg'; import fs, { existsSync } from 'node:fs'; import { join } from 'node:path'; @@ -39,7 +38,7 @@ export function netlifyEdgeAdapter(opts: NetlifyEdgeAdapterOptions = {}): any { }; }, - async generate({ serverOutDir }) { + async generate({ serverOutDir, basePathname }) { if (opts.functionRoutes !== false) { // https://docs.netlify.com/edge-functions/create-integration/#generate-declarations diff --git a/packages/qwik-router/src/runtime/src/deepFreeze.ts b/packages/qwik-router/src/runtime/src/deepFreeze.ts new file mode 100644 index 00000000000..5fe48422008 --- /dev/null +++ b/packages/qwik-router/src/runtime/src/deepFreeze.ts @@ -0,0 +1,13 @@ +export const deepFreeze = (obj: any) => { + if (obj == null) { + return obj; + } + Object.getOwnPropertyNames(obj).forEach((prop) => { + const value = obj[prop]; + // we assume that a frozen object is a circular reference and fully deep frozen + if (value && typeof value === 'object' && !Object.isFrozen(value)) { + deepFreeze(value); + } + }); + return Object.freeze(obj); +}; diff --git a/packages/qwik-router/src/runtime/src/routing.ts b/packages/qwik-router/src/runtime/src/routing.ts index 0412bb8ed95..bf14faebf3f 100644 --- a/packages/qwik-router/src/runtime/src/routing.ts +++ b/packages/qwik-router/src/runtime/src/routing.ts @@ -11,7 +11,7 @@ import { RouteDataProp, type RouteModule, } from './types'; -import { deepFreeze } from './utils'; +import { deepFreeze } from './deepFreeze'; /** LoadRoute() runs in both client and server. */ export const loadRoute = async ( diff --git a/packages/qwik-router/src/runtime/src/server-functions.ts b/packages/qwik-router/src/runtime/src/server-functions.ts index fafddd70ab2..323486d30a1 100644 --- a/packages/qwik-router/src/runtime/src/server-functions.ts +++ b/packages/qwik-router/src/runtime/src/server-functions.ts @@ -64,7 +64,7 @@ import type { import { useAction, useLocation, useQwikRouterEnv } from './use-functions'; import type { FormSubmitCompletedDetail } from './form-component'; -import { deepFreeze } from './utils'; +import { deepFreeze } from './deepFreeze'; /** @internal */ export const routeActionQrl = (( diff --git a/packages/qwik-router/src/runtime/src/utils.ts b/packages/qwik-router/src/runtime/src/utils.ts index 1f0df86e857..4d8ee6bd871 100644 --- a/packages/qwik-router/src/runtime/src/utils.ts +++ b/packages/qwik-router/src/runtime/src/utils.ts @@ -88,20 +88,6 @@ export const isPromise = (value: any): value is Promise => { return value && typeof value.then === 'function'; }; -export const deepFreeze = (obj: any) => { - if (obj == null) { - return obj; - } - Object.getOwnPropertyNames(obj).forEach((prop) => { - const value = obj[prop]; - // we assume that a frozen object is a circular reference and fully deep frozen - if (value && typeof value === 'object' && !Object.isFrozen(value)) { - deepFreeze(value); - } - }); - return Object.freeze(obj); -}; - export const createLoaderSignal = ( loadersObject: Record, loaderId: string, diff --git a/packages/qwik-router/src/ssg/index.ts b/packages/qwik-router/src/ssg/index.ts index 4bdcc82a8ea..4f34acbc971 100644 --- a/packages/qwik-router/src/ssg/index.ts +++ b/packages/qwik-router/src/ssg/index.ts @@ -10,7 +10,7 @@ import type { SsgOptions, SsgRenderOptions, SsgResult } from './types'; */ export async function generate(opts: SsgOptions) { const ssgPlatform = await getEntryModule(); - const result: SsgResult = await ssgPlatform.generate(opts); + const result: SsgResult = (await ssgPlatform.generate(opts)) as any; return result; } @@ -20,27 +20,16 @@ export type { SsgResult as StaticGenerateResult, }; -function getEntryModulePath() { +function getEntryModule() { if (isDeno()) { - return './deno.mjs'; + return import('./deno'); } - if (isNode() || isBun()) { - if (isCjs()) { - return './node.cjs'; - } - return './node.mjs'; + if (isBun() || isNode()) { + return import('./node'); } throw new Error(`Unsupported platform`); } -function getEntryModule() { - const entryModule = getEntryModulePath(); - if (isCjs()) { - return require(entryModule); - } - return import(entryModule); -} - function isDeno() { return typeof Deno !== 'undefined'; } @@ -53,10 +42,5 @@ function isNode() { return !isBun() && !isDeno() && typeof process !== 'undefined' && !!process.versions?.node; } -function isCjs() { - const req = 'require'; - return isNode() && typeof globalThis[req] === 'function'; -} - declare const Deno: any; declare const Bun: any; diff --git a/packages/qwik/src/optimizer/src/plugins/vite.ts b/packages/qwik/src/optimizer/src/plugins/vite.ts index 9b04541c257..d1e21f77029 100644 --- a/packages/qwik/src/optimizer/src/plugins/vite.ts +++ b/packages/qwik/src/optimizer/src/plugins/vite.ts @@ -356,13 +356,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { async configResolved(config) { basePathname = config.base; if (!(basePathname.startsWith('/') && basePathname.endsWith('/'))) { - // TODO v2: make this an error - console.error( - `warning: vite's config.base must begin and end with /. This will be an error in v2. If you have a valid use case, please open an issue.` - ); - if (!basePathname.endsWith('/')) { - basePathname += '/'; - } + throw new Error(`vite's config.base must begin and end with /`); } const useSourcemap = !!config.build.sourcemap; if (useSourcemap && qwikViteOpts.optimizerOptions?.sourcemap === undefined) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c795d013f36..b20a1e0f6d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,7 @@ settings: overrides: '@builder.io/qwik': npm:@qwik.dev/core@* '@builder.io/qwik-city': npm:@qwik.dev/router + '@types/estree': 1.0.8 prettier: 3.6.2 typescript: 5.8.3 vfile: 6.0.3 @@ -318,17 +319,17 @@ importers: specifier: workspace:* version: link:../qwik-router '@shikijs/colorized-brackets': - specifier: 3.9.1 - version: 3.9.1 + specifier: 3.9.2 + version: 3.9.2 '@shikijs/rehype': - specifier: 3.9.1 - version: 3.9.1 + specifier: 3.9.2 + version: 3.9.2 '@shikijs/transformers': - specifier: 3.9.1 - version: 3.9.1 + specifier: 3.9.2 + version: 3.9.2 '@shikijs/types': - specifier: 3.9.1 - version: 3.9.1 + specifier: 3.9.2 + version: 3.9.2 '@supabase/supabase-js': specifier: 2.53.0 version: 2.53.0 @@ -393,8 +394,8 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) shiki: - specifier: 3.9.1 - version: 3.9.1 + specifier: 3.9.2 + version: 3.9.2 snarkdown: specifier: 2.0.0 version: 2.0.0 @@ -616,21 +617,69 @@ importers: packages/qwik-router: dependencies: + '@azure/functions': + specifier: 3.5.1 + version: 3.5.1 '@mdx-js/mdx': specifier: ^3.1.0 version: 3.1.0(acorn@8.15.0) + '@netlify/edge-functions': + specifier: ^2.17.0 + version: 2.17.0 '@types/mdx': specifier: ^2.0.13 version: 2.0.13 + estree-util-value-to-estree: + specifier: ^3.4.0 + version: 3.4.0 + github-slugger: + specifier: ^2.0.0 + version: 2.0.0 + hast-util-heading-rank: + specifier: ^2.1.1 + version: 2.1.1 + hast-util-to-string: + specifier: ^2.0.0 + version: 2.0.0 + kleur: + specifier: ^4.1.5 + version: 4.1.5 + marked: + specifier: ^12.0.2 + version: 12.0.2 + mdast-util-mdx: + specifier: ^3.0.0 + version: 3.0.0 + refractor: + specifier: ^4.8.1 + version: 4.8.1 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + remark-frontmatter: + specifier: ^5.0.0 + version: 5.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + set-cookie-parser: + specifier: ^2.7.1 + version: 2.7.1 source-map: specifier: ^0.7.4 version: 0.7.4 svgo: specifier: ^3.3.2 version: 3.3.2 - undici: - specifier: '*' - version: 6.18.2 + typescript: + specifier: 5.8.3 + version: 5.8.3 + unified: + specifier: ^11.0.5 + version: 11.0.5 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 valibot: specifier: '>=0.36.0 <2' version: 0.42.1(typescript@5.8.3) @@ -640,19 +689,16 @@ importers: vite-imagetools: specifier: ^7.1.0 version: 7.1.0(rollup@4.46.2) + yaml: + specifier: ^2.6.1 + version: 2.6.1 zod: - specifier: 3.25.48 + specifier: ^3.25.40 version: 3.25.48 devDependencies: - '@azure/functions': - specifier: 3.5.1 - version: 3.5.1 '@microsoft/api-extractor': specifier: 7.52.10 version: 7.52.10(@types/node@24.2.1) - '@netlify/edge-functions': - specifier: 2.17.0 - version: 2.17.0 '@qwik.dev/core': specifier: workspace:* version: link:../qwik @@ -668,63 +714,12 @@ importers: '@types/set-cookie-parser': specifier: 2.4.10 version: 2.4.10 - estree-util-value-to-estree: - specifier: 3.4.0 - version: 3.4.0 - github-slugger: - specifier: 2.0.0 - version: 2.0.0 - hast-util-heading-rank: - specifier: 2.1.1 - version: 2.1.1 - hast-util-to-string: - specifier: 2.0.0 - version: 2.0.0 - kleur: - specifier: 4.1.5 - version: 4.1.5 - marked: - specifier: 12.0.2 - version: 12.0.2 - mdast-util-mdx: - specifier: 3.0.0 - version: 3.0.0 - refractor: - specifier: 4.8.1 - version: 4.8.1 - rehype-autolink-headings: - specifier: 7.1.0 - version: 7.1.0 - remark-frontmatter: - specifier: 5.0.0 - version: 5.0.0 - remark-gfm: - specifier: 4.0.1 - version: 4.0.1 - set-cookie-parser: - specifier: 2.7.1 - version: 2.7.1 tsm: specifier: 2.3.0 version: 2.3.0 - typescript: - specifier: 5.8.3 - version: 5.8.3 - unified: - specifier: 11.0.5 - version: 11.0.5 - unist-util-visit: - specifier: 5.0.0 - version: 5.0.0 uvu: specifier: 0.5.6 version: 0.5.6 - vite: - specifier: 7.1.0 - version: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) - yaml: - specifier: 2.6.1 - version: 2.6.1 packages/supabase-auth-helpers-qwik: devDependencies: @@ -2926,32 +2921,32 @@ packages: '@rushstack/ts-command-line@5.0.2': resolution: {integrity: sha512-+AkJDbu1GFMPIU8Sb7TLVXDv/Q7Mkvx+wAjEl8XiXVVq+p1FmWW6M3LYpJMmoHNckSofeMecgWg5lfMwNAAsEQ==} - '@shikijs/colorized-brackets@3.9.1': - resolution: {integrity: sha512-t8tytUMzd/cU8IxMKsMZPfAGQdIo1u5SkRI2pa1UAaJp3gdfXPtSdn+MKmcmyHrn2sjVp8/ESUykqPqTZJ9glg==} + '@shikijs/colorized-brackets@3.9.2': + resolution: {integrity: sha512-8VWAlrJbalZuMEFCHYcpLFvSC7lTDe5rlLAlF60TEicVb5V9WkijCWKV726rnbHUpigJOajbdOhOpFHgRl/6UA==} - '@shikijs/core@3.9.1': - resolution: {integrity: sha512-W5Vwen0KJCtR7KFRo+3JLGAqLUPsfW7e+wZ4yaRBGIogwI9ZlnkpRm9ZV8JtfzMxOkIwZwMmmN0hNErLtm3AYg==} + '@shikijs/core@3.9.2': + resolution: {integrity: sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA==} - '@shikijs/engine-javascript@3.9.1': - resolution: {integrity: sha512-4hGenxYpAmtALryKsdli2K58F0s7RBYpj/RSDcAAGfRM6eTEGI5cZnt86mr+d9/4BaZ5sH5s4p3VU5irIdhj9Q==} + '@shikijs/engine-javascript@3.9.2': + resolution: {integrity: sha512-kUTRVKPsB/28H5Ko6qEsyudBiWEDLst+Sfi+hwr59E0GLHV0h8RfgbQU7fdN5Lt9A8R1ulRiZyTvAizkROjwDA==} - '@shikijs/engine-oniguruma@3.9.1': - resolution: {integrity: sha512-WPlL/xqviwS3te4unSGGGfflKsuHLMI6tPdNYvgz/IygcBT6UiwDFSzjBKyebwi5GGSlXsjjdoJLIBnAplmEZw==} + '@shikijs/engine-oniguruma@3.9.2': + resolution: {integrity: sha512-Vn/w5oyQ6TUgTVDIC/BrpXwIlfK6V6kGWDVVz2eRkF2v13YoENUvaNwxMsQU/t6oCuZKzqp9vqtEtEzKl9VegA==} - '@shikijs/langs@3.9.1': - resolution: {integrity: sha512-Vyy2Yv9PP3Veh3VSsIvNncOR+O93wFsNYgN2B6cCCJlS7H9SKFYc55edsqernsg8WT/zam1cfB6llJsQWLnVhA==} + '@shikijs/langs@3.9.2': + resolution: {integrity: sha512-X1Q6wRRQXY7HqAuX3I8WjMscjeGjqXCg/Sve7J2GWFORXkSrXud23UECqTBIdCSNKJioFtmUGJQNKtlMMZMn0w==} - '@shikijs/rehype@3.9.1': - resolution: {integrity: sha512-zkwzC92w2MdmwIkT0E8lKYD4dPJxCmm7HNHBwyWgJN4P6wcxZKJDvgCgAOXjOtLfXuZl3hZjO1Q/9lIyjarD/g==} + '@shikijs/rehype@3.9.2': + resolution: {integrity: sha512-obHyTWAUp5cpgpr4v7T9sjEHkLUMvBHvcpYAtdB1yuWU4/IeJ8boDMpnGUvvnxVpDwARlkvBA4Hr+BISo3zwjg==} - '@shikijs/themes@3.9.1': - resolution: {integrity: sha512-zAykkGECNICCMXpKeVvq04yqwaSuAIvrf8MjsU5bzskfg4XreU+O0B5wdNCYRixoB9snd3YlZ373WV5E/g5T9A==} + '@shikijs/themes@3.9.2': + resolution: {integrity: sha512-6z5lBPBMRfLyyEsgf6uJDHPa6NAGVzFJqH4EAZ+03+7sedYir2yJBRu2uPZOKmj43GyhVHWHvyduLDAwJQfDjA==} - '@shikijs/transformers@3.9.1': - resolution: {integrity: sha512-QI4Bh565EhKGaefiDAyn5o7S8rQIUGXcOjZANSiQHa/KSGCyJTZP9UUiRbvdovVpaI/nagODX6mspFk/vcYOQQ==} + '@shikijs/transformers@3.9.2': + resolution: {integrity: sha512-MW5hT4TyUp6bNAgTExRYLk1NNasVQMTCw1kgbxHcEC0O5cbepPWaB+1k+JzW9r3SP2/R8kiens8/3E6hGKfgsA==} - '@shikijs/types@3.9.1': - resolution: {integrity: sha512-rqM3T7a0iM1oPKz9iaH/cVgNX9Vz1HERcUcXJ94/fulgVdwqfnhXzGxO4bLrAnh/o5CPLy3IcYedogfV+Ns0Qg==} + '@shikijs/types@3.9.2': + resolution: {integrity: sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -3440,8 +3435,8 @@ packages: resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} hasBin: true - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@unpic/core@0.0.42': resolution: {integrity: sha512-K5Di+P8Bijl7doGDBGU+5VqX44e2iXMEm7G/AVla+9Hgxb5rOm/OXZoOjCUNjx5BOnjsVyegP6vlgsTfBtymkQ==} @@ -6757,8 +6752,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} @@ -7779,8 +7774,8 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -8283,8 +8278,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.9.1: - resolution: {integrity: sha512-HogZ8nMnv9VAQMrG+P7BleJFhrKHm3fi6CYyHRbUu61gJ0lpqLr6ecYEui31IYG1Cn9Bad7N2vf332iXHnn0bQ==} + shiki@3.9.2: + resolution: {integrity: sha512-t6NKl5e/zGTvw/IyftLcumolgOczhuroqwXngDeMqJ3h3EQiTY/7wmfgPlsmloD8oYfqkEDqxiaH37Pjm1zUhQ==} side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} @@ -11709,51 +11704,51 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@shikijs/colorized-brackets@3.9.1': + '@shikijs/colorized-brackets@3.9.2': dependencies: - shiki: 3.9.1 + shiki: 3.9.2 - '@shikijs/core@3.9.1': + '@shikijs/core@3.9.2': dependencies: - '@shikijs/types': 3.9.1 + '@shikijs/types': 3.9.2 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.9.1': + '@shikijs/engine-javascript@3.9.2': dependencies: - '@shikijs/types': 3.9.1 + '@shikijs/types': 3.9.2 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@3.9.1': + '@shikijs/engine-oniguruma@3.9.2': dependencies: - '@shikijs/types': 3.9.1 + '@shikijs/types': 3.9.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.9.1': + '@shikijs/langs@3.9.2': dependencies: - '@shikijs/types': 3.9.1 + '@shikijs/types': 3.9.2 - '@shikijs/rehype@3.9.1': + '@shikijs/rehype@3.9.2': dependencies: - '@shikijs/types': 3.9.1 + '@shikijs/types': 3.9.2 '@types/hast': 3.0.4 hast-util-to-string: 3.0.1 - shiki: 3.9.1 + shiki: 3.9.2 unified: 11.0.5 unist-util-visit: 5.0.0 - '@shikijs/themes@3.9.1': + '@shikijs/themes@3.9.2': dependencies: - '@shikijs/types': 3.9.1 + '@shikijs/types': 3.9.2 - '@shikijs/transformers@3.9.1': + '@shikijs/transformers@3.9.2': dependencies: - '@shikijs/core': 3.9.1 - '@shikijs/types': 3.9.1 + '@shikijs/core': 3.9.2 + '@shikijs/types': 3.9.2 - '@shikijs/types@3.9.1': + '@shikijs/types@3.9.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -12325,7 +12320,7 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} '@unpic/core@0.0.42': dependencies: @@ -15033,8 +15028,8 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - property-information: 7.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -16139,11 +16134,11 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 - mdast-util-to-hast@13.1.0: + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -17386,7 +17381,7 @@ snapshots: property-information@6.5.0: {} - property-information@7.0.0: {} + property-information@7.1.0: {} proto-list@1.2.4: {} @@ -17695,7 +17690,7 @@ snapshots: rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 hast-util-heading-rank: 3.0.0 hast-util-is-element: 3.0.0 unified: 11.0.5 @@ -17749,7 +17744,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.1.0 + mdast-util-to-hast: 13.2.0 unified: 11.0.5 vfile: 6.0.3 @@ -18077,14 +18072,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.9.1: + shiki@3.9.2: dependencies: - '@shikijs/core': 3.9.1 - '@shikijs/engine-javascript': 3.9.1 - '@shikijs/engine-oniguruma': 3.9.1 - '@shikijs/langs': 3.9.1 - '@shikijs/themes': 3.9.1 - '@shikijs/types': 3.9.1 + '@shikijs/core': 3.9.2 + '@shikijs/engine-javascript': 3.9.2 + '@shikijs/engine-oniguruma': 3.9.2 + '@shikijs/langs': 3.9.2 + '@shikijs/themes': 3.9.2 + '@shikijs/types': 3.9.2 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 diff --git a/scripts/qwik-router.ts b/scripts/qwik-router.ts index 9512e006073..4aa0e9fa6ba 100644 --- a/scripts/qwik-router.ts +++ b/scripts/qwik-router.ts @@ -1,9 +1,13 @@ -import { build, type Plugin, transform } from 'esbuild'; import { execa } from 'execa'; import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; -import { rollup } from 'rollup'; -import { type BuildConfig, emptyDir, importPath, nodeTarget, panic } from './util'; +import { build as viteBuild } from 'vite'; +import pkg from '../packages/qwik-router/package.json' with { type: 'json' }; +import { emptyDir, importPath, panic, type BuildConfig } from './util'; + +const externalsRegex = new RegExp( + `^(node:.*|@qwik-router-config|@qwik.dev|${[...Object.keys(pkg.dependencies), ...Object.keys(pkg.peerDependencies)].join('|')})($|[/\\\\])` +); export async function buildQwikRouter(config: BuildConfig) { if (!config.dev) { @@ -13,29 +17,9 @@ export async function buildQwikRouter(config: BuildConfig) { await Promise.all([ buildServiceWorker(config), buildVite(config), - buildAdapterAzureSwaVite(config), - buildAdapterCloudflarePagesVite(config), - buildAdapterCloudRunVite(config), - buildAdapterDenoVite(config), - buildAdapterBunVite(config), - buildAdapterNodeServerVite(config), - buildAdapterNetlifyEdgeVite(config), - buildAdapterSharedVite(config), - buildAdapterSsgVite(config), - buildAdapterVercelEdgeVite(config), - buildMiddlewareCloudflarePages(config), - buildMiddlewareNetlifyEdge(config), - buildMiddlewareAzureSwa(config), - buildMiddlewareAwsLambda(config), - buildMiddlewareDeno(config), - buildMiddlewareBun(config), - buildMiddlewareNode(config), - buildMiddlewareRequestHandler(config), - buildMiddlewareVercelEdge(config), - buildMiddlewareFirebase(config), + buildAdapters(config), + buildMiddleware(config), buildSsg(config), - buildSsgNode(config), - buildSsgDeno(config), ]); await buildRuntime(config); @@ -69,635 +53,281 @@ async function buildRuntime(config: BuildConfig) { async function buildVite(config: BuildConfig) { const entryPoints = [join(config.srcQwikRouterDir, 'buildtime', 'vite', 'index.ts')]; - const external = [ - 'fs', - 'path', - 'url', - 'vite', - 'source-map', - 'vfile', - '@mdx-js/mdx', - 'node-fetch', - 'undici', - 'typescript', - 'vite-imagetools', - 'svgo', - '@qwik.dev/core', - '@qwik.dev/router/middleware/request-handler', - ]; - const swRegisterPath = join(config.srcQwikRouterDir, 'runtime', 'src', 'sw-register.ts'); let swRegisterCode = await readFile(swRegisterPath, 'utf-8'); - const swResult = await transform(swRegisterCode, { loader: 'ts', minify: true }); - swRegisterCode = swResult.code.trim(); + // Minify the service worker register code + const { minify } = await import('terser'); + const swResult = await minify(swRegisterCode, { + compress: true, + mangle: true, + }); + swRegisterCode = swResult.code?.trim() || swRegisterCode.trim(); if (swRegisterCode.endsWith(';')) { swRegisterCode = swRegisterCode.slice(0, swRegisterCode.length - 1); } - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external, + await buildWithVite({ + entry: entryPoints[0], + outDir: join(config.distQwikRouterPkgDir, 'vite'), + fileName: 'index', alias: { - '@qwik.dev/core/optimizer': 'noop', + '@qwik.dev/core': 'do-not-import-qwik-core', + '@qwik.dev/core/optimizer': 'do-not-import-qwik-core', }, plugins: [serviceWorkerRegisterBuild(swRegisterCode)], }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external, - plugins: [serviceWorkerRegisterBuild(swRegisterCode)], - }); } function serviceWorkerRegisterBuild(swRegisterCode: string) { - const filter = /\@qwik-router-sw-register-build/; - - const plugin: Plugin = { + return { name: 'serviceWorkerRegisterBuild', - setup(build) { - build.onResolve({ filter }, (args) => ({ - path: args.path, - namespace: 'sw-reg', - })); - build.onLoad({ filter: /.*/, namespace: 'sw-reg' }, () => ({ - contents: swRegisterCode, - loader: 'text', - })); + resolveId(id: string) { + if (id === '@qwik-router-sw-register-build') { + return id; + } + return null; + }, + load(id: string) { + if (id === '@qwik-router-sw-register-build') { + return `export default ${JSON.stringify(swRegisterCode)};`; + } + return null; }, }; - return plugin; } async function buildServiceWorker(config: BuildConfig) { - const build = await rollup({ - input: join( - config.tscDir, - 'packages', - 'qwik-router', - 'src', - 'runtime', - 'src', - 'service-worker', - 'index.js' - ), - }); - - await build.write({ - file: join(config.distQwikRouterPkgDir, 'service-worker.mjs'), - format: 'es', - }); - - await build.write({ - file: join(config.distQwikRouterPkgDir, 'service-worker.cjs'), - format: 'cjs', - }); -} - -async function buildAdapterAzureSwaVite(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'adapters', 'azure-swa', 'vite', 'index.ts')]; - - const external = ['vite', 'fs', 'path', '@qwik.dev/router/ssg']; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'azure-swa', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'azure-swa', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external, - plugins: [resolveAdapterShared('../../shared/vite/index.cjs')], + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'runtime', 'src', 'service-worker', 'index.ts'), + outDir: config.distQwikRouterPkgDir, + fileName: 'service-worker', }); } -async function buildAdapterCloudflarePagesVite(config: BuildConfig) { - const entryPoints = [ - join(config.srcQwikRouterDir, 'adapters', 'cloudflare-pages', 'vite', 'index.ts'), - ]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'cloudflare-pages', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'cloudflare-pages', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.cjs')], - }); -} - -async function buildAdapterCloudRunVite(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'adapters', 'cloud-run', 'vite', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'cloud-run', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'cloud-run', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.cjs')], - }); -} - -async function buildAdapterBunVite(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'adapters', 'bun-server', 'vite', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'bun-server', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'bun-server', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [ - resolveAdapterShared('../../shared/vite/index.cjs'), - resolveRequestHandler('../../../middleware/request-handler/index.cjs'), - ], - }); -} - -async function buildAdapterDenoVite(config: BuildConfig) { - const entryPoints = [ - join(config.srcQwikRouterDir, 'adapters', 'deno-server', 'vite', 'index.ts'), - ]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'deno-server', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'deno-server', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [ - resolveAdapterShared('../../shared/vite/index.cjs'), - resolveRequestHandler('../../../middleware/request-handler/index.cjs'), - ], - }); -} - -async function buildAdapterNodeServerVite(config: BuildConfig) { - const entryPoints = [ - join(config.srcQwikRouterDir, 'adapters', 'node-server', 'vite', 'index.ts'), - ]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'node-server', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'node-server', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.cjs')], - }); -} - -async function buildAdapterNetlifyEdgeVite(config: BuildConfig) { - const entryPoints = [ - join(config.srcQwikRouterDir, 'adapters', 'netlify-edge', 'vite', 'index.ts'), +async function buildAdapters(config: BuildConfig) { + const adapters = [ + { + name: 'azure-swa', + entry: join(config.srcQwikRouterDir, 'adapters', 'azure-swa', 'vite', 'index.ts'), + plugins: [resolveAdapterShared('../../shared/vite/index')], + }, + { + name: 'cloudflare-pages', + entry: join(config.srcQwikRouterDir, 'adapters', 'cloudflare-pages', 'vite', 'index.ts'), + plugins: [resolveAdapterShared('../../shared/vite/index')], + }, + { + name: 'cloud-run', + entry: join(config.srcQwikRouterDir, 'adapters', 'cloud-run', 'vite', 'index.ts'), + plugins: [resolveAdapterShared('../../shared/vite/index')], + }, + { + name: 'bun-server', + entry: join(config.srcQwikRouterDir, 'adapters', 'bun-server', 'vite', 'index.ts'), + plugins: [ + resolveAdapterShared('../../shared/vite/index'), + resolveRequestHandler('../../../middleware/request-handler/index'), + ], + }, + { + name: 'deno-server', + entry: join(config.srcQwikRouterDir, 'adapters', 'deno-server', 'vite', 'index.ts'), + plugins: [ + resolveAdapterShared('../../shared/vite/index'), + resolveRequestHandler('../../../middleware/request-handler/index'), + ], + }, + { + name: 'node-server', + entry: join(config.srcQwikRouterDir, 'adapters', 'node-server', 'vite', 'index.ts'), + plugins: [resolveAdapterShared('../../shared/vite/index')], + }, + { + name: 'netlify-edge', + entry: join(config.srcQwikRouterDir, 'adapters', 'netlify-edge', 'vite', 'index.ts'), + plugins: [ + resolveAdapterShared('../../shared/vite/index'), + resolveRequestHandler('../../../middleware/request-handler/index'), + ], + }, + { + name: 'vercel-edge', + entry: join(config.srcQwikRouterDir, 'adapters', 'vercel-edge', 'vite', 'index.ts'), + plugins: [resolveAdapterShared('../../shared/vite/index')], + }, ]; - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'netlify-edge', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'netlify-edge', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, + // Build shared adapter + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'adapters', 'shared', 'vite', 'index.ts'), + outDir: join(config.distQwikRouterPkgDir, 'adapters', 'shared', 'vite'), + fileName: 'index', plugins: [ - resolveAdapterShared('../../shared/vite/index.cjs'), - resolveRequestHandler('../../../middleware/request-handler/index.cjs'), + resolveSsg('../../../ssg/index'), + resolveRequestHandler('../../../middleware/request-handler/index'), ], }); -} -async function buildAdapterSharedVite(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'adapters', 'shared', 'vite', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'shared', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [ - resolveSsg('../../../ssg/index.mjs'), - resolveRequestHandler('../../../middleware/request-handler/index.mjs'), - ], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'shared', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [ - resolveSsg('../../../ssg/index.cjs'), - resolveRequestHandler('../../../middleware/request-handler/index.cjs'), - ], - }); + // Build SSG adapter + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'adapters', 'ssg', 'vite', 'index.ts'), + outDir: join(config.distQwikRouterPkgDir, 'adapters', 'ssg', 'vite'), + fileName: 'index', + plugins: [resolveSsg('../../../ssg/index')], + }); + + // Build all other adapters + await Promise.all( + adapters.map((adapter) => + buildWithVite({ + entry: adapter.entry, + outDir: join(config.distQwikRouterPkgDir, 'adapters', adapter.name, 'vite'), + fileName: 'index', + plugins: adapter.plugins, + }) + ) + ); } -async function buildAdapterSsgVite(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'adapters', 'ssg', 'vite', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'ssg', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveSsg('../../../ssg/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'ssg', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [resolveSsg('../../../ssg/index.cjs')], - }); -} - -async function buildAdapterVercelEdgeVite(config: BuildConfig) { - const entryPoints = [ - join(config.srcQwikRouterDir, 'adapters', 'vercel-edge', 'vite', 'index.ts'), +async function buildMiddleware(config: BuildConfig) { + const middleware = [ + { + name: 'azure-swa', + entry: join(config.srcQwikRouterDir, 'middleware', 'azure-swa', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, + { + name: 'aws-lambda', + entry: join(config.srcQwikRouterDir, 'middleware', 'aws-lambda', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, + { + name: 'cloudflare-pages', + entry: join(config.srcQwikRouterDir, 'middleware', 'cloudflare-pages', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, + { + name: 'bun', + entry: join(config.srcQwikRouterDir, 'middleware', 'bun', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, + { + name: 'deno', + entry: join(config.srcQwikRouterDir, 'middleware', 'deno', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, + { + name: 'netlify-edge', + entry: join(config.srcQwikRouterDir, 'middleware', 'netlify-edge', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, + { + name: 'vercel-edge', + entry: join(config.srcQwikRouterDir, 'middleware', 'vercel-edge', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, + { + name: 'firebase', + entry: join(config.srcQwikRouterDir, 'middleware', 'firebase', 'index.ts'), + plugins: [resolveRequestHandler('../request-handler/index')], + }, ]; - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'vercel-edge', 'vite', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'adapters', 'vercel-edge', 'vite', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: ADAPTER_EXTERNALS, - plugins: [resolveAdapterShared('../../shared/vite/index.cjs')], - }); -} - -async function buildMiddlewareAzureSwa(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'azure-swa', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'azure-swa', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); -} - -async function buildMiddlewareAwsLambda(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'aws-lambda', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'aws-lambda', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); -} - -async function buildMiddlewareCloudflarePages(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'cloudflare-pages', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'cloudflare-pages', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); -} - -async function buildMiddlewareBun(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'bun', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'bun', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); -} - -async function buildMiddlewareDeno(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'deno', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'deno', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); -} - -async function buildMiddlewareNetlifyEdge(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'netlify-edge', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'netlify-edge', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); -} - -async function buildMiddlewareNode(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'node', 'index.ts')]; - - const external = ['node-fetch', 'undici', 'path', 'os', 'fs', 'url', ...MIDDLEWARE_EXTERNALS]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'node', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'node', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external, - plugins: [resolveRequestHandler('../request-handler/index.cjs')], - }); -} - -async function buildMiddlewareRequestHandler(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'request-handler', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'request-handler', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - }); - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'request-handler', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external: MIDDLEWARE_EXTERNALS, - }); -} - -async function buildMiddlewareVercelEdge(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'vercel-edge', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'vercel-edge', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); -} - -async function buildMiddlewareFirebase(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'middleware', 'firebase', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'middleware', 'firebase', 'index.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external: MIDDLEWARE_EXTERNALS, - plugins: [resolveRequestHandler('../request-handler/index.mjs')], - }); + // Build request handler middleware + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'middleware', 'request-handler', 'index.ts'), + outDir: join(config.distQwikRouterPkgDir, 'middleware', 'request-handler'), + fileName: 'index', + }); + + // Build node middleware + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'middleware', 'node', 'index.ts'), + outDir: join(config.distQwikRouterPkgDir, 'middleware', 'node'), + fileName: 'index', + plugins: [resolveRequestHandler('../request-handler/index')], + }); + + // Build all other middleware + await Promise.all( + middleware.map((mw) => + buildWithVite({ + entry: mw.entry, + outDir: join(config.distQwikRouterPkgDir, 'middleware', mw.name), + fileName: 'index', + plugins: mw.plugins, + }) + ) + ); } async function buildSsg(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'ssg', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'ssg', 'index.mjs'), - bundle: true, + // Build main SSG + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'ssg', 'index.ts'), + outDir: join(config.distQwikRouterPkgDir, 'ssg'), + fileName: 'index', platform: 'neutral', - format: 'esm', }); - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'ssg', 'index.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - }); -} - -async function buildSsgDeno(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'ssg', 'deno', 'index.ts')]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'ssg', 'deno.mjs'), - bundle: true, + // Build SSG Deno + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'ssg', 'deno', 'index.ts'), + outDir: join(config.distQwikRouterPkgDir, 'ssg'), + fileName: 'deno', platform: 'neutral', - format: 'esm', - plugins: [resolveRequestHandler('../middleware/request-handler/index.mjs')], + plugins: [resolveRequestHandler('../middleware/request-handler/index')], }); -} -async function buildSsgNode(config: BuildConfig) { - const entryPoints = [join(config.srcQwikRouterDir, 'ssg', 'node', 'index.ts')]; - - const external = [ - '@qwik.dev/core', - '@qwik.dev/core/optimizer', - '@qwik.dev/router', - 'fs', - 'http', - 'https', - 'node-fetch', - 'undici', - 'os', - 'path', - 'stream/web', - 'url', - 'worker_threads', - 'vite', - ]; - - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'ssg', 'node.mjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'esm', - external, - plugins: [resolveRequestHandler('../middleware/request-handler/index.mjs')], + await buildWithVite({ + entry: join(config.srcQwikRouterDir, 'ssg', 'node', 'index.ts'), + outDir: join(config.distQwikRouterPkgDir, 'ssg'), + fileName: 'node', + plugins: [resolveRequestHandler('../middleware/request-handler/index')], }); +} - await build({ - entryPoints, - outfile: join(config.distQwikRouterPkgDir, 'ssg', 'node.cjs'), - bundle: true, - platform: 'node', - target: nodeTarget, - format: 'cjs', - external, - plugins: [resolveRequestHandler('../middleware/request-handler/index.cjs')], +async function buildWithVite(options: { + entry: string; + outDir: string; + fileName: string; + plugins?: any[]; + alias?: Record; + platform?: 'node' | 'neutral'; +}) { + const { entry, outDir, fileName, plugins = [], alias = {}, platform = 'node' } = options; + + await viteBuild({ + build: { + manifest: false, + target: platform === 'node' ? 'node20' : undefined, + lib: { + entry, + name: fileName, + formats: ['es', 'cjs'], + fileName: (format) => `${fileName}.${format === 'es' ? 'mjs' : 'cjs'}`, + }, + outDir, + rollupOptions: { + external: externalsRegex, + output: { + globals: {}, + }, + }, + sourcemap: false, + emptyOutDir: false, + }, + environments: + platform === 'node' ? { ssr: { consumer: 'server' } } : { client: { consumer: 'client' } }, + plugins, + resolve: { + alias, + }, + define: { + 'process.env.NODE_ENV': '"production"', + }, + clearScreen: false, }); } @@ -712,24 +342,3 @@ function resolveSsg(path: string) { function resolveAdapterShared(path: string) { return importPath(/shared\/vite$/, path); } - -const ADAPTER_EXTERNALS = [ - 'vite', - 'fs', - 'path', - '@qwik.dev/core', - '@qwik.dev/core/server', - '@qwik.dev/core/optimizer', - '@qwik.dev/router', - '@qwik.dev/router/ssg', - '@qwik.dev/router/middleware/request-handler', -]; - -const MIDDLEWARE_EXTERNALS = [ - '@qwik.dev/core', - '@qwik.dev/core/optimizer', - '@qwik.dev/core/server', - '@qwik.dev/router', - '@qwik.dev/router/ssg', - '@qwik-router-config', -]; From d00e108d50d54247af901f091189f16c6fcce47c Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Fri, 15 Aug 2025 15:21:12 +0200 Subject: [PATCH 06/14] chore: dep updates --- e2e/qwik-cli-e2e/package.json | 2 +- package.json | 30 +- packages/create-qwik/package.json | 2 +- packages/docs/package.json | 16 +- packages/insights/package.json | 14 +- packages/qwik-react/package.json | 12 +- packages/qwik-router/package.json | 14 +- .../qwik-router/src/middleware/bun/index.ts | 2 +- .../src/middleware/cloudflare-pages/index.ts | 2 +- packages/qwik/package.json | 2 +- packages/qwik/src/optimizer/src/platform.ts | 34 +- pnpm-lock.yaml | 1802 +++++++++-------- syncpack-release-conf.json | 5 - 13 files changed, 989 insertions(+), 948 deletions(-) diff --git a/e2e/qwik-cli-e2e/package.json b/e2e/qwik-cli-e2e/package.json index b0a98646444..769f43bb139 100644 --- a/e2e/qwik-cli-e2e/package.json +++ b/e2e/qwik-cli-e2e/package.json @@ -2,7 +2,7 @@ "name": "qwik-cli-e2e", "version": "0.0.0", "dependencies": { - "kleur": "4.1.5" + "kleur": "^4.1.5" }, "private": true, "scripts": { diff --git a/package.json b/package.json index b6ca9bd7539..e31ad11b26f 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "@changesets/cli": "2.29.5", "@changesets/get-github-info": "0.6.0", "@changesets/types": "6.1.0", - "@clack/prompts": "0.7.0", + "@clack/prompts": "0.11.0", "@eslint/js": "9.33.0", "@mdx-js/mdx": "3.1.0", "@microsoft/api-documenter": "7.26.31", @@ -107,13 +107,13 @@ "@qwik.dev/partytown": "0.11.2", "@qwik.dev/router": "workspace:*", "@types/brotli": "1.3.4", - "@types/bun": "1.2.20", + "@types/bun": "1.2.21", "@types/cross-spawn": "6.0.6", "@types/express": "5.0.3", - "@types/node": "24.2.1", + "@types/node": "24.3.0", "@types/path-browserify": "1.0.3", "@types/prompts": "2.4.9", - "@types/react": "19.1.10", + "@types/react": "19.1.12", "@types/semver": "7.7.0", "@types/tmp": "0.2.6", "@types/which-pm-runs": "1.0.2", @@ -125,7 +125,7 @@ "cross-spawn": "7.0.6", "csstype": "3.1.3", "dotenv": "16.5.0", - "esbuild": "0.25.8", + "esbuild": "0.25.9", "eslint": "9.33.0", "eslint-plugin-import": "2.32.0", "eslint-plugin-no-only-tests": "3.3.0", @@ -134,8 +134,8 @@ "express": "4.20.0", "globals": "16.3.0", "install": "0.13.0", - "memfs": "4.34.0", - "monaco-editor": "0.45.0", + "memfs": "4.38.2", + "monaco-editor": "0.52.2", "mri": "1.2.0", "path-browserify": "1.0.1", "prettier": "3.6.2", @@ -143,21 +143,21 @@ "prettier-plugin-tailwindcss": "0.6.14", "pretty-quick": "4.2.2", "prompts": "2.4.2", - "rollup": ">= 4.44.0", + "rollup": "4.50.0", "semver": "7.7.2", "simple-git-hooks": "2.13.1", "snoop": "1.0.4", - "source-map": "0.7.4", + "source-map": "0.7.6", "svgo": "3.3.2", "syncpack": "13.0.4", "terser": "5.43.1", - "tmp": "0.2.3", + "tmp": "0.2.5", "tree-kill": "1.2.2", - "tsx": "4.20.3", - "typescript": "5.8.3", - "typescript-eslint": "8.39.1", + "tsx": "4.20.5", + "typescript": "5.9.2", + "typescript-eslint": "8.41.0", "vfile": "6.0.3", - "vite": "7.1.0", + "vite": "7.1.3", "vite-imagetools": "7.1.0", "vite-plugin-dts": "4.5.4", "vite-tsconfig-paths": "5.1.4", @@ -179,7 +179,7 @@ "@builder.io/qwik-city": "npm:@qwik.dev/router", "@types/estree": "1.0.8", "prettier": "3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.2", "vfile": "6.0.3" }, "patchedDependencies": { diff --git a/packages/create-qwik/package.json b/packages/create-qwik/package.json index ac5a41a0566..ea22f20e9f6 100644 --- a/packages/create-qwik/package.json +++ b/packages/create-qwik/package.json @@ -6,7 +6,7 @@ "bin": "./create-qwik.cjs", "bugs": "https://github.com/QwikDev/qwik/issues", "devDependencies": { - "@clack/prompts": "0.7.0", + "@clack/prompts": "0.11.0", "@types/yargs": "17.0.33", "kleur": "4.1.5", "yargs": "17.7.2" diff --git a/packages/docs/package.json b/packages/docs/package.json index 0bce1b53282..6915fb47cc3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -24,11 +24,11 @@ "@shikijs/transformers": "3.9.2", "@shikijs/types": "3.9.2", "@supabase/supabase-js": "2.53.0", - "@tailwindcss/vite": "4.1.11", + "@tailwindcss/vite": "4.1.12", "@types/leaflet": "1.9.20", "@types/prismjs": "1.26.5", - "@types/react": "19.1.10", - "@types/react-dom": "18.3.0", + "@types/react": "19.1.12", + "@types/react-dom": "19.1.7", "@unpic/core": "0.0.42", "@unpic/qwik": "0.0.38", "algoliasearch": "4.16.0", @@ -42,17 +42,17 @@ "prismjs": "1.30.0", "puppeteer": "22.13.1", "qwik-image": "0.0.16", - "react": "18.3.1", - "react-dom": "18.3.1", + "react": "19.1.1", + "react-dom": "19.1.1", "shiki": "3.9.2", "snarkdown": "2.0.0", - "tailwindcss": "4.1.11", + "tailwindcss": "4.1.12", "terser": "5.43.1", "tsm": "2.3.0", - "typescript": "5.8.3", + "typescript": "5.9.2", "undici": "*", "valibot": "0.33.3", - "vite": "7.1.0", + "vite": "7.1.3", "vite-plugin-inspect": "11.3.2", "vite-tsconfig-paths": "5.1.4", "wrangler": "3.65.1" diff --git a/packages/insights/package.json b/packages/insights/package.json index 000520873da..c8c99b4cfc3 100644 --- a/packages/insights/package.json +++ b/packages/insights/package.json @@ -4,7 +4,7 @@ "version": "0.1.0", "dependencies": { "@auth/qwik": "0.8.0", - "@libsql/client": "^0.15.10", + "@libsql/client": "^0.15.11", "@modular-forms/qwik": "^0.24.0", "@typescript/analyze-trace": "^0.10.1", "density-clustering": "^1.3.0", @@ -18,9 +18,9 @@ "@netlify/edge-functions": "2.17.0", "@qwik.dev/core": "workspace:*", "@qwik.dev/router": "workspace:*", - "@tailwindcss/vite": "4.1.11", + "@tailwindcss/vite": "4.1.12", "@types/density-clustering": "1.3.3", - "@types/node": "24.2.1", + "@types/node": "24.3.0", "autoprefixer": "10.4.21", "eslint": "9.33.0", "eslint-plugin-qwik": "workspace:*", @@ -29,11 +29,11 @@ "postcss": "8.5.6", "prettier": "3.6.2", "prettier-plugin-tailwindcss": "0.6.14", - "tailwindcss": "4.1.11", - "typescript": "5.8.3", - "typescript-eslint": "8.39.1", + "tailwindcss": "4.1.12", + "typescript": "5.9.2", + "typescript-eslint": "8.41.0", "undici": "*", - "vite": "7.1.0", + "vite": "7.1.3", "vite-tsconfig-paths": "5.1.4", "vitest": "3.2.4", "zod": "3.25.48" diff --git a/packages/qwik-react/package.json b/packages/qwik-react/package.json index d2ea7ed7f66..babbdc4a855 100644 --- a/packages/qwik-react/package.json +++ b/packages/qwik-react/package.json @@ -5,12 +5,12 @@ "bugs": "https://github.com/QwikDev/qwik/issues", "devDependencies": { "@qwik.dev/core": "workspace:*", - "@types/react": "19.1.10", - "@types/react-dom": "18.3.0", - "react": "18.3.1", - "react-dom": "18.3.1", - "typescript": "5.8.3", - "vite": "7.1.0" + "@types/react": "19.1.12", + "@types/react-dom": "19.1.7", + "react": "19.1.1", + "react-dom": "19.1.1", + "typescript": "5.9.2", + "vite": "7.1.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" diff --git a/packages/qwik-router/package.json b/packages/qwik-router/package.json index 6734bc0dea7..29d10e8141d 100644 --- a/packages/qwik-router/package.json +++ b/packages/qwik-router/package.json @@ -20,23 +20,23 @@ "remark-frontmatter": "^5.0.0", "remark-gfm": "^4.0.1", "set-cookie-parser": "^2.7.1", - "source-map": "^0.7.4", + "source-map": "^0.7.6", "svgo": "^3.3.2", - "typescript": "^5.8.3", + "typescript": "5.9.2", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "valibot": ">=0.36.0 <2", - "vfile": "^6.0.3", + "vfile": "6.0.3", "vite-imagetools": "^7.1.0", - "yaml": "^2.6.1", + "yaml": "^2.8.1", "zod": "^3.25.40" }, "devDependencies": { - "@qwik.dev/core": "workspace:*", "@microsoft/api-extractor": "7.52.10", + "@qwik.dev/core": "workspace:*", "@types/mdast": "4.0.4", - "@types/node": "24.2.1", - "@types/refractor": "3.4.1", + "@types/node": "24.3.0", + "@types/refractor": "4.0.0", "@types/set-cookie-parser": "2.4.10", "tsm": "2.3.0", "uvu": "0.5.6" diff --git a/packages/qwik-router/src/middleware/bun/index.ts b/packages/qwik-router/src/middleware/bun/index.ts index 1da3437b2a2..254251ed4e5 100644 --- a/packages/qwik-router/src/middleware/bun/index.ts +++ b/packages/qwik-router/src/middleware/bun/index.ts @@ -23,7 +23,7 @@ export function createQwikRouter(opts: QwikRouterBunOptions) { } // @qwik.dev/router/middleware/bun // still missing from bun: last check was bun version 1.1.8 - globalThis.TextEncoderStream ||= _TextEncoderStream_polyfill; + globalThis.TextEncoderStream ||= _TextEncoderStream_polyfill as any; if (opts.manifest) { setServerPlatform(opts.manifest); diff --git a/packages/qwik-router/src/middleware/cloudflare-pages/index.ts b/packages/qwik-router/src/middleware/cloudflare-pages/index.ts index 668c195b4d4..c93b7e83b8c 100644 --- a/packages/qwik-router/src/middleware/cloudflare-pages/index.ts +++ b/packages/qwik-router/src/middleware/cloudflare-pages/index.ts @@ -24,7 +24,7 @@ export function createQwikRouter(opts: QwikRouterCloudflarePagesOptions) { // this will throw if CF compatibility_date < 2022-11-30 new globalThis.TextEncoderStream(); } catch { - globalThis.TextEncoderStream = _TextEncoderStream_polyfill; + globalThis.TextEncoderStream = _TextEncoderStream_polyfill as any; } if (opts.manifest) { setServerPlatform(opts.manifest); diff --git a/packages/qwik/package.json b/packages/qwik/package.json index 8e2cf3f8d79..50be8b22a29 100644 --- a/packages/qwik/package.json +++ b/packages/qwik/package.json @@ -180,7 +180,7 @@ "license": "MIT", "main": "./src/index.ts", "peerDependencies": { - "prettier": "*", + "prettier": "3.6.2", "vite": ">=5 <8", "vitest": ">=2 <4" }, diff --git a/packages/qwik/src/optimizer/src/platform.ts b/packages/qwik/src/optimizer/src/platform.ts index c080142bdda..fe480a4b975 100644 --- a/packages/qwik/src/optimizer/src/platform.ts +++ b/packages/qwik/src/optimizer/src/platform.ts @@ -177,18 +177,10 @@ export async function loadPlatformBinding(sys: OptimizerSystem) { const mod = await sys.dynamicImport(`../bindings/qwik.wasm.cjs`); const fs: typeof import('fs') = await sys.dynamicImport('node:fs'); - return new Promise((resolve, reject) => { - fs.readFile(wasmPath, (err, buf) => { - if (err != null) { - reject(err); - } else { - resolve(buf); - } - }); - }) - .then((buf) => WebAssembly.compile(buf)) - .then((wasm) => mod.default(wasm)) - .then(() => mod); + const buf = await fs.promises.readFile(wasmPath); + const wasm = await WebAssembly.compile(buf as any); + await mod.default(wasm); + return mod; } if (sysEnv === 'webworker' || sysEnv === 'browsermain') { @@ -234,25 +226,17 @@ export async function loadPlatformBinding(sys: OptimizerSystem) { if (globalThis.IS_ESM) { if (sysEnv === 'node' || sysEnv === 'bun') { - // CJS WASM Node.js + // ESM WASM Node.js const url: typeof import('url') = await sys.dynamicImport('node:url'); const __dirname = sys.path.dirname(url.fileURLToPath(import.meta.url)); const wasmPath = sys.path.join(__dirname, '..', 'bindings', 'qwik_wasm_bg.wasm'); const mod = await sys.dynamicImport(`../bindings/qwik.wasm.mjs`); const fs: typeof import('fs') = await sys.dynamicImport('node:fs'); - return new Promise((resolve, reject) => { - fs.readFile(wasmPath, (err, buf) => { - if (err != null) { - reject(err); - } else { - resolve(buf); - } - }); - }) - .then((buf) => WebAssembly.compile(buf)) - .then((wasm) => mod.default(wasm)) - .then(() => mod); + const buf = await fs.promises.readFile(wasmPath); + const wasm = await WebAssembly.compile(buf as any); + await mod.default(wasm); + return mod; } else { const module = await sys.dynamicImport(`../bindings/qwik.wasm.mjs`); await module.default(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b20a1e0f6d4..fb2c9afca0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ overrides: '@builder.io/qwik-city': npm:@qwik.dev/router '@types/estree': 1.0.8 prettier: 3.6.2 - typescript: 5.8.3 + typescript: 5.9.2 vfile: 6.0.3 patchedDependencies: @@ -23,7 +23,7 @@ importers: dependencies: esbuild-plugin-raw: specifier: ^0.2.0 - version: 0.2.0(esbuild@0.25.8) + version: 0.2.0(esbuild@0.25.9) devDependencies: '@changesets/cli': specifier: 2.29.5 @@ -35,8 +35,8 @@ importers: specifier: 6.1.0 version: 6.1.0 '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 + specifier: 0.11.0 + version: 0.11.0 '@eslint/js': specifier: 9.33.0 version: 9.33.0 @@ -45,10 +45,10 @@ importers: version: 3.1.0(acorn@8.15.0) '@microsoft/api-documenter': specifier: 7.26.31 - version: 7.26.31(@types/node@24.2.1) + version: 7.26.31(@types/node@24.3.0) '@microsoft/api-extractor': specifier: 7.52.10 - version: 7.52.10(@types/node@24.2.1) + version: 7.52.10(@types/node@24.3.0) '@napi-rs/cli': specifier: 2.18.4 version: 2.18.4 @@ -77,8 +77,8 @@ importers: specifier: 1.3.4 version: 1.3.4 '@types/bun': - specifier: 1.2.20 - version: 1.2.20(@types/react@19.1.10) + specifier: 1.2.21 + version: 1.2.21(@types/react@19.1.12) '@types/cross-spawn': specifier: 6.0.6 version: 6.0.6 @@ -86,8 +86,8 @@ importers: specifier: 5.0.3 version: 5.0.3 '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 24.3.0 + version: 24.3.0 '@types/path-browserify': specifier: 1.0.3 version: 1.0.3 @@ -95,8 +95,8 @@ importers: specifier: 2.4.9 version: 2.4.9 '@types/react': - specifier: 19.1.10 - version: 19.1.10 + specifier: 19.1.12 + version: 19.1.12 '@types/semver': specifier: 7.7.0 version: 7.7.0 @@ -108,10 +108,10 @@ importers: version: 1.0.2 '@vitejs/plugin-basic-ssl': specifier: 2.1.0 - version: 2.1.0(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + version: 2.1.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) all-contributors-cli: specifier: 6.26.1 version: 6.26.1 @@ -131,14 +131,14 @@ importers: specifier: 16.5.0 version: 16.5.0 esbuild: - specifier: 0.25.8 - version: 0.25.8 + specifier: 0.25.9 + version: 0.25.9 eslint: specifier: 9.33.0 - version: 9.33.0(jiti@2.4.2) + version: 9.33.0(jiti@2.5.1) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(eslint@9.33.0(jiti@2.4.2)) + version: 2.32.0(eslint@9.33.0(jiti@2.5.1)) eslint-plugin-no-only-tests: specifier: 3.3.0 version: 3.3.0 @@ -158,11 +158,11 @@ importers: specifier: 0.13.0 version: 0.13.0 memfs: - specifier: 4.34.0 - version: 4.34.0 + specifier: 4.38.2 + version: 4.38.2 monaco-editor: - specifier: 0.45.0 - version: 0.45.0 + specifier: 0.52.2 + version: 0.52.2 mri: specifier: 1.2.0 version: 1.2.0 @@ -185,8 +185,8 @@ importers: specifier: 2.4.2 version: 2.4.2 rollup: - specifier: '>= 4.44.0' - version: 4.46.2 + specifier: 4.50.0 + version: 4.50.0 semver: specifier: 7.7.2 version: 7.7.2 @@ -197,50 +197,50 @@ importers: specifier: 1.0.4 version: 1.0.4 source-map: - specifier: 0.7.4 - version: 0.7.4 + specifier: 0.7.6 + version: 0.7.6 svgo: specifier: 3.3.2 version: 3.3.2 syncpack: specifier: 13.0.4 - version: 13.0.4(typescript@5.8.3) + version: 13.0.4(typescript@5.9.2) terser: specifier: 5.43.1 version: 5.43.1 tmp: - specifier: 0.2.3 - version: 0.2.3 + specifier: 0.2.5 + version: 0.2.5 tree-kill: specifier: 1.2.2 version: 1.2.2 tsx: - specifier: 4.20.3 - version: 4.20.3 + specifier: 4.20.5 + version: 4.20.5 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 typescript-eslint: - specifier: 8.39.1 - version: 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) + specifier: 8.41.0 + version: 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) vfile: specifier: 6.0.3 version: 6.0.3 vite: - specifier: 7.1.0 - version: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + specifier: 7.1.3 + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) vite-imagetools: specifier: 7.1.0 - version: 7.1.0(rollup@4.46.2) + version: 7.1.0(rollup@4.50.0) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.2.1)(rollup@4.46.2)(typescript@5.8.3)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + version: 4.5.4(@types/node@24.3.0)(rollup@4.50.0)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) watchlist: specifier: 0.3.1 version: 0.3.1 @@ -256,14 +256,14 @@ importers: e2e/qwik-cli-e2e: dependencies: kleur: - specifier: 4.1.5 + specifier: ^4.1.5 version: 4.1.5 packages/create-qwik: devDependencies: '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 + specifier: 0.11.0 + version: 0.11.0 '@types/yargs': specifier: 17.0.33 version: 17.0.33 @@ -284,28 +284,28 @@ importers: version: 4.14.3 '@builder.io/qwik': specifier: npm:@qwik.dev/core@* - version: '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))' + version: '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' '@emotion/react': specifier: 11.14.0 - version: 11.14.0(@types/react@19.1.10)(react@18.3.1) + version: 11.14.0(@types/react@19.1.12)(react@19.1.1) '@emotion/styled': specifier: 11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) '@modular-forms/qwik': specifier: 0.23.1 - version: 0.23.1(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))) + version: 0.23.1(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) '@mui/material': specifier: 5.16.4 - version: 5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/system': specifier: 5.16.4 - version: 5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1) + version: 5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) '@mui/x-data-grid': specifier: 6.20.4 - version: 6.20.4(@mui/material@5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.20.4(@mui/material@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@qwik-ui/headless': specifier: 0.6.7 - version: 0.6.7(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))) + version: 0.6.7(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) '@qwik.dev/core': specifier: workspace:* version: link:../qwik @@ -334,8 +334,8 @@ importers: specifier: 2.53.0 version: 2.53.0 '@tailwindcss/vite': - specifier: 4.1.11 - version: 4.1.11(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + specifier: 4.1.12 + version: 4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) '@types/leaflet': specifier: 1.9.20 version: 1.9.20 @@ -343,17 +343,17 @@ importers: specifier: 1.26.5 version: 1.26.5 '@types/react': - specifier: 19.1.10 - version: 19.1.10 + specifier: 19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 + specifier: 19.1.7 + version: 19.1.7(@types/react@19.1.12) '@unpic/core': specifier: 0.0.42 version: 0.0.42 '@unpic/qwik': specifier: 0.0.38 - version: 0.0.38(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))) + version: 0.0.38(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) algoliasearch: specifier: 4.16.0 version: 4.16.0 @@ -383,16 +383,16 @@ importers: version: 1.30.0 puppeteer: specifier: 22.13.1 - version: 22.13.1(typescript@5.8.3) + version: 22.13.1(typescript@5.9.2) qwik-image: specifier: 0.0.16 version: 0.0.16 react: - specifier: 18.3.1 - version: 18.3.1 + specifier: 19.1.1 + version: 19.1.1 react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) + specifier: 19.1.1 + version: 19.1.1(react@19.1.1) shiki: specifier: 3.9.2 version: 3.9.2 @@ -400,8 +400,8 @@ importers: specifier: 2.0.0 version: 2.0.0 tailwindcss: - specifier: 4.1.11 - version: 4.1.11 + specifier: 4.1.12 + version: 4.1.12 terser: specifier: 5.43.1 version: 5.43.1 @@ -409,8 +409,8 @@ importers: specifier: 2.3.0 version: 2.3.0 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 undici: specifier: '*' version: 6.18.2 @@ -418,14 +418,14 @@ importers: specifier: 0.33.3 version: 0.33.3 vite: - specifier: 7.1.0 - version: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + specifier: 7.1.3 + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) vite-plugin-inspect: specifier: 11.3.2 - version: 11.3.2(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + version: 11.3.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) wrangler: specifier: 3.65.1 version: 3.65.1 @@ -434,7 +434,7 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.38.0 - version: 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) jsx-ast-utils: specifier: ^3.3.5 version: 3.3.5 @@ -450,7 +450,7 @@ importers: version: 1.0.8 '@typescript-eslint/rule-tester': specifier: 8.38.0 - version: 8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.38.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) redent: specifier: 4.0.0 version: 4.0.0 @@ -461,8 +461,8 @@ importers: specifier: 0.8.0 version: 0.8.0 '@libsql/client': - specifier: ^0.15.10 - version: 0.15.10 + specifier: ^0.15.11 + version: 0.15.14 '@modular-forms/qwik': specifier: ^0.24.0 version: 0.24.0 @@ -480,11 +480,11 @@ importers: version: 0.31.4 drizzle-orm: specifier: 0.44.4 - version: 0.44.4(@libsql/client@0.15.10)(@opentelemetry/api@1.8.0)(bun-types@1.2.20(@types/react@19.1.10)) + version: 0.44.4(@libsql/client@0.15.14)(@opentelemetry/api@1.8.0)(bun-types@1.2.21(@types/react@19.1.12)) devDependencies: '@builder.io/vite-plugin-macro': specifier: 0.0.7 - version: 0.0.7(@types/node@24.2.1)(lightningcss@1.30.1)(rollup@4.46.2)(terser@5.43.1) + version: 0.0.7(@types/node@24.3.0)(lightningcss@1.30.1)(rollup@4.50.0)(terser@5.43.1) '@eslint/js': specifier: 9.33.0 version: 9.33.0 @@ -498,20 +498,20 @@ importers: specifier: workspace:* version: link:../qwik-router '@tailwindcss/vite': - specifier: 4.1.11 - version: 4.1.11(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + specifier: 4.1.12 + version: 4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) '@types/density-clustering': specifier: 1.3.3 version: 1.3.3 '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 24.3.0 + version: 24.3.0 autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) eslint: specifier: 9.33.0 - version: 9.33.0(jiti@2.4.2) + version: 9.33.0(jiti@2.5.1) eslint-plugin-qwik: specifier: workspace:* version: link:../eslint-plugin-qwik @@ -520,7 +520,7 @@ importers: version: 16.3.0 netlify-cli: specifier: 21.5.0 - version: 21.5.0(@types/express@5.0.3)(@types/node@24.2.1)(picomatch@4.0.3)(rollup@4.46.2) + version: 21.5.0(@types/express@5.0.3)(@types/node@24.3.0)(picomatch@4.0.3)(rollup@4.50.0) postcss: specifier: 8.5.6 version: 8.5.6 @@ -531,26 +531,26 @@ importers: specifier: 0.6.14 version: 0.6.14(prettier-plugin-jsdoc@1.3.3(prettier@3.6.2))(prettier@3.6.2) tailwindcss: - specifier: 4.1.11 - version: 4.1.11 + specifier: 4.1.12 + version: 4.1.12 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 typescript-eslint: - specifier: 8.39.1 - version: 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) + specifier: 8.41.0 + version: 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) undici: specifier: '*' version: 6.18.2 vite: - specifier: 7.1.0 - version: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + specifier: 7.1.3 + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) zod: specifier: 3.25.48 version: 3.25.48 @@ -562,7 +562,7 @@ importers: version: 3.1.3 rollup: specifier: '>= ^4.44.0' - version: 4.46.2 + version: 4.50.0 devDependencies: '@qwik.dev/core': specifier: workspace:* @@ -587,7 +587,7 @@ importers: version: 23.0.0 vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) packages/qwik-dom: {} @@ -597,23 +597,23 @@ importers: specifier: workspace:* version: link:../qwik '@types/react': - specifier: 19.1.10 - version: 19.1.10 + specifier: 19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 + specifier: 19.1.7 + version: 19.1.7(@types/react@19.1.12) react: - specifier: 18.3.1 - version: 18.3.1 + specifier: 19.1.1 + version: 19.1.1 react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) + specifier: 19.1.1 + version: 19.1.1(react@19.1.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 vite: - specifier: 7.1.0 - version: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + specifier: 7.1.3 + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) packages/qwik-router: dependencies: @@ -666,14 +666,14 @@ importers: specifier: ^2.7.1 version: 2.7.1 source-map: - specifier: ^0.7.4 - version: 0.7.4 + specifier: ^0.7.6 + version: 0.7.6 svgo: specifier: ^3.3.2 version: 3.3.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 unified: specifier: ^11.0.5 version: 11.0.5 @@ -682,23 +682,23 @@ importers: version: 5.0.0 valibot: specifier: '>=0.36.0 <2' - version: 0.42.1(typescript@5.8.3) + version: 0.42.1(typescript@5.9.2) vfile: specifier: 6.0.3 version: 6.0.3 vite-imagetools: specifier: ^7.1.0 - version: 7.1.0(rollup@4.46.2) + version: 7.1.0(rollup@4.50.0) yaml: - specifier: ^2.6.1 - version: 2.6.1 + specifier: ^2.8.1 + version: 2.8.1 zod: specifier: ^3.25.40 version: 3.25.48 devDependencies: '@microsoft/api-extractor': specifier: 7.52.10 - version: 7.52.10(@types/node@24.2.1) + version: 7.52.10(@types/node@24.3.0) '@qwik.dev/core': specifier: workspace:* version: link:../qwik @@ -706,11 +706,11 @@ importers: specifier: 4.0.4 version: 4.0.4 '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 24.3.0 + version: 24.3.0 '@types/refractor': - specifier: 3.4.1 - version: 3.4.1 + specifier: 4.0.0 + version: 4.0.0 '@types/set-cookie-parser': specifier: 2.4.10 version: 2.4.10 @@ -946,13 +946,11 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@clack/core@0.3.4': - resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} + '@clack/core@0.5.0': + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} - '@clack/prompts@0.7.0': - resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} - bundledDependencies: - - is-unicode-supported + '@clack/prompts@0.11.0': + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} '@cloudflare/kv-asset-handler@0.3.4': resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} @@ -1097,8 +1095,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1127,8 +1125,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1163,8 +1161,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1193,8 +1191,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1223,8 +1221,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1253,8 +1251,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1283,8 +1281,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1313,8 +1311,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1343,8 +1341,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1373,8 +1371,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1403,8 +1401,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1439,8 +1437,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1469,8 +1467,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1499,8 +1497,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1529,8 +1527,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1559,8 +1557,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1589,8 +1587,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -1607,8 +1605,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -1637,8 +1635,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -1655,8 +1653,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1685,8 +1683,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1697,8 +1695,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -1727,8 +1725,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1757,8 +1755,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1787,8 +1785,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1817,8 +1815,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2076,6 +2074,9 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -2102,31 +2103,49 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.1.0': - resolution: {integrity: sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==} + '@jsonjoy.com/buffers@1.0.0': + resolution: {integrity: sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.11.0': + resolution: {integrity: sha512-nLqSTAYwpk+5ZQIoVp7pfd/oSKNWlEdvTq2LzVA4r2wtWZg6v+5u0VgBOaDJuUfNOuw/4Ysq6glN5QKSrOCgrA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@1.5.0': - resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@libsql/client@0.15.10': - resolution: {integrity: sha512-J9cJQwrgH92JlPBYjUGxPIH5G9z3j/V/aPnQvcmmCgjatdVb/f7bzK3yNq15Phc+gVuKMwox3toXL+58qUMylg==} + '@libsql/client@0.15.14': + resolution: {integrity: sha512-oXeFYcSyAsYWvpWVmynrwNwb+NHNHtMfSIVdfQTF1B9RsgDXQE5YCDP3SS0i1FA8nuLWy2trFDVwP1b2LNdNPQ==} - '@libsql/core@0.15.10': - resolution: {integrity: sha512-fAMD+GnGQNdZ9zxeNC8AiExpKnou/97GJWkiDDZbTRHj3c9dvF1y4jsRQ0WE72m/CqTdbMGyU98yL0SJ9hQVeg==} + '@libsql/core@0.15.14': + resolution: {integrity: sha512-b2eVQma78Ss+edIIFi7LnhhyUy5hAJjYvrSAD5RFdO/YKP2rEvNAT1pIn2Li7NrqcsMmoEQWlpUWH4fWMdXtpQ==} - '@libsql/darwin-arm64@0.5.17': - resolution: {integrity: sha512-WTYG2skZsUnZmfZ2v7WFj7s3/5s2PfrYBZOWBKOnxHA8g4XCDc/4bFDaqob9Q2e88+GC7cWeJ8VNkVBFpD2Xxg==} + '@libsql/darwin-arm64@0.5.20': + resolution: {integrity: sha512-faHM2FX26xruO4w76YkW+lA28yKcTIzNiGvK9Q8+8sCuC7cn3KdMO6KJ84c6fJQwtwG+F4hxIoy95U5FYge3bg==} cpu: [arm64] os: [darwin] - '@libsql/darwin-x64@0.5.17': - resolution: {integrity: sha512-ab0RlTR4KYrxgjNrZhAhY/10GibKoq6G0W4oi0kdm+eYiAv/Ip8GDMpSaZdAcoKA4T+iKR/ehczKHnMEB8MFxA==} + '@libsql/darwin-x64@0.5.20': + resolution: {integrity: sha512-19l0oEW/r2kZxDJg+w53C0kq7eFFKpeKDEjV/FAAkBfQwJoGqS4sep9u1fK1X3KzOF5rB8cVyIrQGk+6ibzUeQ==} cpu: [x64] os: [darwin] @@ -2140,38 +2159,38 @@ packages: '@libsql/isomorphic-ws@0.1.5': resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - '@libsql/linux-arm-gnueabihf@0.5.17': - resolution: {integrity: sha512-PcASh4k47RqC+kMWAbLUKf1y6Do0q8vnUGi0yhKY4ghJcimMExViBimjbjYRSa+WIb/zh3QxNoXOhQAXx3tiuw==} + '@libsql/linux-arm-gnueabihf@0.5.20': + resolution: {integrity: sha512-vfw5/R00ysWG0iMLxqV8I5mVnHwjofxuLAL9i6wwdexIIXusG1ExSIOP8/W6xvjPXetgzEVRo4A7zr1S6SGBBg==} cpu: [arm] os: [linux] - '@libsql/linux-arm-musleabihf@0.5.17': - resolution: {integrity: sha512-vxOkSLG9Wspit+SNle84nuIzMtr2G2qaxFzW7BhsZBjlZ8+kErf9RXcT2YJQdJYxmBYRbsOrc91gg0jLEQVCqg==} + '@libsql/linux-arm-musleabihf@0.5.20': + resolution: {integrity: sha512-VGqyvg0k3bg0JMMHCR0XrqBseFU9syWRxEbC0Aluipkw5Xsb+DSr9cNvMtGUbGDg2pEfkY/DDa9hTlst6K7P5w==} cpu: [arm] os: [linux] - '@libsql/linux-arm64-gnu@0.5.17': - resolution: {integrity: sha512-L8jnaN01TxjBJlDuDTX2W2BKzBkAOhcnKfCOf3xzvvygblxnDOK0whkYwIXeTfwtd/rr4jN/d6dZD/bcHiDxEQ==} + '@libsql/linux-arm64-gnu@0.5.20': + resolution: {integrity: sha512-Wq6oF4goWp20G/LBmI6rdFY716bb81VCzyglkkAwqMwdJeIsaC0DRvD62nx1OSbSZmZMRDobqoe2ZP8BvMvXyQ==} cpu: [arm64] os: [linux] - '@libsql/linux-arm64-musl@0.5.17': - resolution: {integrity: sha512-HfFD7TzQtmmTwyQsuiHhWZdMRtdNpKJ1p4tbMMTMRECk+971NFHrj69D64cc2ClVTAmn7fA9XibKPil7WN/Q7w==} + '@libsql/linux-arm64-musl@0.5.20': + resolution: {integrity: sha512-Xb112/q3/Z6lKKhwJgR2QVRYtRQblEB69VbStIVjKKw5RZv+r77ZSOHfsR3RHL+R66VN431+DLJBV0+B+AImQw==} cpu: [arm64] os: [linux] - '@libsql/linux-x64-gnu@0.5.17': - resolution: {integrity: sha512-5l3XxWqUPVFrtX0xnZaXwqsXs0BFbP4w6ahRFTPSdXU50YBfUOajFznJRB6bJTMsCvraDSD0IkHhjSNfrE1CuQ==} + '@libsql/linux-x64-gnu@0.5.20': + resolution: {integrity: sha512-fHUaOYx7cVqbqPLqOIArfPsuWnu+jk9ETR0gt/8rH1J6pW5qhdDWn3B35Hk/ZmzNacBFSWZnHxxhWnZMWYVnVA==} cpu: [x64] os: [linux] - '@libsql/linux-x64-musl@0.5.17': - resolution: {integrity: sha512-FvSpWlwc+dIeYIFYlsSv+UdQ/NiZWr+SstwVji+QZ//8NnvzwWQU9cgP+Vpps6Qiq4jyYQm9chJhTYOVT9Y3BA==} + '@libsql/linux-x64-musl@0.5.20': + resolution: {integrity: sha512-EpT1Va1L/y2w0Sj75lxRmaTyX/MD32eKpZiz++3mrE2zRTYAURo9GEbglvSC6Y5aRnLcHPx6XmR25wigRb8WZg==} cpu: [x64] os: [linux] - '@libsql/win32-x64-msvc@0.5.17': - resolution: {integrity: sha512-f5bGH8+3A5sn6Lrqg8FsQ09a1pYXPnKGXGTFiAYlfQXVst1tUTxDTugnuWcJYKXyzDe/T7ccxyIZXeSmPOhq8A==} + '@libsql/win32-x64-msvc@0.5.20': + resolution: {integrity: sha512-3/G5/SZWXmOCaNwEwDdiXEpjeY7NGx1khPjON1yi3BViKrb2TJiiHHn6zpCN7+ZWNibQFZylkETSTURRlealNA==} cpu: [x64] os: [win32] @@ -2796,103 +2815,108 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.46.2': - resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + '@rollup/rollup-android-arm-eabi@4.50.0': + resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.46.2': - resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + '@rollup/rollup-android-arm64@4.50.0': + resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.46.2': - resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + '@rollup/rollup-darwin-arm64@4.50.0': + resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.46.2': - resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + '@rollup/rollup-darwin-x64@4.50.0': + resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.46.2': - resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + '@rollup/rollup-freebsd-arm64@4.50.0': + resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.46.2': - resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + '@rollup/rollup-freebsd-x64@4.50.0': + resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': - resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': + resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.46.2': - resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + '@rollup/rollup-linux-arm-musleabihf@4.50.0': + resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.46.2': - resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + '@rollup/rollup-linux-arm64-gnu@4.50.0': + resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.46.2': - resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + '@rollup/rollup-linux-arm64-musl@4.50.0': + resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': - resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': + resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.46.2': - resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + '@rollup/rollup-linux-ppc64-gnu@4.50.0': + resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.46.2': - resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + '@rollup/rollup-linux-riscv64-gnu@4.50.0': + resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.46.2': - resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + '@rollup/rollup-linux-riscv64-musl@4.50.0': + resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.46.2': - resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + '@rollup/rollup-linux-s390x-gnu@4.50.0': + resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.46.2': - resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + '@rollup/rollup-linux-x64-gnu@4.50.0': + resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.46.2': - resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + '@rollup/rollup-linux-x64-musl@4.50.0': + resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.46.2': - resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + '@rollup/rollup-openharmony-arm64@4.50.0': + resolution: {integrity: sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.50.0': + resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.46.2': - resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + '@rollup/rollup-win32-ia32-msvc@4.50.0': + resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.46.2': - resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + '@rollup/rollup-win32-x64-msvc@4.50.0': + resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} cpu: [x64] os: [win32] @@ -3001,65 +3025,65 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} - '@tailwindcss/node@4.1.11': - resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + '@tailwindcss/node@4.1.12': + resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} - '@tailwindcss/oxide-android-arm64@4.1.11': - resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + '@tailwindcss/oxide-android-arm64@4.1.12': + resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.11': - resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + '@tailwindcss/oxide-darwin-arm64@4.1.12': + resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.11': - resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + '@tailwindcss/oxide-darwin-x64@4.1.12': + resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.11': - resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + '@tailwindcss/oxide-freebsd-x64@4.1.12': + resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': - resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': - resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': - resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': - resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.11': - resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.11': - resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -3070,24 +3094,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': - resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': - resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.11': - resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + '@tailwindcss/oxide@4.1.12': + resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} engines: {node: '>= 10'} - '@tailwindcss/vite@4.1.11': - resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + '@tailwindcss/vite@4.1.12': + resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 @@ -3128,8 +3152,8 @@ packages: '@types/brotli@1.3.4': resolution: {integrity: sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw==} - '@types/bun@1.2.20': - resolution: {integrity: sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA==} + '@types/bun@1.2.21': + resolution: {integrity: sha512-NiDnvEqmbfQ6dmZ3EeUO577s4P5bf4HCTXtI6trMc6f6RzirY5IrF3aIookuSpyslFzrnvv2lmEWv5HyC1X79A==} '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -3215,8 +3239,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.2.1': - resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3245,17 +3269,20 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@19.1.7': + resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} + peerDependencies: + '@types/react': ^19.0.0 '@types/react-transition-group@4.4.10': resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} - '@types/react@19.1.10': - resolution: {integrity: sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==} + '@types/react@19.1.12': + resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} - '@types/refractor@3.4.1': - resolution: {integrity: sha512-wYuorIiCTSuvRT9srwt+taF6mH/ww+SyN2psM0sjef2qW+sS8GmshgDGTEDgWB1sTVGgYVE6EK7dBA2MxQxibg==} + '@types/refractor@4.0.0': + resolution: {integrity: sha512-qba+Qpzch8TqKwHPw3TIR8VaCK3o7spwnlQd51cbYgrZyBOc9K9kFSdH3zxlAmcD0RN6vWBwFZBe6FwJSfM/LA==} + deprecated: This is a stub types definition. refractor provides its own type definitions, so you do not need this installed. '@types/retry@0.12.1': resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} @@ -3305,39 +3332,39 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.39.1': - resolution: {integrity: sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==} + '@typescript-eslint/eslint-plugin@8.41.0': + resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.39.1 + '@typescript-eslint/parser': ^8.41.0 eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 + typescript: 5.9.2 '@typescript-eslint/parser@8.38.0': resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/parser@8.39.1': - resolution: {integrity: sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==} + '@typescript-eslint/parser@8.41.0': + resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 + typescript: 5.9.2 '@typescript-eslint/project-service@8.38.0': resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/project-service@8.39.1': - resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} + '@typescript-eslint/project-service@8.41.0': + resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 '@typescript-eslint/rule-tester@8.38.0': resolution: {integrity: sha512-uoGpIY8WdJw1KOnUTZTmp99k+DtpBJEKuGk/asSY6GfWz7vlF84p/EpTL6jraD0hW/3mkU/ipd5Nq0UxfIidsw==} @@ -3349,28 +3376,28 @@ packages: resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.39.1': - resolution: {integrity: sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==} + '@typescript-eslint/scope-manager@8.41.0': + resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.38.0': resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/tsconfig-utils@8.39.1': - resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} + '@typescript-eslint/tsconfig-utils@8.41.0': + resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.1': - resolution: {integrity: sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==} + '@typescript-eslint/type-utils@8.41.0': + resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 + typescript: 5.9.2 '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} @@ -3380,8 +3407,8 @@ packages: resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.39.1': - resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} + '@typescript-eslint/types@8.41.0': + resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -3397,27 +3424,27 @@ packages: resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/typescript-estree@8.39.1': - resolution: {integrity: sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==} + '@typescript-eslint/typescript-estree@8.41.0': + resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 '@typescript-eslint/utils@8.38.0': resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/utils@8.39.1': - resolution: {integrity: sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==} + '@typescript-eslint/utils@8.41.0': + resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 + typescript: 5.9.2 '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} @@ -3427,8 +3454,8 @@ packages: resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.39.1': - resolution: {integrity: sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==} + '@typescript-eslint/visitor-keys@8.41.0': + resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/analyze-trace@0.10.1': @@ -3517,7 +3544,7 @@ packages: '@vue/language-core@2.2.0': resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 peerDependenciesMeta: typescript: optional: true @@ -3973,8 +4000,8 @@ packages: builtins@5.1.0: resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - bun-types@1.2.20: - resolution: {integrity: sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA==} + bun-types@1.2.21: + resolution: {integrity: sha512-sa2Tj77Ijc/NTLS0/Odjq/qngmEPZfbfnOERi0KRUYhT9R8M4VBioWVmMWE5GrYbKMc+5lVybXygLdibHaqVqw==} peerDependencies: '@types/react': ^19 @@ -4329,7 +4356,7 @@ packages: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 peerDependenciesMeta: typescript: optional: true @@ -4811,8 +4838,8 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -5044,8 +5071,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -5348,8 +5375,9 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5616,8 +5644,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} get-uri@6.0.3: resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} @@ -5648,6 +5676,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regex.js@1.0.1: + resolution: {integrity: sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -6296,8 +6330,8 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true jju@1.4.0: @@ -6459,9 +6493,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libsql@0.5.17: - resolution: {integrity: sha512-RRlj5XQI9+Wq+/5UY8EnugSWfRmHEw4hn3DKlPrkUgZONsge1PwTtHcpStP6MSNi8ohcbsRgEHJaymA33a8cBw==} - cpu: [x64, arm64, wasm32, arm] + libsql@0.5.20: + resolution: {integrity: sha512-hkWCsiwTbNsrKeWqPh91ZZEcLDo0+WUnFv2QzITD33F7Er9KOlr7N2SGfNjAbnkciN+iPJ7g108Jkno1JFmzTw==} os: [darwin, linux, win32] light-my-request@5.13.0: @@ -6771,8 +6804,8 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - memfs@4.34.0: - resolution: {integrity: sha512-grcxk6xaTzKOJggz8H+rjN7IMPvMZkH3VbRzjOqfGUUqCrdKStCvD77pvpArqZQzyiNB1HWRmyijzmLQlyQyfw==} + memfs@4.38.2: + resolution: {integrity: sha512-FpWsVHpAkoSh/LfY1BgAl72BVd374ooMRtDi2VqzBycX4XEfvC0XKACCe0C9VRZoYq5viuoyTv6lYXZ/Q7TrLQ==} engines: {node: '>= 4.0.0'} memoize-one@6.0.0: @@ -7026,8 +7059,8 @@ packages: moize@6.1.6: resolution: {integrity: sha512-vSKdIUO61iCmTqhdoIDrqyrtp87nWZUmBPniNjO0fX49wEYmyDO4lvlnFXiGcaH1JLE/s/9HbiK4LSHsbiUY6Q==} - monaco-editor@0.45.0: - resolution: {integrity: sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==} + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} move-file@3.1.0: resolution: {integrity: sha512-4aE3U7CCBWgrQlQDMq8da4woBWDGHioJFiOZ8Ie6Yq2uwYQ9V2kGhTz4x3u6Wc+OU17nw0yc3rJ/lQ4jIiPe3A==} @@ -7878,10 +7911,10 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.1.1: + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: - react: ^18.3.1 + react: ^19.1.1 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -7898,8 +7931,8 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} read-package-up@11.0.0: @@ -8130,8 +8163,8 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true - rollup@4.46.2: - resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + rollup@4.50.0: + resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -8188,8 +8221,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} @@ -8390,9 +8423,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -8617,8 +8650,8 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwindcss@4.1.11: - resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + tailwindcss@4.1.12: + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -8672,8 +8705,8 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 @@ -8723,8 +8756,8 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} to-regex-range@5.0.1: @@ -8756,8 +8789,8 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tree-dump@1.0.2: - resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + tree-dump@1.0.3: + resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -8788,7 +8821,7 @@ packages: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 ts-morph@23.0.0: resolution: {integrity: sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==} @@ -8800,7 +8833,7 @@ packages: '@swc/core': '>=1.2.50' '@swc/wasm': '>=1.2.50' '@types/node': '*' - typescript: 5.8.3 + typescript: 5.9.2 peerDependenciesMeta: '@swc/core': optional: true @@ -8815,7 +8848,7 @@ packages: engines: {node: ^18 || >=20} hasBin: true peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 peerDependenciesMeta: typescript: optional: true @@ -8838,10 +8871,10 @@ packages: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - tsx@4.20.3: - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + tsx@4.20.5: + resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==} engines: {node: '>=18.0.0'} hasBin: true @@ -8888,15 +8921,15 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.39.1: - resolution: {integrity: sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==} + typescript-eslint@8.41.0: + resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 + typescript: 5.9.2 - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true @@ -9110,7 +9143,7 @@ packages: valibot@0.42.1: resolution: {integrity: sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 peerDependenciesMeta: typescript: optional: true @@ -9163,7 +9196,7 @@ packages: vite-plugin-dts@4.5.4: resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: - typescript: 5.8.3 + typescript: 5.9.2 vite: '*' peerDependenciesMeta: vite: @@ -9215,8 +9248,8 @@ packages: terser: optional: true - vite@7.1.0: - resolution: {integrity: sha512-3jdAy3NhBJYsa/lCFcnRfbK4kNkO/bhijFCnv5ByUQk/eekYagoV2yQSISUrhpV+5JiY5hmwOh7jNnQ68dFMuQ==} + vite@7.1.3: + resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -9468,9 +9501,9 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} - engines: {node: '>= 14'} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@18.1.3: @@ -9713,11 +9746,11 @@ snapshots: '@bugsnag/safe-json-stringify@6.0.0': {} - '@builder.io/vite-plugin-macro@0.0.7(@types/node@24.2.1)(lightningcss@1.30.1)(rollup@4.46.2)(terser@5.43.1)': + '@builder.io/vite-plugin-macro@0.0.7(@types/node@24.3.0)(lightningcss@1.30.1)(rollup@4.50.0)(terser@5.43.1)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.2.0(rollup@4.50.0) magic-string: 0.30.17 - vite-node: 0.32.4(@types/node@24.2.1)(lightningcss@1.30.1)(terser@5.43.1) + vite-node: 0.32.4(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - less @@ -9878,14 +9911,14 @@ snapshots: human-id: 4.1.1 prettier: 3.6.2 - '@clack/core@0.3.4': + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/prompts@0.7.0': + '@clack/prompts@0.11.0': dependencies: - '@clack/core': 0.3.4 + '@clack/core': 0.5.0 picocolors: 1.1.1 sisteransi: 1.0.5 @@ -9962,19 +9995,19 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.1) '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 - react: 18.3.1 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.12 '@emotion/serialize@1.3.3': dependencies: @@ -9986,24 +10019,24 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1) '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.1) '@emotion/utils': 1.4.2 - react: 18.3.1 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.12 '@emotion/unitless@0.10.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)': + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.1)': dependencies: - react: 18.3.1 + react: 19.1.1 '@emotion/utils@1.4.2': {} @@ -10022,7 +10055,7 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.10.0 + get-tsconfig: 4.10.1 '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': dependencies: @@ -10040,7 +10073,7 @@ snapshots: '@esbuild/aix-ppc64@0.25.6': optional: true - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/aix-ppc64@0.25.9': optional: true '@esbuild/android-arm64@0.17.19': @@ -10055,7 +10088,7 @@ snapshots: '@esbuild/android-arm64@0.25.6': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-arm64@0.25.9': optional: true '@esbuild/android-arm@0.15.18': @@ -10073,7 +10106,7 @@ snapshots: '@esbuild/android-arm@0.25.6': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/android-arm@0.25.9': optional: true '@esbuild/android-x64@0.17.19': @@ -10088,7 +10121,7 @@ snapshots: '@esbuild/android-x64@0.25.6': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/android-x64@0.25.9': optional: true '@esbuild/darwin-arm64@0.17.19': @@ -10103,7 +10136,7 @@ snapshots: '@esbuild/darwin-arm64@0.25.6': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/darwin-arm64@0.25.9': optional: true '@esbuild/darwin-x64@0.17.19': @@ -10118,7 +10151,7 @@ snapshots: '@esbuild/darwin-x64@0.25.6': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/darwin-x64@0.25.9': optional: true '@esbuild/freebsd-arm64@0.17.19': @@ -10133,7 +10166,7 @@ snapshots: '@esbuild/freebsd-arm64@0.25.6': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/freebsd-arm64@0.25.9': optional: true '@esbuild/freebsd-x64@0.17.19': @@ -10148,7 +10181,7 @@ snapshots: '@esbuild/freebsd-x64@0.25.6': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.9': optional: true '@esbuild/linux-arm64@0.17.19': @@ -10163,7 +10196,7 @@ snapshots: '@esbuild/linux-arm64@0.25.6': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/linux-arm64@0.25.9': optional: true '@esbuild/linux-arm@0.17.19': @@ -10178,7 +10211,7 @@ snapshots: '@esbuild/linux-arm@0.25.6': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/linux-arm@0.25.9': optional: true '@esbuild/linux-ia32@0.17.19': @@ -10193,7 +10226,7 @@ snapshots: '@esbuild/linux-ia32@0.25.6': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/linux-ia32@0.25.9': optional: true '@esbuild/linux-loong64@0.15.18': @@ -10211,7 +10244,7 @@ snapshots: '@esbuild/linux-loong64@0.25.6': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/linux-loong64@0.25.9': optional: true '@esbuild/linux-mips64el@0.17.19': @@ -10226,7 +10259,7 @@ snapshots: '@esbuild/linux-mips64el@0.25.6': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/linux-mips64el@0.25.9': optional: true '@esbuild/linux-ppc64@0.17.19': @@ -10241,7 +10274,7 @@ snapshots: '@esbuild/linux-ppc64@0.25.6': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/linux-ppc64@0.25.9': optional: true '@esbuild/linux-riscv64@0.17.19': @@ -10256,7 +10289,7 @@ snapshots: '@esbuild/linux-riscv64@0.25.6': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/linux-riscv64@0.25.9': optional: true '@esbuild/linux-s390x@0.17.19': @@ -10271,7 +10304,7 @@ snapshots: '@esbuild/linux-s390x@0.25.6': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/linux-s390x@0.25.9': optional: true '@esbuild/linux-x64@0.17.19': @@ -10286,7 +10319,7 @@ snapshots: '@esbuild/linux-x64@0.25.6': optional: true - '@esbuild/linux-x64@0.25.8': + '@esbuild/linux-x64@0.25.9': optional: true '@esbuild/netbsd-arm64@0.25.4': @@ -10295,7 +10328,7 @@ snapshots: '@esbuild/netbsd-arm64@0.25.6': optional: true - '@esbuild/netbsd-arm64@0.25.8': + '@esbuild/netbsd-arm64@0.25.9': optional: true '@esbuild/netbsd-x64@0.17.19': @@ -10310,7 +10343,7 @@ snapshots: '@esbuild/netbsd-x64@0.25.6': optional: true - '@esbuild/netbsd-x64@0.25.8': + '@esbuild/netbsd-x64@0.25.9': optional: true '@esbuild/openbsd-arm64@0.25.4': @@ -10319,7 +10352,7 @@ snapshots: '@esbuild/openbsd-arm64@0.25.6': optional: true - '@esbuild/openbsd-arm64@0.25.8': + '@esbuild/openbsd-arm64@0.25.9': optional: true '@esbuild/openbsd-x64@0.17.19': @@ -10334,13 +10367,13 @@ snapshots: '@esbuild/openbsd-x64@0.25.6': optional: true - '@esbuild/openbsd-x64@0.25.8': + '@esbuild/openbsd-x64@0.25.9': optional: true '@esbuild/openharmony-arm64@0.25.6': optional: true - '@esbuild/openharmony-arm64@0.25.8': + '@esbuild/openharmony-arm64@0.25.9': optional: true '@esbuild/sunos-x64@0.17.19': @@ -10355,7 +10388,7 @@ snapshots: '@esbuild/sunos-x64@0.25.6': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/sunos-x64@0.25.9': optional: true '@esbuild/win32-arm64@0.17.19': @@ -10370,7 +10403,7 @@ snapshots: '@esbuild/win32-arm64@0.25.6': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.25.9': optional: true '@esbuild/win32-ia32@0.17.19': @@ -10385,7 +10418,7 @@ snapshots: '@esbuild/win32-ia32@0.25.6': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-ia32@0.25.9': optional: true '@esbuild/win32-x64@0.17.19': @@ -10400,12 +10433,12 @@ snapshots: '@esbuild/win32-x64@0.25.6': optional: true - '@esbuild/win32-x64@0.25.8': + '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': dependencies: - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -10624,7 +10657,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -10634,6 +10667,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -10659,37 +10697,56 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.1.0(tslib@2.8.1)': + '@jsonjoy.com/buffers@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.11.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 - '@libsql/client@0.15.10': + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: - '@libsql/core': 0.15.10 + '@jsonjoy.com/buffers': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + + '@libsql/client@0.15.14': + dependencies: + '@libsql/core': 0.15.14 '@libsql/hrana-client': 0.7.0 js-base64: 3.7.7 - libsql: 0.5.17 + libsql: 0.5.20 promise-limit: 2.7.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@libsql/core@0.15.10': + '@libsql/core@0.15.14': dependencies: js-base64: 3.7.7 - '@libsql/darwin-arm64@0.5.17': + '@libsql/darwin-arm64@0.5.20': optional: true - '@libsql/darwin-x64@0.5.17': + '@libsql/darwin-x64@0.5.20': optional: true '@libsql/hrana-client@0.7.0': @@ -10712,25 +10769,25 @@ snapshots: - bufferutil - utf-8-validate - '@libsql/linux-arm-gnueabihf@0.5.17': + '@libsql/linux-arm-gnueabihf@0.5.20': optional: true - '@libsql/linux-arm-musleabihf@0.5.17': + '@libsql/linux-arm-musleabihf@0.5.20': optional: true - '@libsql/linux-arm64-gnu@0.5.17': + '@libsql/linux-arm64-gnu@0.5.20': optional: true - '@libsql/linux-arm64-musl@0.5.17': + '@libsql/linux-arm64-musl@0.5.20': optional: true - '@libsql/linux-x64-gnu@0.5.17': + '@libsql/linux-x64-gnu@0.5.20': optional: true - '@libsql/linux-x64-musl@0.5.17': + '@libsql/linux-x64-musl@0.5.20': optional: true - '@libsql/win32-x64-msvc@0.5.17': + '@libsql/win32-x64-msvc@0.5.20': optional: true '@lukeed/ms@2.0.2': {} @@ -10786,7 +10843,7 @@ snapshots: remark-mdx: 3.0.1 remark-parse: 11.0.0 remark-rehype: 11.1.0 - source-map: 0.7.4 + source-map: 0.7.6 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 @@ -10796,41 +10853,41 @@ snapshots: - acorn - supports-color - '@microsoft/api-documenter@7.26.31(@types/node@24.2.1)': + '@microsoft/api-documenter@7.26.31(@types/node@24.3.0)': dependencies: - '@microsoft/api-extractor-model': 7.30.7(@types/node@24.2.1) + '@microsoft/api-extractor-model': 7.30.7(@types/node@24.3.0) '@microsoft/tsdoc': 0.15.1 - '@rushstack/node-core-library': 5.14.0(@types/node@24.2.1) - '@rushstack/terminal': 0.15.4(@types/node@24.2.1) - '@rushstack/ts-command-line': 5.0.2(@types/node@24.2.1) + '@rushstack/node-core-library': 5.14.0(@types/node@24.3.0) + '@rushstack/terminal': 0.15.4(@types/node@24.3.0) + '@rushstack/ts-command-line': 5.0.2(@types/node@24.3.0) js-yaml: 3.13.1 resolve: 1.22.10 transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.30.7(@types/node@24.2.1)': + '@microsoft/api-extractor-model@7.30.7(@types/node@24.3.0)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@24.2.1) + '@rushstack/node-core-library': 5.14.0(@types/node@24.3.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.10(@types/node@24.2.1)': + '@microsoft/api-extractor@7.52.10(@types/node@24.3.0)': dependencies: - '@microsoft/api-extractor-model': 7.30.7(@types/node@24.2.1) + '@microsoft/api-extractor-model': 7.30.7(@types/node@24.3.0) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@24.2.1) + '@rushstack/node-core-library': 5.14.0(@types/node@24.3.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.4(@types/node@24.2.1) - '@rushstack/ts-command-line': 5.0.2(@types/node@24.2.1) + '@rushstack/terminal': 0.15.4(@types/node@24.3.0) + '@rushstack/ts-command-line': 5.0.2(@types/node@24.3.0) lodash: 4.17.21 minimatch: 10.0.3 resolve: 1.22.10 semver: 7.5.4 source-map: 0.6.1 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - '@types/node' @@ -10843,9 +10900,9 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@modular-forms/qwik@0.23.1(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)))': + '@modular-forms/qwik@0.23.1(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': dependencies: - '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))' + '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' '@modular-forms/qwik@0.24.0': dependencies: @@ -10853,89 +10910,89 @@ snapshots: '@mui/core-downloads-tracker@5.16.7': {} - '@mui/material@5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 '@mui/core-downloads-tracker': 5.16.7 - '@mui/system': 5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@19.1.10) - '@mui/utils': 5.16.6(@types/react@19.1.10)(react@18.3.1) + '@mui/system': 5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) + '@mui/types': 7.2.15(@types/react@19.1.12) + '@mui/utils': 5.16.6(@types/react@19.1.12)(react@19.1.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.10 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1) - '@types/react': 19.1.10 + '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) + '@types/react': 19.1.12 - '@mui/private-theming@5.16.6(@types/react@19.1.10)(react@18.3.1)': + '@mui/private-theming@5.16.6(@types/react@19.1.12)(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 - '@mui/utils': 5.16.6(@types/react@19.1.10)(react@18.3.1) + '@mui/utils': 5.16.6(@types/react@19.1.12)(react@19.1.1) prop-types: 15.8.1 - react: 18.3.1 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.12 - '@mui/styled-engine@5.16.6(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.16.6(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 '@emotion/cache': 11.14.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 + react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) - '@mui/system@5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1)': + '@mui/system@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 - '@mui/private-theming': 5.16.6(@types/react@19.1.10)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.15(@types/react@19.1.10) - '@mui/utils': 5.16.6(@types/react@19.1.10)(react@18.3.1) + '@mui/private-theming': 5.16.6(@types/react@19.1.12)(react@19.1.1) + '@mui/styled-engine': 5.16.6(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1) + '@mui/types': 7.2.15(@types/react@19.1.12) + '@mui/utils': 5.16.6(@types/react@19.1.12)(react@19.1.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 + react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1) - '@types/react': 19.1.10 + '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) + '@types/react': 19.1.12 - '@mui/types@7.2.15(@types/react@19.1.10)': + '@mui/types@7.2.15(@types/react@19.1.12)': optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.12 - '@mui/utils@5.16.6(@types/react@19.1.10)(react@18.3.1)': + '@mui/utils@5.16.6(@types/react@19.1.12)(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 - '@mui/types': 7.2.15(@types/react@19.1.10) + '@mui/types': 7.2.15(@types/react@19.1.12) '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 - react: 18.3.1 + react: 19.1.1 react-is: 18.3.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.12 - '@mui/x-data-grid@6.20.4(@mui/material@5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-data-grid@6.20.4(@mui/material@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.24.6 - '@mui/material': 5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.16.4(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1))(@types/react@19.1.10)(react@18.3.1) - '@mui/utils': 5.16.6(@types/react@19.1.10)(react@18.3.1) + '@mui/material': 5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/system': 5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) + '@mui/utils': 5.16.6(@types/react@19.1.12)(react@19.1.1) clsx: 2.1.1 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) reselect: 4.1.8 transitivePeerDependencies: - '@types/react' @@ -10968,10 +11025,10 @@ snapshots: minimatch: 9.0.5 read-pkg: 7.1.0 semver: 7.7.2 - yaml: 2.6.1 + yaml: 2.8.1 yargs: 17.7.2 - '@netlify/build@32.1.4(@opentelemetry/api@1.8.0)(@types/node@24.2.1)(picomatch@4.0.3)(rollup@4.46.2)': + '@netlify/build@32.1.4(@opentelemetry/api@1.8.0)(@types/node@24.3.0)(picomatch@4.0.3)(rollup@4.50.0)': dependencies: '@bugsnag/js': 7.25.0 '@netlify/blobs': 8.2.0 @@ -10979,19 +11036,19 @@ snapshots: '@netlify/config': 22.2.0 '@netlify/edge-bundler': 13.0.3 '@netlify/framework-info': 9.9.3 - '@netlify/functions-utils': 5.3.18(rollup@4.46.2)(supports-color@9.4.0) + '@netlify/functions-utils': 5.3.18(rollup@4.50.0)(supports-color@9.4.0) '@netlify/git-utils': 5.2.0 '@netlify/opentelemetry-utils': 1.3.1(@opentelemetry/api@1.8.0) '@netlify/plugins-list': 6.80.0 '@netlify/run-utils': 5.2.0 - '@netlify/zip-it-and-ship-it': 10.1.1(rollup@4.46.2)(supports-color@9.4.0) + '@netlify/zip-it-and-ship-it': 10.1.1(rollup@4.50.0)(supports-color@9.4.0) '@opentelemetry/api': 1.8.0 '@sindresorhus/slugify': 2.2.1 ansi-escapes: 6.2.1 chalk: 5.5.0 clean-stack: 5.2.0 execa: 7.2.0 - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) figures: 5.0.0 filter-obj: 5.1.0 got: 12.6.1 @@ -11028,8 +11085,8 @@ snapshots: strip-ansi: 7.1.0 supports-color: 9.4.0 terminal-link: 3.0.0 - ts-node: 10.9.2(@types/node@24.2.1)(typescript@5.8.3) - typescript: 5.8.3 + ts-node: 10.9.2(@types/node@24.3.0)(typescript@5.9.2) + typescript: 5.9.2 uuid: 9.0.1 yargs: 17.7.2 transitivePeerDependencies: @@ -11169,9 +11226,9 @@ snapshots: read-pkg-up: 9.1.0 semver: 7.7.2 - '@netlify/functions-utils@5.3.18(rollup@4.46.2)(supports-color@9.4.0)': + '@netlify/functions-utils@5.3.18(rollup@4.50.0)(supports-color@9.4.0)': dependencies: - '@netlify/zip-it-and-ship-it': 10.1.1(rollup@4.46.2)(supports-color@9.4.0) + '@netlify/zip-it-and-ship-it': 10.1.1(rollup@4.50.0)(supports-color@9.4.0) cpy: 9.0.1 path-exists: 5.0.0 transitivePeerDependencies: @@ -11273,13 +11330,13 @@ snapshots: '@netlify/types@2.0.2': {} - '@netlify/zip-it-and-ship-it@10.1.1(rollup@4.46.2)(supports-color@9.4.0)': + '@netlify/zip-it-and-ship-it@10.1.1(rollup@4.50.0)(supports-color@9.4.0)': dependencies: '@babel/parser': 7.27.5 '@babel/types': 7.27.1 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 1.41.2 - '@vercel/nft': 0.27.7(rollup@4.46.2)(supports-color@9.4.0) + '@vercel/nft': 0.27.7(rollup@4.50.0)(supports-color@9.4.0) archiver: 5.3.2 common-path-prefix: 3.0.0 cp-file: 10.0.0 @@ -11578,99 +11635,102 @@ snapshots: transitivePeerDependencies: - supports-color - '@qwik-ui/headless@0.6.7(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)))': + '@qwik-ui/headless@0.6.7(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': dependencies: - '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))' + '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' '@floating-ui/core': 1.6.2 '@floating-ui/dom': 1.6.5 '@oddbird/popover-polyfill': 0.4.3 body-scroll-lock-upgrade: 1.1.0 focus-trap: 7.5.4 - '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))': + '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: csstype: 3.1.3 - rollup: 4.46.2 - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + rollup: 4.50.0 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) optionalDependencies: prettier: 3.6.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) '@qwik.dev/partytown@0.11.2': dependencies: dotenv: 16.5.0 - '@rollup/pluginutils@5.2.0(rollup@4.46.2)': + '@rollup/pluginutils@5.2.0(rollup@4.50.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.46.2 + rollup: 4.50.0 + + '@rollup/rollup-android-arm-eabi@4.50.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.46.2': + '@rollup/rollup-android-arm64@4.50.0': optional: true - '@rollup/rollup-android-arm64@4.46.2': + '@rollup/rollup-darwin-arm64@4.50.0': optional: true - '@rollup/rollup-darwin-arm64@4.46.2': + '@rollup/rollup-darwin-x64@4.50.0': optional: true - '@rollup/rollup-darwin-x64@4.46.2': + '@rollup/rollup-freebsd-arm64@4.50.0': optional: true - '@rollup/rollup-freebsd-arm64@4.46.2': + '@rollup/rollup-freebsd-x64@4.50.0': optional: true - '@rollup/rollup-freebsd-x64@4.46.2': + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + '@rollup/rollup-linux-arm-musleabihf@4.50.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.46.2': + '@rollup/rollup-linux-arm64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.46.2': + '@rollup/rollup-linux-arm64-musl@4.50.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.46.2': + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + '@rollup/rollup-linux-ppc64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.46.2': + '@rollup/rollup-linux-riscv64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.46.2': + '@rollup/rollup-linux-riscv64-musl@4.50.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.46.2': + '@rollup/rollup-linux-s390x-gnu@4.50.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.46.2': + '@rollup/rollup-linux-x64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.46.2': + '@rollup/rollup-linux-x64-musl@4.50.0': optional: true - '@rollup/rollup-linux-x64-musl@4.46.2': + '@rollup/rollup-openharmony-arm64@4.50.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.46.2': + '@rollup/rollup-win32-arm64-msvc@4.50.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.46.2': + '@rollup/rollup-win32-ia32-msvc@4.50.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.46.2': + '@rollup/rollup-win32-x64-msvc@4.50.0': optional: true '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.14.0(@types/node@24.2.1)': + '@rushstack/node-core-library@5.14.0(@types/node@24.3.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -11681,23 +11741,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.4(@types/node@24.2.1)': + '@rushstack/terminal@0.15.4(@types/node@24.3.0)': dependencies: - '@rushstack/node-core-library': 5.14.0(@types/node@24.2.1) + '@rushstack/node-core-library': 5.14.0(@types/node@24.3.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 - '@rushstack/ts-command-line@5.0.2(@types/node@24.2.1)': + '@rushstack/ts-command-line@5.0.2(@types/node@24.3.0)': dependencies: - '@rushstack/terminal': 0.15.4(@types/node@24.2.1) + '@rushstack/terminal': 0.15.4(@types/node@24.3.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -11822,76 +11882,76 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/node@4.1.11': + '@tailwindcss/node@4.1.12': dependencies: - '@ampproject/remapping': 2.3.0 - enhanced-resolve: 5.18.1 - jiti: 2.4.2 + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.5.1 lightningcss: 1.30.1 magic-string: 0.30.17 source-map-js: 1.2.1 - tailwindcss: 4.1.11 + tailwindcss: 4.1.12 - '@tailwindcss/oxide-android-arm64@4.1.11': + '@tailwindcss/oxide-android-arm64@4.1.12': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.11': + '@tailwindcss/oxide-darwin-arm64@4.1.12': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.11': + '@tailwindcss/oxide-darwin-x64@4.1.12': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.11': + '@tailwindcss/oxide-freebsd-x64@4.1.12': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.11': + '@tailwindcss/oxide-linux-x64-musl@4.1.12': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.11': + '@tailwindcss/oxide-wasm32-wasi@4.1.12': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': optional: true - '@tailwindcss/oxide@4.1.11': + '@tailwindcss/oxide@4.1.12': dependencies: detect-libc: 2.0.4 tar: 7.4.3 optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-x64': 4.1.11 - '@tailwindcss/oxide-freebsd-x64': 4.1.11 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-x64-musl': 4.1.11 - '@tailwindcss/oxide-wasm32-wasi': 4.1.11 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 - - '@tailwindcss/vite@4.1.11(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))': - dependencies: - '@tailwindcss/node': 4.1.11 - '@tailwindcss/oxide': 4.1.11 - tailwindcss: 4.1.11 - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + '@tailwindcss/oxide-android-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-x64': 4.1.12 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 + + '@tailwindcss/vite@4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + tailwindcss: 4.1.12 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) '@tokenizer/token@0.3.0': {} @@ -11923,15 +11983,15 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/brotli@1.3.4': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 - '@types/bun@1.2.20(@types/react@19.1.10)': + '@types/bun@1.2.21(@types/react@19.1.12)': dependencies: - bun-types: 1.2.20(@types/react@19.1.10) + bun-types: 1.2.21(@types/react@19.1.12) transitivePeerDependencies: - '@types/react' @@ -11941,11 +12001,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/debug@4.1.12': dependencies: @@ -11963,7 +12023,7 @@ snapshots: '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -11990,7 +12050,7 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -12022,11 +12082,11 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/node@12.20.55': {} - '@types/node@24.2.1': + '@types/node@24.3.0': dependencies: undici-types: 7.10.0 @@ -12042,7 +12102,7 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 kleur: 3.0.3 '@types/prop-types@15.7.12': {} @@ -12051,21 +12111,21 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@18.3.0': + '@types/react-dom@19.1.7(@types/react@19.1.12)': dependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.12 '@types/react-transition-group@4.4.10': dependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.12 - '@types/react@19.1.10': + '@types/react@19.1.12': dependencies: csstype: 3.1.3 - '@types/refractor@3.4.1': + '@types/refractor@4.0.0': dependencies: - '@types/prismjs': 1.26.5 + refractor: 4.8.1 '@types/retry@0.12.1': {} @@ -12076,17 +12136,17 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/send': 0.17.5 '@types/set-cookie-parser@2.4.10': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/tmp@0.2.6': {} @@ -12100,7 +12160,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 '@types/yargs-parser@21.0.3': {} @@ -12114,75 +12174,75 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 optional: true - '@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.39.1 - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/type-utils': 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 + eslint: 9.33.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.38.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1(supports-color@9.4.0) - eslint: 9.33.0(jiti@2.4.2) - typescript: 5.8.3 + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 debug: 4.4.1(supports-color@9.4.0) - eslint: 9.33.0(jiti@2.4.2) - typescript: 5.8.3 + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.38.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.8.3) - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 debug: 4.4.1(supports-color@9.4.0) - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.1(typescript@5.8.3)': + '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.8.3) - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 debug: 4.4.1(supports-color@9.4.0) - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/rule-tester@8.38.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/parser': 8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.38.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) ajv: 6.12.6 - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.5.1) json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 semver: 7.7.2 @@ -12195,28 +12255,28 @@ snapshots: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 - '@typescript-eslint/scope-manager@8.39.1': + '@typescript-eslint/scope-manager@8.41.0': dependencies: - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) debug: 4.4.1(supports-color@9.4.0) - eslint: 9.33.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + eslint: 9.33.0(jiti@2.5.1) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12224,9 +12284,9 @@ snapshots: '@typescript-eslint/types@8.38.0': {} - '@typescript-eslint/types@8.39.1': {} + '@typescript-eslint/types@8.41.0': {} - '@typescript-eslint/typescript-estree@5.62.0(supports-color@9.4.0)(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@5.62.0(supports-color@9.4.0)(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -12234,16 +12294,16 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.2 - tsutils: 3.21.0(typescript@5.8.3) + tsutils: 3.21.0(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/project-service': 8.38.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1(supports-color@9.4.0) @@ -12251,46 +12311,46 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.39.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.1(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.8.3) - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 debug: 4.4.1(supports-color@9.4.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.38.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - eslint: 9.33.0(jiti@2.4.2) - typescript: 5.8.3 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.8.3) - eslint: 9.33.0(jiti@2.4.2) - typescript: 5.8.3 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -12304,9 +12364,9 @@ snapshots: '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.39.1': + '@typescript-eslint/visitor-keys@8.41.0': dependencies: - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/types': 8.41.0 eslint-visitor-keys: 4.2.1 '@typescript/analyze-trace@0.10.1': @@ -12326,14 +12386,14 @@ snapshots: dependencies: unpic: 3.18.0 - '@unpic/qwik@0.0.38(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)))': + '@unpic/qwik@0.0.38(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': dependencies: - '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))' + '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' - '@vercel/nft@0.27.7(rollup@4.46.2)(supports-color@9.4.0)': + '@vercel/nft@0.27.7(rollup@4.50.0)(supports-color@9.4.0)': dependencies: '@mapbox/node-pre-gyp': 1.0.11(supports-color@9.4.0) - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.2.0(rollup@4.50.0) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -12349,11 +12409,11 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12368,7 +12428,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -12380,13 +12440,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1))': + '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -12444,7 +12504,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.8.3)': + '@vue/language-core@2.2.0(typescript@5.9.2)': dependencies: '@volar/language-core': 2.4.15 '@vue/compiler-dom': 3.5.17 @@ -12455,7 +12515,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 '@vue/shared@3.5.17': {} @@ -13029,10 +13089,10 @@ snapshots: dependencies: semver: 7.7.2 - bun-types@1.2.20(@types/react@19.1.10): + bun-types@1.2.21(@types/react@19.1.12): dependencies: - '@types/node': 24.2.1 - '@types/react': 19.1.10 + '@types/node': 24.3.0 + '@types/react': 19.1.12 bundle-name@4.1.0: dependencies: @@ -13358,14 +13418,14 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@9.0.0(typescript@5.8.3): + cosmiconfig@9.0.0(typescript@5.9.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 cp-file@10.0.0: dependencies: @@ -13611,10 +13671,10 @@ snapshots: detective-typescript@11.2.0(supports-color@9.4.0): dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(supports-color@9.4.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 5.62.0(supports-color@9.4.0)(typescript@5.9.2) ast-module-types: 5.0.0 node-source-walk: 6.0.2 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -13675,16 +13735,16 @@ snapshots: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.25.8 - esbuild-register: 3.5.0(esbuild@0.25.8) + esbuild: 0.25.9 + esbuild-register: 3.5.0(esbuild@0.25.9) transitivePeerDependencies: - supports-color - drizzle-orm@0.44.4(@libsql/client@0.15.10)(@opentelemetry/api@1.8.0)(bun-types@1.2.20(@types/react@19.1.10)): + drizzle-orm@0.44.4(@libsql/client@0.15.14)(@opentelemetry/api@1.8.0)(bun-types@1.2.21(@types/react@19.1.12)): optionalDependencies: - '@libsql/client': 0.15.10 + '@libsql/client': 0.15.14 '@opentelemetry/api': 1.8.0 - bun-types: 1.2.20(@types/react@19.1.10) + bun-types: 1.2.21(@types/react@19.1.12) dunder-proto@1.0.1: dependencies: @@ -13725,7 +13785,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -13903,14 +13963,14 @@ snapshots: esbuild-openbsd-64@0.15.18: optional: true - esbuild-plugin-raw@0.2.0(esbuild@0.25.8): + esbuild-plugin-raw@0.2.0(esbuild@0.25.9): dependencies: - esbuild: 0.25.8 + esbuild: 0.25.9 - esbuild-register@3.5.0(esbuild@0.25.8): + esbuild-register@3.5.0(esbuild@0.25.9): dependencies: debug: 4.4.1(supports-color@9.4.0) - esbuild: 0.25.8 + esbuild: 0.25.9 transitivePeerDependencies: - supports-color @@ -14058,34 +14118,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.6 '@esbuild/win32-x64': 0.25.6 - esbuild@0.25.8: + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} @@ -14115,16 +14175,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(eslint@9.33.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(eslint@9.33.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14133,9 +14193,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14162,9 +14222,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.33.0(jiti@2.4.2): + eslint@9.33.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 @@ -14200,7 +14260,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color @@ -14244,7 +14304,7 @@ snapshots: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.8.6 - source-map: 0.7.4 + source-map: 0.7.6 estree-util-value-to-estree@3.4.0: dependencies: @@ -14523,7 +14583,7 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -14803,7 +14863,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -14840,6 +14900,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.0.1(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.4.1: {} glob@10.4.5: @@ -15581,7 +15645,7 @@ snapshots: jiti@1.21.0: {} - jiti@2.4.2: {} + jiti@2.5.1: {} jju@1.4.0: {} @@ -15738,20 +15802,20 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libsql@0.5.17: + libsql@0.5.20: dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.5.17 - '@libsql/darwin-x64': 0.5.17 - '@libsql/linux-arm-gnueabihf': 0.5.17 - '@libsql/linux-arm-musleabihf': 0.5.17 - '@libsql/linux-arm64-gnu': 0.5.17 - '@libsql/linux-arm64-musl': 0.5.17 - '@libsql/linux-x64-gnu': 0.5.17 - '@libsql/linux-x64-musl': 0.5.17 - '@libsql/win32-x64-msvc': 0.5.17 + '@libsql/darwin-arm64': 0.5.20 + '@libsql/darwin-x64': 0.5.20 + '@libsql/linux-arm-gnueabihf': 0.5.20 + '@libsql/linux-arm-musleabihf': 0.5.20 + '@libsql/linux-arm64-gnu': 0.5.20 + '@libsql/linux-arm64-musl': 0.5.20 + '@libsql/linux-x64-gnu': 0.5.20 + '@libsql/linux-x64-musl': 0.5.20 + '@libsql/win32-x64-msvc': 0.5.20 light-my-request@5.13.0: dependencies: @@ -16167,11 +16231,13 @@ snapshots: media-typer@0.3.0: {} - memfs@4.34.0: + memfs@4.38.2: dependencies: - '@jsonjoy.com/json-pack': 1.1.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - tree-dump: 1.0.2(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.11.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.0.1(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.0.3(tslib@2.8.1) tslib: 2.8.1 memoize-one@6.0.0: {} @@ -16569,7 +16635,7 @@ snapshots: fast-equals: 3.0.3 micro-memoize: 4.1.2 - monaco-editor@0.45.0: {} + monaco-editor@0.52.2: {} move-file@3.1.0: dependencies: @@ -16612,12 +16678,12 @@ snapshots: nested-error-stacks@2.1.1: {} - netlify-cli@21.5.0(@types/express@5.0.3)(@types/node@24.2.1)(picomatch@4.0.3)(rollup@4.46.2): + netlify-cli@21.5.0(@types/express@5.0.3)(@types/node@24.3.0)(picomatch@4.0.3)(rollup@4.50.0): dependencies: '@fastify/static': 7.0.4 '@netlify/api': 13.4.0 '@netlify/blobs': 8.2.0 - '@netlify/build': 32.1.4(@opentelemetry/api@1.8.0)(@types/node@24.2.1)(picomatch@4.0.3)(rollup@4.46.2) + '@netlify/build': 32.1.4(@opentelemetry/api@1.8.0)(@types/node@24.3.0)(picomatch@4.0.3)(rollup@4.50.0) '@netlify/build-info': 9.0.4 '@netlify/config': 22.2.0 '@netlify/edge-bundler': 13.0.3 @@ -16625,7 +16691,7 @@ snapshots: '@netlify/headers-parser': 8.0.0 '@netlify/local-functions-proxy': 2.0.3 '@netlify/redirect-parser': 14.5.1 - '@netlify/zip-it-and-ship-it': 10.1.1(rollup@4.46.2)(supports-color@9.4.0) + '@netlify/zip-it-and-ship-it': 10.1.1(rollup@4.50.0)(supports-color@9.4.0) '@octokit/rest': 21.1.1 '@opentelemetry/api': 1.8.0 '@pnpm/tabtab': 0.5.4 @@ -17435,10 +17501,10 @@ snapshots: - supports-color - utf-8-validate - puppeteer@22.13.1(typescript@5.8.3): + puppeteer@22.13.1(typescript@5.9.2): dependencies: '@puppeteer/browsers': 2.2.4 - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.2) devtools-protocol: 0.0.1299070 puppeteer-core: 22.13.1 transitivePeerDependencies: @@ -17502,11 +17568,10 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@18.3.1(react@18.3.1): + react-dom@19.1.1(react@19.1.1): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.1.1 + scheduler: 0.26.0 react-is@16.13.1: {} @@ -17514,18 +17579,16 @@ snapshots: react-is@18.3.1: {} - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-transition-group@4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.24.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.1.1: {} read-package-up@11.0.0: dependencies: @@ -17836,30 +17899,31 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.46.2: + rollup@4.50.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.46.2 - '@rollup/rollup-android-arm64': 4.46.2 - '@rollup/rollup-darwin-arm64': 4.46.2 - '@rollup/rollup-darwin-x64': 4.46.2 - '@rollup/rollup-freebsd-arm64': 4.46.2 - '@rollup/rollup-freebsd-x64': 4.46.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 - '@rollup/rollup-linux-arm-musleabihf': 4.46.2 - '@rollup/rollup-linux-arm64-gnu': 4.46.2 - '@rollup/rollup-linux-arm64-musl': 4.46.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 - '@rollup/rollup-linux-ppc64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-musl': 4.46.2 - '@rollup/rollup-linux-s390x-gnu': 4.46.2 - '@rollup/rollup-linux-x64-gnu': 4.46.2 - '@rollup/rollup-linux-x64-musl': 4.46.2 - '@rollup/rollup-win32-arm64-msvc': 4.46.2 - '@rollup/rollup-win32-ia32-msvc': 4.46.2 - '@rollup/rollup-win32-x64-msvc': 4.46.2 + '@rollup/rollup-android-arm-eabi': 4.50.0 + '@rollup/rollup-android-arm64': 4.50.0 + '@rollup/rollup-darwin-arm64': 4.50.0 + '@rollup/rollup-darwin-x64': 4.50.0 + '@rollup/rollup-freebsd-arm64': 4.50.0 + '@rollup/rollup-freebsd-x64': 4.50.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.0 + '@rollup/rollup-linux-arm-musleabihf': 4.50.0 + '@rollup/rollup-linux-arm64-gnu': 4.50.0 + '@rollup/rollup-linux-arm64-musl': 4.50.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.0 + '@rollup/rollup-linux-ppc64-gnu': 4.50.0 + '@rollup/rollup-linux-riscv64-gnu': 4.50.0 + '@rollup/rollup-linux-riscv64-musl': 4.50.0 + '@rollup/rollup-linux-s390x-gnu': 4.50.0 + '@rollup/rollup-linux-x64-gnu': 4.50.0 + '@rollup/rollup-linux-x64-musl': 4.50.0 + '@rollup/rollup-openharmony-arm64': 4.50.0 + '@rollup/rollup-win32-arm64-msvc': 4.50.0 + '@rollup/rollup-win32-ia32-msvc': 4.50.0 + '@rollup/rollup-win32-x64-msvc': 4.50.0 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -17915,9 +17979,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.26.0: {} section-matter@1.0.0: dependencies: @@ -18194,7 +18256,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} sourcemap-codec@1.4.8: {} @@ -18413,12 +18475,12 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 - syncpack@13.0.4(typescript@5.8.3): + syncpack@13.0.4(typescript@5.9.2): dependencies: chalk: 5.5.0 chalk-template: 1.1.0 commander: 13.1.0 - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.2) effect: 3.17.7 enquirer: 2.4.1 fast-check: 3.23.2 @@ -18439,7 +18501,7 @@ snapshots: tabbable@6.2.0: {} - tailwindcss@4.1.11: {} + tailwindcss@4.1.12: {} tapable@2.2.1: {} @@ -18521,7 +18583,7 @@ snapshots: text-hex@1.0.0: {} - thingies@1.21.0(tslib@2.8.1): + thingies@2.5.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -18548,7 +18610,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 tinypool@1.1.1: {} @@ -18559,13 +18621,13 @@ snapshots: tmp-promise@3.0.3: dependencies: - tmp: 0.2.3 + tmp: 0.2.5 tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - tmp@0.2.3: {} + tmp@0.2.5: {} to-regex-range@5.0.1: dependencies: @@ -18588,7 +18650,7 @@ snapshots: tr46@0.0.3: {} - tree-dump@1.0.2(tslib@2.8.1): + tree-dump@1.0.3(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -18606,38 +18668,38 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 ts-morph@23.0.0: dependencies: '@ts-morph/common': 0.24.0 code-block-writer: 13.0.3 - ts-node@10.9.2(@types/node@24.2.1)(typescript@5.8.3): + ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.2.1 + '@types/node': 24.3.0 acorn: 8.15.0 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 ts-toolbelt@9.6.0: {} - tsconfck@3.1.5(typescript@5.8.3): + tsconfck@3.1.5(typescript@5.9.2): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 tsconfig-paths@3.15.0: dependencies: @@ -18654,15 +18716,15 @@ snapshots: dependencies: esbuild: 0.15.18 - tsutils@3.21.0(typescript@5.8.3): + tsutils@3.21.0(typescript@5.9.2): dependencies: tslib: 1.14.1 - typescript: 5.8.3 + typescript: 5.9.2 - tsx@4.20.3: + tsx@4.20.5: dependencies: - esbuild: 0.25.8 - get-tsconfig: 4.10.0 + esbuild: 0.25.9 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 @@ -18720,18 +18782,18 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.33.0(jiti@2.4.2) - typescript: 5.8.3 + '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - typescript@5.8.3: {} + typescript@5.9.2: {} ufo@1.6.1: {} @@ -18928,9 +18990,9 @@ snapshots: valibot@0.33.3: {} - valibot@0.42.1(typescript@5.8.3): + valibot@0.42.1(typescript@5.9.2): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 validate-npm-package-license@3.0.4: dependencies: @@ -18955,32 +19017,32 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-dev-rpc@1.1.0(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)): + vite-dev-rpc@1.1.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): dependencies: birpc: 2.5.0 - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) - vite-hot-client: 2.1.0(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - vite-hot-client@2.1.0(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)): + vite-hot-client@2.1.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): dependencies: - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - vite-imagetools@7.1.0(rollup@4.46.2): + vite-imagetools@7.1.0(rollup@4.50.0): dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.2.0(rollup@4.50.0) imagetools-core: 7.1.0 sharp: 0.34.2 transitivePeerDependencies: - rollup - vite-node@0.32.4(@types/node@24.2.1)(lightningcss@1.30.1)(terser@5.43.1): + vite-node@0.32.4(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.43.1): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@9.4.0) mlly: 1.7.4 pathe: 1.1.2 picocolors: 1.1.1 - vite: 4.5.14(@types/node@24.2.1)(lightningcss@1.30.1)(terser@5.43.1) + vite: 4.5.14(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - less @@ -18991,13 +19053,13 @@ snapshots: - supports-color - terser - vite-node@3.2.4(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1): + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@9.4.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -19012,26 +19074,26 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.2.1)(rollup@4.46.2)(typescript@5.8.3)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)): + vite-plugin-dts@4.5.4(@types/node@24.3.0)(rollup@4.50.0)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.52.10(@types/node@24.2.1) - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@microsoft/api-extractor': 7.52.10(@types/node@24.3.0) + '@rollup/pluginutils': 5.2.0(rollup@4.50.0) '@volar/typescript': 2.4.15 - '@vue/language-core': 2.2.0(typescript@5.8.3) + '@vue/language-core': 2.2.0(typescript@5.9.2) compare-versions: 6.1.1 debug: 4.4.1(supports-color@9.4.0) kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.8.3 + typescript: 5.9.2 optionalDependencies: - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-inspect@11.3.2(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)): + vite-plugin-inspect@11.3.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): dependencies: ansis: 4.1.0 debug: 4.4.1(supports-color@9.4.0) @@ -19041,55 +19103,55 @@ snapshots: perfect-debounce: 1.0.0 sirv: 3.0.1 unplugin-utils: 0.2.5 - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) - vite-dev-rpc: 1.1.0(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): dependencies: debug: 4.4.1(supports-color@9.4.0) globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.8.3) + tsconfck: 3.1.5(typescript@5.9.2) optionalDependencies: - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@4.5.14(@types/node@24.2.1)(lightningcss@1.30.1)(terser@5.43.1): + vite@4.5.14(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.43.1): dependencies: esbuild: 0.18.20 postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 fsevents: 2.3.3 lightningcss: 1.30.1 terser: 5.43.1 - vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1): + vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.46.2 + rollup: 4.50.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.2.1 + '@types/node': 24.3.0 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.5.1 lightningcss: 1.30.1 terser: 5.43.1 - tsx: 4.20.3 - yaml: 2.6.1 + tsx: 4.20.5 + yaml: 2.8.1 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1)) + '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -19107,12 +19169,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.0(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) - vite-node: 3.2.4(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.6.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.2.1 + '@types/node': 24.3.0 transitivePeerDependencies: - jiti - less @@ -19337,7 +19399,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.6.1: {} + yaml@2.8.1: {} yargs-parser@18.1.3: dependencies: diff --git a/syncpack-release-conf.json b/syncpack-release-conf.json index 077730aed7a..5dd25581dbf 100644 --- a/syncpack-release-conf.json +++ b/syncpack-release-conf.json @@ -12,11 +12,6 @@ "dependencies": ["@playwright/test"], "pinVersion": "1.47.0" }, - { - "label": "Undici should always be * until we remove it", - "dependencies": ["undici"], - "range": "*" - }, { "label": "use exact version numbers for devDependencies", "dependencyTypes": ["dev"], From 6019cbc628255eea06a6e1d5418e02e578faf9e8 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Fri, 22 Aug 2025 20:48:42 +0200 Subject: [PATCH 07/14] refactor(qwik dev): don't override Vite devserver this applies to CSR projects. It makes the code simpler and along with Vite's expectations. It is done with the transformIndexHtml hook. Also: - build the optimizer using vite - compile the dev helper scripts - make CSR projects start at /index.html. A starter is provided for this - remove mentions of entry.dev.tsx --- .../src/routes/api/qwik-optimizer/api.json | 14 - .../src/routes/api/qwik-optimizer/index.mdx | 57 --- .../docs/(qwik)/advanced/library/index.mdx | 3 +- .../docs/(qwik)/advanced/vite/index.mdx | 6 - packages/qwik-router/global.d.ts | 5 - packages/qwik/src/devtools/index.ts | 1 - packages/qwik/src/optimizer/global.d.ts | 4 + packages/qwik/src/optimizer/src/index.ts | 7 +- .../click-to-component.js} | 88 +--- .../{error-host.html => dev/error-host.js} | 36 +- .../src/plugins/dev/image-size-runtime.css | 27 ++ .../image-size-runtime.js} | 232 +--------- .../plugins/{ => dev}/image-size-server.ts | 4 +- .../src/plugins/dev/image-size-warning.html | 164 +++++++ .../src/optimizer/src/plugins/dev/index.ts | 118 +++++ .../optimizer/src/plugins/dev/perf-warning.js | 9 + .../qwik-error-overlay.css} | 17 +- .../src/plugins/dev/qwik-inspector.css | 55 +++ .../optimizer/src/plugins/perf-warning.html | 10 - .../qwik/src/optimizer/src/plugins/plugin.ts | 62 ++- .../src/optimizer/src/plugins/plugin.unit.ts | 2 +- .../optimizer/src/plugins/vite-dev-server.ts | 437 ------------------ .../qwik/src/optimizer/src/plugins/vite.ts | 136 +----- .../src/optimizer/src/plugins/vite.unit.ts | 4 +- .../src/optimizer/src/qwik.optimizer.api.md | 8 - scripts/compiled-string-plugin.ts | 7 +- scripts/submodule-optimizer.ts | 211 ++++----- starters/apps/base/src/entry.dev.tsx | 17 - starters/features/csr/index.html | 23 + starters/features/csr/package.json | 29 ++ starters/features/csr/src/root.tsx | 15 + starters/features/csr/vite.config.mts | 13 + 32 files changed, 669 insertions(+), 1152 deletions(-) create mode 100644 packages/qwik/src/optimizer/global.d.ts rename packages/qwik/src/optimizer/src/plugins/{click-to-component.html => dev/click-to-component.js} (76%) rename packages/qwik/src/optimizer/src/plugins/{error-host.html => dev/error-host.js} (97%) create mode 100644 packages/qwik/src/optimizer/src/plugins/dev/image-size-runtime.css rename packages/qwik/src/optimizer/src/plugins/{image-size-runtime.html => dev/image-size-runtime.js} (64%) rename packages/qwik/src/optimizer/src/plugins/{ => dev}/image-size-server.ts (98%) create mode 100644 packages/qwik/src/optimizer/src/plugins/dev/image-size-warning.html create mode 100644 packages/qwik/src/optimizer/src/plugins/dev/index.ts create mode 100644 packages/qwik/src/optimizer/src/plugins/dev/perf-warning.js rename packages/qwik/src/optimizer/src/plugins/{vite-error.ts => dev/qwik-error-overlay.css} (94%) create mode 100644 packages/qwik/src/optimizer/src/plugins/dev/qwik-inspector.css delete mode 100644 packages/qwik/src/optimizer/src/plugins/perf-warning.html delete mode 100644 packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts delete mode 100644 starters/apps/base/src/entry.dev.tsx create mode 100644 starters/features/csr/index.html create mode 100644 starters/features/csr/package.json create mode 100644 starters/features/csr/src/root.tsx create mode 100644 starters/features/csr/vite.config.mts diff --git a/packages/docs/src/routes/api/qwik-optimizer/api.json b/packages/docs/src/routes/api/qwik-optimizer/api.json index 921ee8edf62..32d4df8cd88 100644 --- a/packages/docs/src/routes/api/qwik-optimizer/api.json +++ b/packages/docs/src/routes/api/qwik-optimizer/api.json @@ -542,20 +542,6 @@ "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/optimizer/src/plugins/vite.ts", "mdFile": "core.qwikvite.md" }, - { - "name": "QwikViteDevResponse", - "id": "qwikvitedevresponse", - "hierarchy": [ - { - "name": "QwikViteDevResponse", - "id": "qwikvitedevresponse" - } - ], - "kind": "Interface", - "content": "```typescript\nexport interface QwikViteDevResponse \n```\n\n\n\n\n\n
\n\nProperty\n\n\n\n\nModifiers\n\n\n\n\nType\n\n\n\n\nDescription\n\n\n
\n\n[\\_qwikEnvData?](#)\n\n\n\n\n\n\n\nRecord<string, any>\n\n\n\n\n_(Optional)_\n\n\n
\n\n[\\_qwikRenderResolve?](#)\n\n\n\n\n\n\n\n() => void\n\n\n\n\n_(Optional)_\n\n\n
", - "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/optimizer/src/plugins/vite.ts", - "mdFile": "core.qwikvitedevresponse.md" - }, { "name": "QwikVitePlugin", "id": "qwikviteplugin", diff --git a/packages/docs/src/routes/api/qwik-optimizer/index.mdx b/packages/docs/src/routes/api/qwik-optimizer/index.mdx index 0fb304bb025..daad1b9ac20 100644 --- a/packages/docs/src/routes/api/qwik-optimizer/index.mdx +++ b/packages/docs/src/routes/api/qwik-optimizer/index.mdx @@ -2210,63 +2210,6 @@ any [Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/optimizer/src/plugins/vite.ts) -## QwikViteDevResponse - -```typescript -export interface QwikViteDevResponse -``` - - - - -
- -Property - - - -Modifiers - - - -Type - - - -Description - -
- -[\_qwikEnvData?](#) - - - - - -Record<string, any> - - - -_(Optional)_ - -
- -[\_qwikRenderResolve?](#) - - - - - -() => void - - - -_(Optional)_ - -
- -[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/optimizer/src/plugins/vite.ts) - ## QwikVitePlugin This is the type of the "pre" Qwik Vite plugin. `qwikVite` actually returns a tuple of two plugins, but after Vite flattens them, you can find the plugin by name. diff --git a/packages/docs/src/routes/docs/(qwik)/advanced/library/index.mdx b/packages/docs/src/routes/docs/(qwik)/advanced/library/index.mdx index 87a5ae2f0f1..4d9f657bdd0 100644 --- a/packages/docs/src/routes/docs/(qwik)/advanced/library/index.mdx +++ b/packages/docs/src/routes/docs/(qwik)/advanced/library/index.mdx @@ -52,7 +52,6 @@ This will create a new folder called `my-library` with the following structure: │   │   │   └── counter.tsx │   │   └── logo │   │   └── logo.tsx -│   ├── entry.dev.tsx │   ├── entry.ssr.tsx │   ├── index.ts │   └── root.tsx @@ -126,7 +125,7 @@ export { Counter } from './components/counter/counter'; ## Libraries are also Apps -The library starter is also a standalone Qwik app (without routing, nor Qwik Router), this is the reason why you will find `entry.dev.tsx`, `entry.ssr.tsx` and `root.tsx` files. +The library starter is also a standalone Qwik app (without routing, nor Qwik Router), this is the reason why you will find the `entry.ssr.tsx` and `root.tsx` files. Do not worry about them, they won't be part of the final library, but they are useful during development and testing, so you can test your components in a real Qwik app. diff --git a/packages/docs/src/routes/docs/(qwik)/advanced/vite/index.mdx b/packages/docs/src/routes/docs/(qwik)/advanced/vite/index.mdx index 979b01615e1..657bd59974a 100644 --- a/packages/docs/src/routes/docs/(qwik)/advanced/vite/index.mdx +++ b/packages/docs/src/routes/docs/(qwik)/advanced/vite/index.mdx @@ -109,12 +109,6 @@ client?: { * Default `src/components/app/app.tsx` */ input?: string[] | string; - /** - * Entry input for client-side only development with hot-module reloading. - * This is for Vite development only and does not use SSR. - * Default `src/entry.dev.tsx` - */ - devInput?: string; /** * Output directory for the client build. * Default `dist` diff --git a/packages/qwik-router/global.d.ts b/packages/qwik-router/global.d.ts index 2f382a9ddcf..477fb3336ea 100644 --- a/packages/qwik-router/global.d.ts +++ b/packages/qwik-router/global.d.ts @@ -9,11 +9,6 @@ type SerializationStrategy = import('@qwik.dev/core/internal').SerializationStra declare var qcAsyncRequestStore: AsyncStore | undefined; declare var _qwikActionsMap: Map | undefined; -/** @deprecated Will be removed in v3 */ -declare var __qwikCityNew: boolean | undefined; - -declare var __qwikRouterNew: boolean | undefined; - type ExperimentalFeatures = import('@qwik.dev/core/optimizer').ExperimentalFeatures; declare var __EXPERIMENTAL__: { diff --git a/packages/qwik/src/devtools/index.ts b/packages/qwik/src/devtools/index.ts index 1bf5c976d58..799586ac926 100644 --- a/packages/qwik/src/devtools/index.ts +++ b/packages/qwik/src/devtools/index.ts @@ -1,2 +1 @@ -// @ts-expect-error compiled-string-plugin export { default as devtoolsJsonSRC } from './json?compiled-string'; diff --git a/packages/qwik/src/optimizer/global.d.ts b/packages/qwik/src/optimizer/global.d.ts new file mode 100644 index 00000000000..2a6ecf548ab --- /dev/null +++ b/packages/qwik/src/optimizer/global.d.ts @@ -0,0 +1,4 @@ +declare module '*?compiled-string' { + const code: string; + export default code; +} diff --git a/packages/qwik/src/optimizer/src/index.ts b/packages/qwik/src/optimizer/src/index.ts index 88f0af0a6cd..82cb2c9d792 100644 --- a/packages/qwik/src/optimizer/src/index.ts +++ b/packages/qwik/src/optimizer/src/index.ts @@ -41,12 +41,7 @@ export type { export type { ExperimentalFeatures, QwikBuildMode, QwikBuildTarget } from './plugins/plugin'; export type { QwikRollupPluginOptions } from './plugins/rollup'; -export type { - QwikViteDevResponse, - QwikVitePlugin, - QwikVitePluginApi, - QwikVitePluginOptions, -} from './plugins/vite'; +export type { QwikVitePlugin, QwikVitePluginApi, QwikVitePluginOptions } from './plugins/vite'; export type { BundleGraphAdder } from './plugins/bundle-graph'; diff --git a/packages/qwik/src/optimizer/src/plugins/click-to-component.html b/packages/qwik/src/optimizer/src/plugins/dev/click-to-component.js similarity index 76% rename from packages/qwik/src/optimizer/src/plugins/click-to-component.html rename to packages/qwik/src/optimizer/src/plugins/dev/click-to-component.js index a4649bae009..a8aebc304c7 100644 --- a/packages/qwik/src/optimizer/src/plugins/click-to-component.html +++ b/packages/qwik/src/optimizer/src/plugins/dev/click-to-component.js @@ -1,68 +1,17 @@ - - - + }; + + document.addEventListener('DOMContentLoaded', register); +} diff --git a/packages/qwik/src/optimizer/src/plugins/error-host.html b/packages/qwik/src/optimizer/src/plugins/dev/error-host.js similarity index 97% rename from packages/qwik/src/optimizer/src/plugins/error-host.html rename to packages/qwik/src/optimizer/src/plugins/dev/error-host.js index 975ca1cea94..b77cadf5351 100644 --- a/packages/qwik/src/optimizer/src/plugins/error-host.html +++ b/packages/qwik/src/optimizer/src/plugins/dev/error-host.js @@ -1,20 +1,9 @@ - - + + document.addEventListener('qerror', (ev) => { + const ErrorOverlay = customElements.get('vite-error-overlay'); + if (!ErrorOverlay) { + return; + } + const err = ev.detail.error; + const overlay = new ErrorOverlay(err); + document.body.appendChild(overlay); + }); +} diff --git a/packages/qwik/src/optimizer/src/plugins/dev/image-size-runtime.css b/packages/qwik/src/optimizer/src/plugins/dev/image-size-runtime.css new file mode 100644 index 00000000000..3a26e93a51f --- /dev/null +++ b/packages/qwik/src/optimizer/src/plugins/dev/image-size-runtime.css @@ -0,0 +1,27 @@ +[data-qwik-cls] { + outline: 2px solid red; +} +[data-qwik-cls]::after { + position: absolute; + font-size: 12px; + content: 'CLS ' attr(data-qwik-cls); + font-family: monospace; + font-weight: bold; + background: red; + color: white; + margin: -2px; + padding: 1px; + line-height: 1; + pointer-events: none; +} +#qwik-image-warning-container { + position: absolute !important; + top: 0 !important; + left: 0 !important; + width: 0 !important; + overflow: visible !important; + height: 0 !important; + pointer-events: none !important; + contain: size layout style content; + z-index: 1; +} diff --git a/packages/qwik/src/optimizer/src/plugins/image-size-runtime.html b/packages/qwik/src/optimizer/src/plugins/dev/image-size-runtime.js similarity index 64% rename from packages/qwik/src/optimizer/src/plugins/image-size-runtime.html rename to packages/qwik/src/optimizer/src/plugins/dev/image-size-runtime.js index 5d7d957814a..7890ac23fdc 100644 --- a/packages/qwik/src/optimizer/src/plugins/image-size-runtime.html +++ b/packages/qwik/src/optimizer/src/plugins/dev/image-size-runtime.js @@ -1,203 +1,7 @@ - - -
- + }; + + document.addEventListener('load', register); +} diff --git a/packages/qwik/src/optimizer/src/plugins/image-size-server.ts b/packages/qwik/src/optimizer/src/plugins/dev/image-size-server.ts similarity index 98% rename from packages/qwik/src/optimizer/src/plugins/image-size-server.ts rename to packages/qwik/src/optimizer/src/plugins/dev/image-size-server.ts index 95f6b39c63c..c1212741656 100644 --- a/packages/qwik/src/optimizer/src/plugins/image-size-server.ts +++ b/packages/qwik/src/optimizer/src/plugins/dev/image-size-server.ts @@ -17,8 +17,8 @@ import webp_1 from 'image-size/dist/types/webp.js'; import heif_1 from 'image-size/dist/types/heif.js'; import type { Connect } from 'vite'; -import type { OptimizerSystem } from '../types'; -import { formatError } from './vite-utils'; +import type { OptimizerSystem } from '../../types'; +import { formatError } from '../vite-utils'; // This map helps avoid validating for every single image type const firstBytes: Record = { diff --git a/packages/qwik/src/optimizer/src/plugins/dev/image-size-warning.html b/packages/qwik/src/optimizer/src/plugins/dev/image-size-warning.html new file mode 100644 index 00000000000..2b8d1d4bc5a --- /dev/null +++ b/packages/qwik/src/optimizer/src/plugins/dev/image-size-warning.html @@ -0,0 +1,164 @@ + + + +
+ +
+ +
+

+

+

+
+
diff --git a/packages/qwik/src/optimizer/src/plugins/dev/index.ts b/packages/qwik/src/optimizer/src/plugins/dev/index.ts new file mode 100644 index 00000000000..c104c05524d --- /dev/null +++ b/packages/qwik/src/optimizer/src/plugins/dev/index.ts @@ -0,0 +1,118 @@ +/* eslint-disable no-console */ + +import type { Connect, HtmlTagDescriptor } from 'vite'; +import type { OptimizerSystem, Path } from '../../types'; +import { type NormalizedQwikPluginOptions } from '../plugin'; +import perfWarningScript from './perf-warning.js?compiled-string'; +import clickToComponent from './click-to-component.js?compiled-string'; +import errorHost from './error-host.js?compiled-string'; +import imageDevToolsStyles from './image-size-runtime.css?inline'; +import imageDevTools from './image-size-runtime.js?compiled-string'; +import imageDevToolsTemplate from './image-size-warning.html?raw'; +import qwikErrorOverlayStyles from './qwik-error-overlay.css?inline'; +import inspectorStyles from './qwik-inspector.css?inline'; + +export async function configurePreviewServer( + middlewares: Connect.Server, + ssrOutDir: string, + sys: OptimizerSystem, + path: Path +) { + const fs: typeof import('fs') = await sys.dynamicImport('node:fs'); + const url: typeof import('url') = await sys.dynamicImport('node:url'); + + const entryPreviewPaths = ['mjs', 'cjs', 'js'].map((ext) => + path.join(ssrOutDir, `entry.preview.${ext}`) + ); + + const entryPreviewModulePath = entryPreviewPaths.find((p) => fs.existsSync(p)); + if (!entryPreviewModulePath) { + return invalidPreviewMessage( + middlewares, + `Unable to find output "${ssrOutDir}/entry.preview" module.\n\nPlease ensure "src/entry.preview.tsx" has been built before the "preview" command.` + ); + } + + try { + const entryPreviewImportPath = url.pathToFileURL(entryPreviewModulePath).href; + const previewModuleImport = await sys.strictDynamicImport(entryPreviewImportPath); + + let previewMiddleware: Connect.HandleFunction | null = null; + let preview404Middleware: Connect.HandleFunction | null = null; + + if (previewModuleImport.default) { + if (typeof previewModuleImport.default === 'function') { + previewMiddleware = previewModuleImport.default; + } else if (typeof previewModuleImport.default === 'object') { + previewMiddleware = previewModuleImport.default.router; + preview404Middleware = previewModuleImport.default.notFound; + } + } + + if (typeof previewMiddleware !== 'function') { + return invalidPreviewMessage( + middlewares, + `Entry preview module "${entryPreviewModulePath}" does not export a default middleware function` + ); + } + + middlewares.use(previewMiddleware); + + if (typeof preview404Middleware === 'function') { + middlewares.use(preview404Middleware); + } + } catch (e) { + return invalidPreviewMessage(middlewares, String(e)); + } +} + +function invalidPreviewMessage(middlewares: Connect.Server, msg: string) { + console.log(`\n❌ ${msg}\n`); + + middlewares.use((_, res) => { + res.writeHead(400, { + 'Content-Type': 'text/plain', + }); + res.end(msg); + }); +} + +export const getViteIndexTags = (opts: NormalizedQwikPluginOptions, srcDir: string) => { + const tags: HtmlTagDescriptor[] = [ + { tag: 'style', children: qwikErrorOverlayStyles, injectTo: 'body' }, + { tag: 'style', children: inspectorStyles, injectTo: 'body' }, + { tag: 'script', attrs: { type: 'module' }, children: errorHost, injectTo: 'body' }, + { tag: 'script', attrs: { type: 'module' }, children: perfWarningScript, injectTo: 'body' }, + ]; + if (opts.devTools?.imageDevTools ?? true) { + tags.push( + { + tag: 'style', + children: imageDevToolsStyles, + injectTo: 'body', + }, + { + tag: 'script', + attrs: { type: 'module' }, + children: imageDevTools.replace( + 'globalThis.__TEMPLATE__', + JSON.stringify(imageDevToolsTemplate) + ), + injectTo: 'body', + } + ); + } + if (opts.devTools?.clickToSource ?? true) { + const hotKeys = opts.devTools.clickToSource ?? []; + const srcDirUrl = new URL(srcDir + '/', 'http://local.local').href; + tags.push({ + tag: 'script', + attrs: { type: 'module' }, + children: clickToComponent + .replace('globalThis.__HOTKEYS__', JSON.stringify(hotKeys)) + .replace('globalThis.__SRC_DIR__', JSON.stringify(srcDirUrl)), + injectTo: 'body', + }); + } + return tags; +}; diff --git a/packages/qwik/src/optimizer/src/plugins/dev/perf-warning.js b/packages/qwik/src/optimizer/src/plugins/dev/perf-warning.js new file mode 100644 index 00000000000..c5b6bad65f0 --- /dev/null +++ b/packages/qwik/src/optimizer/src/plugins/dev/perf-warning.js @@ -0,0 +1,9 @@ +if (typeof window !== 'undefined' && !window.__qwikViteLog) { + window.__qwikViteLog = true; + // eslint-disable-next-line no-console + console.debug( + '%c⭐️ Qwik Dev SSR Mode', + 'background: #0c75d2; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;', + "App is running in SSR development mode!\n - Additional JS is loaded by Vite for debugging and live reloading\n - Rendering performance might not be optimal\n - Delayed interactivity because prefetching is disabled\n - Vite dev bundles do not represent production output\n\nProduction build can be tested running 'npm run preview'" + ); +} diff --git a/packages/qwik/src/optimizer/src/plugins/vite-error.ts b/packages/qwik/src/optimizer/src/plugins/dev/qwik-error-overlay.css similarity index 94% rename from packages/qwik/src/optimizer/src/plugins/vite-error.ts rename to packages/qwik/src/optimizer/src/plugins/dev/qwik-error-overlay.css index 42b47e2104f..73f683a559b 100644 --- a/packages/qwik/src/optimizer/src/plugins/vite-error.ts +++ b/packages/qwik/src/optimizer/src/plugins/dev/qwik-error-overlay.css @@ -1,14 +1,13 @@ -export const VITE_ERROR_OVERLAY_STYLES = ` vite-error-overlay { --color-bright: rgba(255, 255, 255, 0.8); - --color-yellow: rgba(255,246,85,0.8); + --color-yellow: rgba(255, 246, 85, 0.8); --qwik-dark-blue: #006ce9; --qwik-light-blue: #3ec2f7; --qwik-light-purple: #ac7ff4; --qwik-dark-purple: #713fc2; - --yellow: #fff; /* override vite yellow */ - --purple: var(--color-bright); /* override vite purple */ - --red: var(--qwik-light-blue); /* override vite red */ + --yellow: #fff; /* override vite yellow */ + --purple: var(--color-bright); /* override vite purple */ + --red: var(--qwik-light-blue); /* override vite red */ --vertical-box-spacing: 15px; --box-padding: 20px; @@ -69,10 +68,9 @@ vite-error-overlay::part(frame) { } vite-error-overlay::part(stack) { - border-left-color: #FF5722; + border-left-color: #ff5722; } - vite-error-overlay::part(tip) { border-top: none; border-left-color: rgb(172, 127, 244); @@ -87,7 +85,7 @@ vite-error-overlay::part(stack):before { margin-bottom: 15px; padding-bottom: 5px; padding-left: 30px; /* space for icon */ - font-size: .8rem; + font-size: 0.8rem; } vite-error-overlay::part(file):before { @@ -127,8 +125,7 @@ vite-error-overlay::part(stack):after { } vite-error-overlay::part(tip):before { - content: "Not sure how to solve this? Visit https://qwik.dev or connect with the community on Discord."; + content: 'Not sure how to solve this? Visit https://qwik.dev or connect with the community on Discord.'; display: block; margin-bottom: 1em; } -`; diff --git a/packages/qwik/src/optimizer/src/plugins/dev/qwik-inspector.css b/packages/qwik/src/optimizer/src/plugins/dev/qwik-inspector.css new file mode 100644 index 00000000000..119bfa5876b --- /dev/null +++ b/packages/qwik/src/optimizer/src/plugins/dev/qwik-inspector.css @@ -0,0 +1,55 @@ +#qwik-inspector-overlay { + position: fixed; + background: rgba(24, 182, 246, 0.27); + pointer-events: none; + box-sizing: border-box; + border: 2px solid rgba(172, 126, 244, 0.46); + border-radius: 4px; + contain: strict; + cursor: pointer; + z-index: 999999; +} + +#qwik-inspector-info-popup { + position: fixed; + bottom: 10px; + right: 10px; + font-family: monospace; + background: #000000c2; + color: white; + padding: 10px 20px; + border-radius: 8px; + box-shadow: + 0 20px 25px -5px rgb(0 0 0 / 34%), + 0 8px 10px -6px rgb(0 0 0 / 24%); + backdrop-filter: blur(4px); + -webkit-animation: fadeOut 0.3s 3s ease-in-out forwards; + animation: fadeOut 0.3s 3s ease-in-out forwards; + z-index: 999999; + contain: layout; +} + +#qwik-inspector-info-popup p { + margin: 0px; +} + +@-webkit-keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + visibility: hidden; + } +} diff --git a/packages/qwik/src/optimizer/src/plugins/perf-warning.html b/packages/qwik/src/optimizer/src/plugins/perf-warning.html deleted file mode 100644 index 83d7a336c12..00000000000 --- a/packages/qwik/src/optimizer/src/plugins/perf-warning.html +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.ts b/packages/qwik/src/optimizer/src/plugins/plugin.ts index 07cf6b17b8f..4dcc2d7619a 100644 --- a/packages/qwik/src/optimizer/src/plugins/plugin.ts +++ b/packages/qwik/src/optimizer/src/plugins/plugin.ts @@ -174,6 +174,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { const optimizer = getOptimizer(); const path = optimizer.sys.path; + const resolvePath = (...paths: string[]) => normalizePath(path.resolve(...paths)); opts.debug = !!updatedOpts.debug; @@ -200,6 +201,8 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { opts.buildMode ||= 'development'; } + opts.csr = !!updatedOpts.csr; + if (updatedOpts.entryStrategy && typeof updatedOpts.entryStrategy === 'object') { opts.entryStrategy = { ...updatedOpts.entryStrategy }; } @@ -223,57 +226,51 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { if (typeof opts.rootDir !== 'string') { opts.rootDir ||= optimizer.sys.cwd(); } - opts.rootDir = normalizePath(path.resolve(optimizer.sys.cwd(), opts.rootDir)); - let srcDir = normalizePath(path.resolve(opts.rootDir, SRC_DIR_DEFAULT)); + opts.rootDir = resolvePath(optimizer.sys.cwd(), opts.rootDir); + let srcDir = resolvePath(opts.rootDir, SRC_DIR_DEFAULT); if (typeof updatedOpts.srcDir === 'string') { - opts.srcDir = normalizePath(path.resolve(opts.rootDir, updatedOpts.srcDir)); + opts.srcDir = resolvePath(opts.rootDir, updatedOpts.srcDir); srcDir = opts.srcDir; } else { opts.srcDir ||= srcDir; } - opts.srcDir = normalizePath(path.resolve(opts.rootDir, normalizePath(opts.srcDir))); + opts.srcDir = resolvePath(opts.rootDir, opts.srcDir); if (Array.isArray(updatedOpts.tsconfigFileNames) && updatedOpts.tsconfigFileNames.length > 0) { opts.tsconfigFileNames = updatedOpts.tsconfigFileNames; } - if (!updatedOpts.input && !opts.input) { + if (!opts.csr && !updatedOpts.input && !opts.input) { // we only provide inputs if none were provided by the user if (opts.target === 'ssr') { // this is for dev mode, prod will have own setting - opts.input = [path.resolve(srcDir, 'entry.ssr')]; + opts.input = [resolvePath(srcDir, 'entry.ssr')]; } else if (opts.target === 'client') { // not really an entry, just a starting point - opts.input = [path.resolve(srcDir, 'root')]; + opts.input = [resolvePath(srcDir, 'root')]; } else { // others including lib should be ok already opts.input = undefined!; } } - if (!updatedOpts.csr) { - if (updatedOpts.outDir) { - // forced output directory - opts.outDir = normalizePath(path.resolve(opts.rootDir, normalizePath(updatedOpts.outDir))); - } + if (updatedOpts.outDir) { + // forced output directory + opts.outDir = resolvePath(opts.rootDir, updatedOpts.outDir); + } - // default output directory - opts.clientOutDir = normalizePath( - path.resolve(opts.rootDir, updatedOpts.clientOutDir || CLIENT_OUT_DIR) - ); - opts.ssrOutDir = normalizePath( - path.resolve(opts.rootDir, updatedOpts.ssrOutDir || SSR_OUT_DIR) - ); - if (opts.target === 'ssr') { - // server - opts.outDir ||= opts.ssrOutDir; - } else if (opts.target === 'lib') { - // library - opts.outDir ||= normalizePath(path.resolve(opts.rootDir, LIB_OUT_DIR)); - } else { - // client - opts.outDir ||= opts.clientOutDir; - } + // default output directory + opts.clientOutDir = resolvePath(opts.rootDir, updatedOpts.clientOutDir || CLIENT_OUT_DIR); + opts.ssrOutDir = resolvePath(opts.rootDir, updatedOpts.ssrOutDir || SSR_OUT_DIR); + if (opts.target === 'ssr') { + // server + opts.outDir ||= opts.ssrOutDir; + } else if (opts.target === 'lib') { + // library + opts.outDir ||= resolvePath(opts.rootDir, LIB_OUT_DIR); + } else { + // client + opts.outDir ||= opts.clientOutDir; } if (typeof updatedOpts.manifestOutput === 'function') { @@ -289,11 +286,9 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { opts.buildMode === 'production' && maybeFs ) { - let clientManifestPath = normalizePath(path.resolve(opts.clientOutDir, Q_MANIFEST_FILENAME)); + let clientManifestPath = resolvePath(opts.clientOutDir, Q_MANIFEST_FILENAME); if (!(await maybeFs.promises.stat(clientManifestPath).catch(() => false))) { - clientManifestPath = normalizePath( - path.resolve(opts.rootDir, CLIENT_OUT_DIR, Q_MANIFEST_FILENAME) - ); + clientManifestPath = resolvePath(opts.rootDir, CLIENT_OUT_DIR, Q_MANIFEST_FILENAME); } try { const clientManifestStr = await maybeFs.promises.readFile(clientManifestPath, 'utf-8'); @@ -358,7 +353,6 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { opts.devTools.clickToSource = updatedOpts.devTools.clickToSource; } } - opts.csr = !!updatedOpts.csr; if ('inlineStylesUpToBytes' in optimizerOptions) { if (typeof optimizerOptions.inlineStylesUpToBytes === 'number') { diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts b/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts index 32b8fe8de2c..1f54cf23d11 100644 --- a/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts +++ b/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts @@ -98,7 +98,7 @@ test('debug true', async () => { test('csr', async () => { const plugin = await mockPlugin(); const opts = await plugin.normalizeOptions({ csr: true }); - assert.deepEqual(opts.outDir, undefined); + assert.deepEqual(opts.outDir, normalizePath(resolve(cwd, 'dist'))); }); test('override entryStrategy', async () => { diff --git a/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts b/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts deleted file mode 100644 index 21d4dbefda7..00000000000 --- a/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts +++ /dev/null @@ -1,437 +0,0 @@ -/* eslint-disable no-console */ -import type { Render, RenderToStreamOptions } from '@qwik.dev/core/server'; -import type { IncomingMessage, ServerResponse } from 'http'; -import { magenta } from 'kleur/colors'; - -import type { Connect, ViteDevServer } from 'vite'; -import type { OptimizerSystem, Path, ServerQwikManifest } from '../types'; -import clickToComponent from './click-to-component.html?raw'; -import errorHost from './error-host.html?raw'; -import imageDevTools from './image-size-runtime.html?raw'; -import perfWarning from './perf-warning.html?raw'; -import { type NormalizedQwikPluginOptions } from './plugin'; -import type { QwikViteDevResponse } from './vite'; -import { VITE_ERROR_OVERLAY_STYLES } from './vite-error'; -import { formatError, parseId } from './vite-utils'; - -function getOrigin(req: IncomingMessage) { - const { PROTOCOL_HEADER, HOST_HEADER } = process.env; - const headers = req.headers; - const protocol = - (PROTOCOL_HEADER && headers[PROTOCOL_HEADER.toLowerCase()]) || - ((req.socket as any).encrypted || (req.connection as any).encrypted ? 'https' : 'http'); - const host = - (HOST_HEADER && headers[HOST_HEADER.toLowerCase()]) || headers[':authority'] || headers['host']; - - return `${protocol}://${host}`; -} - -export async function configureDevServer( - base: string, - server: ViteDevServer, - opts: NormalizedQwikPluginOptions, - sys: OptimizerSystem, - path: Path, - isClientDevOnly: boolean, - clientDevInput: string | undefined -) { - const hasQwikRouter = server.config.plugins?.some( - (plugin) => plugin.name === 'vite-plugin-qwik-router' - ); - - // to maintain css importers after HMR - const cssImportedByCSS = new Set(); - - // qwik middleware injected BEFORE vite internal middlewares - server.middlewares.use(async (req, res, next) => { - try { - const { ORIGIN } = process.env; - const domain = ORIGIN ?? getOrigin(req); - const url = new URL(req.originalUrl!, domain); - - if (shouldSsrRender(req, url)) { - const { _qwikEnvData } = res as QwikViteDevResponse; - if (!_qwikEnvData && hasQwikRouter) { - console.error(`not SSR rendering ${url} because Qwik Router Env data did not populate`); - res.statusCode ||= 404; - res.setHeader('Content-Type', 'text/plain'); - res.writeHead(res.statusCode); - res.end('Not a SSR URL according to Qwik Router'); - return; - } - const serverData: Record = { - ..._qwikEnvData, - url: url.href, - }; - - const status = typeof res.statusCode === 'number' ? res.statusCode : 200; - if (isClientDevOnly) { - const relPath = path.relative(opts.rootDir, clientDevInput!); - const entryUrl = '/' + relPath.replace(/\\/g, '/'); - - let html = getViteDevIndexHtml(entryUrl, serverData); - html = await server.transformIndexHtml(url.pathname, html); - - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Cache-Control', 'no-cache, no-store, max-age=0'); - res.setHeader('Access-Control-Allow-Origin', '*'); - res.setHeader('X-Powered-By', 'Qwik Vite Dev Server'); - res.writeHead(status); - - res.end(html); - return; - } - - const firstInput = opts.input && Object.values(opts.input)[0]; - if (!firstInput) { - console.error(`no entry found for dev server`); - res.statusCode ||= 404; - res.setHeader('Content-Type', 'text/plain'); - res.writeHead(res.statusCode); - res.end('No entry found for dev server'); - return; - } - const ssrModule = await server.ssrLoadModule(firstInput); - - const render: Render = ssrModule.default ?? ssrModule.render; - - if (typeof render === 'function') { - const manifest: ServerQwikManifest = { - manifestHash: '', - mapping: {}, - injections: [], - }; - - const added = new Set(); - const CSS_EXTENSIONS = ['.css', '.scss', '.sass', '.less', '.styl', '.stylus']; - const JS_EXTENSIONS = /\.[mc]?[tj]sx?$/; - - Array.from(server.moduleGraph.fileToModulesMap.entries()).forEach((entry) => { - entry[1].forEach((v) => { - const segment = v.info?.meta?.segment; - let url = v.url; - if (v.lastHMRTimestamp) { - url += `?t=${v.lastHMRTimestamp}`; - } - if (segment) { - manifest.mapping[segment.name] = relativeURL(url, opts.rootDir); - } - - const { pathId, query } = parseId(v.url); - - if (query === '' && CSS_EXTENSIONS.some((ext) => pathId.endsWith(ext))) { - const isEntryCSS = v.importers.size === 0; - const hasCSSImporter = Array.from(v.importers).some((importer) => { - const importerPath = (importer as typeof v).url || (importer as typeof v).file; - - const isCSS = - importerPath && CSS_EXTENSIONS.some((ext) => importerPath.endsWith(ext)); - - if (isCSS && v.url) { - cssImportedByCSS.add(v.url); - } - - return isCSS; - }); - - const hasJSImporter = Array.from(v.importers).some((importer) => { - const importerPath = (importer as typeof v).url || (importer as typeof v).file; - return importerPath && JS_EXTENSIONS.test(importerPath); - }); - - if ( - (isEntryCSS || hasJSImporter) && - !hasCSSImporter && - !cssImportedByCSS.has(v.url) && - !added.has(v.url) - ) { - added.add(v.url); - manifest.injections!.push({ - tag: 'link', - location: 'head', - attributes: { - rel: 'stylesheet', - href: `${base}${url.slice(1)}`, - }, - }); - } - } - }); - }); - - const renderOpts: RenderToStreamOptions = { - debug: true, - locale: serverData.locale, - stream: res, - snapshot: !isClientDevOnly, - manifest: isClientDevOnly ? undefined : manifest, - serverData, - containerAttributes: { ...serverData.containerAttributes }, - }; - - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Cache-Control', 'no-cache, no-store, max-age=0'); - res.setHeader('Access-Control-Allow-Origin', '*'); - res.setHeader('X-Powered-By', 'Qwik Vite Dev Server'); - res.writeHead(status); - - const result = await render(renderOpts); - - // End stream - if ('html' in result) { - res.write((result as any).html); - } - - // Sometimes new CSS files are added after the initial render - Array.from(server.moduleGraph.fileToModulesMap.entries()).forEach((entry) => { - entry[1].forEach((v) => { - const { pathId, query } = parseId(v.url); - if ( - !added.has(v.url) && - query === '' && - CSS_EXTENSIONS.some((ext) => pathId.endsWith(ext)) - ) { - const isEntryCSS = v.importers.size === 0; - const hasCSSImporter = Array.from(v.importers).some((importer) => { - const importerPath = (importer as typeof v).url || (importer as typeof v).file; - - const isCSS = - importerPath && CSS_EXTENSIONS.some((ext) => importerPath.endsWith(ext)); - - if (isCSS && v.url) { - cssImportedByCSS.add(v.url); - } - - return isCSS; - }); - - const hasJSImporter = Array.from(v.importers).some((importer) => { - const importerPath = (importer as typeof v).url || (importer as typeof v).file; - return importerPath && JS_EXTENSIONS.test(importerPath); - }); - - if ( - (isEntryCSS || hasJSImporter) && - !hasCSSImporter && - !cssImportedByCSS.has(v.url) - ) { - res.write(``); - added.add(v.url); - } - } - }); - }); - - res.write( - END_SSR_SCRIPT(opts, opts.srcDir ? opts.srcDir : path.join(opts.rootDir, 'src')) - ); - res.end(); - } else { - next(); - } - } else { - next(); - } - } catch (e: any) { - if (e instanceof Error) { - server.ssrFixStacktrace(e); - await formatError(sys, e); - } - next(e); - } finally { - if (typeof (res as QwikViteDevResponse)._qwikRenderResolve === 'function') { - (res as QwikViteDevResponse)._qwikRenderResolve!(); - } - } - }); - - server.middlewares.use(function (err: any, _req: any, res: ServerResponse, next: any) { - if (!res.writableEnded) { - res.write(``); - } - return next(err); - }); - - setTimeout(() => { - console.log( - `\n 🚧 ${magenta('Please note that development mode is slower than production.')}` - ); - }, 1000); -} - -export async function configurePreviewServer( - middlewares: Connect.Server, - ssrOutDir: string, - sys: OptimizerSystem, - path: Path -) { - const fs: typeof import('fs') = await sys.dynamicImport('node:fs'); - const url: typeof import('url') = await sys.dynamicImport('node:url'); - - const entryPreviewPaths = ['mjs', 'cjs', 'js'].map((ext) => - path.join(ssrOutDir, `entry.preview.${ext}`) - ); - - const entryPreviewModulePath = entryPreviewPaths.find((p) => fs.existsSync(p)); - if (!entryPreviewModulePath) { - return invalidPreviewMessage( - middlewares, - `Unable to find output "${ssrOutDir}/entry.preview" module.\n\nPlease ensure "src/entry.preview.tsx" has been built before the "preview" command.` - ); - } - - try { - const entryPreviewImportPath = url.pathToFileURL(entryPreviewModulePath).href; - const previewModuleImport = await sys.strictDynamicImport(entryPreviewImportPath); - - let previewMiddleware: Connect.HandleFunction | null = null; - let preview404Middleware: Connect.HandleFunction | null = null; - - if (previewModuleImport.default) { - if (typeof previewModuleImport.default === 'function') { - previewMiddleware = previewModuleImport.default; - } else if (typeof previewModuleImport.default === 'object') { - previewMiddleware = previewModuleImport.default.router; - preview404Middleware = previewModuleImport.default.notFound; - } - } - - if (typeof previewMiddleware !== 'function') { - return invalidPreviewMessage( - middlewares, - `Entry preview module "${entryPreviewModulePath}" does not export a default middleware function` - ); - } - - middlewares.use(previewMiddleware); - - if (typeof preview404Middleware === 'function') { - middlewares.use(preview404Middleware); - } - } catch (e) { - return invalidPreviewMessage(middlewares, String(e)); - } -} - -function invalidPreviewMessage(middlewares: Connect.Server, msg: string) { - console.log(`\n❌ ${msg}\n`); - - middlewares.use((_, res) => { - res.writeHead(400, { - 'Content-Type': 'text/plain', - }); - res.end(msg); - }); -} - -const CYPRESS_DEV_SERVER_PATH = '/__cypress/src'; -const FS_PREFIX = `/@fs/`; -const VALID_ID_PREFIX = `/@id/`; -const VITE_PUBLIC_PATH = `/@vite/`; -const internalPrefixes = [FS_PREFIX, VALID_ID_PREFIX, VITE_PUBLIC_PATH]; -const InternalPrefixRE = new RegExp( - `^(${CYPRESS_DEV_SERVER_PATH})?(?:${internalPrefixes.join('|')})` -); - -const shouldSsrRender = (req: IncomingMessage, url: URL) => { - const pathname = url.pathname; - if (/\.[\w?=&]+$/.test(pathname) && !pathname.endsWith('.html')) { - // has extension - return false; - } - if (pathname.includes('_-vite-ping')) { - return false; - } - if (pathname.includes('__open-in-editor')) { - return false; - } - if (url.searchParams.has('html-proxy')) { - return false; - } - if (url.searchParams.get('ssr') === 'false') { - return false; - } - if (InternalPrefixRE.test(url.pathname)) { - return false; - } - if (pathname.includes('@qwik.dev/core/build')) { - return false; - } - const acceptHeader = req.headers.accept || ''; - const accepts = acceptHeader.split(',').map((accept) => accept.split(';')[0]); - if (accepts.length == 1 && accepts.includes('*/*')) { - // special case for curl where the default is `*/*` with no additional headers - return true; - } - - if (!accepts.includes('text/html')) { - return false; - } - return true; -}; - -declare global { - interface Window { - __qwik_inspector_state: { - pressedKeys: string[]; - hoveredElement?: EventTarget | null; - }; - } -} - -function relativeURL(url: string, base: string) { - if (url.startsWith(base)) { - url = url.slice(base.length); - if (!url.startsWith('/')) { - url = '/' + url; - } - } - return url; -} - -const DEV_QWIK_INSPECTOR = (opts: NormalizedQwikPluginOptions['devTools'], srcDir: string) => { - const qwikdevtools = { - hotKeys: opts.clickToSource ?? [], - srcDir: new URL(srcDir + '/', 'http://local.local').href, - }; - return ( - `` + - (opts.imageDevTools ? imageDevTools : '') + - (opts.clickToSource ? clickToComponent : '') - ); -}; - -const END_SSR_SCRIPT = (opts: NormalizedQwikPluginOptions, srcDir: string) => ` - - -${errorHost} -${perfWarning} -${DEV_QWIK_INSPECTOR(opts.devTools, srcDir)} -`; - -function getViteDevIndexHtml(entryUrl: string, serverData: Record) { - return ` - - - - - - ${errorHost} - -`; -} - -export const VITE_DEV_CLIENT_QS = `qwik-vite-dev-client`; diff --git a/packages/qwik/src/optimizer/src/plugins/vite.ts b/packages/qwik/src/optimizer/src/plugins/vite.ts index d1e21f77029..eb0be854b88 100644 --- a/packages/qwik/src/optimizer/src/plugins/vite.ts +++ b/packages/qwik/src/optimizer/src/plugins/vite.ts @@ -1,5 +1,4 @@ import type { UserConfig, ViteDevServer, Plugin as VitePlugin, BuildOptions } from 'vite'; -import { QWIK_LOADER_DEFAULT_DEBUG, QWIK_LOADER_DEFAULT_MINIFIED } from '../scripts'; import type { EntryStrategy, GlobalInjections, @@ -9,7 +8,7 @@ import type { TransformModule, } from '../types'; import { type BundleGraphAdder } from './bundle-graph'; -import { getImageSizeServer } from './image-size-server'; +import { getImageSizeServer } from './dev/image-size-server'; import { QWIK_BUILD_ID, QWIK_CLIENT_MANIFEST_ID, @@ -27,8 +26,7 @@ import { type QwikPluginOptions, } from './plugin'; import { createRollupError, normalizeRollupOutputOptions } from './rollup'; -import { VITE_DEV_CLIENT_QS, configureDevServer, configurePreviewServer } from './vite-dev-server'; -import { parseId } from './vite-utils'; +import { configurePreviewServer, getViteIndexTags } from './dev'; const DEDUPE = [QWIK_CORE_ID, QWIK_JSX_RUNTIME_ID, QWIK_JSX_DEV_RUNTIME_ID]; @@ -50,8 +48,6 @@ type P = VitePlugin & { api: T; config: Extract['config'], F * @public */ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { - let isClientDevOnly = false; - let clientDevInput: undefined | string = undefined; let viteCommand: 'build' | 'serve' = 'serve'; let manifestInput: QwikManifest | null = null; let clientOutDir: string | null = null; @@ -107,6 +103,8 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { target = 'client'; } + viteCommand = viteEnv.command; + let buildMode: QwikBuildMode; if (viteEnv.mode === 'production') { buildMode = 'production'; @@ -120,9 +118,6 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { buildMode = 'development'; } - viteCommand = viteEnv.command; - isClientDevOnly = viteCommand === 'serve' && viteEnv.mode !== 'ssr'; - qwikPlugin.debug(`vite config(), command: ${viteCommand}, env.mode: ${viteEnv.mode}`); if (viteCommand === 'serve') { @@ -190,17 +185,6 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { : clientOutDir; ssrOutDir = opts.ssrOutDir; - - if (typeof qwikViteOpts.client?.devInput === 'string') { - clientDevInput = path.resolve(opts.rootDir, qwikViteOpts.client.devInput); - } else { - if (opts.srcDir) { - clientDevInput = path.resolve(opts.srcDir, CLIENT_DEV_INPUT); - } else { - clientDevInput = path.resolve(opts.rootDir, 'src', CLIENT_DEV_INPUT); - } - } - clientDevInput = qwikPlugin.normalizePath(clientDevInput); } const isDevelopment = buildMode === 'development'; @@ -320,10 +304,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { } } } else if (opts.target === 'client') { - // Client Build - if (isClientDevOnly && !opts.csr) { - updatedViteConfig.build!.rollupOptions!.input = clientDevInput; - } + // nothing } else if (opts.target === 'lib') { // Library Build updatedViteConfig.build!.minify = false; @@ -392,9 +373,6 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { if (id.startsWith('\0') || !fileFilter(id, 'resolveId')) { return null; } - if (isClientDevOnly && id === VITE_CLIENT_MODULE) { - return id; - } return qwikPlugin.resolveId(this, id, importer, resolveIdOpts); }, @@ -404,11 +382,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { } id = qwikPlugin.normalizePath(id); - const opts = qwikPlugin.getOptions(); - if (isClientDevOnly && id === VITE_CLIENT_MODULE) { - return getViteDevModule(opts); - } if (viteCommand === 'serve' && id.endsWith(QWIK_CLIENT_MANIFEST_ID)) { return { code: 'export const manifest = undefined;', @@ -422,12 +396,6 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { return null; } - if (isClientDevOnly) { - const parsedId = parseId(id); - if (parsedId.params.has(VITE_DEV_CLIENT_QS)) { - code = updateEntryDev(code); - } - } return qwikPlugin.transform(this, code, id, transformOpts); }, } as const satisfies VitePlugin; @@ -546,49 +514,20 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { } } }, - + transformIndexHtml() { + // only in dev mode + if (viteCommand !== 'serve') { + return; + } + return getViteIndexTags(qwikPlugin.getOptions(), srcDir!); + }, configureServer(server: ViteDevServer) { qwikPlugin.configureServer(server); - const devSsrServer = - !qwikViteOpts.csr && ('devSsrServer' in qwikViteOpts ? !!qwikViteOpts.devSsrServer : true); - const imageDevTools = - qwikViteOpts.devTools && 'imageDevTools' in qwikViteOpts.devTools - ? qwikViteOpts.devTools.imageDevTools - : true; + const imageDevTools = qwikViteOpts?.devTools?.imageDevTools ?? true; if (imageDevTools) { server.middlewares.use(getImageSizeServer(qwikPlugin.getSys(), rootDir!, srcDir!)); } - - if (devSsrServer) { - const plugin = async () => { - const opts = qwikPlugin.getOptions(); - const sys = qwikPlugin.getSys(); - const path = qwikPlugin.getPath(); - await configureDevServer( - basePathname, - server, - opts, - sys, - path, - isClientDevOnly, - clientDevInput - ); - }; - // TODO: Remove the "__qwikCityNew" condition in V3 - const isNEW = - (globalThis as any).__qwikRouterNew === true || - (globalThis as any).__qwikCityNew === true || - // related to this issue https://github.com/QwikDev/qwik/issues/7600 - // FIX: the @qwik-handlers aren't properly handled in dev mode for library projects - server.config.build.lib; - - if (isNEW) { - return plugin; - } else { - return plugin(); - } - } }, configurePreviewServer(server) { @@ -741,46 +680,10 @@ const LOG_COLOR = { debug: ANSI_COLOR.BrightBlack, }; -function updateEntryDev(code: string) { - code = code.replace(/["']@builder.io\/qwik["']/g, `'${VITE_CLIENT_MODULE}'`); - return code; -} - -function getViteDevModule(opts: NormalizedQwikPluginOptions) { - const qwikLoader = JSON.stringify( - opts.debug ? QWIK_LOADER_DEFAULT_DEBUG : QWIK_LOADER_DEFAULT_MINIFIED - ); - - return `// Qwik Vite Dev Module -import { render as qwikRender } from '@qwik.dev/core'; - -export async function render(document, rootNode, opts) { - - await qwikRender(document, rootNode, opts); - - let qwikLoader = document.getElementById('qwikloader'); - if (!qwikLoader) { - qwikLoader = document.createElement('script'); - qwikLoader.id = 'qwikloader'; - qwikLoader.innerHTML = ${qwikLoader}; - const parent = document.head ?? document.body ?? document.documentElement; - parent.appendChild(qwikLoader); - } - - if (!window.__qwikViteLog) { - window.__qwikViteLog = true; - console.debug("%c⭐️ Qwik Client Mode","background: #0c75d2; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;","Do not use this mode in production!\\n - No portion of the application is pre-rendered on the server\\n - All of the application is running eagerly in the browser\\n - Optimizer/Serialization/Deserialization code is not exercised!"); - } -}`; -} - export const isNotNullable = (v: T): v is NonNullable => { return v != null; }; -const VITE_CLIENT_MODULE = `@qwik.dev/core/vite-client`; -const CLIENT_DEV_INPUT = 'entry.dev'; - interface QwikVitePluginCommonOptions { /** * Prints verbose Qwik plugin debug logs. @@ -897,13 +800,6 @@ interface QwikVitePluginSSROptions extends QwikVitePluginCommonOptions { * Default `src/components/app/app.tsx` */ input?: string[] | string; - /** - * Entry input for client-side only development with hot-module reloading. This is for Vite - * development only and does not use SSR. - * - * Default `src/entry.dev.tsx` - */ - devInput?: string; /** * Output directory for the client build. * @@ -987,9 +883,3 @@ export interface QwikVitePluginApi { export type QwikVitePlugin = P & { name: 'vite-plugin-qwik'; }; - -/** @public */ -export interface QwikViteDevResponse { - _qwikEnvData?: Record; - _qwikRenderResolve?: () => void; -} diff --git a/packages/qwik/src/optimizer/src/plugins/vite.unit.ts b/packages/qwik/src/optimizer/src/plugins/vite.unit.ts index da0a5df2a85..02a7902b50e 100644 --- a/packages/qwik/src/optimizer/src/plugins/vite.unit.ts +++ b/packages/qwik/src/optimizer/src/plugins/vite.unit.ts @@ -89,7 +89,7 @@ test('command: serve, mode: development', async () => { assert.deepEqual(opts.debug, false); assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(rollupOptions.input, normalizePath(resolve(cwd, 'src', 'entry.dev'))); + assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); @@ -138,7 +138,7 @@ test('command: serve, mode: production', async () => { assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual(rollupOptions.input, normalizePath(resolve(cwd, 'src', 'entry.dev'))); + assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js'); assert.deepEqual(outputOptions.entryFileNames, 'build/q-[hash].js'); diff --git a/packages/qwik/src/optimizer/src/qwik.optimizer.api.md b/packages/qwik/src/optimizer/src/qwik.optimizer.api.md index 80ebfd9b51d..97ad85110af 100644 --- a/packages/qwik/src/optimizer/src/qwik.optimizer.api.md +++ b/packages/qwik/src/optimizer/src/qwik.optimizer.api.md @@ -268,14 +268,6 @@ export interface QwikSymbol { // @public export function qwikVite(qwikViteOpts?: QwikVitePluginOptions): any; -// @public (undocumented) -export interface QwikViteDevResponse { - // (undocumented) - _qwikEnvData?: Record; - // (undocumented) - _qwikRenderResolve?: () => void; -} - // Warning: (ae-forgotten-export) The symbol "P" needs to be exported by the entry point index.d.ts // // @public diff --git a/scripts/compiled-string-plugin.ts b/scripts/compiled-string-plugin.ts index 5db588ff121..65664a9c1b0 100644 --- a/scripts/compiled-string-plugin.ts +++ b/scripts/compiled-string-plugin.ts @@ -1,3 +1,4 @@ +import { minify } from 'terser'; import type { Plugin } from 'vite'; const isCompiledStringId = (id: string) => /[?&]compiled-string/.test(id); @@ -30,9 +31,9 @@ export function compiledStringPlugin(): Plugin { throw new Error(`Failed to load file: ${filePath}`); } - // The code already contains the "// @preserve-side-effects" comment - // which should help preserve side effects, but we'll ensure the resulting - // string maintains that marker + // minify the code + const minified = await minify(result.code ?? ''); + result.code = minified.code!; return { code: `export default ${JSON.stringify(result.code)};`, diff --git a/scripts/submodule-optimizer.ts b/scripts/submodule-optimizer.ts index d6eb5dad032..9aceaa2bac3 100644 --- a/scripts/submodule-optimizer.ts +++ b/scripts/submodule-optimizer.ts @@ -1,19 +1,10 @@ import { platformArchTriples } from '@napi-rs/triples'; -import { build, type BuildOptions } from 'esbuild'; -import RawPlugin from 'esbuild-plugin-raw'; import { constants, existsSync } from 'node:fs'; import { join } from 'node:path'; -import { minify } from 'terser'; +import { build as viteBuild, type UserConfig } from 'vite'; +import { compiledStringPlugin } from './compiled-string-plugin'; import { inlineQwikScriptsEsBuild } from './submodule-qwikloader'; -import { - access, - type BuildConfig, - getBanner, - nodeTarget, - readFile, - target, - writeFile, -} from './util'; +import { access, getBanner, target, writeFile, type BuildConfig } from './util'; /** Builds @qwik.dev/core/optimizer */ export async function submoduleOptimizer(config: BuildConfig) { @@ -22,117 +13,109 @@ export async function submoduleOptimizer(config: BuildConfig) { // uncomment this when adding a platform binding // await generatePlatformBindingsData(config); - async function buildOptimizer() { - const opts: BuildOptions = { - entryPoints: [join(config.optimizerDir, 'index.ts')], - entryNames: 'optimizer', - outdir: config.distQwikPkgDir, - bundle: true, + const entryPoint = join(config.optimizerDir, 'index.ts'); + const qwikloaderScripts = await inlineQwikScriptsEsBuild(config); + + // Common Vite configuration + const commonConfig = { + clearScreen: false, + build: { + emptyOutDir: false, sourcemap: false, - platform: 'node', - target, - }; - - const qwikloaderScripts = await inlineQwikScriptsEsBuild(config); - - const esmBuild = build({ - ...opts, - format: 'esm', - banner: { js: getBanner('@qwik.dev/core/optimizer', config.distVersion) }, - outExtension: { '.js': '.mjs' }, - define: { - 'globalThis.IS_CJS': 'false', - 'globalThis.IS_ESM': 'true', - 'globalThis.QWIK_VERSION': JSON.stringify(config.distVersion), - ...qwikloaderScripts, + target: target, + minify: !config.dev, // Minify in production builds + rollupOptions: { + external: ['node:fs', 'node:path'], + }, + lib: { + entry: entryPoint, + name: 'optimizer', + fileName: (format) => `optimizer.${format === 'es' ? 'mjs' : 'cjs'}`, }, - plugins: [ - { + }, + define: { + 'globalThis.QWIK_VERSION': JSON.stringify(config.distVersion), + ...qwikloaderScripts, + }, + plugins: [ + compiledStringPlugin(), + { + name: 'forbid-core', + enforce: 'pre', + resolveId(id) { // throws an error if files from src/core are loaded, except for some allowed imports - name: 'forbid-core', - setup(build) { - build.onLoad({ filter: /src[\\/]core[\\/]/ }, (args) => { - if (args.path.includes('util') || args.path.includes('shared')) { - return null; - } - console.error('forbid-core', args); - throw new Error('Import of core files is not allowed in server builds.'); - }); - }, + if (/src[/\\]core[\\/]/.test(id) && !id.includes('util') && !id.includes('shared')) { + console.error('forbid-core', id); + throw new Error('Import of core files is not allowed in server builds.'); + } + return null; }, - RawPlugin(), - ], - }); - - const cjsBanner = [`globalThis.qwikOptimizer = (function (module) {`].join('\n'); - - const cjsBuild = build({ - ...opts, - format: 'cjs', - banner: { js: cjsBanner }, - footer: { - js: `return module.exports; })(typeof module === 'object' && module.exports ? module : { exports: {} });`, }, - outExtension: { '.js': '.cjs' }, - define: { - 'globalThis.IS_CJS': 'true', - 'globalThis.IS_ESM': 'false', - 'globalThis.QWIK_VERSION': JSON.stringify(config.distVersion), - ...qwikloaderScripts, + ], + } as const satisfies UserConfig; + + // ESM Build + const esmConfig: UserConfig = { + ...commonConfig, + build: { + ...commonConfig.build, + outDir: config.distQwikPkgDir, + lib: { + ...commonConfig.build!.lib, + formats: ['es'], }, - target: nodeTarget, - plugins: [RawPlugin()], - }); - - await Promise.all([esmBuild, cjsBuild]); - - if (!config.dev) { - const esmDist = join(config.distQwikPkgDir, 'optimizer.mjs'); - const cjsDist = join(config.distQwikPkgDir, 'optimizer.cjs'); - - await Promise.all( - [esmDist, cjsDist].map(async (p) => { - const src = await readFile(p, 'utf-8'); - const result = await minify(src, { - compress: { - booleans: false, - collapse_vars: false, - comparisons: false, - drop_debugger: false, - expression: false, - keep_classnames: true, - inline: false, - if_return: false, - join_vars: false, - loops: false, - passes: 1, - reduce_funcs: false, - reduce_vars: false, - sequences: false, - switches: false, - }, - format: { - comments: false, - braces: true, - beautify: true, - indent_level: 2, - preamble: getBanner('@qwik.dev/core/optimizer', config.distVersion), - }, - mangle: false, - }); - await writeFile(p, result.code!); - }) - ); - } + rollupOptions: { + ...commonConfig.build?.rollupOptions, + output: { + banner: getBanner('@qwik.dev/core/optimizer', config.distVersion), + }, + }, + }, + define: { + ...commonConfig.define, + 'globalThis.IS_CJS': 'false', + 'globalThis.IS_ESM': 'true', + }, + }; + + // CJS Build + const cjsConfig: UserConfig = { + ...commonConfig, + build: { + ...commonConfig.build, + outDir: config.distQwikPkgDir, + lib: { + ...commonConfig.build!.lib, + formats: ['cjs'], + }, + rollupOptions: { + ...commonConfig.build?.rollupOptions, + output: { + banner: `globalThis.qwikOptimizer = (function (module) {\n${getBanner('@qwik.dev/core/optimizer', config.distVersion)}`, + footer: `return module.exports; })(typeof module === 'object' && module.exports ? module : { exports: {} });`, + }, + }, + }, + define: { + ...commonConfig.define, + 'globalThis.IS_CJS': 'true', + 'globalThis.IS_ESM': 'false', + }, + }; - console.log('🐹', submodule); - } + // Build both formats + await Promise.all([viteBuild(esmConfig), viteBuild(cjsConfig)]); + + // Note: Minification is now handled automatically by Vite in production builds + // The output files will be minified when config.dev is false - await Promise.all([buildOptimizer()]); + console.log('🐹', submodule); } -// @ts-expect-error -- we only use this when adding a platform binding -async function generatePlatformBindingsData(config: BuildConfig) { +// This function is only used when adding platform bindings +// Uncomment the call to generatePlatformBindingsData(config) above when needed +// export so that it can stay without being used +export async function generatePlatformBindingsData(config: BuildConfig) { // generate the platform binding information for only what qwik provides // allows us to avoid using a file system in the optimizer, take a look at: // - node_modules/@node-rs/helper/lib/loader.js @@ -176,7 +159,7 @@ async function generatePlatformBindingsData(config: BuildConfig) { try { await access(platformBindingPath, constants.W_OK); isWritable = true; - } catch (e) { + } catch { isWritable = false; } if (isWritable) { diff --git a/starters/apps/base/src/entry.dev.tsx b/starters/apps/base/src/entry.dev.tsx deleted file mode 100644 index dba2a868c7b..00000000000 --- a/starters/apps/base/src/entry.dev.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/* - * WHAT IS THIS FILE? - * - * Development entry point using only client-side modules: - * - Do not use this mode in production! - * - No SSR - * - No portion of the application is pre-rendered on the server. - * - All of the application is running eagerly in the browser. - * - More code is transferred to the browser than in SSR mode. - * - Optimizer/Serialization/Deserialization code is not exercised! - */ -import { render, type RenderOptions } from "@qwik.dev/core"; -import Root from "./root"; - -export default function (opts: RenderOptions) { - return render(document, , opts); -} diff --git a/starters/features/csr/index.html b/starters/features/csr/index.html new file mode 100644 index 00000000000..e2103d51434 --- /dev/null +++ b/starters/features/csr/index.html @@ -0,0 +1,23 @@ + + + + + + Qwik browser-only starter + + + + +
+ + + + diff --git a/starters/features/csr/package.json b/starters/features/csr/package.json new file mode 100644 index 00000000000..e911fba556c --- /dev/null +++ b/starters/features/csr/package.json @@ -0,0 +1,29 @@ +{ + "description": "Use Qwik in browser-only mode", + "__qwik__": { + "displayName": "Integration: Qwik in browser-only mode", + "priority": -10, + "viteConfig": {}, + "docs": [ + "https://qwik.dev/docs/integrations/client-only/" + ], + "nextSteps": { + "title": "Next Steps", + "lines": [ + " - run `pnpm dev` to start the development server", + " - run `pnpm preview` to view a production build", + " - run `pnpm build` to build the application" + ] + } + }, + "dependencies": { + "@qwik.dev/core": "workspace:*" + }, + "devDependencies": { + "vite": "latest" + }, + "scripts": { + "dev": "vite", + "build": "vite build" + } +} diff --git a/starters/features/csr/src/root.tsx b/starters/features/csr/src/root.tsx new file mode 100644 index 00000000000..f6e77021c3e --- /dev/null +++ b/starters/features/csr/src/root.tsx @@ -0,0 +1,15 @@ +import { component$ } from "@qwik.dev/core"; + +import "./global.css"; + +export default component$(() => { + /** + * The starting point of the application. + */ + + return ( +
+

Hello World

+
+ ); +}); diff --git a/starters/features/csr/vite.config.mts b/starters/features/csr/vite.config.mts new file mode 100644 index 00000000000..5c62974a1a9 --- /dev/null +++ b/starters/features/csr/vite.config.mts @@ -0,0 +1,13 @@ +/** + * This is the base config for vite. + * When building, the adapter config is used which loads this file and extends it. + */ +import { qwikVite } from "@qwik.dev/core/optimizer"; +import { defineConfig, type UserConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig((): UserConfig => { + return { + plugins: [qwikVite({ csr: true }), tsconfigPaths({ root: "." })], + }; +}); From 07e214537b5609a51b1192a6ea59bd2b6fe1ac15 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Sun, 24 Aug 2025 21:39:11 +0200 Subject: [PATCH 08/14] perf(core): read client manifest only if and when needed --- .../qwik/src/optimizer/src/plugins/plugin.ts | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.ts b/packages/qwik/src/optimizer/src/plugins/plugin.ts index 4dcc2d7619a..2a6bef46041 100644 --- a/packages/qwik/src/optimizer/src/plugins/plugin.ts +++ b/packages/qwik/src/optimizer/src/plugins/plugin.ts @@ -280,27 +280,6 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { if (updatedOpts.manifestInput) { opts.manifestInput = getValidManifest(updatedOpts.manifestInput) || null; } - if ( - !opts.manifestInput && - opts.target === 'ssr' && - opts.buildMode === 'production' && - maybeFs - ) { - let clientManifestPath = resolvePath(opts.clientOutDir, Q_MANIFEST_FILENAME); - if (!(await maybeFs.promises.stat(clientManifestPath).catch(() => false))) { - clientManifestPath = resolvePath(opts.rootDir, CLIENT_OUT_DIR, Q_MANIFEST_FILENAME); - } - try { - const clientManifestStr = await maybeFs.promises.readFile(clientManifestPath, 'utf-8'); - opts.manifestInput = getValidManifest(JSON.parse(clientManifestStr)) || null; - // eslint-disable-next-line no-console - console.info('Read client manifest from', clientManifestPath); - } catch (e) { - console.warn( - `could not read Qwik client manifest ${clientManifestPath}, ignoring. Make sure you provide it to the SSR renderer. (${e})` - ); - } - } if (typeof updatedOpts.transformedModuleOutput === 'function') { opts.transformedModuleOutput = updatedOpts.transformedModuleOutput; @@ -939,6 +918,34 @@ export const isDev = ${JSON.stringify(isDev)}; } async function getQwikServerManifestModule(isServer: boolean) { + if ( + !opts.manifestInput && + opts.target === 'ssr' && + opts.buildMode === 'production' && + maybeFs + ) { + const path = getPath(); + let clientManifestPath = path.resolve(opts.clientOutDir, Q_MANIFEST_FILENAME); + if (!(await maybeFs.promises.stat(clientManifestPath).catch(() => false))) { + clientManifestPath = path.resolve(opts.rootDir, CLIENT_OUT_DIR, Q_MANIFEST_FILENAME); + } + try { + const clientManifestStr = await maybeFs.promises.readFile(clientManifestPath, 'utf-8'); + opts.manifestInput = getValidManifest(JSON.parse(clientManifestStr)) || null; + // eslint-disable-next-line no-console + console.info('Read client manifest from', clientManifestPath); + } catch (e) { + console.warn( + `\n==========\n` + + `Could not read Qwik client manifest ${clientManifestPath}.\n` + + `Make sure you provide it to the SSR renderer via the \`manifest\` argument, or define it in \`globalThis.__QWIK_MANIFEST__\` before the server bundle is loaded, or embed it in the server bundle by replacing \`globalThis.__QWIK_MANIFEST__\`.\n` + + `Without the manifest, the SSR renderer will not be able to generate event handlers.\n` + + `(${e})\n` + + `==========\n` + ); + } + } + const manifest = isServer ? opts.manifestInput : null; let serverManifest: ServerQwikManifest | null = null; if (manifest?.manifestHash) { @@ -954,7 +961,7 @@ export const isDev = ${JSON.stringify(isDev)}; }; } return `// @qwik-client-manifest -export const manifest = ${JSON.stringify(serverManifest)};\n`; +export const manifest = ${serverManifest ? JSON.stringify(serverManifest) : 'globalThis.__QWIK_MANIFEST__'};\n`; } function setSourceMapSupport(sourcemap: boolean) { From 32d90795eb24cd9ac14ab4fa69ecbc31f2695600 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Fri, 15 Aug 2025 02:11:28 +0200 Subject: [PATCH 09/14] feat(router): refactor dev server, allow routes hot reload - remove separate dev-server which duplicated route processing logic, instead use node adapter - watch routes for changes and reload when needed - make route imports always dynamic (optionally static). This limits the amount of code to load when not all paths are visited, and reduces startup time. - remove .testing condition on double import, the reason was the dev-server importing core separately from the test code Still missing: - transformindexhtml handling - entry.ts support - serviceworker support --- e2e/qwik-cli-e2e/tests/serve.spec.ts | 2 +- packages/qwik-router/src/buildtime/context.ts | 6 +- .../generate-qwik-router-config.ts | 4 +- .../runtime-generation/generate-routes.ts | 2 +- .../generate-service-worker.ts | 30 +- packages/qwik-router/src/buildtime/types.ts | 3 +- .../src/buildtime/vite/dev-server.ts | 566 ------------------ .../qwik-router/src/buildtime/vite/plugin.ts | 178 +++++- .../vite/qwik-router.buildtime.api.md | 1 + .../qwik-router/src/buildtime/vite/types.ts | 2 + .../qwik/src/optimizer/src/plugins/plugin.ts | 11 +- 11 files changed, 185 insertions(+), 620 deletions(-) delete mode 100644 packages/qwik-router/src/buildtime/vite/dev-server.ts diff --git a/e2e/qwik-cli-e2e/tests/serve.spec.ts b/e2e/qwik-cli-e2e/tests/serve.spec.ts index 796f914ebfd..43b554edec5 100644 --- a/e2e/qwik-cli-e2e/tests/serve.spec.ts +++ b/e2e/qwik-cli-e2e/tests/serve.spec.ts @@ -33,7 +33,7 @@ for (const type of ['empty', 'playground'] as QwikProjectType[]) { } config.cleanupFn(); }; - }); + }, 120000); if (type === 'playground') { test( diff --git a/packages/qwik-router/src/buildtime/context.ts b/packages/qwik-router/src/buildtime/context.ts index 4f2b0dbff46..14e7b2bc9e5 100644 --- a/packages/qwik-router/src/buildtime/context.ts +++ b/packages/qwik-router/src/buildtime/context.ts @@ -6,7 +6,8 @@ export function createBuildContext( rootDir: string, viteBasePath: string, userOpts?: PluginOptions, - target?: 'ssr' | 'client' + target?: 'ssr' | 'client', + dynamicImports?: boolean ) { const ctx: BuildContext = { rootDir: normalizePath(rootDir), @@ -20,8 +21,7 @@ export function createBuildContext( diagnostics: [], frontmatter: new Map(), target: target || 'ssr', - isDevServer: false, - isDevServerClientOnly: false, + dynamicImports: target === 'client' || !!dynamicImports, isDirty: true, activeBuild: null, }; diff --git a/packages/qwik-router/src/buildtime/runtime-generation/generate-qwik-router-config.ts b/packages/qwik-router/src/buildtime/runtime-generation/generate-qwik-router-config.ts index efb8b41f908..9dc2089d678 100644 --- a/packages/qwik-router/src/buildtime/runtime-generation/generate-qwik-router-config.ts +++ b/packages/qwik-router/src/buildtime/runtime-generation/generate-qwik-router-config.ts @@ -15,6 +15,7 @@ export function generateQwikRouterConfig( const c: string[] = []; c.push(`\n/** Qwik Router Config */`); + c.push(`\nimport { isDev } from '@qwik.dev/core/build';`); createServerPlugins(ctx, qwikPlugin, c, esmImports, isSSR); @@ -28,11 +29,10 @@ export function generateQwikRouterConfig( c.push(`export const basePathname = ${JSON.stringify(ctx.opts.basePathname)};`); - c.push(`export const cacheModules = ${JSON.stringify(!ctx.isDevServer)};`); + c.push(`export const cacheModules = !isDev;`); c.push( `export default { routes, serverPlugins, menus, trailingSlash, basePathname, cacheModules };` ); - return esmImports.join('\n') + c.join('\n'); } diff --git a/packages/qwik-router/src/buildtime/runtime-generation/generate-routes.ts b/packages/qwik-router/src/buildtime/runtime-generation/generate-routes.ts index ebf23792dd4..4efed351d6b 100644 --- a/packages/qwik-router/src/buildtime/runtime-generation/generate-routes.ts +++ b/packages/qwik-router/src/buildtime/runtime-generation/generate-routes.ts @@ -11,7 +11,7 @@ export function createRoutes( isSSR: boolean ) { const includeEndpoints = isSSR; - const dynamicImports = ctx.target === 'client'; + const dynamicImports = ctx.dynamicImports; if (ctx.layouts.length > 0) { c.push(`\n/** Qwik Router Layouts (${ctx.layouts.length}) */`); diff --git a/packages/qwik-router/src/buildtime/runtime-generation/generate-service-worker.ts b/packages/qwik-router/src/buildtime/runtime-generation/generate-service-worker.ts index 1f9209a43ce..253713e1664 100644 --- a/packages/qwik-router/src/buildtime/runtime-generation/generate-service-worker.ts +++ b/packages/qwik-router/src/buildtime/runtime-generation/generate-service-worker.ts @@ -3,29 +3,17 @@ import type { BuildContext } from '../types'; export function generateServiceWorkerRegister(ctx: BuildContext, swRegister: string) { let swReg: string; - if (ctx.isDevServer) { - swReg = SW_UNREGISTER; - } else { - swReg = swRegister; + swReg = swRegister; - let swUrl = '/service-worker.js'; - if (ctx.serviceWorkers.length > 0) { - const sw = ctx.serviceWorkers.sort((a, b) => - a.chunkFileName.length < b.chunkFileName.length ? -1 : 1 - )[0]; - swUrl = ctx.opts.basePathname + sw.chunkFileName; - } - - swReg = swReg.replace('__url', swUrl); + let swUrl = '/service-worker.js'; + if (ctx.serviceWorkers.length > 0) { + const sw = ctx.serviceWorkers.sort((a, b) => + a.chunkFileName.length < b.chunkFileName.length ? -1 : 1 + )[0]; + swUrl = ctx.opts.basePathname + sw.chunkFileName; } + swReg = swReg.replace('__url', swUrl); + return `export default ${JSON.stringify(swReg)};`; } - -const SW_UNREGISTER = ` -navigator.serviceWorker?.getRegistrations().then((regs) => { - for (const reg of regs) { - reg.unregister(); - } -}); -`; diff --git a/packages/qwik-router/src/buildtime/types.ts b/packages/qwik-router/src/buildtime/types.ts index ad505d19ca7..39dc4ace9aa 100644 --- a/packages/qwik-router/src/buildtime/types.ts +++ b/packages/qwik-router/src/buildtime/types.ts @@ -12,8 +12,7 @@ export interface BuildContext { frontmatter: Map; diagnostics: Diagnostic[]; target: 'ssr' | 'client' | undefined; - isDevServer: boolean; - isDevServerClientOnly: boolean; + dynamicImports: boolean; isDirty: boolean; activeBuild: Promise | null; } diff --git a/packages/qwik-router/src/buildtime/vite/dev-server.ts b/packages/qwik-router/src/buildtime/vite/dev-server.ts deleted file mode 100644 index 4495e804290..00000000000 --- a/packages/qwik-router/src/buildtime/vite/dev-server.ts +++ /dev/null @@ -1,566 +0,0 @@ -import type { QwikViteDevResponse } from '@qwik.dev/core/optimizer'; -import fs from 'node:fs'; -import type { ServerResponse } from 'node:http'; -import { join, resolve } from 'node:path'; -import type { Connect, ViteDevServer } from 'vite'; -import { computeOrigin, fromNodeHttp, getUrl } from '../../middleware/node/http'; -import { - checkBrand, - resolveRequestHandlers, -} from '../../middleware/request-handler/resolve-request-handlers'; -import { getQwikRouterServerData } from '../../middleware/request-handler/response-page'; -import { - QDATA_JSON, - getRouteMatchPathname, - runQwikRouter, -} from '../../middleware/request-handler/user-response'; -import { matchRoute } from '../../runtime/src/route-matcher'; -import { getMenuLoader } from '../../runtime/src/routing'; -import type { - ActionInternal, - RebuildRouteInfoInternal, - ContentMenu, - LoadedRoute, - LoaderInternal, - MenuData, - MenuModule, - MenuModuleLoader, - PathParams, - RequestEvent, - RouteModule, -} from '../../runtime/src/types'; -import { getExtension, normalizePath } from '../../utils/fs'; -import { updateBuildContext } from '../build'; -import type { BuildContext, BuildRoute } from '../types'; -import { formatError } from './format-error'; -import { RequestEvShareServerTiming } from '../../middleware/request-handler/request-event'; - -export function ssrDevMiddleware(ctx: BuildContext, server: ViteDevServer) { - const matchRouteRequest = (pathname: string) => { - for (const route of ctx.routes) { - let params = matchRoute(route.pathname, pathname); - if (params) { - return { route, params }; - } - - if (!globalThis.__NO_TRAILING_SLASH__ && !pathname.endsWith('/')) { - params = matchRoute(route.pathname, pathname + '/'); - if (params) { - return { route, params }; - } - } - } - - return null; - }; - - const routePs: Record> = {}; - const _resolveRoute = async ( - routeModulePaths: WeakMap, string>, - matchPathname: string - ) => { - await updateBuildContext(ctx); - for (const d of ctx.diagnostics) { - if (d.type === 'error') { - console.error(d.message); - } else { - console.warn(d.message); - } - } - - // use vite to dynamically load each layout/page module in this route's hierarchy - const loaderMap = new Map(); - const serverPlugins: RouteModule[] = []; - for (const file of ctx.serverPlugins) { - const layoutModule = await server.ssrLoadModule(file.filePath); - serverPlugins.push(layoutModule); - routeModulePaths.set(layoutModule, file.filePath); - checkModule(loaderMap, layoutModule, file.filePath); - } - - const routeResult = matchRouteRequest(matchPathname); - const routeModules: RouteModule[] = []; - - let params: PathParams = {}; - if (routeResult) { - const route = routeResult.route; - params = routeResult.params; - - // found a matching route - for (const layout of route.layouts) { - const layoutModule = await server.ssrLoadModule(layout.filePath); - routeModules.push(layoutModule); - routeModulePaths.set(layoutModule, layout.filePath); - checkModule(loaderMap, layoutModule, layout.filePath); - } - const endpointModule = await server.ssrLoadModule(route.filePath); - routeModules.push(endpointModule); - routeModulePaths.set(endpointModule, route.filePath); - checkModule(loaderMap, endpointModule, route.filePath); - } - - let menu: ContentMenu | undefined = undefined; - const menus = ctx.menus.map((buildMenu) => { - const menuLoader: MenuModuleLoader = async () => { - const m = await server.ssrLoadModule(buildMenu.filePath); - const menuModule: MenuModule = { - default: m.default, - }; - return menuModule; - }; - const menuData: MenuData = [buildMenu.pathname, menuLoader]; - return menuData; - }); - - const menuLoader = getMenuLoader(menus, matchPathname); - if (menuLoader) { - const menuModule = await menuLoader(); - menu = menuModule?.default; - } - - const loadedRoute = [ - routeResult ? routeResult.route.pathname : '', - params, - routeModules, - menu, - undefined, - ] satisfies LoadedRoute; - return { serverPlugins, loadedRoute }; - }; - const resolveRoute = (routeModulePaths: WeakMap, string>, url: URL) => { - const matchPathname = getRouteMatchPathname(url.pathname); - routePs[matchPathname] ||= _resolveRoute(routeModulePaths, matchPathname).finally(() => { - delete routePs[matchPathname]; - }); - return routePs[matchPathname]; - }; - - // Preload the modules needed to handle /, so that they load faster on first request. - resolveRoute(new WeakMap(), new URL('/', 'http://localhost')).catch((e: unknown) => { - if (e instanceof Error) { - server.ssrFixStacktrace(e); - formatError(e); - } - }); - - return async (req: Connect.IncomingMessage, res: ServerResponse, next: Connect.NextFunction) => { - try { - const url = getUrl(req, computeOrigin(req)); - - if (shouldSkipRequest(url.pathname) || isVitePing(url.pathname, req.headers)) { - next(); - return; - } - - // Normally, entries are served statically, so in dev mode we need to handle them here. - const matchRouteName = url.pathname.slice(1); - const entry = ctx.entries.find((e) => e.routeName === matchRouteName); - if (entry) { - const entryContents = await server.transformRequest( - `/@fs${entry.filePath.startsWith('/') ? '' : '/'}${entry.filePath}` - ); - - if (entryContents) { - res.setHeader('Content-Type', 'text/javascript'); - res.end(entryContents.code); - } else { - next(); - } - return; - } - - const routeModulePaths = new WeakMap(); - try { - const { serverPlugins, loadedRoute } = await resolveRoute(routeModulePaths, url); - - const renderFn = async (requestEv: RequestEvent) => { - // routeResult && requestEv.sharedMap.set('@routeName', routeResult.route.pathname); - const isPageDataReq = requestEv.pathname.endsWith(QDATA_JSON); - if (!isPageDataReq) { - const serverData = getQwikRouterServerData(requestEv); - - res.statusCode = requestEv.status(); - requestEv.headers.forEach((value, key) => { - res.setHeader(key, value); - }); - - const cookieHeaders = requestEv.cookie.headers(); - if (cookieHeaders.length > 0) { - res.setHeader('Set-Cookie', cookieHeaders); - } - - const serverTiming = requestEv.sharedMap.get(RequestEvShareServerTiming) as - | [string, number][] - | undefined; - if (serverTiming) { - res.setHeader( - 'Server-Timing', - serverTiming.map(([name, duration]) => `${name};dur=${duration}`).join(',') - ); - } - (res as QwikViteDevResponse)._qwikEnvData = { - ...(res as QwikViteDevResponse)._qwikEnvData, - ...serverData, - }; - - const qwikRenderPromise = new Promise((resolve) => { - (res as QwikViteDevResponse)._qwikRenderResolve = resolve; - }); - - next(); - - return qwikRenderPromise; - } - }; - - const requestHandlers = resolveRequestHandlers( - serverPlugins, - loadedRoute, - req.method ?? 'GET', - false, - renderFn - ); - - if (requestHandlers.length > 0) { - const serverRequestEv = await fromNodeHttp(url, req, res, 'dev'); - Object.assign(serverRequestEv.platform, ctx.opts.platform); - - const rebuildRouteInfo: RebuildRouteInfoInternal = async (url: URL) => { - const { serverPlugins, loadedRoute } = await resolveRoute(routeModulePaths, url); - const requestHandlers = resolveRequestHandlers( - serverPlugins, - loadedRoute, - req.method ?? 'GET', - false, - renderFn - ); - - return { - loadedRoute, - requestHandlers, - }; - }; - - const { completion, requestEv } = runQwikRouter( - serverRequestEv, - loadedRoute, - requestHandlers, - rebuildRouteInfo, - ctx.opts.basePathname - ); - const result = await completion; - if (result != null) { - throw result; - } - - if (requestEv.headersSent || res.headersSent) { - return; - } - } else { - // no matching route - - // test if this is a dev service-worker.js request - for (const sw of ctx.serviceWorkers) { - const match = sw.pattern.exec(req.originalUrl!); - if (match) { - res.setHeader('Content-Type', 'text/javascript'); - res.end(DEV_SERVICE_WORKER); - return; - } - } - } - } catch (e: any) { - if (e instanceof Error) { - server.ssrFixStacktrace(e); - formatError(e); - } - if (e instanceof Error && (e as any).id === 'DEV_SERIALIZE') { - next(formatDevSerializeError(e, routeModulePaths)); - } else { - next(e); - } - return; - } - - // simple test if it's a static file - const ext = getExtension(req.originalUrl!); - if (STATIC_CONTENT_TYPES[ext]) { - // let the static asset middleware handle this - next(); - return; - } - - if (req.headers.accept && req.headers.accept.includes('text/html')) { - /** - * If no route match, but is html request, fast path to 404 otherwise qwik plugin will take - * over render without envData causing error - */ - // TODO: after file change, need to manual page refresh to see changes currently - // there's two ways handling HMR for page endpoint with error - // 1. Html response inject `import.meta.hot.accept('./pageEndpoint_FILE_URL', () => { location.reload })` - // 2. watcher, diff previous & current file content, a bit expensive - const html = getUnmatchedRouteHtml(url, ctx); - res.statusCode = 404; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.end(html); - return; - } - - next(); - } catch (e) { - next(e); - } - }; -} - -const checkModule = (loaderMap: Map, routeModule: any, filePath: string) => { - for (const loader of Object.values(routeModule)) { - if (checkBrand(loader, 'server_action') || checkBrand(loader, 'server_loader')) { - checkUniqueLoader(loaderMap, loader as any, filePath); - } - } -}; - -const checkUniqueLoader = ( - loaderMap: Map, - loader: LoaderInternal | ActionInternal, - filePath: string -) => { - const prev = loaderMap.get(loader.__id); - if (prev) { - const type = loader.__brand === 'server_loader' ? 'routeLoader$' : 'routeAction$'; - throw new Error( - `The same ${type} (${loader.__qrl.getSymbol()}) was exported in multiple modules: - - ${prev} - - ${filePath}` - ); - } - loaderMap.set(loader.__id, filePath); -}; - -export function getUnmatchedRouteHtml(url: URL, ctx: BuildContext): string { - const blue = '#006ce9'; - const routesAndDistance = sortRoutesByDistance(ctx.routes, url); - return ` - - - - - 404 Not Found - - - - -

404 ${url.pathname} not found.

- -
- Available Routes - - ${routesAndDistance - .map( - ([route, distance], i) => - `${route.pathname}${ - i === 0 && distance < 3 - ? ' 👈 maybe you meant this?' - : '' - } ` - ) - .join('')} -
- - `; -} - -const sortRoutesByDistance = (routes: BuildRoute[], url: URL) => { - const pathname = url.pathname; - const routesWithDistance = routes.map( - (route) => [route, levenshteinDistance(pathname, route.pathname)] as const - ); - return routesWithDistance.sort((a, b) => a[1] - b[1]); -}; - -const levenshteinDistance = (s: string, t: string) => { - if (!s.endsWith('/')) { - s = s + '/'; - } - if (!t.endsWith('/')) { - t = t + '/'; - } - const arr = []; - for (let i = 0; i <= t.length; i++) { - arr[i] = [i]; - for (let j = 1; j <= s.length; j++) { - arr[i][j] = - i === 0 - ? j - : Math.min( - arr[i - 1][j] + 1, - arr[i][j - 1] + 1, - arr[i - 1][j - 1] + (s[j - 1] === t[i - 1] ? 0 : 1) - ); - } - } - return arr[t.length][s.length]; -}; - -/** - * Static file server for files written directly to the 'dist' dir. - * - * Only handles the simplest cases. - */ -export function staticDistMiddleware({ config }: ViteDevServer) { - const distDirs = new Set( - ['dist', config.build.outDir, config.publicDir].map((d) => - normalizePath(resolve(config.root, d)) - ) - ); - - return async (req: Connect.IncomingMessage, res: ServerResponse, next: Connect.NextFunction) => { - const url = new URL(req.originalUrl!, `http://${req.headers.host}`); - - if (shouldSkipRequest(url.pathname)) { - next(); - return; - } - - const relPath = `${url.pathname.slice(1)}${url.search}`; - - const ext = getExtension(relPath); - const contentType = STATIC_CONTENT_TYPES[ext]; - if (!contentType) { - next(); - return; - } - - for (const distDir of distDirs) { - try { - const filePath = join(distDir, relPath); - const s = await fs.promises.stat(filePath); - if (s.isFile()) { - res.writeHead(200, { - 'Content-Type': contentType, - 'X-Source-Path': filePath, - }); - fs.createReadStream(filePath).pipe(res); - return; - } - } catch { - // - } - } - - next(); - }; -} - -function formatDevSerializeError(err: any, routeModulePaths: WeakMap) { - const requestHandler = err.requestHandler; - - if (requestHandler?.name) { - let errMessage = `Data returned from the ${requestHandler.name}() endpoint must be serializable `; - errMessage += `so it can also be transferred over the network in an HTTP response. `; - errMessage += `Please ensure that the data returned from ${requestHandler.name}() is limited to only strings, numbers, booleans, arrays or objects, and does not have any circular references. `; - errMessage += `Error: ${err.message}`; - err.message = errMessage; - - const endpointModule = err.endpointModule; - const filePath = routeModulePaths.get(endpointModule); - if (filePath) { - try { - const code = fs.readFileSync(filePath, 'utf-8'); - err.plugin = 'vite-plugin-qwik-router'; - err.id = normalizePath(filePath); - err.loc = { - file: err.id, - line: undefined, - column: undefined, - }; - err.stack = ''; - const lines = code.split('\n'); - const line = lines.findIndex((line) => line.includes(requestHandler.name)); - if (line > -1) { - err.loc.line = line + 1; - } - } catch { - // nothing - } - } - } - return err; -} - -const FS_PREFIX = `/@fs/`; -const VALID_ID_PREFIX = `/@id/`; -const VITE_PUBLIC_PATH = `/@vite/`; -const internalPrefixes = [FS_PREFIX, VALID_ID_PREFIX, VITE_PUBLIC_PATH]; -const InternalPrefixRE = new RegExp(`^(?:${internalPrefixes.join('|')})`); - -function shouldSkipRequest(pathname: string) { - if (pathname.startsWith('/@qwik-router-')) { - return true; - } - if ( - pathname.includes('__open-in-editor') || - InternalPrefixRE.test(pathname) || - pathname.startsWith('/node_modules/') - ) { - return true; - } - if (pathname.includes('favicon')) { - return true; - } - if (pathname.startsWith('/src/') || pathname.startsWith('/@fs/')) { - const ext = getExtension(pathname); - if (SKIP_SRC_EXTS[ext]) { - return true; - } - } - return false; -} - -function isVitePing(url: string, headers: Connect.IncomingMessage['headers']) { - return url === '/' && headers.accept === '*/*' && headers['sec-fetch-mode'] === 'no-cors'; -} - -const SKIP_SRC_EXTS: { [ext: string]: boolean } = { - '.tsx': true, - '.ts': true, - '.jsx': true, - '.js': true, - '.md': true, - '.mdx': true, - '.css': true, - '.scss': true, - '.sass': true, - '.less': true, - '.styl': true, - '.stylus': true, -}; - -const STATIC_CONTENT_TYPES: { [ext: string]: string } = { - '.js': 'text/javascript', - '.mjs': 'text/javascript', - '.json': 'application/json', - '.css': 'text/css', - '.html': 'text/html', - '.svg': 'image/svg+xml', - '.png': 'image/png', - '.gif': 'image/gif', - '.jpeg': 'image/jpeg', - '.jpg': 'image/jpeg', - '.ico': 'image/x-icon', -}; - -const DEV_SERVICE_WORKER = `/* Qwik Router Dev Service Worker */ -self.addEventListener('install', () => self.skipWaiting()); -self.addEventListener('activate', (ev) => ev.waitUntil(self.clients.claim())); -`; diff --git a/packages/qwik-router/src/buildtime/vite/plugin.ts b/packages/qwik-router/src/buildtime/vite/plugin.ts index c612deac3e1..845eb99eb81 100644 --- a/packages/qwik-router/src/buildtime/vite/plugin.ts +++ b/packages/qwik-router/src/buildtime/vite/plugin.ts @@ -1,5 +1,7 @@ import swRegister from '@qwik-router-sw-register-build'; import type { QwikVitePlugin } from '@qwik.dev/core/optimizer'; +import type { Render } from '@qwik.dev/core/server'; +import type { DocumentHeadValue, RendererOptions, RendererOutputOptions } from '@qwik.dev/router'; import fs from 'node:fs'; import { basename, extname, join, resolve } from 'node:path'; import type { Plugin, PluginOption, Rollup, UserConfig } from 'vite'; @@ -13,7 +15,6 @@ import { generateQwikRouterEntries } from '../runtime-generation/generate-entrie import { generateQwikRouterConfig } from '../runtime-generation/generate-qwik-router-config'; import { generateServiceWorkerRegister } from '../runtime-generation/generate-service-worker'; import type { BuildContext } from '../types'; -import { ssrDevMiddleware, staticDistMiddleware } from './dev-server'; import { getRouteImports } from './get-route-imports'; import { imagePlugin } from './image-jsx'; import type { @@ -22,6 +23,7 @@ import type { QwikRouterVitePluginOptions, } from './types'; import { validatePlugin } from './validate-plugin'; +import { formatError } from './format-error'; export const QWIK_ROUTER_CONFIG_ID = '@qwik-router-config'; const QWIK_ROUTER_ENTRIES_ID = '@qwik-router-entries'; @@ -103,6 +105,12 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { QWIK_ROUTER_SW_REGISTER, ], }, + server: { + watch: { + // needed for recursive watching of index and layout files in the src/routes directory + disableGlobbing: false, + }, + }, }; return updatedViteConfig; }, @@ -113,10 +121,13 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { const target = config.build?.ssr || config.mode === 'ssr' ? 'ssr' : 'client'; - ctx = createBuildContext(rootDir!, config.base, userOpts, target); - - ctx.isDevServer = config.command === 'serve' && config.mode !== 'production'; - ctx.isDevServerClientOnly = ctx.isDevServer && config.mode !== 'ssr'; + ctx = createBuildContext( + rootDir!, + config.base, + userOpts, + target, + !userOpts?.staticImportRoutes + ); await validatePlugin(ctx.opts); @@ -137,20 +148,145 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { outDir = config.build?.outDir; }, - configureServer(server) { - // this callback is run after the vite middlewares are registered - return () => { - if (!ctx) { - throw new Error('configureServer: Missing ctx from configResolved'); + async configureServer(server) { + // recursively watch all route files in the src/routes directory + const toWatch = resolve( + rootDir!, + 'src/routes/**/{index,layout,entry,service-worker}{.,@,-}*' + ); + server.watcher.add(toWatch); + await new Promise((resolve) => setTimeout(resolve, 1000)); + server.watcher.on('change', (path) => { + // If the path is not an index or layout file, skip + if (!/\/(index[.@]|layout[.-]|entry\.|service-worker\.)[^/]*$/.test(path)) { + return; } - if (!ctx.isDevServer) { - // preview server: serve static files from the dist directory - server.middlewares.use(staticDistMiddleware(server)); + // Invalidate the router config + ctx!.isDirty = true; + const graph = server.environments?.ssr?.moduleGraph; + if (graph) { + const mod = graph.getModuleById('@qwik-router-config'); + if (mod) { + graph.invalidateModule(mod); + } } - // qwik router middleware injected BEFORE vite internal middlewares - // and BEFORE @qwik.dev/core/optimizer/vite middlewares - // handles only known user defined routes - server.middlewares.use(ssrDevMiddleware(ctx, server)); + }); + + return () => { + // this hits only when Vite hasn't handled client assets + server.middlewares.use(async (req, res, next) => { + // TODO more flexible entry points, like importing `render` from `src/server` + const mod = (await server.ssrLoadModule('src/entry.ssr')) as { default: Render }; + if (!mod.default) { + console.error('No default export found in src/entry.ssr'); + return next(); + } + if (ctx!.isDirty) { + await build(ctx!); + ctx!.isDirty = false; + } + + // entry.ts files + const entry = ctx!.entries.find( + (e) => req.url === `${server.config.base}${e.chunkFileName}` + ); + if (entry) { + const entryContents = await server.transformRequest( + `/@fs${entry.filePath.startsWith('/') ? '' : '/'}${entry.filePath}` + ); + + if (entryContents) { + res.setHeader('Content-Type', 'text/javascript'); + res.end(entryContents.code); + } else { + next(); + } + return; + } + // in dev mode, serve a placeholder service worker + if (req.url === `${server.config.base}service-worker.js`) { + res.setHeader('Content-Type', 'text/javascript'); + res.end( + `/* Qwik Router Dev Service Worker */` + + `self.addEventListener('install', () => self.skipWaiting());` + + `self.addEventListener('activate', (ev) => ev.waitUntil(self.clients.claim()));` + ); + return; + } + + const documentHead: DocumentHeadValue = { + // Vite normally injects these + links: [...server.moduleGraph.idToModuleMap.keys()] + .filter((id) => id.endsWith('.css')) + .map((id) => { + const { url } = server.moduleGraph.idToModuleMap.get(id)!; + return { + key: id, + rel: 'stylesheet', + href: url, + }; + }), + scripts: [ + { + key: 'vite-dev-client', + props: { + type: 'module', + src: '/@vite/client', + }, + }, + ], + }; + + // Grab tags from other plugins + const fakeHTML = 'HEADBODY'; + for (const plugin of server.config.plugins) { + const handler = + (plugin.transformIndexHtml as any)?.handler || plugin.transformIndexHtml; + if (typeof handler === 'function') { + const result = await (handler(fakeHTML, {}) as ReturnType< + Extract + >); + if (result) { + if (typeof result === 'string' || 'html' in result) { + console.warn( + 'plugin', + plugin.name, + 'returned a string for transformIndexHtml, which is not supported by qwik-router' + ); + } else { + // TODO add these tags to the document + console.warn('not implemented yet: adding these tags to the document', result); + } + } + } + } + + const render = (async (opts: RendererOptions) => { + return await mod.default({ + ...opts, + serverData: { ...opts.serverData, documentHead }, + } as RendererOutputOptions as any); + }) as Render; + + const { createQwikRouter } = (await server.ssrLoadModule( + '@qwik.dev/router/middleware/node' + )) as typeof import('@qwik.dev/router/middleware/node'); + try { + const { router, staticFile, notFound } = createQwikRouter({ render }); + staticFile(req, res, () => { + router(req, res, () => { + notFound(req, res, next); + }); + }); + } catch (e: any) { + if (e instanceof Error) { + server.ssrFixStacktrace(e); + formatError(e); + } + next(e); + return; + } + }); }; }, @@ -161,7 +297,7 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { resolveId(id) { if (id === QWIK_ROUTER_CONFIG_ID || id === QWIK_ROUTER_ENTRIES_ID) { return { - id: join(rootDir!, id), + id, // user entries added in the routes, like src/routes/service-worker.ts // are added as dynamic imports to the qwik-router-config as a way to create // a new entry point for the build. Ensure these are not treeshaken. @@ -169,7 +305,7 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { }; } if (id === QWIK_ROUTER_SW_REGISTER) { - return join(rootDir!, id); + return id; } return null; }, @@ -183,7 +319,7 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { const isRouterConfig = id.endsWith(QWIK_ROUTER_CONFIG_ID); const isSwRegister = id.endsWith(QWIK_ROUTER_SW_REGISTER); if (isRouterConfig || isSwRegister) { - if (!ctx.isDevServer && ctx.isDirty) { + if (ctx.isDirty) { await build(ctx); ctx.isDirty = false; @@ -276,7 +412,7 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { closeBundle: { sequential: true, async handler() { - if (ctx?.target === 'ssr' && !ctx?.isDevServer && outDir) { + if (ctx?.target === 'ssr' && outDir) { await generateServerPackageJson(outDir, ssrFormat); } }, diff --git a/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md b/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md index 45b8ce8ea23..e4b0a4908d5 100644 --- a/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md +++ b/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md @@ -56,6 +56,7 @@ export interface QwikRouterVitePluginOptions extends Omit; + staticImportRoutes?: boolean; } // (No @packageDocumentation comment for this package) diff --git a/packages/qwik-router/src/buildtime/vite/types.ts b/packages/qwik-router/src/buildtime/vite/types.ts index f6ccdfb21b0..39054e3f50f 100644 --- a/packages/qwik-router/src/buildtime/vite/types.ts +++ b/packages/qwik-router/src/buildtime/vite/types.ts @@ -32,6 +32,8 @@ export interface QwikRouterVitePluginOptions extends Omit; imageOptimization?: ImageOptimizationOptions; + /** Whether to use static imports for route modules (layout and index files). Defaults to `false`. */ + staticImportRoutes?: boolean; } /** @public */ diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.ts b/packages/qwik/src/optimizer/src/plugins/plugin.ts index 2a6bef46041..4b96f83f015 100644 --- a/packages/qwik/src/optimizer/src/plugins/plugin.ts +++ b/packages/qwik/src/optimizer/src/plugins/plugin.ts @@ -131,15 +131,20 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { }; let lazyNormalizePath: (id: string) => string; - let maybeFs: typeof import('fs') | undefined; + let maybeFs: typeof import('fs') | undefined | null; const init = async () => { if (!internalOptimizer) { internalOptimizer = await createOptimizer(optimizerOptions); lazyNormalizePath = makeNormalizePath(internalOptimizer.sys); try { - maybeFs = await internalOptimizer.sys.dynamicImport('node:fs'); + // only try once, don't spam the console + if (maybeFs === undefined) { + maybeFs = await internalOptimizer.sys.dynamicImport('node:fs'); + } } catch { - // ignore + // eslint-disable-next-line no-console + console.log('node:fs not available, disabling automatic manifest reading'); + maybeFs = null; } } }; From 4355c6ab175ad6f6e7ba99cf3f1081aa8bad0c24 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Sun, 31 Aug 2025 10:42:16 +0200 Subject: [PATCH 10/14] feat(router): use real middleware in dev also, intercept the writes to the response and transform it as soon as the html head was processed --- .../src/buildtime/vite/dev-middleware.ts | 136 ++++++++++ .../buildtime/vite/html-transform-wrapper.ts | 238 ++++++++++++++++++ .../qwik-router/src/buildtime/vite/plugin.ts | 137 ++-------- .../src/buildtime/vite/plugin.unit.ts | 5 +- 4 files changed, 392 insertions(+), 124 deletions(-) create mode 100644 packages/qwik-router/src/buildtime/vite/dev-middleware.ts create mode 100644 packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts diff --git a/packages/qwik-router/src/buildtime/vite/dev-middleware.ts b/packages/qwik-router/src/buildtime/vite/dev-middleware.ts new file mode 100644 index 00000000000..18b251e347b --- /dev/null +++ b/packages/qwik-router/src/buildtime/vite/dev-middleware.ts @@ -0,0 +1,136 @@ +import type { Render } from '@qwik.dev/core/server'; +import type { RendererOptions } from '@qwik.dev/router'; +import type { Connect, ModuleNode, ViteDevServer } from 'vite'; +import { build } from '../build'; +import type { BuildContext } from '../types'; +import { formatError } from './format-error'; +import { wrapResponseForHtmlTransform } from './html-transform-wrapper'; + +export const makeRouterDevMiddleware = + (server: ViteDevServer, ctx: BuildContext): Connect.NextHandleFunction => + async (req, res, next) => { + // This middleware is the fallback for Vite dev mode; it renders the application + + // TODO more flexible entry points, like importing `render` from `src/server` + // TODO pick a better name, entry.server-renderer perhaps? + const mod = (await server.ssrLoadModule('src/entry.ssr')) as { default: Render }; + if (!mod.default) { + console.error('No default export found in src/entry.ssr'); + return next(); + } + const renderer = mod.default; + if (ctx!.isDirty) { + await build(ctx!); + ctx!.isDirty = false; + } + + // entry.ts files + const entry = ctx!.entries.find((e) => req.url === `${server.config.base}${e.chunkFileName}`); + if (entry) { + const entryContents = await server.transformRequest( + `/@fs${entry.filePath.startsWith('/') ? '' : '/'}${entry.filePath}` + ); + + if (entryContents) { + // For entry files, we don't need HTML transformation, so use original response + res.setHeader('Content-Type', 'text/javascript'); + res.end(entryContents.code); + } else { + next(); + } + return; + } + // serve a placeholder service worker, because we can't provide CJS bundles in dev mode + // once we support ESM service workers, we can remove this + if (req.url === `${server.config.base}service-worker.js`) { + // For service worker, we don't need HTML transformation, so use original response + res.setHeader('Content-Type', 'text/javascript'); + res.end( + `/* Qwik Router Dev Service Worker */` + + `self.addEventListener('install', () => self.skipWaiting());` + + `self.addEventListener('activate', (ev) => ev.waitUntil(self.clients.claim()));` + ); + return; + } + + // Now we can stream the render + const { createQwikRouter } = (await server.ssrLoadModule( + '@qwik.dev/router/middleware/node' + )) as typeof import('@qwik.dev/router/middleware/node'); + try { + const render = (async (opts: RendererOptions) => { + return await renderer(opts as any); + }) as Render; + const { router, staticFile, notFound } = createQwikRouter({ render }); + + // Wrap the response to enable HTML transformation + const wrappedRes = wrapResponseForHtmlTransform(req, res, server); + + staticFile(req, wrappedRes, () => { + router(req, wrappedRes, () => { + notFound(req, wrappedRes, next); + }); + }); + } catch (e: any) { + if (e instanceof Error) { + server.ssrFixStacktrace(e); + formatError(e); + } + next(e); + return; + } + }; + +const CSS_EXTENSIONS = ['.css', '.scss', '.sass', '.less', '.styl', '.stylus']; +const JS_EXTENSIONS = /\.[mc]?[tj]sx?$/; +const isCssPath = (url: string) => CSS_EXTENSIONS.some((ext) => url.endsWith(ext)); + +/** + * Qwik handles CSS imports itself, meaning vite doesn't get to see them, so we need to manually + * inject the CSS URLs. + */ +const getCssUrls = (server: ViteDevServer) => { + const cssModules = new Set(); + const cssImportedByCSS = new Set(); + + Array.from(server.moduleGraph.fileToModulesMap.entries()).forEach(([_name, modules]) => { + modules.forEach((mod) => { + const [pathId, query] = mod.url.split('?'); + + if (!query && isCssPath(pathId)) { + const isEntryCSS = mod.importers.size === 0; + const hasCSSImporter = Array.from(mod.importers).some((importer) => { + const importerPath = (importer as typeof mod).url || (importer as typeof mod).file; + + const isCSS = importerPath && isCssPath(importerPath); + + if (isCSS && mod.url) { + cssImportedByCSS.add(mod.url); + } + + return isCSS; + }); + + const hasJSImporter = Array.from(mod.importers).some((importer) => { + const importerPath = (importer as typeof mod).url || (importer as typeof mod).file; + return importerPath && JS_EXTENSIONS.test(importerPath); + }); + + if ((isEntryCSS || hasJSImporter) && !hasCSSImporter && !cssImportedByCSS.has(mod.url)) { + cssModules.add(mod); + } + } + }); + }); + return [...cssModules].map( + ({ url, lastHMRTimestamp }) => `${url}${lastHMRTimestamp ? `?t=${lastHMRTimestamp}` : ''}` + ); +}; + +export const getRouterIndexTags = (server: ViteDevServer) => { + const cssUrls = getCssUrls(server); + return cssUrls.map((url) => ({ + tag: 'link', + attrs: { rel: 'stylesheet', href: url }, + })); +}; diff --git a/packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts b/packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts new file mode 100644 index 00000000000..17e59f708fa --- /dev/null +++ b/packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts @@ -0,0 +1,238 @@ +import type { ViteDevServer } from 'vite'; +import type { IncomingMessage, ServerResponse } from 'node:http'; +import { OutgoingHttpHeaders, OutgoingHttpHeader } from 'node:http'; + +enum State { + /** Collecting content until is found */ + BUFFERING, + /** Transforming the head portion */ + PROCESSING_HEAD, + /** Streaming transformed content until */ + STREAMING_BODY, + /** Passing through content unchanged */ + PASSTHROUGH, +} + +/** + * Patches a response object to intercept HTML streams and transform them using Vite's + * transformIndexHtml. + */ +class HtmlTransformPatcher { + private state: State = State.BUFFERING; + private buffer = ''; + private bodyStartIndex = -1; + private bodyTagEndIndex = -1; + private isHtmlResponse = false; + + private appendToBody = ''; + private response: ServerResponse; + private server: ViteDevServer; + private request: IncomingMessage; + private origWrite: ServerResponse['write']; + private origEnd: ServerResponse['end']; + private origSetHeader: ServerResponse['setHeader']; + private origWriteHead: ServerResponse['writeHead']; + + private processingPromise: Promise | null = null; + + constructor(req: IncomingMessage, res: ServerResponse, server: ViteDevServer) { + this.request = req; + this.response = res; + this.server = server; + this.origWrite = this.response.write.bind(this.response); + this.origEnd = this.response.end.bind(this.response); + this.origSetHeader = this.response.setHeader.bind(this.response); + this.origWriteHead = this.response.writeHead.bind(this.response); + + // Now overwrite methods to detect HTML content type and intercept writes + + this.response.setHeader = (name: string, value: string | number | string[]) => { + if (name.toLowerCase() === 'content-type') { + const contentType = String(value).toLowerCase(); + this.isHtmlResponse = contentType.includes('text/html'); + } + return this.origSetHeader(name, value); + }; + + this.response.writeHead = ( + statusCode: number, + statusMessage?: string | OutgoingHttpHeaders | OutgoingHttpHeader[], + headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] + ) => { + if (headers && typeof headers === 'object') { + for (const [key, value] of Object.entries(headers)) { + if (key.toLowerCase() === 'content-type') { + const contentType = String(value).toLowerCase(); + this.isHtmlResponse = contentType.includes('text/html'); + } + } + } + return this.origWriteHead(statusCode, statusMessage as any, headers as any); + }; + + this.response.write = this.handleWrite.bind(this); + + this.response.end = (chunk?: any, encoding?: any, callback?: any): ServerResponse => { + this.handleEnd(chunk, encoding, callback).catch((error) => { + console.error('Error in handleEnd:', error); + // Fallback: end the original response + this.transitionToPassthrough(); + this.origEnd(chunk, encoding, callback); + }); + + return this.response; + }; + } + + private handleWrite(chunk: string | Buffer | ArrayBufferLike, encoding?: any, callback?: any) { + if (!this.isHtmlResponse || this.state === State.PASSTHROUGH) { + return this.origWrite(chunk, encoding, callback); + } + + if (typeof encoding === 'function') { + callback = encoding; + encoding = undefined; + } + + // Handle different chunk types properly + let data: string; + if ( + chunk instanceof ArrayBuffer || + chunk instanceof Uint8Array || + chunk instanceof Uint16Array || + chunk instanceof Uint32Array + ) { + data = new TextDecoder().decode(chunk); + } else if (Buffer.isBuffer(chunk)) { + data = chunk.toString(encoding || 'utf8'); + } else if (typeof chunk === 'string') { + data = chunk; + } else { + data = chunk?.toString() || ''; + } + this.buffer += data; + + switch (this.state) { + case State.BUFFERING: + const bodyMatch = this.buffer.match(/]*>/i); + if (bodyMatch) { + this.state = State.PROCESSING_HEAD; + this.bodyStartIndex = this.buffer.indexOf(bodyMatch[0]); + this.bodyTagEndIndex = this.bodyStartIndex + bodyMatch[0].length; + this.processingPromise = this.processHead(); + } + break; + + case State.PROCESSING_HEAD: + break; + + case State.STREAMING_BODY: + this.handleStreamingBodyState(); + break; + + default: + throw new Error(`Invalid state: ${this.state}`); + } + callback?.(); + return true; + } + + private async processHead() { + try { + const headPortion = this.buffer.slice(0, this.bodyTagEndIndex); + const fakeHtml = headPortion + '[FAKE_BODY]'; + + // Let Vite transform the HTML + const transformedHtml = await this.server.transformIndexHtml( + this.request.url || '/', + fakeHtml + ); + + // Find the [FAKE_BODY] marker in the transformed result + const fakeBodyIndex = transformedHtml.indexOf('[FAKE_BODY]'); + const bodyEndIndex = transformedHtml.indexOf('', fakeBodyIndex); + if (fakeBodyIndex === -1 || bodyEndIndex === -1) { + throw new Error('Transformed HTML does not contain [FAKE_BODY]...'); + } + + // Extract the transformed head and body tags + const transformedHead = transformedHtml.substring(0, fakeBodyIndex); + this.appendToBody = transformedHtml.substring( + fakeBodyIndex + '[FAKE_BODY]'.length, + bodyEndIndex + ); + this.buffer = transformedHead + this.buffer.slice(this.bodyTagEndIndex); + + if (this.appendToBody.length > 0) { + this.state = State.STREAMING_BODY; + this.handleStreamingBodyState(); + return; + } + + this.transitionToPassthrough(); + return; + } catch (error) { + console.error('Error transforming HTML:', error); + this.transitionToPassthrough(); + return; + } + } + + private handleStreamingBodyState() { + const bodyEndMatch = this.buffer.match(/<\/body>/i); + + if (bodyEndMatch) { + const bodyEndPos = this.buffer.indexOf(bodyEndMatch[0]); + this.buffer = + this.buffer.slice(0, bodyEndPos) + this.appendToBody + this.buffer.slice(bodyEndPos); + + this.transitionToPassthrough(); + return; + } + + // keep the last 6 characters of the buffer to detect `` + this.flushBuffer(6); + } + + private transitionToPassthrough() { + this.state = State.PASSTHROUGH; + this.flushBuffer(); + } + + private flushBuffer(keep: number = 0): void { + if (this.buffer.length > keep) { + if (keep > 0) { + this.origWrite(this.buffer.slice(0, -keep)); + this.buffer = this.buffer.slice(-keep); + } else { + this.origWrite(this.buffer); + this.buffer = ''; + } + } + } + + private async handleEnd(chunk?: any, encoding?: any, callback?: any): Promise { + if (typeof encoding === 'function') { + callback = encoding; + encoding = undefined; + } + if (chunk) { + this.handleWrite(chunk, encoding); + } + await this.processingPromise; + // just in case + this.flushBuffer(); + + this.origEnd(callback); + } +} + +/** Patches a response to enable HTML transformation using Vite's transformIndexHtml */ +export function wrapResponseForHtmlTransform( + request: IncomingMessage, + response: ServerResponse, + server: ViteDevServer +): ServerResponse { + new HtmlTransformPatcher(request, response, server); + return response; +} diff --git a/packages/qwik-router/src/buildtime/vite/plugin.ts b/packages/qwik-router/src/buildtime/vite/plugin.ts index 845eb99eb81..143d9932bd2 100644 --- a/packages/qwik-router/src/buildtime/vite/plugin.ts +++ b/packages/qwik-router/src/buildtime/vite/plugin.ts @@ -1,10 +1,8 @@ import swRegister from '@qwik-router-sw-register-build'; import type { QwikVitePlugin } from '@qwik.dev/core/optimizer'; -import type { Render } from '@qwik.dev/core/server'; -import type { DocumentHeadValue, RendererOptions, RendererOutputOptions } from '@qwik.dev/router'; import fs from 'node:fs'; import { basename, extname, join, resolve } from 'node:path'; -import type { Plugin, PluginOption, Rollup, UserConfig } from 'vite'; +import type { Plugin, PluginOption, Rollup, UserConfig, ViteDevServer } from 'vite'; import { loadEnv } from 'vite'; import { isMenuFileName, normalizePath, removeExtension } from '../../utils/fs'; import { build } from '../build'; @@ -23,7 +21,7 @@ import type { QwikRouterVitePluginOptions, } from './types'; import { validatePlugin } from './validate-plugin'; -import { formatError } from './format-error'; +import { getRouterIndexTags, makeRouterDevMiddleware } from './dev-middleware'; export const QWIK_ROUTER_CONFIG_ID = '@qwik-router-config'; const QWIK_ROUTER_ENTRIES_ID = '@qwik-router-entries'; @@ -50,8 +48,8 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { let qwikPlugin: QwikVitePlugin | null; let ssrFormat: 'esm' | 'cjs' = 'esm'; let outDir: string | null = null; - - globalThis.__qwikRouterNew = true; + let viteCommand: string; + let devServer: ViteDevServer | null = null; const api: QwikRouterPluginApi = { getBasePathname: () => ctx?.opts.basePathname ?? '/', @@ -70,7 +68,8 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { enforce: 'pre', api, - async config() { + async config(_viteConfig, viteEnv) { + viteCommand = viteEnv.command; const updatedViteConfig: UserConfig = { define: { 'globalThis.__DEFAULT_LOADERS_SERIALIZATION_STRATEGY__': JSON.stringify( @@ -149,6 +148,7 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { }, async configureServer(server) { + devServer = server; // recursively watch all route files in the src/routes directory const toWatch = resolve( rootDir!, @@ -172,124 +172,19 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { } }); + // this callback runs after all other middlewares have been added, so we can SSR as the last middleware return () => { - // this hits only when Vite hasn't handled client assets - server.middlewares.use(async (req, res, next) => { - // TODO more flexible entry points, like importing `render` from `src/server` - const mod = (await server.ssrLoadModule('src/entry.ssr')) as { default: Render }; - if (!mod.default) { - console.error('No default export found in src/entry.ssr'); - return next(); - } - if (ctx!.isDirty) { - await build(ctx!); - ctx!.isDirty = false; - } - - // entry.ts files - const entry = ctx!.entries.find( - (e) => req.url === `${server.config.base}${e.chunkFileName}` - ); - if (entry) { - const entryContents = await server.transformRequest( - `/@fs${entry.filePath.startsWith('/') ? '' : '/'}${entry.filePath}` - ); - - if (entryContents) { - res.setHeader('Content-Type', 'text/javascript'); - res.end(entryContents.code); - } else { - next(); - } - return; - } - // in dev mode, serve a placeholder service worker - if (req.url === `${server.config.base}service-worker.js`) { - res.setHeader('Content-Type', 'text/javascript'); - res.end( - `/* Qwik Router Dev Service Worker */` + - `self.addEventListener('install', () => self.skipWaiting());` + - `self.addEventListener('activate', (ev) => ev.waitUntil(self.clients.claim()));` - ); - return; - } - - const documentHead: DocumentHeadValue = { - // Vite normally injects these - links: [...server.moduleGraph.idToModuleMap.keys()] - .filter((id) => id.endsWith('.css')) - .map((id) => { - const { url } = server.moduleGraph.idToModuleMap.get(id)!; - return { - key: id, - rel: 'stylesheet', - href: url, - }; - }), - scripts: [ - { - key: 'vite-dev-client', - props: { - type: 'module', - src: '/@vite/client', - }, - }, - ], - }; - - // Grab tags from other plugins - const fakeHTML = 'HEADBODY'; - for (const plugin of server.config.plugins) { - const handler = - (plugin.transformIndexHtml as any)?.handler || plugin.transformIndexHtml; - if (typeof handler === 'function') { - const result = await (handler(fakeHTML, {}) as ReturnType< - Extract - >); - if (result) { - if (typeof result === 'string' || 'html' in result) { - console.warn( - 'plugin', - plugin.name, - 'returned a string for transformIndexHtml, which is not supported by qwik-router' - ); - } else { - // TODO add these tags to the document - console.warn('not implemented yet: adding these tags to the document', result); - } - } - } - } - - const render = (async (opts: RendererOptions) => { - return await mod.default({ - ...opts, - serverData: { ...opts.serverData, documentHead }, - } as RendererOutputOptions as any); - }) as Render; - - const { createQwikRouter } = (await server.ssrLoadModule( - '@qwik.dev/router/middleware/node' - )) as typeof import('@qwik.dev/router/middleware/node'); - try { - const { router, staticFile, notFound } = createQwikRouter({ render }); - staticFile(req, res, () => { - router(req, res, () => { - notFound(req, res, next); - }); - }); - } catch (e: any) { - if (e instanceof Error) { - server.ssrFixStacktrace(e); - formatError(e); - } - next(e); - return; - } - }); + server.middlewares.use(makeRouterDevMiddleware(server, ctx!)); }; }, + transformIndexHtml() { + if (viteCommand !== 'serve') { + return; + } + return getRouterIndexTags(devServer!); + }, + buildStart() { resetBuildContext(ctx); }, diff --git a/packages/qwik-router/src/buildtime/vite/plugin.unit.ts b/packages/qwik-router/src/buildtime/vite/plugin.unit.ts index 9aa1fd85eb5..d70d046721d 100644 --- a/packages/qwik-router/src/buildtime/vite/plugin.unit.ts +++ b/packages/qwik-router/src/buildtime/vite/plugin.unit.ts @@ -5,8 +5,7 @@ describe('qwikRouter plugin', () => { describe('defaultLoadersSerializationStrategy', () => { it('should set the defaultLoadersSerializationStrategy to "never" when not provided', async () => { const plugins = qwikRouter(); - - await expect((plugins[0] as any)?.config?.()).resolves.toMatchObject({ + await expect((plugins[0] as any)?.config?.({}, { command: 'build' })).resolves.toMatchObject({ define: { 'globalThis.__DEFAULT_LOADERS_SERIALIZATION_STRATEGY__': '"never"', }, @@ -18,7 +17,7 @@ describe('qwikRouter plugin', () => { defaultLoadersSerializationStrategy: 'always', }); - await expect((plugins[0] as any)?.config?.()).resolves.toMatchObject({ + await expect((plugins[0] as any)?.config?.({}, { command: 'build' })).resolves.toMatchObject({ define: { 'globalThis.__DEFAULT_LOADERS_SERIALIZATION_STRATEGY__': '"always"', }, From de24877e21fc5fbb151ce5f0ab3f051ff19f2cd7 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Mon, 15 Sep 2025 18:17:30 +0200 Subject: [PATCH 11/14] fix(router dev): don't let vite mess with head --- .../buildtime/vite/html-transform-wrapper.ts | 84 +++++++++++++------ 1 file changed, 60 insertions(+), 24 deletions(-) diff --git a/packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts b/packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts index 17e59f708fa..a20ac6f4624 100644 --- a/packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts +++ b/packages/qwik-router/src/buildtime/vite/html-transform-wrapper.ts @@ -20,11 +20,11 @@ enum State { class HtmlTransformPatcher { private state: State = State.BUFFERING; private buffer = ''; - private bodyStartIndex = -1; - private bodyTagEndIndex = -1; + private headInnerIndex = -1; + private bodyInnerIndex = -1; private isHtmlResponse = false; - private appendToBody = ''; + private bodyPostContent = ''; private response: ServerResponse; private server: ViteDevServer; private request: IncomingMessage; @@ -114,12 +114,22 @@ class HtmlTransformPatcher { switch (this.state) { case State.BUFFERING: - const bodyMatch = this.buffer.match(/]*>/i); - if (bodyMatch) { - this.state = State.PROCESSING_HEAD; - this.bodyStartIndex = this.buffer.indexOf(bodyMatch[0]); - this.bodyTagEndIndex = this.bodyStartIndex + bodyMatch[0].length; - this.processingPromise = this.processHead(); + // Note that we scan the entire buffer every time, in case the or tags are split across chunks + if (this.headInnerIndex === -1) { + const headMatch = this.buffer.match(/]*>/i); + if (headMatch) { + const headOuterIndex = this.buffer.indexOf(headMatch[0]); + this.headInnerIndex = headOuterIndex + headMatch[0].length; + } + } + if (this.headInnerIndex !== -1) { + const bodyMatch = this.buffer.slice(this.headInnerIndex).match(/]*>/i); + if (bodyMatch) { + this.state = State.PROCESSING_HEAD; + const bodyOuterIndex = this.buffer.indexOf(bodyMatch[0]); + this.bodyInnerIndex = bodyOuterIndex + bodyMatch[0].length; + this.processingPromise = this.processHead(); + } } break; @@ -139,31 +149,57 @@ class HtmlTransformPatcher { private async processHead() { try { - const headPortion = this.buffer.slice(0, this.bodyTagEndIndex); - const fakeHtml = headPortion + '[FAKE_BODY]'; - + // We can't pass the actual head to vite because it strips some scripts and then the DOM doesn't match the vdom positions + const fakeHtml = '[FAKE_HEAD][FAKE_BODY]'; // Let Vite transform the HTML const transformedHtml = await this.server.transformIndexHtml( this.request.url || '/', fakeHtml ); - // Find the [FAKE_BODY] marker in the transformed result - const fakeBodyIndex = transformedHtml.indexOf('[FAKE_BODY]'); - const bodyEndIndex = transformedHtml.indexOf('', fakeBodyIndex); - if (fakeBodyIndex === -1 || bodyEndIndex === -1) { + // Extract the pre and post head and body content. For now, ignore attributes added to the tags + // If attributes are needed later, put them after the : attribute on qwik's tags + const fakeHeadIndex = transformedHtml.indexOf('[FAKE_HEAD]'); + const fakeHeadCloseIndex = transformedHtml.indexOf('', fakeHeadIndex); + if (fakeHeadIndex === -1 || fakeHeadCloseIndex === -1) { + throw new Error('Transformed HTML does not contain [FAKE_HEAD]...'); + } + const headPreContent = transformedHtml.slice(''.length, fakeHeadIndex); + const headPostContent = transformedHtml.slice( + fakeHeadIndex + '[FAKE_HEAD]'.length, + fakeHeadCloseIndex + ); + const fakeBodyStartIndex = transformedHtml.indexOf('', fakeHeadCloseIndex); + const fakeBodyIndex = transformedHtml.indexOf('[FAKE_BODY]', fakeBodyStartIndex); + const fakeBodyEndIndex = transformedHtml.indexOf('', fakeBodyIndex); + if (fakeBodyIndex === -1 || fakeBodyEndIndex === -1) { throw new Error('Transformed HTML does not contain [FAKE_BODY]...'); } - - // Extract the transformed head and body tags - const transformedHead = transformedHtml.substring(0, fakeBodyIndex); - this.appendToBody = transformedHtml.substring( + const bodyPreContent = transformedHtml.slice( + fakeBodyStartIndex + ''.length, + fakeBodyIndex + ); + this.bodyPostContent = transformedHtml.slice( fakeBodyIndex + '[FAKE_BODY]'.length, - bodyEndIndex + fakeBodyEndIndex ); - this.buffer = transformedHead + this.buffer.slice(this.bodyTagEndIndex); + // Now inject the head pre and post content and the body pre into the buffered content + // Note that the head tag has attributes + const headCloseIndex = this.buffer.indexOf('', this.headInnerIndex); + if (headCloseIndex === -1) { + throw new Error('Buffered HTML does not contain '); + } - if (this.appendToBody.length > 0) { + this.buffer = + this.buffer.slice(0, this.headInnerIndex) + + headPreContent + + this.buffer.slice(this.headInnerIndex, headCloseIndex) + + headPostContent + + this.buffer.slice(headCloseIndex, this.bodyInnerIndex) + + bodyPreContent + + this.buffer.slice(this.bodyInnerIndex); + + if (this.bodyPostContent.length > 0) { this.state = State.STREAMING_BODY; this.handleStreamingBodyState(); return; @@ -184,7 +220,7 @@ class HtmlTransformPatcher { if (bodyEndMatch) { const bodyEndPos = this.buffer.indexOf(bodyEndMatch[0]); this.buffer = - this.buffer.slice(0, bodyEndPos) + this.appendToBody + this.buffer.slice(bodyEndPos); + this.buffer.slice(0, bodyEndPos) + this.bodyPostContent + this.buffer.slice(bodyEndPos); this.transitionToPassthrough(); return; From 03ad87abd91c019219a30d5fd367073a62d33662 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Mon, 15 Sep 2025 18:40:49 +0200 Subject: [PATCH 12/14] chore: pnpm dedupe --- e2e/docs-e2e/package.json | 2 +- pnpm-lock.yaml | 77 ++++++++------------------------------- 2 files changed, 16 insertions(+), 63 deletions(-) diff --git a/e2e/docs-e2e/package.json b/e2e/docs-e2e/package.json index ca69ba534e8..c4195fa1ce2 100644 --- a/e2e/docs-e2e/package.json +++ b/e2e/docs-e2e/package.json @@ -5,7 +5,7 @@ "author": "", "devDependencies": { "@playwright/test": "1.50.1", - "@types/node": "24.2.1" + "@types/node": "24.3.0" }, "keywords": [], "license": "ISC", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a27b671ac7..553b88fbf2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -262,8 +262,8 @@ importers: specifier: 1.50.1 version: 1.50.1 '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 24.3.0 + version: 24.3.0 e2e/qwik-cli-e2e: dependencies: @@ -296,7 +296,7 @@ importers: version: 4.14.3 '@builder.io/qwik': specifier: npm:@qwik.dev/core@* - version: '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' + version: '@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' '@emotion/react': specifier: 11.14.0 version: 11.14.0(@types/react@19.1.12)(react@19.1.1) @@ -305,7 +305,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) '@modular-forms/qwik': specifier: 0.23.1 - version: 0.23.1(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(acorn@8.15.0)(rollup@4.50.0)(typescript@5.9.2) + version: 0.23.1(@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(acorn@8.15.0)(rollup@4.50.0)(typescript@5.9.2) '@mui/material': specifier: 5.16.4 version: 5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -317,7 +317,7 @@ importers: version: 6.20.4(@mui/material@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@5.16.4(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@qwik-ui/headless': specifier: 0.6.7 - version: 0.6.7(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) + version: 0.6.7(@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) '@qwik.dev/core': specifier: workspace:* version: link:../qwik @@ -374,7 +374,7 @@ importers: version: 0.0.42 '@unpic/qwik': specifier: 0.0.38 - version: 0.0.38(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) + version: 0.0.38(@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) algoliasearch: specifier: 4.16.0 version: 4.16.0 @@ -1043,9 +1043,6 @@ packages: '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} @@ -2835,20 +2832,6 @@ packages: peerDependencies: '@builder.io/qwik': '>=1.3.1' - '@qwik.dev/core@2.0.0-beta.8': - resolution: {integrity: sha512-vKOCFsz+jTCbAir9cagVAwJNXXcIV0a6H6/QfmIBGASq0Etvn4n7Y4zX3gqm6m5vDxP563s3oAKHx7wen6sxBQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - hasBin: true - peerDependencies: - prettier: 3.6.2 - vite: '>=5 <8' - vitest: '>=2 <4' - peerDependenciesMeta: - prettier: - optional: true - vitest: - optional: true - '@qwik.dev/core@2.0.0-beta.9': resolution: {integrity: sha512-MemsRTsLbqF17c/rfTWAojZTCpdKg6tWXs/xjpgeMcCzcmDwoqm3KrQ3GqgrBNu+7gMBPSWK0cb7hrd7q9uTQg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3312,9 +3295,6 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.2.1': - resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} - '@types/node@24.3.0': resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} @@ -7932,7 +7912,7 @@ packages: puppeteer@22.13.1: resolution: {integrity: sha512-PwXLDQK5u83Fm5A7TGMq+9BR7iHDJ8a3h21PSsh/E6VfhxiKYkU7+tvGZNSCap6k3pCNDd9oNteVBEctcBalmQ==} engines: {node: '>=18'} - deprecated: < 24.9.0 is no longer supported + deprecated: < 24.10.2 is no longer supported hasBin: true pure-rand@6.1.0: @@ -8820,10 +8800,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -10062,11 +10038,6 @@ snapshots: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 - '@emnapi/runtime@1.4.3': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 @@ -10726,7 +10697,7 @@ snapshots: '@img/sharp-wasm32@0.34.2': dependencies: - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.5.0 optional: true '@img/sharp-win32-arm64@0.34.2': @@ -11010,9 +10981,9 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@modular-forms/qwik@0.23.1(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(acorn@8.15.0)(rollup@4.50.0)(typescript@5.9.2)': + '@modular-forms/qwik@0.23.1(@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(acorn@8.15.0)(rollup@4.50.0)(typescript@5.9.2)': dependencies: - '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' + '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' '@builder.io/qwik-city': '@qwik.dev/router@2.0.0-beta.9(acorn@8.15.0)(rollup@4.50.0)(typescript@5.9.2)' transitivePeerDependencies: - acorn @@ -11769,24 +11740,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@qwik-ui/headless@0.6.7(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': + '@qwik-ui/headless@0.6.7(@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': dependencies: - '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' + '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' '@floating-ui/core': 1.6.2 '@floating-ui/dom': 1.6.5 '@oddbird/popover-polyfill': 0.4.3 body-scroll-lock-upgrade: 1.1.0 focus-trap: 7.5.4 - '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': - dependencies: - csstype: 3.1.3 - rollup: 4.50.0 - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - optionalDependencies: - prettier: 3.6.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - '@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: csstype: 3.1.3 @@ -12255,10 +12217,6 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@24.2.1': - dependencies: - undici-types: 7.10.0 - '@types/node@24.3.0': dependencies: undici-types: 7.10.0 @@ -12559,9 +12517,9 @@ snapshots: dependencies: unpic: 3.18.0 - '@unpic/qwik@0.0.38(@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': + '@unpic/qwik@0.0.38(@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': dependencies: - '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.8(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' + '@builder.io/qwik': '@qwik.dev/core@2.0.0-beta.9(prettier@3.6.2)(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))' '@vercel/nft@0.27.7(rollup@4.50.0)(supports-color@9.4.0)': dependencies: @@ -18790,11 +18748,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.14: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -19353,7 +19306,7 @@ snapshots: std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) From 60ffa2ee21090ffc3d4d2bb6eaaf6d7e33089286 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Mon, 15 Sep 2025 18:56:23 +0200 Subject: [PATCH 13/14] chore: changeset --- .changeset/great-news-lie.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .changeset/great-news-lie.md diff --git a/.changeset/great-news-lie.md b/.changeset/great-news-lie.md new file mode 100644 index 00000000000..e314a95a337 --- /dev/null +++ b/.changeset/great-news-lie.md @@ -0,0 +1,10 @@ +--- +'@qwik.dev/router': minor +'@qwik.dev/core': minor +--- + +Feat: split Qwik Core and Router dev experience. Core now only adjusts the html using the Vite hook for it, so it can work in any environment or client-only. You can make a Qwik application client-only by running `qwik add csr` now. +Feat: Qwik Route now runs dev mode using the node middleware, which is the same as production, and can now hot-reload when routes are added. It does this by transforming the response while it streams to add the dev scripts. This opens the door for Vite Environment support. +Feat: `qwikVite()` SSR builds now reads the manifest from the client build whenever possible. You can still pass in the manifest yourself if needed. +Fix: Qwik Router's Vite plugin no longer imports Qwik Core, a cause of duplicate imports in dev and preview mode. +Fix: Sometimes, SSG hangs after completion. The cause is still unknown, but now there is a workaround by forcing the process to exit after SSG is done. From 0a1c70e2678b78f310e6799e7a7075eb87e6ba91 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Mon, 15 Sep 2025 23:02:09 +0200 Subject: [PATCH 14/14] chore: move devSsrServer option to qwikRouter() --- .../qwik-router/src/buildtime/vite/plugin.ts | 16 ++++++++++++---- .../buildtime/vite/qwik-router.buildtime.api.md | 1 + packages/qwik-router/src/buildtime/vite/types.ts | 11 +++++++++++ packages/qwik/src/optimizer/src/plugins/vite.ts | 13 ++++--------- .../qwik/src/optimizer/src/qwik.optimizer.api.md | 2 ++ 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/packages/qwik-router/src/buildtime/vite/plugin.ts b/packages/qwik-router/src/buildtime/vite/plugin.ts index d8d47071aa0..19d2babf251 100644 --- a/packages/qwik-router/src/buildtime/vite/plugin.ts +++ b/packages/qwik-router/src/buildtime/vite/plugin.ts @@ -51,6 +51,8 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { let viteCommand: string; let devServer: ViteDevServer | null = null; + let devSsrServer = userOpts?.devSsrServer; + const api: QwikRouterPluginApi = { getBasePathname: () => ctx?.opts.basePathname ?? '/', getRoutes: () => { @@ -136,6 +138,10 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { if (!qwikPlugin) { throw new Error('Missing vite-plugin-qwik'); } + if (typeof devSsrServer !== 'boolean') { + // read the old option from qwik plugin + devSsrServer = qwikPlugin.api._oldDevSsrServer(); + } qwikPlugin.api.registerBundleGraphAdder?.((manifest) => { return getRouteImports(ctx!.routes, manifest); }); @@ -172,10 +178,12 @@ function qwikRouterPlugin(userOpts?: QwikRouterVitePluginOptions): any { } }); - // this callback runs after all other middlewares have been added, so we can SSR as the last middleware - return () => { - server.middlewares.use(makeRouterDevMiddleware(server, ctx!)); - }; + if (userOpts?.devSsrServer !== false) { + // this callback runs after all other middlewares have been added, so we can SSR as the last middleware + return () => { + server.middlewares.use(makeRouterDevMiddleware(server, ctx!)); + }; + } }, transformIndexHtml() { diff --git a/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md b/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md index e4b0a4908d5..6cf8107b84c 100644 --- a/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md +++ b/packages/qwik-router/src/buildtime/vite/qwik-router.buildtime.api.md @@ -44,6 +44,7 @@ export interface QwikRouterPlugin extends P { // // @public (undocumented) export interface QwikRouterVitePluginOptions extends Omit { + devSsrServer?: boolean; // Warning: (ae-forgotten-export) The symbol "ImageOptimizationOptions" needs to be exported by the entry point index.d.ts // // (undocumented) diff --git a/packages/qwik-router/src/buildtime/vite/types.ts b/packages/qwik-router/src/buildtime/vite/types.ts index 39054e3f50f..53fd701a047 100644 --- a/packages/qwik-router/src/buildtime/vite/types.ts +++ b/packages/qwik-router/src/buildtime/vite/types.ts @@ -34,6 +34,17 @@ export interface QwikRouterVitePluginOptions extends Omit clientPublicOutDir, getAssetsDir: () => viteAssetsDir, registerBundleGraphAdder: (adder: BundleGraphAdder) => bundleGraphAdders.add(adder), + _oldDevSsrServer: () => qwikViteOpts.devSsrServer, }; // We provide two plugins to Vite. The first plugin is the main plugin that handles all the @@ -825,15 +826,7 @@ interface QwikVitePluginSSROptions extends QwikVitePluginCommonOptions { manifestOutput?: (manifest: QwikManifest) => Promise | void; }; - /** - * Qwik is SSR first framework. This means that Qwik requires either SSR or SSG. In dev mode the - * dev SSR server is responsible for rendering and pausing the application on the server. - * - * Under normal circumstances this should be on, unless you have your own SSR server which you - * would like to use instead and wish to disable this one. - * - * Default: true - */ + /** @deprecated Use the `devSsrServer` option of the qwikRouter() plugin instead. */ devSsrServer?: boolean; /** Controls the SSR behavior. */ @@ -882,6 +875,8 @@ export interface QwikVitePluginApi { getClientPublicOutDir: () => string | null; getAssetsDir: () => string | undefined; registerBundleGraphAdder: (adder: BundleGraphAdder) => void; + /** @internal */ + _oldDevSsrServer: () => boolean | undefined; } /** diff --git a/packages/qwik/src/optimizer/src/qwik.optimizer.api.md b/packages/qwik/src/optimizer/src/qwik.optimizer.api.md index 97ad85110af..ebd3fb4469b 100644 --- a/packages/qwik/src/optimizer/src/qwik.optimizer.api.md +++ b/packages/qwik/src/optimizer/src/qwik.optimizer.api.md @@ -293,6 +293,8 @@ export interface QwikVitePluginApi { getOptions: () => NormalizedQwikPluginOptions; // (undocumented) getRootDir: () => string | null; + // @internal (undocumented) + _oldDevSsrServer: () => boolean | undefined; // (undocumented) registerBundleGraphAdder: (adder: BundleGraphAdder) => void; }