diff --git a/apps/web-cluster/Dockerfile b/apps/web-cluster/Dockerfile new file mode 100644 index 0000000000..41e3881d72 --- /dev/null +++ b/apps/web-cluster/Dockerfile @@ -0,0 +1,28 @@ +FROM node:24-slim AS base +RUN corepack enable + +FROM base AS builder +WORKDIR /app +COPY . . + +RUN corepack enable pnpm + +RUN echo "inject-workspace-packages=true" >> .npmrc +RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm i + +RUN pnpm run --filter=@cap/web-cluster build +RUN pnpm deploy --filter=@cap/web-cluster out +RUN cd out && node scripts/post-deploy.ts + +FROM denoland/deno:2.5.3 AS runner +WORKDIR /app + +COPY --from=builder --chown=deno:deno /app/out /app + +USER deno + +ENTRYPOINT ["deno", "run", "--allow-all"] + +EXPOSE 8080 +EXPOSE 42069 +EXPOSE 42169 diff --git a/apps/web-cluster/package.json b/apps/web-cluster/package.json new file mode 100644 index 0000000000..0408d4d7b6 --- /dev/null +++ b/apps/web-cluster/package.json @@ -0,0 +1,31 @@ +{ + "name": "@cap/web-cluster", + "type": "module", + "scripts": { + "dev": "pnpm dotenv -e ../../.env -- concurrently \"deno run --allow-all --watch ./src/runner/index.ts\" \"deno run --allow-all --watch ./src/shard-manager.ts\"", + "build": "pnpm run --filter @cap/web-cluster^... build", + "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest ." + }, + "dependencies": { + "@cap/web-backend": "workspace:*", + "@cap/web-domain": "workspace:*", + "@effect/cluster": "^0.49.1", + "@effect/opentelemetry": "^0.56.1", + "@effect/platform": "^0.91.1", + "@effect/platform-node": "^0.96.1", + "@effect/platform-node-shared": "^0.51.4", + "@effect/rpc": "^0.70.0", + "@effect/sql-mysql2": "^0.45.1", + "@effect/workflow": "^0.10.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", + "@opentelemetry/sdk-trace-base": "^2.0.1", + "effect": "^3.17.14", + "rolldown": "1.0.0-beta.42", + "tsdown": "^0.15.6", + "tsup": "^8.5.0" + }, + "devDependencies": { + "concurrently": "^9.2.1", + "dotenv-cli": "^10.0.0" + } +} diff --git a/apps/web-cluster/scripts/post-deploy.ts b/apps/web-cluster/scripts/post-deploy.ts new file mode 100644 index 0000000000..1114d8a732 --- /dev/null +++ b/apps/web-cluster/scripts/post-deploy.ts @@ -0,0 +1,24 @@ +import { FileSystem } from "@effect/platform"; +import { NodeContext, NodeRuntime } from "@effect/platform-node"; +import { Effect } from "effect"; + +Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + + const dotPnpm = "./node_modules/.pnpm"; + const deps = yield* fs.readDirectory(dotPnpm); + const capDeps = deps.filter((dep) => dep.startsWith("@cap")); + + for (const key of capDeps) { + const pkgName = key.split("@file")[0].replace("+", "/"); + const pkgJsonPath = `${dotPnpm}/${key}/node_modules/${pkgName}/package.json`; + + let pkgJson = JSON.parse(yield* fs.readFileString(pkgJsonPath)); + + if (pkgJson.publishConfig) { + pkgJson = { ...pkgJson, ...pkgJson.publishConfig }; + } + + yield* fs.writeFileString(pkgJsonPath, JSON.stringify(pkgJson)); + } +}).pipe(Effect.provide(NodeContext.layer), NodeRuntime.runMain); diff --git a/apps/web-cluster/src/cluster/container-metadata.ts b/apps/web-cluster/src/cluster/container-metadata.ts new file mode 100644 index 0000000000..7b79f95bd0 --- /dev/null +++ b/apps/web-cluster/src/cluster/container-metadata.ts @@ -0,0 +1,66 @@ +import { Config, Data, Effect, Option } from "effect"; + +export class FetchIpError extends Data.TaggedError("FetchIpError")<{}> {} + +class EcsContainerMetadata extends Effect.Service()( + "EcsContainerMetadata", + { + effect: Effect.gen(function* () { + return { + metadataUri: yield* Config.option( + Config.string("ECS_CONTAINER_METADATA_URI_V4"), + ), + }; + }), + }, +) {} + +export const privateIp = EcsContainerMetadata.pipe( + Effect.flatMap(({ metadataUri }) => + Option.match(metadataUri, { + onNone: () => Effect.succeed("0.0.0.0"), + onSome: (uri) => + Effect.tryPromise({ + try: async () => { + const response = await fetch(`${uri}/task`); + const data = await response.json(); + return data.Containers[0].Networks[0].IPv4Addresses[0] as string; + }, + catch: (error) => { + console.error("error", error); + return new FetchIpError(); + }, + }), + }), + ), +); + +export class ContainerMetadata extends Effect.Service()( + "ContainerMetadata", + { + effect: Effect.gen(function* () { + const containerMetadata = yield* EcsContainerMetadata; + const metadataUri = containerMetadata.metadataUri; + const ipAddress = yield* Option.match(metadataUri, { + onNone: () => Effect.succeed("0.0.0.0"), + onSome: (uri) => + Effect.tryPromise({ + try: async () => { + const response = await fetch(`${uri}/task`); + const data = await response.json(); + return data.Containers[0].Networks[0].IPv4Addresses[0] as string; + }, + catch: (error) => { + console.error("error", error); + return new FetchIpError(); + }, + }), + }); + + const port = yield* Config.number("PORT").pipe(Config.withDefault(42069)); + + return { ipAddress, port }; + }), + dependencies: [EcsContainerMetadata.Default], + }, +) {} diff --git a/apps/web-cluster/src/health-check.ts b/apps/web-cluster/src/health-check.ts new file mode 100644 index 0000000000..e09c3d6d8f --- /dev/null +++ b/apps/web-cluster/src/health-check.ts @@ -0,0 +1,27 @@ +async function checkHealth(): Promise { + try { + const response = await fetch( + `http://127.0.0.1:${process.env.HEALTH_CHECK_PORT}/health`, + ); + return response.status === 200; + } catch (error) { + console.error("Health check failed:", error); + return false; + } +} + +// Run the health check +checkHealth() + .then((isHealthy) => { + if (isHealthy) { + console.log("✅ Service is healthy (200 OK)"); + process.exit(0); + } else { + console.log("❌ Service is not healthy (non-200 response)"); + process.exit(1); + } + }) + .catch((error) => { + console.error("❌ Health check failed:", error); + process.exit(1); + }); diff --git a/apps/web-cluster/src/runner/health-server.ts b/apps/web-cluster/src/runner/health-server.ts new file mode 100644 index 0000000000..4b4d07be24 --- /dev/null +++ b/apps/web-cluster/src/runner/health-server.ts @@ -0,0 +1,22 @@ +import { createServer } from "node:http"; +import { HttpRouter, HttpServer, HttpServerResponse } from "@effect/platform"; +import { NodeHttpServer } from "@effect/platform-node"; +import { Layer } from "effect"; + +// Define the router with a single route for the root URL +const router = HttpRouter.empty.pipe( + HttpRouter.get("/health", HttpServerResponse.text("ok")), +); + +// Set up the application server +const app = router.pipe(HttpServer.serve()); + +// Specify the port +const port = process.env.HEALTH_CHECK_PORT + ? parseInt(process.env.HEALTH_CHECK_PORT) + : 3000; + +// Create a server layer with the specified port +const ServerLive = NodeHttpServer.layer(() => createServer(), { port }); + +export const HealthServerLive = Layer.provide(app, ServerLive); diff --git a/apps/web-cluster/src/runner/index.ts b/apps/web-cluster/src/runner/index.ts new file mode 100644 index 0000000000..11e773bc05 --- /dev/null +++ b/apps/web-cluster/src/runner/index.ts @@ -0,0 +1,99 @@ +import { createServer } from "node:http"; +import { Database, S3Buckets, Videos, Workflows } from "@cap/web-backend"; +import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; +import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; +import { + FetchHttpClient, + HttpApiBuilder, + HttpMiddleware, + HttpRouter, + HttpServer, +} from "@effect/platform"; +import { + NodeClusterRunnerSocket, + NodeHttpServer, + NodeRuntime, +} from "@effect/platform-node"; +import { RpcServer } from "@effect/rpc"; +import { WorkflowProxyServer } from "@effect/workflow"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; +import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; +import { Config, Effect, Layer, Option } from "effect"; + +import { ContainerMetadata } from "../cluster/container-metadata.ts"; +import { DatabaseLive, ShardDatabaseLive } from "../shared/database.ts"; +import { HealthServerLive } from "./health-server.ts"; + +const ClusterWorkflowLive = Layer.unwrapEffect( + Effect.gen(function* () { + const containerMeta = yield* ContainerMetadata; + return ClusterWorkflowEngine.layer.pipe( + Layer.provide( + NodeClusterRunnerSocket.layer({ + storage: "sql", + shardingConfig: { + runnerAddress: Option.some( + RunnerAddress.make(containerMeta.ipAddress, containerMeta.port), + ), + }, + }), + ), + Layer.provide(ShardDatabaseLive), + ); + }), +).pipe(Layer.provide(ContainerMetadata.Default)); + +const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( + Layer.provide(WorkflowProxyServer.layerRpcHandlers(Workflows.Workflows)), + Layer.provide(Workflows.WorkflowsLayer), + Layer.provide(ClusterWorkflowLive), + Layer.provide(RpcServer.layerProtocolHttp({ path: "/" })), + Layer.provide(Workflows.RpcSerialization), +); + +const TracingLayer = Layer.unwrapEffect( + Effect.gen(function* () { + const exporter = Option.match( + yield* Config.option( + Config.all([ + Config.string("AXIOM_API_TOKEN"), + Config.string("AXIOM_DOMAIN"), + Config.string("AXIOM_DATASET"), + ]), + ), + { + onNone: () => new OTLPTraceExporter({}), + onSome: ([token, domain, dataset]) => { + return new OTLPTraceExporter({ + url: `https://${domain}/v1/traces`, // Axiom API endpoint for trace data + headers: { + Authorization: `Bearer ${token}`, // Replace API_TOKEN with your actual API token + "X-Axiom-Dataset": dataset, // Replace DATASET_NAME with your dataset + }, + }); + }, + }, + ); + + return NodeSdk.layer(() => ({ + resource: { serviceName: "cap-workflow-runner" }, + spanProcessor: [new BatchSpanProcessor(exporter)], + })); + }), +); + +HttpRouter.Default.serve().pipe( + Layer.provide(RpcsLive), + HttpServer.withLogAddress, + Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), + Layer.provide(Videos.Default), + Layer.provide(S3Buckets.Default), + Layer.provide(Database.Default), + Layer.provide(FetchHttpClient.layer), + Layer.provide(DatabaseLive), + Layer.provide(TracingLayer), + Layer.launch, + NodeRuntime.runMain, +); + +HealthServerLive.pipe(Layer.launch, NodeRuntime.runMain); diff --git a/apps/web-cluster/src/shard-manager.ts b/apps/web-cluster/src/shard-manager.ts new file mode 100644 index 0000000000..d1ddf61809 --- /dev/null +++ b/apps/web-cluster/src/shard-manager.ts @@ -0,0 +1,17 @@ +import { + NodeClusterShardManagerSocket, + NodeRuntime, +} from "@effect/platform-node"; +import { Layer, Logger } from "effect"; + +import { DatabaseLive, ShardDatabaseLive } from "./shared/database.ts"; + +NodeClusterShardManagerSocket.layer({ + storage: "sql", +}).pipe( + Layer.provide(ShardDatabaseLive), + Layer.provide(DatabaseLive), + Layer.provide(Logger.pretty), + Layer.launch, + NodeRuntime.runMain, +); diff --git a/apps/web-cluster/src/shared/database.ts b/apps/web-cluster/src/shared/database.ts new file mode 100644 index 0000000000..ff303d19af --- /dev/null +++ b/apps/web-cluster/src/shared/database.ts @@ -0,0 +1,29 @@ +import { MysqlClient } from "@effect/sql-mysql2"; +import { Config, Effect, Layer, Option } from "effect"; + +export const DatabaseLive = Layer.unwrapEffect( + Effect.gen(function* () { + const url = yield* Config.redacted(Config.string("DATABASE_URL")); + + return MysqlClient.layer({ url }); + }), +); + +export const ShardDatabaseLive = Layer.unwrapEffect( + Effect.gen(function* () { + const url = yield* Config.option( + Config.redacted(Config.string("SHARD_DATABASE_URL")), + ); + + return yield* Option.match(url, { + onNone: () => + Effect.gen(function* () { + return Layer.succeed( + MysqlClient.MysqlClient, + yield* MysqlClient.MysqlClient, + ); + }), + onSome: (url) => Effect.succeed(MysqlClient.layer({ url })), + }); + }), +); diff --git a/apps/web-cluster/tsconfig.json b/apps/web-cluster/tsconfig.json new file mode 100644 index 0000000000..d131471135 --- /dev/null +++ b/apps/web-cluster/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../packages/config/base.tsconfig.json", + "exclude": ["node_modules", "dist"], + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "moduleResolution": "bundler", + "composite": true, + "outDir": "dist", + "noEmit": false, + "emitDeclarationOnly": true, + "module": "es2020", + "target": "es2020" + } +} diff --git a/apps/web/app/api/[[...route]]/route.ts b/apps/web/app/api/[[...route]]/route.ts new file mode 100644 index 0000000000..e0e4bd7732 --- /dev/null +++ b/apps/web/app/api/[[...route]]/route.ts @@ -0,0 +1,13 @@ +import { HttpLive } from "@cap/web-backend"; +import { HttpApiScalar } from "@effect/platform"; +import { Layer } from "effect"; +import { apiToHandler } from "@/lib/server"; + +const handler = apiToHandler( + HttpApiScalar.layer({ path: "/api" }).pipe(Layer.provideMerge(HttpLive)), +); + +export const GET = handler; +export const POST = handler; +export const HEAD = handler; +export const OPTIONS = handler; diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 171da84762..2f10466c7f 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,7 +1,6 @@ import "@/app/globals.css"; import { getCurrentUser } from "@cap/database/auth/session"; import { buildEnv } from "@cap/env"; -import { S3_BUCKET_URL } from "@cap/utils"; import { Analytics as DubAnalytics } from "@dub/analytics/react"; import * as TooltipPrimitive from "@radix-ui/react-tooltip"; import type { Metadata } from "next"; diff --git a/apps/web/instrumentation.node.ts b/apps/web/instrumentation.node.ts index 4705519020..f23d1e7079 100644 --- a/apps/web/instrumentation.node.ts +++ b/apps/web/instrumentation.node.ts @@ -15,7 +15,6 @@ import path from "path"; export async function register() { console.log("Waiting 5 seconds to run migrations"); - // Function to trigger migrations with retry logic const triggerMigrations = async (retryCount = 0, maxRetries = 3) => { try { @@ -36,10 +35,8 @@ export async function register() { } } }; - // Add a timeout to trigger migrations after 5 seconds on server start setTimeout(() => triggerMigrations(), 5000); - setTimeout(() => createS3Bucket(), 5000); } diff --git a/apps/web/instrumentation.ts b/apps/web/instrumentation.ts index 658bc0a6ab..fb3ea56a7b 100644 --- a/apps/web/instrumentation.ts +++ b/apps/web/instrumentation.ts @@ -1,4 +1,21 @@ +import { OTLPHttpJsonTraceExporter, registerOTel } from "@vercel/otel"; + export async function register() { + if (process.env.NEXT_PUBLIC_AXIOM_TOKEN) { + console.log("token", process.env.NEXT_PUBLIC_AXIOM_TOKEN); + console.log("dataset", process.env.NEXT_PUBLIC_AXIOM_DATASET); + registerOTel({ + serviceName: "cap-web-backend", + traceExporter: new OTLPHttpJsonTraceExporter({ + url: "https://api.axiom.co/v1/traces", + headers: { + Authorization: `Bearer ${process.env.NEXT_PUBLIC_AXIOM_TOKEN}`, + "X-Axiom-Dataset": process.env.NEXT_PUBLIC_AXIOM_DATASET, + }, + }), + }); + } + if (process.env.NEXT_RUNTIME === "nodejs") { const { register } = await import("./instrumentation.node"); await register(); diff --git a/apps/web/lib/EffectRuntime.ts b/apps/web/lib/EffectRuntime.ts index 2ffa90e390..e9c8bccdfa 100644 --- a/apps/web/lib/EffectRuntime.ts +++ b/apps/web/lib/EffectRuntime.ts @@ -1,4 +1,3 @@ -import * as WebSdk from "@effect/opentelemetry/WebSdk"; import { FetchHttpClient } from "@effect/platform"; import { Layer, ManagedRuntime } from "effect"; import { @@ -6,15 +5,8 @@ import { makeUseEffectQuery, } from "./effect-react-query"; import { Rpc } from "./Rpcs"; -import { getTracingConfig } from "./tracing"; -const TracingLayer = WebSdk.layer(getTracingConfig); - -const RuntimeLayer = Layer.mergeAll( - Rpc.Default, - TracingLayer, - FetchHttpClient.layer, -); +const RuntimeLayer = Layer.mergeAll(Rpc.Default, FetchHttpClient.layer); export type RuntimeLayer = typeof RuntimeLayer; diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index f24a657a74..8e18a54a57 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -11,22 +11,31 @@ import { SpacesPolicy, Videos, VideosPolicy, + Workflows, } from "@cap/web-backend"; import { type HttpAuthMiddleware, Video } from "@cap/web-domain"; -import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; import { FetchHttpClient, type HttpApi, HttpApiBuilder, + HttpApiClient, HttpMiddleware, HttpServer, } from "@effect/platform"; -import { Cause, Effect, Exit, Layer, ManagedRuntime, Option } from "effect"; +import { RpcClient } from "@effect/rpc"; +import { + Cause, + Config, + Effect, + Exit, + Layer, + ManagedRuntime, + Option, +} from "effect"; import { cookies } from "next/headers"; -import { allowedOrigins } from "@/utils/cors"; -import { getTracingConfig } from "./tracing"; -export const TracingLayer = NodeSdk.layer(getTracingConfig); +import { allowedOrigins } from "@/utils/cors"; +import { layerTracer } from "./tracing"; const CookiePasswordAttachmentLive = Layer.effect( Video.VideoPasswordAttachment, @@ -41,6 +50,24 @@ const CookiePasswordAttachmentLive = Layer.effect( }), ); +const WorkflowRpcLive = Layer.scoped( + Workflows.RpcClient, + Effect.gen(function* () { + const url = Option.getOrElse( + yield* Config.option(Config.string("REMOTE_WORKFLOW_URL")), + () => "http://127.0.0.1:42169", + ); + + return yield* RpcClient.make(Workflows.RpcGroup).pipe( + Effect.provide( + RpcClient.layerProtocolHttp({ url }).pipe( + Layer.provide(Workflows.RpcSerialization), + ), + ), + ); + }), +); + export const Dependencies = Layer.mergeAll( S3Buckets.Default, Videos.Default, @@ -49,10 +76,9 @@ export const Dependencies = Layer.mergeAll( SpacesPolicy.Default, OrganisationsPolicy.Default, Spaces.Default, + WorkflowRpcLive, ).pipe( - Layer.provideMerge( - Layer.mergeAll(Database.Default, TracingLayer, FetchHttpClient.layer), - ), + Layer.provideMerge(Layer.mergeAll(Database.Default, FetchHttpClient.layer)), ); // purposefully not exposed @@ -106,6 +132,7 @@ export const apiToHandler = ( Layer.provide( HttpApiBuilder.middleware(Effect.provide(CookiePasswordAttachmentLive)), ), + Layer.provide(layerTracer), HttpApiBuilder.toWebHandler, (v) => (req: Request) => v.handler(req), ); diff --git a/apps/web/lib/tracing-server.ts b/apps/web/lib/tracing-server.ts deleted file mode 100644 index 53b062d277..0000000000 --- a/apps/web/lib/tracing-server.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; - -import { getTracingConfig } from "./tracing"; - -export const TracingLayer = NodeSdk.layer(getTracingConfig); diff --git a/apps/web/lib/tracing.ts b/apps/web/lib/tracing.ts index 71b016f577..2b3fc620fd 100644 --- a/apps/web/lib/tracing.ts +++ b/apps/web/lib/tracing.ts @@ -1,29 +1,32 @@ -import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; -import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { Effect, Option } from "effect"; +import { Resource, Tracer } from "@effect/opentelemetry"; +import { trace } from "@opentelemetry/api"; +import { Effect, Layer } from "effect"; -export const getTracingConfig = Effect.gen(function* () { - const axiomToken = Option.fromNullable(process.env.NEXT_PUBLIC_AXIOM_TOKEN); +export const layerTracer = Layer.unwrapEffect( + Effect.gen(function* () { + const provider = Layer.sync(Tracer.OtelTracerProvider, () => + trace.getTracerProvider(), + ); - const axiomProcessor = Option.map( - axiomToken, - (token) => - new BatchSpanProcessor( - new OTLPTraceExporter({ - url: "https://api.axiom.co/v1/traces", - headers: { - Authorization: `Bearer ${token}`, - "X-Axiom-Dataset": "cap-web-test", - }, - }), + const otelTracer = Layer.effect( + Tracer.OtelTracer, + Effect.flatMap(Tracer.OtelTracerProvider, (provider) => + Effect.sync(() => provider.getTracer("cap-web-backend")), ), - ); + ); - return { - resource: { serviceName: "cap-web" }, - spanProcessor: Option.match(axiomProcessor, { - onNone: () => [new BatchSpanProcessor(new OTLPTraceExporter({}))], - onSome: (processor) => [processor], - }), - }; -}); + const tracer = yield* Tracer.make.pipe( + Effect.provide( + Layer.mergeAll( + otelTracer.pipe(Layer.provideMerge(provider)), + Resource.layer({ serviceName: "cap-web-backend" }), + ), + ), + ); + + return Layer.setTracer(tracer).pipe( + Layer.provideMerge(otelTracer), + Layer.provideMerge(provider), + ); + }), +); diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index 32067d2c68..4a7ad64454 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -17,6 +17,8 @@ const nextConfig = { "@cap/utils", "@cap/web-api-contract", "@cap/web-domain", + "@cap/env", + "@cap/database", "next-mdx-remote", ], eslint: { @@ -29,8 +31,10 @@ const nextConfig = { optimizePackageImports: [ "@cap/ui", "@cap/utils", - "@cap/web-api-contract", - "@cap/web-domain", + // "@cap/web-api-contract", + // "@cap/web-domain", + // "@cap/web-backend", + "@cap/database", ], }, images: { diff --git a/apps/web/package.json b/apps/web/package.json index 4f5bc1c266..6c4d63bf50 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -45,6 +45,7 @@ "@mux/mux-player-react": "^3.3.0", "@number-flow/react": "^0.5.9", "@octokit/rest": "^20.0.2", + "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", @@ -70,6 +71,7 @@ "@ts-rest/core": "^3.52.1", "@uidotdev/usehooks": "^2.4.1", "@vercel/functions": "^3.1.0", + "@vercel/otel": "^2.0.1", "@virtual-grid/react": "^2.0.3", "@workos-inc/node": "^7.34.0", "aws-sdk": "^2.1530.0", @@ -148,11 +150,5 @@ }, "engines": { "node": "20" - }, - "pnpm": { - "overrides": { - "@types/react": "19.1.13", - "@types/react-dom": "19.1.9" - } } } diff --git a/apps/workflow-manager/package.json b/apps/workflow-manager/package.json deleted file mode 100644 index 8860fa4cbc..0000000000 --- a/apps/workflow-manager/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@cap/workflow-manager", - "type": "module", - "scripts": { - "dev": "dotenv -e ../../.env -- deno --allow-all --watch src/index.ts" - }, - "dependencies": { - "@effect/platform-node": "^0.96.1", - "@effect/sql-mysql2": "^0.45.1", - "effect": "^3.17.14" - }, - "devDependencies": { - "dotenv-cli": "^10.0.0" - } -} diff --git a/apps/workflow-manager/src/index.ts b/apps/workflow-manager/src/index.ts deleted file mode 100644 index 1d337c7447..0000000000 --- a/apps/workflow-manager/src/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - NodeClusterShardManagerSocket, - NodeRuntime, -} from "@effect/platform-node"; -import { MysqlClient } from "@effect/sql-mysql2"; -import { Config, Effect, Layer, Logger, Redacted } from "effect"; - -const DatabaseLive = Layer.unwrapEffect( - Effect.gen(function* () { - const url = Redacted.make(yield* Config.string("DATABASE_URL")); - - return MysqlClient.layer({ url }); - }), -); - -NodeClusterShardManagerSocket.layer({ - storage: "sql", -}).pipe( - Layer.provide(DatabaseLive), - Layer.provide(Logger.pretty), - Layer.launch, - NodeRuntime.runMain, -); diff --git a/apps/workflow-runner/package.json b/apps/workflow-runner/package.json deleted file mode 100644 index 361a7648ab..0000000000 --- a/apps/workflow-runner/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "@cap/workflow-runner", - "type": "module", - "scripts": { - "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/index.ts" - }, - "dependencies": { - "@cap/web-backend": "workspace:*", - "@cap/web-domain": "workspace:*", - "@effect/cluster": "^0.49.1", - "@effect/opentelemetry": "^0.56.1", - "@effect/platform": "^0.91.1", - "@effect/platform-node": "^0.96.1", - "@effect/sql-mysql2": "^0.45.1", - "@effect/workflow": "^0.10.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", - "@opentelemetry/sdk-trace-base": "^2.0.1", - "effect": "^3.17.14" - }, - "devDependencies": { - "dotenv-cli": "^10.0.0" - } -} diff --git a/apps/workflow-runner/src/index.ts b/apps/workflow-runner/src/index.ts deleted file mode 100644 index 2a4a8e1121..0000000000 --- a/apps/workflow-runner/src/index.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { createServer } from "node:http"; -import { Database, S3Buckets, Videos, Workflows } from "@cap/web-backend"; -import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; -import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; -import { FetchHttpClient, HttpApiBuilder, HttpServer } from "@effect/platform"; -import { - NodeClusterRunnerSocket, - NodeHttpServer, - NodeRuntime, -} from "@effect/platform-node"; -import { MysqlClient } from "@effect/sql-mysql2"; -import { WorkflowProxyServer } from "@effect/workflow"; -import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; -import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { Config, Effect, Layer, Option } from "effect"; - -const SqlLayer = Layer.unwrapEffect( - Effect.gen(function* () { - const url = yield* Config.string("DATABASE_URL").pipe((v) => - Config.redacted(v), - ); - return MysqlClient.layer({ url }); - }), -); - -const ClusterWorkflowLive = ClusterWorkflowEngine.layer.pipe( - Layer.provide( - NodeClusterRunnerSocket.layer({ - storage: "sql", - shardingConfig: { - runnerAddress: Option.some(RunnerAddress.make("localhost", 42069)), - }, - }), - ), - Layer.provide(SqlLayer), -); - -const WorkflowApiLive = HttpApiBuilder.api(Workflows.Api).pipe( - Layer.provide( - WorkflowProxyServer.layerHttpApi( - Workflows.Api, - "workflows", - Workflows.Workflows, - ), - ), - Layer.provide(Workflows.WorkflowsLayer), - Layer.provide(ClusterWorkflowLive), - HttpServer.withLogAddress, -); - -const TracingLayer = NodeSdk.layer(() => ({ - resource: { serviceName: "cap-workflow-runner" }, - spanProcessor: [new BatchSpanProcessor(new OTLPTraceExporter({}))], -})); - -HttpApiBuilder.serve().pipe( - Layer.provide(WorkflowApiLive), - Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), - Layer.provide(Videos.Default), - Layer.provide(S3Buckets.Default), - Layer.provide(Database.Default), - Layer.provide(FetchHttpClient.layer), - Layer.provide(TracingLayer), - Layer.launch, - NodeRuntime.runMain, -); diff --git a/infra/package.json b/infra/package.json index 8b04d69644..0ad762a12f 100644 --- a/infra/package.json +++ b/infra/package.json @@ -1,13 +1,14 @@ { "name": "@cap/infra", "devDependencies": { - "sst": "3.10.13" + "sst": "3.17.14" }, "scripts": { "sst": "sst" }, "dependencies": { "@pulumi/github": "^6.7.0", + "@pulumi/pulumi": "^3.201.0", "@pulumiverse/vercel": "^1.14.3", "zod": "^3" } diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index ba2fdf30c1..2f7e8de340 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -5,10 +5,52 @@ declare module "sst" { export interface Resource { - DATABASE_URL: { + AuroraDB: { + clusterArn: string; + database: string; + host: string; + password: string; + port: number; + reader: string; + secretArn: string; + type: "sst.aws.Aurora"; + username: string; + }; + CAP_AWS_ACCESS_KEY: { type: "sst.sst.Secret"; value: string; }; + CAP_AWS_SECRET_KEY: { + type: "sst.sst.Secret"; + value: string; + }; + DATABASE_URL_HTTP: { + type: "sst.sst.Secret"; + value: string; + }; + DATABASE_URL_MYSQL: { + type: "sst.sst.Secret"; + value: string; + }; + GITHUB_PAT: { + type: "sst.sst.Secret"; + value: string; + }; + MyApi: { + type: "sst.aws.ApiGatewayV2"; + url: string; + }; + Runner: { + service: string; + type: "sst.aws.Service"; + }; + ShardManager: { + service: string; + type: "sst.aws.Service"; + }; + Vpc: { + type: "sst.aws.Vpc"; + }; } } /// diff --git a/infra/sst.config.ts b/infra/sst.config.ts index bbaee4ac2c..eb1dba675f 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -8,6 +8,8 @@ const VERCEL_TEAM_SLUG = "mc-ilroy"; const VERCEL_TEAM_ID = "team_vbZRU7UW78rpKKIj4c9PfFAC"; const CLOUDFLARE_ACCOUNT_ID = "3de2dd633194481d80f68f55257bdbaa"; +const AXIOM_API_TOKEN = "xaat-c0704be6-e942-4935-b068-3b491d7cc00f"; +const AXIOM_DATASET = "cap-otel"; export default $config({ app(input) { @@ -25,6 +27,9 @@ export default $config({ owner: GITHUB_ORG, }, cloudflare: true, + aws: {}, + planetscale: true, + awsx: "2.21.1", }, }; }, @@ -34,14 +39,23 @@ export default $config({ staging: "https://staging.cap.so", }; const webUrl = WEB_URLS[$app.stage]; + const secrets = Secrets(); // const planetscale = Planetscale(); const recordingsBucket = new aws.s3.BucketV2("RecordingsBucket"); - new aws.s3.BucketAccelerateConfigurationV2("RecordingsBucketAcceleration", { - bucket: recordingsBucket.id, - status: "Enabled", - }); + const vercelVariables = [ + { key: "NEXT_PUBLIC_AXIOM_TOKEN", value: AXIOM_API_TOKEN }, + { key: "NEXT_PUBLIC_AXIOM_DATASET", value: AXIOM_DATASET }, + { key: "CAP_AWS_BUCKET", value: recordingsBucket.bucket }, + { key: "NEXT_PUBLIC_CAP_AWS_BUCKET", value: recordingsBucket.bucket }, + { key: "DATABASE_URL", value: secrets.DATABASE_URL_HTTP.value }, + ]; + + // new aws.s3.BucketAccelerateConfigurationV2("RecordingsBucketAcceleration", { + // bucket: recordingsBucket.id, + // status: "Enabled", + // }); // const cloudfrontDistribution = aws.cloudfront.getDistributionOutput({ // id: "E36XSZEM0VIIYB", @@ -51,43 +65,12 @@ export default $config({ const vercelProject = vercel.getProjectOutput({ name: "cap-web" }); - function vercelEnvVar( - name: string, - args: Omit< - vercel.ProjectEnvironmentVariableArgs, - "projectId" | "customEnvironmentIds" | "targets" - >, - ) { - new vercel.ProjectEnvironmentVariable(name, { - ...args, - projectId: vercelProject.id, - customEnvironmentIds: - $app.stage === "staging" - ? ["env_CFbtmnpsI11e4o8X5UD8MZzxELQi"] - : undefined, - targets: - $app.stage === "staging" ? undefined : ["preview", "production"], - }); - } - - vercelEnvVar("VercelDatabaseURLEnv", { - key: "DATABASE_URL", - value: new sst.Secret("DATABASE_URL").value, - }); - if (webUrl) { - vercelEnvVar("VercelWebURLEnv", { - key: "WEB_URL", - value: webUrl, - }); - vercelEnvVar("VercelNextPublicWebURLEnv", { - key: "NEXT_PUBLIC_WEB_URL", - value: webUrl, - }); - vercelEnvVar("VercelNextAuthURLEnv", { - key: "NEXTAUTH_URL", - value: webUrl, - }); + vercelVariables.push( + { key: "WEB_URL", value: webUrl }, + { key: "NEXT_PUBLIC_WEB_URL", value: webUrl }, + { key: "NEXTAUTH_URL", value: webUrl }, + ); } // vercelEnvVar("VercelCloudfrontEnv", { @@ -95,22 +78,27 @@ export default $config({ // value: cloudfrontDistribution.id, // }); - vercelEnvVar("VercelAWSBucketEnv", { - key: "CAP_AWS_BUCKET", - value: recordingsBucket.bucket, - }); - - vercelEnvVar("VercelNextPublicAWSBucketEnv", { - key: "NEXT_PUBLIC_CAP_AWS_BUCKET", - value: recordingsBucket.bucket, - }); - - const vercelOidc = aws.iam.getOpenIdConnectProviderOutput({ - url: `https://oidc.vercel.com/${VERCEL_TEAM_SLUG}`, - }); - const awsAccount = aws.getCallerIdentityOutput(); + const oidc = await (async () => { + const aud = `https://vercel.com/${VERCEL_TEAM_SLUG}`; + const url = `oidc.vercel.com/${VERCEL_TEAM_SLUG}`; + return { + aud, + url, + provider: await aws.iam + .getOpenIdConnectProvider({ url: `https://${url}` }) + .catch( + () => + new aws.iam.OpenIdConnectProvider( + "VercelAWSOIDC", + { url: `https://${url}`, clientIdLists: [aud] }, + { retainOnDelete: true }, + ), + ), + }; + })(); + const vercelAwsAccessRole = new aws.iam.Role("VercelAWSAccessRole", { assumeRolePolicy: { Version: "2012-10-17", @@ -118,15 +106,15 @@ export default $config({ { Effect: "Allow", Principal: { - Federated: $interpolate`arn:aws:iam::${awsAccount.id}:oidc-provider/oidc.vercel.com/${VERCEL_TEAM_SLUG}`, + Federated: $interpolate`arn:aws:iam::${awsAccount.id}:oidc-provider/${oidc.url}`, }, Action: "sts:AssumeRoleWithWebIdentity", Condition: { StringEquals: { - [`oidc.vercel.com/${VERCEL_TEAM_SLUG}:aud`]: `https://vercel.com/${VERCEL_TEAM_SLUG}`, + [`${oidc.url}:aud`]: oidc.aud, }, StringLike: { - [`oidc.vercel.com/${VERCEL_TEAM_SLUG}:sub`]: [ + [`${oidc.url}:sub`]: [ `owner:${VERCEL_TEAM_SLUG}:project:*:environment:staging`, ], }, @@ -158,15 +146,44 @@ export default $config({ ], }); - vercelEnvVar("VercelAWSAccessRoleArn", { - key: "VERCEL_AWS_ROLE_ARN", - value: vercelAwsAccessRole.arn, - }); + const workflowCluster = await WorkflowCluster(recordingsBucket, secrets); + + if ($app.stage === "staging" || $app.stage === "production") { + [ + ...vercelVariables, + { key: "REMOTE_WORKFLOW_URL", value: workflowCluster.api.url }, + { key: "VERCEL_AWS_ROLE_ARN", value: vercelAwsAccessRole.arn }, + ].map( + (v) => + new vercel.ProjectEnvironmentVariable(`VercelEnv${v.key}`, { + ...v, + projectId: vercelProject.id, + customEnvironmentIds: + $app.stage === "staging" + ? ["env_CFbtmnpsI11e4o8X5UD8MZzxELQi"] + : undefined, + targets: + $app.stage === "staging" ? undefined : ["preview", "production"], + }), + ); + } // DiscordBot(); }, }); +function Secrets() { + return { + DATABASE_URL_HTTP: new sst.Secret("DATABASE_URL_HTTP"), + DATABASE_URL_MYSQL: new sst.Secret("DATABASE_URL_MYSQL"), + CAP_AWS_ACCESS_KEY: new sst.Secret("CAP_AWS_ACCESS_KEY"), + CAP_AWS_SECRET_KEY: new sst.Secret("CAP_AWS_SECRET_KEY"), + GITHUB_PAT: new sst.Secret("GITHUB_PAT"), + }; +} + +type Secrets = ReturnType; + // function Planetscale() { // const org = planetscale.getOrganizationOutput({ name: "cap" }); // const db = planetscale.getDatabaseOutput({ @@ -182,29 +199,224 @@ export default $config({ // return { org, db, branch }; // } -function DiscordBot() { - new sst.cloudflare.Worker("DiscordBotScript", { - handler: "../apps/discord-bot/src/index.ts", +// function DiscordBot() { +// new sst.cloudflare.Worker("DiscordBotScript", { +// handler: "../apps/discord-bot/src/index.ts", +// transform: { +// worker: (args) => { +// args.name = "cap-discord-bot"; +// args.kvNamespaceBindings = [ +// { +// name: "release_discord_interactions", +// namespaceId: "846b080b86914e2ba666d35acee35c9a", +// }, +// ]; +// args.secretTextBindings = [ +// { +// name: "DISCORD_BOT_TOKEN", +// text: new sst.Secret("DISCORD_BOT_TOKEN").value, +// }, +// { +// name: "GITHUB_APP_PRIVATE_KEY", +// text: new sst.Secret("GITHUB_APP_PRIVATE_KEY").value, +// }, +// ]; +// }, +// }, +// }); +// } + +async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { + const pulumi = await import("@pulumi/pulumi"); + + const vpc = new sst.aws.Vpc("Vpc", { + nat: "ec2", + }); + const privateDnsNamespace = new aws.servicediscovery.PrivateDnsNamespace( + "WorkflowClusterPrivateDnsNamespace", + { + name: "effect-cluster.private", + description: "Private namespace for effect-cluster", + vpc: vpc.id, + }, + ); + + function generateServiceHostname(serviceName: string) { + return $interpolate`${serviceName}.${$app.stage}.${$app.name}.${privateDnsNamespace.name}`; + } + + const securityGroup = new aws.ec2.SecurityGroup( + "WorkflowClusterSecurityGroup", + { vpcId: vpc.id, description: "Security group for effect-cluster" }, + ); + new aws.vpc.SecurityGroupEgressRule("allow_all_traffic_ipv4", { + securityGroupId: securityGroup.id, + cidrIpv4: "0.0.0.0/0", + ipProtocol: "-1", + }); + // allow inbound from vpc + new aws.vpc.SecurityGroupIngressRule("allow_inbound_from_vpc", { + securityGroupId: securityGroup.id, + cidrIpv4: vpc.nodes.vpc.cidrBlock, + ipProtocol: "-1", + }); + const cluster = new sst.aws.Cluster("EffectCluster", { + vpc: { + id: vpc.id, + securityGroups: [securityGroup.id], + containerSubnets: vpc.privateSubnets, + loadBalancerSubnets: vpc.publicSubnets, + cloudmapNamespaceId: privateDnsNamespace.id, + cloudmapNamespaceName: privateDnsNamespace.name, + }, transform: { - worker: (args) => { - args.name = "cap-discord-bot"; - args.kvNamespaceBindings = [ - { - name: "release_discord_interactions", - namespaceId: "846b080b86914e2ba666d35acee35c9a", - }, - ]; - args.secretTextBindings = [ - { - name: "DISCORD_BOT_TOKEN", - text: new sst.Secret("DISCORD_BOT_TOKEN").value, - }, - { - name: "GITHUB_APP_PRIVATE_KEY", - text: new sst.Secret("GITHUB_APP_PRIVATE_KEY").value, - }, - ]; + cluster: { + settings: [{ name: "containerInsights", value: "enhanced" }], + }, + }, + }); + + const db = new sst.aws.Aurora("AuroraDB", { + engine: "mysql", + vpc, + scaling: { + min: "0.5 ACU", + max: "4 ACU", + }, + }); + + const commonEnvironment = { + CAP_AWS_REGION: bucket.region, + CAP_AWS_BUCKET: bucket.bucket, + SHARD_DATABASE_URL: $interpolate`mysql://${db.username}:${db.password}@${db.host}:${db.port}/${db.database}`, + DATABASE_URL: secrets.DATABASE_URL_MYSQL.value, + CAP_AWS_ACCESS_KEY: secrets.CAP_AWS_ACCESS_KEY.value, + CAP_AWS_SECRET_KEY: secrets.CAP_AWS_SECRET_KEY.value, + AXIOM_API_TOKEN, + AXIOM_DOMAIN: "api.axiom.co", + AXIOM_DATASET, + }; + + const ghcrCredentialsSecret = new aws.secretsmanager.Secret( + "GHCRCredentialsSecret", + ); + + new aws.secretsmanager.SecretVersion("GHCRCredentialsSecretVersion", { + secretId: ghcrCredentialsSecret.id, + secretString: secrets.GITHUB_PAT.value.apply((password) => + JSON.stringify({ + username: "brendonovich", + password, + }), + ), + }); + + const ghcrCredentialsTransform = { + taskRole(args) { + args.inlinePolicies = pulumi + .all([args.inlinePolicies ?? [], ghcrCredentialsSecret.arn]) + .apply(([policies, arn]) => { + policies.push({ + policy: JSON.stringify({ + Version: "2012-10-17", + Statement: [ + { + Effect: "Allow", + Action: ["secretsmanager:GetSecretValue"], + Resource: [arn], + }, + ], + }), + }); + return policies; + }); + }, + taskDefinition(args) { + args.containerDefinitions = pulumi + .all([$jsonParse(args.containerDefinitions), ghcrCredentialsSecret.arn]) + .apply(([def, arn]) => { + for (const container of def) { + container.repositoryCredentials = { credentialsParameter: arn }; + } + return JSON.stringify(def); + }); + }, + } satisfies sst.aws.ServiceArgs["transform"]; + + new sst.aws.Service("ShardManager", { + cluster, + architecture: "arm64", + containers: [ + { + name: "shard-manager", + image: "ghcr.io/brendonovich/cap-web-cluster:latest", + command: ["src/shard-manager.ts"], + environment: { + ...commonEnvironment, + SHARD_MANAGER_HOST: "0.0.0.0", + }, + }, + ], + transform: ghcrCredentialsTransform, + }); + + const runner = new sst.aws.Service("Runner", { + cluster, + capacity: "spot", + cpu: "0.25 vCPU", + memory: "1 GB", + architecture: "arm64", + serviceRegistry: { port: 42169 }, + image: "ghcr.io/brendonovich/cap-web-cluster:latest", + command: ["src/runner/index.ts"], + health: { + command: ["CMD", "deno", "run", "--allow-all", "src/health-check.ts"], + }, + environment: { + ...commonEnvironment, + SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), + PORT: "42069", + HEALTH_CHECK_PORT: "3000", + }, + scaling: { + min: 2, + max: 16, + cpuUtilization: 70, + memoryUtilization: 70, + }, + transform: { + ...ghcrCredentialsTransform, + // Set a restart policy for all containers + // Not provided by the SST configs + taskDefinition: (args) => { + // "containerDefinitions" is a JSON string, parse first + let value = $jsonParse(args.containerDefinitions); + + // Update "portMappings" + value = value.apply((containerDefinitions) => { + for (const container of containerDefinitions) { + container.restartPolicy = { + enabled: true, + restartAttemptPeriod: 60, + }; + } + return containerDefinitions; + }); + + // Convert back to JSON string + args.containerDefinitions = $jsonStringify(value); + + ghcrCredentialsTransform.taskDefinition(args); }, }, }); + + const api = new sst.aws.ApiGatewayV2("MyApi", { + vpc, + }); + api.routePrivate("$default", runner.nodes.cloudmapService.arn); + + return { + api, + }; } diff --git a/package.json b/package.json index 96ff28d229..9baf9674d3 100644 --- a/package.json +++ b/package.json @@ -30,18 +30,13 @@ "@clack/prompts": "^0.10.0", "@effect/language-service": "^0.34.0", "dotenv-cli": "latest", - "prettier": "^3.5.3", + "tsdown": "^0.15.6", "turbo": "^2.3.4", "typescript": "^5.8.3" }, "packageManager": "pnpm@10.5.2", "name": "cap", "engines": { - "node": "20" - }, - "pnpm": { - "overrides": { - "undici": "5.28.4" - } + "node": "24" } } diff --git a/packages/config/base.tsconfig.json b/packages/config/base.tsconfig.json index c58fc2a476..a96702bfba 100644 --- a/packages/config/base.tsconfig.json +++ b/packages/config/base.tsconfig.json @@ -14,7 +14,8 @@ "strict": true, "noFallthroughCasesInSwitch": true, "declaration": true, - "plugins": [{ "name": "@effect/language-service" }] + "plugins": [{ "name": "@effect/language-service" }], + "incremental": true }, "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/packages/database/package.json b/packages/database/package.json index e1d0acf02d..1592d4b5c8 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -12,7 +12,8 @@ "db:drop": "drizzle-kit drop --config=drizzle.config.ts", "db:studio": "drizzle-kit studio --config=drizzle.config.ts", "db:check-integrity": "node scripts/check-migration-integrity.js", - "drizzle-kit": "pnpm dotenv -e ../../.env drizzle-kit --config=drizzle.config.ts" + "drizzle-kit": "pnpm dotenv -e ../../.env drizzle-kit --config=drizzle.config.ts", + "build": "tsdown" }, "dependencies": { "@cap/env": "workspace:*", @@ -56,11 +57,21 @@ ".": "./index.ts", "./auth/auth-options": "./auth/auth-options.ts", "./auth/session": "./auth/session.ts", - "./emails/config": "./emails/config.ts", - "./emails/*": "./emails/*.tsx", "./schema": "./schema.ts", "./crypto": "./crypto.ts", "./helpers": "./helpers.ts", + "./emails/config": "./emails/config.ts", + "./emails/*": "./emails/*.tsx", "./types": "./types/index.ts" + }, + "publishConfig": { + "exports": { + ".": "./dist/index.js", + "./auth/auth-options": "./dist/auth/auth-options.js", + "./auth/session": "./dist/auth/session.js", + "./schema": "./dist/schema.js", + "./crypto": "./dist/crypto.js", + "./helpers": "./dist/helpers.js" + } } } diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json index f3acae5111..fc8cf80731 100644 --- a/packages/database/tsconfig.json +++ b/packages/database/tsconfig.json @@ -1,7 +1,13 @@ { "extends": "../config/base.tsconfig.json", "exclude": ["node_modules", "dist"], - "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx", + "./package.json" + ], "compilerOptions": { "composite": true, "outDir": "dist", diff --git a/packages/database/tsdown.config.ts b/packages/database/tsdown.config.ts new file mode 100644 index 0000000000..033930a0e1 --- /dev/null +++ b/packages/database/tsdown.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "tsdown"; +import pkgJson from "./package.json" with { type: "json" }; + +export default defineConfig({ + entry: Object.values(pkgJson.exports).filter((s) => !s.includes("email")), + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/database/types/index.ts b/packages/database/types/index.ts index 599d032aa7..47ddf78fa8 100644 --- a/packages/database/types/index.ts +++ b/packages/database/types/index.ts @@ -1,3 +1,3 @@ export * from "./metadata"; -import "./next-auth"; +import type * as _ from "./next-auth"; diff --git a/packages/env/build.ts b/packages/env/build.ts index 0330a68ea9..04d0f79196 100644 --- a/packages/env/build.ts +++ b/packages/env/build.ts @@ -3,37 +3,50 @@ import { z } from "zod"; export const NODE_ENV = process.env.NODE_ENV || ""; +let _env: ReturnType; + +const create = () => + createEnv({ + client: { + NEXT_PUBLIC_IS_CAP: z.string().optional(), + NEXT_PUBLIC_POSTHOG_KEY: z.string().optional(), + NEXT_PUBLIC_POSTHOG_HOST: z.string().optional(), + NEXT_PUBLIC_META_PIXEL_ID: z.string().optional(), + NEXT_PUBLIC_GOOGLE_AW_ID: z.string().optional(), + NEXT_PUBLIC_WEB_URL: z.string(), + NEXT_PUBLIC_CAP_AWS_BUCKET: z.string(), + NEXT_PUBLIC_CAP_AWS_REGION: z.string(), + NEXT_PUBLIC_CAP_AWS_ENDPOINT: z.string().optional(), + NEXT_PUBLIC_CAP_AWS_BUCKET_URL: z.string().optional(), + NEXT_PUBLIC_DOCKER_BUILD: z.string().optional(), + }, + runtimeEnv: { + NEXT_PUBLIC_IS_CAP: process.env.NEXT_PUBLIC_IS_CAP, + NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY, + NEXT_PUBLIC_POSTHOG_HOST: process.env.NEXT_PUBLIC_POSTHOG_HOST, + NEXT_PUBLIC_META_PIXEL_ID: process.env.NEXT_PUBLIC_META_PIXEL_ID, + NEXT_PUBLIC_GOOGLE_AW_ID: process.env.NEXT_PUBLIC_GOOGLE_AW_ID, + NEXT_PUBLIC_WEB_URL: + process.env.WEB_URL ?? process.env.NEXT_PUBLIC_WEB_URL, + NEXT_PUBLIC_CAP_AWS_BUCKET: + process.env.CAP_AWS_BUCKET ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET, + NEXT_PUBLIC_CAP_AWS_REGION: + process.env.CAP_AWS_REGION ?? process.env.NEXT_PUBLIC_CAP_AWS_REGION, + NEXT_PUBLIC_CAP_AWS_ENDPOINT: + process.env.CAP_AWS_ENDPOINT ?? + process.env.NEXT_PUBLIC_CAP_AWS_ENDPOINT, + NEXT_PUBLIC_CAP_AWS_BUCKET_URL: + process.env.CAP_AWS_URL ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET_URL, + NEXT_PUBLIC_DOCKER_BUILD: process.env.NEXT_PUBLIC_DOCKER_BUILD, + }, + }); + // Environment variables that are needed in the build process, and may be incorrect on the client. // Some are only provided by `NEXT_PUBLIC`, but others can be provdied at runtime -export const buildEnv = createEnv({ - client: { - NEXT_PUBLIC_IS_CAP: z.string().optional(), - NEXT_PUBLIC_POSTHOG_KEY: z.string().optional(), - NEXT_PUBLIC_POSTHOG_HOST: z.string().optional(), - NEXT_PUBLIC_META_PIXEL_ID: z.string().optional(), - NEXT_PUBLIC_GOOGLE_AW_ID: z.string().optional(), - NEXT_PUBLIC_WEB_URL: z.string(), - NEXT_PUBLIC_CAP_AWS_BUCKET: z.string(), - NEXT_PUBLIC_CAP_AWS_REGION: z.string(), - NEXT_PUBLIC_CAP_AWS_ENDPOINT: z.string().optional(), - NEXT_PUBLIC_CAP_AWS_BUCKET_URL: z.string().optional(), - NEXT_PUBLIC_DOCKER_BUILD: z.string().optional(), - }, - runtimeEnv: { - NEXT_PUBLIC_IS_CAP: process.env.NEXT_PUBLIC_IS_CAP, - NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY, - NEXT_PUBLIC_POSTHOG_HOST: process.env.NEXT_PUBLIC_POSTHOG_HOST, - NEXT_PUBLIC_META_PIXEL_ID: process.env.NEXT_PUBLIC_META_PIXEL_ID, - NEXT_PUBLIC_GOOGLE_AW_ID: process.env.NEXT_PUBLIC_GOOGLE_AW_ID, - NEXT_PUBLIC_WEB_URL: process.env.WEB_URL ?? process.env.NEXT_PUBLIC_WEB_URL, - NEXT_PUBLIC_CAP_AWS_BUCKET: - process.env.CAP_AWS_BUCKET ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET, - NEXT_PUBLIC_CAP_AWS_REGION: - process.env.CAP_AWS_REGION ?? process.env.NEXT_PUBLIC_CAP_AWS_REGION, - NEXT_PUBLIC_CAP_AWS_ENDPOINT: - process.env.CAP_AWS_ENDPOINT ?? process.env.NEXT_PUBLIC_CAP_AWS_ENDPOINT, - NEXT_PUBLIC_CAP_AWS_BUCKET_URL: - process.env.CAP_AWS_URL ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET_URL, - NEXT_PUBLIC_DOCKER_BUILD: process.env.NEXT_PUBLIC_DOCKER_BUILD, +export const buildEnv = new Proxy({} as typeof _env, { + get(_, key) { + if (!_env) _env = create(); + + return (_env as any)[key]; }, }); diff --git a/packages/env/package.json b/packages/env/package.json index 67a2d70897..926c67f70b 100644 --- a/packages/env/package.json +++ b/packages/env/package.json @@ -4,6 +4,12 @@ "type": "module", "main": "./index.ts", "types": "./index.ts", + "scripts": { + "build": "tsdown" + }, + "publishConfig": { + "main": "./dist/index.js" + }, "dependencies": { "@t3-oss/env-nextjs": "^0.12.0", "zod": "^3.25.76" diff --git a/packages/env/tsdown.config.ts b/packages/env/tsdown.config.ts new file mode 100644 index 0000000000..61e525d960 --- /dev/null +++ b/packages/env/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/utils/package.json b/packages/utils/package.json index 04ad441a21..0a055dc135 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -3,11 +3,12 @@ "type": "module", "main": "./src/index.ts", "types": "./src/index.ts", - "exports": { - ".": "./src/index.ts" - }, "scripts": { - "typecheck": "tsc -b" + "typecheck": "tsc -b", + "build": "tsdown" + }, + "publishConfig": { + "main": "./dist/index.js" }, "devDependencies": { "react": "^19.1.1", diff --git a/packages/utils/src/constants/s3.ts b/packages/utils/src/constants/s3.ts deleted file mode 100644 index 85afc95797..0000000000 --- a/packages/utils/src/constants/s3.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { buildEnv } from "@cap/env"; - -export const S3_BUCKET_URL = (() => { - const fixedUrl = buildEnv.NEXT_PUBLIC_CAP_AWS_BUCKET_URL; - const endpoint = buildEnv.NEXT_PUBLIC_CAP_AWS_ENDPOINT; - const bucket = buildEnv.NEXT_PUBLIC_CAP_AWS_BUCKET; - const region = buildEnv.NEXT_PUBLIC_CAP_AWS_REGION; - - if (fixedUrl) return fixedUrl; - if (endpoint) return `${endpoint}/${bucket}`; - return `s3.${region}.amazonaws.com/${bucket}`; -})(); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 72c80b23de..c7ac6480ba 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,5 +1,4 @@ export * from "./constants/plans.ts"; -export * from "./constants/s3.ts"; export * from "./helpers.ts"; export * from "./lib/stripe/stripe.ts"; export * from "./types/database.ts"; diff --git a/packages/utils/tsdown.config.ts b/packages/utils/tsdown.config.ts new file mode 100644 index 0000000000..f111aa0fff --- /dev/null +++ b/packages/utils/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/web-backend/package.json b/packages/web-backend/package.json index 167d9d37ae..79d9463167 100644 --- a/packages/web-backend/package.json +++ b/packages/web-backend/package.json @@ -4,6 +4,12 @@ "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", + "publishConfig": { + "main": "./dist/index.js" + }, + "scripts": { + "build": "tsdown" + }, "dependencies": { "@aws-sdk/client-s3": "^3.485.0", "@aws-sdk/cloudfront-signer": "^3.821.0", diff --git a/packages/web-backend/src/Auth.ts b/packages/web-backend/src/Auth.ts index e2b008b861..5cdcb8b212 100644 --- a/packages/web-backend/src/Auth.ts +++ b/packages/web-backend/src/Auth.ts @@ -1,11 +1,15 @@ import { getServerSession } from "@cap/database/auth/auth-options"; import * as Db from "@cap/database/schema"; -import { CurrentUser, HttpAuthMiddleware, Policy } from "@cap/web-domain"; +import { + CurrentUser, + type DatabaseError, + HttpAuthMiddleware, +} from "@cap/web-domain"; import { HttpApiError, HttpServerRequest } from "@effect/platform"; import * as Dz from "drizzle-orm"; import { type Cause, Effect, Layer, Option, Schema } from "effect"; -import { Database, type DatabaseError } from "./Database.ts"; +import { Database } from "./Database.ts"; export const getCurrentUser = Effect.gen(function* () { const db = yield* Database; diff --git a/packages/web-backend/src/Database.ts b/packages/web-backend/src/Database.ts index 16e6eb01cb..736be511bf 100644 --- a/packages/web-backend/src/Database.ts +++ b/packages/web-backend/src/Database.ts @@ -1,10 +1,6 @@ import { db } from "@cap/database"; -import { Effect, Schema } from "effect"; - -export class DatabaseError extends Schema.TaggedError()( - "DatabaseError", - { cause: Schema.Unknown }, -) {} +import { DatabaseError } from "@cap/web-domain"; +import { Effect } from "effect"; export class Database extends Effect.Service()("Database", { effect: Effect.gen(function* () { diff --git a/packages/web-backend/src/Folders/index.ts b/packages/web-backend/src/Folders/index.ts index 57dbd2cb75..24fa514b53 100644 --- a/packages/web-backend/src/Folders/index.ts +++ b/packages/web-backend/src/Folders/index.ts @@ -1,6 +1,7 @@ import * as Db from "@cap/database/schema"; import { CurrentUser, + type DatabaseError, Folder, Organisation, Policy, @@ -10,7 +11,7 @@ import { import * as Dz from "drizzle-orm"; import { Effect, Option } from "effect"; -import { Database, type DatabaseError } from "../Database.ts"; +import { Database } from "../Database.ts"; import { FoldersPolicy } from "./FoldersPolicy.ts"; import { FoldersRepo } from "./FoldersRepo.ts"; diff --git a/packages/web-backend/src/Http/Errors.ts b/packages/web-backend/src/Http/Errors.ts new file mode 100644 index 0000000000..f15bd1f9d0 --- /dev/null +++ b/packages/web-backend/src/Http/Errors.ts @@ -0,0 +1,14 @@ +import { DatabaseError, Http, S3Error } from "@cap/web-domain"; +import { Effect, Schema } from "effect"; + +export const handleDomainError = (e: Effect.Effect) => + e.pipe( + Effect.catchIf( + (e) => Schema.is(DatabaseError)(e), + () => new Http.InternalServerError({ cause: "database" }), + ), + Effect.catchIf( + (e) => Schema.is(S3Error)(e), + () => new Http.InternalServerError({ cause: "database" }), + ), + ); diff --git a/packages/web-backend/src/Http/Live.ts b/packages/web-backend/src/Http/Live.ts new file mode 100644 index 0000000000..0ed3b62272 --- /dev/null +++ b/packages/web-backend/src/Http/Live.ts @@ -0,0 +1,9 @@ +import { Http } from "@cap/web-domain"; +import { HttpApiBuilder } from "@effect/platform"; +import { Layer } from "effect"; + +import { LoomHttpLive } from "../Loom/Http.ts"; + +export const HttpLive = HttpApiBuilder.api(Http.ApiContract).pipe( + Layer.provide(LoomHttpLive), +); diff --git a/packages/web-backend/src/Loom/Http.ts b/packages/web-backend/src/Loom/Http.ts new file mode 100644 index 0000000000..d702761a8d --- /dev/null +++ b/packages/web-backend/src/Loom/Http.ts @@ -0,0 +1,40 @@ +import { CurrentUser, Http, Policy, Video } from "@cap/web-domain"; +import { HttpApiBuilder } from "@effect/platform"; +import { Effect } from "effect"; + +import { handleDomainError } from "../Http/Errors.ts"; +import { OrganisationsPolicy } from "../Organisations/OrganisationsPolicy.ts"; +import * as Workflows from "../Workflows.ts"; + +export const LoomHttpLive = HttpApiBuilder.group( + Http.ApiContract, + "loom", + (handlers) => + Effect.gen(function* () { + const workflows = yield* Workflows.RpcClient; + const orgPolicy = yield* OrganisationsPolicy; + + return handlers.handle("importVideo", ({ payload }) => + Effect.gen(function* () { + const user = yield* CurrentUser; + + const result = yield* workflows + .LoomImportVideo({ + cap: { userId: user.id, orgId: user.activeOrganizationId }, + loom: payload.loom, + }) + .pipe( + Effect.catchTag( + "RpcClientError", + () => new Http.InternalServerError({ cause: "unknown" }), + ), + ); + + return { videoId: result.videoId }; + }).pipe( + Policy.withPolicy(orgPolicy.isMember(payload.cap.orgId)), + handleDomainError, + ), + ); + }), +); diff --git a/packages/web-backend/src/Loom/ImportVideo.ts b/packages/web-backend/src/Loom/ImportVideo.ts index 4800f759f2..5fa85f543f 100644 --- a/packages/web-backend/src/Loom/ImportVideo.ts +++ b/packages/web-backend/src/Loom/ImportVideo.ts @@ -1,60 +1,60 @@ -import { Organisation, S3Bucket, User, Video } from "@cap/web-domain"; -import { Headers, HttpClient } from "@effect/platform"; -import { Activity, Workflow } from "@effect/workflow"; +import { DatabaseError, Loom, S3Bucket, S3Error, Video } from "@cap/web-domain"; +import { Headers, HttpClient, HttpClientResponse } from "@effect/platform"; +import { Activity } from "@effect/workflow"; import { Effect, Option, Schedule, Schema, Stream } from "effect"; -import { DatabaseError } from "../Database.ts"; import { S3Buckets } from "../S3Buckets/index.ts"; -import { S3Error } from "../S3Buckets/S3BucketAccess.ts"; import { Videos } from "../Videos/index.ts"; -export class LoomApiError extends Schema.TaggedError( - "LoomApiError", -)("LoomApiError", { cause: Schema.Unknown }) {} - -export const LoomImportVideoError = Schema.Union( - DatabaseError, - Video.NotFoundError, - S3Error, - LoomApiError, -); - -export const LoomImportVideo = Workflow.make({ - name: "LoomImportVideo", - payload: { - cap: Schema.Struct({ - userId: User.UserId, - orgId: Organisation.OrganisationId, - }), - loom: Schema.Struct({ - userId: User.UserId, - orgId: Organisation.OrganisationId, - video: Schema.Struct({ - id: Video.VideoId, - name: Schema.String, - downloadUrl: Schema.String, - width: Schema.OptionFromNullOr(Schema.Number), - height: Schema.OptionFromNullOr(Schema.Number), - fps: Schema.OptionFromNullOr(Schema.Number), - durationSecs: Schema.OptionFromNullOr(Schema.Number), - }), - }), - attempt: Schema.optional(Schema.Number), - }, - error: LoomImportVideoError, - idempotencyKey: (p) => - `${p.cap.userId}-${p.loom.orgId}-${p.loom.video.id}-${p.attempt ?? 0}`, -}); - -export const LoomImportVideoLive = LoomImportVideo.toLayer( +export const LoomImportVideoLive = Loom.ImportVideo.toLayer( Effect.fn(function* (payload) { const videos = yield* Videos; const s3Buckets = yield* S3Buckets; const http = yield* HttpClient.HttpClient; + yield* Effect.log("starting loom import workflow"); + + yield* Activity.make({ + name: "VerifyURLValid", + error: Schema.Union(Loom.VideoURLInvalidError, Loom.ExternalLoomError), + execute: http + .get(payload.loom.video.downloadUrl, { + headers: { range: "bytes=0-0" }, + }) + .pipe( + Effect.flatMap(HttpClientResponse.filterStatus((s) => s < 400)), + Effect.catchIf( + (e) => e._tag === "ResponseError", + ( + cause, + ): Effect.Effect< + never, + Loom.VideoURLInvalidError | Loom.ExternalLoomError + > => { + if (cause.response.status < 500) + return Effect.fail( + new Loom.VideoURLInvalidError({ + status: cause.response.status, + }), + ); + + return Effect.fail( + new Loom.ExternalLoomError({ cause: cause.response }), + ); + }, + ), + Effect.retry({ + schedule: Schedule.exponential("200 millis"), + times: 3, + while: (e) => e._tag !== "VideoURLInvalidError", + }), + Effect.catchTag("RequestError", Effect.die), + ), + }); + const { videoId, customBucketId } = yield* Activity.make({ name: "CreateVideoRecord", - error: LoomImportVideoError, + error: DatabaseError, success: Schema.Struct({ videoId: Video.VideoId, customBucketId: Schema.Option(S3Bucket.S3BucketId), @@ -62,9 +62,9 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( execute: Effect.gen(function* () { const loomVideo = payload.loom.video; - const [_, customBucket] = yield* s3Buckets - .getBucketAccessForUser(payload.cap.userId) - .pipe(Effect.catchAll(() => Effect.die(null))); + const [_, customBucket] = yield* s3Buckets.getBucketAccessForUser( + payload.cap.userId, + ); const customBucketId = Option.map(customBucket, (b) => b.id); @@ -74,9 +74,9 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( bucketId: customBucketId, source: { type: "desktopMP4" as const }, name: payload.loom.video.name, - duration: loomVideo.durationSecs, - width: loomVideo.width, - height: loomVideo.height, + duration: Option.fromNullable(loomVideo.durationSecs), + width: Option.fromNullable(loomVideo.width), + height: Option.fromNullable(loomVideo.height), public: true, metadata: Option.none(), folderId: Option.none(), @@ -88,7 +88,12 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( }); return { videoId, customBucketId }; - }), + }).pipe( + Effect.retry({ + schedule: Schedule.exponential("200 millis"), + times: 3, + }), + ), }); const source = new Video.Mp4Source({ @@ -96,16 +101,18 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( ownerId: payload.cap.userId, }); - const { fileKey } = yield* Activity.make({ + yield* Activity.make({ name: "DownloadVideo", - error: LoomImportVideoError, - success: Schema.Struct({ fileKey: Schema.String }), + error: Schema.Union(S3Error, DatabaseError, Loom.ExternalLoomError), execute: Effect.gen(function* () { const [s3Bucket] = yield* s3Buckets.getBucketAccess(customBucketId); + yield* Effect.log(payload.loom.video.downloadUrl); const resp = yield* http .get(payload.loom.video.downloadUrl) - .pipe(Effect.catchAll((cause) => new LoomApiError({ cause }))); + .pipe( + Effect.catchAll((cause) => new Loom.ExternalLoomError({ cause })), + ); const contentLength = Headers.get(resp.headers, "content-length").pipe( Option.map((v) => Number(v)), Option.getOrUndefined, @@ -133,7 +140,9 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( Effect.repeat( Effect.gen(function* () { const bytes = yield* Effect.succeed(downloadedBytes); - yield* Effect.log(`Downloaded ${bytes} bytes`); + yield* Effect.log( + `Downloaded ${bytes}/${contentLength} bytes`, + ); }), Schedule.forever.pipe(Schedule.delayed(() => "2 seconds")), ).pipe(Effect.delay("100 millis")), @@ -143,11 +152,9 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( yield* Effect.log( `Uploaded video for user '${payload.cap.userId}' at key '${key}'`, ); - - return { fileKey: key }; }), }); - return { fileKey, videoId }; + return { videoId }; }), ); diff --git a/packages/web-backend/src/Loom/index.ts b/packages/web-backend/src/Loom/index.ts index 3610e71386..49165269f7 100644 --- a/packages/web-backend/src/Loom/index.ts +++ b/packages/web-backend/src/Loom/index.ts @@ -1 +1 @@ -export { LoomImportVideo, LoomImportVideoLive } from "./ImportVideo.ts"; +export { LoomImportVideoLive } from "./ImportVideo.ts"; diff --git a/packages/web-backend/src/S3Buckets/S3BucketAccess.ts b/packages/web-backend/src/S3Buckets/S3BucketAccess.ts index d153d5739c..0e382d5064 100644 --- a/packages/web-backend/src/S3Buckets/S3BucketAccess.ts +++ b/packages/web-backend/src/S3Buckets/S3BucketAccess.ts @@ -5,15 +5,12 @@ import { type PresignedPostOptions, } from "@aws-sdk/s3-presigned-post"; import * as S3Presigner from "@aws-sdk/s3-request-presigner"; +import { S3Error } from "@cap/web-domain"; import type { RequestPresigningArguments } from "@smithy/types"; -import { type Cause, Effect, Option, Schema, Stream } from "effect"; +import { type Cause, Effect, Option, Stream } from "effect"; import { S3BucketClientProvider } from "./S3BucketClientProvider.ts"; -export class S3Error extends Schema.TaggedError()("S3Error", { - cause: Schema.Unknown, -}) {} - const wrapS3Promise = ( promise: Promise | Effect.Effect, Cause.UnknownException>, ): Effect.Effect => @@ -30,7 +27,7 @@ const wrapS3Promise = ( Effect.tryPromise({ try: () => cbResult, catch: (cause) => new S3Error({ cause }), - }), + }).pipe(Effect.tapError(Effect.logError)), ), ); }).pipe( diff --git a/packages/web-backend/src/S3Buckets/index.ts b/packages/web-backend/src/S3Buckets/index.ts index 3643374e13..ccb60f6957 100644 --- a/packages/web-backend/src/S3Buckets/index.ts +++ b/packages/web-backend/src/S3Buckets/index.ts @@ -1,7 +1,6 @@ import * as S3 from "@aws-sdk/client-s3"; import * as CloudFrontPresigner from "@aws-sdk/cloudfront-signer"; import { decrypt } from "@cap/database/crypto"; -import { S3_BUCKET_URL } from "@cap/utils"; import type { S3Bucket, User } from "@cap/web-domain"; import { awsCredentialsProvider } from "@vercel/functions/oidc"; import { Config, Effect, Layer, Option } from "effect"; @@ -25,15 +24,21 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { Config.option, ), region: yield* Config.string("CAP_AWS_REGION"), - credentials: yield* Config.string("CAP_AWS_ACCESS_KEY").pipe( - Effect.zip(Config.string("CAP_AWS_SECRET_KEY")), - Effect.map(([accessKeyId, secretAccessKey]) => ({ - accessKeyId, - secretAccessKey, - })), - Effect.catchAll(() => - Config.string("VERCEL_AWS_ROLE_ARN").pipe( - Effect.map((arn) => awsCredentialsProvider({ roleArn: arn })), + credentials: Option.getOrUndefined( + yield* Config.option( + Config.all([ + Config.string("CAP_AWS_ACCESS_KEY"), + Config.string("CAP_AWS_SECRET_KEY"), + ]).pipe( + Config.map(([accessKeyId, secretAccessKey]) => ({ + accessKeyId, + secretAccessKey, + })), + Config.orElse(() => + Config.string("VERCEL_AWS_ROLE_ARN").pipe( + Config.map((arn) => awsCredentialsProvider({ roleArn: arn })), + ), + ), ), ), ), @@ -81,6 +86,7 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { distributionId: Config.string("CAP_CLOUDFRONT_DISTRIBUTION_ID"), keypairId: Config.string("CLOUDFRONT_KEYPAIR_ID"), privateKey: Config.string("CLOUDFRONT_KEYPAIR_PRIVATE_KEY"), + bucketUrl: Config.string("CAP_AWS_BUCKET_URL"), }).pipe( Effect.match({ onSuccess: (v) => v, @@ -95,7 +101,7 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { Effect.succeed({ ...s3, getSignedObjectUrl: (key) => { - const url = `${S3_BUCKET_URL}/${key}`; + const url = `${cloudfrontEnvs.bucketUrl}/${key}`; const expires = Math.floor((Date.now() + 3600 * 1000) / 1000); const policy = { @@ -177,11 +183,13 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { getBucketAccessForUser: Effect.fn("S3Buckets.getProviderForUser")( function* (userId: User.UserId) { - const customBucket = yield* repo + return yield* repo .getForUser(userId) - .pipe(Effect.option, Effect.map(Option.flatten)); - - return yield* getBucketAccess(customBucket); + .pipe( + Effect.option, + Effect.map(Option.flatten), + Effect.flatMap(getBucketAccess), + ); }, ), }; diff --git a/packages/web-backend/src/Workflows.ts b/packages/web-backend/src/Workflows.ts index 33b6c83139..2a2a469f9b 100644 --- a/packages/web-backend/src/Workflows.ts +++ b/packages/web-backend/src/Workflows.ts @@ -1,11 +1,12 @@ +import { Loom } from "@cap/web-domain"; import { HttpApi, type HttpApiClient } from "@effect/platform"; import * as Rpc from "@effect/rpc"; import { WorkflowProxy, WorkflowProxyServer } from "@effect/workflow"; import { Context, Layer } from "effect"; -import { LoomImportVideo, LoomImportVideoLive } from "./Loom/index.ts"; +import { LoomImportVideoLive } from "./Loom/index.ts"; -export const Workflows = [LoomImportVideo] as const; +export const Workflows = [Loom.ImportVideo] as const; export const RpcGroup = WorkflowProxy.toRpcGroup(Workflows); export const RpcSerialization = Rpc.RpcSerialization.layerJson; diff --git a/packages/web-backend/src/index.ts b/packages/web-backend/src/index.ts index 7a1b9449af..fca94d4440 100644 --- a/packages/web-backend/src/index.ts +++ b/packages/web-backend/src/index.ts @@ -1,6 +1,7 @@ export * from "./Auth.ts"; export * from "./Database.ts"; export { Folders } from "./Folders/index.ts"; +export { HttpLive } from "./Http/Live.ts"; export * from "./Loom/index.ts"; export { OrganisationsPolicy } from "./Organisations/OrganisationsPolicy.ts"; export * from "./Rpcs.ts"; diff --git a/packages/web-backend/tsdown.config.ts b/packages/web-backend/tsdown.config.ts new file mode 100644 index 0000000000..f111aa0fff --- /dev/null +++ b/packages/web-backend/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/web-domain/package.json b/packages/web-domain/package.json index de5e6ca82b..ff8c8c8c72 100644 --- a/packages/web-domain/package.json +++ b/packages/web-domain/package.json @@ -4,10 +4,20 @@ "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", + "publishConfig": { + "main": "./dist/index.js" + }, + "scripts": { + "build": "tsdown", + "generate-openapi": "node scripts/generate-openapi.ts" + }, "dependencies": { "@effect/platform": "^0.91.1", "@effect/rpc": "^0.70.0", "@effect/workflow": "^0.10.0", "effect": "^3.17.14" + }, + "devDependencies": { + "@effect/platform-node": "^0.96.1" } } diff --git a/packages/web-domain/scripts/generate-openapi.ts b/packages/web-domain/scripts/generate-openapi.ts new file mode 100644 index 0000000000..b3eb9d56eb --- /dev/null +++ b/packages/web-domain/scripts/generate-openapi.ts @@ -0,0 +1,16 @@ +import { FileSystem, OpenApi } from "@effect/platform"; +import { NodeContext, NodeRuntime } from "@effect/platform-node"; +import { Effect } from "effect"; + +import { ApiContract } from "../src/Http/index.ts"; + +Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + + const spec = OpenApi.fromApi(ApiContract); + + yield* fs.writeFileString( + process.argv[2] ?? "openapi.json", + JSON.stringify(spec, null, 2), + ); +}).pipe(Effect.provide(NodeContext.layer), NodeRuntime.runMain); diff --git a/packages/web-domain/src/Database.ts b/packages/web-domain/src/Database.ts new file mode 100644 index 0000000000..987c992195 --- /dev/null +++ b/packages/web-domain/src/Database.ts @@ -0,0 +1,6 @@ +import { Schema } from "effect"; + +export class DatabaseError extends Schema.TaggedError()( + "DatabaseError", + { cause: Schema.Unknown }, +) {} diff --git a/packages/web-domain/src/Http/Api.ts b/packages/web-domain/src/Http/Api.ts new file mode 100644 index 0000000000..e62832f9d4 --- /dev/null +++ b/packages/web-domain/src/Http/Api.ts @@ -0,0 +1,12 @@ +import { HttpApi, OpenApi } from "@effect/platform"; +import { LoomHttpApi } from "../Loom.ts"; + +export class ApiContract extends HttpApi.make("cap-web-api") + .add(LoomHttpApi.prefix("/loom")) + .annotateContext( + OpenApi.annotations({ + title: "Cap HTTP API", + description: "Internal API used by Cap Desktop and external services", + }), + ) + .prefix("/api") {} diff --git a/packages/web-domain/src/Http/Errors.ts b/packages/web-domain/src/Http/Errors.ts new file mode 100644 index 0000000000..60190aba41 --- /dev/null +++ b/packages/web-domain/src/Http/Errors.ts @@ -0,0 +1,8 @@ +import { HttpApiSchema } from "@effect/platform"; +import { Schema } from "effect"; + +export class InternalServerError extends Schema.TaggedError()( + "InternalServerError", + { cause: Schema.Literal("database", "s3", "unknown") }, + HttpApiSchema.annotations({ status: 500 }), +) {} diff --git a/packages/web-domain/src/Http/index.ts b/packages/web-domain/src/Http/index.ts new file mode 100644 index 0000000000..23558b1833 --- /dev/null +++ b/packages/web-domain/src/Http/index.ts @@ -0,0 +1,2 @@ +export * from "./Api.ts"; +export * from "./Errors.ts"; diff --git a/packages/web-domain/src/Loom.ts b/packages/web-domain/src/Loom.ts index 3fe3105b46..032f5a1520 100644 --- a/packages/web-domain/src/Loom.ts +++ b/packages/web-domain/src/Loom.ts @@ -1,44 +1,92 @@ +import { + HttpApiEndpoint, + HttpApiGroup, + HttpApiSchema, + OpenApi, +} from "@effect/platform"; import { Workflow } from "@effect/workflow"; import { Schema } from "effect"; + +import { HttpAuthMiddleware } from "./Authentication.ts"; +import { DatabaseError } from "./Database.ts"; +import { InternalServerError } from "./Http/Errors.ts"; import { OrganisationId } from "./Organisation.ts"; +import { PolicyDeniedError } from "./Policy.ts"; +import { S3Error } from "./S3Bucket.ts"; import { UserId } from "./User.ts"; import * as Video from "./Video.ts"; -class LoomApiError extends Schema.TaggedError("LoomApiError")( - "LoomApiError", +export class ExternalLoomError extends Schema.TaggedError()( + "ExternalLoomError", { cause: Schema.Unknown }, + HttpApiSchema.annotations({ status: 500 }), ) {} -const LoomImportVideoError = Schema.Union( - // DatabaseError, - Video.NotFoundError, - // S3Error, - LoomApiError, -); +export class VideoURLInvalidError extends Schema.TaggedError()( + "VideoURLInvalidError", + { status: Schema.Number }, + HttpApiSchema.annotations({ status: 404 }), +) {} -export const LoomImportVideo = Workflow.make({ +export const ImportVideoLoomData = Schema.Struct({ + userId: UserId, + orgId: OrganisationId, + video: Schema.Struct({ + id: Schema.String, + name: Schema.String, + downloadUrl: Schema.URL, + width: Schema.optional(Schema.Number), + height: Schema.optional(Schema.Number), + fps: Schema.optional(Schema.Number), + durationSecs: Schema.optional(Schema.Number), + }), +}); + +export const ImportVideo = Workflow.make({ name: "LoomImportVideo", payload: { cap: Schema.Struct({ userId: UserId, orgId: OrganisationId, }), - loom: Schema.Struct({ - userId: UserId, - orgId: OrganisationId, - video: Schema.Struct({ - id: Schema.String, - name: Schema.String, - downloadUrl: Schema.String, - width: Schema.OptionFromNullOr(Schema.Number), - height: Schema.OptionFromNullOr(Schema.Number), - fps: Schema.OptionFromNullOr(Schema.Number), - durationSecs: Schema.OptionFromNullOr(Schema.Number), - }), - }), + loom: ImportVideoLoomData, attempt: Schema.optional(Schema.Number), }, - error: LoomImportVideoError, + success: Schema.Struct({ + videoId: Video.VideoId, + }), + error: Schema.Union( + DatabaseError, + Video.NotFoundError, + S3Error, + ExternalLoomError, + VideoURLInvalidError, + ), idempotencyKey: (p) => `${p.cap.userId}-${p.loom.orgId}-${p.loom.video.id}-${p.attempt ?? 0}`, }); + +export class LoomHttpApi extends HttpApiGroup.make("loom") + .add( + HttpApiEndpoint.post("importVideo", "/video") + .setPayload( + Schema.Struct({ + cap: Schema.Struct({ orgId: OrganisationId }), + loom: ImportVideoLoomData, + }), + ) + .addSuccess(Schema.Struct({ videoId: Video.VideoId })) + .addError(VideoURLInvalidError) + .addError(InternalServerError) + .addError(PolicyDeniedError) + .addError(Video.NotFoundError) + .addError(ExternalLoomError), + ) + .middleware(HttpAuthMiddleware) + .annotateContext( + OpenApi.annotations({ + title: "Loom", + description: + "Endpoints to import Loom videos to Cap. Mostly used by the Loom importer extension.", + }), + ) {} diff --git a/packages/web-domain/src/Policy.ts b/packages/web-domain/src/Policy.ts index 04234359cf..05acb769b5 100644 --- a/packages/web-domain/src/Policy.ts +++ b/packages/web-domain/src/Policy.ts @@ -1,5 +1,6 @@ // shoutout https://lucas-barake.github.io/building-a-composable-policy-system/ +import { HttpApiSchema } from "@effect/platform"; import { type Brand, Context, Data, Effect, type Option, Schema } from "effect"; import type { NonEmptyReadonlyArray } from "effect/Array"; import { CurrentUser } from "./Authentication.ts"; @@ -19,6 +20,7 @@ export type PublicPolicy = Effect.Effect< export class PolicyDeniedError extends Schema.TaggedError()( "PolicyDenied", {}, + HttpApiSchema.annotations({ status: 403 }), ) {} /** diff --git a/packages/web-domain/src/S3Bucket.ts b/packages/web-domain/src/S3Bucket.ts index 93b06fad4c..c0dc494642 100644 --- a/packages/web-domain/src/S3Bucket.ts +++ b/packages/web-domain/src/S3Bucket.ts @@ -14,6 +14,10 @@ export class S3Bucket extends Schema.Class("S3Bucket")({ secretAccessKey: Schema.String, }) {} -export const Workflows = [S3Bucket] as const; +export const Workflows = [] as const; export const decodeSync = Schema.decodeSync(S3Bucket); + +export class S3Error extends Schema.TaggedError()("S3Error", { + cause: Schema.Unknown, +}) {} diff --git a/packages/web-domain/src/Video.ts b/packages/web-domain/src/Video.ts index 8da3c5b1f2..13b1a402ca 100644 --- a/packages/web-domain/src/Video.ts +++ b/packages/web-domain/src/Video.ts @@ -1,6 +1,6 @@ +import { HttpApiSchema } from "@effect/platform"; import { Rpc, RpcGroup } from "@effect/rpc"; import { Context, Effect, Option, Schema } from "effect"; - import { RpcAuthMiddleware } from "./Authentication.ts"; import { InternalError } from "./Errors.ts"; import { FolderId } from "./Folder.ts"; @@ -135,6 +135,7 @@ export const verifyPassword = (video: Video, password: Option.Option) => export class NotFoundError extends Schema.TaggedError()( "VideoNotFoundError", {}, + HttpApiSchema.annotations({ status: 404 }), ) {} export class VideoRpcs extends RpcGroup.make( diff --git a/packages/web-domain/src/index.ts b/packages/web-domain/src/index.ts index 8b7e01bd0e..560c124a52 100644 --- a/packages/web-domain/src/index.ts +++ b/packages/web-domain/src/index.ts @@ -1,11 +1,17 @@ export * from "./Authentication.ts"; export * as Comment from "./Comment.ts"; +export * from "./Database.ts"; +export * from "./Errors.ts"; export * from "./Errors.ts"; export * as Folder from "./Folder.ts"; +export * as Http from "./Http/index.ts"; +export * as Loom from "./Loom.ts"; export * as Organisation from "./Organisation.ts"; +export * from "./Organisation.ts"; export * as Policy from "./Policy.ts"; export { Rpcs } from "./Rpcs.ts"; export * as S3Bucket from "./S3Bucket.ts"; +export { S3Error } from "./S3Bucket.ts"; export * as Space from "./Space.ts"; export * as User from "./User.ts"; export * as Video from "./Video.ts"; diff --git a/packages/web-domain/tsconfig.json b/packages/web-domain/tsconfig.json index 5b71fafb5a..0f07a65057 100644 --- a/packages/web-domain/tsconfig.json +++ b/packages/web-domain/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../config/base.tsconfig.json", "exclude": ["node_modules", "dist"], - "include": ["src/**/*.ts", "src/**/*.tsx"], + "include": ["src/**/*.ts", "src/**/*.tsx", "scripts/*"], "compilerOptions": { "moduleResolution": "bundler", "composite": true, diff --git a/packages/web-domain/tsdown.config.ts b/packages/web-domain/tsdown.config.ts new file mode 100644 index 0000000000..f111aa0fff --- /dev/null +++ b/packages/web-domain/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7735b47070..3a67fc7ca6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - undici: 5.28.4 - importers: .: @@ -23,9 +20,9 @@ importers: dotenv-cli: specifier: latest version: 10.0.0 - prettier: - specifier: ^3.5.3 - version: 3.5.3 + tsdown: + specifier: ^0.15.6 + version: 0.15.6(typescript@5.8.3) turbo: specifier: ^2.3.4 version: 2.5.3 @@ -115,7 +112,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.4.2)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -202,7 +199,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -236,10 +233,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) vitest: specifier: ~2.1.9 version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) @@ -331,16 +328,16 @@ importers: version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3)) storybook-solidjs-vite: specifier: ^1.0.0-beta.2 - version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.4)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)) + version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.10.2 - version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) apps/tasks: dependencies: @@ -528,6 +525,9 @@ importers: '@octokit/rest': specifier: ^20.0.2 version: 20.1.2 + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 '@opentelemetry/exporter-trace-otlp-http': specifier: ^0.203.0 version: 0.203.0(@opentelemetry/api@1.9.0) @@ -603,6 +603,9 @@ importers: '@vercel/functions': specifier: ^3.1.0 version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) + '@vercel/otel': + specifier: ^2.0.1 + version: 2.0.1(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)) '@virtual-grid/react': specifier: ^2.0.3 version: 2.0.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -692,7 +695,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-contentlayer2: specifier: ^0.5.3 version: 0.5.8(acorn@8.15.0)(contentlayer2@0.5.8(acorn@8.15.0)(esbuild@0.25.5))(esbuild@0.25.5)(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -810,10 +813,10 @@ importers: version: 10.0.0(@babel/core@7.27.1)(webpack@5.101.3(esbuild@0.25.5)) eslint: specifier: ^9.30.1 - version: 9.30.1(jiti@2.4.2) + version: 9.30.1(jiti@2.6.1) eslint-config-next: specifier: 15.5.3 - version: 15.5.3(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + version: 15.5.3(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) postcss: specifier: ^8.4.23 version: 8.5.3 @@ -824,23 +827,7 @@ importers: specifier: ^5.8.3 version: 5.8.3 - apps/workflow-manager: - dependencies: - '@effect/platform-node': - specifier: ^0.96.1 - version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/sql-mysql2': - specifier: ^0.45.1 - version: 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - effect: - specifier: ^3.17.14 - version: 3.17.14 - devDependencies: - dotenv-cli: - specifier: ^10.0.0 - version: 10.0.0 - - apps/workflow-runner: + apps/web-cluster: dependencies: '@cap/web-backend': specifier: workspace:* @@ -850,7 +837,7 @@ importers: version: link:../../packages/web-domain '@effect/cluster': specifier: ^0.49.1 - version: 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + version: 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) '@effect/opentelemetry': specifier: ^0.56.1 version: 0.56.1(@effect/platform@0.91.1(effect@3.17.14))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.14) @@ -859,7 +846,13 @@ importers: version: 0.91.1(effect@3.17.14) '@effect/platform-node': specifier: ^0.96.1 - version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) + version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/platform-node-shared': + specifier: ^0.51.4 + version: 0.51.4(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/rpc': + specifier: ^0.70.0 + version: 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) '@effect/sql-mysql2': specifier: ^0.45.1 version: 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) @@ -875,7 +868,19 @@ importers: effect: specifier: ^3.17.14 version: 3.17.14 + rolldown: + specifier: 1.0.0-beta.42 + version: 1.0.0-beta.42 + tsdown: + specifier: ^0.15.6 + version: 0.15.6(typescript@5.8.3) + tsup: + specifier: ^8.5.0 + version: 8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1) devDependencies: + concurrently: + specifier: ^9.2.1 + version: 9.2.1 dotenv-cli: specifier: ^10.0.0 version: 10.0.0 @@ -885,6 +890,9 @@ importers: '@pulumi/github': specifier: ^6.7.0 version: 6.7.2(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': + specifier: ^3.201.0 + version: 3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) '@pulumiverse/vercel': specifier: ^1.14.3 version: 1.14.3(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) @@ -893,20 +901,20 @@ importers: version: 3.25.76 devDependencies: sst: - specifier: 3.10.13 - version: 3.10.13 + specifier: 3.17.14 + version: 3.17.14 packages/config: dependencies: '@vitejs/plugin-react': specifier: ^4.0.3 - version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^4.2.0 - version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) zod: specifier: ^3 version: 3.25.76 @@ -994,7 +1002,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-email: specifier: ^4.0.16 version: 4.0.16(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1133,7 +1141,7 @@ importers: version: 19.1.9(@types/react@19.1.13) '@vitejs/plugin-react': specifier: ^4.0.3 - version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) autoprefixer: specifier: ^10.4.16 version: 10.4.21(postcss@8.5.3) @@ -1175,10 +1183,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) packages/ui-solid: dependencies: @@ -1230,7 +1238,7 @@ importers: version: 0.18.6(rollup@4.40.2) unplugin-fonts: specifier: ^1.1.1 - version: 1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) unplugin-icons: specifier: ^0.19.2 version: 0.19.3 @@ -1358,6 +1366,10 @@ importers: effect: specifier: ^3.17.14 version: 3.17.14 + devDependencies: + '@effect/platform-node': + specifier: ^0.96.1 + version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) packages: @@ -2180,6 +2192,15 @@ packages: '@effect/sql': ^0.44.2 effect: ^3.17.13 + '@effect/platform-node-shared@0.51.4': + resolution: {integrity: sha512-xElU9+cNPa1BnUHAZ3sVVanuuKof8oWQhK7rbyHNqgWM7CZTjv7x9VMDs0X05+1OcTQnnW3E+SrZKIPCfcYlDQ==} + peerDependencies: + '@effect/cluster': ^0.50.3 + '@effect/platform': ^0.92.1 + '@effect/rpc': ^0.71.0 + '@effect/sql': ^0.46.0 + effect: ^3.18.2 + '@effect/platform-node@0.96.1': resolution: {integrity: sha512-4nfB/XRJJ246MCdI7klTE/aVvA9txfI83RnymS7pNyoG4CXUKELi87JrkrWFTtOlewzt5UMWpmqsFmm2qHxx3A==} peerDependencies: @@ -2225,6 +2246,9 @@ packages: '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} @@ -2234,6 +2258,9 @@ packages: '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -3806,6 +3833,9 @@ packages: '@napi-rs/wasm-runtime@0.2.9': resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} + '@napi-rs/wasm-runtime@1.0.6': + resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} + '@netlify/binary-info@1.0.0': resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} @@ -4328,14 +4358,13 @@ packages: resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.32.0': - resolution: {integrity: sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==} - engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.36.0': resolution: {integrity: sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==} engines: {node: '>=14'} + '@oxc-project/types@0.94.0': + resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -4499,9 +4528,9 @@ packages: '@pulumi/github@6.7.2': resolution: {integrity: sha512-dsaCLKQXqTVChE5gsowDoI7J3ZcN+WQ2zamFqHeYbSTJ2NJ06ENK+INkwbrUnEqtLA5t6lfOIu2F97Yz0+LsRQ==} - '@pulumi/pulumi@3.167.0': - resolution: {integrity: sha512-nqqG9ya86CO8eRpPSL34K0NWhQbH2hXAlVo+lCvi7I51nKFqaJITvfgfVEqwKU0g3KJspK8ZG0/1OZBRe0Dogg==} - engines: {node: '>=18'} + '@pulumi/pulumi@3.201.0': + resolution: {integrity: sha512-iLg3Z9lCxJ15N/3rfsPPW5J6NdzH4TcM5uz8v6q179C0SOCAMPHGnxovOpZldB5k689jT9alrw80gvL2VprD0g==} + engines: {node: '>=20'} peerDependencies: ts-node: '>= 7.0.1 < 12' typescript: '>= 3.8.3 < 6' @@ -4514,6 +4543,9 @@ packages: '@pulumiverse/vercel@1.14.3': resolution: {integrity: sha512-Wdq/vNPNWh/cjzv+VHCjT30gBBhrrmX5J8E8VlNJ8bQ5mkMfEZDPpHaY+6NTFIb6arF+KUGdIsUFsndT50pmeA==} + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + '@radix-ui/colors@3.0.0': resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} @@ -5255,6 +5287,92 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0 + '@rolldown/binding-android-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-W5ZKF3TP3bOWuBfotAGp+UGjxOkGV7jRmIRbBA7NFjggx7Oi6vOmGDqpHEIX7kDCiry1cnIsWQaxNvWbMdkvzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.42': + resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.42': + resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -5974,10 +6092,10 @@ packages: react-dom: optional: true - '@storybook/builder-vite@10.0.0-beta.9': - resolution: {integrity: sha512-R8nSDRWr9eFOF+Bi9+wfJA6jjXGcLCrbgBt2bLebzfXhCNmfHCMaqRG2ZaNdEV4u9KJyakKdzKEotvAkaPONUA==} + '@storybook/builder-vite@10.0.0-beta.10': + resolution: {integrity: sha512-Lr/nVrkZLzMBs1CIvIc0ddr2UyWRmqnoYalBLUKraGZUCOfCzpJ3ywzfj3lMhfOR4456Lld0X9SFd04DQFHDnQ==} peerDependencies: - storybook: ^10.0.0-beta.9 + storybook: ^10.0.0-beta.10 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/core@8.6.12': @@ -5988,12 +6106,12 @@ packages: prettier: optional: true - '@storybook/csf-plugin@10.0.0-beta.9': - resolution: {integrity: sha512-0PfoiNKNJGNaWZBc31sevMOfhzX0VqrrKqE98DCMyEvZLUPnKy4t7iCE5TNFH+rUd5D7MdVzwgAmJ+CdtlmHIQ==} + '@storybook/csf-plugin@10.0.0-beta.10': + resolution: {integrity: sha512-sKCnWOHU97799zj6RoZuFygJCKPPUmohYZsESPddWQm6tHckjmKp1k4ISvd7Z5MIBwiEPYCnppQDDH1mOG6SPw==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.0.0-beta.9 + storybook: ^10.0.0-beta.10 vite: '*' webpack: '*' peerDependenciesMeta: @@ -6449,6 +6567,9 @@ packages: resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} engines: {node: ^16.14.0 || >=18.0.0} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -6632,8 +6753,8 @@ packages: '@types/node@20.17.43': resolution: {integrity: sha512-DnDEcDUnVAUYSa7U03QvrXbj1MZj00xoyi/a3lRGkR/c7BFUnqv+OY9EUphMqXUKdZJEOmuzu2mm+LmCisnPow==} - '@types/node@20.19.17': - resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} + '@types/node@20.19.19': + resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} '@types/node@22.15.14': resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} @@ -6969,6 +7090,18 @@ packages: resolution: {integrity: sha512-XOoUcf/1VfGArUAfq0ELxk6TD7l4jGcrOsWjQibj4wYM74uNihzZ9gA46ywWegoqKWWdph4y5CKxGI9823deoA==} engines: {node: '>= 20'} + '@vercel/otel@2.0.1': + resolution: {integrity: sha512-eC8F8t9Ksn6xPBXBef7w2pMVcgjXoUOMJ3gnTs4Yh/zbKSIKfvX17GjyqCODwF9FdbiiPBxLsF8aQxFOtKyiEA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <2.0.0' + '@opentelemetry/api-logs': '>=0.200.0 <0.300.0' + '@opentelemetry/instrumentation': '>=0.200.0 <0.300.0' + '@opentelemetry/resources': '>=2.0.0 <3.0.0' + '@opentelemetry/sdk-logs': '>=0.200.0 <0.300.0' + '@opentelemetry/sdk-metrics': '>=2.0.0 <3.0.0' + '@opentelemetry/sdk-trace-base': '>=2.0.0 <3.0.0' + '@vinxi/listhen@1.5.6': resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} hasBin: true @@ -7266,6 +7399,10 @@ packages: resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} engines: {node: '>=14'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -7383,6 +7520,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.1.3: + resolution: {integrity: sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==} + engines: {node: '>=20.19.0'} + ast-module-types@5.0.0: resolution: {integrity: sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ==} engines: {node: '>=14'} @@ -7518,8 +7659,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.8.6: - resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} + baseline-browser-mapping@2.8.12: + resolution: {integrity: sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==} hasBin: true basic-auth@2.0.1: @@ -7553,6 +7694,9 @@ packages: birpc@0.2.14: resolution: {integrity: sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==} + birpc@2.6.1: + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -7595,8 +7739,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.26.2: - resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -7630,6 +7774,12 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + 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' + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -7702,6 +7852,9 @@ packages: caniuse-lite@1.0.30001743: resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + caniuse-lite@1.0.30001748: + resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} + canvas-confetti@1.9.3: resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} @@ -7958,6 +8111,11 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -8210,6 +8368,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decache@4.6.2: resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} @@ -8375,6 +8542,10 @@ packages: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -8532,6 +8703,15 @@ packages: sqlite3: optional: true + dts-resolver@2.1.2: + resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dub@0.64.0: resolution: {integrity: sha512-HJ/nYSinJpoqU94+wXwpZWS8S/QddkKFTPKQEPY7N3YYXQLk2t9TVDArKBfIdcjFpvmCltJ+awa8Ogjq0DOv7w==} hasBin: true @@ -8566,8 +8746,8 @@ packages: electron-to-chromium@1.5.150: resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==} - electron-to-chromium@1.5.223: - resolution: {integrity: sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==} + electron-to-chromium@1.5.231: + resolution: {integrity: sha512-cyl6vqZGkEBnz/PmvFHn/u9G/hbo+FF2CNAOXriG87QOeLsUdifCZ9UbHNscE9wGdrC8XstNMli0CbQnZQ+fkA==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -8585,6 +8765,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} @@ -9038,12 +9222,12 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.1: - resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} - eventsource@3.0.6: - resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==} + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} execa@5.1.1: @@ -9077,11 +9261,11 @@ packages: exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - express-rate-limit@7.5.0: - resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} engines: {node: '>= 16'} peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 + express: '>= 4.11' express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} @@ -9169,6 +9353,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -9239,6 +9432,9 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9442,6 +9638,9 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.11.0: + resolution: {integrity: sha512-sNsqf7XKQ38IawiVGPOoAlqZo1DMrO7TU+ZcZwi7yLl7/7S0JwmoBMKz/IkUPhSoXM0Ng3vT0yB1iCe5XavDeQ==} + gif.js@0.2.0: resolution: {integrity: sha512-bYxCoT8OZKmbxY8RN4qDiYuj4nrQDTzgLRcFVovyona1PTWNePzI4nzOmotnlOFIzTk/ZxAHtv+TfVLiBWj/hw==} @@ -9722,6 +9921,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ieee754@1.1.13: resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} @@ -10271,6 +10474,10 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jmespath@0.16.0: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} @@ -10287,6 +10494,10 @@ packages: jose@5.6.3: resolution: {integrity: sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -10460,6 +10671,10 @@ packages: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -10517,6 +10732,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -10604,6 +10822,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magicast@0.2.11: resolution: {integrity: sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==} @@ -11208,8 +11429,8 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} node-source-walk@6.0.2: resolution: {integrity: sha512-jn9vOIK/nfqoFCcpK89/VCVaLg1IHE6UVfDOzvqmANaJ/rWCTEdH8RZ1V278nv2jr36BJdyQXIAavBLXpzdlag==} @@ -11374,6 +11595,10 @@ packages: resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} engines: {node: ^10.13.0 || >=12.0.0} + oidc-token-hash@5.1.1: + resolution: {integrity: sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==} + engines: {node: ^10.13.0 || >=12.0.0} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -11587,9 +11812,8 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -11702,6 +11926,24 @@ packages: ts-node: optional: true + 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-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -11897,6 +12139,9 @@ packages: quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} @@ -11926,9 +12171,9 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -12282,6 +12527,30 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rolldown-plugin-dts@0.16.11: + resolution: {integrity: sha512-9IQDaPvPqTx3RjG2eQCK5GYZITo203BxKunGI80AGYicu1ySFTUyugicAaTZWRzFWh9DSnzkgNeMNbDWBbSs0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~3.1.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.42: + resolution: {integrity: sha512-xaPcckj+BbJhYLsv8gOqezc8EdMcKKe/gk8v47B0KPvgABDrQ0qmNPAiT/gh9n9Foe0bUkEv2qzj42uU5q1WRg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-inject@3.0.2: resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. @@ -12320,6 +12589,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -12355,8 +12627,8 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} scule@1.3.0: @@ -12458,6 +12730,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shiki@1.29.2: resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} @@ -12617,6 +12893,11 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead @@ -12650,33 +12931,48 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - sst-darwin-arm64@3.10.13: - resolution: {integrity: sha512-oM0mtqUQhEV779Qsb/8DYBS5hThj0TUqSYJrGjPea6aNN+SYYwuo82iM7gtG530gSqvLyi6V+0HBxjT9yUvCnw==} + sst-darwin-arm64@3.17.14: + resolution: {integrity: sha512-ItOltB8HH+8XSS7FnQfR/yqsJVMr+/HvibBCNOf57WnjuNqWGLB4db/ESCeYuaQqpjpUt5lrT9ezflWrf4O9Tg==} cpu: [arm64] os: [darwin] - sst-darwin-x64@3.10.13: - resolution: {integrity: sha512-7OOvbFRbUPxqGrh4vuLV1fuTkyTKkt+Thzc6fqG+fM8cL5P+YjNTg5ZAojC45JD1mSOAiXZIM5fLYW4ubDz5cA==} + sst-darwin-x64@3.17.14: + resolution: {integrity: sha512-J22TN1Fa878qUXsZtPybzrUbGd68p6CjXpmpqMVTyKJ9u/purkO2TiXtcFs7Ow4nr1RuCXFKo3eQ1fHDeO9YUg==} cpu: [x64] os: [darwin] - sst-linux-arm64@3.10.13: - resolution: {integrity: sha512-kYsXIioO4W9YV9zVMQLaFtAT+0QzXz8RFFucwUyhLWKX9dYD+etfhECYnijyzBfO1dj8cUTMoEI3eA4jTIgKOA==} + sst-linux-arm64@3.17.14: + resolution: {integrity: sha512-5wivBPIcRClHdWknp4z/lww7WyU27YkHEfF2lmt7dDS1XtM3VfTW1GdzQDsaox3wdIAmpKeYF5Wg79+cCRM/iA==} cpu: [arm64] os: [linux] - sst-linux-x64@3.10.13: - resolution: {integrity: sha512-bWatwYnSIDs64fCYF+6+Kt+lVKPYsTuRpEKRAxR9b+gIGtdnS0veeEGQ15XBPPr8ZEYlyTKWCQ4LwTSIi16CPw==} + sst-linux-x64@3.17.14: + resolution: {integrity: sha512-fAaTdD6eP3kuNzkGVdYu3MOuNJkpm1rOH5Um2R2gbjtHwZ0QwP8r0f1d/ghP2kHXdgJqiNwqBbZmOuRCqmCuRA==} cpu: [x64] os: [linux] - sst-linux-x86@3.10.13: - resolution: {integrity: sha512-eBOABQf941uy9GZgY77hj5a8dRqmJ3u+7ZYRrGspev306i3bcI/1w4Rkid7KFYVDcouNw4UuOhuLQfS8z3Lpzw==} + sst-linux-x86@3.17.14: + resolution: {integrity: sha512-I0/IQmBk/4o1FVzMov9Ombxab4GzGNxGoyC3HTqDCRwC4jS9mnv5eTTpOQ57kGYehSnzUcflDPLZtVmKCc19+Q==} cpu: [x86] os: [linux] - sst@3.10.13: - resolution: {integrity: sha512-L1EkuKFikAspTJrBxM5PPARfziEnj1U7006qIr4aTO9gtqUjhj2FVgj9CDMlOQyy1Fi+dpY4bSTeo9ksqsn1Gw==} + sst-win32-arm64@3.17.14: + resolution: {integrity: sha512-fueSfZqrGcPlhN0Lm5HpmDcCKr+JmMBBBjt38HlRU08ekY7lB05QAWNXgyBwXxLdXqVIFHCUaO2Mf4K+SMCv9A==} + cpu: [arm64] + os: [win32] + + sst-win32-x64@3.17.14: + resolution: {integrity: sha512-DO8U5Uno2iD1N+AgJPde4nTP8oIeBI/rTaW5yuxJSW8cMMzySi9vQ45wz9vyZDteoHzmSwtnoC8QhZMgs0gVnQ==} + cpu: [x64] + os: [win32] + + sst-win32-x86@3.17.14: + resolution: {integrity: sha512-Q+QKLERFU05wzYpcIhGX0XaLe+jsMuh95IQnrGDU8f82LM1KdWY+a62BaY1J4lbGpNrdZO22GXwIcqrFZOw8qA==} + cpu: [x86] + os: [win32] + + sst@3.17.14: + resolution: {integrity: sha512-HkyMnBj55DZjzgNFoHQ1XPr9vXi2UHWz3TkuboyCybpJQcR7vW4za8uDDDPivAcUyqQe2aP8pzuxL6+cAztqsg==} hasBin: true stable-hash@0.0.5: @@ -12705,6 +13001,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -12883,7 +13183,7 @@ packages: superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net supertest@6.3.4: resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} @@ -12940,8 +13240,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tapable@2.2.3: - resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-stream@2.2.0: @@ -13039,6 +13339,10 @@ packages: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -13072,6 +13376,10 @@ packages: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -13101,6 +13409,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} @@ -13111,6 +13422,10 @@ packages: peerDependencies: tslib: '2' + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + treeverse@3.0.0: resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -13199,6 +13514,28 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tsdown@0.15.6: + resolution: {integrity: sha512-W6++O3JeV9gm3JY6P/vLiC7zzTcJbZhQxXb+p3AvRMpDOPBIg82yXULyZCcwjsihY/bFG+Qw37HkezZbP7fzUg==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -13208,6 +13545,25 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + 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 + tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -13320,6 +13676,9 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -13345,6 +13704,14 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + unenv@1.10.0: resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} @@ -13912,6 +14279,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -13948,6 +14318,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + 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'} @@ -15140,7 +15513,7 @@ snapshots: '@babel/parser': 7.27.5 '@babel/template': 7.27.2 '@babel/types': 7.27.1 - debug: 4.4.1 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15152,7 +15525,7 @@ snapshots: '@babel/parser': 7.27.5 '@babel/template': 7.27.2 '@babel/types': 7.27.6 - debug: 4.4.1 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15165,7 +15538,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/types': 7.28.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15398,7 +15771,7 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 chokidar: 3.6.0 hash-wasm: 4.12.0 inflection: 3.0.2 @@ -15515,12 +15888,6 @@ snapshots: '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) effect: 3.17.14 - '@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14)': - dependencies: - '@effect/platform': 0.91.1(effect@3.17.14) - '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - effect: 3.17.14 - '@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1)': dependencies: '@effect/platform': 0.91.1(effect@3.17.14) @@ -15559,14 +15926,15 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform-node-shared@0.49.2(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)': + '@effect/platform-node-shared@0.51.4(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14)': dependencies: - '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) '@effect/platform': 0.91.1(effect@3.17.14) + '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) '@parcel/watcher': 2.5.1 effect: 3.17.14 multipasta: 0.2.7 - ws: 8.18.2 + ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -15580,20 +15948,7 @@ snapshots: '@effect/sql': 0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) effect: 3.17.14 mime: 3.0.0 - undici: 5.28.4 - ws: 8.18.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@effect/platform-node@0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)': - dependencies: - '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/platform': 0.91.1(effect@3.17.14) - '@effect/platform-node-shared': 0.49.2(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) - effect: 3.17.14 - mime: 3.0.0 - undici: 5.28.4 + undici: 7.16.0 ws: 8.18.2 transitivePeerDependencies: - bufferutil @@ -15639,6 +15994,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 @@ -15654,6 +16015,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -15677,7 +16043,7 @@ snapshots: '@esbuild-plugins/node-resolve@0.2.2(esbuild@0.25.5)': dependencies: '@types/resolve': 1.20.6 - debug: 4.4.1 + debug: 4.4.3 esbuild: 0.25.5 escape-string-regexp: 4.0.0 resolve: 1.22.10 @@ -16115,9 +16481,9 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.6.1))': dependencies: - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -16125,7 +16491,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -16143,7 +16509,7 @@ snapshots: '@eslint/eslintrc@0.4.3': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 7.3.1 globals: 13.24.0 ignore: 4.0.6 @@ -16171,7 +16537,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -16289,7 +16655,7 @@ snapshots: '@humanwhocodes/config-array@0.5.0': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.4.1 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -16316,7 +16682,7 @@ snapshots: '@antfu/install-pkg': 1.1.0 '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 - debug: 4.4.1 + debug: 4.4.3 globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.1.1 @@ -16696,7 +17062,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -16721,7 +17087,7 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.0': {} @@ -16807,7 +17173,7 @@ snapshots: '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.1 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0(encoding@0.1.13) @@ -16823,7 +17189,7 @@ snapshots: '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': dependencies: consola: 3.4.2 - detect-libc: 2.0.4 + detect-libc: 2.1.1 https-proxy-agent: 7.0.6 node-fetch: 2.7.0(encoding@0.1.13) nopt: 8.1.0 @@ -16890,11 +17256,11 @@ snapshots: dependencies: content-type: 1.0.5 cors: 2.8.5 - eventsource: 3.0.6 + eventsource: 3.0.7 express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) + express-rate-limit: 7.5.1(express@5.1.0) pkce-challenge: 4.1.0 - raw-body: 3.0.0 + raw-body: 3.0.1 zod: 3.25.76 zod-to-json-schema: 3.24.3(zod@3.25.76) transitivePeerDependencies: @@ -16973,6 +17339,13 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true + '@napi-rs/wasm-runtime@1.0.6': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@netlify/binary-info@1.0.0': {} '@netlify/blobs@9.1.0': @@ -17023,7 +17396,7 @@ snapshots: '@netlify/zip-it-and-ship-it@10.1.0(encoding@0.1.13)(rollup@4.40.2)': dependencies: - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.4 '@babel/types': 7.27.1 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 1.41.1 @@ -17489,7 +17862,7 @@ snapshots: '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 '@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': dependencies: @@ -17601,7 +17974,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -17641,7 +18014,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -17670,10 +18043,10 @@ snapshots: '@opentelemetry/semantic-conventions@1.28.0': {} - '@opentelemetry/semantic-conventions@1.32.0': {} - '@opentelemetry/semantic-conventions@1.36.0': {} + '@oxc-project/types@0.94.0': {} + '@panva/hkdf@1.2.1': {} '@paralleldrive/cuid2@2.2.2': @@ -17810,14 +18183,14 @@ snapshots: '@pulumi/github@6.7.2(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@pulumi/pulumi': 3.167.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript - '@pulumi/pulumi@3.167.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': + '@pulumi/pulumi@3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': dependencies: '@grpc/grpc-js': 1.13.3 '@logdna/tail-file': 2.2.0 @@ -17833,7 +18206,7 @@ snapshots: '@types/semver': 7.7.0 '@types/tmp': 0.2.6 execa: 5.1.1 - fdir: 6.4.4(picomatch@3.0.1) + fdir: 6.5.0(picomatch@3.0.1) google-protobuf: 3.21.4 got: 11.8.6 ini: 2.0.0 @@ -17843,9 +18216,9 @@ snapshots: picomatch: 3.0.1 pkg-dir: 7.0.0 require-from-string: 2.0.2 - semver: 7.7.1 + semver: 7.7.2 source-map-support: 0.5.21 - tmp: 0.2.3 + tmp: 0.2.5 upath: 1.2.0 optionalDependencies: ts-node: 10.9.2(@types/node@22.15.17)(typescript@5.8.3) @@ -17856,13 +18229,17 @@ snapshots: '@pulumiverse/vercel@1.14.3(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@pulumi/pulumi': 3.167.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + '@radix-ui/colors@3.0.0': {} '@radix-ui/number@1.1.1': {} @@ -18626,6 +19003,52 @@ snapshots: '@rive-app/canvas': 2.27.1 react: 19.1.1 + '@rolldown/binding-android-arm64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + dependencies: + '@napi-rs/wasm-runtime': 1.0.6 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.42': {} + '@rollup/plugin-alias@5.1.1(rollup@4.40.2)': optionalDependencies: rollup: 4.40.2 @@ -18635,10 +19058,10 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.40.2) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 magic-string: 0.30.17 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 4.40.2 @@ -19350,11 +19773,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.4.2)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: - '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -19365,8 +19788,8 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' - '@types/node' @@ -19493,12 +19916,12 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@storybook/builder-vite@10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4))': + '@storybook/builder-vite@10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: - '@storybook/csf-plugin': 10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)) + '@storybook/csf-plugin': 10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - esbuild - rollup @@ -19509,14 +19932,14 @@ snapshots: '@storybook/theming': 8.6.12(storybook@8.6.12(prettier@3.5.3)) better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.25.4 - esbuild-register: 3.6.0(esbuild@0.25.4) + esbuild: 0.25.5 + esbuild-register: 3.6.0(esbuild@0.25.5) jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.1 + semver: 7.7.2 util: 0.12.5 - ws: 8.18.2 + ws: 8.18.3 optionalDependencies: prettier: 3.5.3 transitivePeerDependencies: @@ -19525,15 +19948,15 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4))': + '@storybook/csf-plugin@10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: storybook: 8.6.12(prettier@3.5.3) unplugin: 2.3.10 optionalDependencies: - esbuild: 0.25.4 + esbuild: 0.25.5 rollup: 4.40.2 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - webpack: 5.101.3(esbuild@0.25.4) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + webpack: 5.101.3(esbuild@0.25.5) '@storybook/csf-plugin@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: @@ -19668,7 +20091,7 @@ snapshots: - csstype - utf-8-validate - '@tanstack/directive-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)': + '@tanstack/directive-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.1 @@ -19681,7 +20104,7 @@ snapshots: babel-dead-code-elimination: 1.0.10 dedent: 1.6.0 tiny-invariant: 1.3.3 - vite: 6.1.4(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.1.4(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -19748,12 +20171,12 @@ snapshots: '@tanstack/router-utils@1.115.0': dependencies: - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 ansis: 3.17.0 diff: 7.0.0 - '@tanstack/server-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)': + '@tanstack/server-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.1 @@ -19762,7 +20185,7 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.27.1 '@babel/types': 7.27.1 - '@tanstack/directive-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + '@tanstack/directive-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) babel-dead-code-elimination: 1.0.10 dedent: 1.6.0 tiny-invariant: 1.3.3 @@ -20009,6 +20432,11 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -20054,7 +20482,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.17.43 + '@types/node': 20.19.19 '@types/responselike': 1.0.3 '@types/canvas-confetti@1.9.0': {} @@ -20104,7 +20532,7 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree@1.0.7': {} @@ -20177,7 +20605,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.19 '@types/koa-compose@3.2.8': dependencies: @@ -20231,7 +20659,7 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@20.19.17': + '@types/node@20.19.19': dependencies: undici-types: 6.21.0 @@ -20282,7 +20710,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.19 '@types/semver@7.7.0': {} @@ -20336,7 +20764,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.19 optional: true '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': @@ -20376,15 +20804,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -20419,14 +20847,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.4.0(supports-color@5.5.0) - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -20466,12 +20894,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -20486,7 +20914,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.1 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.1 @@ -20537,13 +20965,13 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) transitivePeerDependencies: - supports-color - typescript @@ -20657,7 +21085,7 @@ snapshots: glob: 10.4.5 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.2 + picomatch: 4.0.3 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -20669,6 +21097,16 @@ snapshots: '@types/ms': 2.1.0 ms: 2.1.3 + '@vercel/otel@2.0.1(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@vinxi/listhen@1.5.6': dependencies: '@parcel/watcher': 2.5.1 @@ -20689,7 +21127,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -20700,18 +21138,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -20729,14 +21167,14 @@ snapshots: '@virtual-grid/shared@2.0.1': {} - '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20985,7 +21423,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -21051,6 +21489,8 @@ snapshots: ansis@3.17.0: {} + ansis@4.2.0: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -21230,6 +21670,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@2.1.3: + dependencies: + '@babel/parser': 7.28.4 + pathe: 2.0.3 + ast-module-types@5.0.0: {} ast-types-flow@0.0.8: {} @@ -21342,7 +21787,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 @@ -21397,7 +21842,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.8.6: {} + baseline-browser-mapping@2.8.12: {} basic-auth@2.0.1: dependencies: @@ -21428,6 +21873,8 @@ snapshots: birpc@0.2.14: {} + birpc@2.6.1: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -21457,12 +21904,12 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1 + debug: 4.4.3 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 qs: 6.14.0 - raw-body: 3.0.0 + raw-body: 3.0.1 type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -21504,13 +21951,13 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.5) - browserslist@4.26.2: + browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.6 - caniuse-lite: 1.0.30001743 - electron-to-chromium: 1.5.223 - node-releases: 2.0.21 - update-browserslist-db: 1.1.3(browserslist@4.26.2) + baseline-browser-mapping: 2.8.12 + caniuse-lite: 1.0.30001748 + electron-to-chromium: 1.5.231 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) bs-logger@0.2.6: dependencies: @@ -21544,6 +21991,11 @@ snapshots: builtin-modules@3.3.0: {} + bundle-require@5.1.0(esbuild@0.25.5): + dependencies: + esbuild: 0.25.5 + load-tsconfig: 0.2.5 + bytes@3.1.2: {} c12@3.0.3(magicast@0.3.5): @@ -21630,6 +22082,8 @@ snapshots: caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001748: {} + canvas-confetti@1.9.3: {} castable-video@1.1.7: @@ -21860,6 +22314,15 @@ snapshots: concat-map@0.0.1: {} + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + confbox@0.1.8: {} confbox@0.2.2: {} @@ -22060,10 +22523,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -22074,6 +22533,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decache@4.6.2: dependencies: callsite: 1.0.0 @@ -22153,13 +22616,13 @@ snapshots: detect-libc@1.0.3: {} - detect-libc@2.0.4: {} + detect-libc@2.0.4: + optional: true detect-libc@2.1.0: optional: true - detect-libc@2.1.1: - optional: true + detect-libc@2.1.1: {} detect-newline@3.1.0: {} @@ -22227,6 +22690,8 @@ snapshots: diff@7.0.0: {} + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -22304,6 +22769,8 @@ snapshots: '@planetscale/database': 1.19.0 mysql2: 3.14.1 + dts-resolver@2.1.2: {} + dub@0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76): dependencies: zod: 3.25.76 @@ -22333,7 +22800,7 @@ snapshots: electron-to-chromium@1.5.150: {} - electron-to-chromium@1.5.223: {} + electron-to-chromium@1.5.231: {} emittery@0.13.1: {} @@ -22345,6 +22812,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@2.0.0: {} + enabled@2.0.0: {} encodeurl@1.0.2: {} @@ -22381,7 +22850,7 @@ snapshots: enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.3 + tapable: 2.3.0 enquirer@2.4.1: dependencies: @@ -22536,11 +23005,18 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.4): dependencies: - debug: 4.4.1 + debug: 4.4.3 esbuild: 0.25.4 transitivePeerDependencies: - supports-color + esbuild-register@3.6.0(esbuild@0.25.5): + dependencies: + debug: 4.4.3 + esbuild: 0.25.5 + transitivePeerDependencies: + - supports-color + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -22758,19 +23234,19 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-next@15.5.3(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): + eslint-config-next@15.5.3(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 15.5.3 '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.6.1)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -22795,33 +23271,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@5.5.0) - eslint: 9.30.1(jiti@2.4.2) + eslint: 8.57.1 get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@5.5.0) - eslint: 8.57.1 + eslint: 9.30.1(jiti@2.6.1) get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -22847,14 +23323,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -22916,7 +23392,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -22925,9 +23401,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -22939,7 +23415,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -22964,7 +23440,7 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.30.1(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -22974,7 +23450,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -22995,9 +23471,9 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@2.6.1)): dependencies: - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: @@ -23021,7 +23497,7 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.6.1)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -23029,7 +23505,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -23174,9 +23650,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.30.1(jiti@2.4.2): + eslint@9.30.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 @@ -23212,7 +23688,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -23252,7 +23728,7 @@ snapshots: 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: @@ -23265,7 +23741,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -23276,7 +23752,7 @@ snapshots: estree-util-value-to-estree@3.3.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-visit@2.0.0: dependencies: @@ -23303,11 +23779,11 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.1: {} + eventsource-parser@3.0.6: {} - eventsource@3.0.6: + eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.1 + eventsource-parser: 3.0.6 execa@5.1.1: dependencies: @@ -23361,7 +23837,7 @@ snapshots: exponential-backoff@3.1.2: {} - express-rate-limit@7.5.0(express@5.1.0): + express-rate-limit@7.5.1(express@5.1.0): dependencies: express: 5.1.0 @@ -23409,7 +23885,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -23427,7 +23903,7 @@ 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: @@ -23443,7 +23919,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -23509,13 +23985,21 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.4(picomatch@3.0.1): + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fdir@6.4.4(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fdir@6.5.0(picomatch@3.0.1): optionalDependencies: picomatch: 3.0.1 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fecha@4.2.3: {} @@ -23564,12 +24048,12 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 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 @@ -23598,6 +24082,12 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.19 + mlly: 1.7.4 + rollup: 4.40.2 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -23790,6 +24280,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.11.0: + dependencies: + resolve-pkg-maps: 1.0.0 + gif.js@0.2.0: {} giget@2.0.0: @@ -23999,7 +24493,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 @@ -24034,7 +24528,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 @@ -24117,7 +24611,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -24139,14 +24633,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -24172,6 +24666,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.1.13: {} ieee754@1.2.1: {} @@ -24242,7 +24740,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.3 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -24412,7 +24910,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -24494,7 +24992,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -24519,7 +25017,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -24813,7 +25311,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -24848,7 +25346,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.19.17 + '@types/node': 20.19.19 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -24875,6 +25373,8 @@ snapshots: jiti@2.4.2: {} + jiti@2.6.1: {} + jmespath@0.16.0: {} jose@4.15.9: {} @@ -24885,6 +25385,8 @@ snapshots: jose@5.6.3: {} + joycon@3.1.1: {} + js-cookie@3.0.5: {} js-tokens@4.0.0: {} @@ -25059,6 +25561,8 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 + load-tsconfig@0.2.5: {} + loader-runner@4.3.0: {} local-pkg@0.5.1: @@ -25106,6 +25610,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} + lodash.truncate@4.4.2: {} lodash.union@4.6.0: {} @@ -25183,6 +25689,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.2.11: dependencies: '@babel/parser': 7.27.5 @@ -25443,7 +25953,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 @@ -25454,7 +25964,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 @@ -25471,7 +25981,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 @@ -25507,7 +26017,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 @@ -25571,7 +26081,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 @@ -25609,7 +26119,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -25690,7 +26200,7 @@ snapshots: exit-hook: 2.2.1 glob-to-regexp: 0.4.1 stoppable: 1.1.0 - undici: 5.28.4 + undici: 5.29.0 workerd: 1.20250408.0 ws: 8.18.0 youch: 3.3.4 @@ -25887,7 +26397,7 @@ snapshots: p-wait-for: 5.0.2 qs: 6.14.0 - next-auth@4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next-auth@4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 '@panva/hkdf': 1.2.1 @@ -25988,7 +26498,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 - esbuild: 0.25.4 + esbuild: 0.25.5 escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.0.5 @@ -26018,7 +26528,7 @@ snapshots: rollup: 4.40.2 rollup-plugin-visualizer: 5.14.0(rollup@4.40.2) scule: 1.3.0 - semver: 7.7.1 + semver: 7.7.2 serve-placeholder: 2.0.2 serve-static: 2.2.0 source-map: 0.7.4 @@ -26117,11 +26627,11 @@ snapshots: node-releases@2.0.19: {} - node-releases@2.0.21: {} + node-releases@2.0.23: {} node-source-walk@6.0.2: dependencies: - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.4 nodemailer@6.10.1: {} @@ -26314,6 +26824,8 @@ snapshots: oidc-token-hash@5.1.0: {} + oidc-token-hash@5.1.1: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -26373,7 +26885,7 @@ snapshots: jose: 4.15.9 lru-cache: 6.0.0 object-hash: 2.2.0 - oidc-token-hash: 5.1.0 + oidc-token-hash: 5.1.1 openid-client@5.7.1: dependencies: @@ -26569,7 +27081,7 @@ snapshots: path-to-regexp@6.3.0: {} - path-to-regexp@8.2.0: {} + path-to-regexp@8.3.0: {} path-type@4.0.0: {} @@ -26665,6 +27177,14 @@ snapshots: postcss: 8.5.3 ts-node: 10.9.2(@types/node@22.15.17)(typescript@5.8.3) + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.3)(yaml@2.8.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.6.1 + postcss: 8.5.3 + yaml: 2.8.1 + postcss-nested@6.2.0(postcss@8.5.3): dependencies: postcss: 8.5.3 @@ -26818,7 +27338,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.17.43 + '@types/node': 20.19.19 long: 5.3.2 proxy-addr@2.0.7: @@ -26857,6 +27377,8 @@ snapshots: quansync@0.2.10: {} + quansync@0.2.11: {} + querystring@0.2.0: {} queue-microtask@1.2.3: {} @@ -26880,11 +27402,11 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-body@3.0.0: + raw-body@3.0.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 rc9@2.1.2: @@ -27147,7 +27669,7 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 @@ -27163,14 +27685,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -27221,7 +27743,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: @@ -27285,7 +27807,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -27345,6 +27867,45 @@ snapshots: dependencies: glob: 7.2.3 + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.42)(typescript@5.8.3): + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + ast-kit: 2.1.3 + birpc: 2.6.1 + debug: 4.4.3 + dts-resolver: 2.1.2 + get-tsconfig: 4.11.0 + magic-string: 0.30.19 + rolldown: 1.0.0-beta.42 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.42: + dependencies: + '@oxc-project/types': 0.94.0 + '@rolldown/pluginutils': 1.0.0-beta.42 + ansis: 4.2.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-x64': 1.0.0-beta.42 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.42 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.42 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.42 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.42 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 + rollup-plugin-inject@3.0.2: dependencies: estree-walker: 0.6.1 @@ -27358,7 +27919,7 @@ snapshots: rollup-plugin-visualizer@5.14.0(rollup@4.40.2): dependencies: open: 8.4.2 - picomatch: 4.0.2 + picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: @@ -27396,11 +27957,11 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color @@ -27410,6 +27971,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -27445,7 +28010,7 @@ snapshots: scheduler@0.26.0: {} - schema-utils@4.3.2: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -27489,7 +28054,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -27499,7 +28064,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 @@ -27630,6 +28195,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + shiki@1.29.2: dependencies: '@shikijs/core': 1.29.2 @@ -27745,7 +28312,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -27840,6 +28407,10 @@ snapshots: source-map@0.7.4: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + sourcemap-codec@1.4.8: {} space-separated-tokens@2.0.2: {} @@ -27868,22 +28439,31 @@ snapshots: dependencies: minipass: 7.1.2 - sst-darwin-arm64@3.10.13: + sst-darwin-arm64@3.17.14: + optional: true + + sst-darwin-x64@3.17.14: + optional: true + + sst-linux-arm64@3.17.14: + optional: true + + sst-linux-x64@3.17.14: optional: true - sst-darwin-x64@3.10.13: + sst-linux-x86@3.17.14: optional: true - sst-linux-arm64@3.10.13: + sst-win32-arm64@3.17.14: optional: true - sst-linux-x64@3.10.13: + sst-win32-x64@3.17.14: optional: true - sst-linux-x86@3.10.13: + sst-win32-x86@3.17.14: optional: true - sst@3.10.13: + sst@3.17.14: dependencies: aws-sdk: 2.1692.0 aws4fetch: 1.0.18 @@ -27891,11 +28471,14 @@ snapshots: opencontrol: 0.0.6 openid-client: 5.6.4 optionalDependencies: - sst-darwin-arm64: 3.10.13 - sst-darwin-x64: 3.10.13 - sst-linux-arm64: 3.10.13 - sst-linux-x64: 3.10.13 - sst-linux-x86: 3.10.13 + sst-darwin-arm64: 3.17.14 + sst-darwin-x64: 3.17.14 + sst-linux-arm64: 3.17.14 + sst-linux-x64: 3.17.14 + sst-linux-x86: 3.17.14 + sst-win32-arm64: 3.17.14 + sst-win32-x64: 3.17.14 + sst-win32-x86: 3.17.14 transitivePeerDependencies: - supports-color @@ -27920,6 +28503,8 @@ snapshots: statuses@2.0.1: {} + statuses@2.0.2: {} + std-env@3.9.0: {} stdin-discarder@0.2.2: {} @@ -27931,16 +28516,16 @@ snapshots: stoppable@1.1.0: {} - storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.4)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)): + storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)): dependencies: - '@storybook/builder-vite': 10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)) + '@storybook/builder-vite': 10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) '@storybook/types': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.5.3)) magic-string: 0.30.17 solid-js: 1.9.6 storybook: 8.6.12(prettier@3.5.3) storybook-solidjs: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3)) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@storybook/test' - esbuild @@ -28126,7 +28711,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -28256,7 +28841,7 @@ snapshots: transitivePeerDependencies: - ts-node - tapable@2.2.3: {} + tapable@2.3.0: {} tar-stream@2.2.0: dependencies: @@ -28303,23 +28888,11 @@ snapshots: solid-js: 1.9.6 solid-use: 0.9.1(solid-js@1.9.6) - terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.101.3(esbuild@0.25.4)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.101.3(esbuild@0.25.4) - optionalDependencies: - esbuild: 0.25.4 - optional: true - terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.0 webpack: 5.101.3(esbuild@0.25.5) @@ -28376,8 +28949,13 @@ snapshots: tinyglobby@0.2.13: dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.4(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.0.2: {} @@ -28403,6 +28981,8 @@ snapshots: tmp@0.2.3: {} + tmp@0.2.5: {} + tmpl@1.0.5: {} to-regex-range@5.0.1: @@ -28423,6 +29003,10 @@ snapshots: tr46@0.0.3: {} + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -28431,6 +29015,8 @@ snapshots: dependencies: tslib: 2.8.1 + tree-kill@1.2.2: {} + treeverse@3.0.0: {} trim-lines@3.0.1: {} @@ -28525,12 +29111,65 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsdown@0.15.6(typescript@5.8.3): + dependencies: + ansis: 4.2.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.3 + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.42 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.42)(typescript@5.8.3) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig: 7.3.3 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + tslib@1.14.1: {} tslib@2.6.2: {} tslib@2.8.1: {} + tsup@8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.5) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.25.5 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.3)(yaml@2.8.1) + resolve-from: 5.0.0 + rollup: 4.40.2 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.3 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsutils@3.21.0(typescript@5.8.3): dependencies: tslib: 1.14.1 @@ -28539,7 +29178,7 @@ snapshots: tuf-js@2.2.1: dependencies: '@tufjs/models': 2.0.1 - debug: 4.4.1 + debug: 4.4.3 make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color @@ -28646,6 +29285,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + unconfig@7.3.3: + dependencies: + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.6.1 + quansync: 0.2.11 + uncrypto@0.1.3: {} unctx@2.4.1: @@ -28669,6 +29315,12 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@7.16.0: {} + unenv@1.10.0: dependencies: consola: 3.4.2 @@ -28743,11 +29395,11 @@ snapshots: magic-string: 0.30.17 mlly: 1.7.4 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 pkg-types: 2.1.0 scule: 1.3.0 strip-literal: 3.0.0 - tinyglobby: 0.2.13 + tinyglobby: 0.2.15 unplugin: 2.3.10 unplugin-utils: 0.2.4 @@ -28834,18 +29486,18 @@ snapshots: transitivePeerDependencies: - rollup - unplugin-fonts@1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + unplugin-fonts@1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: fast-glob: 3.3.3 unplugin: 2.0.0-beta.1 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) unplugin-icons@0.19.3: dependencies: '@antfu/install-pkg': 0.4.1 '@antfu/utils': 0.7.10 '@iconify/utils': 2.3.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) kolorist: 1.8.0 local-pkg: 0.5.1 unplugin: 1.16.1 @@ -28855,7 +29507,7 @@ snapshots: unplugin-utils@0.2.4: dependencies: pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 unplugin@1.16.1: dependencies: @@ -28877,7 +29529,7 @@ snapshots: unplugin@2.3.2: dependencies: acorn: 8.15.0 - picomatch: 4.0.2 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 unrs-resolver@1.7.2: @@ -28948,9 +29600,9 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.3(browserslist@4.26.2): + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -29061,7 +29713,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -29095,7 +29747,7 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(ioredis@5.6.1) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -29157,7 +29809,7 @@ snapshots: - supports-color - terser - vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: '@babel/core': 7.27.1 '@types/babel__core': 7.20.5 @@ -29165,31 +29817,31 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.6 solid-refresh: 0.6.3(solid-js@1.9.6) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.5.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: debug: 4.4.0(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript @@ -29204,7 +29856,7 @@ snapshots: fsevents: 2.3.3 terser: 5.44.0 - vite@6.1.4(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1): + vite@6.1.4(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.24.2 postcss: 8.5.3 @@ -29212,11 +29864,11 @@ snapshots: optionalDependencies: '@types/node': 22.15.17 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.6.1 terser: 5.44.0 yaml: 2.8.1 - vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1): + vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -29227,11 +29879,11 @@ snapshots: optionalDependencies: '@types/node': 20.17.43 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.6.1 terser: 5.44.0 yaml: 2.8.1 - vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1): + vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -29242,13 +29894,13 @@ snapshots: optionalDependencies: '@types/node': 22.15.17 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.6.1 terser: 5.44.0 yaml: 2.8.1 - vitefu@1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vitefu@1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vitest@2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0): dependencies: @@ -29260,7 +29912,7 @@ snapshots: '@vitest/spy': 2.1.9 '@vitest/utils': 2.1.9 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) expect-type: 1.2.1 magic-string: 0.30.17 pathe: 1.1.2 @@ -29319,45 +29971,14 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: {} webpack-sources@3.3.3: {} webpack-virtual-modules@0.6.2: {} - webpack@5.101.3(esbuild@0.25.4): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.2 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.101.3(esbuild@0.25.4)) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - optional: true - webpack@5.101.3(esbuild@0.25.5): dependencies: '@types/eslint-scope': 3.7.7 @@ -29368,7 +29989,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.2 + browserslist: 4.26.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -29380,8 +30001,8 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 + schema-utils: 4.3.3 + tapable: 2.3.0 terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)) watchpack: 2.4.4 webpack-sources: 3.3.3 @@ -29406,6 +30027,12 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + 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