diff --git a/docs/test-dev.test.ts b/docs/test-dev.test2.ts similarity index 100% rename from docs/test-dev.test.ts rename to docs/test-dev.test2.ts diff --git a/docs/test-preview.test.ts b/docs/test-preview.test2.ts similarity index 100% rename from docs/test-preview.test.ts rename to docs/test-preview.test2.ts diff --git a/example/app-cloudflare/package.json b/example/app-cloudflare/package.json index 25988ca..170f5d7 100644 --- a/example/app-cloudflare/package.json +++ b/example/app-cloudflare/package.json @@ -16,10 +16,10 @@ "@photonjs/core": "workspace:", "typescript": "^5.8.3", "vite": "^6.3.5", - "wrangler": "^4.15.1" + "wrangler": "^4.19.1" }, "dependencies": { - "@universal-middleware/core": "^0.4.7", + "@universal-middleware/core": "^0.4.9", "awesome-framework": "workspace:", "hono": "^4.7.8" } diff --git a/example/app-cloudflare/testRun.ts b/example/app-cloudflare/testRun.ts index a6411f2..3d21a51 100644 --- a/example/app-cloudflare/testRun.ts +++ b/example/app-cloudflare/testRun.ts @@ -25,6 +25,11 @@ function testRun(cmd: `pnpm run ${string}`) { expect(await response.text()).toBe('The API Route') }) + test('/standalone', async () => { + const response: Response = await fetch(`${getServerUrl()}/standalone`) + expect(await response.text()).toBe('The /standalone Route') + }) + test('/bar', async () => { const response: Response = await fetch(`${getServerUrl()}/bar`) expect(await response.text()).toBe('bar') diff --git a/example/app-cloudflare/vite.config.ts b/example/app-cloudflare/vite.config.ts index 4fc9485..238300e 100644 --- a/example/app-cloudflare/vite.config.ts +++ b/example/app-cloudflare/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// /* The Vite plugin cloudflare() will be replaced by this: import cloudflare from '@photonjs/cloudflare' */ @@ -10,7 +10,7 @@ export default defineConfig(({ mode }) => { return { // No photon server entry is defined, it will fallback to a virtual entry photon: { - handlers: { + entries: { // foo entry declares its route with `enhance` directly inside the file foo: 'src/middlewares/foo.ts', // bar entry route is declared here, and `enhance` is not used diff --git a/example/app-hono-cloudflare/package.json b/example/app-hono-cloudflare/package.json index 669348b..7078e9b 100644 --- a/example/app-hono-cloudflare/package.json +++ b/example/app-hono-cloudflare/package.json @@ -16,7 +16,7 @@ "@photonjs/core": "workspace:", "typescript": "^5.8.3", "vite": "^6.3.5", - "wrangler": "^4.15.1" + "wrangler": "^4.19.1" }, "dependencies": { "awesome-framework": "workspace:", diff --git a/example/app-hono-cloudflare/server.ts b/example/app-hono-cloudflare/server.ts index 3130014..21cff09 100644 --- a/example/app-hono-cloudflare/server.ts +++ b/example/app-hono-cloudflare/server.ts @@ -1,16 +1,12 @@ // Will be moved to @photonjs/hono import { apply, serve } from '@photonjs/core/hono' -import awesomeFramework from 'awesome-framework/universal-middleware' import { Hono } from 'hono' async function startServer() { const app = new Hono() - apply( - app, - // Adds the framework's middlewares - awesomeFramework, - ) + // awesomeFramework will automatically be injected by apply + apply(app) return serve(app) } diff --git a/example/app-hono-cloudflare/vite.config.ts b/example/app-hono-cloudflare/vite.config.ts index 7c95c88..8887949 100644 --- a/example/app-hono-cloudflare/vite.config.ts +++ b/example/app-hono-cloudflare/vite.config.ts @@ -1,4 +1,3 @@ -/// /* The Vite plugin cloudflare() will be replaced by this: import cloudflare from '@photonjs/cloudflare' */ diff --git a/example/awesome-framework/package.json b/example/awesome-framework/package.json index ee388ab..14a8ac1 100644 --- a/example/awesome-framework/package.json +++ b/example/awesome-framework/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@photonjs/core": "workspace:", - "@universal-middleware/core": "^0.4.7", + "@universal-middleware/core": "^0.4.9", "@universal-middleware/sirv": "^0.1.20" }, "devDependencies": { @@ -21,6 +21,7 @@ "./entry-client": "./dist/entry-client.js", "./render": "./dist/render.js", "./vite": "./dist/vite/index.js", + "./standalone": "./dist/photon/entries/standalone.js", "./universal-middleware": { "types": "./dist/photon/entries/prod.d.ts", "development": { diff --git a/example/awesome-framework/src/photon/entries/standalone.ts b/example/awesome-framework/src/photon/entries/standalone.ts new file mode 100644 index 0000000..7702e2c --- /dev/null +++ b/example/awesome-framework/src/photon/entries/standalone.ts @@ -0,0 +1,21 @@ +import { enhance } from '@universal-middleware/core' + +const standaloneMiddleware = enhance( + async () => { + return new Response('The /standalone Route', { + status: 200, + headers: { + 'Content-Type': 'text/plain', + }, + }) + }, + // enhance() adds meta data (a Universal Middleware in itself is just a Request => Response function) + { + name: 'awesome-framework:standalone', + path: '/standalone', + method: 'GET', + }, +) + +// This middleware will be used as a standalone handler, which means it is not included by `./universal-middleware` export +export default standaloneMiddleware diff --git a/example/awesome-framework/src/photon/middlewares/logger.ts b/example/awesome-framework/src/photon/middlewares/logger.ts index 189de9b..b3cc7e8 100644 --- a/example/awesome-framework/src/photon/middlewares/logger.ts +++ b/example/awesome-framework/src/photon/middlewares/logger.ts @@ -1,8 +1,8 @@ import { enhance, MiddlewareOrder } from '@universal-middleware/core' export const loggerMiddleware = enhance( - (request: Request) => { - console.log('Request:', request.url) + (request: Request, ctx: Universal.Context) => { + console.log('Request:', request.url, 'Context:', ctx) }, // enhance() adds meta data (a Universal Middleware in itself is just a Request => Response function) { diff --git a/example/awesome-framework/src/vite/photonPlugin.ts b/example/awesome-framework/src/vite/photonPlugin.ts index 998e5b9..04519f5 100644 --- a/example/awesome-framework/src/vite/photonPlugin.ts +++ b/example/awesome-framework/src/vite/photonPlugin.ts @@ -3,9 +3,29 @@ import type { Plugin } from 'vite' export function photonPlugin(): Plugin[] { return installPhoton('awesome-framework', { + // Enables full installation of all Photon plugins fullInstall: true, + + // Disables code-splitting functionality for testing purposes + codeSplitting: { + framework: false, + }, + + // Always use those middlewares for all entries defined by Photon resolveMiddlewares() { return 'awesome-framework/universal-middleware' }, + + // Configuration for entry points used by Photon + entries: { + standalone: { + // Unique identifier for this entry point. Is resolved by Vite + id: 'awesome-framework/standalone', + + // Sets composition mode to 'isolated', preventing it from + // being composed with middlewares defined in `resolveMiddlewares` + compositionMode: 'isolated', + }, + }, }) } diff --git a/package.json b/package.json index ac9fc8f..56aeae8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "========= Build": "", "build": "pnpm run build:photon && pnpm run build:awesome-framework", "build:photon": "pnpm --recursive --filter {packages/*} run build", - "build:awesome-framework": "cd example/awesome-framework/ && pnpm run build", + "build:awesome-framework": "pnpm --filter {example/awesome-framework} run build", "========= Test": "", "test": "test-e2e", "========= Formatting": "", @@ -22,5 +22,10 @@ "playwright": "^1.52.0", "prettier": "^3.2.5" }, + "pnpm": { + "overrides": { + "@types/node": "^20.17.32" + } + }, "packageManager": "pnpm@9.15.9" } diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 950ffca..adb08e5 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -23,16 +23,16 @@ "release:commit": "release-me commit" }, "dependencies": { - "@cloudflare/vite-plugin": "^1.0.12", + "@cloudflare/vite-plugin": "^1.5.0", "@photonjs/core": "workspace:^", - "@universal-middleware/cloudflare": "^0.4.8" + "@universal-middleware/cloudflare": "^0.4.10" }, "devDependencies": { "@brillout/release-me": "^0.4.3", - "@cloudflare/workers-types": "^4.20250515.0", - "@universal-middleware/core": "^0.4.7", - "@universal-middleware/h3": "^0.4.9", - "@universal-middleware/hono": "^0.4.10", + "@cloudflare/workers-types": "^4.20250604.0", + "@universal-middleware/core": "^0.4.9", + "@universal-middleware/h3": "^0.4.12", + "@universal-middleware/hono": "^0.4.15", "crossws": "^0.3.5", "h3": "^1.15.1", "tsup": "^8.4.0", diff --git a/packages/adapter-cloudflare/src/adapters/dev.ts b/packages/adapter-cloudflare/src/adapters/dev.ts index e87a291..5111b69 100644 --- a/packages/adapter-cloudflare/src/adapters/dev.ts +++ b/packages/adapter-cloudflare/src/adapters/dev.ts @@ -1,14 +1,15 @@ import type { ExportedHandlerFetchHandler } from '@cloudflare/workers-types' +import { createIncompatibleServerError, createMissingApplyError, createMissingExportError } from '../utils/errors.js' export function asFetch(app: unknown, id: string): ExportedHandlerFetchHandler { if (!app) { - throw new Error(`[photon] Missing export default in ${JSON.stringify(id)}`) + throw createMissingExportError(id) } const server = (app as Record)[Symbol.for('photon:server')] if (!server) { - throw new Error('[photon] { apply } function needs to be called before export') + throw createMissingApplyError() } switch (server) { @@ -30,7 +31,5 @@ export function asFetch(app: unknown, id: string): ExportedHandlerFetchHandler { } } - throw new Error( - `[photon] Clouflare target is not compatible with server "${server}". We recommend using "hono" instead.`, - ) + throw createIncompatibleServerError(server) } diff --git a/packages/adapter-cloudflare/src/adapters/h3.ts b/packages/adapter-cloudflare/src/adapters/h3.ts index 8580e81..de8167f 100644 --- a/packages/adapter-cloudflare/src/adapters/h3.ts +++ b/packages/adapter-cloudflare/src/adapters/h3.ts @@ -1,13 +1,14 @@ import type { ExportedHandlerFetchHandler, Response } from '@cloudflare/workers-types' import type { apply as applyAdapter } from '@universal-middleware/h3' import { toWebHandler } from 'h3' +import { createMissingDependencyError } from '../utils/errors.js' async function tryImportCrossws() { try { const { default: wsAdapter } = await import('crossws/adapters/cloudflare') return wsAdapter } catch (e) { - throw new Error('crossws is not installed', { cause: e }) + throw createMissingDependencyError('crossws', e) } } diff --git a/packages/adapter-cloudflare/src/plugin.ts b/packages/adapter-cloudflare/src/plugin.ts index 1ee7229..8701629 100644 --- a/packages/adapter-cloudflare/src/plugin.ts +++ b/packages/adapter-cloudflare/src/plugin.ts @@ -1,13 +1,9 @@ -/// import { cloudflare as cloudflareVitePlugins, type PluginConfig } from '@cloudflare/vite-plugin' -import { isPhotonMeta } from '@photonjs/core/api' -import { supportedTargetServers } from '@photonjs/core/vite' +import { supportedTargetServers, targetLoader } from '@photonjs/core/vite' import type { Plugin } from 'vite' const moduleId = 'photon:cloudflare' -const virtualModuleId = `\0${moduleId}` -// TODO: create actual virtual Target Entries for each server export function cloudflare(config?: Omit): Plugin[] { return [ { @@ -19,88 +15,52 @@ export function cloudflare(config?: Omit): Plug photon: { // @cloudflare/vite-plugin has its own dev server devServer: false, + codeSplitting: { + target: false, + }, + // Should be set to the value of cloudflareVitePlugins -> viteEnvironment.name + // defaultBuildEnv: 'cloudflare', }, } }, }, }, - supportedTargetServers('cloudflare', ['hono', 'h3']), - { - name: `${moduleId}:resolver`, - - async resolveId(id, importer, opts) { - if (id.startsWith(moduleId)) { - const resolved = await this.resolve(id.replace(/^photon:cloudflare:/, ''), importer, opts) - - if (!resolved) { - return this.error(`[photon][cloudflare] Cannot resolve ${id}`) - } - - return { - ...resolved, - id: `${virtualModuleId}:${resolved.id}`, - } - } - }, - - // TODO add tests - async load(id) { - if (!id.startsWith(virtualModuleId)) return - const actualId = id.slice(virtualModuleId.length + 1) - - const info = this.getModuleInfo(id) - - if (!isPhotonMeta(info?.meta)) { - return this.error(`[photon][cloudflare] ${actualId} is not a Photon entry`) - } - + ...targetLoader('cloudflare', { + async load(id, { meta }) { const isDev = this.environment.config.command === 'serve' - if (info.meta.photon.type === 'server') { - // `server` usually exists only during build time - if (info.meta.photon.server) { - return { - // language=ts - code: `import serverEntry from ${JSON.stringify(actualId)}; -import { asFetch } from "@photonjs/cloudflare/${info.meta.photon.server}"; + // `server` usually exists only during build time + if (meta.server) { + return { + // language=ts + code: `import serverEntry from ${JSON.stringify(id)}; + import { asFetch } from "@photonjs/cloudflare/${meta.server}"; -export const fetch = asFetch(serverEntry); -export default { fetch }; -`, - map: { mappings: '' }, - } + export const fetch = asFetch(serverEntry); + export default { fetch }; + `, + map: { mappings: '' }, } + } - if (isDev) { - return { - // language=ts - code: `import serverEntry from ${JSON.stringify(actualId)}; -import { asFetch } from "@photonjs/cloudflare/dev"; - -export const fetch = asFetch(serverEntry, ${JSON.stringify(actualId)}); -export default { fetch }; -`, - map: { mappings: '' }, - } - } - } else { + if (isDev) { return { // language=ts - code: `import handler from ${JSON.stringify(actualId)}; -import { getRuntime } from "@universal-middleware/cloudflare"; + code: `import serverEntry from ${JSON.stringify(id)}; +import { asFetch } from "@photonjs/cloudflare/dev"; -export const fetch = (request, env, ctx) => { - return handler(request, {}, getRuntime(env, ctx)) -}; +export const fetch = asFetch(serverEntry, ${JSON.stringify(id)}); export default { fetch }; `, map: { mappings: '' }, } } - return this.error(`[photon][cloudflare] Unable to load ${actualId}`) + return this.error(`[photon][cloudflare] Unable to load ${id}`) }, - }, + }), + supportedTargetServers('cloudflare', ['hono', 'h3']), + // FIXME do not enforce ssr env? ...cloudflareVitePlugins({ ...config, viteEnvironment: { name: 'ssr' } }), ] } diff --git a/packages/adapter-cloudflare/src/utils/errors.ts b/packages/adapter-cloudflare/src/utils/errors.ts new file mode 100644 index 0000000..641c082 --- /dev/null +++ b/packages/adapter-cloudflare/src/utils/errors.ts @@ -0,0 +1,28 @@ +import { PhotonBugError, PhotonConfigError, PhotonDependencyError, PhotonUsageError } from '@photonjs/core/errors' + +// Utility functions for common error scenarios +export function createMissingExportError(id: string): PhotonUsageError { + return new PhotonUsageError(`Missing export default in ${JSON.stringify(id)}`) +} + +export function createMissingApplyError(): PhotonUsageError { + return new PhotonUsageError('{ apply } function needs to be called before export') +} + +export function createIncompatibleServerError(server: string): PhotonConfigError { + return new PhotonConfigError( + `Cloudflare target is not compatible with server "${server}". We recommend using "hono" instead.`, + ) +} + +export function createMissingDependencyError(dependency: string, cause?: unknown): PhotonDependencyError { + return new PhotonDependencyError( + `${dependency} is not installed. Please install ${dependency} to use this functionality with Cloudflare.`, + { cause }, + ) +} + +export function assert(condition: unknown): asserts condition { + if (condition) return + throw new PhotonBugError() +} diff --git a/packages/photonjs/build.js b/packages/photonjs/build.js new file mode 100644 index 0000000..56d199d --- /dev/null +++ b/packages/photonjs/build.js @@ -0,0 +1,103 @@ +import { build } from 'tsup' + +const externalServers = ['elysia', 'fastify', 'h3', 'hono'] + +const commonOptions = { + format: ['esm'], + target: 'es2022', + esbuildOptions(opts) { + opts.outbase = 'src' + }, + dts: { + compilerOptions: { + rootDir: './', + }, + }, + outDir: 'dist', + treeshake: true, + removeNodeProtocol: false, + external: externalServers.concat(/^photon:get-middlewares:/).concat(/^@photonjs\/core/), +} + +await build({ + ...commonOptions, + platform: 'node', + entry: { + plugin: './src/plugin/index.ts', + api: './src/api.ts', + dev: './src/dev.ts', + assert: './src/utils/assert.ts', + index: './src/index.ts', + }, +}) + +await build({ + ...commonOptions, + platform: 'neutral', + entry: { + // serve (noop) + 'elysia/serve': './src/serve/noop/elysia.ts', + 'express/serve': './src/serve/noop/express.ts', + 'fastify/serve': './src/serve/noop/fastify.ts', + 'h3/serve': './src/serve/noop/h3.ts', + 'hattip/serve': './src/serve/noop/hattip.ts', + 'hono/serve': './src/serve/noop/hono.ts', + // apply (edge) + 'elysia/apply.edge': './src/apply/edge/elysia.ts', + 'h3/apply.edge': './src/apply/edge/h3.ts', + 'hattip/apply.edge': './src/apply/edge/hattip.ts', + 'hono/apply.edge': './src/apply/edge/hono.ts', + }, +}) + +await build({ + ...commonOptions, + platform: 'node', + entry: { + // serve (bun) + 'elysia/serve.bun': './src/serve/bun/elysia.ts', + 'h3/serve.bun': './src/serve/bun/h3.ts', + 'hattip/serve.bun': './src/serve/bun/hattip.ts', + 'hono/serve.bun': './src/serve/bun/hono.ts', + // serve (deno) + 'elysia/serve.deno': './src/serve/deno/elysia.ts', + 'h3/serve.deno': './src/serve/deno/h3.ts', + 'hattip/serve.deno': './src/serve/deno/hattip.ts', + 'hono/serve.deno': './src/serve/deno/hono.ts', + // serve (node) + 'elysia/serve.node': './src/serve/node/elysia.ts', + 'express/serve.node': './src/serve/node/express.ts', + 'fastify/serve.node': './src/serve/node/fastify.ts', + 'h3/serve.node': './src/serve/node/h3.ts', + 'hattip/serve.node': './src/serve/node/hattip.ts', + 'hono/serve.node': './src/serve/node/hono.ts', + // apply (dev) + 'elysia/apply.dev': './src/apply/dev/elysia.ts', + 'express/apply.dev': './src/apply/dev/express.ts', + 'fastify/apply.dev': './src/apply/dev/fastify.ts', + 'h3/apply.dev': './src/apply/dev/h3.ts', + 'hattip/apply.dev': './src/apply/dev/hattip.ts', + 'hono/apply.dev': './src/apply/dev/hono.ts', + // apply (node) + 'elysia/apply': './src/apply/node/elysia.ts', + 'express/apply': './src/apply/node/express.ts', + 'fastify/apply': './src/apply/node/fastify.ts', + 'h3/apply': './src/apply/node/h3.ts', + 'hattip/apply': './src/apply/node/hattip.ts', + 'hono/apply': './src/apply/node/hono.ts', + }, +}) + +await build({ + ...commonOptions, + platform: 'neutral', + entry: { + // servers + elysia: './src/servers/elysia.ts', + express: './src/servers/express.ts', + fastify: './src/servers/fastify.ts', + h3: './src/servers/h3.ts', + hattip: './src/servers/hattip.ts', + hono: './src/servers/hono.ts', + }, +}) diff --git a/packages/photonjs/package.json b/packages/photonjs/package.json index 0dbc713..ece1530 100644 --- a/packages/photonjs/package.json +++ b/packages/photonjs/package.json @@ -9,6 +9,7 @@ "./vite": "./dist/plugin.js", "./api": "./dist/api.js", "./dev": "./dist/dev.js", + "./errors": "./dist/assert.js", ".": "./dist/index.js", "./virtual": { "types": "./virtual.d.ts" @@ -247,7 +248,7 @@ }, "scripts": { "dev": "tsup --watch", - "build": "rm -rf dist && tsup", + "build": "rm -rf dist && node build.js", "release": "release-me patch", "release:minor": "release-me minor", "release:major": "release-me major", @@ -256,19 +257,20 @@ "dependencies": { "@brillout/picocolors": "^1.0.26", "@brillout/vite-plugin-server-entry": "^0.7.5", + "@universal-middleware/cloudflare": "^0.4.10", "@universal-middleware/compress": "^0.2.30", - "@universal-middleware/core": "^0.4.7", - "@universal-middleware/elysia": "^0.5.1", - "@universal-middleware/express": "^0.4.16", - "@universal-middleware/fastify": "^0.5.18", - "@universal-middleware/h3": "^0.4.10", - "@universal-middleware/hattip": "^0.4.9", - "@universal-middleware/hono": "^0.4.12", + "@universal-middleware/core": "^0.4.9", + "@universal-middleware/elysia": "^0.5.3", + "@universal-middleware/express": "^0.4.18", + "@universal-middleware/fastify": "^0.5.20", + "@universal-middleware/h3": "^0.4.12", + "@universal-middleware/hattip": "^0.4.11", + "@universal-middleware/hono": "^0.4.15", "@universal-middleware/sirv": "^0.1.20", - "arktype": "^2.1.20", "estree-walker": "^3.0.3", "hono": "^4.7.7", - "oxc-transform": "^0.64.0" + "ts-deepmerge": "^7.0.3", + "zod": "^3.25.64" }, "peerDependencies": { "vite": ">=6" @@ -291,7 +293,6 @@ "fastify": "^5.3.0", "h3": "^1.15.1", "magic-string": "^0.30.17", - "rollup": "4.38.0", "tsup": "^8.4.0", "typescript": "^5.8.3", "unplugin": "^2.3.2", diff --git a/packages/photonjs/src/api.ts b/packages/photonjs/src/api.ts index 8553ecc..a6df193 100644 --- a/packages/photonjs/src/api.ts +++ b/packages/photonjs/src/api.ts @@ -1,16 +1,18 @@ -import 'vite' -import './types.js' +import './vite-types.js' export { isPhotonMeta, type PhotonMeta } from './plugin/utils/entry.js' export { resolvePhotonConfig } from './validators/coerce.js' -export { setPhotonHandler } from './api/setPhotonEntry.js' - -declare module 'vite' { - interface UserConfig { - photon?: Photon.Config - } - - interface ResolvedConfig { - photon: Photon.ConfigResolved - } -} +export { + addPhotonEntry, + updatePhotonEntry, + getPhotonServerIdWithEntry, +} from './api/api.js' +export { + PhotonError, + PhotonBugError, + PhotonUsageError, + PhotonConfigError, + PhotonRuntimeError, + PhotonDependencyError, +} from './utils/assert.js' +export { getPhotonMeta } from './utils/meta.js' diff --git a/packages/photonjs/src/api/api.ts b/packages/photonjs/src/api/api.ts new file mode 100644 index 0000000..8929df3 --- /dev/null +++ b/packages/photonjs/src/api/api.ts @@ -0,0 +1,59 @@ +import { z } from 'zod/v4' +import type { PluginContext } from '../plugin/utils/rollupTypes.js' +import type { Photon } from '../types.js' +import { PhotonConfigError, PhotonUsageError } from '../utils/assert.js' +import { entryToPhoton } from '../validators/coerce.js' +import { PhotonEntryServerConfig, PhotonEntryUniversalHandler } from '../validators/validators.js' +import { merge } from 'ts-deepmerge' + +/** + * Registers a new Photon entry. + * @throws {PhotonConfigError} will throw an error if an entry with this name already exists. + */ +export function addPhotonEntry(pluginContext: PluginContext, name: string, entry: Photon.EntryPartial) { + if (pluginContext.environment.config.afterBuildStart) { + throw new PhotonUsageError('Cannot use addPhotonEntry entry after buildStart hook.') + } + if (pluginContext.environment.config.photon.entries.some((e) => e.name === entry.name)) { + throw new PhotonConfigError(`Photon entry with name "${entry.name}" already exists.`) + } + + const parsed = z + .union([PhotonEntryUniversalHandler, PhotonEntryServerConfig]) + .parse(entryToPhoton('handler-entry', entry, name)) + + if (pluginContext.environment.config.photon.codeSplitting.framework && parsed.type === 'server-config') { + throw new PhotonConfigError( + `Photon entry with name "${entry.name}" is of type "server-config" but code splitting is enabled. Please disable code splitting or use "universal-handler" instead.`, + ) + } + + pluginContext.environment.config.photon.entries.push(parsed) +} + +/** + * Updates an existing Photon entry. + * @throws {PhotonConfigError} will throw an error if no entry with this name already exists. + */ +export function updatePhotonEntry(pluginContext: PluginContext, name: string, entry: Photon.EntryPartial) { + const foundEntry = pluginContext.environment.config.photon.entries.find((e) => e.name === entry.name) + if (!foundEntry) { + throw new PhotonConfigError(`Photon entry with name "${entry.name}" not found.`) + } + + const parsed = z + .union([PhotonEntryUniversalHandler, PhotonEntryServerConfig]) + .parse(entryToPhoton('handler-entry', entry, name)) + + if (pluginContext.environment.config.photon.codeSplitting.framework && parsed.type === 'server-config') { + throw new PhotonConfigError( + `Photon entry with name "${entry.name}" is of type "server-config" but code splitting is enabled. Please disable code splitting or use "universal-handler" instead.`, + ) + } + + Object.assign(foundEntry, merge(foundEntry, parsed)) +} + +export function getPhotonServerIdWithEntry(condition: 'dev' | 'node' | 'edge', handlerId: string) { + return `photon:server-entry-with-entry:${condition}:${handlerId}` +} diff --git a/packages/photonjs/src/api/setPhotonEntry.ts b/packages/photonjs/src/api/setPhotonEntry.ts deleted file mode 100644 index 094accc..0000000 --- a/packages/photonjs/src/api/setPhotonEntry.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { PluginContext } from 'rollup' -import { asPhotonEntryId } from '../plugin/utils/virtual.js' - -export function setPhotonHandler(pluginContext: PluginContext, fileName: string, entry: Photon.EntryUniversalHandler) { - pluginContext.environment.config.photon.handlers[fileName] = { - ...entry, - id: asPhotonEntryId(entry.id, 'handler-entry'), - } -} diff --git a/packages/photonjs/src/apply/common.ts b/packages/photonjs/src/apply/common.ts new file mode 100644 index 0000000..10bdacb --- /dev/null +++ b/packages/photonjs/src/apply/common.ts @@ -0,0 +1,91 @@ +import { + type EnhancedMiddleware, + getUniversalProp, + nameSymbol, + type UniversalHandler, + type UniversalMiddleware, +} from '@universal-middleware/core' +import { extractUniversal } from '../plugin/utils/universal.js' + +function errorMessageMiddleware(_id: string, index: number) { + return `Additional middleware at index ${index} default export must respect the following type: UniversalMiddleware | UniversalMiddleware[]. Each individual middleware must be wrapped with enhance helper. See https://universal-middleware.dev/helpers/enhance` +} + +type Apply = (app: App, middlewares: EnhancedMiddleware[]) => void +type AsyncApply = (app: App, middlewares: EnhancedMiddleware[]) => Promise + +export function createApply( + server: string, + applyAdapter: Apply, + getUniversalEntries: () => UniversalHandler[], + getUniversalMiddlewares: () => UniversalMiddleware[], + devServerMiddleware?: () => UniversalMiddleware, +) { + return function apply(app: T, additionalMiddlewares?: UniversalMiddleware[]): T { + const middlewares = getUniversalMiddlewares() + const entries = getUniversalEntries() + if (devServerMiddleware) { + middlewares.unshift(devServerMiddleware()) + } + + // dedupe + if (additionalMiddlewares) { + let index = 0 + for (const middleware of extractUniversal(additionalMiddlewares, '', errorMessageMiddleware)) { + const i = middlewares.findIndex( + (m) => getUniversalProp(m, nameSymbol) === getUniversalProp(middleware, nameSymbol), + ) + if (i !== -1) { + middlewares.splice(i, 1) + } + middlewares.push(middleware) + index++ + } + } + + applyAdapter(app, [...middlewares, ...entries]) + + // biome-ignore lint/suspicious/noExplicitAny: + ;(app as any)[Symbol.for('photon:server')] = server + + return app + } +} + +export function createAsyncApply( + server: string, + applyAdapter: AsyncApply, + getUniversalEntries: () => UniversalHandler[], + getUniversalMiddlewares: () => UniversalMiddleware[], + devServerMiddleware?: () => UniversalMiddleware, +) { + return async function apply(app: T, additionalMiddlewares?: UniversalMiddleware[]): Promise { + const middlewares = getUniversalMiddlewares() + const entries = getUniversalEntries() + if (devServerMiddleware) { + middlewares.unshift(devServerMiddleware()) + } + + // dedupe + if (additionalMiddlewares) { + let index = 0 + for (const middleware of extractUniversal(additionalMiddlewares, '', errorMessageMiddleware)) { + const i = middlewares.findIndex( + (m) => getUniversalProp(m, nameSymbol) === getUniversalProp(middleware, nameSymbol), + ) + if (i !== -1) { + middlewares.splice(i, 1) + } + middlewares.push(middleware) + index++ + } + } + + await applyAdapter(app, [...middlewares, ...entries]) + + // biome-ignore lint/suspicious/noExplicitAny: + ;(app as any)[Symbol.for('photon:server')] = server + + return app + } +} diff --git a/packages/photonjs/src/apply/dev/elysia.ts b/packages/photonjs/src/apply/dev/elysia.ts new file mode 100644 index 0000000..67d2e27 --- /dev/null +++ b/packages/photonjs/src/apply/dev/elysia.ts @@ -0,0 +1,15 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:dev:elysia' +import type { RuntimeAdapterTarget, UniversalMiddleware } from '@universal-middleware/core' +import { type App, apply as applyAdapter } from '@universal-middleware/elysia' +import { createApply } from '../common.js' +import { devServerMiddleware } from '@photonjs/core/dev' + +export const apply: (app: T, additionalMiddlewares?: UniversalMiddleware[]) => T = createApply( + 'elysia', + applyAdapter, + getUniversalEntries, + getUniversalMiddlewares, + devServerMiddleware, +) + +export type RuntimeAdapter = RuntimeAdapterTarget<'elysia'> diff --git a/packages/photonjs/src/apply/dev/express.ts b/packages/photonjs/src/apply/dev/express.ts new file mode 100644 index 0000000..ab274cd --- /dev/null +++ b/packages/photonjs/src/apply/dev/express.ts @@ -0,0 +1,15 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:dev:express' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/express' +import { createApply } from '../common.js' +import { devServerMiddleware } from '@photonjs/core/dev' + +export const apply = createApply( + 'express', + applyAdapter, + getUniversalEntries, + getUniversalMiddlewares, + devServerMiddleware, +) + +export type RuntimeAdapter = RuntimeAdapterTarget<'express'> diff --git a/packages/photonjs/src/apply/dev/fastify.ts b/packages/photonjs/src/apply/dev/fastify.ts new file mode 100644 index 0000000..5da4024 --- /dev/null +++ b/packages/photonjs/src/apply/dev/fastify.ts @@ -0,0 +1,15 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:dev:fastify' +import { devServerMiddleware } from '@photonjs/core/dev' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/fastify' +import { createAsyncApply } from '../common.js' + +export const apply = createAsyncApply( + 'fastify', + applyAdapter, + getUniversalEntries, + getUniversalMiddlewares, + devServerMiddleware, +) + +export type RuntimeAdapter = RuntimeAdapterTarget<'fastify'> diff --git a/packages/photonjs/src/apply/dev/h3.ts b/packages/photonjs/src/apply/dev/h3.ts new file mode 100644 index 0000000..6002832 --- /dev/null +++ b/packages/photonjs/src/apply/dev/h3.ts @@ -0,0 +1,9 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:dev:h3' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/h3' +import { createApply } from '../common.js' +import { devServerMiddleware } from '@photonjs/core/dev' + +export const apply = createApply('h3', applyAdapter, getUniversalEntries, getUniversalMiddlewares, devServerMiddleware) + +export type RuntimeAdapter = RuntimeAdapterTarget<'h3'> diff --git a/packages/photonjs/src/apply/dev/hattip.ts b/packages/photonjs/src/apply/dev/hattip.ts new file mode 100644 index 0000000..11993cb --- /dev/null +++ b/packages/photonjs/src/apply/dev/hattip.ts @@ -0,0 +1,15 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:dev:hattip' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/hattip' +import { createApply } from '../common.js' +import { devServerMiddleware } from '@photonjs/core/dev' + +export const apply = createApply( + 'hattip', + applyAdapter, + getUniversalEntries, + getUniversalMiddlewares, + devServerMiddleware, +) + +export type RuntimeAdapter = RuntimeAdapterTarget<'hattip'> diff --git a/packages/photonjs/src/apply/dev/hono.ts b/packages/photonjs/src/apply/dev/hono.ts new file mode 100644 index 0000000..eb7bdce --- /dev/null +++ b/packages/photonjs/src/apply/dev/hono.ts @@ -0,0 +1,15 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:dev:hono' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/hono' +import { createApply } from '../common.js' +import { devServerMiddleware } from '@photonjs/core/dev' + +export const apply = createApply( + 'hono', + applyAdapter, + getUniversalEntries, + getUniversalMiddlewares, + devServerMiddleware, +) + +export type RuntimeAdapter = RuntimeAdapterTarget<'hono'> diff --git a/packages/photonjs/src/apply/edge/elysia.ts b/packages/photonjs/src/apply/edge/elysia.ts new file mode 100644 index 0000000..04b974d --- /dev/null +++ b/packages/photonjs/src/apply/edge/elysia.ts @@ -0,0 +1,13 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:edge:elysia' +import type { RuntimeAdapterTarget, UniversalMiddleware } from '@universal-middleware/core' +import { type App, apply as applyAdapter } from '@universal-middleware/elysia' +import { createApply } from '../common.js' + +export const apply: (app: T, additionalMiddlewares?: UniversalMiddleware[]) => T = createApply( + 'elysia', + applyAdapter, + getUniversalEntries, + getUniversalMiddlewares, +) + +export type RuntimeAdapter = RuntimeAdapterTarget<'elysia'> diff --git a/packages/photonjs/src/apply/edge/h3.ts b/packages/photonjs/src/apply/edge/h3.ts new file mode 100644 index 0000000..16bb084 --- /dev/null +++ b/packages/photonjs/src/apply/edge/h3.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:edge:h3' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/h3' +import { createApply } from '../common.js' + +export const apply = createApply('h3', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'h3'> diff --git a/packages/photonjs/src/apply/edge/hattip.ts b/packages/photonjs/src/apply/edge/hattip.ts new file mode 100644 index 0000000..bc2b643 --- /dev/null +++ b/packages/photonjs/src/apply/edge/hattip.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:edge:hattip' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/hattip' +import { createApply } from '../common.js' + +export const apply = createApply('hattip', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'hattip'> diff --git a/packages/photonjs/src/apply/edge/hono.ts b/packages/photonjs/src/apply/edge/hono.ts new file mode 100644 index 0000000..52e0e49 --- /dev/null +++ b/packages/photonjs/src/apply/edge/hono.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:edge:hono' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/hono' +import { createApply } from '../common.js' + +export const apply = createApply('hono', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'hono'> diff --git a/packages/photonjs/src/apply/esbuild.ts b/packages/photonjs/src/apply/esbuild.ts deleted file mode 100644 index e427e6f..0000000 --- a/packages/photonjs/src/apply/esbuild.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { createEsbuildPlugin } from 'unplugin' -import { virtualApplyFactory } from './virtualApply.js' - -export default createEsbuildPlugin(virtualApplyFactory) diff --git a/packages/photonjs/src/apply/node/elysia.ts b/packages/photonjs/src/apply/node/elysia.ts new file mode 100644 index 0000000..a17b0ea --- /dev/null +++ b/packages/photonjs/src/apply/node/elysia.ts @@ -0,0 +1,13 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:node:elysia' +import type { RuntimeAdapterTarget, UniversalMiddleware } from '@universal-middleware/core' +import { type App, apply as applyAdapter } from '@universal-middleware/elysia' +import { createApply } from '../common.js' + +export const apply: (app: T, additionalMiddlewares?: UniversalMiddleware[]) => T = createApply( + 'elysia', + applyAdapter, + getUniversalEntries, + getUniversalMiddlewares, +) + +export type RuntimeAdapter = RuntimeAdapterTarget<'elysia'> diff --git a/packages/photonjs/src/apply/node/express.ts b/packages/photonjs/src/apply/node/express.ts new file mode 100644 index 0000000..47aa019 --- /dev/null +++ b/packages/photonjs/src/apply/node/express.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:node:express' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/express' +import { createApply } from '../common.js' + +export const apply = createApply('express', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'express'> diff --git a/packages/photonjs/src/apply/node/fastify.ts b/packages/photonjs/src/apply/node/fastify.ts new file mode 100644 index 0000000..8809e9f --- /dev/null +++ b/packages/photonjs/src/apply/node/fastify.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:node:fastify' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/fastify' +import { createAsyncApply } from '../common.js' + +export const apply = createAsyncApply('fastify', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'fastify'> diff --git a/packages/photonjs/src/apply/node/h3.ts b/packages/photonjs/src/apply/node/h3.ts new file mode 100644 index 0000000..7e03fcc --- /dev/null +++ b/packages/photonjs/src/apply/node/h3.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:node:h3' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/h3' +import { createApply } from '../common.js' + +export const apply = createApply('h3', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'h3'> diff --git a/packages/photonjs/src/apply/node/hattip.ts b/packages/photonjs/src/apply/node/hattip.ts new file mode 100644 index 0000000..b18ddce --- /dev/null +++ b/packages/photonjs/src/apply/node/hattip.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:node:hattip' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/hattip' +import { createApply } from '../common.js' + +export const apply = createApply('hattip', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'hattip'> diff --git a/packages/photonjs/src/apply/node/hono.ts b/packages/photonjs/src/apply/node/hono.ts new file mode 100644 index 0000000..f51fcd2 --- /dev/null +++ b/packages/photonjs/src/apply/node/hono.ts @@ -0,0 +1,8 @@ +import { getUniversalEntries, getUniversalMiddlewares } from 'photon:get-middlewares:node:hono' +import type { RuntimeAdapterTarget } from '@universal-middleware/core' +import { apply as applyAdapter } from '@universal-middleware/hono' +import { createApply } from '../common.js' + +export const apply = createApply('hono', applyAdapter, getUniversalEntries, getUniversalMiddlewares) + +export type RuntimeAdapter = RuntimeAdapterTarget<'hono'> diff --git a/packages/photonjs/src/apply/virtualApply.ts b/packages/photonjs/src/apply/virtualApply.ts deleted file mode 100644 index d8decbb..0000000 --- a/packages/photonjs/src/apply/virtualApply.ts +++ /dev/null @@ -1,207 +0,0 @@ -import oxc from 'oxc-transform' -import type { UnpluginFactory } from 'unplugin' -import { assert } from '../utils/assert.js' - -const re_apply = /^photon:virtual-apply:(?dev|edge|node):(?[^:]+)(?.*)/ -const re_index = /^photon:virtual-index:(?[^:]+)(?.*)/ -interface MatchGroups { - condition?: 'dev' | 'edge' | 'node' - server: string - rest: string -} - -function test(id: string, re: RegExp): MatchGroups | null { - const match = id.match(re) - if (!match) return null - return match.groups as unknown as MatchGroups -} - -function compileApply(id: string) { - const match = test(id, re_apply) - if (!match) throw new Error(`Invalid id ${id}`) - - const isAsync = match.server === 'fastify' - - //language=ts - const code = `import { apply as applyAdapter } from '@universal-middleware/${match.server}'; -import { getUniversalMiddlewares, getUniversalEntries, extractUniversal, errorMessageMiddleware } from 'photon:get-middlewares:${match.condition}:${match.server}${match.rest}'; -import { type RuntimeAdapterTarget, type UniversalMiddleware, getUniversalProp, nameSymbol } from '@universal-middleware/core'; -${match.condition === 'dev' ? 'import { devServerMiddleware } from "@photonjs/core/dev";' : ''} - -function errorMessageMiddleware(id, index) { - return \`PhotonError: additional middleware at index \${index} default export must respect the following type: UniversalMiddleware | UniversalMiddleware[]. Each individual middleware must be wrapped with enhance helper. See https://universal-middleware.dev/helpers/enhance\` -} - -export ${isAsync ? 'async' : ''} function apply(app: Parameters[0], additionalMiddlewares?: UniversalMiddleware[]): ${isAsync ? 'Promise[0]>' : 'Parameters[0]'} { - const middlewares = getUniversalMiddlewares(); - const entries = getUniversalEntries(); - ${match.condition === 'dev' ? 'middlewares.unshift(devServerMiddleware());' : ''} - - // dedupe - if (additionalMiddlewares) { - let index = 0; - for (const middleware of extractUniversal(additionalMiddlewares, '', errorMessageMiddleware)) { - const i = middlewares.findIndex(m => getUniversalProp(m, nameSymbol) === getUniversalProp(middleware, nameSymbol)); - if (i !== -1) { - middlewares.splice(i, 1); - } - middlewares.push(middleware); - index++; - } - } - - ${isAsync ? 'await' : ''} applyAdapter(app, [...middlewares, ...entries]); - - app[Symbol.for('photon:server')] = ${JSON.stringify(match.server)}; - - return app; -} - -export type RuntimeAdapter = RuntimeAdapterTarget<${JSON.stringify(match.server)}>; -` - const result = oxc.transform(`${match.server}.${match.condition}.ts`, code, { - sourcemap: true, - typescript: { - declaration: {}, - }, - }) - - return { - ...match, - ...result, - } -} - -function compileIndex(id: string) { - const match = test(id, re_index) - if (!match) throw new Error(`Invalid id ${id}`) - - //language=ts - const code = `export { apply, type RuntimeAdapter } from '@photonjs/core/${match.server}/apply' -export { serve } from '@photonjs/core/${match.server}/serve' -` - const result = oxc.transform(`${match.server}.ts`, code, { - sourcemap: true, - typescript: { - declaration: {}, - }, - }) - - return { - ...match, - ...result, - } -} - -const entries = { - // -- apply - // dev - 'elysia/apply.dev': 'photon:virtual-apply:dev:elysia', - 'express/apply.dev': 'photon:virtual-apply:dev:express', - 'fastify/apply.dev': 'photon:virtual-apply:dev:fastify', - 'h3/apply.dev': 'photon:virtual-apply:dev:h3', - 'hattip/apply.dev': 'photon:virtual-apply:dev:hattip', - 'hono/apply.dev': 'photon:virtual-apply:dev:hono', - // edge - 'elysia/apply.edge': 'photon:virtual-apply:edge:elysia', - 'h3/apply.edge': 'photon:virtual-apply:edge:h3', - 'hattip/apply.edge': 'photon:virtual-apply:edge:hattip', - 'hono/apply.edge': 'photon:virtual-apply:edge:hono', - // node - 'elysia/apply': 'photon:virtual-apply:node:elysia', - 'express/apply': 'photon:virtual-apply:node:express', - 'fastify/apply': 'photon:virtual-apply:node:fastify', - 'h3/apply': 'photon:virtual-apply:node:h3', - 'hattip/apply': 'photon:virtual-apply:node:hattip', - 'hono/apply': 'photon:virtual-apply:node:hono', - // -- index, - elysia: 'photon:virtual-index:elysia', - express: 'photon:virtual-index:express', - fastify: 'photon:virtual-index:fastify', - h3: 'photon:virtual-index:h3', - hattip: 'photon:virtual-index:hattip', - hono: 'photon:virtual-index:hono', -} - -export const virtualApplyFactory: UnpluginFactory = () => { - return { - name: 'photon:virtual-apply', - - esbuild: { - config(opts) { - opts.entryPoints ??= {} - assert(!Array.isArray(opts.entryPoints)) - Object.assign(opts.entryPoints, entries) - - opts.external ??= [] - opts.external.push('@photonjs/core/elysia/apply') - opts.external.push('@photonjs/core/elysia/serve') - opts.external.push('@photonjs/core/express/apply') - opts.external.push('@photonjs/core/express/serve') - opts.external.push('@photonjs/core/fastify/apply') - opts.external.push('@photonjs/core/fastify/serve') - opts.external.push('@photonjs/core/h3/apply') - opts.external.push('@photonjs/core/h3/serve') - opts.external.push('@photonjs/core/hattip/apply') - opts.external.push('@photonjs/core/hattip/serve') - opts.external.push('@photonjs/core/hono/apply') - opts.external.push('@photonjs/core/hono/serve') - }, - }, - - async resolveId(id) { - if (test(id, re_apply) || test(id, re_index)) { - return id - } - }, - - loadInclude(id) { - return Boolean(test(id, re_apply) || test(id, re_index)) - }, - - load(id) { - { - const match = test(id, re_apply) - if (match) { - const compiled = compileApply(id) - const fileName = Object.entries(entries).find(([, v]) => v === id)?.[0] - assert(fileName) - - this.emitFile({ - type: 'asset', - fileName: `${fileName}.d.ts`, - // biome-ignore lint/style/noNonNullAssertion: - source: compiled.declaration!, - }) - - return { - code: compiled.code, - // biome-ignore lint/style/noNonNullAssertion: - map: compiled.map!, - } - } - } - { - const match = test(id, re_index) - if (match) { - const compiled = compileIndex(id) - const fileName = Object.entries(entries).find(([, v]) => v === id)?.[0] - assert(fileName) - - this.emitFile({ - type: 'asset', - fileName: `${fileName}.d.ts`, - // biome-ignore lint/style/noNonNullAssertion: - source: compiled.declaration!, - }) - - return { - code: compiled.code, - // biome-ignore lint/style/noNonNullAssertion: - map: compiled.map!, - } - } - } - }, - } -} diff --git a/packages/photonjs/src/index.ts b/packages/photonjs/src/index.ts index 93489c9..eebe39f 100644 --- a/packages/photonjs/src/index.ts +++ b/packages/photonjs/src/index.ts @@ -1 +1,12 @@ +import './vite-types.js' + export * as api from './api.js' +export { + PhotonError, + PhotonBugError, + PhotonUsageError, + PhotonConfigError, + PhotonRuntimeError, + PhotonDependencyError, +} from './utils/assert.js' +export type { Photon } from './types.js' diff --git a/packages/photonjs/src/plugin/index.ts b/packages/photonjs/src/plugin/index.ts index aefd926..545285d 100644 --- a/packages/photonjs/src/plugin/index.ts +++ b/packages/photonjs/src/plugin/index.ts @@ -8,9 +8,11 @@ import { mirrorMeta } from './plugins/mirrorMeta.js' import { photonEntry } from './plugins/photonEntry.js' import { resolvePhotonConfigPlugin } from './plugins/resolvePhotonConfigPlugin.js' import { supportedTargetServers } from './plugins/supportedServers.js' -import '../types.js' +import { targetLoader } from './plugins/targetLoader.js' +import '../vite-types.js' +import type { Photon } from '../types.js' -export { photon, installPhoton, supportedTargetServers, type InstallPhotonOptions, photon as default } +export { photon, installPhoton, supportedTargetServers, targetLoader, type InstallPhotonOptions, photon as default } function photon(config?: Photon.Config): Plugin[] { return [ @@ -40,13 +42,3 @@ function installPhoton( return plugins } - -declare module 'vite' { - interface UserConfig { - photon?: Photon.Config - } - - interface ResolvedConfig { - photon: Photon.ConfigResolved - } -} diff --git a/packages/photonjs/src/plugin/plugins/commonConfig.ts b/packages/photonjs/src/plugin/plugins/commonConfig.ts index 7460120..d2208b1 100644 --- a/packages/photonjs/src/plugin/plugins/commonConfig.ts +++ b/packages/photonjs/src/plugin/plugins/commonConfig.ts @@ -1,4 +1,5 @@ -import type { Plugin } from 'vite' +import { defaultServerConditions, type Plugin } from 'vite' +import { singleton } from '../utils/dedupe.js' import { isBun } from '../utils/isBun.js' import { isDeno } from '../utils/isDeno.js' @@ -6,26 +7,58 @@ export { commonConfig } function commonConfig(): Plugin[] { return [ - { - name: 'photon:commonConfig', + singleton({ + name: 'photon:common-config', configEnvironment(name, config) { if (!config.consumer) { config.consumer = name === 'client' ? 'client' : 'server' } + + let additionalResolveConfig: { externalConditions?: string[]; conditions?: string[]; noExternal?: string } = {} + + if (isBun) { + additionalResolveConfig = { + conditions: ['bun', ...defaultServerConditions], + externalConditions: ['bun', ...defaultServerConditions], + } + } + + if (isDeno) { + additionalResolveConfig = { + conditions: ['deno', ...defaultServerConditions], + externalConditions: ['deno', ...defaultServerConditions], + } + } + + // do not override `noExternal: true` + if (config.resolve?.noExternal !== true) { + additionalResolveConfig.noExternal = '@photonjs/core' + } + return { resolve: { - noExternal: '@photonjs/core', - externalConditions: - config.consumer === 'server' - ? [...(isBun ? ['bun'] : isDeno ? ['deno'] : []), 'node', 'development|production'] - : [], + ...additionalResolveConfig, }, build: { target: 'es2022', }, } }, - }, + }), + singleton({ + name: 'photon:set-after-build-start', + enforce: 'post', + buildStart: { + order: 'post', + handler() { + Object.defineProperty(this.environment.config, 'afterBuildStart', { + get() { + return true + }, + }) + }, + }, + }), ] } diff --git a/packages/photonjs/src/plugin/plugins/devServer.ts b/packages/photonjs/src/plugin/plugins/devServer.ts index d058f2b..84e663f 100644 --- a/packages/photonjs/src/plugin/plugins/devServer.ts +++ b/packages/photonjs/src/plugin/plugins/devServer.ts @@ -10,8 +10,23 @@ import type { import { fork } from 'node:child_process' import pc from '@brillout/picocolors' +import { + enhance, + getUniversalProp, + type HttpMethod, + methodSymbol, + nameSymbol, + orderSymbol, + pathSymbol, + type UniversalHandler, + type UniversalMiddleware, +} from '@universal-middleware/core' import { globalStore } from '../../runtime/globalStore.js' +import type { Photon } from '../../types.js' import { assert, assertUsage } from '../../utils/assert.js' +import { resolvePhotonConfig } from '../../validators/coerce.js' +import type { PhotonEntryUniversalHandler, SupportedServers } from '../../validators/types.js' +import { singleton } from '../utils/dedupe.js' import { isPhotonMetaConfig } from '../utils/entry.js' import { isBun } from '../utils/isBun.js' import { logViteInfo } from '../utils/logVite.js' @@ -27,6 +42,61 @@ export function isRunnableDevEnvironment(environment: Environment): environment return 'runner' in environment } +// TODO cleanup or reuse? +async function importMiddleware(vite: ViteDevServer, middleware: string) { + const envName = vite.config.photon.devServer ? vite.config.photon.devServer.env : 'ssr' + const env = vite.environments[envName] + assertUsage(env, `Environment ${envName} not found`) + assertUsage(isRunnableDevEnvironment(env), `Environment ${envName} is not runnable`) + + return envImportAndCheckDefaultExport(env, middleware, false) +} + +async function importHandler(vite: ViteDevServer, handler: PhotonEntryUniversalHandler) { + const envName = handler.env ?? 'ssr' + const env = vite.environments[envName] + assertUsage(env, `Environment ${envName} not found`) + assertUsage(isRunnableDevEnvironment(env), `Environment ${envName} is not runnable`) + + const handlerResolved = await env.pluginContainer.resolveId(handler.id, undefined, { + isEntry: true, + }) + assertUsage( + handlerResolved?.id, + `Cannot find handler ${pc.cyan(handler.id)}. Make sure its path is relative to the root of your project.`, + ) + + return envImportAndCheckDefaultExport(env, handlerResolved.id, false).then((defaultExport) => { + const name = getUniversalProp(defaultExport, nameSymbol) + const path = getUniversalProp(defaultExport, pathSymbol) + const order = getUniversalProp(defaultExport, orderSymbol) + const method = getUniversalProp(defaultExport, methodSymbol) + const toEnhance: { path?: string; method?: HttpMethod[] | HttpMethod; name?: string; order?: number } = {} + if (handler.route) { + toEnhance.path = handler.route + toEnhance.method = ['GET', 'POST'] + } else if (path) { + toEnhance.path = path + } + if (!name) { + toEnhance.name = handlerResolved.id + } else { + toEnhance.name = name + } + if (order) { + toEnhance.order = order + } + if (method) { + toEnhance.method = method + } + return enhance((request, context, runtime) => { + context.photon ??= {} + context.photon.handler = handler + return defaultExport(request, context, runtime) + }, toEnhance) + }) +} + export function devServer(config?: Photon.Config): Plugin { let resolvedEntryId: string let HMRServer: ReturnType | undefined @@ -42,16 +112,17 @@ export function devServer(config?: Photon.Config): Plugin { } } - return { + return singleton({ name: 'photon:devserver', apply(_config, { command, mode }) { return command === 'serve' && mode !== 'test' }, - enforce: 'pre', + enforce: 'post', config: { order: 'post', handler(userConfig) { - if (userConfig.photon?.devServer === false) return + const resolvedPhotonConfig = resolvePhotonConfig(userConfig.photon) + if (resolvedPhotonConfig.devServer === false) return // FIXME if (isBun) { return { @@ -113,14 +184,19 @@ export function devServer(config?: Photon.Config): Plugin { } if (vite.config.photon.hmr === true) { + const envName = vite.config.photon.devServer.env + const env = vite.environments[envName] + assertUsage(env, `Environment ${envName} does not exists`) + // Once existing server is closed and invalidated, reimport its updated entry file - vite.environments.ssr.hot.on('photon:server-closed', () => { + env.hot.on('photon:server-closed', () => { setupHMRProxyDone = false - assertUsage(isRunnableDevEnvironment(vite.environments.ssr), 'SSR environment is not runnable') - ssrImportAndCheckDefaultExport(vite.environments.ssr, resolvedEntryId) + assertUsage(isRunnableDevEnvironment(env), `${envName} environment is not runnable`) + envImportAndCheckDefaultExport(env, resolvedEntryId) }) - vite.environments.ssr.hot.on('photon:reloaded', () => { + env.hot.on('photon:reloaded', () => { + // TODO do not full reload the client? vite.environments.client.hot.send({ type: 'full-reload' }) }) } @@ -135,14 +211,11 @@ export function devServer(config?: Photon.Config): Plugin { setupErrorHandlers() } patchViteServer(vite) - if ( - config?.devServer === undefined || - (typeof config?.devServer === 'object' && config?.devServer?.autoServe !== false) - ) { + if (vite.config.photon.devServer.autoServe) { initializeServerEntry(vite) } }, - } + }) // Bypass "vite dev" CLI checks on usage function patchViteServer(vite: ViteDevServer) { @@ -209,8 +282,13 @@ export function devServer(config?: Photon.Config): Plugin { } async function initializeServerEntry(vite: ViteDevServer) { + assert(vite.config.photon.devServer) + const envName = vite.config.photon.devServer.env + const env = vite.environments[envName] + assertUsage(env, `Environment ${envName} does not exists`) + const index = vite.config.photon.server - const indexResolved = await vite.environments.ssr.pluginContainer.resolveId(index.id, undefined, { + const indexResolved = await env.pluginContainer.resolveId(index.id, undefined, { isEntry: true, }) assertUsage( @@ -218,14 +296,20 @@ export function devServer(config?: Photon.Config): Plugin { `Cannot find server entry ${pc.cyan(index.id)}. Make sure its path is relative to the root of your project.`, ) resolvedEntryId = indexResolved.id - const ssr = vite.environments.ssr - assertUsage(isRunnableDevEnvironment(ssr), 'SSR environment is not runnable') - ssrImportAndCheckDefaultExport(ssr, resolvedEntryId) + assertUsage(isRunnableDevEnvironment(env), `${envName} environment is not runnable`) + return envImportAndCheckDefaultExport(env, resolvedEntryId) } } -function ssrImportAndCheckDefaultExport(ssr: RunnableDevEnvironment, resolvedId: string) { - ssr.runner +const photonServerSymbol = Symbol.for('photon:server') + +function envImportAndCheckDefaultExport( + env: RunnableDevEnvironment, + resolvedId: string, +): Promise<{ [photonServerSymbol]: SupportedServers }> +function envImportAndCheckDefaultExport(env: RunnableDevEnvironment, resolvedId: string, isServer: false): Promise +function envImportAndCheckDefaultExport(env: RunnableDevEnvironment, resolvedId: string, isServer = true) { + return env.runner .import(resolvedId) .then((mod) => { assertUsage(mod && 'default' in mod, `Missing export default in ${JSON.stringify(resolvedId)}`) @@ -233,10 +317,13 @@ function ssrImportAndCheckDefaultExport(ssr: RunnableDevEnvironment, resolvedId: !(mod.default instanceof Promise), `Replace \`export default\` by \`export default await\` in ${JSON.stringify(resolvedId)}`, ) - assertUsage( - Symbol.for('photon:server') in mod.default, - `{ apply } function needs to be called before export in ${JSON.stringify(resolvedId)}`, - ) + if (isServer) { + assertUsage( + photonServerSymbol in mod.default, + `{ apply } function needs to be called before export in ${JSON.stringify(resolvedId)}`, + ) + } + return mod.default }) .catch(logRestartMessage) } diff --git a/packages/photonjs/src/plugin/plugins/fallback.ts b/packages/photonjs/src/plugin/plugins/fallback.ts index f8ec269..79623ad 100644 --- a/packages/photonjs/src/plugin/plugins/fallback.ts +++ b/packages/photonjs/src/plugin/plugins/fallback.ts @@ -1,15 +1,26 @@ import type { Plugin } from 'vite' +import { singleton } from '../utils/dedupe.js' import { ifPhotonModule } from '../utils/virtual.js' export { fallback } function fallback(): Plugin { - return { + return singleton({ name: 'photon:fallback', resolveId(id) { return ifPhotonModule('fallback-entry', id, () => { - return id + return { + id, + meta: { + photon: { + id, + resolvedId: id, + type: 'server', + server: 'hono', + }, + }, + } }) }, @@ -17,18 +28,14 @@ function fallback(): Plugin { return ifPhotonModule('fallback-entry', id, () => { //language=ts return { - code: `import { apply, serve } from '@photonjs/core/hono' -import { Hono } from 'hono' + code: ` +import { apply, serve } from 'photon:resolve-from-photon:@photonjs/core/hono' +import { Hono } from 'photon:resolve-from-photon:hono' function startServer() { const app = new Hono() apply(app) - - const port = process.env.PORT || 3000 - - return serve(app, { - port: +port - }) + return serve(app) } export default startServer() @@ -37,5 +44,5 @@ export default startServer() } }) }, - } + }) } diff --git a/packages/photonjs/src/plugin/plugins/getMiddlewaresPlugin.ts b/packages/photonjs/src/plugin/plugins/getMiddlewaresPlugin.ts index bd70415..c0d6d6f 100644 --- a/packages/photonjs/src/plugin/plugins/getMiddlewaresPlugin.ts +++ b/packages/photonjs/src/plugin/plugins/getMiddlewaresPlugin.ts @@ -1,30 +1,56 @@ -import type { PluginContext } from 'rollup' import type { Plugin } from 'vite' +import { getPhotonMeta } from '../../utils/meta.js' +import { singleton } from '../utils/dedupe.js' +import type { PluginContext } from '../utils/rollupTypes.js' import { ifPhotonModule } from '../utils/virtual.js' -function getAllPhotonMiddlewares(pluginContext: PluginContext, condition: 'dev' | 'edge' | 'node', server: string) { - const handlers = pluginContext.environment.config.photon.handlers - // non-index entries are always considered Universal Handlers - const universalEntries = Object.values(handlers).map((e) => e.id) +async function getAllPhotonMiddlewares( + pluginContext: PluginContext, + condition: 'dev' | 'edge' | 'node', + server: string, + handlerId?: string, +) { + const isDev = condition === 'dev' + const defaultBuildEnv = pluginContext.environment.config.photon.defaultBuildEnv + const currentEnv = pluginContext.environment.name + const metaHandler = handlerId ? await getPhotonMeta(pluginContext, handlerId, 'handler-entry') : null + + // middlewares const getMiddlewares = pluginContext.environment.config.photon.middlewares ?? [] - const middlewares = getMiddlewares - .map((m) => m.call(pluginContext, condition, server)) - .filter((x) => typeof x === 'string' || Array.isArray(x)) - .flat(1) + const middlewares = + metaHandler?.compositionMode === 'isolated' + ? [] + : getMiddlewares + .map((m) => m.call(pluginContext, condition as 'dev' | 'node' | 'edge', server)) + .filter((x) => typeof x === 'string' || Array.isArray(x)) + .flat(1) + + // handlers + let universalEntries = pluginContext.environment.config.photon.entries.filter((e) => e.type === 'universal-handler') + if (!isDev) { + // Only inject entries for the current environment + universalEntries = universalEntries.filter((h) => (h.env || defaultBuildEnv) === currentEnv) + if (pluginContext.environment.config.photon.codeSplitting.target) { + // Do not inject isolated entries when target supports code splitting + universalEntries = universalEntries.filter((h) => h.compositionMode !== 'isolated') + } + } + const universalEntriesIds = metaHandler ? [metaHandler.id] : universalEntries.map((e) => e.id) //language=javascript return ` import { getUniversal, nameSymbol } from 'photon:resolve-from-photon:@universal-middleware/core'; +import { PhotonConfigError } from 'photon:resolve-from-photon:@photonjs/core/errors'; ${middlewares.map((m, i) => `import m${i} from ${JSON.stringify(m)};`).join('\n')} -${universalEntries.map((m, i) => `import u${i} from ${JSON.stringify(m)};`).join('\n')} +${universalEntriesIds.map((m, i) => `import u${i} from ${JSON.stringify(m)};`).join('\n')} function errorMessageMiddleware(id) { - return \`PhotonError: "\${id}" default export must respect the following type: UniversalMiddleware | UniversalMiddleware[]. Each individual middleware must be wrapped with enhance helper. See https://universal-middleware.dev/helpers/enhance\` + return \`"\${id}" default export must respect the following type: UniversalMiddleware | UniversalMiddleware[]. Each individual middleware must be wrapped with enhance helper. See https://universal-middleware.dev/helpers/enhance\` } function errorMessageEntry(id) { - return \`PhotonError: "\${id}" default export must respect the following type: UniversalHandler. Make sure this entry have a route defined through Photon config or through enhance helper (https://universal-middleware.dev/helpers/enhance)\` + return \`"\${id}" default export must respect the following type: UniversalHandler. Make sure this entry have a route defined through Photon config or through enhance helper (https://universal-middleware.dev/helpers/enhance)\` } export function extractUniversal(mi, id, errorMessage) { @@ -35,7 +61,7 @@ export function extractUniversal(mi, id, errorMessage) { if (typeof m === 'function' && nameSymbol in m) { return m; } - throw new Error(errorMessage(id, i)); + throw new PhotonConfigError(errorMessage(id, i)); } ); } @@ -45,28 +71,34 @@ export function getUniversalMiddlewares() { } export function getUniversalEntries() { - return [${universalEntries.map((m, i) => `extractUniversal(u${i}, ${JSON.stringify(m)}, errorMessageEntry)`).join(', ')}].flat(1); + return [${universalEntriesIds.map((m, i) => `extractUniversal(u${i}, ${JSON.stringify(m)}, errorMessageEntry)`).join(', ')}].flat(1); } ` } export function getMiddlewaresPlugin(): Plugin[] { return [ - { + singleton({ name: 'photon:get-middlewares', - async resolveId(id) { - return ifPhotonModule('get-middlewares', id, () => id) + async resolveId(id, _importer, opts) { + return ifPhotonModule('get-middlewares', id, () => ({ + id, + moduleSideEffects: false, + meta: { + photonHandler: opts.attributes.photonHandler, + }, + })) }, load(id) { - return ifPhotonModule('get-middlewares', id, ({ condition, server }) => { + return ifPhotonModule('get-middlewares', id, async ({ condition, server, handler }) => { return { - code: getAllPhotonMiddlewares(this, condition as 'dev' | 'edge' | 'node', server), + code: await getAllPhotonMiddlewares(this, condition as 'dev' | 'edge' | 'node', server, handler), map: { mappings: '' } as const, } }) }, - }, + }), ] } diff --git a/packages/photonjs/src/plugin/plugins/installPhoton.ts b/packages/photonjs/src/plugin/plugins/installPhoton.ts index 75837f8..139e6c0 100644 --- a/packages/photonjs/src/plugin/plugins/installPhoton.ts +++ b/packages/photonjs/src/plugin/plugins/installPhoton.ts @@ -1,7 +1,7 @@ -import type { CustomPluginOptions, PluginContext, ResolvedId } from 'rollup' import type { Plugin } from 'vite' import type { GetPhotonCondition } from '../../validators/types.js' import { resolveFirst } from '../utils/resolve.js' +import type { PluginContext } from '../utils/rollupTypes.js' import { ifPhotonModule } from '../utils/virtual.js' export interface InstallPhotonBaseOptions { @@ -9,19 +9,19 @@ export interface InstallPhotonBaseOptions { } export function installPhotonBase(name: string, options?: InstallPhotonBaseOptions): Plugin[] { - let resolvedName: ResolvedId | null | undefined = undefined + let resolvedName: Awaited> = undefined function photonVirtualModuleResolver( id: string, importer?: string, opts?: { attributes?: Record - custom?: CustomPluginOptions + custom?: Record isEntry?: boolean skipSelf?: boolean }, ) { - return async function resolvePhotonVirtualModule(this: PluginContext) { + return async function resolvePhotonVirtualModule(this: Pick) { // first, try basic resolve let resolved = await this.resolve(id, importer, opts) diff --git a/packages/photonjs/src/plugin/plugins/mirrorMeta.ts b/packages/photonjs/src/plugin/plugins/mirrorMeta.ts index a5686f0..c65cbae 100644 --- a/packages/photonjs/src/plugin/plugins/mirrorMeta.ts +++ b/packages/photonjs/src/plugin/plugins/mirrorMeta.ts @@ -1,15 +1,17 @@ import { getUniversalProp, pathSymbol } from '@universal-middleware/core' import { walk } from 'estree-walker' import MagicString from 'magic-string' -import { createRunnableDevEnvironment, type Plugin } from 'vite' +import { createRunnableDevEnvironment, type Plugin, type RunnableDevEnvironment } from 'vite' import { assert, assertUsage } from '../../utils/assert.js' -import type { PhotonEntryServer } from '../../validators/types.js' -import { isPhotonMeta } from '../utils/entry.js' +import { createDeferred } from '../../utils/deferred.js' +import { singleton } from '../utils/dedupe.js' +import { isPhotonMeta, type PhotonMeta } from '../utils/entry.js' export function mirrorMeta(): Plugin[] { + let lastSsr: Promise | undefined return [ // Extract Universal Middleware metadata and add them to Photon meta - { + singleton({ name: 'photon:runtime-meta-to-photon', enforce: 'pre', apply: 'build', @@ -17,15 +19,22 @@ export function mirrorMeta(): Plugin[] { async moduleParsed(info) { // Import the module in RunnableDevEnvironment during build to extract exports if (isPhotonMeta(info.meta) && info.meta.photon.type === 'universal-handler' && !info.meta.photon.route) { - const ssr = createRunnableDevEnvironment('inline_ssr', this.environment.config, { - runnerOptions: { - hmr: { - logger: false, - }, - }, - hot: false, - }) - await ssr.init() + const ssr = lastSsr + ? await lastSsr + : createRunnableDevEnvironment('inline_ssr', this.environment.config, { + runnerOptions: { + hmr: { + logger: false, + }, + }, + hot: false, + }) + if (!lastSsr) { + const deferred = createDeferred() + lastSsr = deferred.promise + await ssr.init() + deferred.resolve(ssr) + } try { const mod = await ssr.runner.import(info.id) @@ -39,26 +48,32 @@ export function mirrorMeta(): Plugin[] { } } } finally { - await ssr.runner.close() + // await ssr.runner.close() } } }, + async buildEnd() { + if (lastSsr && !(await lastSsr).runner.isClosed()) { + return (await lastSsr).runner.close() + } + }, + sharedDuringBuild: true, - }, + }), // Extract Photon meta of an entry, and apply them to runtime through enhance - { + singleton({ name: 'photon:photon-meta-to-runtime', applyToEnvironment(env) { - return env.name !== 'inline_ssr' + return !env.name.includes('inline_ssr') }, transform(code, id) { const info = this.getModuleInfo(id) if (!info) return - if (isPhotonMeta(info.meta) && (info.meta.photon as PhotonEntryServer).route) { + if (isPhotonMeta(info.meta) && info.meta.photon.route && info.meta.photon.type === 'universal-handler') { const ast = this.parse(code) const magicString = new MagicString(code) @@ -70,7 +85,8 @@ export function mirrorMeta(): Plugin[] { if ( !hasEnhanceImport && node.type === 'ImportDeclaration' && - node.source.value === '@universal-middleware/core' + typeof node.source.value === 'string' && + node.source.value.includes('@universal-middleware/core') ) { // Check if enhance is among the imported specifiers for (const specifier of node.specifiers) { @@ -112,6 +128,7 @@ export function mirrorMeta(): Plugin[] { name: ${JSON.stringify(id)}, method: ['GET', 'POST'], path: ${JSON.stringify(info.meta.photon.route)}, + context: ${JSON.stringify({ photon: photonMetaAsContext(info.meta.photon) })}, immutable: false })`, ) @@ -122,9 +139,11 @@ export function mirrorMeta(): Plugin[] { assertUsage(hasExportDefault, `Entry ${id} must have a default export`) if (!hasEnhanceImport) { - magicString.prepend(`import { enhance } from '@universal-middleware/core';\n`) + magicString.prepend(`import { enhance } from 'photon:resolve-from-photon:@universal-middleware/core';\n`) } + if (!magicString.hasChanged()) return + return { code: magicString.toString(), map: magicString.generateMap(), @@ -133,6 +152,11 @@ export function mirrorMeta(): Plugin[] { }, sharedDuringBuild: true, - }, + }), ] } + +function photonMetaAsContext(photonMeta: PhotonMeta) { + const { id, resolvedId, ...photonMetaClean } = photonMeta + return photonMetaClean +} diff --git a/packages/photonjs/src/plugin/plugins/photonEntry.ts b/packages/photonjs/src/plugin/plugins/photonEntry.ts index 9cf0c08..3efaad3 100644 --- a/packages/photonjs/src/plugin/plugins/photonEntry.ts +++ b/packages/photonjs/src/plugin/plugins/photonEntry.ts @@ -1,27 +1,19 @@ -import type { ModuleInfo, PluginContext } from 'rollup' +import { walk } from 'estree-walker' +import MagicString from 'magic-string' import type { Plugin } from 'vite' import { assert, assertUsage } from '../../utils/assert.js' import { resolvePhotonConfig } from '../../validators/coerce.js' import type { SupportedServers } from '../../validators/types.js' +import { singleton } from '../utils/dedupe.js' import { isPhotonMeta } from '../utils/entry.js' -import { ifPhotonModule } from '../utils/virtual.js' - -const idsToServers: Record = { - '@photonjs/hono': 'hono', - '@photonjs/hattip': 'hattip', - '@photonjs/express': 'express', - '@photonjs/fastify': 'fastify', - '@photonjs/h3': 'h3', - '@photonjs/elysia': 'elysia', - '@photonjs/core/hono': 'hono', - '@photonjs/core/hattip': 'hattip', - '@photonjs/core/express': 'express', - '@photonjs/core/fastify': 'fastify', - '@photonjs/core/h3': 'h3', - '@photonjs/core/elysia': 'elysia', -} +import type { ModuleInfo, PluginContext } from '../utils/rollupTypes.js' +import { importsToServer } from '../utils/servers.js' +import { asPhotonEntryId, ifPhotonModule, virtualModulesRegex } from '../utils/virtual.js' + +const serverImports = new Set(Object.keys(importsToServer)) +const re_photonHandler = /[?&]photonHandler=/ -function computePhotonMeta( +function computePhotonMetaServer( pluginContext: PluginContext, resolvedIdsToServers: Record, info: ModuleInfo, @@ -68,10 +60,15 @@ function computePhotonMeta( } } +function cleanImport(imp: string) { + const s = 'photon:resolve-from-photon:' + return imp.startsWith(s) ? imp.slice(s.length) : imp +} + const resolvedIdsToServers: Record = {} export function photonEntry(): Plugin[] { return [ - { + singleton({ name: 'photon:set-input', apply: 'build', enforce: 'post', @@ -83,18 +80,14 @@ export function photonEntry(): Plugin[] { config: { order: 'post', handler(config) { - const { handlers, server } = resolvePhotonConfig(config.photon) + const { server } = resolvePhotonConfig(config.photon) return { environments: { ssr: { build: { rollupOptions: { - input: Object.assign( - // TODO make sure that handlers do not overwrite server entry name - { index: server.id }, - Object.fromEntries(Object.entries(handlers).map(([key, value]) => [key, value.id])), - ), + input: { index: server.id }, }, }, }, @@ -104,8 +97,8 @@ export function photonEntry(): Plugin[] { }, sharedDuringBuild: true, - }, - { + }), + singleton({ name: 'photon:compute-meta', apply: 'build', enforce: 'pre', @@ -115,11 +108,11 @@ export function photonEntry(): Plugin[] { }, async resolveId(id, importer, opts) { - if (id in idsToServers) { + if (id in importsToServer) { const resolved = await this.resolve(id, importer, opts) if (resolved) { // biome-ignore lint/style/noNonNullAssertion: - resolvedIdsToServers[resolved.id] = idsToServers[id]! + resolvedIdsToServers[resolved.id] = importsToServer[id]! } } }, @@ -129,14 +122,14 @@ export function photonEntry(): Plugin[] { handler(info) { if (isPhotonMeta(info.meta) && info.meta.photon.type === 'server') { // Must be kept synchronous - computePhotonMeta(this, resolvedIdsToServers, info) + computePhotonMetaServer(this, resolvedIdsToServers, info) } }, }, sharedDuringBuild: true, - }, - { + }), + singleton({ name: 'photon:resolve-importer', enforce: 'pre', @@ -154,30 +147,195 @@ export function photonEntry(): Plugin[] { }, }, sharedDuringBuild: true, - }, - { + }), + singleton({ + name: 'photon:resolve-server-with-entry', + enforce: 'pre', + + resolveId: { + filter: { + id: virtualModulesRegex['server-entry-with-entry'], + }, + order: 'post', + handler(id) { + return ifPhotonModule('server-entry-with-entry', id, async ({ entry }) => { + const handlerOrConfig = this.environment.config.photon.entries.find((e) => e.name === entry) + assertUsage(handlerOrConfig, `Unable to find entry "${entry}"`) + + return { + id, + meta: { + photon: { + ...this.environment.config.photon.server, + // Additional handler meta take precedence + ...handlerOrConfig, + type: 'server', + id, + resolvedId: id, + }, + }, + resolvedBy: 'photon', + } + }) + }, + }, + + load: { + filter: { + id: virtualModulesRegex['server-entry-with-entry'], + }, + handler(id) { + return ifPhotonModule('server-entry-with-entry', id, async ({ entry }) => { + const resolved = await this.resolve(this.environment.config.photon.server.id, undefined, { + isEntry: true, + }) + assert(resolved) + + const loaded = await this.load({ id: resolved.id }) + assert(loaded.code) + + const handlerOrConfig = this.environment.config.photon.entries.find((e) => e.name === entry) + assert(handlerOrConfig) + + const code = loaded.code + + // All entries are bundled in server-config entries + if (handlerOrConfig.type === 'server-config') { + return { code } + } + + const ast = this.parse(code) + const magicString = new MagicString(code) + + walk(ast, { + enter(node) { + if ( + node.type === 'ImportDeclaration' && + typeof node.source.value === 'string' && + serverImports.has(cleanImport(node.source.value)) + ) { + let foundApply = false + // Check if { apply } is among the imported specifiers + for (const specifier of node.specifiers) { + if ( + specifier.type === 'ImportSpecifier' && + specifier.imported && + 'name' in specifier.imported && + specifier.imported.name === 'apply' + ) { + foundApply = true + break + } + } + if (foundApply) { + const { end } = node.source as unknown as { start: number; end: number } + + // Adding a query parameter that will be used to rewrite `photon:get-middlewares` imports + magicString.appendRight(end - 1, `?${new URLSearchParams({ photonHandler: entry }).toString()}`) + } + } + }, + }) + + if (!magicString.hasChanged()) return + + return { + code: magicString.toString(), + map: magicString.generateMap(), + } + }) + }, + }, + + sharedDuringBuild: true, + }), + singleton({ + name: 'photon:transform-get-middlewares-import', + enforce: 'pre', + + resolveId: { + filter: { + id: re_photonHandler, + }, + async handler(id, importer, opts) { + const [actualId, query] = id.split('?') + // biome-ignore lint/style/noNonNullAssertion: + const resolved = await this.resolve(actualId!, importer, opts) + assert(resolved) + + return { + id: `${resolved.id}?${query}`, + resolvedBy: 'photon', + } + }, + }, + + load: { + filter: { + id: re_photonHandler, + }, + async handler(id) { + const [actualId, query] = id.split('?') + // biome-ignore lint/style/noNonNullAssertion: + const loaded = await this.load({ id: actualId! }) + assert(loaded.code) + + const handlerId = new URLSearchParams(query).get('photonHandler') + assert(handlerId) + + const newCode = loaded.code + // Forward query parameters to apply imports + .replace(/@photonjs\/core\/([^/]+)\/apply/, `@photonjs/core/$1/apply?${query}`) + // Transform get-middleware import + .replace(/photon:get-middlewares:(.+?):(\w+)/, `photon:get-middlewares:$1:$2:${handlerId}`) + + return { + code: newCode, + map: { mappings: '' }, + } + }, + }, + }), + singleton({ name: 'photon:resolve-server', enforce: 'pre', resolveId: { + filter: { + id: virtualModulesRegex['server-entry'], + }, order: 'post', handler(id, _importer, opts) { return ifPhotonModule('server-entry', id, async ({ entry: actualId }) => { + const entry = this.environment.config.photon.server + if (!actualId) { - return this.resolve(this.environment.config.photon.server.id, undefined, { isEntry: true }) + return this.resolve(this.environment.config.photon.server.id, undefined, { + isEntry: true, + custom: { + setPhotonMeta: entry, + }, + }) } const resolved = await this.resolve(actualId, undefined, { ...opts, isEntry: true, skipSelf: false, + custom: { + setPhotonMeta: entry, + }, }) assertUsage(resolved, `Cannot resolve ${actualId} to a server entry`) - const entry = this.environment.config.photon.server entry.resolvedId = resolved.id + // Ensure early resolution of photon meta during build + if (this.environment.config.command === 'build') { + await this.load({ ...resolved, resolveDependencies: true }) + } + return { ...resolved, meta: { @@ -189,38 +347,61 @@ export function photonEntry(): Plugin[] { }, }, sharedDuringBuild: true, - }, - { + }), + singleton({ name: 'photon:resolve-handler', enforce: 'pre', resolveId: { + filter: { + id: virtualModulesRegex['handler-entry'], + }, order: 'post', - handler(id, importer, opts) { + handler(id, _importer, opts) { return ifPhotonModule('handler-entry', id, async ({ entry: actualId }) => { + const idWithPhotonPrefix = asPhotonEntryId(id, 'handler-entry') + const handlers = this.environment.config.photon.entries.filter((e) => e.type === 'universal-handler') + let entry = handlers.find((e) => asPhotonEntryId(e.id, 'handler-entry') === idWithPhotonPrefix) + let resolved = await this.resolve(actualId, undefined, { ...opts, isEntry: true, skipSelf: false, + custom: { + setPhotonMeta: entry, + }, }) - // Try to resolve by handler key - if (!resolved && actualId in this.environment.config.photon.handlers) { - // biome-ignore lint/style/noNonNullAssertion: - resolved = await this.resolve(this.environment.config.photon.handlers[actualId]!.id, undefined, { - ...opts, - isEntry: true, - skipSelf: false, - }) + // Try to resolve by handler name + if (!resolved) { + const handler = handlers.find((e) => e.name === actualId) + if (handler) { + resolved = await this.resolve(handler.id, undefined, { + ...opts, + isEntry: true, + skipSelf: false, + custom: { + setPhotonMeta: entry, + }, + }) + } } assertUsage(resolved, `Cannot resolve ${actualId} to a handler entry`) - const entry = Object.values(this.environment.config.photon.handlers).find((e) => e.id === id) + if (!entry) { + const resolvedIdWithPhotonPrefix = asPhotonEntryId(resolved.id, 'handler-entry') + entry = handlers.find((e) => e.id === resolvedIdWithPhotonPrefix) + } assertUsage(entry, `Cannot find a handler for ${resolved.id}`) entry.resolvedId = resolved.id + // Ensure early resolution of photon meta during build + if (this.environment.config.command === 'build') { + await this.load({ ...resolved, resolveDependencies: true }) + } + return { ...resolved, meta: { @@ -232,6 +413,26 @@ export function photonEntry(): Plugin[] { }, }, sharedDuringBuild: true, - }, + }), + singleton({ + name: 'photon:trickle-meta', + enforce: 'pre', + + async resolveId(id, imports, opts) { + if (opts.custom?.setPhotonMeta) { + const resolved = await this.resolve(id, imports, opts) + + if (!resolved) return + + return { + ...resolved, + meta: { + ...resolved.meta, + photon: opts.custom.setPhotonMeta, + }, + } + } + }, + }), ] } diff --git a/packages/photonjs/src/plugin/plugins/resolvePhotonConfigPlugin.ts b/packages/photonjs/src/plugin/plugins/resolvePhotonConfigPlugin.ts index 7dba12c..2903535 100644 --- a/packages/photonjs/src/plugin/plugins/resolvePhotonConfigPlugin.ts +++ b/packages/photonjs/src/plugin/plugins/resolvePhotonConfigPlugin.ts @@ -1,59 +1,62 @@ import type { Plugin } from 'vite' +import type { Photon } from '../../types.js' +import { PhotonConfigError } from '../../utils/assert.js' import { resolvePhotonConfig } from '../../validators/coerce.js' +import { singleton } from '../utils/dedupe.js' +let resolvedPhotonConfig: Photon.ConfigResolved | null = null export function resolvePhotonConfigPlugin(pluginConfig?: Photon.Config): Plugin[] { - return [ - { + const plugins: Plugin[] = [ + singleton({ name: 'photon:resolve-config', enforce: 'pre', - config(userConfig) { - // Custom config merging - // TODO unit tests - if (pluginConfig || userConfig.photon) { - userConfig.photon ??= {} - const resolvedUserConfig = resolvePhotonConfig(userConfig.photon) - const resolvedPluginConfig = resolvePhotonConfig(pluginConfig) - - // server - userConfig.photon.server = userConfig.photon?.server ? resolvedUserConfig.server : resolvedPluginConfig.server - - // handlers - userConfig.photon.handlers = Object.assign({}, resolvedPluginConfig.handlers, resolvedUserConfig.handlers) - - // middlewares - userConfig.photon.middlewares ??= [] - if (resolvedPluginConfig.middlewares) { - userConfig.photon.middlewares.push(...resolvedPluginConfig.middlewares) - } - if (resolvedUserConfig.middlewares) { - userConfig.photon.middlewares.push(...resolvedUserConfig.middlewares) - } - - // devServer - if (pluginConfig?.devServer) { - userConfig.photon.devServer = resolvedPluginConfig.devServer ?? true - } - if (userConfig.photon.devServer === false) { - userConfig.photon.devServer = false - } else if (typeof resolvedUserConfig.devServer === 'object') { - userConfig.photon.devServer = - typeof userConfig.photon.devServer === 'boolean' - ? resolvedUserConfig.devServer - : { ...userConfig.photon.devServer, ...resolvedUserConfig.devServer } + config: { + order: 'pre', + handler() { + return { + photon: [], } - - // hmr - userConfig.photon.hmr = userConfig.photon?.hmr ? resolvedUserConfig.hmr : resolvedPluginConfig.hmr - } + }, }, configResolved: { order: 'pre', handler(config) { - config.photon = resolvePhotonConfig(config.photon) + // Ensures that a unique photon config exists across all envs + if (resolvedPhotonConfig === null) { + // biome-ignore lint/suspicious/noExplicitAny: + resolvedPhotonConfig = resolvePhotonConfig(config.photon as any) + } + if (resolvedPhotonConfig.codeSplitting.framework) { + const serverConfigEntries = resolvedPhotonConfig.entries.filter((e) => e.type === 'server-config') + if (serverConfigEntries.length > 0) { + throw new PhotonConfigError( + 'server-config entries are not supported when codeSplitting.framework is true. Please disable code splitting or remove server-config entries.', + ) + } + } + config.photon = resolvedPhotonConfig }, }, - }, + }), ] + + if (pluginConfig) { + plugins.push({ + name: 'photon:manual-config', + enforce: 'pre', + + config: { + order: 'pre', + handler() { + return { + photon: [pluginConfig], + } + }, + }, + }) + } + + return plugins } diff --git a/packages/photonjs/src/plugin/plugins/supportedServers.ts b/packages/photonjs/src/plugin/plugins/supportedServers.ts index 03554c0..0414795 100644 --- a/packages/photonjs/src/plugin/plugins/supportedServers.ts +++ b/packages/photonjs/src/plugin/plugins/supportedServers.ts @@ -1,26 +1,8 @@ import type { Plugin } from 'vite' import type { SupportedServers } from '../../validators/types.js' +import { importsToServer } from '../utils/servers.js' -export { supportedTargetServers } - -function getImports(id: string) { - return [id, `@photonjs/${id}`, `@photonjs/core/${id}`] -} - -const serversToIds: Record = { - hono: getImports('hono'), - hattip: getImports('hattip'), - elysia: getImports('elysia'), - h3: getImports('h3'), - express: getImports('express'), - fastify: getImports('fastify'), -} - -const idsToServers = Object.fromEntries( - Object.entries(serversToIds).flatMap(([k, v]) => v.map((x) => [x, k])), -) as Record - -function supportedTargetServers(name: string, servers: SupportedServers[], recommend = 'hono'): Plugin { +export function supportedTargetServers(name: string, servers: SupportedServers[], recommend = 'hono'): Plugin { const serversSet = new Set(servers) return { @@ -28,9 +10,9 @@ function supportedTargetServers(name: string, servers: SupportedServers[], recom enforce: 'pre', resolveId(id) { - if (idsToServers[id] && !serversSet.has(idsToServers[id])) { + if (importsToServer[id] && !serversSet.has(importsToServer[id])) { this.error( - `[photon][${name}] \`${idsToServers[id]}\` is not supported while targetting \`${name}\`. We recommend using \`${recommend}\` instead.`, + `[photon][${name}] \`${importsToServer[id]}\` is not supported while targetting \`${name}\`. We recommend using \`${recommend}\` instead.`, ) } }, diff --git a/packages/photonjs/src/plugin/plugins/targetLoader.ts b/packages/photonjs/src/plugin/plugins/targetLoader.ts new file mode 100644 index 0000000..3267845 --- /dev/null +++ b/packages/photonjs/src/plugin/plugins/targetLoader.ts @@ -0,0 +1,117 @@ +import type { Plugin } from 'vite' +import { getPhotonServerIdWithEntry } from '../../api/api.js' +import type { Photon } from '../../types.js' +import { getPhotonMeta } from '../../utils/meta.js' +import { escapeStringRegexp } from '../utils/escapeStringRegexp.js' +import type { LoadResult, PluginContext } from '../utils/rollupTypes.js' + +type LoadHook = ( + this: PluginContext, + id: string, + options: { + meta: Photon.EntryServer + ssr?: boolean + }, +) => Promise | LoadResult + +export function targetLoader( + name: string, + options: { load: LoadHook } & Omit, +): Plugin[] { + const prefix = `photon:${name}` + const re_prefix = new RegExp(`^${escapeStringRegexp(prefix)}:`) + + return [ + { + name: `photon:target-loader:${name}:emit`, + + apply: 'build', + enforce: 'post', + + buildStart: { + order: 'post', + handler() { + const envName = this.environment.name + const photon = this.environment.config.photon + const isEdge = this.environment.config.resolve.conditions.some((x) => + ['edge-light', 'worker', 'workerd', 'edge'].includes(x), + ) + + if (photon.defaultBuildEnv === envName) { + this.emitFile({ + type: 'chunk', + fileName: photon.server.target || photon.server.name, + id: `${prefix}:${photon.server.id}`, + }) + } + + // Emit handlers, each wrapped behind the server entry + for (const entry of photon.entries) { + if ( + (entry.env || 'ssr') === envName && + // if framework codeSplitting is enabled or if a target has explicitely been set, emit a new entry + (photon.codeSplitting.framework || entry.target) + ) { + this.emitFile({ + type: 'chunk', + fileName: entry.target || entry.name, + id: `${prefix}:${getPhotonServerIdWithEntry(isEdge ? 'edge' : 'node', entry.name)}`, + }) + } + } + }, + }, + + sharedDuringBuild: true, + }, + { + ...options, + name: `photon:target-loader:${name}:loader`, + + resolveId: { + filter: { + id: re_prefix, + }, + + async handler(id, importer, opts) { + const resolved = await this.resolve(id.replace(re_prefix, ''), importer, opts) + + if (!resolved) { + return this.error(`[photon][${name}] Cannot resolve ${id}`) + } + + return { + ...resolved, + // tag module as target entry for other plugins to use + meta: { + ...resolved.meta, + photonConfig: { + ...resolved.meta?.photonConfig, + isTargetEntry: true, + }, + }, + id: `${prefix}:${resolved.id}`, + } + }, + }, + + load: { + filter: { + id: re_prefix, + }, + + async handler(id, opts) { + const actualId = id.slice(prefix.length + 1) + // At this point, all handlers are wrapped with the server entry, so the entry type is always "server" + const meta = (await getPhotonMeta(this, id)) as Photon.EntryServer + return options.load.call(this, actualId, { + ...opts, + meta, + }) + }, + }, + + sharedDuringBuild: true, + }, + ] +} diff --git a/packages/photonjs/src/plugin/utils/dedupe.ts b/packages/photonjs/src/plugin/utils/dedupe.ts new file mode 100644 index 0000000..5aecfd3 --- /dev/null +++ b/packages/photonjs/src/plugin/utils/dedupe.ts @@ -0,0 +1,28 @@ +import type { Plugin } from 'vite' + +export function singleton(originalPlugin: Plugin): Plugin { + const originalConfigResolved = originalPlugin.configResolved + + originalPlugin.configResolved = { + order: originalConfigResolved && 'order' in originalConfigResolved ? originalConfigResolved.order : 'pre', + handler(c) { + const duplicates = c.plugins.filter((p) => p.name === originalPlugin.name).slice(1) + for (const p of duplicates) { + const keysToDelete = Object.keys(p).filter((k) => k !== 'name') + p.name += ':disabled' + for (const key of keysToDelete) { + // @ts-ignore + delete p[key] + } + } + if (originalConfigResolved) { + if (typeof originalConfigResolved === 'function') { + return originalConfigResolved.call(this, c) + } + return originalConfigResolved.handler.call(this, c) + } + }, + } + + return originalPlugin +} diff --git a/packages/photonjs/src/plugin/utils/entry.ts b/packages/photonjs/src/plugin/utils/entry.ts index 12ba0a6..04c5c98 100644 --- a/packages/photonjs/src/plugin/utils/entry.ts +++ b/packages/photonjs/src/plugin/utils/entry.ts @@ -1,25 +1,17 @@ -import type { CustomPluginOptions } from 'rollup' -import type { SupportedServers } from '../../validators/types.js' +import type { Photon } from '../../types.js' -export function isPhotonMeta(meta?: CustomPluginOptions): meta is { photon: PhotonMeta } { +// biome-ignore lint/suspicious/noExplicitAny: +type AnyRecord = Record + +export function isPhotonMeta(meta?: T): meta is T & { photon: PhotonMeta } { return Boolean(meta && 'photon' in meta) } -export function isPhotonMetaConfig(meta?: CustomPluginOptions): meta is { photonConfig: PhotonMetaConfig } { +export function isPhotonMetaConfig(meta?: T): meta is T & { photonConfig: PhotonMetaConfig } { return Boolean(meta && 'photonConfig' in meta) } -export interface PhotonMetaServer { - type: 'server' - server: SupportedServers -} - -export interface PhotonMetaUniversalHandler { - type: 'universal-handler' - route?: string -} - -export type PhotonMeta = PhotonMetaServer | PhotonMetaUniversalHandler +export type PhotonMeta = Photon.EntryServer | Photon.EntryUniversalHandler export interface PhotonMetaConfig { /** @@ -27,4 +19,5 @@ export interface PhotonMetaConfig { * a 'full-reload' will occur. */ isGlobal?: boolean + isTargetEntry?: boolean } diff --git a/packages/photonjs/src/plugin/utils/escapeStringRegexp.ts b/packages/photonjs/src/plugin/utils/escapeStringRegexp.ts new file mode 100644 index 0000000..3f69ace --- /dev/null +++ b/packages/photonjs/src/plugin/utils/escapeStringRegexp.ts @@ -0,0 +1,4 @@ +// Credit: https://github.com/sindresorhus/escape-string-regexp/blob/main/index.js +export function escapeStringRegexp(subject: string) { + return subject.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d') +} diff --git a/packages/photonjs/src/plugin/utils/resolve.ts b/packages/photonjs/src/plugin/utils/resolve.ts index 100625d..9cbbb32 100644 --- a/packages/photonjs/src/plugin/utils/resolve.ts +++ b/packages/photonjs/src/plugin/utils/resolve.ts @@ -1,5 +1,5 @@ -import type { PluginContext } from 'rollup' import type { Nullable } from 'unplugin' +import type { PluginContext } from './rollupTypes.js' interface Opts { source: Parameters[0] @@ -7,7 +7,7 @@ interface Opts { opts?: Parameters[2] } -export async function resolveFirst(pluginContext: PluginContext, tryToResolve: Nullable[]) { +export async function resolveFirst(pluginContext: Pick, tryToResolve: Nullable[]) { const resolving = await Promise.all( (tryToResolve.filter(Boolean) as Opts[]).map(({ source, importer, opts }) => pluginContext.resolve(source, importer, opts), diff --git a/packages/photonjs/src/plugin/utils/rollupTypes.ts b/packages/photonjs/src/plugin/utils/rollupTypes.ts new file mode 100644 index 0000000..8319144 --- /dev/null +++ b/packages/photonjs/src/plugin/utils/rollupTypes.ts @@ -0,0 +1,10 @@ +import type { Plugin } from 'vite' + +// biome-ignore lint/suspicious/noExplicitAny: +export type PluginContext = ThisParameterType any>> + +// biome-ignore lint/suspicious/noExplicitAny: +export type ModuleInfo = Parameters any>>[0] + +// biome-ignore lint/suspicious/noExplicitAny: +export type LoadResult = Awaited any>>> diff --git a/packages/photonjs/src/plugin/utils/servers.ts b/packages/photonjs/src/plugin/utils/servers.ts new file mode 100644 index 0000000..decd04a --- /dev/null +++ b/packages/photonjs/src/plugin/utils/servers.ts @@ -0,0 +1,18 @@ +import type { SupportedServers } from '../../validators/types.js' + +function getImports(id: string) { + return [id, `@photonjs/${id}`, `@photonjs/core/${id}`] +} + +export const serversToImports: Record = { + hono: getImports('hono'), + hattip: getImports('hattip'), + elysia: getImports('elysia'), + h3: getImports('h3'), + express: getImports('express'), + fastify: getImports('fastify'), +} + +export const importsToServer = Object.fromEntries( + Object.entries(serversToImports).flatMap(([k, v]) => v.map((x) => [x, k])), +) as Record diff --git a/packages/photonjs/src/plugin/utils/universal.ts b/packages/photonjs/src/plugin/utils/universal.ts new file mode 100644 index 0000000..d975f5a --- /dev/null +++ b/packages/photonjs/src/plugin/utils/universal.ts @@ -0,0 +1,20 @@ +import { type EnhancedMiddleware, getUniversal, nameSymbol } from '@universal-middleware/core' +import { PhotonConfigError } from '../../utils/assert.js' + +type ErrorMessage = (id: string, i: number) => string + +export function extractUniversal( + mi: EnhancedMiddleware | EnhancedMiddleware[], + id: string, + errorMessage: ErrorMessage, +) { + return [mi] + .flat(Number.POSITIVE_INFINITY) + .map((x) => getUniversal(x as EnhancedMiddleware)) + .map((m, i) => { + if (typeof m === 'function' && nameSymbol in m) { + return m + } + throw new PhotonConfigError(errorMessage(id, i)) + }) +} diff --git a/packages/photonjs/src/plugin/utils/virtual.ts b/packages/photonjs/src/plugin/utils/virtual.ts index b3c7734..b424d8c 100644 --- a/packages/photonjs/src/plugin/utils/virtual.ts +++ b/packages/photonjs/src/plugin/utils/virtual.ts @@ -1,50 +1,49 @@ -import { type Out, type Type, type } from 'arktype' -import { assert } from '../../utils/assert.js' - -type ToLiteral = T extends `\${${infer _}}` ? string : T -type ToParse = T extends `\${${infer X}?}` - ? { [K in X]?: string } - : T extends `\${${infer X}}` - ? { [K in X]: string } - : // biome-ignore lint/complexity/noBannedTypes: - {} - -type Literal = T extends `${infer A}:${infer B}` ? `${ToLiteral}:${Literal}` : ToLiteral -type Parse = T extends `${infer A}:${infer B}` ? ToParse & Parse : ToParse - -export function literal(pattern: T) { - const regex = new RegExp( - `^${pattern.replace(/:\$\{(.*?)\?}/g, '(?::(?<$1>.*))?').replace(/\$\{(.*?)}/g, '(?<$1>.*)')}\$`, - ) - return type(regex) - .configure({ expected: pattern }) - .pipe.try((x) => { +export function regexGroups(regex: RegExp) { + return { + regex, + match(x?: string) { + if (x === undefined) return null const match = x.match(regex) - assert(match) - return match.groups as Parse - // biome-ignore lint/complexity/noBannedTypes: - }) as Type<(In: Literal) => Out>, {}> + if (match === null) return null + return match.groups as T + }, + } } -export const virtualModules = { - 'handler-entry': literal('photon:handler-entry:${entry}'), - 'server-entry': literal('photon:server-entry:${entry?}'), - 'fallback-entry': literal('photon:fallback-entry'), - 'resolve-from-photon': literal('photon:resolve-from-photon:${module}'), - 'get-middlewares': literal('photon:get-middlewares:${condition}:${server}'), +const virtualModules = { + 'virtual-entry': regexGroups<{ uniqueId: string; entry: string }>( + /^photon:virtual-entry:(?.+?):(?.+)/, + ), + 'handler-entry': regexGroups<{ entry: string }>(/^photon:handler-entry:(?.+)/), + 'server-entry': regexGroups<{ entry?: string }>(/^photon:server-entry(?:$|:(?.+))/), + 'server-entry-with-entry': regexGroups<{ condition: string; entry: string }>( + /^photon:server-entry-with-entry:(?.+?):(?.+)/, + ), + 'fallback-entry': regexGroups(/^photon:fallback-entry/), + 'resolve-from-photon': regexGroups<{ module: string }>(/^photon:resolve-from-photon:(?.+)/), + 'get-middlewares': regexGroups<{ condition: string; server: string; handler?: string }>( + /^photon:get-middlewares:(?.+?):(?[^:]+)(?::(?.+))?/, + ), } +export const virtualModulesRegex = Object.fromEntries( + Object.entries(virtualModules).map(([k, v]) => [k, v.regex]), +) as Record + type VirtualModuleKeys = keyof typeof virtualModules +type ExtractArgs = NonNullable< + ReturnType<(typeof virtualModules)[K extends VirtualModuleKeys ? K : K[number]]['match']> +> export function ifPhotonModule< K extends VirtualModuleKeys | VirtualModuleKeys[], // biome-ignore lint/suspicious/noExplicitAny: - F extends (arg: (typeof virtualModules)[K extends VirtualModuleKeys ? K : K[number]]['infer']) => any, + F extends (arg: ExtractArgs) => any, >(key: K, value: unknown, callback: F): null | ReturnType export function ifPhotonModule< K extends VirtualModuleKeys | VirtualModuleKeys[], // biome-ignore lint/suspicious/noExplicitAny: - F extends (arg: (typeof virtualModules)[K extends VirtualModuleKeys ? K : K[number]]['infer']) => any, + F extends (arg: ExtractArgs) => any, R, >( key: K, @@ -60,7 +59,7 @@ export function ifPhotonModule< export function ifPhotonModule< K extends VirtualModuleKeys | VirtualModuleKeys[], // biome-ignore lint/suspicious/noExplicitAny: - F extends (arg: (typeof virtualModules)[K extends VirtualModuleKeys ? K : K[number]]['infer']) => any, + F extends (arg: ExtractArgs) => any, >(key: K, value: unknown, callback: F, next: unknown = null): unknown | ReturnType { function returnOrThrow() { if (next instanceof Error) { @@ -75,22 +74,25 @@ export function ifPhotonModule< if (Array.isArray(key)) { for (const k of key) { - const r = ifPhotonModule(k as VirtualModuleKeys, value, callback) + // biome-ignore lint/suspicious/noExplicitAny: + const r = ifPhotonModule(k as VirtualModuleKeys, value, callback as any) if (r !== null) return r } return returnOrThrow() } - const out = virtualModules[key as VirtualModuleKeys](value) + // biome-ignore lint/suspicious/noExplicitAny: + const out = virtualModules[key as VirtualModuleKeys].match(value as any) - if (out instanceof type.errors) { + if (out === null) { return returnOrThrow() } - return callback(out) + // biome-ignore lint/suspicious/noExplicitAny: + return callback(out as any) } -export function asPhotonEntryId(id: string, type: 'handler-entry' | 'server-entry') { +export function asPhotonEntryId(id: string, type: 'handler-entry' | 'server-entry' | 'server-config') { if (id.startsWith(`photon:${type}`)) { return id } diff --git a/packages/photonjs/src/servers/elysia.ts b/packages/photonjs/src/servers/elysia.ts new file mode 100644 index 0000000..17f9e55 --- /dev/null +++ b/packages/photonjs/src/servers/elysia.ts @@ -0,0 +1,2 @@ +export { apply, type RuntimeAdapter } from '@photonjs/core/elysia/apply' +export { serve } from '@photonjs/core/elysia/serve' diff --git a/packages/photonjs/src/servers/express.ts b/packages/photonjs/src/servers/express.ts new file mode 100644 index 0000000..1bf20fb --- /dev/null +++ b/packages/photonjs/src/servers/express.ts @@ -0,0 +1,2 @@ +export { apply, type RuntimeAdapter } from '@photonjs/core/express/apply' +export { serve } from '@photonjs/core/express/serve' diff --git a/packages/photonjs/src/servers/fastify.ts b/packages/photonjs/src/servers/fastify.ts new file mode 100644 index 0000000..b573b54 --- /dev/null +++ b/packages/photonjs/src/servers/fastify.ts @@ -0,0 +1,2 @@ +export { apply, type RuntimeAdapter } from '@photonjs/core/fastify/apply' +export { serve } from '@photonjs/core/fastify/serve' diff --git a/packages/photonjs/src/servers/h3.ts b/packages/photonjs/src/servers/h3.ts new file mode 100644 index 0000000..a08842a --- /dev/null +++ b/packages/photonjs/src/servers/h3.ts @@ -0,0 +1,2 @@ +export { apply, type RuntimeAdapter } from '@photonjs/core/h3/apply' +export { serve } from '@photonjs/core/h3/serve' diff --git a/packages/photonjs/src/servers/hattip.ts b/packages/photonjs/src/servers/hattip.ts new file mode 100644 index 0000000..c6564e3 --- /dev/null +++ b/packages/photonjs/src/servers/hattip.ts @@ -0,0 +1,2 @@ +export { apply, type RuntimeAdapter } from '@photonjs/core/hattip/apply' +export { serve } from '@photonjs/core/hattip/serve' diff --git a/packages/photonjs/src/servers/hono.ts b/packages/photonjs/src/servers/hono.ts new file mode 100644 index 0000000..c4b919e --- /dev/null +++ b/packages/photonjs/src/servers/hono.ts @@ -0,0 +1,2 @@ +export { apply, type RuntimeAdapter } from '@photonjs/core/hono/apply' +export { serve } from '@photonjs/core/hono/serve' diff --git a/packages/photonjs/src/types.ts b/packages/photonjs/src/types.ts index ae652d8..4f744f0 100644 --- a/packages/photonjs/src/types.ts +++ b/packages/photonjs/src/types.ts @@ -2,20 +2,30 @@ import type { PhotonConfig, PhotonConfigResolved, PhotonEntryBase, + PhotonEntryPartial, PhotonEntryServer, + PhotonEntryServerConfig, + PhotonEntryServerPartial, PhotonEntryUniversalHandler, } from './validators/types.js' -declare global { - export namespace Photon { - export interface EntryBase extends PhotonEntryBase {} - export interface EntryServer extends EntryBase, PhotonEntryServer {} - export interface EntryUniversalHandler extends EntryBase, PhotonEntryUniversalHandler {} +export namespace Photon { + export interface EntryBase extends PhotonEntryBase {} + export interface EntryServer extends EntryBase, PhotonEntryServer {} + export interface EntryServerPartial extends Omit, PhotonEntryServerPartial {} + export interface EntryServerConfig extends Omit, PhotonEntryServerConfig {} + export interface EntryPartial extends Omit, PhotonEntryPartial {} + export interface EntryUniversalHandler extends EntryBase, PhotonEntryUniversalHandler {} - export type Entry = EntryServer | EntryUniversalHandler + export type Entry = EntryServer | EntryUniversalHandler | EntryServerConfig - export interface Config extends PhotonConfig {} + export interface Config extends PhotonConfig { + server?: string | EntryServerPartial + entries?: Record + } - export interface ConfigResolved extends PhotonConfigResolved {} + export interface ConfigResolved extends PhotonConfigResolved { + server: EntryServer + entries: (EntryUniversalHandler | EntryServerConfig)[] } } diff --git a/packages/photonjs/src/utils/assert.ts b/packages/photonjs/src/utils/assert.ts index ea05b7b..6af56a6 100644 --- a/packages/photonjs/src/utils/assert.ts +++ b/packages/photonjs/src/utils/assert.ts @@ -1,17 +1,81 @@ -export { assert, assertUsage } +export { + assert, + assertUsage, + PhotonError, + PhotonBugError, + PhotonUsageError, + PhotonConfigError, + PhotonRuntimeError, + PhotonDependencyError, +} import pc from '@brillout/picocolors' +/** + * Base class for all PhotonJS errors + */ +abstract class PhotonError extends Error { + protected constructor(category: string, message: string, options?: ErrorOptions) { + super(`${red(`[photon][${category}]`)} ${message}`, options) + this.name = this.constructor.name + } +} + +/** + * Internal PhotonJS bugs that should be reported to maintainers + */ +class PhotonBugError extends PhotonError { + constructor(message?: string, options?: ErrorOptions) { + const defaultMessage = + 'You stumbled upon a PhotonJS bug. Reach out on GitHub and copy-paste this error — a maintainer will fix the bug.' + super('Bug', `${message || defaultMessage}`, options) + } +} + +/** + * User errors due to incorrect usage + */ +class PhotonUsageError extends PhotonError { + constructor(message: string, options?: ErrorOptions) { + super('Wrong Usage', message, options) + } +} + +/** + * Configuration errors + */ +class PhotonConfigError extends PhotonError { + constructor(message: string, options?: ErrorOptions) { + super('Config Error', message, options) + } +} + +/** + * Runtime errors during execution + */ +class PhotonRuntimeError extends PhotonError { + constructor(message: string, options?: ErrorOptions) { + super('Runtime Error', message, options) + } +} + +/** + * Missing dependency errors + */ +class PhotonDependencyError extends PhotonError { + constructor(message: string, options?: ErrorOptions) { + super('Dependency Error', message, options) + } +} + function assert(condition: unknown): asserts condition { if (condition) return - throw new Error( - `${red('[photon][Bug]')} You stumbled upon a PhotonJS bug. Reach out on GitHub and copy-paste this error — a maintainer will fix the bug.`, - ) + throw new PhotonBugError() } function assertUsage(condition: unknown, message: string): asserts condition { if (condition) return - throw new Error(`${red('[photon][Wrong Usage]')} ${message}`) + throw new PhotonUsageError(message) } function red(str: string) { diff --git a/packages/photonjs/src/utils/deferred.ts b/packages/photonjs/src/utils/deferred.ts new file mode 100644 index 0000000..e171799 --- /dev/null +++ b/packages/photonjs/src/utils/deferred.ts @@ -0,0 +1,17 @@ +export interface Deferred { + promise: Promise + resolve: (value: T | PromiseLike) => void + reject: (reason?: unknown) => void +} + +export function createDeferred(): Deferred { + let resolve!: (value: T | PromiseLike) => void + let reject!: (reason?: unknown) => void + + const promise = new Promise((res, rej) => { + resolve = res + reject = rej + }) + + return { promise, resolve, reject } +} diff --git a/packages/photonjs/src/utils/meta.ts b/packages/photonjs/src/utils/meta.ts new file mode 100644 index 0000000..66fb9a2 --- /dev/null +++ b/packages/photonjs/src/utils/meta.ts @@ -0,0 +1,47 @@ +import { isPhotonMeta, type PhotonMeta } from '../plugin/utils/entry.js' +import type { PluginContext } from '../plugin/utils/rollupTypes.js' +import { asPhotonEntryId } from '../plugin/utils/virtual.js' +import type { Photon } from '../types.js' +import { assertUsage, PhotonUsageError } from './assert.js' + +interface HintToMeta { + 'handler-entry': Photon.EntryUniversalHandler + 'server-entry': Photon.EntryServer +} + +/** + * Retrieves Photon metadata associated with a specific entry + */ +export async function getPhotonMeta( + pluginContext: PluginContext, + id: string, + hint?: T, +): Promise { + const actualId = hint ? asPhotonEntryId(id, hint) : id + + { + const info = pluginContext.getModuleInfo(actualId) + if (isPhotonMeta(info?.meta)) { + // biome-ignore lint/suspicious/noExplicitAny: + return info.meta.photon as any + } + } + + const resolved = await pluginContext.resolve(actualId, undefined, { isEntry: true }) + assertUsage(resolved, `Could not resolve ${actualId}`) + + if (isPhotonMeta(resolved.meta)) { + // biome-ignore lint/suspicious/noExplicitAny: + return resolved.meta.photon as any + } + + { + const info = pluginContext.getModuleInfo(resolved.id) + if (isPhotonMeta(info?.meta)) { + // biome-ignore lint/suspicious/noExplicitAny: + return info.meta.photon as any + } + } + + throw new PhotonUsageError(`Could not find Photon meta for "${id}" (hint: ${hint})`) +} diff --git a/packages/photonjs/src/validators/coerce.ts b/packages/photonjs/src/validators/coerce.ts index d1a5c2e..86565f9 100644 --- a/packages/photonjs/src/validators/coerce.ts +++ b/packages/photonjs/src/validators/coerce.ts @@ -1,76 +1,159 @@ -import { match, type } from 'arktype' +import { isBun } from '../plugin/utils/isBun.js' +import { isDeno } from '../plugin/utils/isDeno.js' import { asPhotonEntryId } from '../plugin/utils/virtual.js' -import type { - PhotonConfig, - PhotonConfigResolved, - PhotonEntryBase, - PhotonEntryServer, - PhotonEntryUniversalHandler, -} from './types.js' +import type { Photon } from '../types.js' +import { assert, PhotonConfigError } from '../utils/assert.js' +import type { PhotonConfig, PhotonEntryPartial, PhotonEntryServerPartial } from './types.js' import * as Validators from './validators.js' -function entryToPhoton< - T extends 'handler-entry' | 'server-entry', - Entry = T extends 'server-entry' ? PhotonEntryServer : PhotonEntryUniversalHandler, ->(entry: string | Entry, type: T): Entry { - if (typeof entry === 'string') +export function entryToPhoton( + defaultType: 'server-entry', + entry: string | PhotonEntryServerPartial, + name: 'index', +): Photon.EntryServer +export function entryToPhoton( + defaultType: 'handler-entry', + entry: string | PhotonEntryPartial, + name: string, +): Photon.EntryUniversalHandler | Photon.EntryServerConfig +export function entryToPhoton( + defaultType: 'server-entry' | 'handler-entry', + entry: string | PhotonEntryServerPartial | PhotonEntryPartial, + name: string, +): Photon.Entry { + assert(name) + if (typeof entry === 'string') { return { - id: asPhotonEntryId(entry, type), - type: type === 'server-entry' ? 'server' : 'universal-handler', - } as Entry + id: asPhotonEntryId(entry, defaultType), + name, + type: defaultType === 'server-entry' ? 'server' : 'universal-handler', + } + } + if (entry.type === 'server-config' || entry.id === 'photon:server-entry' || !entry.id) { + return { + ...entry, + id: 'photon:server-entry', + type: 'server-config', + name, + } + } return { ...entry, - type: type === 'server-entry' ? 'server' : 'universal-handler', - id: asPhotonEntryId((entry as PhotonEntryBase).id, type), + id: asPhotonEntryId(entry.id, defaultType), + type: defaultType === 'server-entry' ? 'server' : 'universal-handler', + name, } } -function handlersToPhoton( - handlers: Record | string>, -): Record { - return Object.fromEntries( - Object.entries(handlers).map(([key, value]) => [ - key, - entryToPhoton(value as PhotonEntryUniversalHandler, 'handler-entry'), - ]), - ) +function entriesToPhoton( + entries: PhotonConfig['entries'], +): (Photon.EntryUniversalHandler | Photon.EntryServerConfig)[] { + return Object.entries(entries ?? {}).map(([key, value]) => entryToPhoton('handler-entry', value, key)) } -export function resolvePhotonConfig(config: PhotonConfig | undefined): PhotonConfigResolved { - const out = Validators.PhotonConfig.pipe.try((c) => { - const toRest = match - .in() - .case({ '[string]': 'unknown' }, (v) => { - const { handlers, server, hmr, middlewares, ...rest } = v - return rest - }) - .default(() => ({})) +function excludeTrue(v: T): Partial> { + if (v === true) return {} + return v as Exclude +} - const handlers = handlersToPhoton(c.handlers ?? {}) - const server = c.server - ? entryToPhoton(c.server, 'server-entry') +const resolver = Validators.PhotonConfig.transform((c) => { + return Validators.PhotonConfigResolved.parse({ + // Allows Photon targets to add custom options + ...c, + entries: entriesToPhoton(c.entries), + server: c.server + ? entryToPhoton('server-entry', c.server, 'index') : entryToPhoton( + 'server-entry', { id: 'photon:fallback-entry', type: 'server', server: 'hono', }, - 'server-entry', - ) - const hmr = c.hmr ?? true - const middlewares = c.middlewares ?? [] - // Allows Photon targets to add custom options - const rest = toRest(c) + 'index', + ), + devServer: + c.devServer === false + ? false + : { + env: excludeTrue(c.devServer)?.env ?? 'ssr', + autoServe: excludeTrue(c.devServer)?.autoServe ?? true, + }, + middlewares: c.middlewares ?? [], + codeSplitting: { + framework: c.codeSplitting?.framework ?? true, + target: c.codeSplitting?.target ?? false, + }, + defaultBuildEnv: c.defaultBuildEnv ?? 'ssr', + hmr: c.hmr ?? (isBun || isDeno ? 'prefer-restart' : true), + }) +}) - return { - handlers, - server, - hmr, - middlewares, - ...rest, +export function mergePhotonConfig(configs: Photon.Config[]): Photon.Config { + const resolving: Photon.Config = {} + resolving.entries = {} + resolving.middlewares = [] + resolving.codeSplitting = {} + for (const config of configs) { + // server + if (config.server) { + resolving.server = config.server + } + + // entries + // Check for duplicate entries + if (config.entries) { + const names = new Set() + for (const name of [...Object.keys(resolving.entries), ...Object.keys(config.entries)]) { + if (names.has(name)) { + throw new PhotonConfigError(`Duplicate entry name: ${name}`) + } + names.add(name) + } + Object.assign(resolving.entries, config.entries) } - }, Validators.PhotonConfigResolved)(config) - if (out instanceof type.errors) return out.throw() - return out + // middlewares + if (config.middlewares) { + resolving.middlewares.push(...config.middlewares) + } + + // devServer + // if devServer has already been set to false, keep it that way + if (resolving.devServer !== false) { + if (config.devServer === false) { + resolving.devServer = false + } else if (config.devServer) { + resolving.devServer = config.devServer + } + } + + // hmr + if (typeof config.hmr !== 'undefined') { + resolving.hmr = config.hmr + } + + // codeSplitting + // if codeSplitting has already been set to false, keep it that way + if (resolving.codeSplitting.framework !== false) { + if (typeof config.codeSplitting?.framework !== 'undefined') { + resolving.codeSplitting.framework = config.codeSplitting.framework + } + } + if (resolving.codeSplitting.target !== false) { + if (typeof config.codeSplitting?.target !== 'undefined') { + resolving.codeSplitting.target = config.codeSplitting.target + } + } + + if (config.defaultBuildEnv) { + resolving.defaultBuildEnv = config.defaultBuildEnv + } + } + return resolving +} + +export function resolvePhotonConfig(config: Photon.Config | Photon.Config[] | undefined): Photon.ConfigResolved { + const _config: Photon.Config | undefined = Array.isArray(config) ? mergePhotonConfig(config) : config + return resolver.parse(_config ?? {}) } diff --git a/packages/photonjs/src/validators/types.ts b/packages/photonjs/src/validators/types.ts index 30ef44b..2e212e9 100644 --- a/packages/photonjs/src/validators/types.ts +++ b/packages/photonjs/src/validators/types.ts @@ -1,13 +1,17 @@ +import type { z } from 'zod/v4' import type * as Validators from './validators.js' -export type SupportedServers = typeof Validators.SupportedServers.infer +export type SupportedServers = z.infer -export type PhotonEntryServer = typeof Validators.PhotonEntryServer.infer -export type PhotonEntryUniversalHandler = typeof Validators.PhotonEntryUniversalHandler.infer -export type PhotonEntryBase = typeof Validators.PhotonEntryBase.infer +export type PhotonEntryServer = z.infer +export type PhotonEntryServerPartial = z.infer +export type PhotonEntryServerConfig = z.infer +export type PhotonEntryUniversalHandler = z.infer +export type PhotonEntryBase = z.infer +export type PhotonEntryPartial = z.infer -export type PhotonConfig = typeof Validators.PhotonConfig.infer +export type PhotonConfig = z.infer -export type PhotonConfigResolved = typeof Validators.PhotonConfigResolved.infer +export type PhotonConfigResolved = z.infer export type GetPhotonCondition = Validators.GetPhotonCondition diff --git a/packages/photonjs/src/validators/validators.ts b/packages/photonjs/src/validators/validators.ts index 6538426..34cf78b 100644 --- a/packages/photonjs/src/validators/validators.ts +++ b/packages/photonjs/src/validators/validators.ts @@ -1,53 +1,112 @@ -import { type } from 'arktype' -import type { PluginContext } from 'rollup' +import type { ViteDevServer } from 'vite' +import { z } from 'zod/v4' +import type { PluginContext } from '../plugin/utils/rollupTypes.js' -// FIXME server should be optional? +// FIXME should server be optional? export type GetPhotonCondition = ( - this: PluginContext, + this: ViteDevServer | PluginContext, condition: 'dev' | 'edge' | 'node', server: string, // biome-ignore lint/suspicious/noConfusingVoidType: ) => string | string[] | undefined | null | void -export const SupportedServers = type("'hono' | 'hattip' | 'elysia' | 'express' | 'fastify' | 'h3'") +export const SupportedServers = z.enum(['hono', 'hattip', 'elysia', 'express', 'fastify', 'h3']) -export const PhotonEntryBase = type({ - id: 'string', - 'route?': 'string', - 'resolvedId?': 'string', +export const PhotonEntryBase = z.object({ + id: z.string(), + name: z.string(), + target: z.string().optional(), + route: z.string().optional(), + resolvedId: z.string().optional(), }) -export const PhotonEntryServer = type({ - '...': PhotonEntryBase, - type: "'server'", - 'server?': SupportedServers, -}) +export const PhotonEntryServer = PhotonEntryBase.extend({ + type: z.literal('server'), + server: SupportedServers.optional(), +}).loose() -export const PhotonEntryUniversalHandler = type({ - '...': PhotonEntryBase, - type: "'universal-handler'", +export const PhotonEntryServerPartial = PhotonEntryServer.extend({ + type: PhotonEntryServer.shape.type.optional(), }) + .omit({ + name: true, + }) + .loose() -export const PhotonConfig = type({ - 'handlers?': { - '[string]': type('string').or(PhotonEntryUniversalHandler.partial()), - }, - 'server?': type('string').or(PhotonEntryServer.partial()), - 'hmr?': "boolean | 'prefer-restart'", - 'middlewares?': 'Array | undefined' as type.cast, - 'devServer?': type('boolean').or({ - 'autoServe?': 'boolean', - }), +export const PhotonEntryUniversalHandler = PhotonEntryBase.extend({ + type: z.literal('universal-handler'), + /** + * If undefined or 'auto', all middlewares will be applied to it. + * If 'isolated', no middlewares will be applied. + * @alpha + */ + compositionMode: z.enum(['isolated', 'auto']).optional(), + env: z.string().optional(), +}).loose() + +export const PhotonEntryServerConfig = PhotonEntryBase.extend({ + id: z.literal('photon:server-entry'), + type: z.literal('server-config'), + compositionMode: PhotonEntryUniversalHandler.shape.compositionMode, + env: PhotonEntryUniversalHandler.shape.env, +}).loose() + +export const PhotonEntryPartial = PhotonEntryUniversalHandler.extend({ + type: z.enum(['universal-handler', 'server-config']).optional(), +}).partial() + +export const PhotonConfig = z.looseObject({ + server: z.union([z.string(), PhotonEntryServerPartial]).optional(), + // This means that only a framework setting codeSplitting: false can also add entries without .id + entries: z.record(z.string(), z.union([z.string(), PhotonEntryPartial])).optional(), + hmr: z.union([z.boolean(), z.literal('prefer-restart')]).optional(), + middlewares: z + .array( + z.custom((fn) => { + return typeof fn === 'function' + }), + ) + .optional(), + defaultBuildEnv: z.string().optional(), + /** + * Can be set to false by frameworks or deployment targets if code splitting is not supported + */ + codeSplitting: z + .object({ + framework: z.boolean().optional(), + target: z.boolean().optional(), + }) + .optional(), + devServer: z + .union([ + z.boolean(), + z.object({ + env: z.string().optional(), + autoServe: z.boolean().optional(), + }), + ]) + .optional(), }) -export const PhotonConfigResolved = type({ - handlers: { - '[string]': PhotonEntryUniversalHandler, - }, +export const PhotonConfigResolved = z.looseObject({ server: PhotonEntryServer, - hmr: "boolean | 'prefer-restart'", - middlewares: 'Array' as type.cast, - 'devServer?': type('boolean').or({ - 'autoServe?': 'boolean', + entries: z.array(z.union([PhotonEntryUniversalHandler, PhotonEntryServerConfig])), + hmr: z.union([z.boolean(), z.literal('prefer-restart')]), + middlewares: z.array( + z.custom((fn) => { + return typeof fn === 'function' + }), + ), + defaultBuildEnv: z.string(), + codeSplitting: z.object({ + framework: z.boolean(), + target: z.boolean(), }), + devServer: z.union([ + z.literal(false), + z.object({ + env: z.string(), + autoServe: z.boolean(), + }), + ]), }) diff --git a/packages/photonjs/src/vite-types.ts b/packages/photonjs/src/vite-types.ts new file mode 100644 index 0000000..25ac5b8 --- /dev/null +++ b/packages/photonjs/src/vite-types.ts @@ -0,0 +1,13 @@ +/// +import type { Photon } from './types.js' + +declare module 'vite' { + interface UserConfig { + photon?: Photon.Config | Photon.Config[] + afterBuildStart?: boolean + } + + interface ResolvedConfig { + photon: Photon.ConfigResolved + } +} diff --git a/packages/photonjs/tsup.config.ts b/packages/photonjs/tsup.config.ts deleted file mode 100644 index eb33d82..0000000 --- a/packages/photonjs/tsup.config.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { builtinModules } from 'node:module' -import { defineConfig, type Options as TsupOptions } from 'tsup' -import virtualApply from './src/apply/esbuild.js' - -const externalServers: (string | RegExp)[] = ['elysia', 'fastify', 'h3', 'hono'] - -const commonOptions: TsupOptions = { - format: ['esm'], - target: 'es2022', - esbuildOptions(opts) { - opts.outbase = 'src' - }, - dts: true, - outDir: 'dist', - treeshake: true, - removeNodeProtocol: false, -} - -export default defineConfig([ - { - ...commonOptions, - platform: 'neutral', - entry: { - // serve (noop) - 'elysia/serve': './src/serve/noop/elysia.ts', - 'express/serve': './src/serve/noop/express.ts', - 'fastify/serve': './src/serve/noop/fastify.ts', - 'h3/serve': './src/serve/noop/h3.ts', - 'hattip/serve': './src/serve/noop/hattip.ts', - 'hono/serve': './src/serve/noop/hono.ts', - // serve (bun) - 'elysia/serve.bun': './src/serve/bun/elysia.ts', - 'h3/serve.bun': './src/serve/bun/h3.ts', - 'hattip/serve.bun': './src/serve/bun/hattip.ts', - 'hono/serve.bun': './src/serve/bun/hono.ts', - // serve (deno) - 'elysia/serve.deno': './src/serve/deno/elysia.ts', - 'h3/serve.deno': './src/serve/deno/h3.ts', - 'hattip/serve.deno': './src/serve/deno/hattip.ts', - 'hono/serve.deno': './src/serve/deno/hono.ts', - // serve (node) - 'elysia/serve.node': './src/serve/node/elysia.ts', - 'express/serve.node': './src/serve/node/express.ts', - 'fastify/serve.node': './src/serve/node/fastify.ts', - 'h3/serve.node': './src/serve/node/h3.ts', - 'hattip/serve.node': './src/serve/node/hattip.ts', - 'hono/serve.node': './src/serve/node/hono.ts', - }, - esbuildPlugins: [virtualApply()], - external: externalServers - .concat(...builtinModules.flatMap((e) => [e, `node:${e}`])) - .concat(/^photon:get-middlewares:/) - .concat('@photonjs/core/dev'), - }, - { - ...commonOptions, - platform: 'node', - entry: { - plugin: './src/plugin/index.ts', - api: './src/api.ts', - dev: './src/dev.ts', - index: './src/index.ts', - }, - }, -]) diff --git a/packages/photonjs/virtual.d.ts b/packages/photonjs/virtual.d.ts index d5210c4..6516c7e 100644 --- a/packages/photonjs/virtual.d.ts +++ b/packages/photonjs/virtual.d.ts @@ -3,3 +3,8 @@ declare module 'photon:fallback-entry' { const handler: any export default handler } + +declare module 'photon:get-middlewares:*' { + export const getUniversalEntries: () => import('@universal-middleware/core').UniversalHandler[] + export const getUniversalMiddlewares: () => import('@universal-middleware/core').UniversalMiddleware[] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4b1f9a..a45c42e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@types/node': ^20.17.32 + importers: .: @@ -13,31 +16,31 @@ importers: version: 1.9.4 '@brillout/test-e2e': specifier: ^0.6.8 - version: 0.6.8 + version: 0.6.14 playwright: specifier: ^1.52.0 - version: 1.52.0 + version: 1.54.1 prettier: specifier: ^3.2.5 - version: 3.5.3 + version: 3.6.2 docs: dependencies: '@brillout/docpress': specifier: ^0.12.4 - version: 0.12.6(@algolia/client-search@5.25.0)(@types/react@18.3.21)(@vitejs/plugin-react-swc@3.9.0(vite@6.3.5(@types/node@20.17.47)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.38.0)(search-insights@2.17.3)(typescript@5.8.3)(vike@0.4.229(vite@6.3.5(@types/node@20.17.47)))(vite@6.3.5(@types/node@20.17.47)) + version: 0.12.6(@algolia/client-search@5.34.0)(@types/react@18.3.23)(@vitejs/plugin-react-swc@3.11.0(vite@6.3.5(@types/node@20.19.9)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.45.1)(search-insights@2.17.3)(typescript@5.8.3)(vike@0.4.236(vite@6.3.5(@types/node@20.19.9)))(vite@6.3.5(@types/node@20.19.9)) '@types/node': specifier: ^20.17.32 - version: 20.17.47 + version: 20.19.9 '@types/react': specifier: ^18.3.8 - version: 18.3.21 + version: 18.3.23 '@types/react-dom': specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.21) + version: 18.3.7(@types/react@18.3.23) '@vitejs/plugin-react-swc': specifier: ^3.8.1 - version: 3.9.0(vite@6.3.5(@types/node@20.17.47)) + version: 3.11.0(vite@6.3.5(@types/node@20.19.9)) react: specifier: ^18.3.1 version: 18.3.1 @@ -49,22 +52,22 @@ importers: version: 5.8.3 vike: specifier: ^0.4.229 - version: 0.4.229(vite@6.3.5(@types/node@20.17.47)) + version: 0.4.236(vite@6.3.5(@types/node@20.19.9)) vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.47) + version: 6.3.5(@types/node@20.19.9) example/app-cloudflare: dependencies: '@universal-middleware/core': - specifier: ^0.4.7 - version: 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.9 + version: 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) awesome-framework: specifier: 'workspace:' version: link:../awesome-framework hono: specifier: ^4.7.8 - version: 4.7.9 + version: 4.8.5 devDependencies: '@photonjs/cloudflare': specifier: 'workspace:' @@ -77,10 +80,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.47) + version: 6.3.5(@types/node@20.19.9) wrangler: - specifier: ^4.15.1 - version: 4.15.1(@cloudflare/workers-types@4.20250515.0) + specifier: ^4.19.1 + version: 4.25.1(@cloudflare/workers-types@4.20250722.0) example/app-hono-cloudflare: dependencies: @@ -89,7 +92,7 @@ importers: version: link:../awesome-framework hono: specifier: ^4.7.8 - version: 4.7.9 + version: 4.8.5 devDependencies: '@photonjs/cloudflare': specifier: 'workspace:' @@ -102,10 +105,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.47) + version: 6.3.5(@types/node@20.19.9) wrangler: - specifier: ^4.15.1 - version: 4.15.1(@cloudflare/workers-types@4.20250515.0) + specifier: ^4.19.1 + version: 4.25.1(@cloudflare/workers-types@4.20250722.0) example/awesome-framework: dependencies: @@ -113,49 +116,49 @@ importers: specifier: 'workspace:' version: link:../../packages/photonjs '@universal-middleware/core': - specifier: ^0.4.7 - version: 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.9 + version: 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/sirv': specifier: ^0.1.20 version: 0.1.20 devDependencies: '@types/node': specifier: ^20.17.32 - version: 20.17.47 + version: 20.19.9 typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.47) + version: 6.3.5(@types/node@20.19.9) packages/adapter-cloudflare: dependencies: '@cloudflare/vite-plugin': - specifier: ^1.0.12 - version: 1.2.1(rollup@4.38.0)(vite@6.3.5(@types/node@20.17.47))(workerd@1.20250508.0)(wrangler@4.15.1(@cloudflare/workers-types@4.20250515.0)) + specifier: ^1.5.0 + version: 1.10.0(rollup@4.45.1)(vite@6.3.5(@types/node@20.19.9))(workerd@1.20250712.0)(wrangler@4.25.1(@cloudflare/workers-types@4.20250722.0)) '@photonjs/core': specifier: workspace:^ version: link:../photonjs '@universal-middleware/cloudflare': - specifier: ^0.4.8 - version: 0.4.8(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.10 + version: 0.4.10(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) devDependencies: '@brillout/release-me': specifier: ^0.4.3 - version: 0.4.3 + version: 0.4.8(conventional-commits-filter@5.0.0) '@cloudflare/workers-types': - specifier: ^4.20250515.0 - version: 4.20250515.0 + specifier: ^4.20250604.0 + version: 4.20250722.0 '@universal-middleware/core': - specifier: ^0.4.7 - version: 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) - '@universal-middleware/h3': specifier: ^0.4.9 - version: 0.4.10(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + version: 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) + '@universal-middleware/h3': + specifier: ^0.4.12 + version: 0.4.12(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/hono': - specifier: ^0.4.10 - version: 0.4.12(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.15 + version: 0.4.15(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) crossws: specifier: ^0.3.5 version: 0.3.5 @@ -164,113 +167,113 @@ importers: version: 1.15.3 tsup: specifier: ^8.4.0 - version: 8.4.0(@swc/core@1.11.24)(postcss@8.5.3)(typescript@5.8.3) + version: 8.5.0(@swc/core@1.13.1)(postcss@8.5.6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.47) + version: 6.3.5(@types/node@20.19.9) packages/photonjs: dependencies: '@brillout/picocolors': specifier: ^1.0.26 - version: 1.0.26 + version: 1.0.28 '@brillout/vite-plugin-server-entry': specifier: ^0.7.5 version: 0.7.9 + '@universal-middleware/cloudflare': + specifier: ^0.4.10 + version: 0.4.10(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/compress': specifier: ^0.2.30 version: 0.2.30 '@universal-middleware/core': - specifier: ^0.4.7 - version: 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.9 + version: 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/elysia': - specifier: ^0.5.1 - version: 0.5.1(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.5.3 + version: 0.5.3(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/express': - specifier: ^0.4.16 - version: 0.4.16(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.18 + version: 0.4.18(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/fastify': - specifier: ^0.5.18 - version: 0.5.18(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.5.20 + version: 0.5.20(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/h3': - specifier: ^0.4.10 - version: 0.4.10(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.12 + version: 0.4.12(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/hattip': - specifier: ^0.4.9 - version: 0.4.9(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.11 + version: 0.4.11(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/hono': - specifier: ^0.4.12 - version: 0.4.12(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + specifier: ^0.4.15 + version: 0.4.15(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) '@universal-middleware/sirv': specifier: ^0.1.20 version: 0.1.20 - arktype: - specifier: ^2.1.20 - version: 2.1.20 estree-walker: specifier: ^3.0.3 version: 3.0.3 hono: specifier: ^4.7.7 - version: 4.7.9 - oxc-transform: - specifier: ^0.64.0 - version: 0.64.0 + version: 4.8.5 + ts-deepmerge: + specifier: ^7.0.3 + version: 7.0.3 + zod: + specifier: ^3.25.64 + version: 3.25.76 devDependencies: '@brillout/release-me': specifier: ^0.4.3 - version: 0.4.3 + version: 0.4.8(conventional-commits-filter@5.0.0) '@elysiajs/node': specifier: ^1.2.6 - version: 1.2.6(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(formidable@3.5.4)(ws@8.18.0) + version: 1.3.0(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(hono@4.8.5) '@hattip/adapter-node': specifier: ^0.0.49 version: 0.0.49 '@hono/node-server': specifier: ^1.14.1 - version: 1.14.1(hono@4.7.9) + version: 1.17.1(hono@4.8.5) '@types/bun': specifier: ^1.2.10 - version: 1.2.13 + version: 1.2.19(@types/react@18.3.23) '@types/deno': specifier: ^2.2.0 version: 2.3.0 '@types/node': specifier: ^20.17.32 - version: 20.17.47 + version: 20.19.9 elysia: specifier: ^1.2.25 - version: 1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3) + version: 1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3) esbuild: specifier: ^0.25.2 - version: 0.25.4 + version: 0.25.8 fastify: specifier: ^5.3.0 - version: 5.3.3 + version: 5.4.0 h3: specifier: ^1.15.1 version: 1.15.3 magic-string: specifier: ^0.30.17 version: 0.30.17 - rollup: - specifier: 4.38.0 - version: 4.38.0 tsup: specifier: ^8.4.0 - version: 8.4.0(@swc/core@1.11.24)(postcss@8.5.3)(typescript@5.8.3) + version: 8.5.0(@swc/core@1.13.1)(postcss@8.5.6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 unplugin: specifier: ^2.3.2 - version: 2.3.4 + version: 2.3.5 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.47) + version: 6.3.5(@types/node@20.19.9) tests/app: dependencies: @@ -282,13 +285,13 @@ importers: version: 5.1.0 fastify: specifier: ^5.3.0 - version: 5.3.3 + version: 5.4.0 h3: specifier: ^1.15.1 version: 1.15.3 hono: specifier: ^4.7.8 - version: 4.7.9 + version: 4.8.5 devDependencies: '@photonjs/cloudflare': specifier: 'workspace:' @@ -298,19 +301,19 @@ importers: version: link:../../packages/photonjs '@types/express': specifier: ^5.0.2 - version: 5.0.2 + version: 5.0.3 '@types/node': specifier: ^20.17.32 - version: 20.17.47 + version: 20.19.9 typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.47) + version: 6.3.5(@types/node@20.19.9) wrangler: - specifier: ^4.15.1 - version: 4.15.1(@cloudflare/workers-types@4.20250515.0) + specifier: ^4.19.1 + version: 4.25.1(@cloudflare/workers-types@4.20250722.0) packages: @@ -334,72 +337,58 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.25.0': - resolution: {integrity: sha512-1pfQulNUYNf1Tk/svbfjfkLBS36zsuph6m+B6gDkPEivFmso/XnRgwDvjAx80WNtiHnmeNjIXdF7Gos8+OLHqQ==} + '@algolia/client-abtesting@5.34.0': + resolution: {integrity: sha512-d6ardhDtQsnMpyr/rPrS3YuIE9NYpY4rftkC7Ap9tyuhZ/+V3E/LH+9uEewPguKzVqduApdwJzYq2k+vAXVEbQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.25.0': - resolution: {integrity: sha512-AFbG6VDJX/o2vDd9hqncj1B6B4Tulk61mY0pzTtzKClyTDlNP0xaUiEKhl6E7KO9I/x0FJF5tDCm0Hn6v5x18A==} + '@algolia/client-analytics@5.34.0': + resolution: {integrity: sha512-WXIByjHNA106JO1Dj6b4viSX/yMN3oIB4qXr2MmyEmNq0MgfuPfPw8ayLRIZPa9Dp27hvM3G8MWJ4RG978HYFw==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.25.0': - resolution: {integrity: sha512-il1zS/+Rc6la6RaCdSZ2YbJnkQC6W1wiBO8+SH+DE6CPMWBU6iDVzH0sCKSAtMWl9WBxoN6MhNjGBnCv9Yy2bA==} + '@algolia/client-common@5.34.0': + resolution: {integrity: sha512-JeN1XJLZIkkv6yK0KT93CIXXk+cDPUGNg5xeH4fN9ZykYFDWYRyqgaDo+qvg4RXC3WWkdQ+hogQuuCk4Y3Eotw==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.25.0': - resolution: {integrity: sha512-blbjrUH1siZNfyCGeq0iLQu00w3a4fBXm0WRIM0V8alcAPo7rWjLbMJMrfBtzL9X5ic6wgxVpDADXduGtdrnkw==} + '@algolia/client-insights@5.34.0': + resolution: {integrity: sha512-gdFlcQa+TWXJUsihHDlreFWniKPFIQ15i5oynCY4m9K3DCex5g5cVj9VG4Hsquxf2t6Y0yv8w6MvVTGDO8oRLw==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.25.0': - resolution: {integrity: sha512-aywoEuu1NxChBcHZ1pWaat0Plw7A8jDMwjgRJ00Mcl7wGlwuPt5dJ/LTNcg3McsEUbs2MBNmw0ignXBw9Tbgow==} + '@algolia/client-personalization@5.34.0': + resolution: {integrity: sha512-g91NHhIZDkh1IUeNtsUd8V/ZxuBc2ByOfDqhCkoQY3Z/mZszhpn3Czn6AR5pE81fx793vMaiOZvQVB5QttArkQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.25.0': - resolution: {integrity: sha512-a/W2z6XWKjKjIW1QQQV8PTTj1TXtaKx79uR3NGBdBdGvVdt24KzGAaN7sCr5oP8DW4D3cJt44wp2OY/fZcPAVA==} + '@algolia/client-query-suggestions@5.34.0': + resolution: {integrity: sha512-cvRApDfFrlJ3Vcn37U4Nd/7S6T8cx7FW3mVLJPqkkzixv8DQ/yV+x4VLirxOtGDdq3KohcIbIGWbg1QuyOZRvQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.25.0': - resolution: {integrity: sha512-9rUYcMIBOrCtYiLX49djyzxqdK9Dya/6Z/8sebPn94BekT+KLOpaZCuc6s0Fpfq7nx5J6YY5LIVFQrtioK9u0g==} + '@algolia/client-search@5.34.0': + resolution: {integrity: sha512-m9tK4IqJmn+flEPRtuxuHgiHmrKV0su5fuVwVpq8/es4DMjWMgX1a7Lg1PktvO8AbKaTp9kTtBAPnwXpuCwmEg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.25.0': - resolution: {integrity: sha512-jJeH/Hk+k17Vkokf02lkfYE4A+EJX+UgnMhTLR/Mb+d1ya5WhE+po8p5a/Nxb6lo9OLCRl6w3Hmk1TX1e9gVbQ==} + '@algolia/ingestion@1.34.0': + resolution: {integrity: sha512-2rxy4XoeRtIpzxEh5u5UgDC5HY4XbNdjzNgFx1eDrfFkSHpEVjirtLhISMy2N5uSFqYu1uUby5/NC1Soq8J7iw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.25.0': - resolution: {integrity: sha512-Ls3i1AehJ0C6xaHe7kK9vPmzImOn5zBg7Kzj8tRYIcmCWVyuuFwCIsbuIIz/qzUf1FPSWmw0TZrGeTumk2fqXg==} + '@algolia/monitoring@1.34.0': + resolution: {integrity: sha512-OJiDhlJX8ZdWAndc50Z6aUEW/YmnhFK2ul3rahMw5/c9Damh7+oY9SufoK2LimJejy+65Qka06YPG29v2G/vww==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.25.0': - resolution: {integrity: sha512-79sMdHpiRLXVxSjgw7Pt4R1aNUHxFLHiaTDnN2MQjHwJ1+o3wSseb55T9VXU4kqy3m7TUme3pyRhLk5ip/S4Mw==} + '@algolia/recommend@5.34.0': + resolution: {integrity: sha512-fzNQZAdVxu/Gnbavy8KW5gurApwdYcPW6+pjO7Pw8V5drCR3eSqnOxSvp79rhscDX8ezwqMqqK4F3Hsq+KpRzg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.25.0': - resolution: {integrity: sha512-JLaF23p1SOPBmfEqozUAgKHQrGl3z/Z5RHbggBu6s07QqXXcazEsub5VLonCxGVqTv6a61AAPr8J1G5HgGGjEw==} + '@algolia/requester-browser-xhr@5.34.0': + resolution: {integrity: sha512-gEI0xjzA/xvMpEdYmgQnf6AQKllhgKRtnEWmwDrnct+YPIruEHlx1dd7nRJTy/33MiYcCxkB4khXpNrHuqgp3Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.25.0': - resolution: {integrity: sha512-rtzXwqzFi1edkOF6sXxq+HhmRKDy7tz84u0o5t1fXwz0cwx+cjpmxu/6OQKTdOJFS92JUYHsG51Iunie7xbqfQ==} + '@algolia/requester-fetch@5.34.0': + resolution: {integrity: sha512-5SwGOttpbACT4jXzfSJ3mnTcF46SVNSnZ1JjxC3qBa3qKi4U0CJGzuVVy3L798u8dG5H0SZ2MAB5v7180Gnqew==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.25.0': - resolution: {integrity: sha512-ZO0UKvDyEFvyeJQX0gmZDQEvhLZ2X10K+ps6hViMo1HgE2V8em00SwNsQ+7E/52a+YiBkVWX61pJJJE44juDMQ==} + '@algolia/requester-node-http@5.34.0': + resolution: {integrity: sha512-409XlyIyEXrxyGjWxd0q5RASizHSRVUU0AXPCEdqnbcGEzbCgL1n7oYI8YxzE/RqZLha+PNwWCcTVn7EE5tyyQ==} engines: {node: '>= 14.0.0'} - '@ark/schema@0.46.0': - resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} - - '@ark/util@0.46.0': - resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@biomejs/biome@1.9.4': resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} engines: {node: '>=14.21.3'} @@ -471,24 +460,24 @@ packages: '@brillout/import@0.2.6': resolution: {integrity: sha512-1GUTmADc8trUC1YSW2lp9r6PmwluMoEyHajnE1kxVdbKGD0wJOlq/DvTWMUqLtBDCnQR+n//qgMtz6HwA/lotA==} - '@brillout/json-serializer@0.5.15': - resolution: {integrity: sha512-iLAyV1HNC3nG07ypBwCJohFrajY1HeZdfBBgGuRtMH/JPddgG9bPmoSI18A1RBx67vRmY6/8rgisjR5YfTvZHA==} + '@brillout/json-serializer@0.5.16': + resolution: {integrity: sha512-X9CujUMruFxH35cyFgzebg3biBBRz4ouMmjJZwIa04D188du0V47QFcIK7YXKl3z0pue+9NccQ+1zaxhB49r1Q==} '@brillout/part-regex@0.1.4': resolution: {integrity: sha512-PQy5LfRmIueEfGwhvMedsnj6KulDfxlfvUaTsUchBqA7nTge4C7taG/V6np2uCHVxxE4+cSmwM4COn9aNcMn7g==} - '@brillout/picocolors@1.0.26': - resolution: {integrity: sha512-oJF92OEpzunaJyaEWXuS4PWY0k8JsqNO18kMf5hIwvsh+tyhbv+UwAnPPauSlO2eyvMSciui+YFKV9DEzTpmGA==} + '@brillout/picocolors@1.0.28': + resolution: {integrity: sha512-FBsirUdUlmjmeUlEuqfnUoKAZUt+d0VfMVBYUsFQrDFEV9Rm/QDyG69PSQtQbI6SZQNiZuAWuyhE5USflzx6iQ==} - '@brillout/release-me@0.4.3': - resolution: {integrity: sha512-zZzzOT34JVDOo8pe+AhJODAajzMLitfUOZoZotBXTAVGzpcOWcoHM1F4VDih1FW8GOrKhs/r48nhem5AmMWm8Q==} + '@brillout/release-me@0.4.8': + resolution: {integrity: sha512-3WtVJNyEU8EINekZ51sYEB4pGHcZTM7Ljip/vkUDguwTwe2AY6DjSd4Vgqs84a7H7u5j0OrXDAiMAmCti4QSfQ==} hasBin: true '@brillout/require-shim@0.1.2': resolution: {integrity: sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg==} - '@brillout/test-e2e@0.6.8': - resolution: {integrity: sha512-U22qsQSnPeRPrqlrXk4FgihUpkbziO2neD6kK8mbEq9pG+qivfU1fkLbTGrmjJ7b+L8keqD+xVp+zKuGufHVeA==} + '@brillout/test-e2e@0.6.14': + resolution: {integrity: sha512-iOalgODAMl93f3v6MmQ25fNzhFp6UJtNRyl1OdREj/FMGNIi9tHl5hesmJXh24IME0NoJVeTJUFyxI49wgIHQA==} hasBin: true '@brillout/vite-plugin-server-entry@0.7.9': @@ -498,53 +487,65 @@ packages: resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.3.1': - resolution: {integrity: sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==} + '@cloudflare/unenv-preset@2.3.3': + resolution: {integrity: sha512-/M3MEcj3V2WHIRSW1eAQBPRJ6JnGQHc6JKMAPLkDb7pLs3m6X9ES/+K3ceGqxI6TKeF32AWAi7ls0AYzVxCP0A==} peerDependencies: - unenv: 2.0.0-rc.15 - workerd: ^1.20250320.0 + unenv: 2.0.0-rc.17 + workerd: ^1.20250508.0 peerDependenciesMeta: workerd: optional: true - '@cloudflare/vite-plugin@1.2.1': - resolution: {integrity: sha512-enOOCxVEAlhisCvpXE0RZA5Wk5JYIj/qv33yoOclLrp9A6DLr416Ku/J/60BxMbyv4JgjpFvN2fGNdcfT7ERVw==} + '@cloudflare/vite-plugin@1.10.0': + resolution: {integrity: sha512-pdlz+GdNmL+8aVz8b8GXRHs33oI0DQpZvWNFyuMeN1MeHq/z+DOLGBU63YZC8S2hkdxC2rQQkNnRtsRCXfloWw==} peerDependencies: - vite: ^6.1.0 - wrangler: ^3.101.0 || ^4.0.0 + vite: ^6.1.0 || ^7.0.0 + wrangler: ^4.25.1 - '@cloudflare/workerd-darwin-64@1.20250508.0': - resolution: {integrity: sha512-9x09MrA9Y5RQs3zqWvWns8xHgM2pVNXWpeJ+3hQYu4PrwPFZXtTD6b/iMmOnlYKzINlREq1RGeEybMFyWEUlUg==} + '@cloudflare/workerd-darwin-64@1.20250712.0': + resolution: {integrity: sha512-M6S6a/LQ0Jb0R+g0XhlYi1adGifvYmxA5mD/i9TuZZgjs2bIm5ELuka/n3SCnI98ltvlx3HahRaHagAtOilsFg==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250508.0': - resolution: {integrity: sha512-0Ili+nE2LLRzYue/yPc1pepSyNNg6LxR3/ng/rlQzVQUxPXIXldHFkJ/ynsYwQnAcf6OxasSi/kbTm6yvDoSAQ==} + '@cloudflare/workerd-darwin-arm64@1.20250712.0': + resolution: {integrity: sha512-7sFzn6rvAcnLy7MktFL42dYtzL0Idw/kiUmNf2P3TvsBRoShhLK5ZKhbw+NAhvU8e4pXWm5lkE0XmpieA0zNjw==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250508.0': - resolution: {integrity: sha512-5saVrZ3uVwYxvBa7BaonXjeqB6X0YF3ak05qvBaWcmZ3FNmnarMm2W8842cnbhnckDVBpB/iDo51Sy6Y7y1jcw==} + '@cloudflare/workerd-linux-64@1.20250712.0': + resolution: {integrity: sha512-EFRrGe/bqK7NHtht7vNlbrDpfvH3eRvtJOgsTpEQEysDjVmlK6pVJxSnLy9Hg1zlLY15IfhfGC+K2qisseHGJQ==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250508.0': - resolution: {integrity: sha512-muQe1pkxRi3eaq1Q417xvfGd2SlktbLTzNhT5Yftsx8OecWrYuB8i4ttR6Nr5ER06bfEj0FqQjqJJhcp6wLLUQ==} + '@cloudflare/workerd-linux-arm64@1.20250712.0': + resolution: {integrity: sha512-rG8JUleddhUHQVwpXOYv0VbL0S9kOtR9PNKecgVhFpxEhC8aTeg2HNBBjo8st7IfcUvY8WaW3pD3qdAMZ05UwQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250508.0': - resolution: {integrity: sha512-EJj8iTWFMqjgvZUxxNvzK7frA1JMFi3y/9eDIdZPL/OaQh3cmk5Lai5DCXsKYUxfooMBZWYTp53zOLrvuJI8VQ==} + '@cloudflare/workerd-windows-64@1.20250712.0': + resolution: {integrity: sha512-qS8H5RCYwE21Om9wo5/F807ClBJIfknhuLBj16eYxvJcj9JqgAKWi12BGgjyGxHuJJjeoQ63lr4wHAdbFntDDg==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20250515.0': - resolution: {integrity: sha512-KoHFMH04gOXp3KEI+wrFIU+3ZfoSXnwqZTpybNQjalHoN3pWjtWBb/030cCRAZ639YX+DAHAxNF7AvEYGz1oaA==} + '@cloudflare/workers-types@4.20250722.0': + resolution: {integrity: sha512-pTY+A07DTSacgUBYcVEEb78/KG7THdcRpPqXLeH/A/LHHobAddgN4zyXBldsoZuzy7bD9tZYJW+wkcyR4k7fDA==} + + '@conventional-changelog/git-client@2.5.1': + resolution: {integrity: sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A==} + engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.1.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -570,25 +571,13 @@ packages: search-insights: optional: true - '@elysiajs/node@1.2.6': - resolution: {integrity: sha512-qauTs0YNLvfSyqW8k8pDCazd3nPQtFOeDH/cSz1wBhAGn1HL1PQlywnK6V0+bOGemkKlxLIjhmvbHxGrNzZMSg==} + '@elysiajs/node@1.3.0': + resolution: {integrity: sha512-AA9rnL/FOBklxtJjFpUDBVZLuiKddDaV1KgnKawHzj5VgN99SzE+V0h1MOhp+8jlo2KQQJO/3aD3upyGgrfohQ==} peerDependencies: - bufferutil: '>= 4.0.1' - elysia: '>= 1.2.7' - formidable: '>= 3.5.2' - ws: '>= 8.18.0' - peerDependenciesMeta: - bufferutil: - optional: true - - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + elysia: '>= 1.3.3' - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} @@ -602,6 +591,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} @@ -614,6 +609,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} @@ -626,6 +627,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} @@ -638,6 +645,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} @@ -650,6 +663,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} @@ -662,6 +681,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} @@ -674,6 +699,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} @@ -686,6 +717,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} @@ -698,6 +735,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} @@ -710,6 +753,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} @@ -722,6 +771,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} @@ -734,6 +789,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} @@ -746,6 +807,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} @@ -758,6 +825,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} @@ -770,6 +843,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} @@ -782,6 +861,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} @@ -794,12 +879,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.4': resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} @@ -812,6 +909,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} @@ -824,6 +927,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} @@ -836,6 +945,18 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} @@ -848,6 +969,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} @@ -860,6 +987,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} @@ -872,6 +1005,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} @@ -884,15 +1023,17 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@fastify/ajv-compiler@4.0.2': resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@fastify/error@4.1.0': - resolution: {integrity: sha512-KeFcciOr1eo/YvIXHP65S94jfEEqn1RxTRBT1aJaHxY5FK0/GDXYozsQMMWlZoHgi8i0s+YtrLsgj/JkUUjSkQ==} + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} '@fastify/fast-json-stringify-compiler@5.0.3': resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} @@ -922,16 +1063,12 @@ packages: resolution: {integrity: sha512-AgJgKLooZyQnzMfoFg5Mo/aHM+HGBC9ExpXIjNqGimYTRgNbL/K7X5EM1kR2JY90BNKk9lo6Usq1T/nWFdT7TQ==} hasBin: true - '@hono/node-server@1.14.1': - resolution: {integrity: sha512-vmbuM+HPinjWzPe7FFPWMMQMsbKE9gDPhaH0FFdqbGpkT5lp++tcWDTxwBl5EgS5y6JVgIaCdjeHRfQ4XRBRjQ==} + '@hono/node-server@1.17.1': + resolution: {integrity: sha512-SY79W/C+2b1MyAzmIcV32Q47vO1b5XwLRwj8S9N6Jr5n1QCkIfAIH6umOSgqWZ4/v67hg6qq8Ha5vZonVidGsg==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 - '@hutson/parse-repository-url@5.0.0': - resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} - engines: {node: '>=10.13.0'} - '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1041,23 +1178,18 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -1082,13 +1214,6 @@ packages: '@mjackson/node-fetch-server@0.6.1': resolution: {integrity: sha512-9ZJnk/DJjt805uv5PPv11haJIW+HHf3YEEyVXv+8iLQxLD/iXA68FH220XoiTPBC4gCg5q+IMadDw8qPqlA5wg==} - '@napi-rs/wasm-runtime@0.2.9': - resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1101,68 +1226,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-transform/binding-darwin-arm64@0.64.0': - resolution: {integrity: sha512-SphSpVk2TcJ1bGfv/kStrSGrKyA5wLuIjuyK0/Im8ZJZ2zAolJdm4WFZUDI5NZZskwcqoB2qrUQFr9pV75N+BA==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [darwin] - - '@oxc-transform/binding-darwin-x64@0.64.0': - resolution: {integrity: sha512-MDTCesIxze+lVc33cZGHZE5alWUL5dbhQGM4i1uobHbll7nuLBO8ymZZ7dQxCKJztkzQOU+Ib+TPtdxIWkcnqQ==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [darwin] - - '@oxc-transform/binding-linux-arm-gnueabihf@0.64.0': - resolution: {integrity: sha512-1emYdqi1lJscGi4F75Zgr24+l5v6o/TawUDVyrZ2JPW0g4F8V22udbsN6f0cFRwspTiBtxCfFMCnK/bdgcQOeQ==} - engines: {node: '>=14.0.0'} - cpu: [arm] - os: [linux] - - '@oxc-transform/binding-linux-arm64-gnu@0.64.0': - resolution: {integrity: sha512-OxIEd1bk9fEmSgisxD525+2/7XZ6ex9vSU/FZhalv/tEsbrMA7sxsu/cl0zfKVVZFkI2uZ2r93RLeh/kv0VznQ==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [linux] - - '@oxc-transform/binding-linux-arm64-musl@0.64.0': - resolution: {integrity: sha512-kTtZBREwmXMMgsMdFWU6/zZPavbeFwXHf32MY07tIBEn6kRz9Gg6Xsl7V1s0PVMTcYVY+6IZ5idZ1ODAdt1VkQ==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [linux] - - '@oxc-transform/binding-linux-x64-gnu@0.64.0': - resolution: {integrity: sha512-zHe0oT6xpCECWFdN2Uovut/36RJ6fA0IZwZEHaHeGHYbp8UoCrvZAXoh5MYa/hadYpsoVV13b5ZHBEJk7DuMjg==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [linux] - - '@oxc-transform/binding-linux-x64-musl@0.64.0': - resolution: {integrity: sha512-kxiziQsB+ic5j2SCMV0pzcesA+QFaufTmNQbQznu7XFy+sFjHHkYfS3109D40gLnNtmlaIyTHj+1Ooka7awKhA==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [linux] - - '@oxc-transform/binding-wasm32-wasi@0.64.0': - resolution: {integrity: sha512-YJtTvi3DYxEZ7mIZaIEaLGL0ECCiJWHxiA9Qz2EpswbRCfXX/l7YSODs3uvG/thlCFhnzPLIM8O6tIHjpHIWYA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-transform/binding-win32-arm64-msvc@0.64.0': - resolution: {integrity: sha512-X2gDEzZFrfM65+mc4VYBfxdVPcqcxS5RZgc+dPcz8Xc14t/pmdqMeEJDTt0zKnL6T+42kPZHdybLwpgsuBdRDA==} - engines: {node: '>=14.0.0'} - cpu: [arm64] - os: [win32] - - '@oxc-transform/binding-win32-x64-msvc@0.64.0': - resolution: {integrity: sha512-QC2Nx0GFuUNGU5vmWgCym0TLIHFdoVvdpTWwcbZtWp8pFbQhvYms5CWmZm+wlCqAGPp5aYm2aLmp9hE8dM1c9Q==} - engines: {node: '>=14.0.0'} - cpu: [x64] - os: [win32] - - '@paralleldrive/cuid2@2.2.2': - resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1170,6 +1233,18 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rollup/plugin-replace@6.0.2': resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} engines: {node: '>=14.0.0'} @@ -1179,8 +1254,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1188,103 +1263,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.38.0': - resolution: {integrity: sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==} + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.38.0': - resolution: {integrity: sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==} + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.38.0': - resolution: {integrity: sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==} + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.38.0': - resolution: {integrity: sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==} + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.38.0': - resolution: {integrity: sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==} + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.38.0': - resolution: {integrity: sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==} + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.38.0': - resolution: {integrity: sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==} + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.38.0': - resolution: {integrity: sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==} + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.38.0': - resolution: {integrity: sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==} + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.38.0': - resolution: {integrity: sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==} + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.38.0': - resolution: {integrity: sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==} + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.38.0': - resolution: {integrity: sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.38.0': - resolution: {integrity: sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==} + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.38.0': - resolution: {integrity: sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==} + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.38.0': - resolution: {integrity: sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==} + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.38.0': - resolution: {integrity: sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==} + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.38.0': - resolution: {integrity: sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==} + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.38.0': - resolution: {integrity: sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==} + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.38.0': - resolution: {integrity: sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==} + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.38.0': - resolution: {integrity: sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==} + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} cpu: [x64] os: [win32] @@ -1294,71 +1369,86 @@ packages: '@shikijs/transformers@1.2.0': resolution: {integrity: sha512-xKn7DtA65DQV4FOfYsrvqM80xOy2xuXnxWWKsZmHv1VII/IOuDUDsWDu3KnpeLH6wqNJWp1GRoNUsHR1aw/VhQ==} - '@sinclair/typebox@0.34.33': - resolution: {integrity: sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g==} + '@simple-libs/child-process-utils@1.0.1': + resolution: {integrity: sha512-3nWd8irxvDI6v856wpPCHZ+08iQR0oHTZfzAZmnbsLzf+Sf1odraP6uKOHDZToXq3RPRV/LbqGVlSCogm9cJjg==} + engines: {node: '>=18'} + + '@simple-libs/stream-utils@1.1.0': + resolution: {integrity: sha512-6rsHTjodIn/t90lv5snQjRPVtOosM7Vp0AKdrObymq45ojlgVwnpAqdc+0OBBrpEiy31zZ6/TKeIVqV1HwvnuQ==} + engines: {node: '>=18'} + + '@sinclair/typebox@0.34.38': + resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} + + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + engines: {node: '>=18'} - '@swc/core-darwin-arm64@1.11.24': - resolution: {integrity: sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==} + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + + '@swc/core-darwin-arm64@1.13.1': + resolution: {integrity: sha512-zO6SW/jSMTUORPm6dUZFPUwf+EFWZsaXWMGXadRG6akCofYpoQb8pcY2QZkVr43z8TMka6BtXpyoD/DJ0iOPHQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.24': - resolution: {integrity: sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==} + '@swc/core-darwin-x64@1.13.1': + resolution: {integrity: sha512-8RjaTZYxrlYKE5PgzZYWSOT4mAsyhIuh30Nu4dnn/2r0Ef68iNCbvX4ynGnFMhOIhqunjQbJf+mJKpwTwdHXhw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.24': - resolution: {integrity: sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==} + '@swc/core-linux-arm-gnueabihf@1.13.1': + resolution: {integrity: sha512-jEqK6pECs2m4BpL2JA/4CCkq04p6iFOEtVNXTisO+lJ3zwmxlnIEm9UfJZG6VSu8GS9MHRKGB0ieZ1tEdN1qDA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.24': - resolution: {integrity: sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==} + '@swc/core-linux-arm64-gnu@1.13.1': + resolution: {integrity: sha512-PbkuIOYXO/gQbWQ7NnYIwm59ygNqmUcF8LBeoKvxhx1VtOwE+9KiTfoplOikkPLhMiTzKsd8qentTslbITIg+Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.24': - resolution: {integrity: sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==} + '@swc/core-linux-arm64-musl@1.13.1': + resolution: {integrity: sha512-JaqFdBCarIBKiMu5bbAp+kWPMNGg97ej+7KzbKOzWP5pRptqKi86kCDZT3WmjPe8hNG6dvBwbm7Y8JNry5LebQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.24': - resolution: {integrity: sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==} + '@swc/core-linux-x64-gnu@1.13.1': + resolution: {integrity: sha512-t4cLkku10YECDaakWUH0452WJHIZtrLPRwezt6BdoMntVMwNjvXRX7C8bGuYcKC3YxRW7enZKFpozLhQIQ37oA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.24': - resolution: {integrity: sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==} + '@swc/core-linux-x64-musl@1.13.1': + resolution: {integrity: sha512-fSMwZOaG+3ukUucbEbzz9GhzGhUhXoCPqHe9qW0/Vc2IZRp538xalygKyZynYweH5d9EHux1aj3+IO8/xBaoiA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.24': - resolution: {integrity: sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==} + '@swc/core-win32-arm64-msvc@1.13.1': + resolution: {integrity: sha512-tweCXK/79vAwj1NhAsYgICy8T1z2QEairmN2BFEBYFBFNMEB1iI1YlXwBkBtuihRvgZrTh1ORusKa4jLYzLCZA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.24': - resolution: {integrity: sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==} + '@swc/core-win32-ia32-msvc@1.13.1': + resolution: {integrity: sha512-zi7hO9D+2R2yQN9D7T10/CAI9KhuXkNkz8tcJOW6+dVPtAk/gsIC5NoGPELjgrAlLL9CS38ZQpLDslLfpP15ng==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.24': - resolution: {integrity: sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==} + '@swc/core-win32-x64-msvc@1.13.1': + resolution: {integrity: sha512-KubYjzqs/nz3H69ncX/XHKsC8c1xqc7UvonQAj26BhbL22HBsqdAaVutZ+Obho6RMpd3F5qQ95ldavUTWskRrw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.24': - resolution: {integrity: sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==} + '@swc/core@1.13.1': + resolution: {integrity: sha512-jEKKErLC6uwSqA+p6bmZR08usZM5Fpc+HdEu5CAzvye0q43yf1si1kjhHEa9XMkz0A2SAaal3eKCg/YYmtOsCA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -1369,8 +1459,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@swc/types@0.1.23': + resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} @@ -1379,14 +1469,11 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/bun@1.2.13': - resolution: {integrity: sha512-u6vXep/i9VBxoJl3GjZsl/BFIsvML8DfVDO0RYLEwtSZSp981kEO1V5NwRcO1CPJ7AmvpbnDCiMKo3JvbDEjAg==} + '@types/bun@1.2.19': + resolution: {integrity: sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -1400,20 +1487,20 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + '@types/express-serve-static-core@5.0.7': + resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} - '@types/express@5.0.2': - resolution: {integrity: sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==} + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1427,14 +1514,14 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.17.47': - resolution: {integrity: sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==} + '@types/node@20.19.9': + resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -1447,14 +1534,14 @@ packages: peerDependencies: '@types/react': ^18.0.0 - '@types/react@18.3.21': - resolution: {integrity: sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw==} + '@types/react@18.3.23': + resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1465,22 +1552,22 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@universal-middleware/cloudflare@0.4.8': - resolution: {integrity: sha512-d6wDQYFdKPCXt+gnuN3eb3chMuY3K8yYvxRVYTDTxOm5kRH1/sxDBAchvoeFaPTg5j8gps53nBQnVsNW6kBdGA==} + '@universal-middleware/cloudflare@0.4.10': + resolution: {integrity: sha512-ZY+N0KKoH+H+BB3wsaD5yqTiiFtX7uklPyCBqGLqEijOtZA5ZgFIExfWDjiIUjezUBAbRB8kUZ/WlPITY+hyTg==} '@universal-middleware/compress@0.2.30': resolution: {integrity: sha512-Qk6Yt3DOHxYYlS9QGF+VJQwCLXB4BSKuJZ9/UpDp+x8VOq//j+aJuEg8H2VAo2XEBg/amqPmw+gIesFKTLXEWw==} - '@universal-middleware/core@0.4.7': - resolution: {integrity: sha512-Q+ZwiQAm/yZVmtJCZx6U4yLQF10AQ9URcCGxcIdUgLoEOHAg+uADcxAliKfJv463kVECnLI2ZamsRDDOSjc36A==} + '@universal-middleware/core@0.4.9': + resolution: {integrity: sha512-nc6quPkq+y4+nTSwBq6Jem5wSgVGm+rkqMGPUQNRlQZgsbaOTtHEfr0FkbfJ6f4ePuqjOmMf4Zc9OaGumLVmEw==} peerDependencies: - '@cloudflare/workers-types': ^4.20250327.0 + '@cloudflare/workers-types': ^4.20250719.0 '@hattip/core': ^0.0.49 '@webroute/route': ^0.8.0 - elysia: ^1.2.25 - fastify: ^5.2.2 - h3: ^1.15.1 - hono: ^4.7.5 + elysia: ^1.3.5 + fastify: ^5.4.0 + h3: ^1.15.3 + hono: ^4.8.5 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -1497,31 +1584,31 @@ packages: hono: optional: true - '@universal-middleware/elysia@0.5.1': - resolution: {integrity: sha512-rwd+67iZ15zRHcYm+ERCbgJh+ESsTugksvZ3/aONcc0qKbzvcPqK8IBpZBM+3YKmd9r8JOSAKW+ECeVO2oYR6Q==} + '@universal-middleware/elysia@0.5.3': + resolution: {integrity: sha512-7TdoG2x4lV5YG6sWCeFJJ/sP3Czjh8XjsZ65Vslg3zCEIR1TNF2G1E5jrBRmBj0YFY5ZvKcjX+lXGiKNQLG1QA==} - '@universal-middleware/express@0.4.16': - resolution: {integrity: sha512-RK8EiY2WJUCPNkk0DqL7A9T/Fn0Mkp7P+fQgWf6Z/Nd7rzih5mVBUNt73w7FtMX8LxOhK43/1CmO8O1JL24V0w==} + '@universal-middleware/express@0.4.18': + resolution: {integrity: sha512-zdEphqUDtPk4aW4H+EDIv6JLnNDAwgYLu20ZtnpBD3XrOE182CHHPlJRXb32vu9Y7+zpMi4qsNyR/G2QXwzdbw==} - '@universal-middleware/fastify@0.5.18': - resolution: {integrity: sha512-SaE2d0zOFmAIrC/AK48MRJW0FgohmuplUstUdyfr+BPLSPHZ3cPIwhWjgA8DLVhQXzUmleK02bXByBK3r/xP7g==} + '@universal-middleware/fastify@0.5.20': + resolution: {integrity: sha512-VDViiK2OwMUXNxs4yQWOVsYIKtgCfCHG8SX24YTELqlAlZCFDX/nrwqNG/W7l6UzRcr+n5sKMKpr0WdOgiO8vA==} - '@universal-middleware/h3@0.4.10': - resolution: {integrity: sha512-tG+5hfIYrLKrX3kGTMRCWx44Q2mV2DJMda+Rjryk+vgEWWaQVCtUGkAa2IqrM8m0L/sVf9ypQNK/ucQGy7naeA==} + '@universal-middleware/h3@0.4.12': + resolution: {integrity: sha512-6wDIHm0eVNfV+M0BmFTM6WokgCdPd9zCfk7sgFCBvjPPk3QjfgBdZUqzTMoFFeLWF5Xo0lnfD80eomG6bSruYA==} - '@universal-middleware/hattip@0.4.9': - resolution: {integrity: sha512-omPJvUx1mqeWeQa/KH6sz9k6hXa1dK6dguKOsYKjJBXC6wcgEX8dB7wTf7cGqeleFDpXUbPJ+gFg1M0iwlvunQ==} + '@universal-middleware/hattip@0.4.11': + resolution: {integrity: sha512-PfMR5wrjy1ld4Ikzai95+5SpQOqlNZxW7PbbMevdP7bJ0i67w0gLrZ2kkZBDL/fKCEvEjIPTZw/vOeP2N7j4bg==} - '@universal-middleware/hono@0.4.12': - resolution: {integrity: sha512-4AVRzhmaEAMiWGnckdmoxsJqOhndILFb5Rma2PczP9D4QjuEWSxWEbXWoxieZVZW5Umer0c12hhlUstnsRZPMg==} + '@universal-middleware/hono@0.4.15': + resolution: {integrity: sha512-/vd8w0PGrcexRDPyuVmX1IykOqt3VPytty/zZ2xlfs6JBcoohPNOibZiLgN8FMe021DgnAKXlgSbBt4KwviEUA==} '@universal-middleware/sirv@0.1.20': resolution: {integrity: sha512-ToSuHZPelt2BtNLwJumSqtaQ3KuQVCqeEA9CgDum0cH1qfjZci9fnknNFQ2vhi4CdUkACxPfDne5ddI810+ihg==} - '@vitejs/plugin-react-swc@3.9.0': - resolution: {integrity: sha512-jYFUSXhwMCYsh/aQTgSGLIN3Foz5wMbH9ahb0Zva//UzwZYbMiZd7oT3AU9jHT9DLswYDswsRwPU9jVF3yA48Q==} + '@vitejs/plugin-react-swc@3.11.0': + resolution: {integrity: sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==} peerDependencies: - vite: ^4 || ^5 || ^6 + vite: ^4 || ^5 || ^6 || ^7 '@whatwg-node/fetch@0.9.23': resolution: {integrity: sha512-7xlqWel9JsmxahJnYVUj/LLxWcnA93DR4c9xlw3U814jWTiYalryiH1qToik1hOxweKKRLi4haXHM5ycRksPBA==} @@ -1531,10 +1618,6 @@ packages: resolution: {integrity: sha512-tcZAhrpx6oVlkEsRngeTEEE7I5/QdLjeEz4IlekabGaESP7+Dkm/6a9KcF1KdCBB7mO9PXtBkwCuTCt8+UPg8Q==} engines: {node: '>=18.0.0'} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} @@ -1556,14 +1639,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true - add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -1575,8 +1655,8 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@5.25.0: - resolution: {integrity: sha512-n73BVorL4HIwKlfJKb4SEzAYkR3Buwfwbh+MYxg2mloFph2fFGV58E90QTzdbfzWrLn4HE5Czx/WTjI8fcHaMg==} + algoliasearch@5.34.0: + resolution: {integrity: sha512-wioVnf/8uuG8Bmywhk5qKIQ3wzCCtmdvicPRb0fa3kKYGGoewfgDqLEaET1MV2NbTc3WGpPv+AgauLVBp1nB9A==} engines: {node: '>= 14.0.0'} ansi-regex@5.0.1: @@ -1598,18 +1678,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - arktype@2.1.20: - resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -1637,8 +1708,8 @@ packages: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1647,8 +1718,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bun-types@1.2.13: - resolution: {integrity: sha512-rRjA1T6n7wto4gxhAO/ErZEtOXyEZEmnIHQfl0Dt1QQSB4QV0iP6BZ9/YB5fZaHFQ2dwHFrmPaRQ9GGMX01k9Q==} + bun-types@1.2.19: + resolution: {integrity: sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ==} + peerDependencies: + '@types/react': ^19 bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} @@ -1733,6 +1806,9 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1745,66 +1821,31 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} - - conventional-changelog-atom@4.0.0: - resolution: {integrity: sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==} - engines: {node: '>=16'} - - conventional-changelog-codemirror@4.0.0: - resolution: {integrity: sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==} - engines: {node: '>=16'} - - conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} - - conventional-changelog-core@7.0.0: - resolution: {integrity: sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==} - engines: {node: '>=16'} - - conventional-changelog-ember@4.0.0: - resolution: {integrity: sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==} - engines: {node: '>=16'} - - conventional-changelog-eslint@5.0.0: - resolution: {integrity: sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==} - engines: {node: '>=16'} - - conventional-changelog-express@4.0.0: - resolution: {integrity: sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==} - engines: {node: '>=16'} - - conventional-changelog-jquery@5.0.0: - resolution: {integrity: sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==} - engines: {node: '>=16'} - - conventional-changelog-jshint@4.0.0: - resolution: {integrity: sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==} - engines: {node: '>=16'} + conventional-changelog-angular@8.0.0: + resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} + engines: {node: '>=18'} - conventional-changelog-preset-loader@4.1.0: - resolution: {integrity: sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==} - engines: {node: '>=16'} + conventional-changelog-preset-loader@5.0.0: + resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} + engines: {node: '>=18'} - conventional-changelog-writer@7.0.1: - resolution: {integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==} - engines: {node: '>=16'} + conventional-changelog-writer@8.2.0: + resolution: {integrity: sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==} + engines: {node: '>=18'} hasBin: true - conventional-changelog@5.1.0: - resolution: {integrity: sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==} - engines: {node: '>=16'} + conventional-changelog@7.0.2: + resolution: {integrity: sha512-dz38xbKg2Nzd2zoPY1PXPq7skbN1tdx402OkcirIE44LetmoWODmt4h/6AwtQb6+ZHjbmMfW6Jxt4dyGt5P8cw==} + engines: {node: '>=18'} + hasBin: true - conventional-commits-filter@4.0.0: - resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} - engines: {node: '>=16'} + conventional-commits-filter@5.0.0: + resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + engines: {node: '>=18'} - conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} + conventional-commits-parser@6.2.0: + resolution: {integrity: sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==} + engines: {node: '>=18'} hasBin: true cookie-es@1.2.2: @@ -1832,13 +1873,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - - data-uri-to-buffer@2.0.2: - resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -1848,8 +1882,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} @@ -1876,9 +1910,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -1893,8 +1924,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - elysia@1.3.1: - resolution: {integrity: sha512-En41P6cDHcHtQ0nvfsn9ayB+8ahQJqG1nzvPX8FVZjOriFK/RtZPQBtXMfZDq/AsVIk7JFZGFEtAVEmztNJVhQ==} + elysia@1.3.5: + resolution: {integrity: sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw==} peerDependencies: exact-mirror: '>= 0.0.9' file-type: '>= 20.0.0' @@ -1910,12 +1941,12 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -1942,6 +1973,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} + hasBin: true + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1994,8 +2030,8 @@ packages: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} - exsolve@1.0.5: - resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2030,14 +2066,17 @@ packages: resolution: {integrity: sha512-2qfoaQ3BQDhZ1gtbkKZd6n0kKxJISJGM6u/skD9ljdWItAscjXrtZ1lnjr7PavmXX9j4EyCPmBDiIsLn07d5vA==} engines: {node: '>= 10'} - fastify@5.3.3: - resolution: {integrity: sha512-nCBiBCw9q6jPx+JJNVgO8JVnTXeUyrGcyTKPQikRkA/PanrFcOIo4R+ZnLeOLPZPGgzjomqfVarzE0kYx7qWiQ==} + fastify@5.4.0: + resolution: {integrity: sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fd-package-json@1.2.0: + resolution: {integrity: sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2047,9 +2086,9 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-type@20.5.0: - resolution: {integrity: sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==} - engines: {node: '>=18'} + file-type@21.0.0: + resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} + engines: {node: '>=20'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -2063,18 +2102,13 @@ packages: resolution: {integrity: sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==} engines: {node: '>=20'} - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - formidable@3.5.4: - resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} - engines: {node: '>=14.0.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -2111,23 +2145,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-source@2.0.12: - resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - hasBin: true - - git-semver-tags@7.0.1: - resolution: {integrity: sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==} - engines: {node: '>=16'} - hasBin: true - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2183,13 +2204,13 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - hono@4.7.9: - resolution: {integrity: sha512-/EsCoR5h7N4yu01TDu9GMCCJa6ZLk5ZJIWFFGNawAXmd1Tp53+Wir4xm0D2X19bbykWUlzQG0+BvPAji6p9E8Q==} + hono@4.8.5: + resolution: {integrity: sha512-Up2cQbtNz1s111qpnnECdTGqSIUIhZJMLikdKkshebQSEBcoUKq6XJayLGqSZWidiH0zfHRCJqFu062Mz5UuRA==} engines: {node: '>=16.9.0'} - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@8.1.0: + resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} + engines: {node: ^18.17.0 || >=20.5.0} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -2229,9 +2250,6 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -2275,10 +2293,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2292,27 +2306,20 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - json-schema-ref-resolver@2.0.1: resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} @@ -2324,18 +2331,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -2418,9 +2417,9 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} @@ -2567,8 +2566,8 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - miniflare@4.20250508.1: - resolution: {integrity: sha512-GvY2JZx0yH4sp5dTSx4yS/rHwHMztqnNWCjFnfXrsu+3x5UEYtjc0RMBdq4WfrIUdEaVl2dYdWk2fI4IE0teyA==} + miniflare@4.20250712.1: + resolution: {integrity: sha512-46gB3FGPOsy+EpFGufjhr8agYycO/55d6l0y7hNJ13NcTVwrObMg/0HmI3pC5yQj0974IVXzBgUfDBMAX6thow==} engines: {node: '>=18.0.0'} hasBin: true @@ -2583,6 +2582,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -2590,10 +2592,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -2621,12 +2619,12 @@ packages: encoding: optional: true - node-mock-http@1.0.0: - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + node-mock-http@1.0.1: + resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==} - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@7.0.0: + resolution: {integrity: sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==} + engines: {node: ^18.17.0 || >=20.5.0} npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} @@ -2659,19 +2657,7 @@ packages: engines: {node: '>=6'} openapi-types@12.1.3: - resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - - oxc-transform@0.64.0: - resolution: {integrity: sha512-b4fN/7l+/frPZ7/Z3XYcjvgFXfctYiOKNP0cYFDUOZR4P1NbrpfYlLVAXiCAE66kLo7um1TS/JFCSl1JbUsb9g==} - engines: {node: '>=14.0.0'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2679,10 +2665,6 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} - parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} @@ -2693,10 +2675,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2718,10 +2696,6 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - peek-readable@7.0.0: - resolution: {integrity: sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==} - engines: {node: '>=18'} - periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -2732,8 +2706,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pino-abstract-transport@2.0.0: @@ -2742,8 +2716,8 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.6.0: - resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} hasBin: true pirates@4.0.7: @@ -2754,18 +2728,21 @@ packages: resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} hasBin: true - playwright-chromium@1.52.0: - resolution: {integrity: sha512-ZTpzBzRFFRglyqRnAqdK5mFaw1P41qe8V2zSR+fA0eKPgGEEaH7r91ejXKijs3WhReatRcatHQe3ndMBMN1PLA==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + playwright-chromium@1.54.1: + resolution: {integrity: sha512-1tOND4/hyQsYng5NLkLm+Ntew+CWBsvVZCcEZ0wafF5BAd9DBQHAT9SO95+QFk5iL5IBEdB6vFdsHf9Ma72vzQ==} engines: {node: '>=18'} hasBin: true - playwright-core@1.52.0: - resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} + playwright-core@1.54.1: + resolution: {integrity: sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==} engines: {node: '>=18'} hasBin: true - playwright@1.52.0: - resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} + playwright@1.54.1: + resolution: {integrity: sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==} engines: {node: '>=18'} hasBin: true @@ -2791,18 +2768,15 @@ packages: yaml: optional: true - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} @@ -2850,14 +2824,6 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - read-pkg-up@10.1.0: - resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} - engines: {node: '>=16'} - - read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} - engines: {node: '>=16'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -2913,8 +2879,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.38.0: - resolution: {integrity: sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==} + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3055,13 +3021,14 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} @@ -3093,24 +3060,24 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strtok3@10.2.2: - resolution: {integrity: sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==} + strtok3@10.3.2: + resolution: {integrity: sha512-or9w505RhhY66+uoe5YOC5QO/bRuATaoim3XTh+pGKx5VMWi/HDhMKuCjDLsLJouU2zg9Hf1nLPcNW7IHv80kQ==} engines: {node: '>=18'} - style-to-js@1.1.16: - resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} - style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true - text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} + supports-color@10.0.0: + resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} + engines: {node: '>=18'} thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} @@ -3122,14 +3089,11 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} tldts-core@6.1.86: @@ -3151,8 +3115,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@6.0.0: - resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + token-types@6.0.3: + resolution: {integrity: sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ==} engines: {node: '>=14.16'} totalist@3.0.1: @@ -3179,14 +3143,18 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-deepmerge@7.0.3: + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} + engines: {node: '>=14.13.1'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -3208,14 +3176,6 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -3240,15 +3200,15 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} + undici@7.12.0: + resolution: {integrity: sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==} + engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.15: - resolution: {integrity: sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==} + unenv@2.0.0-rc.17: + resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -3275,8 +3235,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@2.3.4: - resolution: {integrity: sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg==} + unplugin@2.3.5: + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} engines: {node: '>=18.12.0'} urlpattern-polyfill@10.1.0: @@ -3298,8 +3258,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vike@0.4.229: - resolution: {integrity: sha512-FLiNUDwj42yRpb/iNKwjoScskyEozCjtz9kne5qvgp9fkxYSEXU/sKb+t5+XUljb4orjFgBBVCNyISqdRnAKkA==} + vike@0.4.236: + resolution: {integrity: sha512-8IRz4OmWGx5YwVBP9Zql405klEgys6tNQh3//IcD4tjhhgIoWm42rtvGb7TVfXX8CNX8DmEPHEvHTsrhk1y7ww==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: @@ -3316,7 +3276,7 @@ packages: 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 + '@types/node': ^20.17.32 jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 @@ -3351,6 +3311,9 @@ packages: yaml: optional: true + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -3377,18 +3340,17 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - workerd@1.20250508.0: - resolution: {integrity: sha512-ffLxe7dXSuGoA6jb3Qx2SClIV1aLHfJQ6RhGhzYHjQgv7dL6fdUOSIIGgzmu2mRKs+WFSujp6c8WgKquco6w3w==} + workerd@1.20250712.0: + resolution: {integrity: sha512-7h+k1OxREpiZW0849g0uQNexRWMcs5i5gUGhJzCY8nIx6Tv4D/ndlXJ47lEFj7/LQdp165IL9dM2D5uDiedZrg==} engines: {node: '>=16'} hasBin: true - wrangler@4.15.1: - resolution: {integrity: sha512-dzCdGWJUqjZAeR6kmAF28iD19VyDfD9nP1JiAw9NNlG1pEVzaY4Pr6egYyQcGj98N7WTv/tXoCk1R/L3eU3iwg==} + wrangler@4.25.1: + resolution: {integrity: sha512-4Tlg+jmqxCX3xFm+Nz1b4jHHY9iOu1EyJ17SSCCJ6MGp+FCGtXgr+CynT94+MP0v/qKQUkMKjoeJ5FNDunZ9cA==} engines: {node: '>=18.0.0'} - deprecated: '⚠️ Deprecated: 4.15.1 has a regression with R2 bucket validation with wrangler pages dev. Please downgrade to 4.14.4 or upgrade to 4.15.2 when it is published.' hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250508.0 + '@cloudflare/workers-types': ^4.20250712.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -3416,139 +3378,127 @@ packages: utf-8-validate: optional: true - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} - youch@3.3.4: - resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) - '@algolia/client-search': 5.25.0 - algoliasearch: 5.25.0 - - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)': + '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)': dependencies: - '@algolia/client-search': 5.25.0 - algoliasearch: 5.25.0 + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) + '@algolia/client-search': 5.34.0 + algoliasearch: 5.34.0 - '@algolia/client-abtesting@5.25.0': + '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-search': 5.34.0 + algoliasearch: 5.34.0 - '@algolia/client-analytics@5.25.0': + '@algolia/client-abtesting@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/client-common@5.25.0': {} - - '@algolia/client-insights@5.25.0': + '@algolia/client-analytics@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/client-personalization@5.25.0': - dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common@5.34.0': {} - '@algolia/client-query-suggestions@5.25.0': + '@algolia/client-insights@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/client-search@5.25.0': + '@algolia/client-personalization@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/ingestion@1.25.0': + '@algolia/client-query-suggestions@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/monitoring@1.25.0': + '@algolia/client-search@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/recommend@5.25.0': + '@algolia/ingestion@1.34.0': dependencies: - '@algolia/client-common': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/requester-browser-xhr@5.25.0': + '@algolia/monitoring@1.34.0': dependencies: - '@algolia/client-common': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/requester-fetch@5.25.0': + '@algolia/recommend@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 + '@algolia/client-common': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 - '@algolia/requester-node-http@5.25.0': + '@algolia/requester-browser-xhr@5.34.0': dependencies: - '@algolia/client-common': 5.25.0 + '@algolia/client-common': 5.34.0 - '@ark/schema@0.46.0': + '@algolia/requester-fetch@5.34.0': dependencies: - '@ark/util': 0.46.0 + '@algolia/client-common': 5.34.0 - '@ark/util@0.46.0': {} - - '@babel/code-frame@7.27.1': + '@algolia/requester-node-http@5.34.0': dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/helper-validator-identifier@7.27.1': {} + '@algolia/client-common': 5.34.0 '@biomejs/biome@1.9.4': optionalDependencies: @@ -3585,14 +3535,14 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@brillout/docpress@0.12.6(@algolia/client-search@5.25.0)(@types/react@18.3.21)(@vitejs/plugin-react-swc@3.9.0(vite@6.3.5(@types/node@20.17.47)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.38.0)(search-insights@2.17.3)(typescript@5.8.3)(vike@0.4.229(vite@6.3.5(@types/node@20.17.47)))(vite@6.3.5(@types/node@20.17.47))': + '@brillout/docpress@0.12.6(@algolia/client-search@5.34.0)(@types/react@18.3.23)(@vitejs/plugin-react-swc@3.11.0(vite@6.3.5(@types/node@20.19.9)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.45.1)(search-insights@2.17.3)(typescript@5.8.3)(vike@0.4.236(vite@6.3.5(@types/node@20.19.9)))(vite@6.3.5(@types/node@20.19.9))': dependencies: - '@brillout/picocolors': 1.0.26 + '@brillout/picocolors': 1.0.28 '@docsearch/css': 3.9.0 - '@docsearch/react': 3.9.0(@algolia/client-search@5.25.0)(@types/react@18.3.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + '@docsearch/react': 3.9.0(@algolia/client-search@5.34.0)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@mdx-js/mdx': 3.0.1 - '@mdx-js/react': 3.0.1(@types/react@18.3.21)(react@18.3.1) - '@mdx-js/rollup': 3.0.1(rollup@4.38.0) + '@mdx-js/react': 3.0.1(@types/react@18.3.23)(react@18.3.1) + '@mdx-js/rollup': 3.0.1(rollup@4.45.1) '@shikijs/transformers': 1.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -3600,10 +3550,10 @@ snapshots: remark-gfm: 4.0.0 shiki: 1.2.0 typescript: 5.8.3 - vike: 0.4.229(vite@6.3.5(@types/node@20.17.47)) + vike: 0.4.236(vite@6.3.5(@types/node@20.19.9)) optionalDependencies: - '@vitejs/plugin-react-swc': 3.9.0(vite@6.3.5(@types/node@20.17.47)) - vite: 6.3.5(@types/node@20.17.47) + '@vitejs/plugin-react-swc': 3.11.0(vite@6.3.5(@types/node@20.19.9)) + vite: 6.3.5(@types/node@20.19.9) transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -3613,32 +3563,35 @@ snapshots: '@brillout/import@0.2.6': {} - '@brillout/json-serializer@0.5.15': {} + '@brillout/json-serializer@0.5.16': {} '@brillout/part-regex@0.1.4': {} - '@brillout/picocolors@1.0.26': {} + '@brillout/picocolors@1.0.28': {} - '@brillout/release-me@0.4.3': + '@brillout/release-me@0.4.8(conventional-commits-filter@5.0.0)': dependencies: - '@brillout/picocolors': 1.0.26 + '@brillout/picocolors': 1.0.28 commander: 11.1.0 - conventional-changelog: 5.1.0 + conventional-changelog: 7.0.2(conventional-commits-filter@5.0.0) + conventional-changelog-angular: 8.0.0 execa: 5.1.1 semver: 7.7.2 + transitivePeerDependencies: + - conventional-commits-filter '@brillout/require-shim@0.1.2': {} - '@brillout/test-e2e@0.6.8': + '@brillout/test-e2e@0.6.14': dependencies: '@brillout/part-regex': 0.1.4 - '@brillout/picocolors': 1.0.26 + '@brillout/picocolors': 1.0.28 chai: 4.5.0 esbuild: 0.23.1 fast-glob: 3.3.3 node-fetch: 2.7.0 pixelmatch: 5.3.0 - playwright-chromium: 1.52.0 + playwright-chromium: 1.54.1 pngjs: 6.0.0 source-map-support: 0.5.21 strip-ansi: 6.0.1 @@ -3648,30 +3601,30 @@ snapshots: '@brillout/vite-plugin-server-entry@0.7.9': dependencies: '@brillout/import': 0.2.6 - '@brillout/picocolors': 1.0.26 + '@brillout/picocolors': 1.0.28 '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250508.0)': + '@cloudflare/unenv-preset@2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250712.0)': dependencies: - unenv: 2.0.0-rc.15 + unenv: 2.0.0-rc.17 optionalDependencies: - workerd: 1.20250508.0 + workerd: 1.20250712.0 - '@cloudflare/vite-plugin@1.2.1(rollup@4.38.0)(vite@6.3.5(@types/node@20.17.47))(workerd@1.20250508.0)(wrangler@4.15.1(@cloudflare/workers-types@4.20250515.0))': + '@cloudflare/vite-plugin@1.10.0(rollup@4.45.1)(vite@6.3.5(@types/node@20.19.9))(workerd@1.20250712.0)(wrangler@4.25.1(@cloudflare/workers-types@4.20250722.0))': dependencies: - '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250508.0) + '@cloudflare/unenv-preset': 2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250712.0) '@mjackson/node-fetch-server': 0.6.1 - '@rollup/plugin-replace': 6.0.2(rollup@4.38.0) + '@rollup/plugin-replace': 6.0.2(rollup@4.45.1) get-port: 7.1.0 - miniflare: 4.20250508.1 + miniflare: 4.20250712.1 picocolors: 1.1.1 - tinyglobby: 0.2.13 - unenv: 2.0.0-rc.15 - vite: 6.3.5(@types/node@20.17.47) - wrangler: 4.15.1(@cloudflare/workers-types@4.20250515.0) + tinyglobby: 0.2.14 + unenv: 2.0.0-rc.17 + vite: 6.3.5(@types/node@20.19.9) + wrangler: 4.25.1(@cloudflare/workers-types@4.20250722.0) ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -3679,22 +3632,31 @@ snapshots: - utf-8-validate - workerd - '@cloudflare/workerd-darwin-64@1.20250508.0': + '@cloudflare/workerd-darwin-64@1.20250712.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250508.0': + '@cloudflare/workerd-darwin-arm64@1.20250712.0': optional: true - '@cloudflare/workerd-linux-64@1.20250508.0': + '@cloudflare/workerd-linux-64@1.20250712.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250508.0': + '@cloudflare/workerd-linux-arm64@1.20250712.0': optional: true - '@cloudflare/workerd-windows-64@1.20250508.0': + '@cloudflare/workerd-windows-64@1.20250712.0': optional: true - '@cloudflare/workers-types@4.20250515.0': {} + '@cloudflare/workers-types@4.20250722.0': {} + + '@conventional-changelog/git-client@2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0)': + dependencies: + '@simple-libs/child-process-utils': 1.0.1 + '@simple-libs/stream-utils': 1.1.0 + semver: 7.7.2 + optionalDependencies: + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.2.0 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -3702,38 +3664,28 @@ snapshots: '@docsearch/css@3.9.0': {} - '@docsearch/react@3.9.0(@algolia/client-search@5.25.0)(@types/react@18.3.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': + '@docsearch/react@3.9.0(@algolia/client-search@5.34.0)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.25.0)(algoliasearch@5.25.0) + '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) '@docsearch/css': 3.9.0 - algoliasearch: 5.25.0 + algoliasearch: 5.34.0 optionalDependencies: - '@types/react': 18.3.21 + '@types/react': 18.3.23 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - '@elysiajs/node@1.2.6(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(formidable@3.5.4)(ws@8.18.0)': - dependencies: - elysia: 1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3) - formidable: 3.5.4 - ws: 8.18.0 - - '@emnapi/core@1.4.3': - dependencies: - '@emnapi/wasi-threads': 1.0.2 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.4.3': + '@elysiajs/node@1.3.0(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(hono@4.8.5)': dependencies: - tslib: 2.8.1 - optional: true + '@hono/node-server': 1.17.1(hono@4.8.5) + elysia: 1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3) + transitivePeerDependencies: + - hono - '@emnapi/wasi-threads@1.0.2': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true @@ -3744,156 +3696,232 @@ snapshots: '@esbuild/aix-ppc64@0.25.4': optional: true + '@esbuild/aix-ppc64@0.25.8': + optional: true + '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm64@0.25.4': optional: true + '@esbuild/android-arm64@0.25.8': + optional: true + '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-arm@0.25.4': optional: true + '@esbuild/android-arm@0.25.8': + optional: true + '@esbuild/android-x64@0.23.1': optional: true '@esbuild/android-x64@0.25.4': optional: true + '@esbuild/android-x64@0.25.8': + optional: true + '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-arm64@0.25.4': optional: true + '@esbuild/darwin-arm64@0.25.8': + optional: true + '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/darwin-x64@0.25.4': optional: true + '@esbuild/darwin-x64@0.25.8': + optional: true + '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.25.4': optional: true + '@esbuild/freebsd-arm64@0.25.8': + optional: true + '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/freebsd-x64@0.25.4': optional: true + '@esbuild/freebsd-x64@0.25.8': + optional: true + '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm64@0.25.4': optional: true + '@esbuild/linux-arm64@0.25.8': + optional: true + '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-arm@0.25.4': optional: true + '@esbuild/linux-arm@0.25.8': + optional: true + '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-ia32@0.25.4': optional: true + '@esbuild/linux-ia32@0.25.8': + optional: true + '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-loong64@0.25.4': optional: true + '@esbuild/linux-loong64@0.25.8': + optional: true + '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-mips64el@0.25.4': optional: true + '@esbuild/linux-mips64el@0.25.8': + optional: true + '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-ppc64@0.25.4': optional: true + '@esbuild/linux-ppc64@0.25.8': + optional: true + '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-riscv64@0.25.4': optional: true + '@esbuild/linux-riscv64@0.25.8': + optional: true + '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-s390x@0.25.4': optional: true + '@esbuild/linux-s390x@0.25.8': + optional: true + '@esbuild/linux-x64@0.23.1': optional: true '@esbuild/linux-x64@0.25.4': optional: true + '@esbuild/linux-x64@0.25.8': + optional: true + '@esbuild/netbsd-arm64@0.25.4': optional: true + '@esbuild/netbsd-arm64@0.25.8': + optional: true + '@esbuild/netbsd-x64@0.23.1': optional: true '@esbuild/netbsd-x64@0.25.4': optional: true + '@esbuild/netbsd-x64@0.25.8': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true '@esbuild/openbsd-arm64@0.25.4': optional: true + '@esbuild/openbsd-arm64@0.25.8': + optional: true + '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/openbsd-x64@0.25.4': optional: true + '@esbuild/openbsd-x64@0.25.8': + optional: true + + '@esbuild/openharmony-arm64@0.25.8': + optional: true + '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.25.4': optional: true + '@esbuild/sunos-x64@0.25.8': + optional: true + '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-arm64@0.25.4': optional: true + '@esbuild/win32-arm64@0.25.8': + optional: true + '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-ia32@0.25.4': optional: true + '@esbuild/win32-ia32@0.25.8': + optional: true + '@esbuild/win32-x64@0.23.1': optional: true '@esbuild/win32-x64@0.25.4': optional: true + '@esbuild/win32-x64@0.25.8': + optional: true + '@fastify/ajv-compiler@4.0.2': dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) fast-uri: 3.0.6 - '@fastify/busboy@2.1.1': {} - - '@fastify/error@4.1.0': {} + '@fastify/error@4.2.0': {} '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: @@ -3934,11 +3962,9 @@ snapshots: cac: 6.7.14 mime-types: 2.1.35 - '@hono/node-server@1.14.1(hono@4.7.9)': + '@hono/node-server@1.17.1(hono@4.8.5)': dependencies: - hono: 4.7.9 - - '@hutson/parse-repository-url@5.0.0': {} + hono: 4.8.5 '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -4006,7 +4032,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.4.5 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -4024,33 +4050,30 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@kamilkisiela/fast-url-parser@1.1.4': {} '@mdx-js/mdx@3.0.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -4076,17 +4099,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.0.1(@types/react@18.3.21)(react@18.3.1)': + '@mdx-js/react@3.0.1(@types/react@18.3.23)(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.21 + '@types/react': 18.3.23 react: 18.3.1 - '@mdx-js/rollup@3.0.1(rollup@4.38.0)': + '@mdx-js/rollup@3.0.1(rollup@4.45.1)': dependencies: '@mdx-js/mdx': 3.0.1 - '@rollup/pluginutils': 5.1.4(rollup@4.38.0) - rollup: 4.38.0 + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + rollup: 4.45.1 source-map: 0.7.4 vfile: 6.0.3 transitivePeerDependencies: @@ -4094,15 +4117,6 @@ snapshots: '@mjackson/node-fetch-server@0.6.1': {} - '@napi-rs/wasm-runtime@0.2.9': - dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 - optional: true - - '@noble/hashes@1.8.0': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4115,120 +4129,98 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@oxc-transform/binding-darwin-arm64@0.64.0': - optional: true - - '@oxc-transform/binding-darwin-x64@0.64.0': - optional: true - - '@oxc-transform/binding-linux-arm-gnueabihf@0.64.0': - optional: true - - '@oxc-transform/binding-linux-arm64-gnu@0.64.0': - optional: true - - '@oxc-transform/binding-linux-arm64-musl@0.64.0': - optional: true - - '@oxc-transform/binding-linux-x64-gnu@0.64.0': + '@pkgjs/parseargs@0.11.0': optional: true - '@oxc-transform/binding-linux-x64-musl@0.64.0': - optional: true + '@polka/url@1.0.0-next.29': {} - '@oxc-transform/binding-wasm32-wasi@0.64.0': + '@poppinss/colors@4.1.5': dependencies: - '@napi-rs/wasm-runtime': 0.2.9 - optional: true - - '@oxc-transform/binding-win32-arm64-msvc@0.64.0': - optional: true - - '@oxc-transform/binding-win32-x64-msvc@0.64.0': - optional: true + kleur: 4.1.5 - '@paralleldrive/cuid2@2.2.2': + '@poppinss/dumper@0.6.4': dependencies: - '@noble/hashes': 1.8.0 + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.0.2 + supports-color: 10.0.0 - '@pkgjs/parseargs@0.11.0': - optional: true + '@poppinss/exception@1.2.2': {} - '@polka/url@1.0.0-next.29': {} + '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rollup/plugin-replace@6.0.2(rollup@4.38.0)': + '@rollup/plugin-replace@6.0.2(rollup@4.45.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.38.0) + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) magic-string: 0.30.17 optionalDependencies: - rollup: 4.38.0 + rollup: 4.45.1 - '@rollup/pluginutils@5.1.4(rollup@4.38.0)': + '@rollup/pluginutils@5.2.0(rollup@4.45.1)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.38.0 + rollup: 4.45.1 - '@rollup/rollup-android-arm-eabi@4.38.0': + '@rollup/rollup-android-arm-eabi@4.45.1': optional: true - '@rollup/rollup-android-arm64@4.38.0': + '@rollup/rollup-android-arm64@4.45.1': optional: true - '@rollup/rollup-darwin-arm64@4.38.0': + '@rollup/rollup-darwin-arm64@4.45.1': optional: true - '@rollup/rollup-darwin-x64@4.38.0': + '@rollup/rollup-darwin-x64@4.45.1': optional: true - '@rollup/rollup-freebsd-arm64@4.38.0': + '@rollup/rollup-freebsd-arm64@4.45.1': optional: true - '@rollup/rollup-freebsd-x64@4.38.0': + '@rollup/rollup-freebsd-x64@4.45.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.38.0': + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.38.0': + '@rollup/rollup-linux-arm-musleabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.38.0': + '@rollup/rollup-linux-arm64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.38.0': + '@rollup/rollup-linux-arm64-musl@4.45.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.38.0': + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.38.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.38.0': + '@rollup/rollup-linux-riscv64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.38.0': + '@rollup/rollup-linux-riscv64-musl@4.45.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.38.0': + '@rollup/rollup-linux-s390x-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.38.0': + '@rollup/rollup-linux-x64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-musl@4.38.0': + '@rollup/rollup-linux-x64-musl@4.45.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.38.0': + '@rollup/rollup-win32-arm64-msvc@4.45.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.38.0': + '@rollup/rollup-win32-ia32-msvc@4.45.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.38.0': + '@rollup/rollup-win32-x64-msvc@4.45.1': optional: true '@shikijs/core@1.2.0': {} @@ -4237,58 +4229,71 @@ snapshots: dependencies: shiki: 1.2.0 - '@sinclair/typebox@0.34.33': + '@simple-libs/child-process-utils@1.0.1': + dependencies: + '@simple-libs/stream-utils': 1.1.0 + '@types/node': 20.19.9 + + '@simple-libs/stream-utils@1.1.0': + dependencies: + '@types/node': 20.19.9 + + '@sinclair/typebox@0.34.38': optional: true - '@swc/core-darwin-arm64@1.11.24': + '@sindresorhus/is@7.0.2': {} + + '@speed-highlight/core@1.2.7': {} + + '@swc/core-darwin-arm64@1.13.1': optional: true - '@swc/core-darwin-x64@1.11.24': + '@swc/core-darwin-x64@1.13.1': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.24': + '@swc/core-linux-arm-gnueabihf@1.13.1': optional: true - '@swc/core-linux-arm64-gnu@1.11.24': + '@swc/core-linux-arm64-gnu@1.13.1': optional: true - '@swc/core-linux-arm64-musl@1.11.24': + '@swc/core-linux-arm64-musl@1.13.1': optional: true - '@swc/core-linux-x64-gnu@1.11.24': + '@swc/core-linux-x64-gnu@1.13.1': optional: true - '@swc/core-linux-x64-musl@1.11.24': + '@swc/core-linux-x64-musl@1.13.1': optional: true - '@swc/core-win32-arm64-msvc@1.11.24': + '@swc/core-win32-arm64-msvc@1.13.1': optional: true - '@swc/core-win32-ia32-msvc@1.11.24': + '@swc/core-win32-ia32-msvc@1.13.1': optional: true - '@swc/core-win32-x64-msvc@1.11.24': + '@swc/core-win32-x64-msvc@1.13.1': optional: true - '@swc/core@1.11.24': + '@swc/core@1.13.1': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 + '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.24 - '@swc/core-darwin-x64': 1.11.24 - '@swc/core-linux-arm-gnueabihf': 1.11.24 - '@swc/core-linux-arm64-gnu': 1.11.24 - '@swc/core-linux-arm64-musl': 1.11.24 - '@swc/core-linux-x64-gnu': 1.11.24 - '@swc/core-linux-x64-musl': 1.11.24 - '@swc/core-win32-arm64-msvc': 1.11.24 - '@swc/core-win32-ia32-msvc': 1.11.24 - '@swc/core-win32-x64-msvc': 1.11.24 + '@swc/core-darwin-arm64': 1.13.1 + '@swc/core-darwin-x64': 1.13.1 + '@swc/core-linux-arm-gnueabihf': 1.13.1 + '@swc/core-linux-arm64-gnu': 1.13.1 + '@swc/core-linux-arm64-musl': 1.13.1 + '@swc/core-linux-x64-gnu': 1.13.1 + '@swc/core-linux-x64-musl': 1.13.1 + '@swc/core-win32-arm64-msvc': 1.13.1 + '@swc/core-win32-ia32-msvc': 1.13.1 + '@swc/core-win32-x64-msvc': 1.13.1 '@swc/counter@0.1.3': {} - '@swc/types@0.1.21': + '@swc/types@0.1.23': dependencies: '@swc/counter': 0.1.3 @@ -4296,29 +4301,26 @@ snapshots: dependencies: debug: 4.4.1 fflate: 0.8.2 - token-types: 6.0.0 + token-types: 6.0.3 transitivePeerDependencies: - supports-color '@tokenizer/token@0.3.0': {} - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.17.47 + '@types/node': 20.19.9 - '@types/bun@1.2.13': + '@types/bun@1.2.19(@types/react@18.3.23)': dependencies: - bun-types: 1.2.13 + bun-types: 1.2.19(@types/react@18.3.23) + transitivePeerDependencies: + - '@types/react' '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.47 + '@types/node': 20.19.9 '@types/debug@4.1.12': dependencies: @@ -4328,28 +4330,28 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} - '@types/express-serve-static-core@5.0.6': + '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 20.17.47 + '@types/node': 20.19.9 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@5.0.2': + '@types/express@5.0.3': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 5.0.6 - '@types/serve-static': 1.15.7 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.0.7 + '@types/serve-static': 1.15.8 '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} '@types/mdast@4.0.4': dependencies: @@ -4361,37 +4363,37 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@20.17.47': + '@types/node@20.19.9': dependencies: - undici-types: 6.19.8 + undici-types: 6.21.0 '@types/normalize-package-data@2.4.4': {} - '@types/prop-types@15.7.14': {} + '@types/prop-types@15.7.15': {} '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@18.3.7(@types/react@18.3.21)': + '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: - '@types/react': 18.3.21 + '@types/react': 18.3.23 - '@types/react@18.3.21': + '@types/react@18.3.23': dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 csstype: 3.1.3 - '@types/send@0.17.4': + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.17.47 + '@types/node': 20.19.9 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 20.17.47 - '@types/send': 0.17.4 + '@types/http-errors': 2.0.5 + '@types/node': 20.19.9 + '@types/send': 0.17.5 '@types/unist@2.0.11': {} @@ -4399,9 +4401,9 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@universal-middleware/cloudflare@0.4.8(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/cloudflare@0.4.10(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: - '@universal-middleware/core': 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + '@universal-middleware/core': 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) transitivePeerDependencies: - '@cloudflare/workers-types' - '@hattip/core' @@ -4413,21 +4415,21 @@ snapshots: '@universal-middleware/compress@0.2.30': {} - '@universal-middleware/core@0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/core@0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: regexparam: 3.0.0 tough-cookie: 5.1.2 optionalDependencies: - '@cloudflare/workers-types': 4.20250515.0 + '@cloudflare/workers-types': 4.20250722.0 '@hattip/core': 0.0.49 - elysia: 1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3) - fastify: 5.3.3 + elysia: 1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3) + fastify: 5.4.0 h3: 1.15.3 - hono: 4.7.9 + hono: 4.8.5 - '@universal-middleware/elysia@0.5.1(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/elysia@0.5.3(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: - '@universal-middleware/core': 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + '@universal-middleware/core': 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) transitivePeerDependencies: - '@cloudflare/workers-types' - '@hattip/core' @@ -4437,9 +4439,9 @@ snapshots: - h3 - hono - '@universal-middleware/express@0.4.16(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/express@0.4.18(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: - '@universal-middleware/core': 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + '@universal-middleware/core': 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) transitivePeerDependencies: - '@cloudflare/workers-types' - '@hattip/core' @@ -4449,10 +4451,10 @@ snapshots: - h3 - hono - '@universal-middleware/fastify@0.5.18(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/fastify@0.5.20(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: - '@universal-middleware/core': 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) - '@universal-middleware/express': 0.4.16(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + '@universal-middleware/core': 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) + '@universal-middleware/express': 0.4.18(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) fastify-raw-body: 5.0.0 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -4463,9 +4465,9 @@ snapshots: - h3 - hono - '@universal-middleware/h3@0.4.10(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/h3@0.4.12(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: - '@universal-middleware/core': 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + '@universal-middleware/core': 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) transitivePeerDependencies: - '@cloudflare/workers-types' - '@hattip/core' @@ -4475,9 +4477,9 @@ snapshots: - h3 - hono - '@universal-middleware/hattip@0.4.9(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/hattip@0.4.11(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: - '@universal-middleware/core': 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + '@universal-middleware/core': 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) transitivePeerDependencies: - '@cloudflare/workers-types' - '@hattip/core' @@ -4487,9 +4489,9 @@ snapshots: - h3 - hono - '@universal-middleware/hono@0.4.12(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9)': + '@universal-middleware/hono@0.4.15(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5)': dependencies: - '@universal-middleware/core': 0.4.7(@cloudflare/workers-types@4.20250515.0)(@hattip/core@0.0.49)(elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3))(fastify@5.3.3)(h3@1.15.3)(hono@4.7.9) + '@universal-middleware/core': 0.4.9(@cloudflare/workers-types@4.20250722.0)(@hattip/core@0.0.49)(elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3))(fastify@5.4.0)(h3@1.15.3)(hono@4.8.5) transitivePeerDependencies: - '@cloudflare/workers-types' - '@hattip/core' @@ -4504,10 +4506,11 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 - '@vitejs/plugin-react-swc@3.9.0(vite@6.3.5(@types/node@20.17.47))': + '@vitejs/plugin-react-swc@3.11.0(vite@6.3.5(@types/node@20.19.9))': dependencies: - '@swc/core': 1.11.24 - vite: 6.3.5(@types/node@20.17.47) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@swc/core': 1.13.1 + vite: 6.3.5(@types/node@20.19.9) transitivePeerDependencies: - '@swc/helpers' @@ -4523,11 +4526,6 @@ snapshots: fast-querystring: 1.1.2 tslib: 2.8.1 - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - abstract-logging@2.0.1: {} accepts@2.0.0: @@ -4535,17 +4533,15 @@ snapshots: mime-types: 3.0.1 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk@8.3.2: {} acorn@8.14.0: {} - acorn@8.14.1: {} - - add-stream@1.0.0: {} + acorn@8.15.0: {} ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: @@ -4558,21 +4554,21 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.25.0: - dependencies: - '@algolia/client-abtesting': 5.25.0 - '@algolia/client-analytics': 5.25.0 - '@algolia/client-common': 5.25.0 - '@algolia/client-insights': 5.25.0 - '@algolia/client-personalization': 5.25.0 - '@algolia/client-query-suggestions': 5.25.0 - '@algolia/client-search': 5.25.0 - '@algolia/ingestion': 1.25.0 - '@algolia/monitoring': 1.25.0 - '@algolia/recommend': 5.25.0 - '@algolia/requester-browser-xhr': 5.25.0 - '@algolia/requester-fetch': 5.25.0 - '@algolia/requester-node-http': 5.25.0 + algoliasearch@5.34.0: + dependencies: + '@algolia/client-abtesting': 5.34.0 + '@algolia/client-analytics': 5.34.0 + '@algolia/client-common': 5.34.0 + '@algolia/client-insights': 5.34.0 + '@algolia/client-personalization': 5.34.0 + '@algolia/client-query-suggestions': 5.34.0 + '@algolia/client-search': 5.34.0 + '@algolia/ingestion': 1.34.0 + '@algolia/monitoring': 1.34.0 + '@algolia/recommend': 5.34.0 + '@algolia/requester-browser-xhr': 5.34.0 + '@algolia/requester-fetch': 5.34.0 + '@algolia/requester-node-http': 5.34.0 ansi-regex@5.0.1: {} @@ -4586,19 +4582,8 @@ snapshots: any-promise@1.3.0: {} - arktype@2.1.20: - dependencies: - '@ark/schema': 0.46.0 - '@ark/util': 0.46.0 - array-ify@1.0.0: {} - as-table@1.0.55: - dependencies: - printable-characters: 1.0.42 - - asap@2.0.6: {} - assertion-error@1.1.0: {} astring@1.9.0: {} @@ -4607,7 +4592,7 @@ snapshots: avvio@9.1.0: dependencies: - '@fastify/error': 4.1.0 + '@fastify/error': 4.2.0 fastq: 1.19.1 bail@2.0.2: {} @@ -4630,7 +4615,7 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -4640,13 +4625,14 @@ snapshots: buffer-from@1.1.2: {} - bun-types@1.2.13: + bun-types@1.2.19(@types/react@18.3.23): dependencies: - '@types/node': 20.17.47 + '@types/node': 20.19.9 + '@types/react': 18.3.23 - bundle-require@5.1.0(esbuild@0.25.4): + bundle-require@5.1.0(esbuild@0.25.8): dependencies: - esbuild: 0.25.4 + esbuild: 0.25.8 load-tsconfig: 0.2.5 busboy@1.6.0: @@ -4707,13 +4693,11 @@ snapshots: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - optional: true color@4.2.3: dependencies: color-convert: 2.0.1 color-string: 1.9.1 - optional: true comma-separated-tokens@2.0.3: {} @@ -4726,6 +4710,8 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + confbox@0.1.8: {} + consola@3.4.2: {} content-disposition@1.0.0: @@ -4734,76 +4720,37 @@ snapshots: content-type@1.0.5: {} - conventional-changelog-angular@7.0.0: - dependencies: - compare-func: 2.0.0 - - conventional-changelog-atom@4.0.0: {} - - conventional-changelog-codemirror@4.0.0: {} - - conventional-changelog-conventionalcommits@7.0.2: - dependencies: - compare-func: 2.0.0 - - conventional-changelog-core@7.0.0: - dependencies: - '@hutson/parse-repository-url': 5.0.0 - add-stream: 1.0.0 - conventional-changelog-writer: 7.0.1 - conventional-commits-parser: 5.0.0 - git-raw-commits: 4.0.0 - git-semver-tags: 7.0.1 - hosted-git-info: 7.0.2 - normalize-package-data: 6.0.2 - read-pkg: 8.1.0 - read-pkg-up: 10.1.0 - - conventional-changelog-ember@4.0.0: {} - - conventional-changelog-eslint@5.0.0: {} - - conventional-changelog-express@4.0.0: {} - - conventional-changelog-jquery@5.0.0: {} - - conventional-changelog-jshint@4.0.0: + conventional-changelog-angular@8.0.0: dependencies: compare-func: 2.0.0 - conventional-changelog-preset-loader@4.1.0: {} + conventional-changelog-preset-loader@5.0.0: {} - conventional-changelog-writer@7.0.1: + conventional-changelog-writer@8.2.0: dependencies: - conventional-commits-filter: 4.0.0 + conventional-commits-filter: 5.0.0 handlebars: 4.7.8 - json-stringify-safe: 5.0.1 - meow: 12.1.1 + meow: 13.2.0 semver: 7.7.2 - split2: 4.2.0 - conventional-changelog@5.1.0: + conventional-changelog@7.0.2(conventional-commits-filter@5.0.0): dependencies: - conventional-changelog-angular: 7.0.0 - conventional-changelog-atom: 4.0.0 - conventional-changelog-codemirror: 4.0.0 - conventional-changelog-conventionalcommits: 7.0.2 - conventional-changelog-core: 7.0.0 - conventional-changelog-ember: 4.0.0 - conventional-changelog-eslint: 5.0.0 - conventional-changelog-express: 4.0.0 - conventional-changelog-jquery: 5.0.0 - conventional-changelog-jshint: 4.0.0 - conventional-changelog-preset-loader: 4.1.0 + '@conventional-changelog/git-client': 2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + '@types/normalize-package-data': 2.4.4 + conventional-changelog-preset-loader: 5.0.0 + conventional-changelog-writer: 8.2.0 + conventional-commits-parser: 6.2.0 + fd-package-json: 1.2.0 + meow: 13.2.0 + normalize-package-data: 7.0.0 + transitivePeerDependencies: + - conventional-commits-filter - conventional-commits-filter@4.0.0: {} + conventional-commits-filter@5.0.0: {} - conventional-commits-parser@5.0.0: + conventional-commits-parser@6.2.0: dependencies: - JSONStream: 1.3.5 - is-text-path: 2.0.0 - meow: 12.1.1 - split2: 4.2.0 + meow: 13.2.0 cookie-es@1.2.2: {} @@ -4825,15 +4772,11 @@ snapshots: csstype@3.1.3: {} - dargs@8.1.0: {} - - data-uri-to-buffer@2.0.2: {} - debug@4.4.1: dependencies: ms: 2.1.3 - decode-named-character-reference@1.1.0: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -4849,18 +4792,12 @@ snapshots: destr@2.0.5: {} - detect-libc@2.0.4: - optional: true + detect-libc@2.0.4: {} devlop@1.1.0: dependencies: dequal: 2.0.3 - dezalgo@1.0.4: - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -4875,15 +4812,15 @@ snapshots: ee-first@1.1.1: {} - elysia@1.3.1(exact-mirror@0.1.2(@sinclair/typebox@0.34.33))(file-type@20.5.0)(typescript@5.8.3): + elysia@1.3.5(exact-mirror@0.1.2(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.8.3): dependencies: cookie: 1.0.2 - exact-mirror: 0.1.2(@sinclair/typebox@0.34.33) + exact-mirror: 0.1.2(@sinclair/typebox@0.34.38) fast-decode-uri-component: 1.0.1 - file-type: 20.5.0 + file-type: 21.0.0 typescript: 5.8.3 optionalDependencies: - '@sinclair/typebox': 0.34.33 + '@sinclair/typebox': 0.34.38 openapi-types: 12.1.3 emoji-regex@8.0.0: {} @@ -4892,11 +4829,9 @@ snapshots: encodeurl@2.0.0: {} - entities@6.0.0: {} + entities@6.0.1: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} es-define-property@1.0.1: {} @@ -4963,13 +4898,42 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 + esbuild@0.25.8: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 + escape-html@1.0.3: {} escape-string-regexp@5.0.0: {} estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-build-jsx@3.0.1: dependencies: @@ -4995,13 +4959,13 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 etag@1.8.1: {} - exact-mirror@0.1.2(@sinclair/typebox@0.34.33): + exact-mirror@0.1.2(@sinclair/typebox@0.34.38): optionalDependencies: - '@sinclair/typebox': 0.34.33 + '@sinclair/typebox': 0.34.38 execa@5.1.1: dependencies: @@ -5043,13 +5007,13 @@ snapshots: router: 2.2.0 send: 1.2.0 serve-static: 2.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color - exsolve@1.0.5: {} + exsolve@1.0.7: {} extend@3.0.2: {} @@ -5090,10 +5054,10 @@ snapshots: raw-body: 3.0.0 secure-json-parse: 2.7.0 - fastify@5.3.3: + fastify@5.4.0: dependencies: '@fastify/ajv-compiler': 4.0.2 - '@fastify/error': 4.1.0 + '@fastify/error': 4.2.0 '@fastify/fast-json-stringify-compiler': 5.0.3 '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 @@ -5101,7 +5065,7 @@ snapshots: fast-json-stringify: 6.0.1 find-my-way: 9.3.0 light-my-request: 6.6.0 - pino: 9.6.0 + pino: 9.7.0 process-warning: 5.0.0 rfdc: 1.4.1 secure-json-parse: 4.0.0 @@ -5112,17 +5076,21 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.4(picomatch@4.0.2): + fd-package-json@1.2.0: + dependencies: + walk-up-path: 3.0.1 + + fdir@6.4.6(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fflate@0.8.2: {} - file-type@20.5.0: + file-type@21.0.0: dependencies: '@tokenizer/inflate': 0.2.7 - strtok3: 10.2.2 - token-types: 6.0.0 + strtok3: 10.3.2 + token-types: 6.0.3 uint8array-extras: 1.4.0 transitivePeerDependencies: - supports-color @@ -5138,7 +5106,7 @@ snapshots: escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -5148,22 +5116,17 @@ snapshots: fast-querystring: 1.1.2 safe-regex2: 5.0.0 - find-up@6.3.0: + fix-dts-default-cjs-exports@1.0.1: dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.45.1 foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - formidable@3.5.4: - dependencies: - '@paralleldrive/cuid2': 2.2.2 - dezalgo: 1.0.4 - once: 1.4.0 - forwarded@0.2.0: {} fresh@2.0.0: {} @@ -5198,24 +5161,8 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-source@2.0.12: - dependencies: - data-uri-to-buffer: 2.0.2 - source-map: 0.6.1 - get-stream@6.0.1: {} - git-raw-commits@4.0.0: - dependencies: - dargs: 8.1.0 - meow: 12.1.1 - split2: 4.2.0 - - git-semver-tags@7.0.1: - dependencies: - meow: 12.1.1 - semver: 7.7.2 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5240,7 +5187,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.0 + node-mock-http: 1.0.1 radix3: 1.1.2 ufo: 1.6.1 uncrypto: 0.1.3 @@ -5286,7 +5233,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -5299,7 +5246,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.16 + style-to-js: 1.1.17 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: @@ -5307,7 +5254,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -5319,7 +5266,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.16 + style-to-js: 1.1.17 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -5341,9 +5288,9 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 - hono@4.7.9: {} + hono@4.8.5: {} - hosted-git-info@7.0.2: + hosted-git-info@8.1.0: dependencies: lru-cache: 10.4.3 @@ -5380,10 +5327,7 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arrayish@0.2.1: {} - - is-arrayish@0.3.2: - optional: true + is-arrayish@0.3.2: {} is-decimal@2.0.1: {} @@ -5407,14 +5351,10 @@ snapshots: is-reference@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 is-stream@2.0.1: {} - is-text-path@2.0.0: - dependencies: - text-extensions: 2.4.0 - isexe@2.0.0: {} jackspeak@3.4.3: @@ -5427,19 +5367,15 @@ snapshots: js-tokens@4.0.0: {} - json-parse-even-better-errors@3.0.2: {} - json-schema-ref-resolver@2.0.1: dependencies: dequal: 2.0.3 json-schema-traverse@1.0.0: {} - json-stringify-safe@5.0.1: {} - json5@2.2.3: {} - jsonparse@1.3.1: {} + kleur@4.1.5: {} light-my-request@6.6.0: dependencies: @@ -5451,14 +5387,8 @@ snapshots: lines-and-columns@1.2.4: {} - lines-and-columns@2.0.4: {} - load-tsconfig@0.2.5: {} - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - lodash.sortby@4.7.0: {} longest-streak@3.1.0: {} @@ -5475,7 +5405,7 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 markdown-extensions@2.0.0: {} @@ -5494,7 +5424,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -5648,7 +5578,7 @@ snapshots: media-typer@1.1.0: {} - meow@12.1.1: {} + meow@13.2.0: {} merge-descriptors@2.0.0: {} @@ -5658,7 +5588,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -5735,7 +5665,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -5746,7 +5676,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -5763,7 +5693,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -5775,8 +5705,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -5799,7 +5729,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -5854,7 +5784,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -5863,7 +5793,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -5902,7 +5832,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.1 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -5941,18 +5871,19 @@ snapshots: mimic-fn@2.1.0: {} - miniflare@4.20250508.1: + miniflare@4.20250712.1: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 acorn-walk: 8.3.2 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 + sharp: 0.33.5 stoppable: 1.1.0 - undici: 5.29.0 - workerd: 1.20250508.0 + undici: 7.12.0 + workerd: 1.20250712.0 ws: 8.18.0 - youch: 3.3.4 + youch: 4.1.0-beta.10 zod: 3.22.3 transitivePeerDependencies: - bufferutil @@ -5960,18 +5891,23 @@ snapshots: minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} minipass@7.1.2: {} + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + mrmime@2.0.1: {} ms@2.1.3: {} - mustache@4.2.0: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -5990,11 +5926,11 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-mock-http@1.0.0: {} + node-mock-http@1.0.1: {} - normalize-package-data@6.0.2: + normalize-package-data@7.0.0: dependencies: - hosted-git-info: 7.0.2 + hosted-git-info: 8.1.0 semver: 7.7.2 validate-npm-package-license: 3.0.4 @@ -6025,27 +5961,6 @@ snapshots: openapi-types@12.1.3: optional: true - oxc-transform@0.64.0: - optionalDependencies: - '@oxc-transform/binding-darwin-arm64': 0.64.0 - '@oxc-transform/binding-darwin-x64': 0.64.0 - '@oxc-transform/binding-linux-arm-gnueabihf': 0.64.0 - '@oxc-transform/binding-linux-arm64-gnu': 0.64.0 - '@oxc-transform/binding-linux-arm64-musl': 0.64.0 - '@oxc-transform/binding-linux-x64-gnu': 0.64.0 - '@oxc-transform/binding-linux-x64-musl': 0.64.0 - '@oxc-transform/binding-wasm32-wasi': 0.64.0 - '@oxc-transform/binding-win32-arm64-msvc': 0.64.0 - '@oxc-transform/binding-win32-x64-msvc': 0.64.0 - - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.1 - - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - package-json-from-dist@1.0.1: {} parse-entities@4.0.2: @@ -6053,29 +5968,19 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@7.1.1: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.2 - lines-and-columns: 2.0.4 - type-fest: 3.13.1 - parse-numeric-range@1.3.0: {} parse5@7.3.0: dependencies: - entities: 6.0.0 + entities: 6.0.1 parseurl@1.3.3: {} - path-exists@5.0.0: {} - path-key@3.1.1: {} path-scurry@1.11.1: @@ -6091,11 +5996,9 @@ snapshots: pathval@1.1.1: {} - peek-readable@7.0.0: {} - periscopic@3.1.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 3.0.3 is-reference: 3.0.3 @@ -6103,7 +6006,7 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pino-abstract-transport@2.0.0: dependencies: @@ -6111,14 +6014,14 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.6.0: + pino@9.7.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.1 + process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 @@ -6131,35 +6034,39 @@ snapshots: dependencies: pngjs: 6.0.0 - playwright-chromium@1.52.0: + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + playwright-chromium@1.54.1: dependencies: - playwright-core: 1.52.0 + playwright-core: 1.54.1 - playwright-core@1.52.0: {} + playwright-core@1.54.1: {} - playwright@1.52.0: + playwright@1.54.1: dependencies: - playwright-core: 1.52.0 + playwright-core: 1.54.1 optionalDependencies: fsevents: 2.3.2 pngjs@6.0.0: {} - postcss-load-config@6.0.1(postcss@8.5.3): + postcss-load-config@6.0.1(postcss@8.5.6): dependencies: lilconfig: 3.1.3 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss@8.5.3: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.5.3: {} - - printable-characters@1.0.42: {} + prettier@3.6.2: {} process-warning@4.0.1: {} @@ -6203,19 +6110,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - read-pkg-up@10.1.0: - dependencies: - find-up: 6.3.0 - read-pkg: 8.1.0 - type-fest: 4.41.0 - - read-pkg@8.1.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 7.1.1 - type-fest: 4.41.0 - readdirp@4.1.2: {} real-require@0.2.0: {} @@ -6289,30 +6183,30 @@ snapshots: rfdc@1.4.1: {} - rollup@4.38.0: + rollup@4.45.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.38.0 - '@rollup/rollup-android-arm64': 4.38.0 - '@rollup/rollup-darwin-arm64': 4.38.0 - '@rollup/rollup-darwin-x64': 4.38.0 - '@rollup/rollup-freebsd-arm64': 4.38.0 - '@rollup/rollup-freebsd-x64': 4.38.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.38.0 - '@rollup/rollup-linux-arm-musleabihf': 4.38.0 - '@rollup/rollup-linux-arm64-gnu': 4.38.0 - '@rollup/rollup-linux-arm64-musl': 4.38.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.38.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.38.0 - '@rollup/rollup-linux-riscv64-gnu': 4.38.0 - '@rollup/rollup-linux-riscv64-musl': 4.38.0 - '@rollup/rollup-linux-s390x-gnu': 4.38.0 - '@rollup/rollup-linux-x64-gnu': 4.38.0 - '@rollup/rollup-linux-x64-musl': 4.38.0 - '@rollup/rollup-win32-arm64-msvc': 4.38.0 - '@rollup/rollup-win32-ia32-msvc': 4.38.0 - '@rollup/rollup-win32-x64-msvc': 4.38.0 + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 fsevents: 2.3.3 router@2.2.0: @@ -6363,7 +6257,7 @@ snapshots: ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -6405,7 +6299,6 @@ snapshots: '@img/sharp-wasm32': 0.33.5 '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - optional: true shebang-command@2.0.0: dependencies: @@ -6452,7 +6345,6 @@ snapshots: simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - optional: true sirv@3.0.1: dependencies: @@ -6497,13 +6389,10 @@ snapshots: split2@4.2.0: {} - stacktracey@2.1.8: - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - statuses@2.0.1: {} + statuses@2.0.2: {} + stoppable@1.1.0: {} streamsearch@1.1.0: {} @@ -6535,22 +6424,21 @@ snapshots: strip-final-newline@2.0.0: {} - strtok3@10.2.2: + strtok3@10.3.2: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 7.0.0 - style-to-js@1.1.16: + style-to-js@1.1.17: dependencies: - style-to-object: 1.0.8 + style-to-object: 1.0.9 - style-to-object@1.0.8: + style-to-object@1.0.9: dependencies: inline-style-parser: 0.2.4 sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.12 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -6558,7 +6446,7 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 - text-extensions@2.4.0: {} + supports-color@10.0.0: {} thenify-all@1.6.0: dependencies: @@ -6572,14 +6460,12 @@ snapshots: dependencies: real-require: 0.2.0 - through@2.3.8: {} - tinyexec@0.3.2: {} - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 tldts-core@6.1.86: {} @@ -6595,7 +6481,7 @@ snapshots: toidentifier@1.0.1: {} - token-types@6.0.0: + token-types@6.0.3: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 @@ -6618,31 +6504,34 @@ snapshots: trough@2.2.0: {} + ts-deepmerge@7.0.3: {} + ts-interface-checker@0.1.13: {} tslib@2.8.1: {} - tsup@8.4.0(@swc/core@1.11.24)(postcss@8.5.3)(typescript@5.8.3): + tsup@8.5.0(@swc/core@1.13.1)(postcss@8.5.6)(typescript@5.8.3): dependencies: - bundle-require: 5.1.0(esbuild@0.25.4) + bundle-require: 5.1.0(esbuild@0.25.8) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.1 - esbuild: 0.25.4 + esbuild: 0.25.8 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.3) + postcss-load-config: 6.0.1(postcss@8.5.6) resolve-from: 5.0.0 - rollup: 4.38.0 + rollup: 4.45.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.11.24 - postcss: 8.5.3 + '@swc/core': 1.13.1 + postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: - jiti @@ -6652,10 +6541,6 @@ snapshots: type-detect@4.1.0: {} - type-fest@3.13.1: {} - - type-fest@4.41.0: {} - type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -6673,16 +6558,14 @@ snapshots: uncrypto@0.1.3: {} - undici-types@6.19.8: {} + undici-types@6.21.0: {} - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 + undici@7.12.0: {} - unenv@2.0.0-rc.15: + unenv@2.0.0-rc.17: dependencies: defu: 6.1.4 - exsolve: 1.0.5 + exsolve: 1.0.7 ohash: 2.0.11 pathe: 2.0.3 ufo: 1.6.1 @@ -6726,10 +6609,10 @@ snapshots: unpipe@1.0.0: {} - unplugin@2.3.4: + unplugin@2.3.5: dependencies: - acorn: 8.14.1 - picomatch: 4.0.2 + acorn: 8.15.0 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 urlpattern-polyfill@10.1.0: {} @@ -6756,39 +6639,41 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vike@0.4.229(vite@6.3.5(@types/node@20.17.47)): + vike@0.4.236(vite@6.3.5(@types/node@20.19.9)): dependencies: '@brillout/import': 0.2.6 - '@brillout/json-serializer': 0.5.15 - '@brillout/picocolors': 1.0.26 + '@brillout/json-serializer': 0.5.16 + '@brillout/picocolors': 1.0.28 '@brillout/require-shim': 0.1.2 '@brillout/vite-plugin-server-entry': 0.7.9 - acorn: 8.14.1 + acorn: 8.15.0 cac: 6.7.14 es-module-lexer: 1.7.0 - esbuild: 0.25.4 + esbuild: 0.25.8 json5: 2.2.3 magic-string: 0.30.17 - picomatch: 4.0.2 + picomatch: 4.0.3 semver: 7.7.2 sirv: 3.0.1 source-map-support: 0.5.21 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 optionalDependencies: - vite: 6.3.5(@types/node@20.17.47) + vite: 6.3.5(@types/node@20.19.9) - vite@6.3.5(@types/node@20.17.47): + vite@6.3.5(@types/node@20.19.9): dependencies: - esbuild: 0.25.4 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.38.0 - tinyglobby: 0.2.13 + esbuild: 0.25.8 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.45.1 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 20.17.47 + '@types/node': 20.19.9 fsevents: 2.3.3 + walk-up-path@3.0.1: {} + web-namespaces@2.0.1: {} webidl-conversions@3.0.1: {} @@ -6814,28 +6699,27 @@ snapshots: wordwrap@1.0.0: {} - workerd@1.20250508.0: + workerd@1.20250712.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250508.0 - '@cloudflare/workerd-darwin-arm64': 1.20250508.0 - '@cloudflare/workerd-linux-64': 1.20250508.0 - '@cloudflare/workerd-linux-arm64': 1.20250508.0 - '@cloudflare/workerd-windows-64': 1.20250508.0 + '@cloudflare/workerd-darwin-64': 1.20250712.0 + '@cloudflare/workerd-darwin-arm64': 1.20250712.0 + '@cloudflare/workerd-linux-64': 1.20250712.0 + '@cloudflare/workerd-linux-arm64': 1.20250712.0 + '@cloudflare/workerd-windows-64': 1.20250712.0 - wrangler@4.15.1(@cloudflare/workers-types@4.20250515.0): + wrangler@4.25.1(@cloudflare/workers-types@4.20250722.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250508.0) + '@cloudflare/unenv-preset': 2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250712.0) blake3-wasm: 2.1.5 esbuild: 0.25.4 - miniflare: 4.20250508.1 + miniflare: 4.20250712.1 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.15 - workerd: 1.20250508.0 + unenv: 2.0.0-rc.17 + workerd: 1.20250712.0 optionalDependencies: - '@cloudflare/workers-types': 4.20250515.0 + '@cloudflare/workers-types': 4.20250722.0 fsevents: 2.3.3 - sharp: 0.33.5 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -6856,14 +6740,21 @@ snapshots: ws@8.18.0: {} - yocto-queue@1.2.1: {} + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 - youch@3.3.4: + youch@4.1.0-beta.10: dependencies: - cookie: 0.7.2 - mustache: 4.2.0 - stacktracey: 2.1.8 + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 zod@3.22.3: {} + zod@3.25.76: {} + zwitch@2.0.4: {} diff --git a/tests/app/package.json b/tests/app/package.json index f60b2f4..1fc69a0 100644 --- a/tests/app/package.json +++ b/tests/app/package.json @@ -16,7 +16,7 @@ "@types/node": "^20.17.32", "typescript": "^5.8.3", "vite": "^6.3.5", - "wrangler": "^4.15.1" + "wrangler": "^4.19.1" }, "dependencies": { "awesome-framework": "workspace:", diff --git a/tests/app/public/logo.svg b/tests/app/public/logo.svg new file mode 100644 index 0000000..d3c7ccf --- /dev/null +++ b/tests/app/public/logo.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/app/src/entry-client.ts b/tests/app/src/entry-client.ts index 0d5a198..4a8ac99 100644 --- a/tests/app/src/entry-client.ts +++ b/tests/app/src/entry-client.ts @@ -2,3 +2,14 @@ import './style.css' import { setupCounter } from './counter.js' setupCounter(document.querySelector('#counter') as HTMLButtonElement) + +// Dynamically append Photon logo +const img = document.createElement('img') +img.src = '/logo.svg' +img.alt = 'Photon logo' +img.className = 'logo' + +// biome-ignore lint/style/noNonNullAssertion: +const h1 = document.querySelector('h1')! + +h1.parentNode?.insertBefore(img, h1) diff --git a/tests/app/tests/bun/dev-hono-bun.test-skip.ts b/tests/app/tests/bun/dev-hono-bun.test-skip.ts new file mode 100644 index 0000000..b04fb02 --- /dev/null +++ b/tests/app/tests/bun/dev-hono-bun.test-skip.ts @@ -0,0 +1,7 @@ +import { testRun } from '../testRun.js' + +process.env.TARGET = 'bun' +process.env.SERVER = 'hono' + +// Blocked by https://github.com/oven-sh/bun/issues/19111 +testRun('bun --bun --silent run dev') diff --git a/tests/app/tests/non-photon-entry/preview-non-photon-entry.test.ts b/tests/app/tests/non-photon-entry/preview-non-photon-entry.skip-test.ts similarity index 71% rename from tests/app/tests/non-photon-entry/preview-non-photon-entry.test.ts rename to tests/app/tests/non-photon-entry/preview-non-photon-entry.skip-test.ts index eb2536e..2e3f747 100644 --- a/tests/app/tests/non-photon-entry/preview-non-photon-entry.test.ts +++ b/tests/app/tests/non-photon-entry/preview-non-photon-entry.skip-test.ts @@ -3,4 +3,5 @@ import { runCommandThatThrows } from '../utils.js' process.env.TARGET = 'node' process.env.SERVER = 'tests/non-photon-entry/express' +// TODO update code then this test so that during build, missing { apply } import crashes await runCommandThatThrows('pnpm run preview', 'Cannot guess', 'server type. Make sure to use') diff --git a/tests/app/tests/testRun.ts b/tests/app/tests/testRun.ts index 3575ca7..9059323 100644 --- a/tests/app/tests/testRun.ts +++ b/tests/app/tests/testRun.ts @@ -3,7 +3,7 @@ import { autoRetry, expect, expectLog, fetchHtml, getServerUrl, page, run, test export { testRun, testRunUnsupported } -function testRun(cmd: `pnpm run ${string}`) { +function testRun(cmd: `pnpm run ${string}` | `bun --bun --silent run ${string}`) { run(cmd, { // Preview => builds app which takes a long time additionalTimeout: 120 * 1000, @@ -20,6 +20,11 @@ function testRun(cmd: `pnpm run ${string}`) { expect(await page.textContent('h1')).toBe('Hello Vite!') await testCounter() }) + + test('framework standalone handler is rendered', async () => { + const text = await fetchHtml('/standalone') + expect(text).toContain('standalone') + }) } async function testRunUnsupported(cmd: `pnpm run ${string}`) { @@ -36,7 +41,8 @@ async function testRunUnsupported(cmd: `pnpm run ${string}`) { test('page crashes with error message', async () => { await fetchHtml('/') - expectLog(error) + expectLog('Internal server error', { allLogs: true }) + expectLog(error, { allLogs: true }) }) } } diff --git a/tests/app/vite.config.ts b/tests/app/vite.config.ts index fa1af46..59b0de7 100644 --- a/tests/app/vite.config.ts +++ b/tests/app/vite.config.ts @@ -1,4 +1,3 @@ -/// /* The Vite plugin cloudflare() will be replaced by this: import cloudflare from '@photonjs/cloudflare' */