diff --git a/benchmark/config/eslint/next.js b/benchmark/config/eslint/next.js index 4edb4e3908..9406b01f21 100644 --- a/benchmark/config/eslint/next.js +++ b/benchmark/config/eslint/next.js @@ -5,6 +5,7 @@ import pluginReactHooks from "eslint-plugin-react-hooks" import pluginReact from "eslint-plugin-react" import globals from "globals" import pluginNext from "@next/eslint-plugin-next" + import { config as baseConfig } from "./base.js" /** diff --git a/benchmark/config/typescript/cjs.json b/benchmark/config/typescript/cjs.json new file mode 100644 index 0000000000..8895492be7 --- /dev/null +++ b/benchmark/config/typescript/cjs.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "module": "CommonJS", + "moduleResolution": "Node", + "esModuleInterop": true, + "target": "ES2022", + "lib": ["ES2022", "ESNext.Disposable", "DOM"], + "sourceMap": true, + "strict": true, + "skipLibCheck": true, + "useUnknownInCatchVariables": false + } +} diff --git a/benchmark/package.json b/benchmark/package.json index 37c0e47198..4578596e38 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -5,6 +5,9 @@ "lint": "turbo lint", "check-types": "turbo check-types", "format": "turbo format", + "build": "turbo build", + "build:extension": "cd .. && npm run vscode-test", + "build:runner": "turbo build --filter @benchmark/runner", "cli": "pnpm --filter @benchmark/cli dev", "web": "pnpm --filter @benchmark/web dev" }, @@ -15,6 +18,7 @@ "globals": "^16.0.0", "prettier": "^3.5.3", "rimraf": "^6.0.1", + "tsup": "^8.4.0", "tsx": "^4.19.3", "turbo": "^2.4.4", "typescript": "^5", diff --git a/benchmark/packages/cli/package.json b/benchmark/packages/cli/package.json index 762e1db67c..0755acfb02 100644 --- a/benchmark/packages/cli/package.json +++ b/benchmark/packages/cli/package.json @@ -8,7 +8,6 @@ "lint": "eslint src --ext ts --max-warnings=0", "check-types": "tsc --noEmit", "format": "prettier --write src", - "build": "pnpm --filter @benchmark/client build", "dev": "dotenvx run -f ../../.env -- tsx src/index.ts" }, "dependencies": { diff --git a/benchmark/packages/cli/src/index.ts b/benchmark/packages/cli/src/index.ts index c09f95e8ce..6e7ca320c9 100644 --- a/benchmark/packages/cli/src/index.ts +++ b/benchmark/packages/cli/src/index.ts @@ -10,7 +10,7 @@ import { type Language, languages, type Run, findRun, createRun, getTask } from const __dirname = path.dirname(fileURLToPath(import.meta.url)) const extensionDevelopmentPath = path.resolve(__dirname, "../../../..") -const extensionTestsPath = path.resolve(extensionDevelopmentPath, "benchmark/packages/runner/dist/run.js") +const extensionTestsPath = path.resolve(extensionDevelopmentPath, "benchmark/packages/runner/dist") const exercisesPath = path.resolve(extensionDevelopmentPath, "benchmark/exercises") export const isLanguage = (language: string): language is Language => languages.includes(language as Language) diff --git a/benchmark/packages/db/package.json b/benchmark/packages/db/package.json index 7550b0aede..f855b6c888 100644 --- a/benchmark/packages/db/package.json +++ b/benchmark/packages/db/package.json @@ -5,7 +5,10 @@ "type": "module", "packageManager": "pnpm@10.6.5", "exports": { - ".": "./src/index.ts" + ".": { + "import": "./src/index.ts", + "require": "./dist/index.cjs" + } }, "scripts": { "lint": "eslint src --ext ts --max-warnings=0", diff --git a/benchmark/packages/ipc/package.json b/benchmark/packages/ipc/package.json index fdb697e2ca..a2e5a4f718 100644 --- a/benchmark/packages/ipc/package.json +++ b/benchmark/packages/ipc/package.json @@ -4,10 +4,17 @@ "private": true, "type": "module", "packageManager": "pnpm@10.6.5", + "exports": { + ".": { + "import": "./src/index.ts", + "require": "./dist/index.cjs" + } + }, "scripts": { "lint": "eslint src --ext ts --max-warnings=0", "check-types": "tsc --noEmit", "format": "prettier --write src", + "build": "tsup", "test:server": "tsx scripts/server.ts", "test:client": "tsx scripts/client.ts" }, diff --git a/benchmark/packages/ipc/scripts/client.ts b/benchmark/packages/ipc/scripts/client.ts index 5893953aff..f5c06b1594 100644 --- a/benchmark/packages/ipc/scripts/client.ts +++ b/benchmark/packages/ipc/scripts/client.ts @@ -4,7 +4,6 @@ async function main(socketPath: string) { try { const startTime = Date.now() const client = new IpcClient(socketPath) - client.connect() while (!client.isConnected) { if (Date.now() - startTime > 5000) { diff --git a/benchmark/packages/ipc/scripts/server.ts b/benchmark/packages/ipc/scripts/server.ts index e6a59ec281..ef264228da 100644 --- a/benchmark/packages/ipc/scripts/server.ts +++ b/benchmark/packages/ipc/scripts/server.ts @@ -1,12 +1,14 @@ import { IpcServer } from "../src/ipcServer" +import { ServerMessageType } from "../src/types" -async function main() { +async function main(socketPath: string) { try { - const server = new IpcServer() + const server = new IpcServer(socketPath) server.listen() console.log(`listening @ ${server.socketPath}`) while (server.isListening) { + server.broadcast({ type: ServerMessageType.Message, data: { message: "hello" } }) await new Promise((resolve) => setTimeout(resolve, 1000)) } @@ -17,4 +19,9 @@ async function main() { } } -main() +if (!process.argv[2]) { + console.error("Usage: npx tsx scripts/client.ts ") + process.exit(1) +} + +main(process.argv[2]) diff --git a/benchmark/packages/ipc/src/index.ts b/benchmark/packages/ipc/src/index.ts new file mode 100644 index 0000000000..e9eb2bb9af --- /dev/null +++ b/benchmark/packages/ipc/src/index.ts @@ -0,0 +1,4 @@ +export { IpcClient } from "./ipcClient.js" +export { IpcServer } from "./ipcServer.js" + +export * from "./types.js" diff --git a/benchmark/packages/ipc/src/ipcClient.ts b/benchmark/packages/ipc/src/ipcClient.ts index 04c9b76a63..058477e9b1 100644 --- a/benchmark/packages/ipc/src/ipcClient.ts +++ b/benchmark/packages/ipc/src/ipcClient.ts @@ -1,17 +1,27 @@ +import EventEmitter from "node:events" import ipc from "node-ipc" -import { ClientMessage, ClientMessageType, ServerMessageType, serverMessageSchema } from "./types.js" +import { ClientMessage, ClientMessageType, ServerMessage, ServerMessageType, serverMessageSchema } from "./types.js" -export class IpcClient { +export interface IpcClientEvents { + connect: [] + message: [data: ServerMessage] + disconnect: [] +} + +export class IpcClient extends EventEmitter { private readonly _socketPath: string + private readonly _log: (...args: unknown[]) => void + private _isConnected = false private _clientId?: string - constructor(socketPath: string) { - this._socketPath = socketPath - } + constructor(socketPath: string, log = console.log) { + super() + + this._socketPath = socketPath + this._log = log - connect() { ipc.config.silent = true ipc.connectTo("benchmarkServer", this.socketPath, () => { @@ -22,20 +32,25 @@ export class IpcClient { } private onConnect(args: unknown) { - console.log("[client#onConnect]", args) + if (this._isConnected) { + return + } + + this.log("[client#onConnect]", args) this._isConnected = true + this.emit("connect") } private onMessage(data: unknown) { if (typeof data !== "object") { - console.log("[client#onMessage] invalid data", data) + this._log("[client#onMessage] invalid data", data) return } const result = serverMessageSchema.safeParse(data) if (!result.success) { - console.log("[client#onMessage] invalid payload", result.error) + this.log("[client#onMessage] invalid payload", result.error) return } @@ -43,24 +58,35 @@ export class IpcClient { switch (payload.type) { case ServerMessageType.Hello: - console.log(`[client#Hello] ${payload.data.clientId}`) + this.log(`[client#Hello] ${payload.data.clientId}`) this._clientId = payload.data.clientId break case ServerMessageType.Pong: - console.log(`[client#Pong]`) + this.log(`[client#Pong]`) break } + + this.emit("message", payload) } private onDisconnect(args: unknown) { - console.log("[client#onDisconnect]", args) + if (!this._isConnected) { + return + } + + this.log("[client#onDisconnect]", args) this._isConnected = false + this.emit("disconnect") } public sendMessage(message: ClientMessage) { ipc.of.benchmarkServer?.emit("message", message) } + private log(...args: unknown[]) { + this._log(...args) + } + public ping() { if (!this.isReady) { return false @@ -70,6 +96,15 @@ export class IpcClient { return true } + public disconnect() { + try { + ipc.disconnect("benchmarkServer") + // @TODO: Should we set _disconnect here? + } catch (error) { + this.log("[client#disconnect] error disconnecting", error) + } + } + public get socketPath() { return this._socketPath } diff --git a/benchmark/packages/ipc/src/ipcServer.ts b/benchmark/packages/ipc/src/ipcServer.ts index 0defba5676..326c675d51 100644 --- a/benchmark/packages/ipc/src/ipcServer.ts +++ b/benchmark/packages/ipc/src/ipcServer.ts @@ -1,31 +1,32 @@ import { Socket } from "node:net" -import ipc from "node-ipc" -import * as os from "node:os" -import * as path from "node:path" import * as crypto from "node:crypto" +import ipc from "node-ipc" + import { ClientMessageType, ServerMessage, ServerMessageType, clientMessageSchema } from "./types.js" export class IpcServer { - private _isListening = false - private _socketId: string - private _clients: Map + private readonly _socketPath: string + private readonly _log: (...args: unknown[]) => void + private readonly _clients: Map - constructor() { - this._socketId = "benchmark" + private _isListening = false + + constructor(socketPath: string, log = console.log) { + this._socketPath = socketPath + this._log = log this._clients = new Map() } public listen() { this._isListening = true - ipc.config.id = this._socketId ipc.config.silent = true ipc.serve(this.socketPath, () => { ipc.server.on("connect", (socket) => this.onConnect(socket)) ipc.server.on("message", (data, socket) => this.onMessage(data, socket)) - ipc.server.on("socket.disconnected", (socket, id) => this.onDisconnect(socket, id)) + ipc.server.on("socket.disconnected", (socket) => this.onDisconnect(socket)) }) ipc.server.start() @@ -33,21 +34,21 @@ export class IpcServer { private onConnect(socket: Socket) { const clientId = crypto.randomBytes(6).toString("hex") - console.log(`[server#onConnect]`, clientId) this._clients.set(clientId, socket) - this.sendMessage(socket, { type: ServerMessageType.Hello, data: { clientId } }) + this.log(`[server#onConnect] clientId = ${clientId}, # clients = ${this._clients.size}`) + this.send(socket, { type: ServerMessageType.Hello, data: { clientId } }) } private onMessage(data: unknown, socket: Socket) { if (typeof data !== "object") { - console.log("[server#onMessage] invalid data", data) + this.log("[server#onMessage] invalid data", data) return } const result = clientMessageSchema.safeParse(data) if (!result.success) { - console.log("[server#onMessage] invalid payload", result.error) + this.log("[server#onMessage] invalid payload", result.error) return } @@ -55,25 +56,45 @@ export class IpcServer { switch (payload.type) { case ClientMessageType.Message: - console.log(`[server#Message] ${payload.data.message}`) + this.log(`[server#Message] ${payload.data.message}`) break case ClientMessageType.Ping: - console.log(`[server#Ping]`) - this.sendMessage(socket, { type: ServerMessageType.Pong }) + this.log(`[server#Ping]`) + this.send(socket, { type: ServerMessageType.Pong }) break } } - private onDisconnect(socket: Socket, destroyedSocketID: string) { - console.log(`[server#socket.disconnected] ${destroyedSocketID}`) + private onDisconnect(destroyedSocket: Socket) { + let destroyedClientId: string | undefined + + for (const [clientId, socket] of this._clients.entries()) { + if (socket === destroyedSocket) { + destroyedClientId = clientId + this._clients.delete(clientId) + break + } + } + + this.log(`[server#socket.disconnected] clientId = ${destroyedClientId}, # clients = ${this._clients.size}`) } - public sendMessage(socket: Socket, message: ServerMessage) { + private log(...args: unknown[]) { + this._log(...args) + } + + public broadcast(message: ServerMessage) { + this.log("[server#broadcast] message =", message) + ipc.server.broadcast("message", message) + } + + public send(socket: Socket, message: ServerMessage) { + this.log("[server#send] message =", message) ipc.server.emit(socket, "message", message) } public get socketPath() { - return path.join(os.tmpdir(), `${this._socketId}.sock`) + return this._socketPath } public get isListening() { diff --git a/benchmark/packages/ipc/src/types.ts b/benchmark/packages/ipc/src/types.ts index 42b935bb16..06459b16b1 100644 --- a/benchmark/packages/ipc/src/types.ts +++ b/benchmark/packages/ipc/src/types.ts @@ -5,8 +5,8 @@ import { z } from "zod" */ export enum ClientMessageType { - Message = "message", Ping = "ping", + Message = "message", } export const clientMessageSchema = z.discriminatedUnion("type", [ @@ -34,6 +34,8 @@ export type ClientMessage = z.infer export enum ServerMessageType { Hello = "hello", Pong = "pong", + Message = "message", + Data = "data", } export const serverMessageSchema = z.discriminatedUnion("type", [ @@ -46,6 +48,16 @@ export const serverMessageSchema = z.discriminatedUnion("type", [ z.object({ type: z.literal(ServerMessageType.Pong), }), + z.object({ + type: z.literal(ServerMessageType.Message), + data: z.object({ + message: z.string(), + }), + }), + z.object({ + type: z.literal(ServerMessageType.Data), + data: z.unknown(), + }), ]) export type ServerMessage = z.infer diff --git a/benchmark/packages/ipc/tsconfig.cjs.json b/benchmark/packages/ipc/tsconfig.cjs.json new file mode 100644 index 0000000000..042a9ebec5 --- /dev/null +++ b/benchmark/packages/ipc/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "@benchmark/typescript-config/cjs.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/benchmark/packages/ipc/tsup.config.ts b/benchmark/packages/ipc/tsup.config.ts new file mode 100644 index 0000000000..38c6e1314e --- /dev/null +++ b/benchmark/packages/ipc/tsup.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "tsup" + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["cjs"], + dts: true, + sourcemap: true, + clean: true, + outExtension: ({ format }) => ({ js: format === "cjs" ? ".cjs" : ".js" }), + tsconfig: "tsconfig.cjs.json", + noExternal: ["node-ipc", "zod"], +}) diff --git a/benchmark/packages/runner/README.md b/benchmark/packages/runner/README.md new file mode 100644 index 0000000000..8c747e9572 --- /dev/null +++ b/benchmark/packages/runner/README.md @@ -0,0 +1,27 @@ +# Extension Runner + +VS Code provides two CLI parameters for running extension tests, `--extensionDevelopmentPath` and `--extensionTestsPath`. + +For example: + +```sh +# - Launches VS Code Extension Host +# - Loads the extension at +# - Executes the test runner script at +code \ + --extensionDevelopmentPath= \ + --extensionTestsPath= +``` + +If you make extension code changes then you need to re-build it so that `extensionDevelopmentPath` has the latest version transpiled: + +```sh +# From the repository root: +pnpm build:extension +``` + +If you make changes to `@benchmark/runner` or any of its dependencies then you should rebuild it: + +```sh +pnpm build:runner +``` diff --git a/benchmark/packages/runner/package.json b/benchmark/packages/runner/package.json index e63845fa2a..27efe78000 100644 --- a/benchmark/packages/runner/package.json +++ b/benchmark/packages/runner/package.json @@ -7,11 +7,14 @@ "lint": "eslint src --ext ts --max-warnings=0", "check-types": "tsc --noEmit", "format": "prettier --write src", - "build": "rimraf dist && tsc", - "vscode-test": "pnpm build && cd ../../.. && npm run vscode-test" + "build": "tsup" + }, + "dependencies": { + "@benchmark/ipc": "workspace:^" }, "devDependencies": { "@benchmark/eslint-config": "workspace:^", + "@benchmark/typescript-config": "workspace:^", "@types/vscode": "^1.98.0" } } diff --git a/benchmark/packages/runner/src/run.ts b/benchmark/packages/runner/src/index.ts similarity index 68% rename from benchmark/packages/runner/src/run.ts rename to benchmark/packages/runner/src/index.ts index 1c9b1e9e1b..1c4c153072 100644 --- a/benchmark/packages/runner/src/run.ts +++ b/benchmark/packages/runner/src/index.ts @@ -3,9 +3,12 @@ import * as path from "path" import * as vscode from "vscode" -import { RooCodeAPI, TokenUsage } from "../../../../src/exports/roo-code" +import { RooCodeAPI } from "../../../../src/exports/roo-code.js" -import { waitUntilReady, waitUntilCompleted, sleep } from "./utils" +// eslint-disable-next-line @typescript-eslint/no-require-imports +const { IpcServer, ServerMessageType } = require("@benchmark/ipc") + +import { waitUntilReady, waitUntilCompleted, sleep } from "./utils.js" export async function run() { /** @@ -70,7 +73,38 @@ export async function run() { .getConfiguration("roo-cline") .update("allowedCommands", ["*"], vscode.ConfigurationTarget.Global) - await sleep(2_000) + await sleep(1_000) + + /** + * Start the IPC server. + */ + + const server = new IpcServer(`/tmp/benchmark-${runId}.sock`) + server.listen() + + api.on("message", (message) => { + server.broadcast({ type: ServerMessageType.Data, data: message }) + }) + + api.on("taskStarted", (taskId) => { + server.broadcast({ type: ServerMessageType.Data, data: { taskId } }) + }) + + api.on("taskPaused", (taskId) => { + server.broadcast({ type: ServerMessageType.Data, data: { taskId } }) + }) + + api.on("taskUnpaused", (taskId) => { + server.broadcast({ type: ServerMessageType.Data, data: { taskId } }) + }) + + api.on("taskAskResponded", (taskId) => { + server.broadcast({ type: ServerMessageType.Data, data: { taskId } }) + }) + + api.on("taskTokenUsageUpdated", (taskId, usage) => { + server.broadcast({ type: ServerMessageType.Data, data: { taskId, usage } }) + }) /** * Run the task and wait up to 10 minutes for it to complete. @@ -78,8 +112,7 @@ export async function run() { const startTime = Date.now() const taskId = await api.startNewTask(prompt) - - let usage: TokenUsage | undefined = undefined + let usage try { usage = await waitUntilCompleted({ api, taskId, timeout: 5 * 60 * 1_000 }) // 5m diff --git a/benchmark/packages/runner/src/utils.ts b/benchmark/packages/runner/src/utils.ts index 96642bda0a..0d15733b43 100644 --- a/benchmark/packages/runner/src/utils.ts +++ b/benchmark/packages/runner/src/utils.ts @@ -1,6 +1,6 @@ import * as vscode from "vscode" -import { RooCodeAPI, TokenUsage } from "../../../../src/exports/roo-code" +import { RooCodeAPI, TokenUsage } from "../../../../src/exports/roo-code.js" type WaitForOptions = { timeout?: number diff --git a/benchmark/packages/runner/tsconfig.json b/benchmark/packages/runner/tsconfig.json index 1cba37f505..25c401876b 100644 --- a/benchmark/packages/runner/tsconfig.json +++ b/benchmark/packages/runner/tsconfig.json @@ -1,15 +1,8 @@ { + "extends": "@benchmark/typescript-config/base.json", "compilerOptions": { - "module": "CommonJS", - "moduleResolution": "Node", - "esModuleInterop": true, - "target": "ES2022", - "lib": ["ES2022", "ESNext.Disposable", "DOM"], - "sourceMap": true, - "strict": true, - "skipLibCheck": true, - "useUnknownInCatchVariables": false, "outDir": "dist" }, - "include": ["src", "../../../../src/exports/roo-code.d.ts"] + "include": ["src"], + "exclude": ["node_modules"] } diff --git a/benchmark/packages/runner/tsup.config.ts b/benchmark/packages/runner/tsup.config.ts new file mode 100644 index 0000000000..599d3c13cc --- /dev/null +++ b/benchmark/packages/runner/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup" + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["cjs"], + dts: true, + sourcemap: true, + clean: true, + tsconfig: "tsconfig.json", + external: ["vscode"], +}) diff --git a/benchmark/packages/web/eslint.config.mjs b/benchmark/packages/web/eslint.config.mjs index be8d6b75f2..7a2b38d52e 100644 --- a/benchmark/packages/web/eslint.config.mjs +++ b/benchmark/packages/web/eslint.config.mjs @@ -1,4 +1,17 @@ import { nextJsConfig } from "@benchmark/eslint-config/next-js" /** @type {import("eslint").Linter.Config} */ -export default [...nextJsConfig] +export default [ + ...nextJsConfig, + { + rules: { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + caughtErrorsIgnorePattern: "^_", + }, + ], + }, + }, +] diff --git a/benchmark/packages/web/package.json b/benchmark/packages/web/package.json index 4fecd92b0e..e765d059d8 100644 --- a/benchmark/packages/web/package.json +++ b/benchmark/packages/web/package.json @@ -4,15 +4,16 @@ "private": true, "packageManager": "pnpm@10.6.5", "scripts": { - "dev": "dotenvx run -f ../../.env -- next dev --turbopack", - "build": "next build", - "start": "next start", "lint": "next lint", "check-types": "tsc -b", + "dev": "dotenvx run -f ../../.env -- next dev --turbopack", + "build": "echo 'NOP' || next build", + "start": "next start", "format": "prettier --write src" }, "dependencies": { "@benchmark/db": "workspace:^", + "@benchmark/ipc": "workspace:^", "@hookform/resolvers": "^4.1.3", "@radix-ui/react-label": "^2.1.2", "@radix-ui/react-select": "^2.1.6", diff --git a/benchmark/packages/web/src/app/api/runs/[id]/stream/route.ts b/benchmark/packages/web/src/app/api/runs/[id]/stream/route.ts new file mode 100644 index 0000000000..e94b457e45 --- /dev/null +++ b/benchmark/packages/web/src/app/api/runs/[id]/stream/route.ts @@ -0,0 +1,35 @@ +import type { NextRequest } from "next/server" + +import { findRun } from "@benchmark/db" +import { IpcClient } from "@benchmark/ipc" + +import { SSEStream } from "@/lib/server/sse-stream" + +export const dynamic = "force-dynamic" + +export async function GET(request: NextRequest, { params }: { params: Promise<{ id: string }> }) { + const { id } = await params + const stream = new SSEStream() + const run = await findRun(Number(id)) + const client = new IpcClient(`/tmp/benchmark-${run.id}.sock`, () => {}) + + const write = async (data: string | object) => { + const success = await stream.write(data) + + if (!success) { + client.disconnect() + } + } + + client.on("connect", () => write("connect")) + client.on("disconnect", () => write("disconnect")) + client.on("message", write) + + request.signal.addEventListener("abort", () => { + console.log(`abort`) + client.disconnect() + stream.close().catch(() => {}) + }) + + return stream.getResponse() +} diff --git a/benchmark/packages/web/src/app/runs/[id]/page.tsx b/benchmark/packages/web/src/app/runs/[id]/page.tsx index 88e145e18e..09d6e3f9c8 100644 --- a/benchmark/packages/web/src/app/runs/[id]/page.tsx +++ b/benchmark/packages/web/src/app/runs/[id]/page.tsx @@ -1,5 +1,14 @@ +import { findRun } from "@benchmark/db" + import { ShowRun } from "./show-run" -export default async function Page() { - return +export default async function Page({ params }: { params: Promise<{ id: string }> }) { + const { id } = await params + const run = await findRun(Number(id)) + + if (!run) { + return
Run not found
+ } + + return } diff --git a/benchmark/packages/web/src/app/runs/[id]/show-run.tsx b/benchmark/packages/web/src/app/runs/[id]/show-run.tsx index cb2486ce3d..4ac0b2c6d0 100644 --- a/benchmark/packages/web/src/app/runs/[id]/show-run.tsx +++ b/benchmark/packages/web/src/app/runs/[id]/show-run.tsx @@ -1,3 +1,18 @@ -export async function ShowRun() { - return
Show Run
+"use client" + +import { useCallback } from "react" + +import { Run } from "@benchmark/db" + +import { useEventSource } from "@/hooks/use-event-source" + +export function ShowRun({ run }: { run: Run }) { + const url = `/api/runs/${run.id}/stream` + const onMessage = useCallback(({ data }: MessageEvent) => console.log(data), []) + const status = useEventSource({ url, onMessage }) + return ( +
+ Show Run: {run.id} | {status} +
+ ) } diff --git a/benchmark/packages/web/src/hooks/use-event-source.ts b/benchmark/packages/web/src/hooks/use-event-source.ts new file mode 100644 index 0000000000..7a435a57ec --- /dev/null +++ b/benchmark/packages/web/src/hooks/use-event-source.ts @@ -0,0 +1,63 @@ +import { useCallback, useEffect, useRef, useState } from "react" + +export type EventSourceStatus = "init" | "open" | "error" + +export type EventSourceEvent = Event & { data: string } + +type UseEventSourceOptions = { + url: string + withCredentials?: boolean + onMessage: (event: MessageEvent) => void +} + +export function useEventSource({ url, withCredentials, onMessage }: UseEventSourceOptions) { + const sourceRef = useRef(null) + const statusRef = useRef("init") + const [status, setStatus] = useState("init") + const handleMessage = useCallback((event: MessageEvent) => onMessage(event), [onMessage]) + + const createEventSource = useCallback(() => { + console.log("connecting") + sourceRef.current = new EventSource(url, { withCredentials }) + + sourceRef.current.onopen = (event) => { + console.log("onopen", event) + statusRef.current = "open" + setStatus("open") + } + + sourceRef.current.onmessage = (event) => { + // console.log("onmessage", event) + handleMessage(event) + } + + sourceRef.current.onerror = (event) => { + console.log("onerror", event) + statusRef.current = "error" + setStatus("error") + // sourceRef.current?.close() + // sourceRef.current = null + } + }, [url, withCredentials, handleMessage]) + + useEffect(() => { + createEventSource() + + setTimeout(() => { + if (statusRef.current === "init") { + console.log("timeout -> close") + sourceRef.current?.close() + sourceRef.current = null + createEventSource() + } + }, 100) + + return () => { + console.log("unmounting -> close") + sourceRef.current?.close() + sourceRef.current = null + } + }, [createEventSource]) + + return status +} diff --git a/benchmark/packages/web/src/lib/server/sse-stream.ts b/benchmark/packages/web/src/lib/server/sse-stream.ts new file mode 100644 index 0000000000..acfc425fa2 --- /dev/null +++ b/benchmark/packages/web/src/lib/server/sse-stream.ts @@ -0,0 +1,37 @@ +export class SSEStream { + private readonly _stream: TransformStream + private readonly _writer: WritableStreamDefaultWriter + private readonly _encoder: TextEncoder + + constructor() { + this._stream = new TransformStream() + this._writer = this._stream.writable.getWriter() + this._encoder = new TextEncoder() + } + + public async write(data: string | object) { + try { + const buffer = typeof data === "object" ? JSON.stringify(data) : data + await this._writer.write(this._encoder.encode(`data: ${buffer}\n\n`)) + return true + } catch (error) { + console.error("[SSEStream#write]", error) + this.close().catch(() => {}) + return false + } + } + + public close() { + return this._writer.close() + } + + public getResponse() { + return new Response(this._stream.readable, { + headers: { + "Content-Type": "text/event-stream", + Connection: "keep-alive", + "Cache-Control": "no-cache, no-transform", + }, + }) + } +} diff --git a/benchmark/pnpm-lock.yaml b/benchmark/pnpm-lock.yaml index e3ecb48981..ce58e5ebc9 100644 --- a/benchmark/pnpm-lock.yaml +++ b/benchmark/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: rimraf: specifier: ^6.0.1 version: 6.0.1 + tsup: + specifier: ^8.4.0 + version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2) tsx: specifier: ^4.19.3 version: 4.19.3 @@ -149,10 +152,20 @@ importers: version: 9.2.3 packages/runner: + dependencies: + '@benchmark/ipc': + specifier: workspace:^ + version: link:../ipc + node-ipc: + specifier: ^12.0.0 + version: 12.0.0 devDependencies: '@benchmark/eslint-config': specifier: workspace:^ version: link:../../config/eslint + '@benchmark/typescript-config': + specifier: workspace:^ + version: link:../../config/typescript '@types/vscode': specifier: ^1.98.0 version: 1.98.0 @@ -162,6 +175,9 @@ importers: '@benchmark/db': specifier: workspace:^ version: link:../db + '@benchmark/ipc': + specifier: workspace:^ + version: link:../ipc '@hookform/resolvers': specifier: ^4.1.3 version: 4.1.3(react-hook-form@7.54.2(react@19.0.0)) @@ -875,6 +891,24 @@ 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/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/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@libsql/client@0.14.0': resolution: {integrity: sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==} @@ -1045,6 +1079,10 @@ packages: '@petamoriken/float16@3.9.2': resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -1301,6 +1339,101 @@ packages: '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@rollup/rollup-android-arm-eabi@4.36.0': + resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.36.0': + resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.36.0': + resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.36.0': + resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.36.0': + resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.36.0': + resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.36.0': + resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.36.0': + resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.36.0': + resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.36.0': + resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.36.0': + resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.36.0': + resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.36.0': + resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.36.0': + resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} + cpu: [x64] + os: [win32] + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -1519,6 +1652,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + apisauce@2.1.6: resolution: {integrity: sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg==} @@ -1599,10 +1735,20 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1634,6 +1780,10 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -1695,9 +1845,17 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + copyfiles@2.4.1: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true @@ -2203,6 +2361,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@11.0.1: resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} engines: {node: 20 || >=22} @@ -2452,6 +2614,9 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.1.0: resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} engines: {node: 20 || >=22} @@ -2465,6 +2630,10 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -2511,12 +2680,10 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] libsql@0.5.1: resolution: {integrity: sha512-ePnm5zj6T//GKiTY/v5b0a272NX73hqdRORmD8gzz1nUui9051dtTt6t0XCrIqxwJAHSmQiZcfAx3YSASn9Y+A==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lie@3.3.0: @@ -2586,9 +2753,17 @@ packages: resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2623,6 +2798,9 @@ packages: lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -2653,6 +2831,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.2: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} @@ -2712,6 +2893,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2862,6 +3046,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -2881,6 +3069,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -2889,6 +3081,24 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -2980,6 +3190,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -2996,6 +3210,10 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -3025,6 +3243,11 @@ packages: engines: {node: 20 || >=22} hasBin: true + rollup@4.36.0: + resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3131,6 +3354,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3220,6 +3447,11 @@ packages: babel-plugin-macros: optional: true + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3247,22 +3479,65 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + ts-api-utils@2.0.1: resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' + 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==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tsx@4.19.3: resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} engines: {node: '>=18.0.0'} @@ -3378,6 +3653,12 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -3883,6 +4164,23 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@libsql/client@0.14.0': dependencies: '@libsql/core': 0.14.0 @@ -4014,6 +4312,9 @@ snapshots: '@petamoriken/float16@3.9.2': {} + '@pkgjs/parseargs@0.11.0': + optional: true + '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.1': {} @@ -4233,6 +4534,63 @@ snapshots: '@radix-ui/rect@1.1.0': {} + '@rollup/rollup-android-arm-eabi@4.36.0': + optional: true + + '@rollup/rollup-android-arm64@4.36.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.36.0': + optional: true + + '@rollup/rollup-darwin-x64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.36.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.36.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.36.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.36.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.36.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.36.0': + optional: true + '@standard-schema/utils@0.3.0': {} '@swc/counter@0.1.3': {} @@ -4458,6 +4816,8 @@ snapshots: ansi-styles@6.2.1: {} + any-promise@1.3.0: {} + apisauce@2.1.6: dependencies: axios: 0.21.4 @@ -4571,10 +4931,17 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bundle-require@5.1.0(esbuild@0.25.1): + dependencies: + esbuild: 0.25.1 + load-tsconfig: 0.2.5 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 + cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4609,6 +4976,10 @@ snapshots: chalk@5.4.1: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -4670,8 +5041,12 @@ snapshots: commander@11.1.0: {} + commander@4.1.1: {} + concat-map@0.0.1: {} + consola@3.4.2: {} + copyfiles@2.4.1: dependencies: glob: 7.2.3 @@ -5288,6 +5663,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@11.0.1: dependencies: foreground-child: 3.3.1 @@ -5561,6 +5945,12 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.0: dependencies: '@isaacs/cliui': 8.0.2 @@ -5574,6 +5964,8 @@ snapshots: jiti@2.4.2: {} + joycon@3.1.1: {} + js-base64@3.7.7: {} js-message@1.0.7: {} @@ -5694,8 +6086,12 @@ snapshots: lightningcss-win32-arm64-msvc: 1.29.2 lightningcss-win32-x64-msvc: 1.29.2 + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} + load-tsconfig@0.2.5: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -5720,6 +6116,8 @@ snapshots: lodash.snakecase@4.1.1: {} + lodash.sortby@4.7.0: {} + lodash.startcase@4.4.0: {} lodash.trim@4.5.1: {} @@ -5745,6 +6143,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + lru-cache@10.4.3: {} + lru-cache@11.0.2: {} lru-cache@6.0.0: @@ -5790,6 +6190,12 @@ snapshots: ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -5964,6 +6370,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-scurry@2.0.0: dependencies: lru-cache: 11.0.2 @@ -5977,10 +6388,20 @@ snapshots: picomatch@4.0.2: {} + pirates@4.0.6: {} + pluralize@8.0.0: {} possible-typed-array-names@1.1.0: {} + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.3 + tsx: 4.19.3 + postcss@8.4.31: dependencies: nanoid: 3.3.11 @@ -6074,6 +6495,8 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@4.1.2: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -6098,6 +6521,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} resolve@2.0.0-next.5: @@ -6127,6 +6552,31 @@ snapshots: glob: 11.0.1 package-json-from-dist: 1.0.1 + rollup@4.36.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.36.0 + '@rollup/rollup-android-arm64': 4.36.0 + '@rollup/rollup-darwin-arm64': 4.36.0 + '@rollup/rollup-darwin-x64': 4.36.0 + '@rollup/rollup-freebsd-arm64': 4.36.0 + '@rollup/rollup-freebsd-x64': 4.36.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 + '@rollup/rollup-linux-arm-musleabihf': 4.36.0 + '@rollup/rollup-linux-arm64-gnu': 4.36.0 + '@rollup/rollup-linux-arm64-musl': 4.36.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 + '@rollup/rollup-linux-riscv64-gnu': 4.36.0 + '@rollup/rollup-linux-s390x-gnu': 4.36.0 + '@rollup/rollup-linux-x64-gnu': 4.36.0 + '@rollup/rollup-linux-x64-musl': 4.36.0 + '@rollup/rollup-win32-arm64-msvc': 4.36.0 + '@rollup/rollup-win32-ia32-msvc': 4.36.0 + '@rollup/rollup-win32-x64-msvc': 4.36.0 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6269,6 +6719,10 @@ snapshots: source-map@0.6.1: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + stdin-discarder@0.1.0: dependencies: bl: 5.1.0 @@ -6372,6 +6826,16 @@ snapshots: client-only: 0.0.1 react: 19.0.0 + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -6392,21 +6856,71 @@ snapshots: tapable@2.2.1: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 + tinyexec@0.3.2: {} + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + ts-api-utils@2.0.1(typescript@5.8.2): dependencies: typescript: 5.8.2 + ts-interface-checker@0.1.13: {} + tslib@2.8.1: {} + tsup@8.4.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.1) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.0 + esbuild: 0.25.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3) + resolve-from: 5.0.0 + rollup: 4.36.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.3 + typescript: 5.8.2 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsx@4.19.3: dependencies: esbuild: 0.25.1 @@ -6528,6 +7042,14 @@ snapshots: web-streams-polyfill@3.3.3: {} + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0