diff --git a/.changeset/poor-mangos-fold.md b/.changeset/poor-mangos-fold.md new file mode 100644 index 0000000000..dc45981206 --- /dev/null +++ b/.changeset/poor-mangos-fold.md @@ -0,0 +1,36 @@ +--- +'astro': minor +--- + +Adds experimental session support + +Sessions are used to store user state between requests for server-rendered pages, such as login status, shopping cart contents, or other user-specific data. + +```astro +--- +export const prerender = false; // Not needed in 'server' mode +const cart = await Astro.session.get('cart'); +--- + +🛒 {cart?.length ?? 0} items +``` + +Sessions are available in on-demand rendered/SSR pages, API endpoints, actions and middleware. To enable session support, you must configure a storage driver. + +If you are using the Node.js adapter, you can use the `fs` driver to store session data on the filesystem: + +```js +// astro.config.mjs +{ + adapter: node({ mode: 'standalone' }), + experimental: { + session: { + // Required: the name of the Unstorage driver + driver: "fs", + }, + }, +} +``` +If you are deploying to a serverless environment, you can use drivers such as `redis` or `netlifyBlobs` or `cloudflareKV` and optionally pass additional configuration options. + +For more information, including using the session API with other adapters and a full list of supported drivers, see [the docs for experimental session support](https://docs.astro.build/en/reference/experimental-flags/sessions/). For even more details, and to leave feedback and participate in the development of this feature, [the Sessions RFC](https://github.com/withastro/roadmap/pull/1055). diff --git a/packages/astro/package.json b/packages/astro/package.json index 024ba145c6..fc2ef0dc77 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -166,6 +166,7 @@ "tsconfck": "^3.1.4", "ultrahtml": "^1.5.3", "unist-util-visit": "^5.0.0", + "unstorage": "^1.12.0", "vfile": "^6.0.3", "vite": "^6.0.1", "vitefu": "^1.0.4", diff --git a/packages/astro/src/config/index.ts b/packages/astro/src/config/index.ts index 5e9fcddfa3..7e7b548f1f 100644 --- a/packages/astro/src/config/index.ts +++ b/packages/astro/src/config/index.ts @@ -1,15 +1,21 @@ import type { UserConfig as ViteUserConfig, UserConfigFn as ViteUserConfigFn } from 'vite'; import { createRouteManifest } from '../core/routing/index.js'; -import type { AstroInlineConfig, AstroUserConfig, Locales } from '../types/public/config.js'; +import type { + AstroInlineConfig, + AstroUserConfig, + Locales, + SessionDriverName, +} from '../types/public/config.js'; import { createDevelopmentManifest } from '../vite-plugin-astro-server/plugin.js'; /** * See the full Astro Configuration API Documentation * https://astro.build/config */ -export function defineConfig( - config: AstroUserConfig, -) { +export function defineConfig< + const TLocales extends Locales = never, + const TDriver extends SessionDriverName = never, +>(config: AstroUserConfig) { return config; } diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts index a3d08bb642..7d33ef1d0f 100644 --- a/packages/astro/src/core/app/index.ts +++ b/packages/astro/src/core/app/index.ts @@ -23,6 +23,7 @@ import { createAssetLink } from '../render/ssr-element.js'; import { ensure404Route } from '../routing/astro-designed-error-pages.js'; import { createDefaultRoutes } from '../routing/default.js'; import { matchRoute } from '../routing/match.js'; +import { type AstroSession, PERSIST_SYMBOL } from '../session.js'; import { AppPipeline } from './pipeline.js'; export { deserializeManifest } from './common.js'; @@ -277,6 +278,7 @@ export class App { const defaultStatus = this.#getDefaultStatusCode(routeData, pathname); let response; + let session: AstroSession | undefined; try { // Load route module. We also catch its error here if it fails on initialization const mod = await this.#pipeline.getModuleForRoute(routeData); @@ -290,10 +292,13 @@ export class App { status: defaultStatus, clientAddress, }); + session = renderContext.session; response = await renderContext.render(await mod.page()); } catch (err: any) { this.#logger.error(null, err.stack || err.message || String(err)); return this.#renderError(request, { locals, status: 500, error: err, clientAddress }); + } finally { + session?.[PERSIST_SYMBOL](); } if ( @@ -379,6 +384,7 @@ export class App { } } const mod = await this.#pipeline.getModuleForRoute(errorRouteData); + let session: AstroSession | undefined; try { const renderContext = await RenderContext.create({ locals, @@ -391,6 +397,7 @@ export class App { props: { error }, clientAddress, }); + session = renderContext.session; const response = await renderContext.render(await mod.page()); return this.#mergeResponses(response, originalResponse); } catch { @@ -404,6 +411,8 @@ export class App { clientAddress, }); } + } finally { + session?.[PERSIST_SYMBOL](); } } diff --git a/packages/astro/src/core/app/types.ts b/packages/astro/src/core/app/types.ts index 2417902500..d8f069c4e4 100644 --- a/packages/astro/src/core/app/types.ts +++ b/packages/astro/src/core/app/types.ts @@ -1,7 +1,7 @@ import type { RoutingStrategies } from '../../i18n/utils.js'; import type { ComponentInstance, SerializedRouteData } from '../../types/astro.js'; import type { AstroMiddlewareInstance } from '../../types/public/common.js'; -import type { Locales } from '../../types/public/config.js'; +import type { Locales, ResolvedSessionConfig, SessionConfig } from '../../types/public/config.js'; import type { RouteData, SSRComponentMetadata, @@ -69,6 +69,7 @@ export type SSRManifest = { i18n: SSRManifestI18n | undefined; middleware?: () => Promise | AstroMiddlewareInstance; checkOrigin: boolean; + sessionConfig?: ResolvedSessionConfig }; export type SSRManifestI18n = { diff --git a/packages/astro/src/core/build/plugins/plugin-manifest.ts b/packages/astro/src/core/build/plugins/plugin-manifest.ts index e220292ebf..54a64bc9e3 100644 --- a/packages/astro/src/core/build/plugins/plugin-manifest.ts +++ b/packages/astro/src/core/build/plugins/plugin-manifest.ts @@ -22,6 +22,7 @@ import { type BuildInternals, cssOrder, mergeInlineCss } from '../internal.js'; import type { AstroBuildPlugin } from '../plugin.js'; import type { StaticBuildOptions } from '../types.js'; import { makePageDataKey } from './util.js'; +import { resolveSessionDriver } from '../../session.js'; const manifestReplace = '@@ASTRO_MANIFEST_REPLACE@@'; const replaceExp = new RegExp(`['"]${manifestReplace}['"]`, 'g'); @@ -29,7 +30,7 @@ const replaceExp = new RegExp(`['"]${manifestReplace}['"]`, 'g'); export const SSR_MANIFEST_VIRTUAL_MODULE_ID = '@astrojs-manifest'; export const RESOLVED_SSR_MANIFEST_VIRTUAL_MODULE_ID = '\0' + SSR_MANIFEST_VIRTUAL_MODULE_ID; -function vitePluginManifest(_options: StaticBuildOptions, internals: BuildInternals): VitePlugin { +function vitePluginManifest(options: StaticBuildOptions, internals: BuildInternals): VitePlugin { return { name: '@astro/plugin-build-manifest', enforce: 'post', @@ -52,11 +53,16 @@ function vitePluginManifest(_options: StaticBuildOptions, internals: BuildIntern `import { deserializeManifest as _deserializeManifest } from 'astro/app'`, `import { _privateSetManifestDontUseThis } from 'astro:ssr-manifest'`, ]; + + const resolvedDriver = await resolveSessionDriver(options.settings.config.experimental?.session?.driver); + const contents = [ `const manifest = _deserializeManifest('${manifestReplace}');`, + `if (manifest.sessionConfig) manifest.sessionConfig.driverModule = ${resolvedDriver ? `() => import(${JSON.stringify(resolvedDriver)})` : 'null'};`, `_privateSetManifestDontUseThis(manifest);`, ]; const exports = [`export { manifest }`]; + return [...imports, ...contents, ...exports].join('\n'); } }, @@ -290,5 +296,6 @@ function buildManifest( (settings.config.security?.checkOrigin && settings.buildOutput === 'server') ?? false, serverIslandNameMap: Array.from(settings.serverIslandNameMap), key: encodedKey, + sessionConfig: settings.config.experimental.session, }; } diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index 467cf137bc..8d3c36568b 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -536,6 +536,32 @@ export const AstroConfigSchema = z.object({ .boolean() .optional() .default(ASTRO_CONFIG_DEFAULTS.experimental.responsiveImages), + session: z + .object({ + driver: z.string(), + options: z.record(z.any()).optional(), + cookie: z + .union([ + z.object({ + name: z.string().optional(), + domain: z.string().optional(), + path: z.string().optional(), + maxAge: z.number().optional(), + sameSite: z.union([z.enum(['strict', 'lax', 'none']), z.boolean()]).optional(), + secure: z.boolean().optional(), + }), + z.string(), + ]) + .transform((val) => { + if (typeof val === 'string') { + return { name: val }; + } + return val; + }) + .optional(), + ttl: z.number().optional(), + }) + .optional(), svg: z .union([ z.boolean(), diff --git a/packages/astro/src/core/errors/errors-data.ts b/packages/astro/src/core/errors/errors-data.ts index 398c956ea8..646766ae06 100644 --- a/packages/astro/src/core/errors/errors-data.ts +++ b/packages/astro/src/core/errors/errors-data.ts @@ -868,6 +868,36 @@ export const AstroResponseHeadersReassigned = { hint: 'Consider using `Astro.response.headers.add()`, and `Astro.response.headers.delete()`.', } satisfies ErrorData; +/** + * @docs + * @see + * - [experimental.session](https://5-0-0-beta.docs.astro.build/en/reference/configuration-reference/#experimentalsession) + * @description + * Thrown when the session storage could not be initialized. + */ +export const SessionStorageInitError = { + name: 'SessionStorageInitError', + title: 'Session storage could not be initialized.', + message: (error: string, driver?: string) => + `Error when initializing session storage${driver ? ` with driver ${driver}` : ''}. ${error ?? ''}`, + hint: 'For more information, see https://5-0-0-beta.docs.astro.build/en/reference/configuration-reference/#experimentalsession', +} satisfies ErrorData; + +/** + * @docs + * @see + * - [experimental.session](https://5-0-0-beta.docs.astro.build/en/reference/configuration-reference/#experimentalsession) + * @description + * Thrown when the session data could not be saved. + */ +export const SessionStorageSaveError = { + name: 'SessionStorageSaveError', + title: 'Session data could not be saved.', + message: (error: string, driver?: string) => + `Error when saving session data${driver ? ` with driver ${driver}` : ''}. ${error ?? ''}`, + hint: 'For more information, see https://5-0-0-beta.docs.astro.build/en/reference/configuration-reference/#experimentalsession', +} satisfies ErrorData; + /** * @docs * @description diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts index 86e39ee9a3..e001461593 100644 --- a/packages/astro/src/core/render-context.ts +++ b/packages/astro/src/core/render-context.ts @@ -32,6 +32,7 @@ import { type Pipeline, Slots, getParams, getProps } from './render/index.js'; import { isRoute404or500 } from './routing/match.js'; import { copyRequest, getOriginPathname, setOriginPathname } from './routing/rewrite.js'; import { SERVER_ISLAND_COMPONENT } from './server-islands/endpoint.js'; +import { AstroSession } from './session.js'; export const apiContextRoutesSymbol = Symbol.for('context.routes'); @@ -54,6 +55,9 @@ export class RenderContext { protected url = new URL(request.url), public props: Props = {}, public partial: undefined | boolean = undefined, + public session: AstroSession | undefined = pipeline.manifest.sessionConfig + ? new AstroSession(cookies, pipeline.manifest.sessionConfig) + : undefined, ) {} /** @@ -300,7 +304,7 @@ export class RenderContext { createActionAPIContext(): ActionAPIContext { const renderContext = this; - const { cookies, params, pipeline, url } = this; + const { cookies, params, pipeline, url, session } = this; const generator = `Astro v${ASTRO_VERSION}`; const rewrite = async (reroutePayload: RewritePayload) => { @@ -338,6 +342,7 @@ export class RenderContext { get originPathname() { return getOriginPathname(renderContext.request); }, + session, }; } @@ -470,7 +475,7 @@ export class RenderContext { astroStaticPartial: AstroGlobalPartial, ): Omit { const renderContext = this; - const { cookies, locals, params, pipeline, url } = this; + const { cookies, locals, params, pipeline, url, session } = this; const { response } = result; const redirect = (path: string, status = 302) => { // If the response is already sent, error as we cannot proceed with the redirect. @@ -492,6 +497,7 @@ export class RenderContext { routePattern: this.routeData.route, isPrerendered: this.routeData.prerender, cookies, + session, get clientAddress() { return renderContext.getClientAddress(); }, diff --git a/packages/astro/src/core/session.ts b/packages/astro/src/core/session.ts new file mode 100644 index 0000000000..8401e8a84a --- /dev/null +++ b/packages/astro/src/core/session.ts @@ -0,0 +1,459 @@ +import { stringify, unflatten } from 'devalue'; +import { + type BuiltinDriverOptions, + type Driver, + type Storage, + builtinDrivers, + createStorage, +} from 'unstorage'; +import type { + ResolvedSessionConfig, + SessionConfig, + SessionDriverName, +} from '../types/public/config.js'; +import type { AstroCookies } from './cookies/cookies.js'; +import type { AstroCookieSetOptions } from './cookies/cookies.js'; +import { SessionStorageInitError, SessionStorageSaveError } from './errors/errors-data.js'; +import { AstroError } from './errors/index.js'; + +export const PERSIST_SYMBOL = Symbol(); + +const DEFAULT_COOKIE_NAME = 'astro-session'; +const VALID_COOKIE_REGEX = /^[\w-]+$/; + +interface SessionEntry { + data: any; + expires?: number; +} + +export class AstroSession { + // The cookies object. + #cookies: AstroCookies; + // The session configuration. + #config: Omit, 'cookie'>; + // The cookie config + #cookieConfig?: AstroCookieSetOptions; + // The cookie name + #cookieName: string; + // The unstorage object for the session driver. + #storage: Storage | undefined; + #data: Map | undefined; + // The session ID. A v4 UUID. + #sessionID: string | undefined; + // Sessions to destroy. Needed because we won't have the old session ID after it's destroyed locally. + #toDestroy = new Set(); + // Session keys to delete. Used for partial data sets to avoid overwriting the deleted value. + #toDelete = new Set(); + // Whether the session is dirty and needs to be saved. + #dirty = false; + // Whether the session cookie has been set. + #cookieSet = false; + // The local data is "partial" if it has not been loaded from storage yet and only + // contains values that have been set or deleted in-memory locally. + // We do this to avoid the need to block on loading data when it is only being set. + // When we load the data from storage, we need to merge it with the local partial data, + // preserving in-memory changes and deletions. + #partial = true; + + constructor( + cookies: AstroCookies, + { + cookie: cookieConfig = DEFAULT_COOKIE_NAME, + ...config + }: Exclude, undefined>, + ) { + this.#cookies = cookies; + if (typeof cookieConfig === 'object') { + this.#cookieConfig = cookieConfig; + this.#cookieName = cookieConfig.name || DEFAULT_COOKIE_NAME; + } else { + this.#cookieName = cookieConfig || DEFAULT_COOKIE_NAME; + } + this.#config = config; + } + + /** + * Gets a session value. Returns `undefined` if the session or value does not exist. + */ + async get(key: string): Promise { + return (await this.#ensureData()).get(key)?.data; + } + + /** + * Checks if a session value exists. + */ + async has(key: string): Promise { + return (await this.#ensureData()).has(key); + } + + /** + * Gets all session values. + */ + async keys() { + return (await this.#ensureData()).keys(); + } + + /** + * Gets all session values. + */ + async values() { + return [...(await this.#ensureData()).values()].map((entry) => entry.data); + } + + /** + * Gets all session entries. + */ + async entries() { + return [...(await this.#ensureData()).entries()].map(([key, entry]) => [key, entry.data]); + } + + /** + * Deletes a session value. + */ + delete(key: string) { + this.#data?.delete(key); + if (this.#partial) { + this.#toDelete.add(key); + } + this.#dirty = true; + } + + /** + * Sets a session value. The session is created if it does not exist. + */ + + set(key: string, value: T, { ttl }: { ttl?: number } = {}) { + if (!key) { + throw new AstroError({ + ...SessionStorageSaveError, + message: 'The session key was not provided.', + }); + } + try { + // Attempt to serialize the value so we can throw an error early if needed + stringify(value); + } catch (err) { + throw new AstroError( + { + ...SessionStorageSaveError, + message: `The session data for ${key} could not be serialized.`, + hint: 'See the devalue library for all supported types: https://github.com/rich-harris/devalue', + }, + { cause: err }, + ); + } + if (!this.#cookieSet) { + this.#setCookie(); + this.#cookieSet = true; + } + this.#data ??= new Map(); + const lifetime = ttl ?? this.#config.ttl; + // If ttl is numeric, it is the number of seconds until expiry. To get an expiry timestamp, we convert to milliseconds and add to the current time. + const expires = typeof lifetime === 'number' ? Date.now() + lifetime * 1000 : lifetime; + this.#data.set(key, { + data: value, + expires, + }); + this.#dirty = true; + } + + /** + * Destroys the session, clearing the cookie and storage if it exists. + */ + + destroy() { + this.#destroySafe(); + } + + /** + * Regenerates the session, creating a new session ID. The existing session data is preserved. + */ + + async regenerate() { + let data = new Map(); + try { + data = await this.#ensureData(); + } catch (err) { + // Log the error but continue with empty data + console.error('Failed to load session data during regeneration:', err); + } + + // Store the old session ID for cleanup + const oldSessionId = this.#sessionID; + + // Create new session + this.#sessionID = undefined; + this.#data = data; + this.#ensureSessionID(); + await this.#setCookie(); + + // Clean up old session asynchronously + if (oldSessionId && this.#storage) { + this.#storage.removeItem(oldSessionId).catch((err) => { + console.error('Failed to remove old session data:', err); + }); + } + } + + // Persists the session data to storage. + // This is called automatically at the end of the request. + // Uses a symbol to prevent users from calling it directly. + async [PERSIST_SYMBOL]() { + // Handle session data persistence + + if (!this.#dirty && !this.#toDestroy.size) { + return; + } + + const storage = await this.#ensureStorage(); + + if (this.#dirty && this.#data) { + const data = await this.#ensureData(); + this.#toDelete.forEach((key) => data.delete(key)); + const key = this.#ensureSessionID(); + let serialized; + try { + serialized = stringify(data, { + // Support URL objects + URL: (val) => val instanceof URL && val.href, + }); + } catch (err) { + throw new AstroError( + { + ...SessionStorageSaveError, + message: SessionStorageSaveError.message( + 'The session data could not be serialized.', + this.#config.driver, + ), + }, + { cause: err }, + ); + } + await storage.setItem(key, serialized); + this.#dirty = false; + } + + // Handle destroyed session cleanup + if (this.#toDestroy.size > 0) { + const cleanupPromises = [...this.#toDestroy].map((sessionId) => + storage.removeItem(sessionId).catch((err) => { + console.error(`Failed to clean up session ${sessionId}:`, err); + }), + ); + await Promise.all(cleanupPromises); + this.#toDestroy.clear(); + } + } + + get sessionID() { + return this.#sessionID; + } + + /** + * Sets the session cookie. + */ + async #setCookie() { + if (!VALID_COOKIE_REGEX.test(this.#cookieName)) { + throw new AstroError({ + ...SessionStorageSaveError, + message: 'Invalid cookie name. Cookie names can only contain letters, numbers, and dashes.', + }); + } + const cookieOptions: AstroCookieSetOptions = { + sameSite: 'lax', + secure: true, + path: '/', + ...this.#cookieConfig, + httpOnly: true, + }; + const value = this.#ensureSessionID(); + this.#cookies.set(this.#cookieName, value, cookieOptions); + } + + /** + * Attempts to load the session data from storage, or creates a new data object if none exists. + * If there is existing partial data, it will be merged into the new data object. + */ + + async #ensureData() { + const storage = await this.#ensureStorage(); + if (this.#data && !this.#partial) { + return this.#data; + } + this.#data ??= new Map(); + + // We stored this as a devalue string, but unstorage will have parsed it as JSON + const raw = await storage.get(this.#ensureSessionID()); + if (!raw) { + // If there is no existing data in storage we don't need to merge anything + // and can just return the existing local data. + return this.#data; + } + + try { + const storedMap = unflatten(raw, { + // Revive URL objects + URL: (href) => new URL(href), + }); + if (!(storedMap instanceof Map)) { + await this.#destroySafe(); + throw new AstroError({ + ...SessionStorageInitError, + message: SessionStorageInitError.message( + 'The session data was an invalid type.', + this.#config.driver, + ), + }); + } + + const now = Date.now(); + + // Only copy values from storage that: + // 1. Don't exist in memory (preserving in-memory changes) + // 2. Haven't been marked for deletion + // 3. Haven't expired + for (const [key, value] of storedMap) { + const expired = typeof value.expires === 'number' && value.expires < now; + if (!this.#data.has(key) && !this.#toDelete.has(key) && !expired) { + this.#data.set(key, value); + } + } + + this.#partial = false; + return this.#data; + } catch (err) { + await this.#destroySafe(); + if (err instanceof AstroError) { + throw err; + } + throw new AstroError( + { + ...SessionStorageInitError, + message: SessionStorageInitError.message( + 'The session data could not be parsed.', + this.#config.driver, + ), + }, + { cause: err }, + ); + } + } + /** + * Safely destroys the session, clearing the cookie and storage if it exists. + */ + #destroySafe() { + if (this.#sessionID) { + this.#toDestroy.add(this.#sessionID); + } + if (this.#cookieName) { + this.#cookies.delete(this.#cookieName); + } + this.#sessionID = undefined; + this.#data = undefined; + this.#dirty = true; + } + + /** + * Returns the session ID, generating a new one if it does not exist. + */ + #ensureSessionID() { + this.#sessionID ??= this.#cookies.get(this.#cookieName)?.value ?? crypto.randomUUID(); + return this.#sessionID; + } + + /** + * Ensures the storage is initialized. + * This is called automatically when a storage operation is needed. + */ + async #ensureStorage(): Promise { + if (this.#storage) { + return this.#storage; + } + + if (this.#config.driver === 'test') { + this.#storage = (this.#config as SessionConfig<'test'>).options.mockStorage; + return this.#storage; + } + // Use fsLite rather than fs, because fs can't be bundled. Add a default base path if not provided. + if (this.#config.driver === 'fs' || this.#config.driver === 'fsLite') { + this.#config.options ??= {}; + this.#config.driver = 'fsLite'; + (this.#config.options as BuiltinDriverOptions['fsLite']).base ??= '.astro/session'; + } + + if (!this.#config?.driver) { + throw new AstroError({ + ...SessionStorageInitError, + message: SessionStorageInitError.message( + 'No driver was defined in the session configuration and the adapter did not provide a default driver.', + ), + }); + } + + let driver: ((config: SessionConfig['options']) => Driver) | null = null; + + const driverPackage = await resolveSessionDriver(this.#config.driver); + try { + if (this.#config.driverModule) { + driver = (await this.#config.driverModule()).default; + } else if (driverPackage) { + driver = (await import(driverPackage)).default; + } + } catch (err: any) { + // If the driver failed to load, throw an error. + if (err.code === 'ERR_MODULE_NOT_FOUND') { + throw new AstroError( + { + ...SessionStorageInitError, + message: SessionStorageInitError.message( + err.message.includes(`Cannot find package '${driverPackage}'`) + ? 'The driver module could not be found.' + : err.message, + this.#config.driver, + ), + }, + { cause: err }, + ); + } + throw err; + } + + if (!driver) { + throw new AstroError({ + ...SessionStorageInitError, + message: SessionStorageInitError.message( + 'The module did not export a driver.', + this.#config.driver, + ), + }); + } + + try { + this.#storage = createStorage({ + driver: driver(this.#config.options), + }); + return this.#storage; + } catch (err) { + throw new AstroError( + { + ...SessionStorageInitError, + message: SessionStorageInitError.message('Unknown error', this.#config.driver), + }, + { cause: err }, + ); + } + } +} +// TODO: make this sync when we drop support for Node < 18.19.0 +export function resolveSessionDriver(driver: string | undefined): Promise | string | null { + if (!driver) { + return null; + } + if (driver === 'fs') { + return import.meta.resolve(builtinDrivers.fsLite); + } + if (driver in builtinDrivers) { + return import.meta.resolve(builtinDrivers[driver as keyof typeof builtinDrivers]); + } + return driver; +} diff --git a/packages/astro/src/types/public/config.ts b/packages/astro/src/types/public/config.ts index 7e64aeceb8..73bdb3002a 100644 --- a/packages/astro/src/types/public/config.ts +++ b/packages/astro/src/types/public/config.ts @@ -5,6 +5,7 @@ import type { RemarkRehype, ShikiConfig, } from '@astrojs/markdown-remark'; +import type { BuiltinDriverName, BuiltinDriverOptions, Driver, Storage } from 'unstorage'; import type { UserConfig as OriginalViteUserConfig, SSROptions as ViteSSROptions } from 'vite'; import type { ImageFit, ImageLayout } from '../../assets/types.js'; import type { RemotePattern } from '../../assets/utils/remotePattern.js'; @@ -12,10 +13,10 @@ import type { SvgRenderMode } from '../../assets/utils/svg.js'; import type { AssetsPrefix } from '../../core/app/types.js'; import type { AstroConfigType } from '../../core/config/schema.js'; import type { REDIRECT_STATUS_CODES } from '../../core/constants.js'; +import type { AstroCookieSetOptions } from '../../core/cookies/cookies.js'; import type { Logger, LoggerLevel } from '../../core/logger/core.js'; import type { EnvSchema } from '../../env/schema.js'; import type { AstroIntegration } from './integrations.js'; - export type Locales = (string | { codes: string[]; path: string })[]; type NormalizeLocales = { @@ -96,6 +97,53 @@ export type ServerConfig = { open?: string | boolean; }; +export type SessionDriverName = BuiltinDriverName | 'custom' | 'test'; + +interface CommonSessionConfig { + /** + * Configures the session cookie. If set to a string, it will be used as the cookie name. + * Alternatively, you can pass an object with additional options. + */ + cookie?: + | string + | (Omit & { name?: string }); + + /** + * Default session duration in seconds. If not set, the session will be stored until deleted, or until the cookie expires. + */ + ttl?: number; +} + +interface BuiltinSessionConfig + extends CommonSessionConfig { + driver: TDriver; + options?: BuiltinDriverOptions[TDriver]; +} + +interface CustomSessionConfig extends CommonSessionConfig { + /** Entrypoint for a custom session driver */ + driver: string; + options?: Record; +} + +interface TestSessionConfig extends CommonSessionConfig { + driver: 'test'; + options: { + mockStorage: Storage; + }; +} + +export type SessionConfig = + TDriver extends keyof BuiltinDriverOptions + ? BuiltinSessionConfig + : TDriver extends 'test' + ? TestSessionConfig + : CustomSessionConfig; + +export type ResolvedSessionConfig = SessionConfig & { + driverModule?: () => Promise<{ default: () => Driver }>; +}; + export interface ViteUserConfig extends OriginalViteUserConfig { ssr?: ViteSSROptions; } @@ -113,7 +161,10 @@ export interface ViteUserConfig extends OriginalViteUserConfig { * Docs: https://docs.astro.build/reference/configuration-reference/ * * Generics do not follow semver and may change at any time. - */ export interface AstroUserConfig { + */ export interface AstroUserConfig< + TLocales extends Locales = never, + TSession extends SessionDriverName = never, +> { /** * @docs * @kind heading @@ -1906,6 +1957,50 @@ export interface ViteUserConfig extends OriginalViteUserConfig { responsiveImages?: boolean; + /** + * + * @name experimental.session + * @type {SessionConfig} + * @version 5.0.0 + * @description + * + * Enables support for sessions in Astro. Sessions are used to store user data across requests, such as user authentication state. + * + * When enabled you can access the `Astro.session` object to read and write data that persists across requests. You can configure the session driver using the [`session` option](#session), or use the default provided by your adapter. + * + * ```astro title=src/components/CartButton.astro + * --- + * export const prerender = false; // Not needed in 'server' mode + * const cart = await Astro.session.get('cart'); + * --- + * + * 🛒 {cart?.length ?? 0} items + * + * ``` + * The object configures session management for your Astro site by specifying a `driver` as well as any `options` for your data storage. + * + * You can specify [any driver from Unstorage](https://unstorage.unjs.io/drivers) or provide a custom config which will override your adapter's default. + * + * ```js title="astro.config.mjs" + * { + * experimental: { + * session: { + * // Required: the name of the Unstorage driver + * driver: "redis", + * // The required options depend on the driver + * options: { + * url: process.env.REDIS_URL, + * } + * } + * }, + * } + * ``` + * + * For more details, see [the Sessions RFC](https://github.com/withastro/roadmap/blob/sessions/proposals/0054-sessions.md). + * + */ + + session?: SessionConfig; /** * * @name experimental.svg diff --git a/packages/astro/src/types/public/context.ts b/packages/astro/src/types/public/context.ts index 7a6f3b6be0..594376dee5 100644 --- a/packages/astro/src/types/public/context.ts +++ b/packages/astro/src/types/public/context.ts @@ -6,6 +6,7 @@ import type { } from '../../actions/runtime/virtual/server.js'; import type { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from '../../core/constants.js'; import type { AstroCookies } from '../../core/cookies/cookies.js'; +import type { AstroSession } from '../../core/session.js'; import type { AstroComponentFactory } from '../../runtime/server/index.js'; import type { Params, RewritePayload } from './common.js'; import type { ValidRedirectStatus } from './config.js'; @@ -260,6 +261,10 @@ interface AstroSharedContext< * Utility for getting and setting the values of cookies. */ cookies: AstroCookies; + /** + * Utility for handling sessions. + */ + session?: AstroSession; /** * Information about the current request. This is a standard [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) object */ diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index 7e4a7169d5..5e53cd4666 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -192,5 +192,6 @@ export function createDevelopmentManifest(settings: AstroSettings): SSRManifest onRequest: NOOP_MIDDLEWARE_FN, }; }, + sessionConfig: settings.config.experimental.session, }; } diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index eb353e501f..da4f309dad 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -15,6 +15,7 @@ import { getProps } from '../core/render/index.js'; import { createRequest } from '../core/request.js'; import { redirectTemplate } from '../core/routing/3xx.js'; import { matchAllRoutes } from '../core/routing/index.js'; +import { PERSIST_SYMBOL } from '../core/session.js'; import { getSortedPreloadedMatches } from '../prerender/routing.js'; import type { ComponentInstance, ManifestData } from '../types/astro.js'; import type { RouteData } from '../types/public/internal.js'; @@ -223,6 +224,8 @@ export async function handleRoute({ renderContext.props.error = err; response = await renderContext.render(preloaded500Component); statusCode = 500; + } finally { + renderContext.session?.[PERSIST_SYMBOL](); } if (isLoggedRequest(pathname)) { diff --git a/packages/astro/test/fixtures/sessions/astro.config.mjs b/packages/astro/test/fixtures/sessions/astro.config.mjs new file mode 100644 index 0000000000..7eb32d0cfb --- /dev/null +++ b/packages/astro/test/fixtures/sessions/astro.config.mjs @@ -0,0 +1,14 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import testAdapter from '../../test-adapter.js'; + +export default defineConfig({ + adapter: testAdapter(), + output: 'server', + experimental: { + session: { + driver: 'fs', + ttl: 20, + }, + }, +}); diff --git a/packages/astro/test/fixtures/sessions/package.json b/packages/astro/test/fixtures/sessions/package.json new file mode 100644 index 0000000000..453f09a96d --- /dev/null +++ b/packages/astro/test/fixtures/sessions/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/sessions", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/sessions/src/actions/index.ts b/packages/astro/test/fixtures/sessions/src/actions/index.ts new file mode 100644 index 0000000000..33ac1cb653 --- /dev/null +++ b/packages/astro/test/fixtures/sessions/src/actions/index.ts @@ -0,0 +1,27 @@ +import { defineAction } from 'astro:actions'; +import { z } from 'astro:schema'; + +export const server = { + addToCart: defineAction({ + accept: 'form', + input: z.object({ productId: z.string() }), + handler: async (input, context) => { + const cart: Array = (await context.session.get('cart')) || []; + cart.push(input.productId); + await context.session.set('cart', cart); + return { cart, message: 'Product added to cart at ' + new Date().toTimeString() }; + }, + }), + getCart: defineAction({ + handler: async (input, context) => { + return await context.session.get('cart'); + }, + }), + clearCart: defineAction({ + accept: 'json', + handler: async (input, context) => { + await context.session.set('cart', []); + return {cart: [], message: 'Cart cleared at ' + new Date().toTimeString() }; + }, + }), +}; diff --git a/packages/astro/test/fixtures/sessions/src/middleware.ts b/packages/astro/test/fixtures/sessions/src/middleware.ts new file mode 100644 index 0000000000..7f56f11f36 --- /dev/null +++ b/packages/astro/test/fixtures/sessions/src/middleware.ts @@ -0,0 +1,49 @@ +import { defineMiddleware } from 'astro:middleware'; +import { getActionContext } from 'astro:actions'; + +const ACTION_SESSION_KEY = 'actionResult' + +export const onRequest = defineMiddleware(async (context, next) => { + // Skip requests for prerendered pages + if (context.isPrerendered) return next(); + + const { action, setActionResult, serializeActionResult } = + getActionContext(context); + + console.log(action?.name) + + const actionPayload = await context.session.get(ACTION_SESSION_KEY); + + if (actionPayload) { + setActionResult(actionPayload.actionName, actionPayload.actionResult); + context.session.delete(ACTION_SESSION_KEY); + return next(); + } + + // If an action was called from an HTML form action, + // call the action handler and redirect to the destination page + if (action?.calledFrom === "form") { + const actionResult = await action.handler(); + + context.session.set(ACTION_SESSION_KEY, { + actionName: action.name, + actionResult: serializeActionResult(actionResult), + }); + + + // Redirect back to the previous page on error + if (actionResult.error) { + const referer = context.request.headers.get("Referer"); + if (!referer) { + throw new Error( + "Internal: Referer unexpectedly missing from Action POST request.", + ); + } + return context.redirect(referer); + } + // Redirect to the destination page on success + return context.redirect(context.originPathname); + } + + return next(); +}); diff --git a/packages/astro/test/fixtures/sessions/src/pages/api.ts b/packages/astro/test/fixtures/sessions/src/pages/api.ts new file mode 100644 index 0000000000..77d50625aa --- /dev/null +++ b/packages/astro/test/fixtures/sessions/src/pages/api.ts @@ -0,0 +1,15 @@ +import type { APIRoute } from 'astro'; + +export const prerender = false; + +export const GET: APIRoute = async (context) => { + const url = new URL(context.url, 'http://localhost'); + let value = url.searchParams.get('set'); + if (value) { + context.session.set('value', value); + } else { + value = await context.session.get('value'); + } + const cart = await context.session.get('cart'); + return Response.json({ value, cart }); +}; diff --git a/packages/astro/test/fixtures/sessions/src/pages/cart.astro b/packages/astro/test/fixtures/sessions/src/pages/cart.astro new file mode 100644 index 0000000000..e69a9e5e15 --- /dev/null +++ b/packages/astro/test/fixtures/sessions/src/pages/cart.astro @@ -0,0 +1,24 @@ +--- +import { actions } from "astro:actions"; + +const result = Astro.getActionResult(actions.addToCart); + +const cart = result?.data?.cart ?? await Astro.session.get('cart'); +const message = result?.data?.message ?? 'Add something to your cart!'; +--- +

Cart: {JSON.stringify(cart)}

+

{message}

+
+ + +
+ + diff --git a/packages/astro/test/fixtures/sessions/src/pages/destroy.ts b/packages/astro/test/fixtures/sessions/src/pages/destroy.ts new file mode 100644 index 0000000000..e83f6e4b6c --- /dev/null +++ b/packages/astro/test/fixtures/sessions/src/pages/destroy.ts @@ -0,0 +1,6 @@ +import type { APIRoute } from 'astro'; + +export const GET: APIRoute = async (context) => { + await context.session.destroy(); + return Response.json({}); +}; diff --git a/packages/astro/test/fixtures/sessions/src/pages/index.astro b/packages/astro/test/fixtures/sessions/src/pages/index.astro new file mode 100644 index 0000000000..30d6a16187 --- /dev/null +++ b/packages/astro/test/fixtures/sessions/src/pages/index.astro @@ -0,0 +1,13 @@ +--- +const value = await Astro.session.get('value'); +--- + + + + Hi + + +

Hi

+

{value}

+🛒 + diff --git a/packages/astro/test/fixtures/sessions/src/pages/regenerate.ts b/packages/astro/test/fixtures/sessions/src/pages/regenerate.ts new file mode 100644 index 0000000000..6f2240588e --- /dev/null +++ b/packages/astro/test/fixtures/sessions/src/pages/regenerate.ts @@ -0,0 +1,6 @@ +import type { APIRoute } from 'astro'; + +export const GET: APIRoute = async (context) => { + await context.session.regenerate(); + return Response.json({}); +}; diff --git a/packages/astro/test/fixtures/sessions/tsconfig.json b/packages/astro/test/fixtures/sessions/tsconfig.json new file mode 100644 index 0000000000..c193287fcc --- /dev/null +++ b/packages/astro/test/fixtures/sessions/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "astro/tsconfigs/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "~/assets/*": ["src/assets/*"] + }, + }, + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} diff --git a/packages/astro/test/units/sessions/astro-session.test.js b/packages/astro/test/units/sessions/astro-session.test.js new file mode 100644 index 0000000000..0bbefee735 --- /dev/null +++ b/packages/astro/test/units/sessions/astro-session.test.js @@ -0,0 +1,431 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { stringify as devalueStringify } from 'devalue'; +import { AstroSession, PERSIST_SYMBOL } from '../../../dist/core/session.js'; +// Mock dependencies +const defaultMockCookies = { + set: () => {}, + delete: () => {}, + get: () => 'sessionid', +}; + +const stringify = (data) => JSON.parse(devalueStringify(data)); + +const defaultConfig = { + driver: 'memory', + cookie: 'test-session', + ttl: 60, +}; + +// Helper to create a new session instance with mocked dependencies +function createSession(config = defaultConfig, cookies = defaultMockCookies, mockStorage) { + if (mockStorage) { + config.driver = 'test'; + config.options ??= {}; + config.options.mockStorage = mockStorage; + } + return new AstroSession(cookies, config); +} + +test('AstroSession - Basic Operations', async (t) => { + await t.test('should set and get a value', async () => { + const session = createSession(); + + session.set('user', { id: 1, name: 'Test User' }); + const user = await session.get('user'); + + assert.deepEqual(user, { id: 1, name: 'Test User' }); + }); + + await t.test('should check if value exists', async () => { + const session = createSession(); + + session.set('key', 'value'); + const exists = await session.has('key'); + const notExists = await session.has('nonexistent'); + + assert.equal(exists, true); + assert.equal(notExists, false); + }); + + await t.test('should delete a value', async () => { + const session = createSession(); + + session.set('key', 'value'); + session.delete('key'); + const value = await session.get('key'); + + assert.equal(value, undefined); + }); + + await t.test('should list all keys', async () => { + const session = createSession(); + + session.set('key1', 'value1'); + session.set('key2', 'value2'); + const keys = await session.keys(); + + assert.deepEqual([...keys], ['key1', 'key2']); + }); +}); + +test('AstroSession - Cookie Management', async (t) => { + await t.test('should set cookie on first value set', async () => { + let cookieSet = false; + const mockCookies = { + ...defaultMockCookies, + set: () => { + cookieSet = true; + }, + }; + + const session = createSession(defaultConfig, mockCookies); + session.set('key', 'value'); + + assert.equal(cookieSet, true); + }); + + await t.test('should delete cookie on destroy', async () => { + let cookieDeleted = false; + const mockCookies = { + ...defaultMockCookies, + delete: () => { + cookieDeleted = true; + }, + }; + + const session = createSession(defaultConfig, mockCookies); + session.destroy(); + + assert.equal(cookieDeleted, true); + }); +}); + +test('AstroSession - Session Regeneration', async (t) => { + await t.test('should preserve data when regenerating session', async () => { + const session = createSession(); + + session.set('key', 'value'); + await session.regenerate(); + const value = await session.get('key'); + + assert.equal(value, 'value'); + }); + + await t.test('should generate new session ID on regeneration', async () => { + const session = createSession(); + const initialId = await session.sessionID; + + await session.regenerate(); + const newId = await session.sessionID; + + assert.notEqual(initialId, newId); + }); +}); + +test('AstroSession - Data Persistence', async (t) => { + await t.test('should persist data to storage', async () => { + let storedData; + const mockStorage = { + get: async () => null, + setItem: async (_key, value) => { + storedData = value; + }, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + session.set('key', 'value'); + await session[PERSIST_SYMBOL](); + + assert.ok(storedData?.includes('value')); + }); + + await t.test('should load data from storage', async () => { + const mockStorage = { + get: async () => stringify(new Map([['key', { data: 'value' }]])), + setItem: async () => {}, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + const value = await session.get('key'); + assert.equal(value, 'value'); + }); + + await t.test('should remove expired session data', async () => { + const mockStorage = { + get: async () => stringify(new Map([['key', { data: 'value', expires: -1 }]])), + setItem: async () => {}, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + const value = await session.get('key'); + + assert.equal(value, undefined); + }); + + + +}); + + + +test('AstroSession - Error Handling', async (t) => { + await t.test('should throw error when setting invalid data', async () => { + const session = createSession(); + + assert.throws(() => session.set('key', { fun: function () {} }), /could not be serialized/); + }); + + await t.test('should throw error when setting empty key', async () => { + const session = createSession(); + + assert.throws(() => session.set('', 'value'), /key was not provided/); + }); + + await t.test('should handle corrupted storage data', async () => { + const mockStorage = { + get: async () => 'invalid-json', + setItem: async () => {}, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + await assert.rejects(async () => await session.get('key'), /could not be parsed/); + }); +}); + +test('AstroSession - Configuration', async (t) => { + await t.test('should use custom cookie name from config', async () => { + let cookieName; + const mockCookies = { + ...defaultMockCookies, + set: (name) => { + cookieName = name; + }, + }; + + const session = createSession( + { + ...defaultConfig, + cookie: 'custom-session', + }, + mockCookies, + ); + + session.set('key', 'value'); + assert.equal(cookieName, 'custom-session'); + }); + + await t.test('should use default cookie name if not specified', async () => { + let cookieName; + const mockCookies = { + ...defaultMockCookies, + set: (name) => { + cookieName = name; + }, + }; + + const session = createSession( + { + ...defaultConfig, + // @ts-ignore + cookie: undefined, + }, + mockCookies, + ); + + session.set('key', 'value'); + assert.equal(cookieName, 'astro-session'); + }); +}); + +test('AstroSession - Sparse Data Operations', async (t) => { + await t.test('should handle multiple operations in sparse mode', async () => { + const existingData = stringify( + new Map([ + ['keep', { data: 'original' }], + ['delete', { data: 'remove' }], + ['update', { data: 'old' }], + ]), + ); + + const mockStorage = { + get: async () => existingData, + setItem: async () => {}, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + // Mixed operations + session.delete('delete'); + session.set('update', 'new'); + session.set('new', 'value'); + + // Verify each operation type + assert.equal(await session.get('keep'), 'original'); + assert.equal(await session.get('delete'), undefined); + assert.equal(await session.get('update'), 'new'); + assert.equal(await session.get('new'), 'value'); + }); + + await t.test('should persist deleted state across multiple operations', async () => { + const existingData = stringify(new Map([['key', 'value']])); + const mockStorage = { + get: async () => existingData, + setItem: async () => {}, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + session.delete('key'); + + // Multiple gets should all return undefined + assert.equal(await session.get('key'), undefined); + assert.equal(await session.has('key'), false); + + // Setting a different key shouldn't affect the deleted state + session.set('other', 'value'); + assert.equal(await session.get('key'), undefined); + }); + + await t.test('should maintain deletion after persistence', async () => { + let storedData; + const mockStorage = { + get: async () => storedData || stringify(new Map([['key', 'value']])), + setItem: async (_key, value) => { + storedData = value; + }, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + session.delete('key'); + await session[PERSIST_SYMBOL](); + + // Create a new session using the stored data + const newSession = createSession(defaultConfig, defaultMockCookies, { + get: async () => storedData, + setItem: async () => {}, + }); + + assert.equal(await newSession.get('key'), undefined); + }); + + await t.test('should update existing values in sparse mode', async () => { + const existingData = stringify(new Map([['key', 'old']])); + const mockStorage = { + get: async () => existingData, + setItem: async () => {}, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + session.set('key', 'new'); + assert.equal(await session.get('key'), 'new'); + + // Verify through keys() as well + const keys = await session.keys(); + assert.deepEqual([...keys], ['key']); + }); +}); + +test('AstroSession - Cleanup Operations', async (t) => { + await t.test('should clean up destroyed sessions on persist', async () => { + const removedKeys = new Set(); + const mockStorage = { + get: async () => stringify(new Map([['key', 'value']])), + setItem: async () => {}, + removeItem: async (key) => { + removedKeys.add(key); + }, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + // Set up session + session.set('key', 'value'); + const oldId = session.sessionID; + + // Destroy it + session.destroy(); + + // Simulate end of request + await session[PERSIST_SYMBOL](); + + assert.ok(removedKeys.has(oldId), `Session ${oldId} should be removed`); + }); +}); + +test('AstroSession - Cookie Security', async (t) => { + await t.test('should enforce httpOnly cookie setting', async () => { + let cookieOptions; + const mockCookies = { + ...defaultMockCookies, + set: (_name, _value, options) => { + cookieOptions = options; + }, + }; + + const session = createSession( + { + ...defaultConfig, + cookieOptions: { + httpOnly: false, + }, + }, + mockCookies, + ); + + session.set('key', 'value'); + assert.equal(cookieOptions.httpOnly, true); + }); + + await t.test('should set secure and sameSite by default', async () => { + let cookieOptions; + const mockCookies = { + ...defaultMockCookies, + set: (_name, _value, options) => { + cookieOptions = options; + }, + }; + + const session = createSession(defaultConfig, mockCookies); + + session.set('key', 'value'); + assert.equal(cookieOptions.secure, true); + assert.equal(cookieOptions.sameSite, 'lax'); + }); +}); + +test('AstroSession - Storage Errors', async (t) => { + await t.test('should handle storage setItem failures', async () => { + const mockStorage = { + get: async () => stringify(new Map()), + setItem: async () => { + throw new Error('Storage full'); + }, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + session.set('key', 'value'); + + await assert.rejects(async () => await session[PERSIST_SYMBOL](), /Storage full/); + }); + + await t.test('should handle invalid Map data', async () => { + const mockStorage = { + get: async () => stringify({ notAMap: true }), + setItem: async () => {}, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + await assert.rejects( + async () => await session.get('key'), + /The session data was an invalid type/, + ); + }); +}); diff --git a/packages/integrations/preact/src/static-html.ts b/packages/integrations/preact/src/static-html.ts index af31848086..453e72b7f5 100644 --- a/packages/integrations/preact/src/static-html.ts +++ b/packages/integrations/preact/src/static-html.ts @@ -16,7 +16,6 @@ type Props = { const StaticHtml = ({ value, name, hydrate = true }: Props) => { if (!value) return null; const tagName = hydrate ? 'astro-slot' : 'astro-static-slot'; - // @ts-expect-error pass `name` as a prop, ignoring type errors return h(tagName, { name, dangerouslySetInnerHTML: { __html: value } }); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f12586a90..e9c779808e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2) + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2) '@biomejs/biome': specifier: 1.9.3 version: 1.9.3 @@ -32,10 +32,10 @@ importers: version: 0.21.5 eslint: specifier: ^9.15.0 - version: 9.15.0(jiti@1.21.6) + version: 9.16.0(jiti@2.4.0) eslint-plugin-regexp: specifier: ^2.7.0 - version: 2.7.0(eslint@9.15.0(jiti@1.21.6)) + version: 2.7.0(eslint@9.16.0(jiti@2.4.0)) globby: specifier: ^14.0.2 version: 14.0.2 @@ -44,7 +44,7 @@ importers: version: 1.2.1 prettier: specifier: ^3.4.1 - version: 3.4.1 + version: 3.4.2 prettier-plugin-astro: specifier: ^0.14.1 version: 0.14.1 @@ -59,7 +59,7 @@ importers: version: 5.7.2 typescript-eslint: specifier: ^8.16.0 - version: 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) + version: 8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) benchmark: dependencies: @@ -102,10 +102,10 @@ importers: devDependencies: '@codspeed/vitest-plugin': specifier: 3.1.1 - version: 3.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0)) + version: 3.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.82.0)) vitest: specifier: 2.1.8 - version: 2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0) + version: 2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.82.0) benchmark/packages/adapter: dependencies: @@ -182,7 +182,7 @@ importers: version: 18.3.1(react@18.3.1) vitest: specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(jiti@1.21.6)(jsdom@23.2.0)(sass@1.81.0)(yaml@2.5.1) + version: 2.1.6(@types/node@18.19.50)(jiti@2.4.0)(jsdom@23.2.0)(sass@1.82.0)(yaml@2.5.1) devDependencies: '@types/react': specifier: ^18.3.12 @@ -246,7 +246,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.1.16 - version: 5.2.3 + version: 5.1.16 vue: specifier: ^3.5.12 version: 3.5.12(typescript@5.7.2) @@ -309,7 +309,7 @@ importers: version: link:../../packages/astro svelte: specifier: ^5.1.16 - version: 5.2.3 + version: 5.1.16 examples/framework-vue: dependencies: @@ -363,7 +363,7 @@ importers: version: link:../../packages/astro svelte: specifier: ^5.1.16 - version: 5.2.3 + version: 5.1.16 examples/starlog: dependencies: @@ -372,7 +372,7 @@ importers: version: link:../../packages/astro sass: specifier: ^1.80.6 - version: 1.81.0 + version: 1.80.6 sharp: specifier: ^0.33.3 version: 0.33.3 @@ -459,7 +459,7 @@ importers: version: link:../../packages/astro vitest: specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(jiti@1.21.6)(jsdom@23.2.0)(sass@1.81.0)(yaml@2.5.1) + version: 2.1.6(@types/node@18.19.50)(jiti@2.4.0)(jsdom@23.2.0)(sass@1.82.0)(yaml@2.5.1) packages/astro: dependencies: @@ -480,7 +480,7 @@ importers: version: 1.1.0 '@rollup/pluginutils': specifier: ^5.1.3 - version: 5.1.3(rollup@4.27.4) + version: 5.1.3(rollup@4.28.0) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -594,7 +594,7 @@ importers: version: 7.6.3 shiki: specifier: ^1.23.1 - version: 1.23.1 + version: 1.24.0 tinyexec: specifier: ^0.3.1 version: 0.3.1 @@ -607,15 +607,18 @@ importers: unist-util-visit: specifier: ^5.0.0 version: 5.0.0 + unstorage: + specifier: ^1.12.0 + version: 1.13.1 vfile: specifier: ^6.0.3 version: 6.0.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) vitefu: specifier: ^1.0.4 - version: 1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + version: 1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) which-pm: specifier: ^3.0.0 version: 3.0.0 @@ -644,7 +647,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2) + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2) '@playwright/test': specifier: ^1.49.0 version: 1.49.0 @@ -734,10 +737,10 @@ importers: version: 0.1.2 rollup: specifier: ^4.27.4 - version: 4.27.4 + version: 4.28.0 sass: specifier: ^1.81.0 - version: 1.81.0 + version: 1.82.0 undici: specifier: ^6.21.0 version: 6.21.0 @@ -746,7 +749,7 @@ importers: version: 11.0.5 vitest: specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(jiti@1.21.6)(jsdom@23.2.0)(sass@1.81.0)(yaml@2.5.1) + version: 2.1.6(@types/node@18.19.50)(jiti@2.4.0)(jsdom@23.2.0)(sass@1.82.0)(yaml@2.5.1) packages/astro-prism: dependencies: @@ -793,7 +796,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2) + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2) '@astrojs/db': specifier: workspace:* version: link:../../../../db @@ -826,7 +829,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2) + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2) '@astrojs/db': specifier: workspace:* version: link:../../../../db @@ -868,7 +871,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/e2e/fixtures/astro-envs: dependencies: @@ -902,7 +905,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -914,7 +917,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -978,7 +981,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/e2e/fixtures/error-cyclic: dependencies: @@ -990,7 +993,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/e2e/fixtures/error-sass: dependencies: @@ -999,7 +1002,7 @@ importers: version: link:../../.. sass: specifier: ^1.81.0 - version: 1.81.0 + version: 1.82.0 packages/astro/e2e/fixtures/errors: dependencies: @@ -1023,7 +1026,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1032,13 +1035,13 @@ importers: version: 18.3.1(react@18.3.1) sass: specifier: ^1.81.0 - version: 1.81.0 + version: 1.82.0 solid-js: specifier: ^1.9.3 version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1050,7 +1053,7 @@ importers: version: link:../../.. sass: specifier: ^1.81.0 - version: 1.81.0 + version: 1.82.0 packages/astro/e2e/fixtures/hydration-race: dependencies: @@ -1062,7 +1065,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/e2e/fixtures/i18n: dependencies: @@ -1083,7 +1086,7 @@ importers: version: 3.2.1 preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1095,7 +1098,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1123,7 +1126,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 devDependencies: '@astrojs/mdx': specifier: workspace:* @@ -1139,7 +1142,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1151,7 +1154,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1179,7 +1182,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1191,7 +1194,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1219,7 +1222,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1231,7 +1234,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1259,7 +1262,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1271,7 +1274,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1299,7 +1302,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1311,7 +1314,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1339,7 +1342,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1351,7 +1354,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1407,7 +1410,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/e2e/fixtures/preact-component: dependencies: @@ -1422,7 +1425,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/e2e/fixtures/preact-lazy-component: dependencies: @@ -1437,7 +1440,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/e2e/fixtures/prefetch: dependencies: @@ -1547,7 +1550,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/e2e/fixtures/tailwindcss: dependencies: @@ -1565,7 +1568,7 @@ importers: version: 8.4.49 tailwindcss: specifier: ^3.4.15 - version: 3.4.15 + version: 3.4.16 packages/astro/e2e/fixtures/ts-resolution: dependencies: @@ -1613,7 +1616,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1751,7 +1754,7 @@ importers: version: 18.3.1(react@18.3.1) svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1772,7 +1775,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/alias-tsconfig: dependencies: @@ -1787,7 +1790,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/alias-tsconfig-baseurl-only: dependencies: @@ -1799,7 +1802,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/alias-tsconfig/deps/namespace-package: {} @@ -1885,7 +1888,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/astro-check-errors: dependencies: @@ -1921,10 +1924,10 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -1957,7 +1960,7 @@ importers: version: 18.3.1(react@18.3.1) svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/astro-client-only/pkg: {} @@ -2049,7 +2052,7 @@ importers: version: 18.3.1(react@18.3.1) svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/astro-env: dependencies: @@ -2103,7 +2106,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/astro-external-files: dependencies: @@ -2121,7 +2124,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/astro-generator: dependencies: @@ -2340,7 +2343,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/astro-slots: dependencies: @@ -2370,7 +2373,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -2382,7 +2385,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -2397,7 +2400,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/build-assets: dependencies: @@ -2409,7 +2412,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/build-readonly-file: dependencies: @@ -2457,7 +2460,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -2466,13 +2469,13 @@ importers: version: 18.3.1(react@18.3.1) svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/component-library-shared: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -2650,7 +2653,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/content-layer-rendering: dependencies: @@ -2787,7 +2790,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/css-import-as-inline: dependencies: @@ -3000,7 +3003,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/error-bad-js: dependencies: @@ -3042,10 +3045,10 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -3132,7 +3135,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/i18n-routing: dependencies: @@ -3237,7 +3240,7 @@ importers: dependencies: preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -3249,7 +3252,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -3443,7 +3446,7 @@ importers: version: 1.9.3 svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -3465,7 +3468,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/preact-compat-component/packages/react-lib: dependencies: @@ -3480,13 +3483,13 @@ importers: version: link:../../../../integrations/preact '@preact/signals': specifier: 1.3.0 - version: 1.3.0(preact@10.25.0) + version: 1.3.0(preact@10.25.1) astro: specifier: workspace:* version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/public-base-404: dependencies: @@ -3547,7 +3550,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/remote-css: dependencies: @@ -3637,7 +3640,7 @@ importers: version: link:../../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/server-islands/ssr: dependencies: @@ -3649,7 +3652,13 @@ importers: version: link:../../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 + + packages/astro/test/fixtures/sessions: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. packages/astro/test/fixtures/set-html: dependencies: @@ -3670,7 +3679,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/slots-react: dependencies: @@ -3718,7 +3727,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/slots-vue: dependencies: @@ -3829,7 +3838,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/ssr-error: dependencies: @@ -3948,7 +3957,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/ssr-split-manifest: dependencies: @@ -3969,7 +3978,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/astro/test/fixtures/static-build-code-component: dependencies: @@ -3996,7 +4005,7 @@ importers: version: link:../../.. preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -4049,7 +4058,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/astro/test/fixtures/tailwindcss: dependencies: @@ -4085,7 +4094,7 @@ importers: version: 8.4.49 tailwindcss: specifier: ^3.4.15 - version: 3.4.15 + version: 3.4.16 packages/astro/test/fixtures/third-party-astro: dependencies: @@ -4142,7 +4151,7 @@ importers: version: link:../../.. vitest: specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(jiti@1.21.6)(jsdom@23.2.0)(sass@1.81.0)(yaml@2.5.1) + version: 2.1.6(@types/node@18.19.50)(jiti@2.4.0)(jsdom@23.2.0)(sass@1.82.0)(yaml@2.5.1) packages/astro/test/fixtures/vue-component: dependencies: @@ -4181,7 +4190,7 @@ importers: version: link:../../.. svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -4299,7 +4308,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) packages/db/test/fixtures/basics: dependencies: @@ -4404,7 +4413,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2) + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2) '@astrojs/db': specifier: workspace:* version: link:../../.. @@ -4455,7 +4464,7 @@ importers: version: link:../../../scripts vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) packages/integrations/alpinejs/test/fixtures/basics: dependencies: @@ -4545,7 +4554,7 @@ importers: version: 0.18.5 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) packages/integrations/markdoc/test/fixtures/content-collections: dependencies: @@ -4659,7 +4668,7 @@ importers: version: link:../../../../../astro preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/integrations/markdoc/test/fixtures/render-with-config: dependencies: @@ -4774,7 +4783,7 @@ importers: version: 6.0.0 rehype-pretty-code: specifier: ^0.14.0 - version: 0.14.0(shiki@1.23.1) + version: 0.14.0(shiki@1.24.0) remark-math: specifier: ^6.0.0 version: 6.0.0 @@ -4789,13 +4798,13 @@ importers: version: 9.0.0 shiki: specifier: ^1.23.1 - version: 1.23.1 + version: 1.24.0 unified: specifier: ^11.0.5 version: 11.0.5 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) packages/integrations/mdx/test/fixtures/css-head-mdx: dependencies: @@ -4864,7 +4873,7 @@ importers: version: link:../../../../../astro preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/integrations/mdx/test/fixtures/mdx-namespace: dependencies: @@ -4983,19 +4992,19 @@ importers: version: 7.25.9(@babel/core@7.26.0) '@preact/preset-vite': specifier: 2.8.2 - version: 2.8.2(@babel/core@7.26.0)(preact@10.25.0)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + version: 2.8.2(@babel/core@7.26.0)(preact@10.25.1)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) '@preact/signals': specifier: ^1.3.0 - version: 1.3.0(preact@10.25.0) + version: 1.3.0(preact@10.25.1) babel-plugin-transform-hook-names: specifier: ^1.0.2 version: 1.0.2(@babel/core@7.26.0) preact-render-to-string: specifier: ^6.5.11 - version: 6.5.11(preact@10.25.0) + version: 6.5.11(preact@10.25.1) vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) devDependencies: astro: specifier: workspace:* @@ -5005,19 +5014,19 @@ importers: version: link:../../../scripts preact: specifier: ^10.25.0 - version: 10.25.0 + version: 10.25.1 packages/integrations/react: dependencies: '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + version: 4.3.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) ultrahtml: specifier: ^1.5.3 version: 1.5.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) devDependencies: '@types/react': specifier: ^18.3.12 @@ -5127,10 +5136,10 @@ importers: dependencies: vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) vite-plugin-solid: specifier: ^2.11.0 - version: 2.11.0(solid-js@1.9.3)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + version: 2.11.0(solid-js@1.9.3)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) devDependencies: astro: specifier: workspace:* @@ -5146,13 +5155,13 @@ importers: dependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + version: 5.0.1(svelte@5.6.2)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) svelte2tsx: specifier: ^0.7.22 - version: 0.7.22(svelte@5.2.9)(typescript@5.7.2) + version: 0.7.22(svelte@5.6.2)(typescript@5.7.2) vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) devDependencies: astro: specifier: workspace:* @@ -5162,7 +5171,7 @@ importers: version: link:../../../scripts svelte: specifier: ^5.2.9 - version: 5.2.9 + version: 5.6.2 packages/integrations/tailwind: dependencies: @@ -5187,7 +5196,7 @@ importers: version: 3.4.14 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) packages/integrations/tailwind/test/fixtures/basic: dependencies: @@ -5204,19 +5213,19 @@ importers: dependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + version: 5.2.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.1 - version: 4.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + version: 4.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) '@vue/compiler-sfc': specifier: ^3.5.12 version: 3.5.12 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) vite-plugin-vue-devtools: specifier: ^7.6.7 - version: 7.6.7(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + version: 7.6.7(rollup@4.28.0)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) devDependencies: astro: specifier: workspace:* @@ -5398,7 +5407,7 @@ importers: version: 3.0.2 shiki: specifier: ^1.23.1 - version: 1.23.1 + version: 1.24.0 unified: specifier: ^11.0.5 version: 11.0.5 @@ -5463,7 +5472,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + version: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) packages/telemetry: dependencies: @@ -5582,8 +5591,8 @@ packages: '@assemblyscript/loader@0.19.23': resolution: {integrity: sha512-ulkCYfFbYj01ie1MDOyxv2F6SpRN1TOj7fQxbP07D6HmeR+gr2JLSmINKjga2emB+b1L2KGrFKBTc+e00p54nw==} - '@astro-community/astro-embed-baseline-status@0.1.2': - resolution: {integrity: sha512-u+3BwXCSjBIVW29MGTbdusRhRBhqcjHyE6dgBCsUK/nZ0BohP1Nfih8dB7YltTVZxgECakKWQWoSHabDbYteyA==} + '@astro-community/astro-embed-baseline-status@0.1.1': + resolution: {integrity: sha512-BiTQf4EP3SjMb/U5YN984BiGoGQNfc/lsJG0PosvNjUn5Q6+GjkSs77RjW3mQXOo64+sC3A0iOgdw2rlOmmjcQ==} peerDependencies: astro: ^4.0.0-beta || ^5.0.0-beta @@ -5651,20 +5660,20 @@ packages: '@astrojs/yaml2ts@0.2.1': resolution: {integrity: sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.26.0': + resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.2': - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + '@babel/compat-data@7.26.0': + resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + '@babel/generator@7.26.0': + resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': @@ -5757,8 +5766,8 @@ packages: resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.2': - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + '@babel/parser@7.26.1': + resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==} engines: {node: '>=6.0.0'} hasBin: true @@ -6567,28 +6576,28 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.0': - resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.0': - resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + '@eslint/core@0.9.1': + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.15.0': - resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} + '@eslint/js@9.16.0': + resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.3': - resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + '@eslint/plugin-kit@0.2.4': + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fontsource/monofett@5.1.0': @@ -6913,6 +6922,12 @@ packages: cpu: [x64] os: [linux] + '@parcel/watcher-wasm@2.5.0': + resolution: {integrity: sha512-Z4ouuR8Pfggk1EYYbTaIoxc+Yv4o7cGQnH0Xy8+pQ+HbiW+ZnwhcD2LPf/prfq1nIWpAxjOkQ8uSMFWMtBLiVQ==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} engines: {node: '>= 10.0.0'} @@ -6991,110 +7006,110 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.27.4': - resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} + '@rollup/rollup-android-arm-eabi@4.28.0': + resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.27.4': - resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} + '@rollup/rollup-android-arm64@4.28.0': + resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.27.4': - resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} + '@rollup/rollup-darwin-arm64@4.28.0': + resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.27.4': - resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} + '@rollup/rollup-darwin-x64@4.28.0': + resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.27.4': - resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + '@rollup/rollup-freebsd-arm64@4.28.0': + resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.27.4': - resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + '@rollup/rollup-freebsd-x64@4.28.0': + resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': - resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': + resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.27.4': - resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} + '@rollup/rollup-linux-arm-musleabihf@4.28.0': + resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.27.4': - resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} + '@rollup/rollup-linux-arm64-gnu@4.28.0': + resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.27.4': - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} + '@rollup/rollup-linux-arm64-musl@4.28.0': + resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': + resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.27.4': - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} + '@rollup/rollup-linux-riscv64-gnu@4.28.0': + resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.27.4': - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} + '@rollup/rollup-linux-s390x-gnu@4.28.0': + resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.27.4': - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} + '@rollup/rollup-linux-x64-gnu@4.28.0': + resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.27.4': - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} + '@rollup/rollup-linux-x64-musl@4.28.0': + resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.27.4': - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} + '@rollup/rollup-win32-arm64-msvc@4.28.0': + resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.27.4': - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} + '@rollup/rollup-win32-ia32-msvc@4.28.0': + resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.27.4': - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} + '@rollup/rollup-win32-x64-msvc@4.28.0': + resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} cpu: [x64] os: [win32] '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@1.23.1': - resolution: {integrity: sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==} + '@shikijs/core@1.24.0': + resolution: {integrity: sha512-6pvdH0KoahMzr6689yh0QJ3rCgF4j1XsXRHNEeEN6M4xJTfQ6QPWrmHzIddotg+xPJUPEPzYzYCKzpYyhTI6Gw==} - '@shikijs/engine-javascript@1.23.1': - resolution: {integrity: sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==} + '@shikijs/engine-javascript@1.24.0': + resolution: {integrity: sha512-ZA6sCeSsF3Mnlxxr+4wGEJ9Tto4RHmfIS7ox8KIAbH0MTVUkw3roHPHZN+LlJMOHJJOVupe6tvuAzRpN8qK1vA==} - '@shikijs/engine-oniguruma@1.23.1': - resolution: {integrity: sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==} + '@shikijs/engine-oniguruma@1.24.0': + resolution: {integrity: sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==} - '@shikijs/types@1.23.1': - resolution: {integrity: sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==} + '@shikijs/types@1.24.0': + resolution: {integrity: sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==} '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} @@ -7293,8 +7308,8 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@typescript-eslint/eslint-plugin@8.16.0': - resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} + '@typescript-eslint/eslint-plugin@8.17.0': + resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -7304,8 +7319,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.16.0': - resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} + '@typescript-eslint/parser@8.17.0': + resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -7314,12 +7329,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.16.0': - resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} + '@typescript-eslint/scope-manager@8.17.0': + resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.16.0': - resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} + '@typescript-eslint/type-utils@8.17.0': + resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -7328,12 +7343,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.16.0': - resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} + '@typescript-eslint/types@8.17.0': + resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.16.0': - resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} + '@typescript-eslint/typescript-estree@8.17.0': + resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -7341,8 +7356,8 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.16.0': - resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} + '@typescript-eslint/utils@8.17.0': + resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -7351,8 +7366,8 @@ packages: typescript: optional: true - '@typescript-eslint/visitor-keys@8.16.0': - resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} + '@typescript-eslint/visitor-keys@8.17.0': + resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/twoslash@3.1.0': @@ -7760,8 +7775,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -7788,8 +7803,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001684: - resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} + caniuse-lite@1.0.30001667: + resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} canvas-confetti@1.9.3: resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} @@ -7858,6 +7873,9 @@ packages: resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -7870,6 +7888,10 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -7932,6 +7954,13 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -7939,6 +7968,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -7950,10 +7982,17 @@ packages: cross-argv@2.0.0: resolution: {integrity: sha512-YIaY9TR5Nxeb8SMdtrU8asWVM4jqJDNDYlKV21LxtYcfNJhp1kEsgSa6qXwXgzN0WQWGODps0+TlGp2xQSHwOg==} + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.1: + resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + css-blank-pseudo@7.0.1: resolution: {integrity: sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==} engines: {node: '>=18'} @@ -7993,8 +8032,8 @@ packages: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} - cssdb@8.2.1: - resolution: {integrity: sha512-KwEPys7lNsC8OjASI8RrmwOYYDcm0JOW9zQhcV83ejYcQkirTEyeAGui8aO2F5PiS6SLpxuTzl6qlMElIdsgIg==} + cssdb@8.2.2: + resolution: {integrity: sha512-Z3kpWyvN68aKyeMxOUGmffQeHjvrzDxbre2B2ikr/WqQ4ZMkhHu2nOD6uwSeq3TpuOYU7ckvmJRAUIt6orkYUg==} cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -8078,6 +8117,9 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -8094,6 +8136,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -8259,8 +8304,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.65: - resolution: {integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==} + electron-to-chromium@1.5.33: + resolution: {integrity: sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==} emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -8359,8 +8404,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.15.0: - resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} + eslint@9.16.0: + resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -8372,6 +8417,9 @@ packages: esm-env@1.1.4: resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} + esm-env@1.2.1: + resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -8392,6 +8440,9 @@ packages: esrap@1.2.2: resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + esrap@1.2.3: + resolution: {integrity: sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -8610,6 +8661,9 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -8660,6 +8714,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + h3@1.13.0: + resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} + has-async-hooks@1.0.0: resolution: {integrity: sha512-YF0VPGjkxr7AyyQQNykX8zK4PvtEDsUJAPqwu06UFz1lb6EvI53sPh5H1kWxg8NXI5LsfRCZ8uX9NkYDZBb/mw==} @@ -8773,6 +8830,10 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} @@ -8810,6 +8871,9 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + immutable@5.0.3: resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} @@ -8837,6 +8901,9 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -8897,6 +8964,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -8928,6 +8998,10 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -8938,6 +9012,10 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + jiti@2.4.0: + resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==} + hasBin: true + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -9036,6 +9114,10 @@ packages: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -9045,6 +9127,10 @@ packages: linkedom@0.18.5: resolution: {integrity: sha512-JGLaGGtqtu+eOhYrC1wkWYTBcpVWL4AsnwAtMtgO1Q0gI0PuPJKI0zBBE+a/1BrhOE3Uw8JI/ycByAv5cLrAuQ==} + listhen@1.9.0: + resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} + hasBin: true + lit-element@4.1.0: resolution: {integrity: sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww==} @@ -9121,6 +9207,9 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.14: resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} @@ -9372,6 +9461,11 @@ packages: engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -9421,6 +9515,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -9479,6 +9576,9 @@ packages: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -9492,8 +9592,12 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true node-html-parser@6.1.13: @@ -9554,6 +9658,12 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -9573,8 +9683,8 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - oniguruma-to-es@0.4.1: - resolution: {integrity: sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==} + oniguruma-to-es@0.7.0: + resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} only-allow@1.2.1: resolution: {integrity: sha512-M7CJbmv7UCopc0neRKdzfoGWaVZC+xC1925GitKH9EAqYFzX9//25Q7oX4+jw0tiCCj+t5l6VZh8UPH23NZkMA==} @@ -9735,6 +9845,9 @@ packages: perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -9762,6 +9875,9 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + playwright-core@1.49.0: resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} engines: {node: '>=18'} @@ -9987,8 +10103,8 @@ packages: preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} - preact@10.25.0: - resolution: {integrity: sha512-6bYnzlLxXV3OSpUxLdaxBmE7PMOu0aR3pG6lryK/0jmvcDFPlcXGQAt5DpK3RITWiDrfYZRI0druyaK/S9kYLg==} + preact@10.25.1: + resolution: {integrity: sha512-frxeZV2vhQSohQwJ7FvlqC40ze89+8friponWUFeVEkaCfhC6Eu4V0iND5C9CXz8JLndV07QRDeXzH1+Anz5Og==} preferred-pm@4.0.0: resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==} @@ -10012,8 +10128,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.4.1: - resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -10068,6 +10184,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -10134,8 +10253,8 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@4.2.1: - resolution: {integrity: sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==} + regex-recursion@4.3.0: + resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} @@ -10272,8 +10391,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.27.4: - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} + rollup@4.28.0: + resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -10303,8 +10422,13 @@ packages: sass-formatter@0.7.9: resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} - sass@1.81.0: - resolution: {integrity: sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==} + sass@1.80.6: + resolution: {integrity: sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==} + engines: {node: '>=14.0.0'} + hasBin: true + + sass@1.82.0: + resolution: {integrity: sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==} engines: {node: '>=14.0.0'} hasBin: true @@ -10378,8 +10502,8 @@ packages: shiki@0.10.1: resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} - shiki@1.23.1: - resolution: {integrity: sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==} + shiki@1.24.0: + resolution: {integrity: sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -10473,6 +10597,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} @@ -10564,12 +10691,12 @@ packages: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@5.2.3: - resolution: {integrity: sha512-DRrWXdzo6+gfX9H/hQofQYyAtsGqC99+CFBvttImGt6gAy4Xzh0hHBrCHw5OtBgaPOdVGNW+S+mDcYcEsvTPOw==} + svelte@5.1.16: + resolution: {integrity: sha512-QcY+om9r8+uTcSfeFuv8++ExdfwVCKeT+Y7GPSZ6rQPczvy62BMtvMoi0rScabgv+upGE5jxKjd7M4u23+AjGA==} engines: {node: '>=18'} - svelte@5.2.9: - resolution: {integrity: sha512-LjO7R6K8FI8dA3l+4CcsbJ3djIe2TtokHGzfpDTro5g8nworMbTz9alCR95EQXGsqlzIAvqJtZ7Yy0o33lL09Q==} + svelte@5.6.2: + resolution: {integrity: sha512-fyq4gCUW9OoR9X8I1BzmMVIOxzTlyCLI5gArRRTUuJj+jIUSHtud7c+MguQNGLv7Z/rGWxJyG9ZRFd/cFp/klA==} engines: {node: '>=18'} svg-tags@1.0.0: @@ -10583,13 +10710,17 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + tailwindcss@3.4.14: resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@3.4.15: - resolution: {integrity: sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==} + tailwindcss@3.4.16: + resolution: {integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==} engines: {node: '>=14.0.0'} hasBin: true @@ -10757,8 +10888,8 @@ packages: typescript-auto-import-cache@0.3.3: resolution: {integrity: sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==} - typescript-eslint@8.16.0: - resolution: {integrity: sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==} + typescript-eslint@8.17.0: + resolution: {integrity: sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -10777,12 +10908,18 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + uhyphen@0.2.0: resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -10790,6 +10927,9 @@ packages: resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} engines: {node: '>=18.17'} + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -10864,12 +11004,63 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + unstorage@1.13.1: + resolution: {integrity: sha512-ELexQHUrG05QVIM/iUeQNdl9FXDZhqLJ4yP59fnmn2jGUh0TEulwOgov1ubOb3Gt2ZGK/VMchJwPDNVEGWQpRg==} + peerDependencies: + '@azure/app-configuration': ^1.7.0 + '@azure/cosmos': ^4.1.1 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^4.5.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.25.0 + '@capacitor/preferences': ^6.0.2 + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/kv': ^1.0.1 + idb-keyval: ^6.2.1 + ioredis: ^5.4.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + + untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -11409,7 +11600,7 @@ snapshots: '@assemblyscript/loader@0.19.23': {} - '@astro-community/astro-embed-baseline-status@0.1.2(astro@packages+astro)': + '@astro-community/astro-embed-baseline-status@0.1.1(astro@packages+astro)': dependencies: '@astro-community/astro-embed-utils': 0.1.3 astro: link:packages/astro @@ -11448,9 +11639,9 @@ snapshots: astro: link:packages/astro lite-youtube-embed: 0.3.3 - '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2)': + '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2)': dependencies: - '@astrojs/language-server': 2.15.0(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2) + '@astrojs/language-server': 2.15.0(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2) chokidar: 4.0.1 kleur: 4.1.5 typescript: 5.7.2 @@ -11467,7 +11658,7 @@ snapshots: '@astrojs/compiler@2.10.3': {} - '@astrojs/language-server@2.15.0(prettier-plugin-astro@0.14.1)(prettier@3.4.1)(typescript@5.7.2)': + '@astrojs/language-server@2.15.0(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.2)': dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/yaml2ts': 0.2.1 @@ -11481,14 +11672,14 @@ snapshots: volar-service-css: 0.0.61(@volar/language-service@2.4.6) volar-service-emmet: 0.0.61(@volar/language-service@2.4.6) volar-service-html: 0.0.61(@volar/language-service@2.4.6) - volar-service-prettier: 0.0.61(@volar/language-service@2.4.6)(prettier@3.4.1) + volar-service-prettier: 0.0.61(@volar/language-service@2.4.6)(prettier@3.4.2) volar-service-typescript: 0.0.61(@volar/language-service@2.4.6) volar-service-typescript-twoslash-queries: 0.0.61(@volar/language-service@2.4.6) volar-service-yaml: 0.0.61(@volar/language-service@2.4.6) vscode-html-languageservice: 5.3.1 vscode-uri: 3.0.8 optionalDependencies: - prettier: 3.4.1 + prettier: 3.4.2 prettier-plugin-astro: 0.14.1 transitivePeerDependencies: - typescript @@ -11513,23 +11704,23 @@ snapshots: dependencies: yaml: 2.5.1 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.26.0': dependencies: '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 - picocolors: 1.1.1 + picocolors: 1.1.0 - '@babel/compat-data@7.26.2': {} + '@babel/compat-data@7.26.0': {} '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 + '@babel/code-frame': 7.26.0 + '@babel/generator': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@babel/template': 7.25.9 '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 @@ -11541,9 +11732,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.2': + '@babel/generator@7.26.0': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@babel/types': 7.26.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 @@ -11555,9 +11746,9 @@ snapshots: '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.26.2 + '@babel/compat-data': 7.26.0 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + browserslist: 4.24.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -11674,7 +11865,7 @@ snapshots: '@babel/template': 7.25.9 '@babel/types': 7.26.0 - '@babel/parser@7.26.2': + '@babel/parser@7.26.1': dependencies: '@babel/types': 7.26.0 @@ -11773,15 +11964,15 @@ snapshots: '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 + '@babel/code-frame': 7.26.0 + '@babel/parser': 7.26.1 '@babel/types': 7.26.0 '@babel/traverse@7.25.9': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 + '@babel/code-frame': 7.26.0 + '@babel/generator': 7.26.0 + '@babel/parser': 7.26.1 '@babel/template': 7.25.9 '@babel/types': 7.26.0 debug: 4.3.7 @@ -11994,13 +12185,13 @@ snapshots: '@clack/core@0.3.4': dependencies: - picocolors: 1.1.1 + picocolors: 1.1.0 sisteransi: 1.0.5 '@clack/prompts@0.7.0': dependencies: '@clack/core': 0.3.4 - picocolors: 1.1.1 + picocolors: 1.1.0 sisteransi: 1.0.5 '@codspeed/core@3.1.1': @@ -12008,15 +12199,15 @@ snapshots: axios: 1.7.7 find-up: 6.3.0 form-data: 4.0.0 - node-gyp-build: 4.8.4 + node-gyp-build: 4.8.2 transitivePeerDependencies: - debug - '@codspeed/vitest-plugin@3.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0))': + '@codspeed/vitest-plugin@3.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.82.0))': dependencies: '@codspeed/core': 3.1.1 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) - vitest: 2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) + vitest: 2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.82.0) transitivePeerDependencies: - debug @@ -12444,22 +12635,24 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.15.0(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.16.0(jiti@2.4.0))': dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@2.4.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.0': + '@eslint/config-array@0.19.1': dependencies: - '@eslint/object-schema': 2.1.4 + '@eslint/object-schema': 2.1.5 debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.9.0': {} + '@eslint/core@0.9.1': + dependencies: + '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.2.0': dependencies: @@ -12475,11 +12668,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.15.0': {} + '@eslint/js@9.16.0': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/object-schema@2.1.5': {} - '@eslint/plugin-kit@0.2.3': + '@eslint/plugin-kit@0.2.4': dependencies: levn: 0.4.1 @@ -12765,6 +12958,11 @@ snapshots: '@parcel/watcher-linux-x64-musl@2.4.1': optional: true + '@parcel/watcher-wasm@2.5.0': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.8 + '@parcel/watcher-win32-arm64@2.4.1': optional: true @@ -12793,7 +12991,6 @@ snapshots: '@parcel/watcher-win32-arm64': 2.4.1 '@parcel/watcher-win32-ia32': 2.4.1 '@parcel/watcher-win32-x64': 2.4.1 - optional: true '@pkgjs/parseargs@0.11.0': optional: true @@ -12804,12 +13001,12 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@preact/preset-vite@2.8.2(@babel/core@7.26.0)(preact@10.25.0)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))': + '@preact/preset-vite@2.8.2(@babel/core@7.26.0)(preact@10.25.1)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) - '@prefresh/vite': 2.4.5(preact@10.25.0)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + '@prefresh/vite': 2.4.5(preact@10.25.1)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.26.0) debug: 4.3.7 @@ -12819,7 +13016,7 @@ snapshots: resolve: 1.22.8 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) transitivePeerDependencies: - preact - supports-color @@ -12831,28 +13028,28 @@ snapshots: '@preact/signals-core': 1.8.0 preact: 10.24.3 - '@preact/signals@1.3.0(preact@10.25.0)': + '@preact/signals@1.3.0(preact@10.25.1)': dependencies: '@preact/signals-core': 1.8.0 - preact: 10.25.0 + preact: 10.25.1 '@prefresh/babel-plugin@0.5.1': {} - '@prefresh/core@1.5.2(preact@10.25.0)': + '@prefresh/core@1.5.2(preact@10.25.1)': dependencies: - preact: 10.25.0 + preact: 10.25.1 '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.5(preact@10.25.0)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))': + '@prefresh/vite@2.4.5(preact@10.25.1)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))': dependencies: '@babel/core': 7.26.0 '@prefresh/babel-plugin': 0.5.1 - '@prefresh/core': 1.5.2(preact@10.25.0) + '@prefresh/core': 1.5.2(preact@10.25.1) '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 - preact: 10.25.0 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + preact: 10.25.1 + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) transitivePeerDependencies: - supports-color @@ -12861,91 +13058,91 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.3(rollup@4.27.4)': + '@rollup/pluginutils@5.1.3(rollup@4.28.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.27.4 + rollup: 4.28.0 - '@rollup/rollup-android-arm-eabi@4.27.4': + '@rollup/rollup-android-arm-eabi@4.28.0': optional: true - '@rollup/rollup-android-arm64@4.27.4': + '@rollup/rollup-android-arm64@4.28.0': optional: true - '@rollup/rollup-darwin-arm64@4.27.4': + '@rollup/rollup-darwin-arm64@4.28.0': optional: true - '@rollup/rollup-darwin-x64@4.27.4': + '@rollup/rollup-darwin-x64@4.28.0': optional: true - '@rollup/rollup-freebsd-arm64@4.27.4': + '@rollup/rollup-freebsd-arm64@4.28.0': optional: true - '@rollup/rollup-freebsd-x64@4.27.4': + '@rollup/rollup-freebsd-x64@4.28.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.27.4': + '@rollup/rollup-linux-arm-musleabihf@4.28.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.27.4': + '@rollup/rollup-linux-arm64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.27.4': + '@rollup/rollup-linux-arm64-musl@4.28.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.27.4': + '@rollup/rollup-linux-riscv64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.27.4': + '@rollup/rollup-linux-s390x-gnu@4.28.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.27.4': + '@rollup/rollup-linux-x64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-x64-musl@4.27.4': + '@rollup/rollup-linux-x64-musl@4.28.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.27.4': + '@rollup/rollup-win32-arm64-msvc@4.28.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.27.4': + '@rollup/rollup-win32-ia32-msvc@4.28.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.27.4': + '@rollup/rollup-win32-x64-msvc@4.28.0': optional: true '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@1.23.1': + '@shikijs/core@1.24.0': dependencies: - '@shikijs/engine-javascript': 1.23.1 - '@shikijs/engine-oniguruma': 1.23.1 - '@shikijs/types': 1.23.1 + '@shikijs/engine-javascript': 1.24.0 + '@shikijs/engine-oniguruma': 1.24.0 + '@shikijs/types': 1.24.0 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.23.1': + '@shikijs/engine-javascript@1.24.0': dependencies: - '@shikijs/types': 1.23.1 + '@shikijs/types': 1.24.0 '@shikijs/vscode-textmate': 9.3.0 - oniguruma-to-es: 0.4.1 + oniguruma-to-es: 0.7.0 - '@shikijs/engine-oniguruma@1.23.1': + '@shikijs/engine-oniguruma@1.24.0': dependencies: - '@shikijs/types': 1.23.1 + '@shikijs/types': 1.24.0 '@shikijs/vscode-textmate': 9.3.0 - '@shikijs/types@1.23.1': + '@shikijs/types@1.24.0': dependencies: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 @@ -12960,25 +13157,25 @@ snapshots: dependencies: solid-js: 1.9.3 - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)))(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.6.2)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)))(svelte@5.6.2)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.6.2)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) debug: 4.3.7 - svelte: 5.2.9 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + svelte: 5.6.2 + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))': + '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.6.2)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)))(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.6.2)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)))(svelte@5.6.2)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) debug: 4.3.7 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.14 - svelte: 5.2.9 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) - vitefu: 1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + svelte: 5.6.2 + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) + vitefu: 1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) transitivePeerDependencies: - supports-color @@ -12996,7 +13193,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@babel/types': 7.26.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 @@ -13008,7 +13205,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@babel/types': 7.26.0 '@types/babel__traverse@7.20.6': @@ -13144,15 +13341,15 @@ snapshots: '@types/yargs-parser@21.0.3': {} - '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.16.0 - '@typescript-eslint/type-utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.16.0 - eslint: 9.15.0(jiti@1.21.6) + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.17.0 + eslint: 9.16.0(jiti@2.4.0) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -13162,42 +13359,42 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: - '@typescript-eslint/scope-manager': 8.16.0 - '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.16.0 + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.17.0 debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@2.4.0) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.16.0': + '@typescript-eslint/scope-manager@8.17.0': dependencies: - '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/visitor-keys': 8.16.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 - '@typescript-eslint/type-utils@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@2.4.0) ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.16.0': {} + '@typescript-eslint/types@8.17.0': {} - '@typescript-eslint/typescript-estree@8.16.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.17.0(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/visitor-keys': 8.16.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -13209,21 +13406,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/utils@8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) - '@typescript-eslint/scope-manager': 8.16.0 - '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) - eslint: 9.15.0(jiti@1.21.6) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0(jiti@2.4.0)) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.0) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.16.0': + '@typescript-eslint/visitor-keys@8.17.0': dependencies: - '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/types': 8.17.0 eslint-visitor-keys: 4.2.0 '@typescript/twoslash@3.1.0': @@ -13248,30 +13445,30 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))': + '@vitejs/plugin-react@4.3.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue-jsx@4.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) vue: 3.5.13(typescript@5.7.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue@5.2.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': dependencies: - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) vue: 3.5.13(typescript@5.7.2) '@vitest/expect@2.1.6': @@ -13288,21 +13485,21 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.6(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))': + '@vitest/mocker@2.1.6(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))': dependencies: '@vitest/spy': 2.1.6 estree-walker: 3.0.3 magic-string: 0.30.14 optionalDependencies: - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) - '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@18.19.50)(sass@1.81.0))': + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@18.19.50)(sass@1.82.0))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.14 optionalDependencies: - vite: 5.4.11(@types/node@18.19.50)(sass@1.81.0) + vite: 5.4.11(@types/node@18.19.50)(sass@1.82.0) '@vitest/pretty-format@2.1.6': dependencies: @@ -13425,18 +13622,18 @@ snapshots: '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0)': dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.26.0 '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@vue/compiler-sfc': 3.5.13 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.12': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@vue/shared': 3.5.12 entities: 4.5.0 estree-walker: 2.0.2 @@ -13444,7 +13641,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -13462,7 +13659,7 @@ snapshots: '@vue/compiler-sfc@3.5.12': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@vue/compiler-core': 3.5.12 '@vue/compiler-dom': 3.5.12 '@vue/compiler-ssr': 3.5.12 @@ -13474,7 +13671,7 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 @@ -13494,14 +13691,14 @@ snapshots: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 - '@vue/devtools-core@7.6.7(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': + '@vue/devtools-core@7.6.7(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': dependencies: '@vue/devtools-kit': 7.6.7 '@vue/devtools-shared': 7.6.7 mitt: 3.0.1 nanoid: 5.0.9 pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + vite-hot-client: 0.2.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) vue: 3.5.13(typescript@5.7.2) transitivePeerDependencies: - vite @@ -13668,7 +13865,7 @@ snapshots: astro-embed@0.8.0(astro@packages+astro): dependencies: - '@astro-community/astro-embed-baseline-status': 0.1.2(astro@packages+astro) + '@astro-community/astro-embed-baseline-status': 0.1.1(astro@packages+astro) '@astro-community/astro-embed-integration': 0.7.2(astro@packages+astro) '@astro-community/astro-embed-link-preview': 0.2.2 '@astro-community/astro-embed-twitter': 0.5.6(astro@packages+astro) @@ -13716,11 +13913,11 @@ snapshots: autoprefixer@10.4.20(postcss@8.4.49): dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001684 + browserslist: 4.24.0 + caniuse-lite: 1.0.30001667 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.1.1 + picocolors: 1.1.0 postcss: 8.4.49 postcss-value-parser: 4.2.0 @@ -13800,12 +13997,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.2: + browserslist@4.24.0: dependencies: - caniuse-lite: 1.0.30001684 - electron-to-chromium: 1.5.65 + caniuse-lite: 1.0.30001667 + electron-to-chromium: 1.5.33 node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + update-browserslist-db: 1.1.0(browserslist@4.24.0) buffer@5.7.1: dependencies: @@ -13824,7 +14021,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001684: {} + caniuse-lite@1.0.30001667: {} canvas-confetti@1.9.3: {} @@ -13904,6 +14101,10 @@ snapshots: ci-info@4.1.0: {} + citty@0.1.6: + dependencies: + consola: 3.2.3 + cli-boxes@3.0.0: {} cli-cursor@4.0.0: @@ -13916,6 +14117,12 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -13964,12 +14171,18 @@ snapshots: concat-map@0.0.1: {} + confbox@0.1.8: {} + + consola@3.2.3: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} + cookie@0.7.2: {} copy-anything@3.0.5: @@ -13978,12 +14191,22 @@ snapshots: cross-argv@2.0.0: {} + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.1: + dependencies: + uncrypto: 0.1.3 + css-blank-pseudo@7.0.1(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -14024,7 +14247,7 @@ snapshots: css-what@6.1.0: {} - cssdb@8.2.1: {} + cssdb@8.2.2: {} cssesc@3.0.0: {} @@ -14082,6 +14305,8 @@ snapshots: define-lazy-prop@3.0.0: {} + defu@6.1.4: {} + delayed-stream@1.0.0: {} depd@1.1.2: {} @@ -14090,12 +14315,13 @@ snapshots: dequal@2.0.3: {} + destr@2.0.3: {} + destroy@1.2.0: {} detect-indent@6.1.0: {} - detect-libc@1.0.3: - optional: true + detect-libc@1.0.3: {} detect-libc@2.0.2: {} @@ -14155,7 +14381,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.65: {} + electron-to-chromium@1.5.33: {} emmet@2.4.7: dependencies: @@ -14275,12 +14501,12 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-plugin-regexp@2.7.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-regexp@2.7.0(eslint@9.16.0(jiti@2.4.0)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0(jiti@2.4.0)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@2.4.0) jsdoc-type-pratt-parser: 4.1.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 @@ -14295,15 +14521,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.15.0(jiti@1.21.6): + eslint@9.16.0(jiti@2.4.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0(jiti@2.4.0)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.0 - '@eslint/core': 0.9.0 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.15.0 - '@eslint/plugin-kit': 0.2.3 + '@eslint/js': 9.16.0 + '@eslint/plugin-kit': 0.2.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -14332,12 +14558,14 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.6 + jiti: 2.4.0 transitivePeerDependencies: - supports-color esm-env@1.1.4: {} + esm-env@1.2.1: {} + esm@3.2.25: {} espree@10.3.0: @@ -14357,6 +14585,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 + esrap@1.2.3: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -14406,7 +14639,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.6 + cross-spawn: 7.0.3 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -14521,7 +14754,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.6 + cross-spawn: 7.0.3 signal-exit: 4.1.0 form-data@4.0.0: @@ -14584,6 +14817,8 @@ snapshots: get-east-asian-width@1.2.0: {} + get-port-please@3.1.2: {} + get-stream@8.0.1: {} get-stream@9.0.1: @@ -14644,6 +14879,19 @@ snapshots: graphemer@1.4.0: {} + h3@1.13.0: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.1 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.2.1 + ohash: 1.1.4 + radix3: 1.1.2 + ufo: 1.5.4 + uncrypto: 0.1.3 + unenv: 1.10.0 + has-async-hooks@1.0.0: {} has-flag@4.0.0: {} @@ -14873,6 +15121,8 @@ snapshots: transitivePeerDependencies: - supports-color + http-shutdown@1.2.2: {} + https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.1 @@ -14908,6 +15158,8 @@ snapshots: ignore@5.3.2: {} + immutable@4.3.7: {} + immutable@5.0.3: {} import-fresh@3.3.0: @@ -14930,6 +15182,8 @@ snapshots: inline-style-parser@0.2.4: {} + iron-webcrypto@1.2.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -14973,6 +15227,10 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.6 + is-reference@3.0.3: dependencies: '@types/estree': 1.0.6 @@ -14995,6 +15253,10 @@ snapshots: dependencies: is-inside-container: 1.0.0 + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + isexe@2.0.0: {} jackspeak@3.4.3: @@ -15005,6 +15267,8 @@ snapshots: jiti@1.21.6: {} + jiti@2.4.0: {} + js-base64@3.7.7: {} js-tokens@4.0.0: {} @@ -15112,6 +15376,8 @@ snapshots: lilconfig@3.1.2: {} + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} linkedom@0.14.26: @@ -15130,6 +15396,27 @@ snapshots: htmlparser2: 9.1.0 uhyphen: 0.2.0 + listhen@1.9.0: + dependencies: + '@parcel/watcher': 2.4.1 + '@parcel/watcher-wasm': 2.5.0 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.2.3 + crossws: 0.3.1 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.13.0 + http-shutdown: 1.2.2 + jiti: 2.4.0 + mlly: 1.7.3 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.7.0 + ufo: 1.5.4 + untun: 0.1.3 + uqr: 0.1.2 + lit-element@4.1.0: dependencies: '@lit-labs/ssr-dom-shim': 1.2.1 @@ -15209,6 +15496,10 @@ snapshots: lz-string@1.5.0: {} + magic-string@0.30.12: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -15219,7 +15510,7 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.1 '@babel/types': 7.26.0 source-map-js: 1.2.1 @@ -15746,6 +16037,8 @@ snapshots: mime@1.6.0: {} + mime@3.0.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -15783,6 +16076,13 @@ snapshots: mkdirp@1.0.4: {} + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + mri@1.2.0: {} mrmime@2.0.0: {} @@ -15820,11 +16120,12 @@ snapshots: lower-case: 2.0.2 tslib: 2.6.2 - node-addon-api@7.1.1: - optional: true + node-addon-api@7.1.1: {} node-domexception@1.0.0: {} + node-fetch-native@1.6.4: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -15835,7 +16136,9 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-gyp-build@4.8.4: {} + node-forge@1.3.1: {} + + node-gyp-build@4.8.2: {} node-html-parser@6.1.13: dependencies: @@ -15893,6 +16196,14 @@ snapshots: object-hash@3.0.0: {} + ofetch@1.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + + ohash@1.1.4: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -15911,11 +16222,11 @@ snapshots: dependencies: mimic-fn: 4.0.0 - oniguruma-to-es@0.4.1: + oniguruma-to-es@0.7.0: dependencies: emoji-regex-xs: 1.0.0 regex: 5.0.2 - regex-recursion: 4.2.1 + regex-recursion: 4.3.0 only-allow@1.2.1: dependencies: @@ -16069,6 +16380,8 @@ snapshots: perfect-debounce@1.0.0: {} + picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -16085,6 +16398,12 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-types@1.2.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + playwright-core@1.49.0: {} playwright@1.49.0: @@ -16290,11 +16609,11 @@ snapshots: '@csstools/postcss-trigonometric-functions': 4.0.5(postcss@8.4.49) '@csstools/postcss-unset-value': 4.0.0(postcss@8.4.49) autoprefixer: 10.4.20(postcss@8.4.49) - browserslist: 4.24.2 + browserslist: 4.24.0 css-blank-pseudo: 7.0.1(postcss@8.4.49) css-has-pseudo: 7.0.1(postcss@8.4.49) css-prefers-color-scheme: 10.0.0(postcss@8.4.49) - cssdb: 8.2.1 + cssdb: 8.2.2 postcss: 8.4.49 postcss-attribute-case-insensitive: 7.0.1(postcss@8.4.49) postcss-clamp: 4.1.0(postcss@8.4.49) @@ -16354,13 +16673,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact-render-to-string@6.5.11(preact@10.25.0): + preact-render-to-string@6.5.11(preact@10.25.1): dependencies: - preact: 10.25.0 + preact: 10.25.1 preact@10.24.3: {} - preact@10.25.0: {} + preact@10.25.1: {} preferred-pm@4.0.0: dependencies: @@ -16373,7 +16692,7 @@ snapshots: prettier-plugin-astro@0.14.1: dependencies: '@astrojs/compiler': 2.10.3 - prettier: 3.4.1 + prettier: 3.4.2 sass-formatter: 0.7.9 prettier@2.8.7: @@ -16381,7 +16700,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.4.1: {} + prettier@3.4.2: {} pretty-bytes@5.6.0: {} @@ -16420,6 +16739,8 @@ snapshots: queue-microtask@1.2.3: {} + radix3@1.1.2: {} + range-parser@1.2.1: {} react-dom@18.3.1(react@18.3.1): @@ -16498,7 +16819,7 @@ snapshots: regenerator-runtime@0.14.1: {} - regex-recursion@4.2.1: + regex-recursion@4.3.0: dependencies: regex-utilities: 2.3.0 @@ -16544,13 +16865,13 @@ snapshots: hast-util-from-html: 2.0.3 unified: 11.0.5 - rehype-pretty-code@0.14.0(shiki@1.23.1): + rehype-pretty-code@0.14.0(shiki@1.24.0): dependencies: '@types/hast': 3.0.4 hast-util-to-string: 3.0.0 parse-numeric-range: 1.3.0 rehype-parse: 9.0.0 - shiki: 1.23.1 + shiki: 1.24.0 unified: 11.0.5 unist-util-visit: 5.0.0 @@ -16732,28 +17053,28 @@ snapshots: rfdc@1.4.1: {} - rollup@4.27.4: + rollup@4.28.0: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.27.4 - '@rollup/rollup-android-arm64': 4.27.4 - '@rollup/rollup-darwin-arm64': 4.27.4 - '@rollup/rollup-darwin-x64': 4.27.4 - '@rollup/rollup-freebsd-arm64': 4.27.4 - '@rollup/rollup-freebsd-x64': 4.27.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 - '@rollup/rollup-linux-arm-musleabihf': 4.27.4 - '@rollup/rollup-linux-arm64-gnu': 4.27.4 - '@rollup/rollup-linux-arm64-musl': 4.27.4 - '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 - '@rollup/rollup-linux-riscv64-gnu': 4.27.4 - '@rollup/rollup-linux-s390x-gnu': 4.27.4 - '@rollup/rollup-linux-x64-gnu': 4.27.4 - '@rollup/rollup-linux-x64-musl': 4.27.4 - '@rollup/rollup-win32-arm64-msvc': 4.27.4 - '@rollup/rollup-win32-ia32-msvc': 4.27.4 - '@rollup/rollup-win32-x64-msvc': 4.27.4 + '@rollup/rollup-android-arm-eabi': 4.28.0 + '@rollup/rollup-android-arm64': 4.28.0 + '@rollup/rollup-darwin-arm64': 4.28.0 + '@rollup/rollup-darwin-x64': 4.28.0 + '@rollup/rollup-freebsd-arm64': 4.28.0 + '@rollup/rollup-freebsd-x64': 4.28.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 + '@rollup/rollup-linux-arm-musleabihf': 4.28.0 + '@rollup/rollup-linux-arm64-gnu': 4.28.0 + '@rollup/rollup-linux-arm64-musl': 4.28.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 + '@rollup/rollup-linux-riscv64-gnu': 4.28.0 + '@rollup/rollup-linux-s390x-gnu': 4.28.0 + '@rollup/rollup-linux-x64-gnu': 4.28.0 + '@rollup/rollup-linux-x64-musl': 4.28.0 + '@rollup/rollup-win32-arm64-msvc': 4.28.0 + '@rollup/rollup-win32-ia32-msvc': 4.28.0 + '@rollup/rollup-win32-x64-msvc': 4.28.0 fsevents: 2.3.3 rrweb-cssom@0.6.0: {} @@ -16778,7 +17099,15 @@ snapshots: dependencies: suf-log: 2.5.3 - sass@1.81.0: + sass@1.80.6: + dependencies: + chokidar: 4.0.1 + immutable: 4.3.7 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.4.1 + + sass@1.82.0: dependencies: chokidar: 4.0.1 immutable: 5.0.3 @@ -16901,12 +17230,12 @@ snapshots: vscode-oniguruma: 1.7.0 vscode-textmate: 5.2.0 - shiki@1.23.1: + shiki@1.24.0: dependencies: - '@shikijs/core': 1.23.1 - '@shikijs/engine-javascript': 1.23.1 - '@shikijs/engine-oniguruma': 1.23.1 - '@shikijs/types': 1.23.1 + '@shikijs/core': 1.24.0 + '@shikijs/engine-javascript': 1.24.0 + '@shikijs/engine-oniguruma': 1.24.0 + '@shikijs/types': 1.24.0 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 @@ -16963,7 +17292,7 @@ snapshots: solid-refresh@0.6.3(solid-js@1.9.3): dependencies: - '@babel/generator': 7.26.2 + '@babel/generator': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/types': 7.26.0 solid-js: 1.9.3 @@ -16997,6 +17326,8 @@ snapshots: statuses@2.0.1: {} + std-env@3.7.0: {} + std-env@3.8.0: {} stream-replace-string@2.0.0: {} @@ -17085,14 +17416,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte2tsx@0.7.22(svelte@5.2.9)(typescript@5.7.2): + svelte2tsx@0.7.22(svelte@5.6.2)(typescript@5.7.2): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.2.9 + svelte: 5.6.2 typescript: 5.7.2 - svelte@5.2.3: + svelte@5.1.16: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -17103,12 +17434,12 @@ snapshots: axobject-query: 4.1.0 esm-env: 1.1.4 esrap: 1.2.2 - is-reference: 3.0.3 + is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.14 + magic-string: 0.30.12 zimmerframe: 1.1.2 - svelte@5.2.9: + svelte@5.6.2: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -17117,8 +17448,8 @@ snapshots: acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - esm-env: 1.1.4 - esrap: 1.2.2 + esm-env: 1.2.1 + esrap: 1.2.3 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.14 @@ -17134,10 +17465,12 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.1.1 + picocolors: 1.1.0 symbol-tree@3.2.4: {} + system-architecture@0.1.0: {} + tailwindcss@3.4.14: dependencies: '@alloc/quick-lru': 5.2.0 @@ -17153,7 +17486,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.1.1 + picocolors: 1.1.0 postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) @@ -17165,7 +17498,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.15: + tailwindcss@3.4.16: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -17176,7 +17509,7 @@ snapshots: glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.6 - lilconfig: 2.1.0 + lilconfig: 3.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 @@ -17327,12 +17660,12 @@ snapshots: dependencies: semver: 7.6.3 - typescript-eslint@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2): + typescript-eslint@8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/parser': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.15.0(jiti@1.21.6) + '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.0) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -17342,14 +17675,26 @@ snapshots: typescript@5.7.2: {} + ufo@1.5.4: {} + uhyphen@0.2.0: {} ultrahtml@1.5.3: {} + uncrypto@0.1.3: {} + undici-types@5.26.5: {} undici@6.21.0: {} + unenv@1.10.0: + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + unicorn-magic@0.1.0: {} unicorn-magic@0.3.0: {} @@ -17446,11 +17791,32 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.1.1(browserslist@4.24.2): + unstorage@1.13.1: dependencies: - browserslist: 4.24.2 + anymatch: 3.1.3 + chokidar: 3.6.0 + citty: 0.1.6 + destr: 2.0.3 + h3: 1.13.0 + listhen: 1.9.0 + lru-cache: 10.4.3 + node-fetch-native: 1.6.4 + ofetch: 1.4.1 + ufo: 1.5.4 + + untun@0.1.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + pathe: 1.1.2 + + update-browserslist-db@1.1.0(browserslist@4.24.0): + dependencies: + browserslist: 4.24.0 escalade: 3.2.0 - picocolors: 1.1.1 + picocolors: 1.1.0 + + uqr@0.1.2: {} uri-js@4.4.1: dependencies: @@ -17484,17 +17850,17 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-hot-client@0.2.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vite-hot-client@0.2.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)): dependencies: - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) - vite-node@2.1.6(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1): + vite-node@2.1.6(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1): dependencies: cac: 6.7.14 debug: 4.3.7 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) transitivePeerDependencies: - '@types/node' - jiti @@ -17509,13 +17875,13 @@ snapshots: - tsx - yaml - vite-node@2.1.8(@types/node@18.19.50)(sass@1.81.0): + vite-node@2.1.8(@types/node@18.19.50)(sass@1.82.0): dependencies: cac: 6.7.14 debug: 4.3.7 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.11(@types/node@18.19.50)(sass@1.81.0) + vite: 5.4.11(@types/node@18.19.50)(sass@1.82.0) transitivePeerDependencies: - '@types/node' - less @@ -17527,10 +17893,10 @@ snapshots: - supports-color - terser - vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vite-plugin-inspect@0.8.8(rollup@4.28.0)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.28.0) debug: 4.3.7 error-stack-parser-es: 0.1.5 fs-extra: 11.2.0 @@ -17538,12 +17904,12 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.0 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) transitivePeerDependencies: - rollup - supports-color - vite-plugin-solid@2.11.0(solid-js@1.9.3)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vite-plugin-solid@2.11.0(solid-js@1.9.3)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)): dependencies: '@babel/core': 7.26.0 '@types/babel__core': 7.20.5 @@ -17551,28 +17917,28 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.3 solid-refresh: 0.6.3(solid-js@1.9.3) - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) - vitefu: 1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) + vitefu: 1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) transitivePeerDependencies: - supports-color - vite-plugin-vue-devtools@7.6.7(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)): + vite-plugin-vue-devtools@7.6.7(rollup@4.28.0)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)): dependencies: - '@vue/devtools-core': 7.6.7(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + '@vue/devtools-core': 7.6.7(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) '@vue/devtools-kit': 7.6.7 '@vue/devtools-shared': 7.6.7 execa: 9.5.2 sirv: 3.0.0 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) - vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) - vite-plugin-vue-inspector: 5.3.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) + vite-plugin-inspect: 0.8.8(rollup@4.28.0)(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) + vite-plugin-vue-inspector: 5.3.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.3.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vite-plugin-vue-inspector@5.3.1(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.0) @@ -17583,7 +17949,7 @@ snapshots: '@vue/compiler-dom': 3.5.13 kolorist: 1.8.0 magic-string: 0.30.14 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) transitivePeerDependencies: - supports-color @@ -17592,36 +17958,36 @@ snapshots: svgo: 3.3.2 vue: 3.5.13(typescript@5.7.2) - vite@5.4.11(@types/node@18.19.50)(sass@1.81.0): + vite@5.4.11(@types/node@18.19.50)(sass@1.82.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.27.4 + rollup: 4.28.0 optionalDependencies: '@types/node': 18.19.50 fsevents: 2.3.3 - sass: 1.81.0 + sass: 1.82.0 - vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1): + vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1): dependencies: esbuild: 0.24.0 postcss: 8.4.49 - rollup: 4.27.4 + rollup: 4.28.0 optionalDependencies: '@types/node': 18.19.50 fsevents: 2.3.3 - jiti: 1.21.6 - sass: 1.81.0 + jiti: 2.4.0 + sass: 1.82.0 yaml: 2.5.1 - vitefu@1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vitefu@1.0.4(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)): optionalDependencies: - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) - vitest@2.1.6(@types/node@18.19.50)(jiti@1.21.6)(jsdom@23.2.0)(sass@1.81.0)(yaml@2.5.1): + vitest@2.1.6(@types/node@18.19.50)(jiti@2.4.0)(jsdom@23.2.0)(sass@1.82.0)(yaml@2.5.1): dependencies: '@vitest/expect': 2.1.6 - '@vitest/mocker': 2.1.6(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + '@vitest/mocker': 2.1.6(vite@6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1)) '@vitest/pretty-format': 2.1.6 '@vitest/runner': 2.1.6 '@vitest/snapshot': 2.1.6 @@ -17630,15 +17996,15 @@ snapshots: chai: 5.1.2 debug: 4.3.7 expect-type: 1.1.0 - magic-string: 0.30.14 + magic-string: 0.30.12 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) - vite-node: 2.1.6(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) + vite: 6.0.1(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) + vite-node: 2.1.6(@types/node@18.19.50)(jiti@2.4.0)(sass@1.82.0)(yaml@2.5.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.50 @@ -17657,10 +18023,10 @@ snapshots: - tsx - yaml - vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0): + vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.82.0): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@18.19.50)(sass@1.81.0)) + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@18.19.50)(sass@1.82.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -17676,8 +18042,8 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@18.19.50)(sass@1.81.0) - vite-node: 2.1.8(@types/node@18.19.50)(sass@1.81.0) + vite: 5.4.11(@types/node@18.19.50)(sass@1.82.0) + vite-node: 2.1.8(@types/node@18.19.50)(sass@1.82.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.50 @@ -17718,12 +18084,12 @@ snapshots: optionalDependencies: '@volar/language-service': 2.4.6 - volar-service-prettier@0.0.61(@volar/language-service@2.4.6)(prettier@3.4.1): + volar-service-prettier@0.0.61(@volar/language-service@2.4.6)(prettier@3.4.2): dependencies: vscode-uri: 3.0.8 optionalDependencies: '@volar/language-service': 2.4.6 - prettier: 3.4.1 + prettier: 3.4.2 volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@2.4.6): dependencies: