diff --git a/adex/package.json b/adex/package.json index 9d44ffd..20a1e26 100644 --- a/adex/package.json +++ b/adex/package.json @@ -64,6 +64,10 @@ "types": "./src/ssr.d.ts", "import": "./src/ssr.js" }, + "./static": { + "types": "./src/static.d.ts", + "import": "./src/static.js" + }, "./head": { "types": "./src/head.d.ts", "import": "./src/head.js" diff --git a/adex/src/static.d.ts b/adex/src/static.d.ts new file mode 100644 index 0000000..98ed05d --- /dev/null +++ b/adex/src/static.d.ts @@ -0,0 +1,43 @@ +import type { IncomingMessage, ServerResponse } from 'node:http' +import type sirv from 'sirv' + +export type StaticPaths = { + assets?: string + islands?: string + client?: string +} + +export type ServeStatic = typeof sirv + +export type StaticMiddleware = ( + req: IncomingMessage, + res: ServerResponse, + next?: (err?: unknown) => void +) => unknown + +/** + * Static plugin contract — default export of `adex/static` and of any module + * passed as `kernel.staticServer`. + */ +export type StaticServer = (options: { + paths?: StaticPaths +}) => StaticMiddleware | StaticMiddleware[] + +export type CreateStaticMiddlewaresOptions = { + paths?: StaticPaths + serve?: ServeStatic + options?: Parameters[1] +} + +/** Adex default static plugin (sirv + URL rewrites). */ +export function createStaticMiddlewares( + options?: CreateStaticMiddlewaresOptions +): StaticMiddleware[] + +declare const defaultStaticPlugin: typeof createStaticMiddlewares +export default defaultStaticPlugin + +/** Virtual module source for `kernel.staticServer` (defaults to `adex/static`). */ +export function resolveStaticServerModuleSource( + staticServer?: false | string +): string diff --git a/adex/src/static.js b/adex/src/static.js new file mode 100644 index 0000000..da8a17b --- /dev/null +++ b/adex/src/static.js @@ -0,0 +1,101 @@ +import { existsSync } from 'node:fs' +import sirv from 'sirv' + +const DEFAULT_SERVE_OPTIONS = { + maxAge: 31536000, + immutable: true, +} + +/** + * Adex's default production static plugin. + * + * Includes sirv plus the `/assets` and `/islands` URL-prefix rewrites that + * sirv needs when rooted at a build output directory. This is what runs when + * `kernel.staticServer` is omitted. + * + * Switch away with `adex({ kernel: { staticServer: './my-static.js' } })` or + * disable with `staticServer: false`. Custom factories do not inherit these + * rewrites — they receive the original `req.url`. + * + * @param {object} [options] + * @param {{ assets?: string, islands?: string, client?: string }} [options.paths] + * @param {typeof sirv} [options.serve] + * @param {Parameters[1]} [options.options] + * @returns {Array<(req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse, next?: Function) => any>} + */ +export function createStaticMiddlewares({ + paths = {}, + serve = sirv, + options = {}, +} = {}) { + const serveOptions = { + ...DEFAULT_SERVE_OPTIONS, + ...options, + } + + const serverAssets = paths.assets + ? serve(paths.assets, serveOptions) + : passthrough + + const islandAssets = + paths.islands && existsSync(paths.islands) + ? serve(paths.islands, serveOptions) + : passthrough + + const clientAssets = + paths.client && existsSync(paths.client) + ? serve(paths.client, serveOptions) + : passthrough + + return [ + async (req, res, next) => { + // sirv is rooted at the directory; strip public URL prefixes for lookup + // @ts-expect-error shared-state between the middlewares + req.__originalUrl = req.url + // @ts-expect-error shared-state between the middlewares + req.url = req.__originalUrl.replace(/(\/?assets\/?)/, '/') + return serverAssets(req, res, next) + }, + async (req, res, next) => { + // @ts-expect-error shared-state between the middlewares + req.url = req.__originalUrl.replace(/(\/?islands\/?)/, '/') + return islandAssets(req, res, next) + }, + async (req, res, next) => { + // @ts-expect-error shared-state between the middlewares + req.url = req.__originalUrl + return clientAssets(req, res, next) + }, + ] +} + +/** Default static plugin entry (same as `createStaticMiddlewares`). */ +export default createStaticMiddlewares + +function passthrough(_req, _res, next) { + next() +} + +/** + * Virtual module source for `virtual:adex:static-server`. + * Resolves which static plugin to use (`adex/static` by default). + * + * @param {false | string | undefined} staticServer + * @returns {string} + */ +export function resolveStaticServerModuleSource(staticServer) { + if (staticServer === false) { + return `export default function staticServer() { + return [] +} +` + } + + if (typeof staticServer === 'string' && staticServer.length > 0) { + return `export { default } from ${JSON.stringify(staticServer)} +` + } + + return `export { default } from 'adex/static' +` +} diff --git a/adex/src/vite.d.ts b/adex/src/vite.d.ts index a52cf1f..5e960ed 100644 --- a/adex/src/vite.d.ts +++ b/adex/src/vite.d.ts @@ -3,11 +3,24 @@ import type { Options as FontOptions } from './fonts.js' export type Adapters = 'node' +export interface AdexKernelOptions { + /** + * Production static plugin. + * - omitted: adex default (`adex/static` — sirv + `/assets`/`/islands` rewrites) + * - `false`: no static middlewares + * - string: module id whose default export is `({ paths }) => middleware | middleware[]` + * + * Custom plugins own mounting and see the original `req.url` (no adex rewrites). + */ + staticServer?: false | string +} + export interface AdexOptions { fonts?: FontOptions islands?: boolean adapter?: Adapters ssr?: boolean + kernel?: AdexKernelOptions __clientConfig?: UserConfig } diff --git a/adex/src/vite.js b/adex/src/vite.js index 25cdbe0..1ed0887 100644 --- a/adex/src/vite.js +++ b/adex/src/vite.js @@ -17,6 +17,7 @@ import { dirname, join, resolve } from 'path' import { fileURLToPath } from 'url' import { build, mergeConfig } from 'vite' import { fonts as addFontsPlugin } from './fonts.js' +import { resolveStaticServerModuleSource } from './static.js' const __dirname = dirname(fileURLToPath(import.meta.url)) const cwd = process.cwd() @@ -27,6 +28,77 @@ const adapterMap = { node: 'adex-adapter-node', } +/** + * @param {string} adapter + * @returns {string} + */ +function buildServerEntrySource(adapter) { + return `import { createServer } from '${adapterMap[adapter]}' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { existsSync, readFileSync } from 'node:fs' +import { env } from 'adex/env' +import staticServer from 'virtual:adex:static-server' + +import 'virtual:adex:font.css' +import 'virtual:adex:global.css' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +const PORT = parseInt(env.get('PORT', '3000'), 10) +const HOST = env.get('HOST', 'localhost') + +const paths = { + assets: join(__dirname, './assets'), + islands: join(__dirname, './islands'), + client: join(__dirname, '../client'), +} + +function getServerManifest() { + const manifestPath = join(__dirname, 'manifest.json') + if (existsSync(manifestPath)) { + const manifestFile = readFileSync(manifestPath, 'utf8') + return parseManifest(manifestFile) + } + return {} +} + +function getClientManifest() { + const manifestPath = join(__dirname, '../client/manifest.json') + if (existsSync(manifestPath)) { + const manifestFile = readFileSync(manifestPath, 'utf8') + return parseManifest(manifestFile) + } + return {} +} + +function parseManifest(manifestString) { + try { + const manifestJSON = JSON.parse(manifestString) + return manifestJSON + } catch (err) { + return {} + } +} + +const server = createServer({ + port: PORT, + host: HOST, + adex: { + manifests: { server: getServerManifest(), client: getClientManifest() }, + paths, + staticServer, + }, +}) + +if ('run' in server) { + server.run() +} + +export default server.fetch +` +} + /** * @param {import("./vite.js").AdexOptions} [options] * @returns {(import("vite").Plugin)[]} @@ -36,7 +108,12 @@ export function adex({ islands = false, ssr = true, adapter: adapter = 'node', + kernel = {}, } = {}) { + const staticServerSource = resolveStaticServerModuleSource( + kernel.staticServer + ) + // @ts-expect-error probably because of the `.filter` return [ preactPages({ @@ -66,71 +143,8 @@ export function adex({ 'virtual:adex:handler', readFileSync(join(__dirname, '../runtime/handler.js'), 'utf8') ), - createVirtualModule( - 'virtual:adex:server', - `import { createServer } from '${adapterMap[adapter]}' - import { dirname, join } from 'node:path' - import { fileURLToPath } from 'node:url' - import { existsSync, readFileSync } from 'node:fs' - import { env } from 'adex/env' - - import 'virtual:adex:font.css' - import 'virtual:adex:global.css' - - const __dirname = dirname(fileURLToPath(import.meta.url)) - - const PORT = parseInt(env.get('PORT', '3000'), 10) - const HOST = env.get('HOST', 'localhost') - - const paths = { - assets: join(__dirname, './assets'), - islands: join(__dirname, './islands'), - client: join(__dirname, '../client'), - } - - function getServerManifest() { - const manifestPath = join(__dirname, 'manifest.json') - if (existsSync(manifestPath)) { - const manifestFile = readFileSync(manifestPath, 'utf8') - return parseManifest(manifestFile) - } - return {} - } - - function getClientManifest() { - const manifestPath = join(__dirname, '../client/manifest.json') - if (existsSync(manifestPath)) { - const manifestFile = readFileSync(manifestPath, 'utf8') - return parseManifest(manifestFile) - } - return {} - } - - function parseManifest(manifestString) { - try { - const manifestJSON = JSON.parse(manifestString) - return manifestJSON - } catch (err) { - return {} - } - } - - const server = createServer({ - port: PORT, - host: HOST, - adex:{ - manifests:{server:getServerManifest(),client:getClientManifest()}, - paths, - } - }) - - if ('run' in server) { - server.run() - } - - export default server.fetch - ` - ), + createVirtualModule('virtual:adex:static-server', staticServerSource), + createVirtualModule('virtual:adex:server', buildServerEntrySource(adapter)), addFontsPlugin(fonts), adexDevServer({ islands }), adexBuildPrep({ islands }), @@ -138,7 +152,7 @@ export function adex({ islands && adexIslandsBuilder(), // SSR/Render Server Specific plugins - ssr && adexServerBuilder({ fonts, adapter, islands }), + ssr && adexServerBuilder({ fonts, adapter, islands, kernel }), ].filter(Boolean) } @@ -582,11 +596,15 @@ function adexDevServer({ islands = false } = {}) { * @param {import("./fonts.js").Options} options.fonts * @param {string} options.adapter * @param {boolean} options.islands + * @param {import("./vite.js").AdexKernelOptions} [options.kernel] * @returns {import("vite").Plugin} */ -function adexServerBuilder({ fonts, adapter, islands }) { +function adexServerBuilder({ fonts, adapter, islands, kernel = {} }) { let input = 'src/entry-server.js' let cfg + const staticServerSource = resolveStaticServerModuleSource( + kernel.staticServer + ) return { name: `adex-server`, enforce: 'pre', @@ -649,70 +667,10 @@ function adexServerBuilder({ fonts, adapter, islands }) { 'virtual:adex:handler', readFileSync(join(__dirname, '../runtime/handler.js'), 'utf8') ), + createVirtualModule('virtual:adex:static-server', staticServerSource), createVirtualModule( 'virtual:adex:server', - `import { createServer } from '${adapterMap[adapter]}' - import { dirname, join } from 'node:path' - import { fileURLToPath } from 'node:url' - import { existsSync, readFileSync } from 'node:fs' - import { env } from 'adex/env' - - import 'virtual:adex:font.css' - import 'virtual:adex:global.css' - - const __dirname = dirname(fileURLToPath(import.meta.url)) - - const PORT = parseInt(env.get('PORT', '3000'), 10) - const HOST = env.get('HOST', 'localhost') - - const paths = { - assets: join(__dirname, './assets'), - islands: join(__dirname, './islands'), - client: join(__dirname, '../client'), - } - - function getServerManifest() { - const manifestPath = join(__dirname, 'manifest.json') - if (existsSync(manifestPath)) { - const manifestFile = readFileSync(manifestPath, 'utf8') - return parseManifest(manifestFile) - } - return {} - } - - function getClientManifest() { - const manifestPath = join(__dirname, '../client/manifest.json') - if (existsSync(manifestPath)) { - const manifestFile = readFileSync(manifestPath, 'utf8') - return parseManifest(manifestFile) - } - return {} - } - - function parseManifest(manifestString) { - try { - const manifestJSON = JSON.parse(manifestString) - return manifestJSON - } catch (err) { - return {} - } - } - - const server = createServer({ - port: PORT, - host: HOST, - adex:{ - manifests:{server:getServerManifest(),client:getClientManifest()}, - paths, - } - }) - - if ('run' in server) { - server.run() - } - - export default server.fetch - ` + buildServerEntrySource(adapter) ), addFontsPlugin(fonts), islands && adexIslandsBuilder(), diff --git a/adex/tests/static.spec.js b/adex/tests/static.spec.js new file mode 100644 index 0000000..634f5da --- /dev/null +++ b/adex/tests/static.spec.js @@ -0,0 +1,128 @@ +import { describe, it } from 'node:test' +import assert from 'node:assert' +import { mkdtempSync, writeFileSync, mkdirSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { use as useMiddleware } from '@barelyhuman/tiny-use' +import { + createStaticMiddlewares, + resolveStaticServerModuleSource, +} from '../src/static.js' + +describe('resolveStaticServerModuleSource', () => { + it('defaults to the adex/static plugin', () => { + assert.strictEqual( + resolveStaticServerModuleSource(), + `export { default } from 'adex/static'\n` + ) + assert.strictEqual( + resolveStaticServerModuleSource(undefined), + `export { default } from 'adex/static'\n` + ) + }) + + it('disables with an empty middleware list when false', () => { + const source = resolveStaticServerModuleSource(false) + assert.match(source, /export default function staticServer/) + assert.match(source, /return \[\]/) + assert.doesNotMatch(source, /sirv/) + assert.doesNotMatch(source, /adex\/static/) + }) + + it('re-exports a custom module id', () => { + assert.strictEqual( + resolveStaticServerModuleSource('./src/my-static.js'), + `export { default } from "./src/my-static.js"\n` + ) + }) +}) + +describe('createStaticMiddlewares', () => { + it('invokes a custom serve factory for existing paths', () => { + const root = mkdtempSync(join(tmpdir(), 'adex-static-')) + const assets = join(root, 'assets') + const client = join(root, 'client') + mkdirSync(assets) + mkdirSync(client) + writeFileSync(join(assets, 'a.txt'), 'a') + writeFileSync(join(client, 'c.txt'), 'c') + + /** @type {string[]} */ + const servedDirs = [] + const serve = (dir, _opts) => { + servedDirs.push(dir) + return (_req, _res, next) => next() + } + + createStaticMiddlewares({ + paths: { assets, client, islands: join(root, 'missing-islands') }, + serve, + }) + + assert.deepStrictEqual(servedDirs, [assets, client]) + }) + + it('falls through when serve always calls next', async () => { + const root = mkdtempSync(join(tmpdir(), 'adex-static-')) + const assets = join(root, 'assets') + mkdirSync(assets) + writeFileSync(join(assets, 'a.txt'), 'a') + + const serve = () => (_req, _res, next) => next() + let hitApp = false + + const handler = useMiddleware( + ...createStaticMiddlewares({ paths: { assets }, serve }), + async (_req, _res) => { + hitApp = true + } + ) + + await handler({ url: '/assets/a.txt' }, {}) + assert.strictEqual(hitApp, true) + }) + + it('rewrites asset URLs only inside the default stack', async () => { + /** @type {string[]} */ + const seenUrls = [] + const serve = () => (req, _res, next) => { + seenUrls.push(req.url) + next() + } + + const handler = useMiddleware( + ...createStaticMiddlewares({ + paths: { assets: '/tmp/assets-does-not-need-to-exist-for-serve-mock' }, + serve, + }), + async () => {} + ) + + // paths.assets is truthy so serve() is used even if dir missing on disk + await handler({ url: '/assets/app.js' }, {}) + assert.deepStrictEqual(seenUrls, ['/app.js']) + }) +}) + +describe('custom kernel.staticServer contract', () => { + it('receives original URLs with no adex rewrite when replacing the factory', async () => { + /** @type {string[]} */ + const seenUrls = [] + + const staticServer = ({ paths }) => { + assert.ok(paths) + return (req, _res, next) => { + seenUrls.push(req.url) + next() + } + } + + const middlewares = staticServer({ paths: { assets: '/x' } }) + const list = Array.isArray(middlewares) ? middlewares : [middlewares] + + const handler = useMiddleware(...list, async () => {}) + + await handler({ url: '/assets/app.js' }, {}) + assert.deepStrictEqual(seenUrls, ['/assets/app.js']) + }) +}) diff --git a/packages/adapters/node/lib/index.d.ts b/packages/adapters/node/lib/index.d.ts index dd955a7..ee5a8a4 100644 --- a/packages/adapters/node/lib/index.d.ts +++ b/packages/adapters/node/lib/index.d.ts @@ -1,6 +1,40 @@ +import type { IncomingMessage, ServerResponse } from 'node:http' + +type StaticMiddleware = ( + req: IncomingMessage, + res: ServerResponse, + next?: (err?: unknown) => void +) => unknown + +type StaticServer = (options: { + paths?: { + assets?: string + islands?: string + client?: string + } +}) => StaticMiddleware | StaticMiddleware[] + +type AdexServerOptions = { + manifests?: { + server?: Record + client?: Record + } + paths?: { + assets?: string + islands?: string + client?: string + } + /** From `virtual:adex:static-server` — `({ paths }) => middleware | middleware[]`. */ + staticServer?: StaticServer +} + type ServerOut = { - run: () => any + run: () => unknown fetch: undefined } -export const createServer: ({ port: number, host: string }) => ServerOut +export const createServer: (options?: { + port?: number | string + host?: string + adex?: AdexServerOptions +}) => ServerOut diff --git a/packages/adapters/node/lib/index.js b/packages/adapters/node/lib/index.js index efe2f1b..c589ae3 100644 --- a/packages/adapters/node/lib/index.js +++ b/packages/adapters/node/lib/index.js @@ -1,49 +1,19 @@ import { existsSync } from 'node:fs' import http from 'node:http' -import { sirv, useMiddleware } from 'adex/ssr' +import { useMiddleware } from 'adex/ssr' +import { createStaticMiddlewares } from 'adex/static' import { handler } from 'virtual:adex:handler' let islandMode = false -function createHandler({ manifests, paths }) { - const serverAssets = sirv(paths.assets, { - maxAge: 31536000, - immutable: true, - onNoMatch: defaultHandler, - }) - - let islandsWereGenerated = existsSync(paths.islands) - - // @ts-ignore - let islandAssets = (req, res, next) => { - next() - } - - if (islandsWereGenerated) { - islandMode = true - islandAssets = sirv(paths.islands, { - maxAge: 31536000, - immutable: true, - onNoMatch: defaultHandler, - }) - } - - let clientWasGenerated = existsSync(paths.client) - - // @ts-ignore - let clientAssets = (req, res, next) => { - next() - } - - if (clientWasGenerated) { - clientAssets = sirv(paths.client, { - maxAge: 31536000, - immutable: true, - onNoMatch: defaultHandler, - }) - } +function createHandler({ + manifests, + paths, + staticServer = createStaticMiddlewares, +}) { + islandMode = Boolean(paths.islands && existsSync(paths.islands)) async function defaultHandler(req, res) { const { html: template, pageRoute, serverHandler } = await handler(req, res) @@ -64,28 +34,12 @@ function createHandler({ manifests, paths }) { res.end() } - return useMiddleware( - async (req, res, next) => { - // @ts-expect-error shared-state between the middlewares - req.__originalUrl = req.url - // @ts-expect-error shared-state between the middlewares - req.url = req.__originalUrl.replace(/(\/?assets\/?)/, '/') - return serverAssets(req, res, next) - }, - async (req, res, next) => { - // @ts-expect-error shared-state between the middlewares - req.url = req.__originalUrl.replace(/(\/?islands\/?)/, '/') - return islandAssets(req, res, next) - }, - async (req, res, next) => { - return clientAssets(req, res, next) - }, - async (req, res) => { - // @ts-expect-error shared-state between the middlewares - req.url = req.__originalUrl - return defaultHandler(req, res) - } - ) + const staticMiddlewares = staticServer({ paths }) + const list = Array.isArray(staticMiddlewares) + ? staticMiddlewares + : [staticMiddlewares] + + return useMiddleware(...list, defaultHandler) } // function parseManifest(manifestString) { diff --git a/playground/package.json b/playground/package.json index 8a81e53..81fb41c 100644 --- a/playground/package.json +++ b/playground/package.json @@ -26,7 +26,7 @@ "postcss": "^8.5.9", "prettier": "^3.8.1", "tailwindcss": "^3.4.19", - "vite": "^6.4.2" + "vite": "^6.4.3" }, "prettier": "@barelyhuman/prettier-config" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c21832..5628a34 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,13 +79,13 @@ importers: version: 1.15.0 preact: specifier: ^10.22.0 - version: 10.24.2 + version: 10.29.1 preact-iso: specifier: ^2.9.0 - version: 2.9.0(preact-render-to-string@6.5.5(preact@10.24.2))(preact@10.24.2) + version: 2.9.0(preact-render-to-string@6.5.5(preact@10.29.1))(preact@10.29.1) preact-render-to-string: specifier: ^6.5.5 - version: 6.5.5(preact@10.24.2) + version: 6.5.5(preact@10.29.1) regexparam: specifier: ^3.0.0 version: 3.0.0 @@ -107,16 +107,16 @@ importers: version: 1.1.0 '@preact/preset-vite': specifier: 'catalog:' - version: 2.10.5(@babel/core@7.24.7)(preact@10.24.2)(rollup@4.60.1)(vite@8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 2.10.5(@babel/core@7.24.7)(preact@10.29.1)(rollup@4.60.1)(vite@8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) '@types/node': specifier: ^20.14.10 - version: 20.16.10 + version: 20.19.39 adex-adapter-node: specifier: ^0.0.17 version: 0.0.17 autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.5.9) + version: 10.4.27(postcss@8.5.9) c8: specifier: 11.0.0 version: 11.0.0 @@ -134,13 +134,13 @@ importers: version: 0.8.0 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.8.1 tailwindcss: specifier: ^3.4.19 version: 3.4.19 vite: specifier: ^8.0.7 - version: 8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) + version: 8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) adex/tests/fixtures/minimal: dependencies: @@ -224,7 +224,7 @@ importers: version: 1.1.0 '@preact/preset-vite': specifier: 'catalog:' - version: 2.10.5(@babel/core@7.24.7)(preact@10.29.1)(rollup@4.60.1)(vite@6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)) + version: 2.10.5(@babel/core@7.24.7)(preact@10.29.1)(rollup@4.60.1)(vite@6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)) '@tailwindcss/forms': specifier: ^0.5.11 version: 0.5.11(tailwindcss@3.4.19) @@ -247,8 +247,8 @@ importers: specifier: ^3.4.19 version: 3.4.19 vite: - specifier: ^6.4.2 - version: 6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) + specifier: ^6.4.3 + version: 6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) packages: @@ -1323,9 +1323,6 @@ packages: '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, tarball: https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz} - '@types/node@20.16.10': - resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==, tarball: https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz} - '@types/node@20.19.39': resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==, tarball: https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz} @@ -1430,13 +1427,6 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==, tarball: https://registry.npmjs.org/astring/-/astring-1.9.0.tgz} hasBin: true - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==, tarball: https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - autoprefixer@10.4.27: resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==, tarball: https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz} engines: {node: ^10 || ^12 || >=14} @@ -1480,11 +1470,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, tarball: https://registry.npmjs.org/braces/-/braces-3.0.3.tgz} engines: {node: '>=8'} - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==, tarball: https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.28.2: resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==, tarball: https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1517,9 +1502,6 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, tarball: https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz} engines: {node: '>= 6'} - caniuse-lite@1.0.30001667: - resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz} - caniuse-lite@1.0.30001787: resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz} @@ -1632,15 +1614,6 @@ packages: engines: {node: '>=4'} hasBin: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, tarball: https://registry.npmjs.org/debug/-/debug-4.4.0.tgz} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, tarball: https://registry.npmjs.org/debug/-/debug-4.4.3.tgz} engines: {node: '>=6.0'} @@ -1710,9 +1683,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, tarball: https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz} - electron-to-chromium@1.5.32: - resolution: {integrity: sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz} - electron-to-chromium@1.5.334: resolution: {integrity: sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.334.tgz} @@ -1743,10 +1713,6 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, tarball: https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz} - engines: {node: '>=6'} - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, tarball: https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz} engines: {node: '>=6'} @@ -1815,9 +1781,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, tarball: https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz} engines: {node: '>=14'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, tarball: https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz} - fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==, tarball: https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz} @@ -1878,10 +1841,6 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@13.0.0: - resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==, tarball: https://registry.npmjs.org/glob/-/glob-13.0.0.tgz} - engines: {node: 20 || >=22} - glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==, tarball: https://registry.npmjs.org/glob/-/glob-13.0.6.tgz} engines: {node: 18 || 20 || >=22} @@ -2174,10 +2133,6 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==, tarball: https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz} engines: {node: '>= 12.0.0'} - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==, tarball: https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz} - engines: {node: '>=14'} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, tarball: https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz} engines: {node: '>=14'} @@ -2204,10 +2159,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz} - lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz} - engines: {node: 20 || >=22} - lru-cache@11.3.3: resolution: {integrity: sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz} engines: {node: 20 || >=22} @@ -2276,10 +2227,6 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, tarball: https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, tarball: https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==, tarball: https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz} engines: {node: '>=16 || 14 >=14.17'} @@ -2343,9 +2290,6 @@ packages: node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==, tarball: https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==, tarball: https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz} - node-releases@2.0.37: resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==, tarball: https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz} @@ -2366,10 +2310,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz} engines: {node: '>=0.10.0'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, tarball: https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz} - engines: {node: '>=0.10.0'} - npm-bundled@5.0.0: resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==, tarball: https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz} engines: {node: ^20.17.0 || >=22.9.0} @@ -2493,17 +2433,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, tarball: https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, tarball: https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz} - engines: {node: 20 || >=22} - path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==, tarball: https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz} engines: {node: 18 || 20 || >=22} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==, tarball: https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, tarball: https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz} @@ -2585,11 +2518,6 @@ packages: preact@10.29.1: resolution: {integrity: sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==, tarball: https://registry.npmjs.org/preact/-/preact-10.29.1.tgz} - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, tarball: https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz} - engines: {node: '>=14'} - hasBin: true - prettier@3.8.1: resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, tarball: https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz} engines: {node: '>=14'} @@ -2879,9 +2807,6 @@ packages: unconfig@7.5.0: resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==, tarball: https://registry.npmjs.org/unconfig/-/unconfig-7.5.0.tgz} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==, tarball: https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz} - undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, tarball: https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz} @@ -2902,12 +2827,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, tarball: https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==, tarball: https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, tarball: https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz} hasBin: true @@ -2973,6 +2892,46 @@ packages: yaml: optional: true + vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==, tarball: https://registry.npmjs.org/vite/-/vite-6.4.3.tgz} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: '>=2.8.3' + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@8.0.7: resolution: {integrity: sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw==, tarball: https://registry.npmjs.org/vite/-/vite-8.0.7.tgz} engines: {node: ^20.19.0 || >=22.12.0} @@ -3170,7 +3129,7 @@ snapshots: dependencies: '@babel/compat-data': 7.24.7 '@babel/helper-validator-option': 7.24.7 - browserslist: 4.24.0 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -3540,7 +3499,7 @@ snapshots: '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 '@isaacs/string-locale-compare@1.1.0': {} @@ -3786,7 +3745,7 @@ snapshots: dependencies: '@npmcli/name-from-folder': 4.0.0 '@npmcli/package-json': 7.0.5 - glob: 13.0.0 + glob: 13.0.6 minimatch: 10.2.5 '@npmcli/metavuln-calculator@9.0.3': @@ -3806,7 +3765,7 @@ snapshots: '@npmcli/package-json@7.0.5': dependencies: '@npmcli/git': 7.0.2 - glob: 13.0.0 + glob: 13.0.6 hosted-git-info: 9.0.2 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 @@ -3921,57 +3880,57 @@ snapshots: - rollup - supports-color - '@preact/preset-vite@2.10.5(@babel/core@7.24.7)(preact@10.24.2)(rollup@4.60.1)(vite@8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': + '@preact/preset-vite@2.10.5(@babel/core@7.24.7)(preact@10.24.2)(rollup@4.60.1)(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.24.7) - '@prefresh/vite': 2.4.12(preact@10.24.2)(vite@8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) + '@prefresh/vite': 2.4.12(preact@10.24.2)(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) '@rollup/pluginutils': 5.3.0(rollup@4.60.1) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.7) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) - vite-prerender-plugin: 0.5.13(vite@8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) + vite: 8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) + vite-prerender-plugin: 0.5.13(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact - rollup - supports-color - '@preact/preset-vite@2.10.5(@babel/core@7.24.7)(preact@10.24.2)(rollup@4.60.1)(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': + '@preact/preset-vite@2.10.5(@babel/core@7.24.7)(preact@10.29.1)(rollup@4.60.1)(vite@6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.24.7) - '@prefresh/vite': 2.4.12(preact@10.24.2)(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)) '@rollup/pluginutils': 5.3.0(rollup@4.60.1) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.7) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) - vite-prerender-plugin: 0.5.13(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) + vite: 6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) + vite-prerender-plugin: 0.5.13(vite@6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact - rollup - supports-color - '@preact/preset-vite@2.10.5(@babel/core@7.24.7)(preact@10.29.1)(rollup@4.60.1)(vite@6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3))': + '@preact/preset-vite@2.10.5(@babel/core@7.24.7)(preact@10.29.1)(rollup@4.60.1)(vite@8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.24.7) - '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) '@rollup/pluginutils': 5.3.0(rollup@4.60.1) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.7) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) - vite-prerender-plugin: 0.5.13(vite@6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)) + vite: 8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) + vite-prerender-plugin: 0.5.13(vite@8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -4009,7 +3968,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@prefresh/vite@2.4.12(preact@10.24.2)(vite@8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': + '@prefresh/vite@2.4.12(preact@10.24.2)(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@babel/core': 7.24.7 '@prefresh/babel-plugin': 0.5.3 @@ -4017,23 +3976,23 @@ snapshots: '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.24.2 - vite: 8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) transitivePeerDependencies: - supports-color - '@prefresh/vite@2.4.12(preact@10.24.2)(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': + '@prefresh/vite@2.4.12(preact@10.29.1)(vite@6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.24.7 '@prefresh/babel-plugin': 0.5.3 - '@prefresh/core': 1.5.2(preact@10.24.2) + '@prefresh/core': 1.5.2(preact@10.29.1) '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 - preact: 10.24.2 - vite: 8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) + preact: 10.29.1 + vite: 6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - '@prefresh/vite@2.4.12(preact@10.29.1)(vite@6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3))': + '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@babel/core': 7.24.7 '@prefresh/babel-plugin': 0.5.3 @@ -4041,7 +4000,7 @@ snapshots: '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.29.1 - vite: 6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) transitivePeerDependencies: - supports-color @@ -4255,10 +4214,6 @@ snapshots: '@types/istanbul-lib-coverage@2.0.6': {} - '@types/node@20.16.10': - dependencies: - undici-types: 6.19.8 - '@types/node@20.19.39': dependencies: undici-types: 6.21.0 @@ -4308,7 +4263,7 @@ snapshots: agent-base@7.1.1: dependencies: - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -4339,16 +4294,6 @@ snapshots: astring@1.9.0: {} - autoprefixer@10.4.20(postcss@8.5.9): - dependencies: - browserslist: 4.24.0 - caniuse-lite: 1.0.30001667 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.0 - postcss: 8.5.9 - postcss-value-parser: 4.2.0 - autoprefixer@10.4.27(postcss@8.5.9): dependencies: browserslist: 4.28.2 @@ -4388,13 +4333,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.0: - dependencies: - caniuse-lite: 1.0.30001667 - electron-to-chromium: 1.5.32 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.24.0) - browserslist@4.28.2: dependencies: baseline-browser-mapping: 2.10.16 @@ -4435,9 +4373,9 @@ snapshots: dependencies: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 - glob: 13.0.0 + glob: 13.0.6 lru-cache: 11.3.3 - minipass: 7.1.2 + minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -4446,8 +4384,6 @@ snapshots: camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001667: {} - caniuse-lite@1.0.30001787: {} chokidar@3.6.0: @@ -4572,10 +4508,6 @@ snapshots: cssesc@3.0.0: {} - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -4626,8 +4558,6 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.32: {} - electron-to-chromium@1.5.334: {} emoji-regex@10.4.0: {} @@ -4699,8 +4629,6 @@ snapshots: '@esbuild/win32-x64': 0.27.2 optional: true - escalade@3.1.2: {} - escalade@3.2.0: {} estree-walker@2.0.2: {} @@ -4779,8 +4707,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fraction.js@4.3.7: {} - fraction.js@5.3.4: {} fs-extra@11.3.4: @@ -4791,7 +4717,7 @@ snapshots: fs-minipass@3.0.3: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 fsevents@2.3.3: optional: true @@ -4821,7 +4747,7 @@ snapshots: glob-bin@1.0.0: dependencies: foreground-child: 3.3.1 - glob: 13.0.0 + glob: 13.0.6 jackspeak: 4.1.1 package-json-from-dist: 1.0.1 @@ -4838,15 +4764,9 @@ snapshots: foreground-child: 3.3.1 jackspeak: 4.1.1 minimatch: 10.2.5 - minipass: 7.1.2 + minipass: 7.1.3 package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 - - glob@13.0.0: - dependencies: - minimatch: 10.2.5 - minipass: 7.1.2 - path-scurry: 2.0.0 + path-scurry: 2.0.2 glob@13.0.6: dependencies: @@ -4896,14 +4816,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -5090,8 +5010,6 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - lilconfig@3.1.2: {} - lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -5112,8 +5030,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.0.2: {} - lru-cache@11.3.3: {} lru-cache@5.1.1: @@ -5135,7 +5051,7 @@ snapshots: '@npmcli/redact': 4.0.0 cacache: 20.0.4 http-cache-semantics: 4.1.1 - minipass: 7.1.2 + minipass: 7.1.3 minipass-fetch: 5.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -5166,11 +5082,11 @@ snapshots: minipass-collect@2.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass-fetch@5.0.2: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass-sized: 2.0.0 minizlib: 3.1.0 optionalDependencies: @@ -5186,19 +5102,17 @@ snapshots: minipass-sized@2.0.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass@3.3.6: dependencies: yallist: 4.0.0 - minipass@7.1.2: {} - minipass@7.1.3: {} minizlib@3.1.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mri@1.2.0: {} @@ -5252,8 +5166,6 @@ snapshots: css-select: 5.1.0 he: 1.2.0 - node-releases@2.0.18: {} - node-releases@2.0.37: {} node-stream-zip@1.15.0: {} @@ -5270,8 +5182,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-range@0.1.2: {} - npm-bundled@5.0.0: dependencies: npm-normalize-package-bin: 5.0.0 @@ -5306,7 +5216,7 @@ snapshots: '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 make-fetch-happen: 15.0.5 - minipass: 7.1.2 + minipass: 7.1.3 minipass-fetch: 5.0.2 minizlib: 3.1.0 npm-package-arg: 13.0.2 @@ -5374,7 +5284,7 @@ snapshots: '@npmcli/run-script': 10.0.4 cacache: 20.0.4 fs-minipass: 3.0.3 - minipass: 7.1.2 + minipass: 7.1.3 npm-package-arg: 13.0.2 npm-packlist: 10.0.4 npm-pick-manifest: 11.0.3 @@ -5411,18 +5321,11 @@ snapshots: path-parse@1.0.7: {} - path-scurry@2.0.0: - dependencies: - lru-cache: 11.0.2 - minipass: 7.1.2 - path-scurry@2.0.2: dependencies: lru-cache: 11.3.3 minipass: 7.1.3 - picocolors@1.1.0: {} - picocolors@1.1.1: {} picomatch@4.0.4: {} @@ -5449,7 +5352,7 @@ snapshots: postcss-load-config@4.0.2(postcss@8.5.9): dependencies: - lilconfig: 3.1.2 + lilconfig: 3.1.3 yaml: 2.8.3 optionalDependencies: postcss: 8.5.9 @@ -5477,21 +5380,19 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact-iso@2.9.0(preact-render-to-string@6.5.5(preact@10.24.2))(preact@10.24.2): + preact-iso@2.9.0(preact-render-to-string@6.5.5(preact@10.29.1))(preact@10.29.1): dependencies: - preact: 10.24.2 - preact-render-to-string: 6.5.5(preact@10.24.2) + preact: 10.29.1 + preact-render-to-string: 6.5.5(preact@10.29.1) - preact-render-to-string@6.5.5(preact@10.24.2): + preact-render-to-string@6.5.5(preact@10.29.1): dependencies: - preact: 10.24.2 + preact: 10.29.1 preact@10.24.2: {} preact@10.29.1: {} - prettier@3.5.3: {} - prettier@3.8.1: {} pretty-format@29.7.0: @@ -5649,7 +5550,7 @@ snapshots: socks-proxy-agent@8.0.4: dependencies: agent-base: 7.1.1 - debug: 4.4.0 + debug: 4.4.3 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -5692,7 +5593,7 @@ snapshots: ssri@13.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 stack-trace@1.0.0-pre2: {} @@ -5771,7 +5672,7 @@ snapshots: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.1.0 yallist: 5.0.0 @@ -5841,8 +5742,6 @@ snapshots: quansync: 1.0.0 unconfig-core: 7.5.0 - undici-types@6.19.8: {} - undici-types@6.20.0: optional: true @@ -5862,12 +5761,6 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.1.0(browserslist@4.24.0): - dependencies: - browserslist: 4.24.0 - escalade: 3.1.2 - picocolors: 1.1.1 - update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: browserslist: 4.28.2 @@ -5889,7 +5782,7 @@ snapshots: validate-npm-package-name@7.0.2: {} - vite-prerender-plugin@0.5.13(vite@6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)): + vite-prerender-plugin@0.5.13(vite@6.4.2(@types/node@22.13.16)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -5897,9 +5790,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@22.13.16)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) - vite-prerender-plugin@0.5.13(vite@6.4.2(@types/node@22.13.16)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)): + vite-prerender-plugin@0.5.13(vite@6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -5907,9 +5800,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 6.4.2(@types/node@22.13.16)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3) - vite-prerender-plugin@0.5.13(vite@8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)): + vite-prerender-plugin@0.5.13(vite@8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -5917,7 +5810,7 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) vite-prerender-plugin@0.5.13(vite@8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3)): dependencies: @@ -5929,7 +5822,7 @@ snapshots: stack-trace: 1.0.0-pre2 vite: 8.0.7(@types/node@22.13.16)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3) - vite@6.4.2(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3): + vite@6.4.2(@types/node@22.13.16)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -5938,13 +5831,13 @@ snapshots: rollup: 4.60.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 22.13.16 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 yaml: 2.8.3 - vite@6.4.2(@types/node@22.13.16)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3): + vite@6.4.3(@types/node@20.19.39)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.3): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -5953,13 +5846,13 @@ snapshots: rollup: 4.60.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.13.16 + '@types/node': 20.19.39 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 yaml: 2.8.3 - vite@8.0.7(@types/node@20.16.10)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3): + vite@8.0.7(@types/node@20.19.39)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -5967,7 +5860,7 @@ snapshots: rolldown: 1.0.0-rc.13 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.16.10 + '@types/node': 20.19.39 esbuild: 0.27.2 fsevents: 2.3.3 jiti: 2.6.1 @@ -6066,7 +5959,7 @@ snapshots: yargs@18.0.0: dependencies: cliui: 9.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 string-width: 7.2.0 y18n: 5.0.8