diff --git a/.changeset/effect-v4-upgrade.md b/.changeset/effect-v4-upgrade.md new file mode 100644 index 0000000000..7b74797994 --- /dev/null +++ b/.changeset/effect-v4-upgrade.md @@ -0,0 +1,23 @@ +--- +"@uploadthing/shared": major +"uploadthing": major +"@example/backend-adapters-server": patch +"next-playground": patch +"next-playground-v6": patch +"@uploadthing/tsconfig": patch +--- + +feat!: upgrade to Effect v4 + +- `effect` is bumped from `3.21.0` to `4.0.0-beta.93`. Since `@effect/platform` + has been merged into the core `effect` package in v4, the separate + `@effect/platform` dependency is removed and all HTTP modules are now + imported from `effect/unstable/http`. +- Client-side code previously built on `effect/Micro` (which was removed in v4) + now uses the core `Effect` module, which is aggressively tree-shakeable in v4. +- The `uploadthing/effect-platform` adapter now returns a plain + `Effect` + handler that can be registered on an Effect v4 `HttpRouter` (e.g. via + `HttpRouter.add("*", "/api/uploadthing", handler)`). +- Public types that referenced Effect v3 concepts follow the v4 renames, e.g. + `logLevel` options are now typed as `LogLevel.LogLevel` string literals. diff --git a/.nvmrc b/.nvmrc index f3c67fcf74..836f191048 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.14 \ No newline at end of file +22.23 diff --git a/examples/backend-adapters/server/package.json b/examples/backend-adapters/server/package.json index 52aa618282..17a1aa3d60 100644 --- a/examples/backend-adapters/server/package.json +++ b/examples/backend-adapters/server/package.json @@ -13,15 +13,14 @@ "dev:effect": "NODE_ENV=development PORT=3003 tsx watch src/effect-platform.ts" }, "dependencies": { - "@effect/platform": "0.96.0", - "@effect/platform-node": "0.106.0", + "@effect/platform-node": "4.0.0-beta.93", "@elysiajs/cors": "^1.2.0", "@fastify/cors": "^10.0.1", "@hono/node-server": "^1.13.7", "@sinclair/typebox": "^0.34.13", "cors": "^2.8.5", "dotenv": "^16.4.5", - "effect": "3.21.0", + "effect": "4.0.0-beta.93", "elysia": "^1.2.9", "express": "^5.0.1", "fastify": "^5.2.0", diff --git a/examples/backend-adapters/server/src/effect-platform.ts b/examples/backend-adapters/server/src/effect-platform.ts index c3e991a336..ab6922885b 100644 --- a/examples/backend-adapters/server/src/effect-platform.ts +++ b/examples/backend-adapters/server/src/effect-platform.ts @@ -1,70 +1,52 @@ import "dotenv/config"; import { createServer } from "node:http"; +import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"; +import { Config, Effect, Layer, References } from "effect"; import { FetchHttpClient, - Headers, - HttpMiddleware, HttpRouter, HttpServer, - HttpServerRequest, HttpServerResponse, -} from "@effect/platform"; -import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"; -import { Config, Effect, Layer, Logger, LogLevel } from "effect"; +} from "effect/unstable/http"; import { createRouteHandler } from "uploadthing/effect-platform"; import { uploadRouter } from "./router"; -const uploadthingRouter = createRouteHandler({ +const uploadthingHandler = createRouteHandler({ router: uploadRouter, }); -/** - * Simple CORS middleware that allows everything - * Adjust to your needs. - */ -const cors = HttpMiddleware.make((app) => - Effect.gen(function* () { - const req = yield* HttpServerRequest.HttpServerRequest; - - const corsHeaders = { - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Methods": "*", - "Access-Control-Allow-Headers": "*", - }; - - if (req.method === "OPTIONS") { - return HttpServerResponse.empty({ - status: 204, - headers: Headers.fromInput(corsHeaders), - }); - } - - const response = yield* app; - - return response.pipe(HttpServerResponse.setHeaders(corsHeaders)); +const Routes = Layer.mergeAll( + HttpRouter.add("GET", "/api", HttpServerResponse.text("Hello from Effect")), + HttpRouter.add( + "*", + "/api/uploadthing", + uploadthingHandler.pipe(Effect.orDie), + ), + /** + * Simple CORS middleware that allows everything. + * Adjust to your needs. + */ + HttpRouter.cors({ + allowedOrigins: ["*"], + allowedMethods: ["*"], + allowedHeaders: ["*"], }), ); -const router = HttpRouter.empty.pipe( - HttpRouter.get("/api", HttpServerResponse.text("Hello from Effect")), - HttpRouter.mountApp("/api/uploadthing", uploadthingRouter), +const ServerLive = Layer.unwrap( + Effect.map(Config.port("PORT").pipe(Config.withDefault(3000)), (port) => + NodeHttpServer.layer(() => createServer(), { port }), + ), ); -const app = router.pipe( - cors, - HttpServer.serve(HttpMiddleware.logger), +const AppLive = HttpRouter.serve(Routes).pipe( HttpServer.withLogAddress, Layer.provide(FetchHttpClient.layer), + Layer.provide(ServerLive), + Layer.provide(Layer.succeed(References.MinimumLogLevel, "Debug")), ); -const Port = Config.integer("PORT").pipe(Config.withDefault(3000)); -const ServerLive = Layer.unwrapEffect( - Effect.map(Port, (port) => - NodeHttpServer.layer(() => createServer(), { port }), - ).pipe(Effect.provide(Logger.minimumLogLevel(LogLevel.Debug))), -); - -NodeRuntime.runMain(Layer.launch(Layer.provide(app, ServerLive))); +NodeRuntime.runMain(Layer.launch(AppLive)); diff --git a/examples/minimal-expo/tsconfig.json b/examples/minimal-expo/tsconfig.json index 8a583be5f3..9f064e69e5 100644 --- a/examples/minimal-expo/tsconfig.json +++ b/examples/minimal-expo/tsconfig.json @@ -3,6 +3,14 @@ "compilerOptions": { "strict": true, "jsx": "react-native", + /** + * Effect v4 only exposes its submodules (e.g. `effect/Schema`) through + * package.json `exports` (no `typesVersions` fallback), which the legacy + * `node` resolution from expo/tsconfig.base cannot follow. Metro resolves + * package exports since Expo SDK 53, so `bundler` matches runtime behavior. + */ + "module": "preserve", + "moduleResolution": "bundler", "paths": { "~/*": ["./*"] } diff --git a/packages/shared/package.json b/packages/shared/package.json index 10589e24da..b331796f61 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -42,11 +42,11 @@ }, "dependencies": { "@uploadthing/mime-types": "workspace:*", - "effect": "3.21.0", + "effect": "4.0.0-beta.93", "sqids": "^0.3.0" }, "devDependencies": { - "@effect/vitest": "0.29.0", + "@effect/vitest": "4.0.0-beta.93", "@types/react": "19.2.7", "@uploadthing/eslint-config": "workspace:", "@uploadthing/tsconfig": "workspace:", diff --git a/packages/shared/src/crypto.ts b/packages/shared/src/crypto.ts index 7f46ea4c4b..899350cb10 100644 --- a/packages/shared/src/crypto.ts +++ b/packages/shared/src/crypto.ts @@ -1,6 +1,6 @@ +import * as Effect from "effect/Effect"; import * as Encoding from "effect/Encoding"; import * as Hash from "effect/Hash"; -import * as Micro from "effect/Micro"; import * as Redacted from "effect/Redacted"; import SQIds, { defaultOptions } from "sqids"; @@ -32,8 +32,8 @@ export const signPayload = ( payload: string, secret: Redacted.Redacted, ) => - Micro.gen(function* () { - const signingKey = yield* Micro.tryPromise({ + Effect.gen(function* () { + const signingKey = yield* Effect.tryPromise({ try: () => crypto.subtle.importKey( "raw", @@ -50,8 +50,8 @@ export const signPayload = ( }), }); - const signature = yield* Micro.map( - Micro.tryPromise({ + const signature = yield* Effect.map( + Effect.tryPromise({ try: () => crypto.subtle.sign(algorithm, signingKey, encoder.encode(payload)), catch: (e) => new UploadThingError({ code: "BAD_REQUEST", cause: e }), @@ -60,30 +60,30 @@ export const signPayload = ( ); return `${signaturePrefix}${signature}`; - }).pipe(Micro.withTrace("signPayload")); + }).pipe(Effect.withSpan("signPayload")); export const verifySignature = ( payload: string, signature: string | null, secret: Redacted.Redacted, ) => - Micro.gen(function* () { + Effect.gen(function* () { const sig = signature?.slice(signaturePrefix.length); if (!sig) return false; const secretBytes = encoder.encode(Redacted.value(secret)); - const signingKey = yield* Micro.promise(() => + const signingKey = yield* Effect.promise(() => crypto.subtle.importKey("raw", secretBytes, algorithm, false, ["verify"]), ); - const sigBytes = yield* Micro.fromEither(Encoding.decodeHex(sig)); + const sigBytes = yield* Effect.fromResult(Encoding.decodeHex(sig)); const payloadBytes = encoder.encode(payload); - return yield* Micro.promise(() => + return yield* Effect.promise(() => crypto.subtle.verify(algorithm, signingKey, sigBytes, payloadBytes), ); }).pipe( - Micro.withTrace("verifySignature"), - Micro.orElseSucceed(() => false), + Effect.withSpan("verifySignature"), + Effect.orElseSucceed(() => false), ); export const generateKey = ( @@ -92,7 +92,7 @@ export const generateKey = ( getHashParts?: ExtractHashPartsFn, hashFn?: HashFn, ) => - Micro.sync(() => { + Effect.sync(() => { // Get the parts of which we should hash to constuct the key // This allows the user to customize the hashing algorithm // If they for example want to generate the same key for the @@ -120,11 +120,11 @@ export const generateKey = ( // Concatenate them return encodedAppId + encodedFileSeed; - }).pipe(Micro.withTrace("generateKey")); + }).pipe(Effect.withSpan("generateKey")); // Verify that the key was generated with the same appId export const verifyKey = (key: string, appId: string) => - Micro.sync(() => { + Effect.sync(() => { const alphabet = shuffle(defaultOptions.alphabet, appId); const expectedPrefix = new SQIds({ alphabet, minLength: 12 }).encode([ Math.abs(Hash.string(appId)), @@ -132,8 +132,8 @@ export const verifyKey = (key: string, appId: string) => return key.startsWith(expectedPrefix); }).pipe( - Micro.withTrace("verifyKey"), - Micro.orElseSucceed(() => false), + Effect.withSpan("verifyKey"), + Effect.orElseSucceed(() => false), ); export const generateSignedURL = ( @@ -144,7 +144,7 @@ export const generateSignedURL = ( data?: Record; }, ) => - Micro.gen(function* () { + Effect.gen(function* () { const parsedURL = new URL(url); const ttl = opts.ttlInSeconds @@ -166,4 +166,4 @@ export const generateSignedURL = ( parsedURL.searchParams.append("signature", signature); return parsedURL.href; - }).pipe(Micro.withTrace("generateSignedURL")); + }).pipe(Effect.withSpan("generateSignedURL")); diff --git a/packages/shared/src/effect.ts b/packages/shared/src/effect.ts index 330ac30cfd..90248e32e7 100644 --- a/packages/shared/src/effect.ts +++ b/packages/shared/src/effect.ts @@ -1,14 +1,13 @@ import * as Context from "effect/Context"; -import * as Micro from "effect/Micro"; +import * as Effect from "effect/Effect"; import { BadRequestError, FetchError, InvalidJsonError } from "./tagged-errors"; import type { FetchEsque, ResponseEsque } from "./types"; export class FetchContext - extends /** #__PURE__ */ Context.Tag("uploadthing/Fetch")< - FetchContext, - FetchEsque - >() {} + extends /** #__PURE__ */ Context.Service()( + "uploadthing/Fetch", + ) {} interface ResponseWithURL extends ResponseEsque { requestUrl: string; @@ -16,12 +15,12 @@ interface ResponseWithURL extends ResponseEsque { // Temporary Effect wrappers below. // Only for use in the browser. -// On the server, use `@effect/platform.HttpClient` instead. +// On the server, use `effect/unstable/http.HttpClient` instead. export const fetchEff = ( input: string | URL, init?: RequestInit, -): Micro.Micro => - Micro.flatMap(Micro.service(FetchContext), (fetch) => { +): Effect.Effect => + Effect.flatMap(FetchContext, (fetch) => { const headers = new Headers(init?.headers ?? []); const reqInfo = { @@ -31,7 +30,7 @@ export const fetchEff = ( headers: Object.fromEntries(headers), }; - return Micro.tryPromise({ + return Effect.tryPromise({ try: (signal) => fetch(input, { ...init, headers, signal }), catch: (error) => new FetchError({ @@ -48,23 +47,23 @@ export const fetchEff = ( }), }).pipe( // eslint-disable-next-line no-console - Micro.tapError((e) => Micro.sync(() => console.error(e.input))), - Micro.map((res) => Object.assign(res, { requestUrl: reqInfo.url })), - Micro.withTrace("fetch"), + Effect.tapError((e) => Effect.sync(() => console.error(e.input))), + Effect.map((res) => Object.assign(res, { requestUrl: reqInfo.url })), + Effect.withSpan("fetch"), ); }); export const parseResponseJson = ( res: ResponseWithURL, -): Micro.Micro => - Micro.tryPromise({ +): Effect.Effect => + Effect.tryPromise({ try: async () => { const json = await res.json(); return { json, ok: res.ok, status: res.status }; }, catch: (error) => new InvalidJsonError({ error, input: res.requestUrl }), }).pipe( - Micro.filterOrFail( + Effect.filterOrFail( ({ ok }) => ok, ({ json, status }) => new BadRequestError({ @@ -73,6 +72,6 @@ export const parseResponseJson = ( json, }), ), - Micro.map(({ json }) => json), - Micro.withTrace("parseJson"), + Effect.map(({ json }) => json), + Effect.withSpan("parseJson"), ); diff --git a/packages/shared/src/error.ts b/packages/shared/src/error.ts index 9ca1357a30..1e0d947690 100644 --- a/packages/shared/src/error.ts +++ b/packages/shared/src/error.ts @@ -1,4 +1,4 @@ -import * as Micro from "effect/Micro"; +import * as Data from "effect/Data"; import * as Predicate from "effect/Predicate"; import type { Json } from "./types"; @@ -59,7 +59,7 @@ export interface SerializedUploadThingError { export class UploadThingError< TShape extends Json = { message: string }, -> extends Micro.Error<{ message: string }> { +> extends Data.Error<{ message: string }> { readonly _tag = "UploadThingError"; readonly name = "UploadThingError"; @@ -81,7 +81,7 @@ export class UploadThingError< if (opts.cause instanceof Error) { this.cause = opts.cause; } else if ( - Predicate.isRecord(opts.cause) && + Predicate.isObject(opts.cause) && Predicate.isNumber(opts.cause.status) && Predicate.isString(opts.cause.statusText) ) { diff --git a/packages/shared/src/tagged-errors.ts b/packages/shared/src/tagged-errors.ts index eaef4f8669..63bb03458a 100644 --- a/packages/shared/src/tagged-errors.ts +++ b/packages/shared/src/tagged-errors.ts @@ -1,8 +1,8 @@ -import * as Micro from "effect/Micro"; +import * as Data from "effect/Data"; import * as Predicate from "effect/Predicate"; export class InvalidRouteConfigError - extends /** #__PURE__ */ Micro.TaggedError("InvalidRouteConfig")<{ + extends /** #__PURE__ */ Data.TaggedError("InvalidRouteConfig")<{ reason: string; }> { @@ -15,7 +15,7 @@ export class InvalidRouteConfigError } export class UnknownFileTypeError - extends /** #__PURE__ */ Micro.TaggedError("UnknownFileType")<{ + extends /** #__PURE__ */ Data.TaggedError("UnknownFileType")<{ reason: string; }> { @@ -26,7 +26,7 @@ export class UnknownFileTypeError } export class InvalidFileTypeError - extends /** #__PURE__ */ Micro.TaggedError("InvalidFileType")<{ + extends /** #__PURE__ */ Data.TaggedError("InvalidFileType")<{ reason: string; }> { @@ -37,7 +37,7 @@ export class InvalidFileTypeError } export class InvalidFileSizeError - extends /** #__PURE__ */ Micro.TaggedError("InvalidFileSize")<{ + extends /** #__PURE__ */ Data.TaggedError("InvalidFileSize")<{ reason: string; }> { @@ -48,7 +48,7 @@ export class InvalidFileSizeError } export class InvalidURLError - extends /** #__PURE__ */ Micro.TaggedError("InvalidURL")<{ + extends /** #__PURE__ */ Data.TaggedError("InvalidURL")<{ reason: string; }> { @@ -58,10 +58,10 @@ export class InvalidURLError } export class RetryError - extends /** #__PURE__ */ Micro.TaggedError("RetryError") {} + extends /** #__PURE__ */ Data.TaggedError("RetryError") {} export class FetchError - extends /** #__PURE__ */ Micro.TaggedError("FetchError")<{ + extends /** #__PURE__ */ Data.TaggedError("FetchError")<{ readonly input: { url: string; method: string | undefined; @@ -72,20 +72,20 @@ export class FetchError }> {} export class InvalidJsonError - extends /** #__PURE__ */ Micro.TaggedError("InvalidJson")<{ + extends /** #__PURE__ */ Data.TaggedError("InvalidJson")<{ readonly input: unknown; readonly error: unknown; }> {} export class BadRequestError - extends /** #__PURE__ */ Micro.TaggedError("BadRequestError")<{ + extends /** #__PURE__ */ Data.TaggedError("BadRequestError")<{ readonly message: string; readonly status: number; readonly json: T; }> { getMessage() { - if (Predicate.isRecord(this.json)) { + if (Predicate.isObject(this.json)) { if (typeof this.json.message === "string") return this.json.message; } return this.message; @@ -93,7 +93,7 @@ export class BadRequestError } export class UploadPausedError - extends /** #__PURE__ */ Micro.TaggedError("UploadAborted") {} + extends /** #__PURE__ */ Data.TaggedError("UploadAborted") {} export class UploadAbortedError - extends /** #__PURE__ */ Micro.TaggedError("UploadAborted") {} + extends /** #__PURE__ */ Data.TaggedError("UploadAborted") {} diff --git a/packages/shared/src/utils.ts b/packages/shared/src/utils.ts index 85cd5e5a84..456882a277 100644 --- a/packages/shared/src/utils.ts +++ b/packages/shared/src/utils.ts @@ -1,4 +1,4 @@ -import * as Micro from "effect/Micro"; +import * as Effect from "effect/Effect"; import { lookup } from "@uploadthing/mime-types"; @@ -63,10 +63,10 @@ export function getDefaultRouteConfigValues( export const fillInputRouteConfig = ( routeConfig: FileRouterInputConfig, -): Micro.Micro => { +): Effect.Effect => { // If array, apply defaults if (isRouteArray(routeConfig)) { - return Micro.succeed( + return Effect.succeed( routeConfig.reduce((acc, fileType) => { acc[fileType] = getDefaultRouteConfigValues(fileType); return acc; @@ -78,13 +78,13 @@ export const fillInputRouteConfig = ( const newConfig: ExpandedRouteConfig = {}; for (const key of objectKeys(routeConfig)) { const value = routeConfig[key]; - if (!value) return Micro.fail(new InvalidRouteConfigError(key)); + if (!value) return Effect.fail(new InvalidRouteConfigError(key)); newConfig[key] = { ...getDefaultRouteConfigValues(key), ...value }; } // we know that the config is valid, so we can stringify it and parse it back // this allows us to replace numbers with "safe" equivalents - return Micro.succeed( + return Effect.succeed( JSON.parse( JSON.stringify(newConfig, safeNumberReplacer), ) as ExpandedRouteConfig, @@ -98,21 +98,21 @@ export const fillInputRouteConfig = ( export const matchFileType = ( file: FileProperties, allowedTypes: FileRouterInputKey[], -): Micro.Micro< +): Effect.Effect< FileRouterInputKey, UnknownFileTypeError | InvalidFileTypeError > => { // Type might be "" if the browser doesn't recognize the mime type const mimeType = file.type || lookup(file.name); if (!mimeType) { - if (allowedTypes.includes("blob")) return Micro.succeed("blob"); - return Micro.fail(new UnknownFileTypeError(file.name)); + if (allowedTypes.includes("blob")) return Effect.succeed("blob"); + return Effect.fail(new UnknownFileTypeError(file.name)); } // If the user has specified a specific mime type, use that if (allowedTypes.some((type) => type.includes("/"))) { if (allowedTypes.includes(mimeType as FileRouterInputKey)) { - return Micro.succeed(mimeType as FileRouterInputKey); + return Effect.succeed(mimeType as FileRouterInputKey); } } @@ -126,20 +126,20 @@ export const matchFileType = ( if (!allowedTypes.includes(type)) { // Blob is a catch-all for any file type not explicitly supported if (allowedTypes.includes("blob")) { - return Micro.succeed("blob"); + return Effect.succeed("blob"); } else { - return Micro.fail(new InvalidFileTypeError(type, file.name)); + return Effect.fail(new InvalidFileTypeError(type, file.name)); } } - return Micro.succeed(type); + return Effect.succeed(type); }; export const FILESIZE_UNITS = ["B", "KB", "MB", "GB", "TB"] as const; export type FileSizeUnit = (typeof FILESIZE_UNITS)[number]; export const fileSizeToBytes = ( fileSize: FileSize, -): Micro.Micro => { +): Effect.Effect => { const regex = new RegExp( `^(\\d+)(\\.\\d+)?\\s*(${FILESIZE_UNITS.join("|")})$`, "i", @@ -148,13 +148,13 @@ export const fileSizeToBytes = ( // make sure the string is in the format of 123KB const match = fileSize.match(regex); if (!match?.[1] || !match[3]) { - return Micro.fail(new InvalidFileSizeError(fileSize)); + return Effect.fail(new InvalidFileSizeError(fileSize)); } const sizeValue = parseFloat(match[1]); const sizeUnit = match[3].toUpperCase() as FileSizeUnit; const bytes = sizeValue * Math.pow(1024, FILESIZE_UNITS.indexOf(sizeUnit)); - return Micro.succeed(Math.floor(bytes)); + return Effect.succeed(Math.floor(bytes)); }; export const bytesToFileSize = (bytes: number) => { @@ -241,11 +241,11 @@ export function warnIfInvalidPeerDependency( } export const getRequestUrl = (req: Request) => - Micro.gen(function* () { + Effect.gen(function* () { const host = req.headers.get("x-forwarded-host") ?? req.headers.get("host"); const proto = req.headers.get("x-forwarded-proto") ?? "https"; const protocol = proto.endsWith(":") ? proto : `${proto}:`; - const url = yield* Micro.try({ + const url = yield* Effect.try({ try: () => new URL(req.url, `${protocol}//${host}`), catch: () => new InvalidURLError(req.url), }); @@ -255,15 +255,15 @@ export const getRequestUrl = (req: Request) => export const getFullApiUrl = ( maybeUrl?: string, -): Micro.Micro => - Micro.gen(function* () { +): Effect.Effect => + Effect.gen(function* () { const base = (() => { if (typeof window !== "undefined") return window.location.origin; if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; return "http://localhost:3000"; })(); - const url = yield* Micro.try({ + const url = yield* Effect.try({ try: () => new URL(maybeUrl ?? "/api/uploadthing", base), catch: () => new InvalidURLError(maybeUrl ?? "/api/uploadthing"), }); @@ -283,7 +283,7 @@ export const getFullApiUrl = ( export const resolveMaybeUrlArg = (maybeUrl: string | URL | undefined): URL => { return maybeUrl instanceof URL ? maybeUrl - : Micro.runSync(getFullApiUrl(maybeUrl)); + : Effect.runSync(getFullApiUrl(maybeUrl)); }; export function parseTimeToSeconds(time: Time) { diff --git a/packages/uploadthing/package.json b/packages/uploadthing/package.json index e70b822993..72e4ac20a9 100644 --- a/packages/uploadthing/package.json +++ b/packages/uploadthing/package.json @@ -159,14 +159,13 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@effect/platform": "0.96.0", "@standard-schema/spec": "1.0.0-beta.4", "@uploadthing/mime-types": "workspace:*", "@uploadthing/shared": "workspace:*", - "effect": "3.21.0" + "effect": "4.0.0-beta.93" }, "devDependencies": { - "@effect/vitest": "0.29.0", + "@effect/vitest": "4.0.0-beta.93", "@remix-run/server-runtime": "^2.12.0", "@types/body-parser": "^1.19.5", "@types/express": "^5.0.0", diff --git a/packages/uploadthing/src/_internal/client-future.ts b/packages/uploadthing/src/_internal/client-future.ts index 1aa52bee1d..1af62602c2 100644 --- a/packages/uploadthing/src/_internal/client-future.ts +++ b/packages/uploadthing/src/_internal/client-future.ts @@ -1,6 +1,7 @@ import * as Arr from "effect/Array"; +import * as Data from "effect/Data"; +import * as Effect from "effect/Effect"; import type { LazyArg } from "effect/Function"; -import * as Micro from "effect/Micro"; import * as Predicate from "effect/Predicate"; import { fetchEff } from "@uploadthing/shared"; @@ -26,7 +27,7 @@ import { createUTReporter } from "./ut-reporter"; * Error indicating the XHR request failed * @public */ -export class XHRError extends Micro.TaggedError("XHRError")<{ +export class XHRError extends Data.TaggedError("XHRError")<{ message: string; xhr: unknown; }> {} @@ -41,7 +42,7 @@ export type NetworkError = XHRError | FetchError; * Error indicating the upload was rejected during upload to the storage provider * @public */ -export class UTStorageError extends Micro.TaggedError("UTStorageError")<{ +export class UTStorageError extends Data.TaggedError("UTStorageError")<{ message: string; response: unknown; }> {} @@ -50,7 +51,7 @@ export class UTStorageError extends Micro.TaggedError("UTStorageError")<{ * Error indicating the request to your UploadThing server failed * @public */ -export class UTServerError extends Micro.TaggedError( +export class UTServerError extends Data.TaggedError( "UTServerError", )<{ message: string; @@ -393,112 +394,120 @@ export interface UploadFileOptions { export function uploadFile( url: string, { file, files, XHRImpl, ...options }: UploadFileOptions, -): Micro.Micro | FailedFile, never, FetchContext> { +): Effect.Effect< + UploadedFile | FailedFile, + never, + FetchContext +> { return fetchEff(url, { method: "HEAD", headers: options.traceHeaders }).pipe( - Micro.map(({ headers }) => + Effect.map(({ headers }) => Number.parseInt(headers.get("x-ut-range-start") ?? "0"), ), - Micro.map((rangeStart) => transitionToUploading(file, rangeStart)), - Micro.tap((uploadingFile) => { - options.onEvent({ - type: "upload-started", - file: uploadingFile, - files, - }); - }), - Micro.flatMap((uploadingFile) => - Micro.async, XHRError | UTStorageError>((resume) => { - const xhr = new XHRImpl(); - xhr.open("PUT", url, true); - - const rangeStart = uploadingFile.sent; - xhr.setRequestHeader("Range", `bytes=${rangeStart}-`); - xhr.setRequestHeader("x-uploadthing-version", version); - xhr.setRequestHeader("b3", options.traceHeaders.b3); - xhr.setRequestHeader("traceparent", options.traceHeaders.traceparent); - xhr.responseType = "json"; - - xhr.upload.addEventListener("progress", (ev) => { - uploadingFile.sent = rangeStart + ev.loaded; - options.onEvent({ - type: "upload-progress", - file: uploadingFile, - files, - }); + Effect.map((rangeStart) => transitionToUploading(file, rangeStart)), + Effect.tap((uploadingFile) => + Effect.sync(() => { + options.onEvent({ + type: "upload-started", + file: uploadingFile, + files, }); - xhr.addEventListener("load", () => { - if ( - xhr.status > 299 || - Predicate.hasProperty(xhr.response, "error") - ) { + }), + ), + Effect.flatMap((uploadingFile) => + Effect.callback, XHRError | UTStorageError>( + (resume) => { + const xhr = new XHRImpl(); + xhr.open("PUT", url, true); + + const rangeStart = uploadingFile.sent; + xhr.setRequestHeader("Range", `bytes=${rangeStart}-`); + xhr.setRequestHeader("x-uploadthing-version", version); + xhr.setRequestHeader("b3", options.traceHeaders.b3); + xhr.setRequestHeader("traceparent", options.traceHeaders.traceparent); + xhr.responseType = "json"; + + xhr.upload.addEventListener("progress", (ev) => { + uploadingFile.sent = rangeStart + ev.loaded; + options.onEvent({ + type: "upload-progress", + file: uploadingFile, + files, + }); + }); + xhr.addEventListener("load", () => { + if ( + xhr.status > 299 || + Predicate.hasProperty(xhr.response, "error") + ) { + resume( + new UTStorageError({ + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + message: String(xhr.response.error), + response: xhr.response, + }), + ); + } else { + const uploadedFile = transitionToUploaded( + uploadingFile, + xhr.response as UploadPutResult, + ); + options.onEvent({ + type: "upload-completed", + file: uploadedFile, + files, + }); + resume(Effect.succeed(uploadedFile)); + } + }); + xhr.addEventListener("error", () => { resume( - new UTStorageError({ - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - message: String(xhr.response.error), - response: xhr.response, + new XHRError({ + message: `XHR failed ${xhr.status} ${xhr.statusText}`, + xhr: xhr, }), ); + }); + + const formData = new FormData(); + /** + * iOS/React Native FormData handling requires special attention: + * + * Issue: In React Native, iOS crashes with "attempt to insert nil object" when appending File directly + * to FormData. This happens because iOS tries to create NSDictionary from the file object and expects + * specific structure {uri, type, name}. + * + * + * Note: Don't try to use Blob or modify File object - iOS specifically needs plain object + * with these properties to create valid NSDictionary. + */ + if ("uri" in file) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + formData.append("file", { + uri: file.uri as string, + type: file.type, + name: file.name, + ...(rangeStart > 0 && { range: rangeStart }), + } as any); } else { - const uploadedFile = transitionToUploaded( - uploadingFile, - xhr.response as UploadPutResult, + formData.append( + "file", + rangeStart > 0 ? file.slice(rangeStart) : file, ); - options.onEvent({ - type: "upload-completed", - file: uploadedFile, - files, - }); - resume(Micro.succeed(uploadedFile)); } - }); - xhr.addEventListener("error", () => { - resume( - new XHRError({ - message: `XHR failed ${xhr.status} ${xhr.statusText}`, - xhr: xhr, - }), - ); - }); - - const formData = new FormData(); - /** - * iOS/React Native FormData handling requires special attention: - * - * Issue: In React Native, iOS crashes with "attempt to insert nil object" when appending File directly - * to FormData. This happens because iOS tries to create NSDictionary from the file object and expects - * specific structure {uri, type, name}. - * - * - * Note: Don't try to use Blob or modify File object - iOS specifically needs plain object - * with these properties to create valid NSDictionary. - */ - if ("uri" in file) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - formData.append("file", { - uri: file.uri as string, - type: file.type, - name: file.name, - ...(rangeStart > 0 && { range: rangeStart }), - } as any); - } else { - formData.append( - "file", - rangeStart > 0 ? file.slice(rangeStart) : file, - ); - } - xhr.send(formData); + xhr.send(formData); - return Micro.sync(() => xhr.abort()); - }), + return Effect.sync(() => xhr.abort()); + }, + ), ), - Micro.catchAll((error) => { + Effect.catch((error) => { const failedFile = transitionToFailed(file, error); options.onEvent({ type: "upload-failed", file: failedFile, files, }); - return Micro.succeed(failedFile); + return Effect.succeed(failedFile); }), ); } @@ -550,7 +559,7 @@ export function requestPresignedUrls< TEndpoint extends keyof TRouter, >( options: RequestPresignedUrlsOptions, -): Micro.Micro< +): Effect.Effect< ReadonlyArray, UTServerError, FetchContext @@ -572,7 +581,7 @@ export function requestPresignedUrls< lastModified: f.lastModified, })), }).pipe( - Micro.mapError( + Effect.mapError( (error) => new UTServerError({ message: error.message, @@ -612,19 +621,21 @@ export function uploadFiles< package: options.package, traceHeaders, }).pipe( - Micro.map(Arr.zip(pendingFiles)), - Micro.tap((pairs) => { - for (const [presigned, file] of pairs) { - file.key = presigned.key; - file.customId = presigned.customId; - } - options.onEvent({ - type: "presigned-received", - files: pendingFiles, - }); - }), - Micro.flatMap((pairs) => - Micro.forEach( + Effect.map(Arr.zip(pendingFiles)), + Effect.tap((pairs) => + Effect.sync(() => { + for (const [presigned, file] of pairs) { + file.key = presigned.key; + file.customId = presigned.customId; + } + options.onEvent({ + type: "presigned-received", + files: pendingFiles, + }); + }), + ), + Effect.flatMap((pairs) => + Effect.forEach( pairs, ([presigned, file]) => uploadFile(presigned.url, { diff --git a/packages/uploadthing/src/_internal/config.ts b/packages/uploadthing/src/_internal/config.ts index 88c758044a..39c26a9104 100644 --- a/packages/uploadthing/src/_internal/config.ts +++ b/packages/uploadthing/src/_internal/config.ts @@ -3,45 +3,26 @@ import * as ConfigProvider from "effect/ConfigProvider"; import * as Effect from "effect/Effect"; import * as S from "effect/Schema"; -import { - filterDefinedObjectValues, - UploadThingError, -} from "@uploadthing/shared"; +import { UploadThingError } from "@uploadthing/shared"; import { UploadThingToken } from "./shared-schemas"; export { version as UPLOADTHING_VERSION } from "../../package.json"; /** - * Merge in `import.meta.env` to the built-in `process.env` provider + * The built-in `ConfigProvider.fromEnv` provider merges `process.env` and + * `import.meta.env` out of the box. It snapshots the environment when it is + * created, so it's constructed lazily to pick up late `process.env` mutations. * Prefix keys with `UPLOADTHING_` so we can reference just the name. * @example * process.env.UPLOADTHING_TOKEN = "foo" * Config.string("token"); // Config<"foo"> */ -const envProvider = ConfigProvider.fromEnv().pipe( - ConfigProvider.orElse(() => - ConfigProvider.fromMap( - new Map( - Object.entries( - filterDefinedObjectValues( - // fuck this I give up. import.meta is a mistake, someone else can fix it - ( - import.meta as unknown as - | { env: Record } - | undefined - )?.env ?? {}, - ), - ), - ), - { - pathDelim: "_", - }, - ), - ), - ConfigProvider.nested("uploadthing"), - ConfigProvider.constantCase, -); +const envProvider = () => + ConfigProvider.fromEnv().pipe( + ConfigProvider.nested("uploadthing"), + ConfigProvider.constantCase, + ); /** * Config provider that merges the options from the object @@ -49,8 +30,8 @@ const envProvider = ConfigProvider.fromEnv().pipe( * @remarks Options take precedence over environment variables. */ export const configProvider = (options: unknown) => - ConfigProvider.fromJson(options ?? {}).pipe( - ConfigProvider.orElse(() => envProvider), + ConfigProvider.fromUnknown(options ?? {}).pipe( + ConfigProvider.orElse(envProvider()), ); export const IsDevelopment = Config.boolean("isDev").pipe( @@ -62,23 +43,35 @@ export const IsDevelopment = Config.boolean("isDev").pipe( Config.withDefault(false), ); -export const UTToken = S.Config("token", UploadThingToken).pipe( - Effect.catchTags({ - ConfigError: (e) => +export const UTToken = Config.string("token").pipe( + Effect.catchTag( + "ConfigError", + (e) => new UploadThingError({ - code: e._op === "InvalidData" ? "INVALID_SERVER_CONFIG" : "MISSING_ENV", + code: "MISSING_ENV", message: - e._op === "InvalidData" - ? "Invalid token. A token is a base64 encoded JSON object matching { apiKey: string, appId: string, regions: string[] }." - : "Missing token. Please set the `UPLOADTHING_TOKEN` environment variable or provide a token manually through config.", + "Missing token. Please set the `UPLOADTHING_TOKEN` environment variable or provide a token manually through config.", cause: e, }), - }), + ), + Effect.flatMap((rawToken) => + S.decodeUnknownEffect(UploadThingToken)(rawToken).pipe( + Effect.catchTag( + "SchemaError", + (e) => + new UploadThingError({ + code: "INVALID_SERVER_CONFIG", + message: + "Invalid token. A token is a base64 encoded JSON object matching { apiKey: string, appId: string, regions: string[] }.", + cause: e, + }), + ), + ), + ), ); -export const ApiUrl = Config.string("apiUrl").pipe( - Config.withDefault("https://api.uploadthing.com"), - Config.mapAttempt((_) => new URL(_)), +export const ApiUrl = Config.url("apiUrl").pipe( + Config.withDefault(new URL("https://api.uploadthing.com")), Config.map((url) => url.href.replace(/\/$/, "")), ); @@ -91,9 +84,8 @@ export const IngestUrl = Effect.fn(function* ( ? (regions.find((r) => r === preferredRegion) ?? regions[0]) : regions[0]; - return yield* Config.string("ingestUrl").pipe( - Config.withDefault(`https://${region}.${ingestHost}`), - Config.mapAttempt((_) => new URL(_)), + return yield* Config.url("ingestUrl").pipe( + Config.withDefault(new URL(`https://${region}.${ingestHost}`)), Config.map((url) => url.href.replace(/\/$/, "")), ); }); @@ -106,7 +98,7 @@ export const UfsHost = Config.string("ufsHost").pipe( Config.withDefault("ufs.sh"), ); -export const UfsAppIdLocation = Config.literal( - "subdomain", - "path", -)("ufsAppIdLocation").pipe(Config.withDefault("subdomain")); +export const UfsAppIdLocation = Config.literals( + ["subdomain", "path"], + "ufsAppIdLocation", +).pipe(Config.withDefault("subdomain")); diff --git a/packages/uploadthing/src/_internal/handler.ts b/packages/uploadthing/src/_internal/handler.ts index b4cc5fc355..428eee3dc6 100644 --- a/packages/uploadthing/src/_internal/handler.ts +++ b/packages/uploadthing/src/_internal/handler.ts @@ -1,18 +1,17 @@ -import * as HttpApp from "@effect/platform/HttpApp"; -import * as HttpBody from "@effect/platform/HttpBody"; -import * as HttpClient from "@effect/platform/HttpClient"; -import type * as HttpClientError from "@effect/platform/HttpClientError"; -import * as HttpClientRequest from "@effect/platform/HttpClientRequest"; -import * as HttpClientResponse from "@effect/platform/HttpClientResponse"; -import * as HttpRouter from "@effect/platform/HttpRouter"; -import * as HttpServerRequest from "@effect/platform/HttpServerRequest"; -import * as HttpServerResponse from "@effect/platform/HttpServerResponse"; import * as Config from "effect/Config"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; -import * as Match from "effect/Match"; +import * as Fiber from "effect/Fiber"; import * as Redacted from "effect/Redacted"; import * as Schema from "effect/Schema"; +import * as HttpBody from "effect/unstable/http/HttpBody"; +import * as HttpClient from "effect/unstable/http/HttpClient"; +import type * as HttpClientError from "effect/unstable/http/HttpClientError"; +import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest"; +import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse"; +import * as HttpEffect from "effect/unstable/http/HttpEffect"; +import * as HttpServerRequest from "effect/unstable/http/HttpServerRequest"; +import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse"; import { fillInputRouteConfig, @@ -47,9 +46,27 @@ import { import { UTFiles, UTRegion } from "./types"; import type { AnyFileRoute, UTEvents } from "./types"; -export class AdapterArguments extends Context.Tag( - "uploadthing/AdapterArguments", -)>() {} +export class AdapterArguments extends Context.Service< + AdapterArguments, + Record +>()("uploadthing/AdapterArguments") {} + +/** + * Ignore the failure of an effect, logging any errors that occur. + * Effect v4 removed `Effect.ignoreLogged`, this is a drop-in replacement. + */ +const ignoreLogged = ( + effect: Effect.Effect, +): Effect.Effect => + effect.pipe( + Effect.catchCause((cause) => + Effect.logDebug( + "An error was silently ignored because it is not anticipated to be useful", + cause, + ), + ), + Effect.asVoid, + ); /** * Create a request handler adapter for any framework or server library. @@ -76,27 +93,30 @@ export const makeAdapterHandler = < opts.config?.fetch as typeof globalThis.fetch, opts.config, ); - const handle = Effect.promise(() => - managed.runtime().then(HttpApp.toWebHandlerRuntime), - ); - const app = (...args: Args) => - Effect.map( - Effect.promise(() => - managed.runPromise(createRequestHandler(opts, beAdapter ?? "custom")), - ), - Effect.provideServiceEffect(AdapterArguments, makeAdapterArgs(...args)), + return async (...args: Args) => { + const context = await managed.context(); + const [app, request] = await managed.runPromise( + Effect.all([ + Effect.map( + createRequestHandler(opts, beAdapter ?? "custom"), + Effect.provideServiceEffect( + AdapterArguments, + makeAdapterArgs(...args), + ), + ), + toRequest(...args), + ]), ); - return async (...args: Args) => { - const result = await handle.pipe( - Effect.ap(app(...args)), - Effect.ap(toRequest(...args)), - Effect.withLogSpan("requestHandler"), - managed.runPromise, + const handler = HttpEffect.toWebHandler( + app.pipe( + Effect.withLogSpan("requestHandler"), + Effect.provideContext(context), + ), ); - return result; + return handler(request); }; }; @@ -132,12 +152,12 @@ export const createRequestHandler = ( "x-uploadthing-version": clientVersion, } = yield* HttpServerRequest.schemaHeaders( Schema.Struct({ - "uploadthing-hook": UploadThingHook.pipe(Schema.optional), + "uploadthing-hook": Schema.optional(UploadThingHook), "x-uploadthing-package": Schema.String.pipe( - Schema.optionalWith({ default: () => "unknown" }), + Schema.withDecodingDefault(Effect.succeed("unknown")), ), "x-uploadthing-version": Schema.String.pipe( - Schema.optionalWith({ default: () => pkgJson.version }), + Schema.withDecodingDefault(Effect.succeed(pkgJson.version)), ), }), ); @@ -149,12 +169,16 @@ export const createRequestHandler = ( ).pipe(Effect.annotateLogs({ clientVersion, serverVersion })); } - const { slug, actionType } = yield* HttpRouter.schemaParams( + const serverRequest = yield* HttpServerRequest.HttpServerRequest; + const requestUrl = yield* Effect.fromOption( + HttpServerRequest.toURL(serverRequest), + ); + const { slug, actionType } = yield* Schema.decodeUnknownEffect( Schema.Struct({ - actionType: ActionType.pipe(Schema.optional), + actionType: Schema.optional(ActionType), slug: Schema.String, }), - ); + )(HttpServerRequest.searchParamsFromURL(requestUrl)); const uploadable = opts.router[slug]; if (!uploadable) { @@ -166,26 +190,19 @@ export const createRequestHandler = ( }); } - const { body, fiber } = yield* Match.value({ - actionType, - uploadthingHook, - }).pipe( - Match.when({ actionType: "upload", uploadthingHook: undefined }, () => - handleUploadAction({ + const { body, fiber } = yield* actionType === "upload" && + uploadthingHook === undefined + ? handleUploadAction({ uploadable, fePackage, beAdapter, slug, - }), - ), - Match.when({ actionType: undefined, uploadthingHook: "callback" }, () => - handleCallbackRequest({ uploadable, fePackage, beAdapter }), - ), - Match.when({ actionType: undefined, uploadthingHook: "error" }, () => - handleErrorRequest({ uploadable }), - ), - Match.orElse(() => Effect.succeed({ body: null, fiber: null })), - ); + }) + : actionType === undefined && uploadthingHook === "callback" + ? handleCallbackRequest({ uploadable, fePackage, beAdapter }) + : actionType === undefined && uploadthingHook === "error" + ? handleErrorRequest({ uploadable }) + : Effect.succeed({ body: null, fiber: null }); if (fiber) { yield* Effect.logDebug("Running fiber as daemon").pipe( @@ -194,9 +211,9 @@ export const createRequestHandler = ( if (handleDaemon === "void") { // noop } else if (handleDaemon === "await") { - yield* fiber.await; + yield* Fiber.await(fiber); } else if (typeof handleDaemon === "function") { - handleDaemon(Effect.runPromise(fiber.await)); + handleDaemon(Effect.runPromise(Fiber.await(fiber))); } } @@ -207,7 +224,7 @@ export const createRequestHandler = ( return yield* HttpServerResponse.json(body); }).pipe( Effect.catchTags({ - ParseError: (e) => + SchemaError: (e) => HttpServerResponse.json( formatError( new UploadThingError({ @@ -227,14 +244,23 @@ export const createRequestHandler = ( }), ); - const appendResponseHeaders = Effect.map( - HttpServerResponse.setHeader("x-uploadthing-version", pkgJson.version), - ); - - return HttpRouter.empty.pipe( - HttpRouter.get("*", GET), - HttpRouter.post("*", POST), - HttpRouter.use(appendResponseHeaders), + return Effect.gen(function* () { + const request = yield* HttpServerRequest.HttpServerRequest; + switch (request.method) { + case "GET": { + return yield* GET; + } + case "POST": { + return yield* POST; + } + default: { + return HttpServerResponse.empty({ status: 404 }); + } + } + }).pipe( + Effect.map( + HttpServerResponse.setHeader("x-uploadthing-version", pkgJson.version), + ), ); }).pipe(Effect.withLogSpan("createRequestHandler")); @@ -292,7 +318,7 @@ const handleErrorRequest = (opts: { uploadable: AnyFileRoute }) => ).pipe(Effect.annotateLogs("error", error)), ), ) - .pipe(Effect.ignoreLogged, Effect.forkDaemon); + .pipe(ignoreLogged, Effect.forkDetach); return { body: null, @@ -328,7 +354,7 @@ const handleCallbackRequest = (opts: { status: Schema.String, file: UploadedFileData, origin: Schema.String, - metadata: Schema.Record({ key: Schema.String, value: Schema.Unknown }), + metadata: Schema.Record(Schema.String, Schema.Unknown), }), ); yield* Effect.logDebug("Handling callback request with input:").pipe( @@ -399,9 +425,8 @@ const handleCallbackRequest = (opts: { HttpClientResponse.schemaBodyJson(CallbackResultResponse), ), Effect.tap(Effect.log("Sent callback result to UploadThing")), - Effect.scoped, ); - }).pipe(Effect.ignoreLogged, Effect.forkDaemon); + }).pipe(ignoreLogged, Effect.forkDetach); return { body: null, fiber }; }).pipe(Effect.withLogSpan("handleCallbackRequest")); @@ -603,7 +628,9 @@ const handleUploadAction = (opts: { ); const serverReq = yield* HttpServerRequest.HttpServerRequest; - const requestUrl = yield* HttpServerRequest.toURL(serverReq); + const requestUrl = yield* Effect.fromOption( + HttpServerRequest.toURL(serverReq), + ); const devHookRequest = yield* Config.string("callbackUrl").pipe( Config.withDefault(requestUrl.origin + requestUrl.pathname), @@ -634,13 +661,13 @@ const handleUploadAction = (opts: { ); const handleDevStreamError = Effect.fn("handleDevStreamError")(function* ( - err: HttpClientError.ResponseError, + err: HttpClientError.HttpClientError, chunk: string, ) { - const schema = Schema.parseJson( + const schema = Schema.fromJsonString( Schema.Struct({ file: UploadedFileData }), ); - const parsedChunk = yield* Schema.decodeUnknown(schema)(chunk); + const parsedChunk = yield* Schema.decodeUnknownEffect(schema)(chunk); const key = parsedChunk.file.key; yield* Effect.logError( @@ -672,53 +699,50 @@ const handleUploadAction = (opts: { // Send metadata to UT server (non blocking as a daemon) // In dev, keep the stream open and simulate the callback requests as // files complete uploading - const fiber = yield* Effect.if(isDev, { - onTrue: () => - metadataRequest.pipe( - Effect.tapBoth({ - onSuccess: logHttpClientResponse("Registered metadata", { - mixin: "None", // We're reading the stream so can't call a body mixin - }), - onFailure: logHttpClientError("Failed to register metadata"), - }), - HttpClientResponse.stream, - handleJsonLineStream(MetadataFetchStreamPart, (chunk) => - devHookRequest.pipe( - HttpClientRequest.setHeaders({ - "uploadthing-hook": chunk.hook, - "x-uploadthing-signature": chunk.signature, + const fiber = yield* ( + isDev + ? metadataRequest.pipe( + Effect.tap( + logHttpClientResponse("Registered metadata", { + mixin: "None", // We're reading the stream so can't call a body mixin }), - HttpClientRequest.setBody( - HttpBody.text(chunk.payload, "application/json"), - ), - httpClient.execute, - Effect.tap( - logHttpClientResponse( - "Successfully forwarded callback request from dev stream", + ), + Effect.tapError(logHttpClientError("Failed to register metadata")), + HttpClientResponse.stream, + handleJsonLineStream(MetadataFetchStreamPart, (chunk) => + devHookRequest.pipe( + HttpClientRequest.setHeaders({ + "uploadthing-hook": chunk.hook, + "x-uploadthing-signature": chunk.signature, + }), + HttpClientRequest.setBody( + HttpBody.text(chunk.payload, "application/json"), ), + httpClient.execute, + Effect.tap( + logHttpClientResponse( + "Successfully forwarded callback request from dev stream", + ), + ), + Effect.catchTag("HttpClientError", (err) => + err.response !== undefined + ? handleDevStreamError(err, chunk.payload) + : Effect.fail(err), + ), + Effect.annotateLogs({ ...chunk }), + Effect.asVoid, + ignoreLogged, ), - Effect.catchTag("ResponseError", (err) => - handleDevStreamError(err, chunk.payload), - ), - Effect.annotateLogs(chunk), - Effect.asVoid, - Effect.ignoreLogged, - Effect.scoped, ), - ), - ), - onFalse: () => - metadataRequest.pipe( - Effect.tapBoth({ - onSuccess: logHttpClientResponse("Registered metadata"), - onFailure: logHttpClientError("Failed to register metadata"), - }), - Effect.flatMap( - HttpClientResponse.schemaBodyJson(MetadataFetchResponse), - ), - Effect.scoped, - ), - }).pipe(Effect.forkDaemon); + ) + : metadataRequest.pipe( + Effect.tap(logHttpClientResponse("Registered metadata")), + Effect.tapError(logHttpClientError("Failed to register metadata")), + Effect.flatMap( + HttpClientResponse.schemaBodyJson(MetadataFetchResponse), + ), + ) + ).pipe(Effect.forkDetach); const presigneds = presignedUrls.map((p, i) => ({ url: p.url, diff --git a/packages/uploadthing/src/_internal/jsonl.ts b/packages/uploadthing/src/_internal/jsonl.ts index 5a75693b4d..90e5a0f517 100644 --- a/packages/uploadthing/src/_internal/jsonl.ts +++ b/packages/uploadthing/src/_internal/jsonl.ts @@ -3,13 +3,15 @@ import * as S from "effect/Schema"; import * as Stream from "effect/Stream"; export const handleJsonLineStream = - ( - schema: S.Schema, - onChunk: (chunk: TChunk) => Effect.Effect, + ( + schema: TChunk, + onChunk: (chunk: TChunk["Type"]) => Effect.Effect, ) => (stream: Stream.Stream) => { let buf = ""; + const decodeChunks = S.decodeUnknownEffect(S.Array(schema)); + return stream.pipe( Stream.decodeText(), Stream.mapEffect((chunk) => @@ -40,7 +42,7 @@ export const handleJsonLineStream = return validChunks; }), ), - Stream.mapEffect(S.decodeUnknown(S.Array(schema))), + Stream.mapEffect((chunks) => decodeChunks(chunks)), Stream.mapEffect(Effect.forEach((part) => onChunk(part))), Stream.runDrain, Effect.withLogSpan("handleJsonLineStream"), diff --git a/packages/uploadthing/src/_internal/logger.ts b/packages/uploadthing/src/_internal/logger.ts index a7ea660007..5940b208fb 100644 --- a/packages/uploadthing/src/_internal/logger.ts +++ b/packages/uploadthing/src/_internal/logger.ts @@ -1,42 +1,20 @@ -import type * as HttpBody from "@effect/platform/HttpBody"; -import type * as HttpClientError from "@effect/platform/HttpClientError"; -import type * as HttpClientResponse from "@effect/platform/HttpClientResponse"; import * as Config from "effect/Config"; -import * as ConfigError from "effect/ConfigError"; import * as Effect from "effect/Effect"; -import * as Either from "effect/Either"; import * as Layer from "effect/Layer"; import * as Logger from "effect/Logger"; -import * as LogLevel from "effect/LogLevel"; +import type * as LogLevel from "effect/LogLevel"; +import * as References from "effect/References"; +import type * as HttpBody from "effect/unstable/http/HttpBody"; +import type * as HttpClientError from "effect/unstable/http/HttpClientError"; +import type * as HttpClientResponse from "effect/unstable/http/HttpClientResponse"; import { UploadThingError } from "@uploadthing/shared"; import { IsDevelopment } from "./config"; -/** - * Config.logLevel counter-intuitively accepts LogLevel["label"] - * instead of a literal, ripping it and changing to accept literal - * Effect 4.0 will change this to accept a literal and then we can - * remove this and go back to the built-in validator. - */ -const ConfigLogLevel = (name?: string): Config.Config => { - const config = Config.mapOrFail(Config.string(), (literal) => { - const level = LogLevel.allLevels.find((level) => level._tag === literal); - return level === undefined - ? Either.left( - ConfigError.InvalidData( - [], - `Expected a log level but received ${literal}`, - ), - ) - : Either.right(level); - }); - return name === undefined ? config : Config.nested(config, name); -}; - -export const withMinimalLogLevel = ConfigLogLevel("logLevel").pipe( - Config.withDefault(LogLevel.Info), - Effect.andThen((level) => Logger.minimumLogLevel(level)), +export const withMinimalLogLevel = Config.logLevel("logLevel").pipe( + Config.withDefault("Info" as const), + Effect.map((level) => Layer.succeed(References.MinimumLogLevel, level)), Effect.tapError((e) => Effect.logError("Invalid log level").pipe(Effect.annotateLogs("error", e)), ), @@ -49,23 +27,28 @@ export const withMinimalLogLevel = ConfigLogLevel("logLevel").pipe( cause: e, }), ), - Layer.unwrapEffect, + Layer.unwrap, ); -export const LogFormat = Config.literal( - "json", - "logFmt", - "structured", - "pretty", -)("logFormat"); -export type LogFormat = Config.Config.Success; +export const LogFormat = Config.literals( + ["json", "logFmt", "structured", "pretty"], + "logFormat", +); +export type LogFormat = Effect.Success; + +const loggers = { + json: Logger.consoleJson, + logFmt: Logger.consoleLogFmt, + structured: Logger.consoleStructured, + pretty: Logger.consolePretty(), +} satisfies Record>; export const withLogFormat = Effect.gen(function* () { const isDev = yield* IsDevelopment; const logFormat = yield* LogFormat.pipe( - Config.withDefault(isDev ? "pretty" : "json"), + Config.withDefault(isDev ? ("pretty" as const) : ("json" as const)), ); - return Logger[logFormat]; + return Logger.layer([loggers[logFormat]]); }).pipe( Effect.catchTag( "ConfigError", @@ -76,7 +59,7 @@ export const withLogFormat = Effect.gen(function* () { cause: e, }), ), - Layer.unwrapEffect, + Layer.unwrap, ); type HttpClientResponseMixinMethod = "json" | "text" | "arrayBuffer" | "None"; @@ -85,25 +68,29 @@ export const logHttpClientResponse = ( message: string, opts?: { /** Level to log on, default "Debug" */ - level?: LogLevel.Literal; + level?: LogLevel.Severity; /** What body mixin to use to get the response body, default "json" */ mixin?: HttpClientResponseMixinMethod; }, ) => { const mixin = opts?.mixin ?? "json"; - const level = LogLevel.fromLiteral(opts?.level ?? "Debug"); + const level = opts?.level ?? "Debug"; + + return (response: HttpClientResponse.HttpClientResponse) => { + const consumeBody: Effect.Effect = + mixin !== "None" ? response[mixin] : Effect.void; - return (response: HttpClientResponse.HttpClientResponse) => - Effect.flatMap(mixin !== "None" ? response[mixin] : Effect.void, () => - Effect.logWithLevel(level, `${message} (${response.status})`).pipe( + return Effect.flatMap(consumeBody, () => + Effect.logWithLevel(level)(`${message} (${response.status})`).pipe( Effect.annotateLogs("response", response), ), ); + }; }; export const logHttpClientError = (message: string) => (err: HttpClientError.HttpClientError | HttpBody.HttpBodyError) => - err._tag === "ResponseError" + err._tag === "HttpClientError" && err.response !== undefined ? logHttpClientResponse(message, { level: "Error" })(err.response) : Effect.logError(message).pipe(Effect.annotateLogs("error", err)); diff --git a/packages/uploadthing/src/_internal/parser.ts b/packages/uploadthing/src/_internal/parser.ts index a95a980a8e..d1b5cd5de0 100644 --- a/packages/uploadthing/src/_internal/parser.ts +++ b/packages/uploadthing/src/_internal/parser.ts @@ -1,7 +1,5 @@ import type * as Standard from "@standard-schema/spec"; -import * as Cause from "effect/Cause"; import * as Data from "effect/Data"; -import * as Runtime from "effect/Runtime"; import * as Schema from "effect/Schema"; import type { Json } from "@uploadthing/shared"; @@ -18,7 +16,7 @@ export type ParserZodEsque = { export type JsonParser = | ParserZodEsque | Standard.StandardSchemaV1 - | Schema.Schema; + | Schema.Codec; export class ParserError extends Data.TaggedError("ParserError")<{ cause: unknown; @@ -44,14 +42,10 @@ export function getParseFn< * Effect Schema */ return (value) => - Schema.decodeUnknownPromise(parser as Schema.Schema)( + Schema.decodeUnknownPromise(parser as Schema.Codec)( value, ).catch((error) => { - throw new ParserError({ - cause: Cause.squash( - (error as Runtime.FiberFailure)[Runtime.FiberFailureCauseId], - ), - }); + throw new ParserError({ cause: error }); }); } diff --git a/packages/uploadthing/src/_internal/route-config.ts b/packages/uploadthing/src/_internal/route-config.ts index cd979dab6b..f392ec5ad5 100644 --- a/packages/uploadthing/src/_internal/route-config.ts +++ b/packages/uploadthing/src/_internal/route-config.ts @@ -1,6 +1,5 @@ import * as Data from "effect/Data"; import * as Effect from "effect/Effect"; -import type * as S from "effect/Schema"; import type { ExpandedRouteConfig, @@ -55,7 +54,7 @@ class FileCountMismatch extends Data.Error<{ // e.g. uploading more videos than allowed, or a file that is larger than allowed. // This is double-checked on infra side, but we want to fail early to avoid network latency. export const assertFilesMeetConfig = ( - files: S.Schema.Type["files"], + files: (typeof UploadActionPayload.Type)["files"], routeConfig: ExpandedRouteConfig, ): Effect.Effect< null, diff --git a/packages/uploadthing/src/_internal/runtime.ts b/packages/uploadthing/src/_internal/runtime.ts index 383b00ef3e..aa9adea6a3 100644 --- a/packages/uploadthing/src/_internal/runtime.ts +++ b/packages/uploadthing/src/_internal/runtime.ts @@ -1,34 +1,48 @@ -import * as FetchHttpClient from "@effect/platform/FetchHttpClient"; -import * as Headers from "@effect/platform/Headers"; -import * as FiberRef from "effect/FiberRef"; +import * as ConfigProvider from "effect/ConfigProvider"; +import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as ManagedRuntime from "effect/ManagedRuntime"; +import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient"; +import * as Headers from "effect/unstable/http/Headers"; import type { FetchEsque } from "@uploadthing/shared"; import { configProvider } from "./config"; import { withLogFormat, withMinimalLogLevel } from "./logger"; -export const makeRuntime = (fetch: FetchEsque, config: unknown) => { +export const makeRuntime = (fetch: FetchEsque | undefined, config: unknown) => { const fetchHttpClient = Layer.provideMerge( FetchHttpClient.layer, - Layer.succeed(FetchHttpClient.Fetch, fetch as typeof globalThis.fetch), + Layer.succeed( + FetchHttpClient.Fetch, + // The `Fetch` reference defaults to `globalThis.fetch`, but resolve it + // lazily so runtime-patched implementations (e.g. msw) are picked up. + fetch + ? (fetch as typeof globalThis.fetch) + : (...args) => globalThis.fetch(...args), + ), ); - const withRedactedHeaders = Layer.effectDiscard( - FiberRef.update(Headers.currentRedactedNames, (_) => - _.concat(["x-uploadthing-api-key"]), + const withRedactedHeaders = Layer.effect( + Headers.CurrentRedactedNames, + Effect.map(Headers.CurrentRedactedNames, (names) => + names.concat(["x-uploadthing-api-key"]), ), ); - const layer = Layer.provide( + /** + * In Effect v4, the config provider (like all `Context.Reference`s) lives in + * the context instead of in fiber refs, so it must be merged into the + * runtime's context for per-request effects to see it. + */ + const layer = Layer.provideMerge( Layer.mergeAll( withLogFormat, withMinimalLogLevel, fetchHttpClient, withRedactedHeaders, ), - Layer.setConfigProvider(configProvider(config)), + ConfigProvider.layer(configProvider(config)), ); return ManagedRuntime.make(layer); }; diff --git a/packages/uploadthing/src/_internal/shared-schemas.ts b/packages/uploadthing/src/_internal/shared-schemas.ts index 3875510f55..d5d4a0da44 100644 --- a/packages/uploadthing/src/_internal/shared-schemas.ts +++ b/packages/uploadthing/src/_internal/shared-schemas.ts @@ -1,10 +1,12 @@ +import * as Effect from "effect/Effect"; import * as S from "effect/Schema"; +import * as SchemaTransformation from "effect/SchemaTransformation"; import type { Json } from "@uploadthing/shared"; import { ValidACLs, ValidContentDispositions } from "@uploadthing/shared"; -export const ContentDispositionSchema = S.Literal(...ValidContentDispositions); -export const ACLSchema = S.Literal(...ValidACLs); +export const ContentDispositionSchema = S.Literals(ValidContentDispositions); +export const ACLSchema = S.Literals(ValidACLs); /** * Valid options for the `?actionType` query param @@ -15,30 +17,36 @@ export const ActionType = S.Literal("upload"); * Valid options for the `uploadthing-hook` header * for requests coming from UT server */ -export const UploadThingHook = S.Literal("callback", "error"); +export const UploadThingHook = S.Literals(["callback", "error"]); /** * ============================================================================= * =========================== Configuration =================================== * ============================================================================= */ -const DecodeString = S.transform(S.Uint8ArrayFromSelf, S.String, { - decode: (data) => new TextDecoder().decode(data), - encode: (data) => new TextEncoder().encode(data), -}); +const DecodeString = S.Uint8Array.pipe( + S.decodeTo( + S.String, + SchemaTransformation.transform({ + decode: (data) => new TextDecoder().decode(data), + encode: (data) => new TextEncoder().encode(data), + }), + ), +); export const ParsedToken = S.Struct({ - apiKey: S.Redacted(S.String.pipe(S.startsWith("sk_"))), + apiKey: S.RedactedFromValue(S.String.check(S.isStartsWith("sk_"))), appId: S.String, regions: S.NonEmptyArray(S.String), ingestHost: S.String.pipe( - S.optionalWith({ default: () => "ingest.uploadthing.com" }), + S.withDecodingDefault(Effect.succeed("ingest.uploadthing.com")), + S.withConstructorDefault(Effect.succeed("ingest.uploadthing.com")), ), }); export const UploadThingToken = S.Uint8ArrayFromBase64.pipe( - S.compose(DecodeString), - S.compose(S.parseJson(ParsedToken)), + S.decodeTo(DecodeString), + S.decodeTo(S.fromJsonString(ParsedToken)), ); /** @@ -54,7 +62,7 @@ export class FileUploadData extends S.Class("FileUploadData")({ name: S.String, size: S.Number, type: S.String, - lastModified: S.Number.pipe(S.optional), + lastModified: S.optional(S.Number), }) {} /** @@ -145,5 +153,7 @@ export class UploadActionPayload extends S.Class( "UploadActionPayload", )({ files: S.Array(FileUploadData), - input: S.Unknown as S.Schema, + // The key may be missing entirely on incoming payloads (treated as undefined), + // but consumers see it as `Json` like in previous versions. + input: S.optional(S.Unknown) as unknown as S.Codec, }) {} diff --git a/packages/uploadthing/src/_internal/to-web-request.ts b/packages/uploadthing/src/_internal/to-web-request.ts index 4a50ca025b..c040aaba6d 100644 --- a/packages/uploadthing/src/_internal/to-web-request.ts +++ b/packages/uploadthing/src/_internal/to-web-request.ts @@ -62,7 +62,7 @@ export const getPostBody = (opts: { on: (event: string, listener: (data: any) => void) => void; }; }) => - Effect.async((resume) => { + Effect.callback((resume) => { const { req } = opts; if (!req.method || !isBodyAllowed(req.method)) { return resume(Effect.succeed(undefined)); @@ -134,7 +134,7 @@ export const toWebRequest = ( return parseURL(req).pipe( Effect.catchTag("InvalidURL", (e) => Effect.die(e)), - Effect.andThen( + Effect.map( (url) => new Request(url, { method, diff --git a/packages/uploadthing/src/_internal/types.ts b/packages/uploadthing/src/_internal/types.ts index 76692991bf..c2850aefe7 100644 --- a/packages/uploadthing/src/_internal/types.ts +++ b/packages/uploadthing/src/_internal/types.ts @@ -1,5 +1,3 @@ -import type { Schema } from "effect/Schema"; - import type { ErrorMessage, FileRouterInputConfig, @@ -81,7 +79,7 @@ type MiddlewareFn< TArgs extends Record, > = ( opts: TArgs & { - files: Schema.Type["files"]; + files: (typeof UploadActionPayload.Type)["files"]; input: TInput extends UnsetMarker ? undefined : TInput; }, ) => MaybePromise; diff --git a/packages/uploadthing/src/_internal/upload-browser.ts b/packages/uploadthing/src/_internal/upload-browser.ts index ba8b95000c..a44961fc10 100644 --- a/packages/uploadthing/src/_internal/upload-browser.ts +++ b/packages/uploadthing/src/_internal/upload-browser.ts @@ -1,6 +1,5 @@ -import { unsafeCoerce } from "effect/Function"; -import * as Micro from "effect/Micro"; -import { hasProperty, isRecord } from "effect/Predicate"; +import * as Effect from "effect/Effect"; +import { hasProperty, isObject } from "effect/Predicate"; import type { FetchContext, FetchError } from "@uploadthing/shared"; import { fetchEff, UploadThingError } from "@uploadthing/shared"; @@ -30,7 +29,7 @@ const uploadWithProgress = ( | undefined; }, ) => - Micro.async((resume) => { + Effect.callback((resume) => { const xhr = new XMLHttpRequest(); xhr.open("PUT", presigned.url, true); xhr.setRequestHeader("Range", `bytes=${rangeStart}-`); @@ -47,7 +46,7 @@ const uploadWithProgress = ( previousLoaded = loaded; }); xhr.addEventListener("load", () => { - if (xhr.status >= 200 && xhr.status < 300 && isRecord(xhr.response)) { + if (xhr.status >= 200 && xhr.status < 300 && isObject(xhr.response)) { if (hasProperty(xhr.response, "error")) { resume( new UploadThingError({ @@ -57,7 +56,7 @@ const uploadWithProgress = ( }), ); } else { - resume(Micro.succeed(xhr.response)); + resume(Effect.succeed(xhr.response)); } } else { resume( @@ -105,7 +104,7 @@ const uploadWithProgress = ( } xhr.send(formData); - return Micro.sync(() => xhr.abort()); + return Effect.sync(() => xhr.abort()); }); export const uploadFile = < @@ -127,16 +126,18 @@ export const uploadFile = < method: "HEAD", headers: opts.traceHeaders, }).pipe( - Micro.map(({ headers }) => + Effect.map(({ headers }) => parseInt(headers.get("x-ut-range-start") ?? "0", 10), ), - Micro.tap((start) => - opts.onUploadProgress?.({ - delta: start, - loaded: start, - }), + Effect.tap((start) => + Effect.sync(() => + opts.onUploadProgress?.({ + delta: start, + loaded: start, + }), + ), ), - Micro.flatMap((start) => + Effect.flatMap((start) => uploadWithProgress(file, start, presigned, { traceHeaders: opts.traceHeaders, onUploadProgress: (progressEvent) => @@ -146,8 +147,8 @@ export const uploadFile = < }), }), ), - Micro.map(unsafeCoerce>), - Micro.map((uploadResponse) => ({ + Effect.map((_) => _ as UploadPutResult), + Effect.map((uploadResponse) => ({ name: file.name, size: file.size, key: presigned.key, @@ -179,7 +180,7 @@ export const uploadFilesInternal = < >( endpoint: TEndpoint, opts: UploadFilesOptions, -): Micro.Micro< +): Effect.Effect< ClientUploadedFileData[], UploadThingError | FetchError, FetchContext @@ -197,7 +198,7 @@ export const uploadFilesInternal = < const totalSize = opts.files.reduce((acc, f) => acc + f.size, 0); let totalLoaded = 0; - return Micro.flatMap( + return Effect.flatMap( reportEventToUT("upload", { input: "input" in opts ? opts.input : null, files: opts.files.map((f) => ({ @@ -208,11 +209,11 @@ export const uploadFilesInternal = < })), }), (presigneds) => - Micro.forEach( + Effect.forEach( presigneds, (presigned, i) => - Micro.flatMap( - Micro.sync(() => + Effect.flatMap( + Effect.sync(() => opts.onUploadBegin?.({ file: opts.files[i]!.name }), ), () => diff --git a/packages/uploadthing/src/_internal/upload-server.ts b/packages/uploadthing/src/_internal/upload-server.ts index e0b40eaba8..c537b4f035 100644 --- a/packages/uploadthing/src/_internal/upload-server.ts +++ b/packages/uploadthing/src/_internal/upload-server.ts @@ -1,7 +1,6 @@ -import * as HttpClient from "@effect/platform/HttpClient"; -import * as HttpClientRequest from "@effect/platform/HttpClientRequest"; import * as Effect from "effect/Effect"; -import { unsafeCoerce } from "effect/Function"; +import * as HttpClient from "effect/unstable/http/HttpClient"; +import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest"; import { UploadThingError } from "@uploadthing/shared"; @@ -36,9 +35,8 @@ export const uploadWithoutProgress = ( cause: e, }), ), - Effect.andThen((_) => _.json), - Effect.andThen(unsafeCoerce), - Effect.scoped, + Effect.flatMap((_) => _.json), + Effect.map((_) => _ as UploadPutResult), ); yield* Effect.logDebug(`File ${file.name} uploaded successfully`).pipe( diff --git a/packages/uploadthing/src/_internal/ut-reporter.ts b/packages/uploadthing/src/_internal/ut-reporter.ts index 389b772a9c..257c62c600 100644 --- a/packages/uploadthing/src/_internal/ut-reporter.ts +++ b/packages/uploadthing/src/_internal/ut-reporter.ts @@ -1,5 +1,4 @@ -import { unsafeCoerce } from "effect/Function"; -import * as Micro from "effect/Micro"; +import * as Effect from "effect/Effect"; import type { FetchContext, MaybePromise } from "@uploadthing/shared"; import { @@ -37,7 +36,7 @@ const createAPIRequestUrl = (config: { export type UTReporter = ( type: TEvent, payload: UTEvents[TEvent]["in"], -) => Micro.Micro; +) => Effect.Effect; /** * Creates a "client" for reporting events to the UploadThing server via the user's API endpoint. @@ -52,14 +51,14 @@ export const createUTReporter = traceHeaders: TraceHeaders; }): UTReporter => (type, payload) => - Micro.gen(function* () { + Effect.gen(function* () { const url = createAPIRequestUrl({ url: cfg.url, slug: cfg.endpoint, actionType: type, }); const headers = new Headers( - yield* Micro.promise(async () => + yield* Effect.promise(async () => typeof cfg.headers === "function" ? await cfg.headers() : cfg.headers, ), ); @@ -76,15 +75,15 @@ export const createUTReporter = body: JSON.stringify(payload), headers, }).pipe( - Micro.andThen(parseResponseJson), + Effect.andThen(parseResponseJson), /** * We don't _need_ to validate the response here, just cast it for now. * As of now, @effect/schema includes quite a few bytes we cut out by this... * We have "strong typing" on the backend that ensures the shape should match. */ - Micro.map(unsafeCoerce), - Micro.catchTag("FetchError", (e) => - Micro.fail( + Effect.map((_) => _ as UTEvents[typeof type]["out"]), + Effect.catchTag("FetchError", (e) => + Effect.fail( new UploadThingError({ code: "INTERNAL_CLIENT_ERROR", message: `Failed to report event "${type}" to UploadThing server`, @@ -92,8 +91,8 @@ export const createUTReporter = }), ), ), - Micro.catchTag("BadRequestError", (e) => - Micro.fail( + Effect.catchTag("BadRequestError", (e) => + Effect.fail( new UploadThingError({ code: getErrorTypeFromStatusCode(e.status), message: e.getMessage(), @@ -101,8 +100,8 @@ export const createUTReporter = }), ), ), - Micro.catchTag("InvalidJson", (e) => - Micro.fail( + Effect.catchTag("InvalidJson", (e) => + Effect.fail( new UploadThingError({ code: "INTERNAL_CLIENT_ERROR", message: "Failed to parse response from UploadThing server", diff --git a/packages/uploadthing/src/client-future.ts b/packages/uploadthing/src/client-future.ts index 1585753bd0..9dcad8ce15 100644 --- a/packages/uploadthing/src/client-future.ts +++ b/packages/uploadthing/src/client-future.ts @@ -1,5 +1,6 @@ import * as Arr from "effect/Array"; -import * as Micro from "effect/Micro"; +import * as Cause from "effect/Cause"; +import * as Effect from "effect/Effect"; import type { FetchEsque } from "@uploadthing/shared"; import { @@ -83,13 +84,13 @@ export const future_genUploader = ( input: (options as any).input as inferEndpointInput, headers: options.headers, traceHeaders, - }).pipe(Micro.provideService(FetchContext, fetchFn), (effect) => - Micro.runPromiseExit( + }).pipe(Effect.provideService(FetchContext, fetchFn), (effect) => + Effect.runPromiseExit( effect, options.signal && { signal: options.signal }, ), ); - if (pExit._tag === "Failure") throw Micro.causeSquash(pExit.cause); + if (pExit._tag === "Failure") throw Cause.squash(pExit.cause); const presigneds = pExit.value; const pendingFiles = options.files.map(makePendingFile); @@ -114,7 +115,7 @@ export const future_genUploader = ( onEvent: options.onEvent, traceHeaders, XHRImpl: globalThis.XMLHttpRequest, - }).pipe(Micro.provideService(FetchContext, fetchFn)); + }).pipe(Effect.provideService(FetchContext, fetchFn)); for (const [presigned, file] of Arr.zip(presigneds, pendingFiles)) { file.key = presigned.key; @@ -123,16 +124,16 @@ export const future_genUploader = ( const deferred = createDeferred>(); uploads.set(file, { presigned, deferred }); - void Micro.runPromiseExit(uploadEffect(file, presigned), { + void Effect.runPromiseExit(uploadEffect(file, presigned), { signal: deferred.ac.signal, }) .then((result) => { if (result._tag === "Success") { return deferred.resolve(result.value); - } else if (result.cause._tag === "Interrupt") { + } else if (Cause.hasInterrupts(result.cause)) { throw new UploadPausedError(); } - throw Micro.causeSquash(result.cause); + throw Cause.squash(result.cause); }) .catch((err) => { if (err instanceof UploadPausedError) return; @@ -201,7 +202,7 @@ export const future_genUploader = ( if (!upload) throw "No upload found"; upload.deferred.ac = new AbortController(); - void Micro.runPromiseExit( + void Effect.runPromiseExit( uploadEffect(file as PendingFile, upload.presigned), { signal: upload.deferred.ac.signal, @@ -210,10 +211,10 @@ export const future_genUploader = ( .then((result) => { if (result._tag === "Success") { return upload.deferred.resolve(result.value); - } else if (result.cause._tag === "Interrupt") { + } else if (Cause.hasInterrupts(result.cause)) { throw new UploadPausedError(); } - throw Micro.causeSquash(result.cause); + throw Cause.squash(result.cause); }) .catch((err) => { if (err instanceof UploadPausedError) return; diff --git a/packages/uploadthing/src/client.ts b/packages/uploadthing/src/client.ts index 37820e3076..d31314c791 100644 --- a/packages/uploadthing/src/client.ts +++ b/packages/uploadthing/src/client.ts @@ -1,5 +1,6 @@ import * as Arr from "effect/Array"; -import * as Micro from "effect/Micro"; +import * as Cause from "effect/Cause"; +import * as Effect from "effect/Effect"; import type { ExpandedRouteConfig, FetchEsque } from "@uploadthing/shared"; import { @@ -59,10 +60,10 @@ export const isValidFileType = ( file: File, routeConfig: ExpandedRouteConfig, ): boolean => - Micro.runSync( + Effect.runSync( matchFileType(file, objectKeys(routeConfig)).pipe( - Micro.map((type) => file.type.includes(type)), - Micro.orElseSucceed(() => false), + Effect.map((type) => file.type.includes(type)), + Effect.orElseSucceed(() => false), ), ); @@ -74,11 +75,11 @@ export const isValidFileSize = ( file: File, routeConfig: ExpandedRouteConfig, ): boolean => - Micro.runSync( + Effect.runSync( matchFileType(file, objectKeys(routeConfig)).pipe( - Micro.flatMap((type) => fileSizeToBytes(routeConfig[type]!.maxFileSize)), - Micro.map((maxFileSize) => file.size <= maxFileSize), - Micro.orElseSucceed(() => false), + Effect.flatMap((type) => fileSizeToBytes(routeConfig[type]!.maxFileSize)), + Effect.map((maxFileSize) => file.size <= maxFileSize), + Effect.orElseSucceed(() => false), ), ); @@ -121,7 +122,7 @@ export const genUploader = ( }); const fetchFn: FetchEsque = initOpts?.fetch ?? window.fetch; - const presigneds = await Micro.runPromise( + const presigneds = await Effect.runPromise( utReporter("upload", { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment input: "input" in opts ? (opts.input as any) : null, @@ -131,7 +132,7 @@ export const genUploader = ( type: f.type, lastModified: f.lastModified, })), - }).pipe(Micro.provideService(FetchContext, fetchFn)), + }).pipe(Effect.provideService(FetchContext, fetchFn)), ); const totalSize = opts.files.reduce((acc, f) => acc + f.size, 0); @@ -150,7 +151,7 @@ export const genUploader = ( totalProgress: Math.round((totalLoaded / totalSize) * 100), }); }, - }).pipe(Micro.provideService(FetchContext, fetchFn)); + }).pipe(Effect.provideService(FetchContext, fetchFn)); for (const [i, p] of presigneds.entries()) { const file = opts.files[i]; @@ -159,16 +160,16 @@ export const genUploader = ( const deferred = createDeferred>(); uploads.set(file, { deferred, presigned: p }); - void Micro.runPromiseExit(uploadEffect(file, p), { + void Effect.runPromiseExit(uploadEffect(file, p), { signal: deferred.ac.signal, }) .then((result) => { if (result._tag === "Success") { return deferred.resolve(result.value); - } else if (result.cause._tag === "Interrupt") { + } else if (Cause.hasInterrupts(result.cause)) { throw new UploadPausedError(); } - throw Micro.causeSquash(result.cause); + throw Cause.squash(result.cause); }) .catch((err) => { if (err instanceof UploadPausedError) return; @@ -206,16 +207,16 @@ export const genUploader = ( if (!upload) throw "No upload found"; upload.deferred.ac = new AbortController(); - void Micro.runPromiseExit(uploadEffect(file, upload.presigned), { + void Effect.runPromiseExit(uploadEffect(file, upload.presigned), { signal: upload.deferred.ac.signal, }) .then((result) => { if (result._tag === "Success") { return upload.deferred.resolve(result.value); - } else if (result.cause._tag === "Interrupt") { + } else if (Cause.hasInterrupts(result.cause)) { throw new UploadPausedError(); } - throw Micro.causeSquash(result.cause); + throw Cause.squash(result.cause); }) .catch((err) => { if (err instanceof UploadPausedError) return; @@ -274,16 +275,16 @@ export const genUploader = ( // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access input: (opts as any).input as inferEndpointInput, }) - .pipe(Micro.provideService(FetchContext, fetchFn), (effect) => - Micro.runPromiseExit(effect, opts.signal && { signal: opts.signal }), + .pipe(Effect.provideService(FetchContext, fetchFn), (effect) => + Effect.runPromiseExit(effect, opts.signal && { signal: opts.signal }), ) .then((exit) => { if (exit._tag === "Success") { return exit.value; - } else if (exit.cause._tag === "Interrupt") { + } else if (Cause.hasInterrupts(exit.cause)) { throw new UploadAbortedError(); } - throw Micro.causeSquash(exit.cause); + throw Cause.squash(exit.cause); }); }; diff --git a/packages/uploadthing/src/effect-platform.ts b/packages/uploadthing/src/effect-platform.ts index a25e52bb8a..6d76d984ab 100644 --- a/packages/uploadthing/src/effect-platform.ts +++ b/packages/uploadthing/src/effect-platform.ts @@ -1,9 +1,9 @@ -import type * as HttpApp from "@effect/platform/HttpApp"; -import type * as HttpClient from "@effect/platform/HttpClient"; -import * as HttpRouter from "@effect/platform/HttpRouter"; -import * as HttpServerRequest from "@effect/platform/HttpServerRequest"; +import * as ConfigProvider from "effect/ConfigProvider"; import * as Effect from "effect/Effect"; -import * as Layer from "effect/Layer"; +import type * as Scope from "effect/Scope"; +import type * as HttpClient from "effect/unstable/http/HttpClient"; +import * as HttpServerRequest from "effect/unstable/http/HttpServerRequest"; +import type * as HttpServerResponse from "effect/unstable/http/HttpServerResponse"; import type { Json } from "@uploadthing/shared"; @@ -39,34 +39,40 @@ export const createRouteHandler = (opts: { * * @example * ```ts - * import { Effect, Layer, Logger, LogLevel } from "effect"; - * import { HttpClient } from "@effect/platform"; + * import { Effect, Layer, References } from "effect"; + * import { FetchHttpClient } from "effect/unstable/http"; * // Set logLevel - * Logger.withMinimumLogLevel(LogLevel.Debug) + * Layer.succeed(References.MinimumLogLevel, "Debug") * * // Override fetch implementation * Layer.succeed( - * HttpClient.Fetch, + * FetchHttpClient.Fetch, * myFetchImplementation, * ); * ``` */ config?: Omit; -}): HttpApp.Default => { - const router = Effect.runSync( +}): Effect.Effect< + HttpServerResponse.HttpServerResponse, + unknown, + HttpClient.HttpClient | HttpServerRequest.HttpServerRequest | Scope.Scope +> => { + const handler = Effect.runSync( createRequestHandler(opts, "effect-platform"), ); - return HttpRouter.provideServiceEffect( - router, - AdapterArguments, - Effect.map( - HttpServerRequest.HttpServerRequest, - (serverRequest) => - ({ - req: serverRequest, - }) satisfies AdapterArgs, + return handler.pipe( + Effect.provideServiceEffect( + AdapterArguments, + Effect.map( + HttpServerRequest.HttpServerRequest, + (serverRequest) => + ({ + req: serverRequest, + }) satisfies AdapterArgs, + ), ), - ).pipe(Effect.provide(Layer.setConfigProvider(configProvider(opts.config)))); + Effect.provide(ConfigProvider.layer(configProvider(opts.config))), + ); }; diff --git a/packages/uploadthing/src/sdk/index.ts b/packages/uploadthing/src/sdk/index.ts index ebfbf059f3..379f21cdaa 100644 --- a/packages/uploadthing/src/sdk/index.ts +++ b/packages/uploadthing/src/sdk/index.ts @@ -1,15 +1,12 @@ -import type * as FetchHttpClient from "@effect/platform/FetchHttpClient"; -import * as HttpClient from "@effect/platform/HttpClient"; -import type * as HttpClientError from "@effect/platform/HttpClientError"; -import * as HttpClientRequest from "@effect/platform/HttpClientRequest"; -import * as HttpClientResponse from "@effect/platform/HttpClientResponse"; import * as Arr from "effect/Array"; import * as Cause from "effect/Cause"; import * as Effect from "effect/Effect"; -import type { ManagedRuntime } from "effect/ManagedRuntime"; -import type { ParseError } from "effect/ParseResult"; import * as Redacted from "effect/Redacted"; import * as S from "effect/Schema"; +import * as HttpClient from "effect/unstable/http/HttpClient"; +import type * as HttpClientError from "effect/unstable/http/HttpClientError"; +import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest"; +import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse"; import type { ACL, FetchEsque, MaybeUrl } from "@uploadthing/shared"; import { @@ -48,10 +45,7 @@ export { UTFile }; export class UTApi { private fetch: FetchEsque; private defaultKeyType: "fileKey" | "customId"; - private runtime: ManagedRuntime< - HttpClient.HttpClient | FetchHttpClient.Fetch, - UploadThingError - >; + private runtime: ReturnType; private opts: UTApiOptions; constructor(options?: UTApiOptions) { // Assert some stuff @@ -65,9 +59,9 @@ export class UTApi { private requestUploadThing = ( pathname: `/${string}`, body: Record, - responseSchema: S.Schema, + responseSchema: S.Codec, ) => - Effect.gen(this, function* () { + Effect.gen(function* () { const { apiKey } = yield* UTToken; const baseUrl = yield* ApiUrl; const httpClient = (yield* HttpClient.HttpClient).pipe( @@ -76,19 +70,18 @@ export class UTApi { return yield* HttpClientRequest.post(pathname).pipe( HttpClientRequest.prependUrl(baseUrl), - HttpClientRequest.bodyUnsafeJson(body), + HttpClientRequest.bodyJsonUnsafe(body), HttpClientRequest.setHeaders({ "x-uploadthing-version": UPLOADTHING_VERSION, "x-uploadthing-be-adapter": "server-sdk", "x-uploadthing-api-key": Redacted.value(apiKey), }), httpClient.execute, - Effect.tapBoth({ - onSuccess: logHttpClientResponse("UploadThing API Response"), - onFailure: logHttpClientError("Failed to request UploadThing API"), - }), + Effect.tap(logHttpClientResponse("UploadThing API Response")), + Effect.tapError( + logHttpClientError("Failed to request UploadThing API"), + ), Effect.flatMap(HttpClientResponse.schemaBodyJson(responseSchema)), - Effect.scoped, ); }).pipe( Effect.catchTag( @@ -107,7 +100,7 @@ export class UTApi { private executeAsync = async ( program: Effect.Effect< A, - UploadThingError | ParseError | HttpClientError.HttpClientError, + UploadThingError | S.SchemaError | HttpClientError.HttpClientError, HttpClient.HttpClient >, signal?: AbortSignal, @@ -350,12 +343,12 @@ export class UTApi { key: S.String, name: S.String, size: S.Number, - status: S.Literal( + status: S.Literals([ "Deletion Pending", "Failed", "Uploaded", "Uploading", - ), + ]), uploadedAt: S.Number, }), ), diff --git a/packages/uploadthing/src/sdk/types.ts b/packages/uploadthing/src/sdk/types.ts index 365df4611d..9c0566e441 100644 --- a/packages/uploadthing/src/sdk/types.ts +++ b/packages/uploadthing/src/sdk/types.ts @@ -1,5 +1,4 @@ import type { Blob as NodeBlob } from "buffer"; -import type * as Config from "effect/Config"; import type * as LogLevel from "effect/LogLevel"; import type { @@ -29,13 +28,13 @@ export interface UTApiOptions { /** * @default "info" */ - logLevel?: LogLevel.Literal; + logLevel?: LogLevel.LogLevel; /** * What format log entries should be in * @default "pretty" in development, else "json" * @see https://effect.website/docs/guides/observability/logging#built-in-loggers */ - logFormat?: Config.Config.Success; + logFormat?: LogFormat; /** * Set the default key type for file operations. Allows you to set your preferred filter * for file keys or custom identifiers without needing to specify it on every call. diff --git a/packages/uploadthing/src/sdk/utils.ts b/packages/uploadthing/src/sdk/utils.ts index 0b1df0acc6..b126bb5785 100644 --- a/packages/uploadthing/src/sdk/utils.ts +++ b/packages/uploadthing/src/sdk/utils.ts @@ -1,7 +1,7 @@ -import * as HttpClient from "@effect/platform/HttpClient"; -import * as HttpClientRequest from "@effect/platform/HttpClientRequest"; import * as Effect from "effect/Effect"; import * as Predicate from "effect/Predicate"; +import * as HttpClient from "effect/unstable/http/HttpClient"; +import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest"; import { generateKey, @@ -35,7 +35,7 @@ export const downloadFile = ( _url: MaybeUrl | UrlWithOverrides, ): Effect.Effect => Effect.gen(function* () { - let url = Predicate.isRecord(_url) ? _url.url : _url; + let url = Predicate.isObject(_url) ? _url.url : _url; if (typeof url === "string") { // since dataurls will result in name being too long, tell the user // to use uploadFiles instead. @@ -53,7 +53,7 @@ export const downloadFile = ( const { name = url.pathname.split("/").pop() ?? "unknown-filename", customId = undefined, - } = Predicate.isRecord(_url) ? _url : {}; + } = Predicate.isObject(_url) ? _url : {}; const httpClient = (yield* HttpClient.HttpClient).pipe( HttpClient.filterStatusOk, ); @@ -69,7 +69,6 @@ export const downloadFile = ( data: cause.toJSON() as Json, } satisfies SerializedUploadThingError; }), - Effect.scoped, ); return new UTFile([arrayBuffer], name, { @@ -135,7 +134,7 @@ export const uploadFile = ( Effect.catchTag("UploadThingError", (e) => Effect.fail(UploadThingError.toObject(e)), ), - Effect.catchTag("ResponseError", (e) => + Effect.catchTag("HttpClientError", (e) => Effect.fail({ code: "UPLOAD_FAILED", message: "Failed to upload file", diff --git a/packages/uploadthing/src/types.ts b/packages/uploadthing/src/types.ts index 8fbf7e45bc..70b3036209 100644 --- a/packages/uploadthing/src/types.ts +++ b/packages/uploadthing/src/types.ts @@ -40,7 +40,7 @@ export type inferErrorShape = TFileRoute["$types"]["errorShape"]; export type RouteHandlerConfig = { - logLevel?: LogLevel.Literal; + logLevel?: LogLevel.LogLevel; /** * What format log entries should be in * @default "pretty" in development, else "json" diff --git a/packages/uploadthing/test/node/adapters.test.ts b/packages/uploadthing/test/node/adapters.test.ts index 6ba3fc822c..aaaaec222d 100644 --- a/packages/uploadthing/test/node/adapters.test.ts +++ b/packages/uploadthing/test/node/adapters.test.ts @@ -1,12 +1,11 @@ /* eslint-disable no-restricted-globals */ import type { NextApiRequest, NextApiResponse } from "next"; import { NextRequest } from "next/server"; -import * as FetchHttpClient from "@effect/platform/FetchHttpClient"; -import * as HttpServerRequest from "@effect/platform/HttpServerRequest"; -import * as HttpServerResponse from "@effect/platform/HttpServerResponse"; import * as ConfigProvider from "effect/ConfigProvider"; import * as Effect from "effect/Effect"; -import * as Layer from "effect/Layer"; +import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient"; +import * as HttpServerRequest from "effect/unstable/http/HttpServerRequest"; +import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse"; import * as express from "express"; import * as fastify from "fastify"; import { createApp, H3Event, toWebHandler } from "h3"; @@ -925,8 +924,8 @@ describe("adapters:effect-platform", async () => { expect(response.status).toBe(200); }).pipe( Effect.provide( - Layer.setConfigProvider( - ConfigProvider.fromJson({ + ConfigProvider.layer( + ConfigProvider.fromUnknown({ uploadthingToken: testToken.encoded, }), ), diff --git a/packages/uploadthing/test/node/config.test.ts b/packages/uploadthing/test/node/config.test.ts index b2501805bf..316b863b31 100644 --- a/packages/uploadthing/test/node/config.test.ts +++ b/packages/uploadthing/test/node/config.test.ts @@ -1,7 +1,7 @@ import { it } from "@effect/vitest"; +import * as ConfigProvider from "effect/ConfigProvider"; import * as Effect from "effect/Effect"; import * as Exit from "effect/Exit"; -import * as Layer from "effect/Layer"; import * as Redacted from "effect/Redacted"; import * as S from "effect/Schema"; import { beforeEach, describe, expect } from "vitest"; @@ -39,7 +39,7 @@ describe("utToken", () => { it.effect("fails if no token is provided as env", () => Effect.gen(function* () { const token = yield* UTToken.pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -61,7 +61,7 @@ describe("utToken", () => { process.env.UPLOADTHING_TOKEN = "some-token-that-is-not-a-token"; const token = yield* UTToken.pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -80,12 +80,12 @@ describe("utToken", () => { it.effect("succeeds if token is provided as env", () => Effect.gen(function* () { - process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + process.env.UPLOADTHING_TOKEN = yield* S.encodeEffect(UploadThingToken)( ParsedToken.make(app1TokenData), ); const token = yield* UTToken.pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -100,12 +100,12 @@ describe("utToken", () => { it.effect("with import.meta.env", () => Effect.gen(function* () { - import.meta.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( - ParsedToken.make(app1TokenData), - ); + import.meta.env.UPLOADTHING_TOKEN = yield* S.encodeEffect( + UploadThingToken, + )(ParsedToken.make(app1TokenData)); const token = yield* UTToken.pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -124,7 +124,7 @@ describe("utToken", () => { Effect.gen(function* () { const token = yield* UTToken.pipe( Effect.provide( - Layer.setConfigProvider(configProvider({ noToken: "here" })), + ConfigProvider.layer(configProvider({ noToken: "here" })), ), Effect.exit, ); @@ -148,7 +148,7 @@ describe("utToken", () => { const token = yield* UTToken.pipe( Effect.provide( - Layer.setConfigProvider(configProvider({ token: badToken })), + ConfigProvider.layer(configProvider({ token: badToken })), ), Effect.exit, ); @@ -168,13 +168,13 @@ describe("utToken", () => { it.effect("succeeds if token is provided as option", () => Effect.gen(function* () { - const testTokenStr = yield* S.encode(UploadThingToken)( + const testTokenStr = yield* S.encodeEffect(UploadThingToken)( ParsedToken.make(app1TokenData), ); const token = yield* UTToken.pipe( Effect.provide( - Layer.setConfigProvider(configProvider({ token: testTokenStr })), + ConfigProvider.layer(configProvider({ token: testTokenStr })), ), Effect.exit, ); @@ -190,7 +190,7 @@ describe("utToken", () => { it.effect("with ingestHost specified", () => Effect.gen(function* () { - const testTokenStr = yield* S.encode(UploadThingToken)( + const testTokenStr = yield* S.encodeEffect(UploadThingToken)( ParsedToken.make({ ...app1TokenData, ingestHost: "ingest.ut-staging.com", @@ -199,7 +199,7 @@ describe("utToken", () => { const token = yield* UTToken.pipe( Effect.provide( - Layer.setConfigProvider(configProvider({ token: testTokenStr })), + ConfigProvider.layer(configProvider({ token: testTokenStr })), ), Effect.exit, ); @@ -215,17 +215,17 @@ describe("utToken", () => { it.effect("options take precedence over env", () => Effect.gen(function* () { - process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + process.env.UPLOADTHING_TOKEN = yield* S.encodeEffect(UploadThingToken)( ParsedToken.make(app1TokenData), ); - const token2Str = yield* S.encode(UploadThingToken)( + const token2Str = yield* S.encodeEffect(UploadThingToken)( ParsedToken.make(app2TokenData), ); const token = yield* UTToken.pipe( Effect.provide( - Layer.setConfigProvider(configProvider({ token: token2Str })), + ConfigProvider.layer(configProvider({ token: token2Str })), ), Effect.exit, ); @@ -243,13 +243,13 @@ describe("utToken", () => { describe("ingest url infers correctly", () => { it.effect("takes from env if provided", () => Effect.gen(function* () { - process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + process.env.UPLOADTHING_TOKEN = yield* S.encodeEffect(UploadThingToken)( ParsedToken.make(app1TokenData), ); process.env.UPLOADTHING_INGEST_URL = "http://localhost:1234"; const url = yield* IngestUrl(undefined).pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -259,12 +259,12 @@ describe("ingest url infers correctly", () => { it.effect("infers from token region if no env is provided", () => Effect.gen(function* () { - process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + process.env.UPLOADTHING_TOKEN = yield* S.encodeEffect(UploadThingToken)( ParsedToken.make(app1TokenData), ); const url = yield* IngestUrl(undefined).pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -277,7 +277,7 @@ describe("IsDevelopment", () => { it.effect("defaults to false", () => Effect.gen(function* () { const isDev = yield* IsDevelopment.pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -291,7 +291,7 @@ describe("IsDevelopment", () => { process.env.NODE_ENV = "development"; const isDev = yield* IsDevelopment.pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -304,7 +304,7 @@ describe("IsDevelopment", () => { process.env.UPLOADTHING_IS_DEV = "true"; const isDev = yield* IsDevelopment.pipe( - Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.provide(ConfigProvider.layer(configProvider(null))), Effect.exit, ); @@ -315,9 +315,7 @@ describe("IsDevelopment", () => { it.effect("is true if config set", () => Effect.gen(function* () { const isDev = yield* IsDevelopment.pipe( - Effect.provide( - Layer.setConfigProvider(configProvider({ isDev: true })), - ), + Effect.provide(ConfigProvider.layer(configProvider({ isDev: true }))), Effect.exit, ); diff --git a/packages/uploadthing/test/node/input.test.ts b/packages/uploadthing/test/node/input.test.ts index 6b13a5a0e1..98fe0ec611 100644 --- a/packages/uploadthing/test/node/input.test.ts +++ b/packages/uploadthing/test/node/input.test.ts @@ -1,4 +1,4 @@ -import { ParseError } from "effect/ParseResult"; +import { SchemaError } from "effect/Schema"; import * as Schema from "effect/Schema"; import * as v from "valibot"; import { expect, expectTypeOf, it } from "vitest"; @@ -91,7 +91,7 @@ it("validation fails when input is invalid (effect/schema)", async () => { const fileRoute = f(["image"]).input(Schema.String).onUploadComplete(noop); const err = await getParseFn(fileRoute.inputParser)(123).catch((e) => e); expect(err).toBeInstanceOf(ParserError); - expect(err.cause).toBeInstanceOf(ParseError); + expect(err.cause).toBeInstanceOf(SchemaError); }); it("with data transforming (zod)", async () => { @@ -162,7 +162,7 @@ it("with data transforming (effect/schema)", async () => { const fileRoute = f(["image"]) .input( Schema.Struct({ - date: Schema.Date, + date: Schema.DateFromString, }), ) .middleware((opts) => { @@ -201,7 +201,7 @@ it("type errors for non-JSON data types (valibot)", () => { it("type errors for non-JSON data types (effect/schema)", () => { f(["image"]) // @ts-expect-error - Set is not a valid JSON type - .input(Schema.Struct({ foo: Schema.Set(Schema.String) })) + .input(Schema.Struct({ foo: Schema.ReadonlySet(Schema.String) })) .middleware(() => { return {}; }) diff --git a/packages/uploadthing/test/node/jsonl.test.ts b/packages/uploadthing/test/node/jsonl.test.ts index 80431ac491..9dea4d9716 100644 --- a/packages/uploadthing/test/node/jsonl.test.ts +++ b/packages/uploadthing/test/node/jsonl.test.ts @@ -53,7 +53,9 @@ describe("handleJsonLineStreaming", () => { const exit = yield* handleJsonLineStream( MetadataFetchStreamPart, onChunk, - )(Stream.fromReadableStream(() => readable, onError)).pipe(Effect.exit); + )( + Stream.fromReadableStream({ evaluate: () => readable, onError }), + ).pipe(Effect.exit); expect(exit).toEqual(Exit.succeed(undefined)); @@ -80,7 +82,9 @@ describe("handleJsonLineStreaming", () => { const exit = yield* handleJsonLineStream( MetadataFetchStreamPart, onChunk, - )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + )(Stream.fromReadableStream({ evaluate: () => stream, onError })).pipe( + Effect.exit, + ); expect(exit).toEqual(Exit.succeed(undefined)); @@ -117,7 +121,9 @@ describe("handleJsonLineStreaming", () => { const exit = yield* handleJsonLineStream( MetadataFetchStreamPart, onChunk, - )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + )(Stream.fromReadableStream({ evaluate: () => stream, onError })).pipe( + Effect.exit, + ); expect(exit).toEqual(Exit.succeed(undefined)); @@ -155,7 +161,9 @@ describe("handleJsonLineStreaming", () => { const exit = yield* handleJsonLineStream( MetadataFetchStreamPart, onChunk, - )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + )(Stream.fromReadableStream({ evaluate: () => stream, onError })).pipe( + Effect.exit, + ); expect(exit).toEqual(Exit.succeed(undefined)); @@ -187,7 +195,9 @@ describe("handleJsonLineStreaming", () => { const exit = yield* handleJsonLineStream( MetadataFetchStreamPart, onChunk, - )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + )(Stream.fromReadableStream({ evaluate: () => stream, onError })).pipe( + Effect.exit, + ); expect(exit).toEqual(Exit.succeed(undefined)); diff --git a/packages/uploadthing/test/node/request-handler.test.ts b/packages/uploadthing/test/node/request-handler.test.ts index 07957726d3..360e995419 100644 --- a/packages/uploadthing/test/node/request-handler.test.ts +++ b/packages/uploadthing/test/node/request-handler.test.ts @@ -113,7 +113,9 @@ describe("errors for invalid request input", () => { expect(res.status).toBe(400); await expect(res.json()).resolves.toEqual({ message: "Invalid input", - cause: expect.stringContaining('Expected "upload", actual "invalid"'), + cause: expect.stringContaining( + 'Expected "upload" | undefined, got "invalid"', + ), }); }); }); diff --git a/packages/uploadthing/test/node/sdk.test.ts b/packages/uploadthing/test/node/sdk.test.ts index 071f6ead59..0223a917fb 100644 --- a/packages/uploadthing/test/node/sdk.test.ts +++ b/packages/uploadthing/test/node/sdk.test.ts @@ -270,8 +270,7 @@ describe("uploadFilesFromUrl", () => { error: { code: "BAD_REQUEST", data: expect.objectContaining({ - _tag: "ResponseError", - description: "non 2xx status code", + _tag: "HttpClientError", }), message: "Failed to download requested file: StatusCode: non 2xx status code (404 GET https://cdn.foo.com/does-not-exist.txt)", @@ -313,8 +312,7 @@ describe("uploadFilesFromUrl", () => { error: { code: "BAD_REQUEST", data: expect.objectContaining({ - _tag: "ResponseError", - description: "non 2xx status code", + _tag: "HttpClientError", }), message: "Failed to download requested file: StatusCode: non 2xx status code (404 GET https://cdn.foo.com/does-not-exist.txt)", diff --git a/playground-v6/package.json b/playground-v6/package.json index 20226e79bc..8697198602 100644 --- a/playground-v6/package.json +++ b/playground-v6/package.json @@ -11,7 +11,7 @@ "dependencies": { "@uploadthing/react": "npm:@uploadthing/react@6", "clsx": "2.1.1", - "effect": "3.21.0", + "effect": "4.0.0-beta.93", "next": "canary", "react": "19.2.2", "react-dom": "19.2.2", diff --git a/playground/package.json b/playground/package.json index 015fb46853..5716354028 100644 --- a/playground/package.json +++ b/playground/package.json @@ -11,7 +11,7 @@ "dependencies": { "@uploadthing/react": "workspace:*", "class-variance-authority": "^0.7.1", - "effect": "3.21.0", + "effect": "4.0.0-beta.93", "lucide-react": "^0.469.0", "next": "canary", "react": "19.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 903248ba83..1c5363a0cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -245,13 +245,13 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react-swc': specifier: ^3.7.2 - version: 3.7.2(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 3.7.2(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) examples/backend-adapters/client-vanilla: dependencies: @@ -264,7 +264,7 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) examples/backend-adapters/client-vue: dependencies: @@ -280,25 +280,22 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + version: 5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vue-tsc: specifier: ^2.0.6 version: 2.2.0(typescript@5.8.3) examples/backend-adapters/server: dependencies: - '@effect/platform': - specifier: 0.96.0 - version: 0.96.0(effect@3.21.0) '@effect/platform-node': - specifier: 0.106.0 - version: 0.106.0(@effect/cluster@0.30.2(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0))(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0) + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93(effect@4.0.0-beta.93)(ioredis@5.6.1) '@elysiajs/cors': specifier: ^1.2.0 version: 1.2.0(elysia@1.2.9(@sinclair/typebox@0.34.13)(openapi-types@12.1.3)(typescript@5.8.3)) @@ -318,8 +315,8 @@ importers: specifier: ^16.4.5 version: 16.5.0 effect: - specifier: 3.21.0 - version: 3.21.0 + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93 elysia: specifier: ^1.2.9 version: 1.2.9(@sinclair/typebox@0.34.13)(openapi-types@12.1.3)(typescript@5.8.3) @@ -402,16 +399,16 @@ importers: dependencies: '@astrojs/node': specifier: ^9.0.0 - version: 9.0.0(astro@5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.7.0)) + version: 9.0.0(astro@5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.9.0)) '@astrojs/react': specifier: ^4.1.2 - version: 4.1.2(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.4.2)(lightningcss@1.29.3)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 4.1.2(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.4.2)(lightningcss@1.29.3)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) '@uploadthing/react': specifier: 7.3.3 version: link:../../packages/react astro: specifier: ^5.1.2 - version: 5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.7.0) + version: 5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.9.0) react: specifier: 19.2.2 version: 19.2.2 @@ -557,7 +554,7 @@ importers: version: link:../../packages/nuxt nuxt: specifier: ^3.15.0 - version: 3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) + version: 3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(yaml@2.9.0) uploadthing: specifier: 7.7.4 version: link:../../packages/uploadthing @@ -609,7 +606,7 @@ importers: version: 0.15.2(solid-js@1.9.3) '@solidjs/start': specifier: ^1.0.10 - version: 1.0.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 1.0.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@uploadthing/solid': specifier: 7.3.3 version: link:../../packages/solid @@ -621,7 +618,7 @@ importers: version: link:../../packages/uploadthing vinxi: specifier: ^0.5.1 - version: 0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0) + version: 0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0) devDependencies: autoprefixer: specifier: ^10.4.20 @@ -647,13 +644,13 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))) + version: 3.3.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))) '@sveltejs/kit': specifier: ^2.15.1 - version: 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) svelte: specifier: ^5.16.1 version: 5.16.1 @@ -665,7 +662,7 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) examples/minimal-tanstack-start: dependencies: @@ -674,7 +671,7 @@ importers: version: 1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2) '@tanstack/react-start': specifier: ^1.121.32 - version: 1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(encoding@0.1.13)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1) + version: 1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(encoding@0.1.13)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1) '@uploadthing/react': specifier: 7.3.3 version: link:../../packages/react @@ -699,7 +696,7 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) examples/profile-picture: dependencies: @@ -922,7 +919,7 @@ importers: devDependencies: '@react-router/dev': specifier: ^7.0.0 - version: 7.1.3(@react-router/serve@7.1.3(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(typescript@5.8.3))(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0))(yaml@2.7.0) + version: 7.1.3(@react-router/serve@7.1.3(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(typescript@5.8.3))(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0))(yaml@2.9.0) '@types/react': specifier: 19.2.7 version: 19.2.7 @@ -940,10 +937,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) examples/with-clerk-remix: dependencies: @@ -977,7 +974,7 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.12.0 - version: 2.15.2(@remix-run/react@2.15.2(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.8.3))(@remix-run/serve@2.15.2(typescript@5.8.3))(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0)) + version: 2.15.2(@remix-run/react@2.15.2(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.8.3))(@remix-run/serve@2.15.2(typescript@5.8.3))(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0)) '@types/react': specifier: 19.2.7 version: 19.2.7 @@ -995,10 +992,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) examples/with-drizzle-appdir: dependencies: @@ -1354,7 +1351,7 @@ importers: devDependencies: '@nuxt/devtools': specifier: 1.7.0 - version: 1.7.0(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + version: 1.7.0(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) '@nuxt/module-builder': specifier: ^0.8.4 version: 0.8.4(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@3.29.5))(nuxi@3.17.2)(typescript@5.8.3) @@ -1375,16 +1372,16 @@ importers: version: 1.15.3 nuxt: specifier: ^3.15.0 - version: 3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) + version: 3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(yaml@2.9.0) uploadthing: specifier: workspace:* version: link:../uploadthing vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) packages/nuxt/playground: devDependencies: @@ -1393,7 +1390,7 @@ importers: version: 6.12.2(magicast@0.3.5)(rollup@4.44.0) nuxt: specifier: ^3.15.0 - version: 3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) + version: 3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(yaml@2.9.0) packages/react: dependencies: @@ -1424,7 +1421,7 @@ importers: version: link:../../tooling/vitest-config '@vitest/browser': specifier: 3.2.4 - version: 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.2.4) + version: 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vitest@3.2.4) '@vitest/coverage-istanbul': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1460,7 +1457,7 @@ importers: version: link:../uploadthing vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vitest-browser-react: specifier: 0.3.0 version: 0.3.0(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(@vitest/browser@3.2.4)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(vitest@3.2.4) @@ -1477,15 +1474,15 @@ importers: specifier: workspace:* version: link:../mime-types effect: - specifier: 3.21.0 - version: 3.21.0 + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93 sqids: specifier: ^0.3.0 version: 0.3.0 devDependencies: '@effect/vitest': - specifier: 0.29.0 - version: 0.29.0(effect@3.21.0)(vitest@3.2.4) + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93(effect@4.0.0-beta.93)(vitest@3.2.4) '@types/react': specifier: 19.2.7 version: 19.2.7 @@ -1518,7 +1515,7 @@ importers: version: 5.8.3 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vue: specifier: ^3.4.21 version: 3.5.13(typescript@5.8.3) @@ -1552,10 +1549,10 @@ importers: version: 3.4.17 tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.9.0) tsup-preset-solid: specifier: 2.2.0 - version: 2.2.0(esbuild@0.24.2)(solid-js@1.9.3)(tsup@8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.7.0)) + version: 2.2.0(esbuild@0.24.2)(solid-js@1.9.3)(tsup@8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.9.0)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1577,16 +1574,16 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))) + version: 3.3.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))) '@sveltejs/kit': specifier: ^2.15.1 - version: 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@sveltejs/package': specifier: ^2.3.0 version: 2.3.7(svelte@5.16.1)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@uploadthing/eslint-config': specifier: workspace:* version: link:../../tooling/eslint-config @@ -1619,13 +1616,10 @@ importers: version: link:../uploadthing vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) packages/uploadthing: dependencies: - '@effect/platform': - specifier: 0.96.0 - version: 0.96.0(effect@3.21.0) '@standard-schema/spec': specifier: 1.0.0-beta.4 version: 1.0.0-beta.4 @@ -1636,12 +1630,12 @@ importers: specifier: workspace:* version: link:../shared effect: - specifier: 3.21.0 - version: 3.21.0 + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93 devDependencies: '@effect/vitest': - specifier: 0.29.0 - version: 0.29.0(effect@3.21.0)(vitest@3.2.4) + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93(effect@4.0.0-beta.93)(vitest@3.2.4) '@remix-run/server-runtime': specifier: ^2.12.0 version: 2.15.2(typescript@5.8.3) @@ -1686,7 +1680,7 @@ importers: version: 1.15.3 msw: specifier: 2.7.5 - version: 2.7.5(@types/node@22.12.0)(typescript@5.8.3) + version: 2.7.5(@types/node@25.5.0)(typescript@5.8.3) next: specifier: 15.5.8 version: 15.5.8(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) @@ -1707,7 +1701,7 @@ importers: version: 1.0.0-beta.9(typescript@5.8.3) vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vue: specifier: ^3.4.21 version: 3.5.13(typescript@5.8.3) @@ -1770,8 +1764,8 @@ importers: specifier: ^0.7.1 version: 0.7.1 effect: - specifier: 3.21.0 - version: 3.21.0 + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93 lucide-react: specifier: ^0.469.0 version: 0.469.0(react@19.2.2) @@ -1826,13 +1820,13 @@ importers: dependencies: '@uploadthing/react': specifier: npm:@uploadthing/react@6 - version: 6.8.0(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(solid-js@1.9.3)(uploadthing@6.13.3(@effect/platform@0.96.0(effect@3.21.0))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0))(vue@3.5.13(typescript@5.8.3)) + version: 6.8.0(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(solid-js@1.9.3)(uploadthing@6.13.3(@effect/platform@0.96.0(effect@4.0.0-beta.93))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0))(vue@3.5.13(typescript@5.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 effect: - specifier: 3.21.0 - version: 3.21.0 + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93 next: specifier: canary version: 15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) @@ -1844,7 +1838,7 @@ importers: version: 19.2.2(react@19.2.2) uploadthing: specifier: npm:uploadthing@6 - version: 6.13.3(@effect/platform@0.96.0(effect@3.21.0))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0) + version: 6.13.3(@effect/platform@0.96.0(effect@4.0.0-beta.93))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0) zod: specifier: ^3.24.1 version: 3.25.67 @@ -1923,11 +1917,11 @@ importers: tooling/tsconfig: dependencies: '@effect/language-service': - specifier: 0.84.3 - version: 0.84.3 + specifier: 0.86.4 + version: 0.86.4 effect: - specifier: 3.21.0 - version: 3.21.0 + specifier: 4.0.0-beta.93 + version: 4.0.0-beta.93 typescript: specifier: 5.8.3 version: 5.8.3 @@ -1939,7 +1933,7 @@ importers: version: link:../tsconfig '@vitest/browser': specifier: 3.2.4 - version: 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.2.4) + version: 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vitest@3.2.4) '@vitest/coverage-istanbul': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1957,7 +1951,7 @@ importers: version: 5.8.3 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) packages: @@ -3489,78 +3483,39 @@ packages: '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@effect/cluster@0.30.2': - resolution: {integrity: sha512-221SsceyBPTGIpt4WRWa6Hqtz4aGiKM7SQ48yWDZ7frdSrwxfd8IdQdU6zcJQei8YlTBYh5PPujO0m1b74625Q==} - peerDependencies: - '@effect/platform': ^0.80.14 - '@effect/rpc': ^0.56.2 - '@effect/sql': ^0.33.14 - effect: ^3.14.14 - - '@effect/experimental@0.44.14': - resolution: {integrity: sha512-soBCnKruHgXPPuxlFmw8DpvS6uuzDi2mytUwamfTttLMo5rydyFF9og6/c8MsUJyx4jadJzufDt2fhsxfsWxnQ==} - peerDependencies: - '@effect/platform': ^0.80.14 - effect: ^3.14.14 - ioredis: ^5 - lmdb: ^3 - peerDependenciesMeta: - ioredis: - optional: true - lmdb: - optional: true - - '@effect/language-service@0.84.3': - resolution: {integrity: sha512-zpxi6rLCwst/cBQd7ElwDvt36Y6Jvz8v6bCLnNiOL6OXvdLmqjOFWyzWZdMh92vvBQA/aVKhfIAAOP3o4wKt0A==} + '@effect/language-service@0.86.4': + resolution: {integrity: sha512-XzAPsbwCdm0gRh0E8wJu3wXECb00QraE3LnbObA4RgHn8u2TEbwAjmBadRnwSgOIElfzZjbsRqNR706/V54hDg==} hasBin: true - '@effect/platform-node-shared@0.59.0': - resolution: {integrity: sha512-3bq2YKKfLY7UFauZSxqZUneCXoA3SMSls82V+0RKunvRlfPuPQW0hVn6t1RkvEdh0PDoygWG2mZXYQa6Iqgp9A==} + '@effect/platform-node-shared@4.0.0-beta.93': + resolution: {integrity: sha512-XUqZ2u5GglBqY8q2jj4Q7GjN5K/enedk8auZM9rY/l5a/myaQTrQp3QnvpIK4/Yg0WFjLGuctGPMKWRk3OLIrA==} + engines: {node: '>=18.0.0'} peerDependencies: - '@effect/cluster': ^0.58.0 - '@effect/platform': ^0.96.0 - '@effect/rpc': ^0.75.0 - '@effect/sql': ^0.51.0 - effect: ^3.21.0 + effect: ^4.0.0-beta.93 - '@effect/platform-node@0.106.0': - resolution: {integrity: sha512-mpsJK2jNLVd0jQAjHKBo8j3wdKWznSGvfnKBcAuG/9Rr4mb8bMRZFLXHHT9wUP7EvnZ0tDZJgEDxkC+j+ByRag==} + '@effect/platform-node@4.0.0-beta.93': + resolution: {integrity: sha512-QagsCGR0ZOXaCQqS5qGR2mcDng4LiP2bYhiiX1D6UC8cT9vsusVVOHiJWn8CupeDx+yVnPcu81QmA/SDt6GM1w==} + engines: {node: '>=18.0.0'} peerDependencies: - '@effect/cluster': ^0.58.0 - '@effect/platform': ^0.96.0 - '@effect/rpc': ^0.75.0 - '@effect/sql': ^0.51.0 - effect: ^3.21.0 + effect: ^4.0.0-beta.93 + ioredis: ^5.7.0 '@effect/platform@0.96.0': resolution: {integrity: sha512-U7PLhkVzg7zzrgFvyWATOzD6reL87KG/fcdOxgLWBQ/J5CCU6qdPAVG+0o6o+IxcsLoqGwxs+rFxaFzrdtDV1A==} peerDependencies: effect: ^3.21.0 - '@effect/rpc@0.56.2': - resolution: {integrity: sha512-PY8MfVWUvebAnA04WWnooy6hzv0TA86qs8yS1k53DMsP0CnewdyA7aywmPkcB2ehiHfyNEyA0VYCMbG8jRtL2Q==} - peerDependencies: - '@effect/platform': ^0.80.14 - effect: ^3.14.14 - '@effect/schema@0.68.18': resolution: {integrity: sha512-+knLs36muKsyqIvQTB0itGp5Lwy+5jgEC0G5P8wSsrB6EWGFirS87QjbaFYGbg32l/P51RM+9cPMiAEyICwN6g==} deprecated: this package has been merged into the main effect package peerDependencies: effect: ^3.4.8 - '@effect/sql@0.33.14': - resolution: {integrity: sha512-R00NLgF4/Abwhd4X+Ip4Wq1xQ1VEEgAGSeBgV0SB+Vk6imU7zwo4Qydk9L+IllEbtLV0rfiWEKgCqiBtekKN5w==} - peerDependencies: - '@effect/experimental': ^0.44.14 - '@effect/platform': ^0.80.14 - effect: ^3.14.14 - - '@effect/vitest@0.29.0': - resolution: {integrity: sha512-DvWr1aeEcaZ8mtu8hNVb4e3rEYvGEwQSr7wsNrW53t6nKYjkmjRICcvVEsXUhjoCblRHSxRsRV0TOt0+UmcvaQ==} + '@effect/vitest@4.0.0-beta.93': + resolution: {integrity: sha512-gMAnZ9PiMeJMDED9s0jWgCOhc2JccrTCxowhur/KriImsHnHIRj4VG/vK0xLw0Axe4AkTWzXNdRsFrYOjBTl3A==} peerDependencies: - effect: ^3.21.0 - vitest: ^3.2.0 + effect: ^4.0.0-beta.93 + vitest: ^3.0.0 || ^4.0.0 '@egjs/agent@2.4.3': resolution: {integrity: sha512-XvksSENe8wPeFlEVouvrOhKdx8HMniJ3by7sro2uPF3M6QqWwjzVcmvwoPtdjiX8O1lfRoLhQMp1a7NGlVTdIA==} @@ -5613,31 +5568,61 @@ packages: cpu: [arm64] os: [darwin] + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} + cpu: [arm64] + os: [darwin] + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} cpu: [x64] os: [darwin] + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} + cpu: [x64] + os: [darwin] + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} cpu: [arm64] os: [linux] + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} + cpu: [arm64] + os: [linux] + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} cpu: [arm] os: [linux] + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} + cpu: [arm] + os: [linux] + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} cpu: [x64] os: [linux] + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} + cpu: [x64] + os: [linux] + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} cpu: [x64] os: [win32] + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} + cpu: [x64] + os: [win32] + '@mswjs/interceptors@0.37.4': resolution: {integrity: sha512-YUenGsnvhhuBkabJZrga8dv/8QFRBe/isTb5CYvmzaI/IISLIkKp8kItSu9URY9tsJLvkPkq2W48OU/piDvfnA==} engines: {node: '>=18'} @@ -5954,10 +5939,6 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@opentelemetry/semantic-conventions@1.40.0': - resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} - engines: {node: '>=14'} - '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -8674,6 +8655,9 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/ws@8.5.14': resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} @@ -10970,12 +10954,12 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@3.21.0: - resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==} - effect@3.4.8: resolution: {integrity: sha512-qOQNrSSN3ITuAtARtN2Ldq6E5f42splY9VV18LqpKOXMwQCCEWkXdns4by3D2CJnDXQD2KCE0iGcRR2KowiQIA==} + effect@4.0.0-beta.93: + resolution: {integrity: sha512-wNS5MKFa3C42uBfIDik2oJ78lhpoYz2hN4oBR0229BeeDCIrkg/FiOvoiPGdCVlWa7MEKxEL5I0f8AILVHSD9A==} + electron-to-chromium@1.5.331: resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} @@ -11692,6 +11676,10 @@ packages: resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} engines: {node: '>=8.0.0'} + fast-check@4.8.0: + resolution: {integrity: sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg==} + engines: {node: '>=12.17.0'} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -12595,6 +12583,10 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@7.0.0: + resolution: {integrity: sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -13267,6 +13259,9 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + kubernetes-types@1.30.0: + resolution: {integrity: sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==} + kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -14371,9 +14366,16 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} + hasBin: true + msgpackr@1.11.9: resolution: {integrity: sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==} + msgpackr@2.0.4: + resolution: {integrity: sha512-o1C5KRmuRt+apqMr1HuGSqWStZoRBUpEsCsl15uM9VdAF1qHLtvMOU2En747EnTyEl6c4pzPewRMFF31s1CNbA==} + msw@2.7.5: resolution: {integrity: sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==} engines: {node: '>=18'} @@ -16037,6 +16039,9 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@8.4.1: + resolution: {integrity: sha512-c58R2+SPFcSIPXoU834QN/KPDDOSd8sXcSrqf6e83Me6Rrp1EYkxukkjXMVrKvKaADs1SOyNkWdfvLf6zY8qLQ==} + qrcode-terminal@0.11.0: resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} hasBin: true @@ -17683,6 +17688,10 @@ packages: toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + toml@4.1.2: + resolution: {integrity: sha512-m0vXfHODcw3gk+KONAOlVQ5yNHc3yS3B1ybM3HS1vqDoS0RWTDDVBVVTYi8hH0k+2OM1vmo9fb1WX9EVqjqfHA==} + engines: {node: '>=20'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -18013,6 +18022,10 @@ packages: resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==} engines: {node: '>=20.18.1'} + undici@8.7.0: + resolution: {integrity: sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==} + engines: {node: '>=22.19.0'} + unenv-nightly@2.0.0-20241204-140205-a5d5190: resolution: {integrity: sha512-jpmAytLeiiW01pl5bhVn9wYJ4vtiLdhGe10oXlJBuQEX8mxjxO8BlEXGHU4vr4yEikjFP1wsomTHt/CLU8kUwg==} @@ -18373,16 +18386,23 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + uuid@14.0.1: + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} + hasBin: true + uuid@7.0.3: resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uvu@0.5.6: @@ -19140,6 +19160,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -19457,9 +19482,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@9.0.0(astro@5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.7.0))': + '@astrojs/node@9.0.0(astro@5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.9.0))': dependencies: - astro: 5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.7.0) + astro: 5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.9.0) send: 1.2.0 server-destroy: 1.0.1 transitivePeerDependencies: @@ -19469,15 +19494,15 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/react@4.1.2(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.4.2)(lightningcss@1.29.3)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)': + '@astrojs/react@4.1.2(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.4.2)(lightningcss@1.29.3)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)': dependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@vitejs/plugin-react': 4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitejs/plugin-react': 4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) react: 19.2.2 react-dom: 19.2.2(react@19.2.2) ultrahtml: 1.6.0 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -19640,7 +19665,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.4 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -22205,81 +22230,45 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@effect/cluster@0.30.2(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0)': - dependencies: - '@effect/platform': 0.96.0(effect@3.21.0) - '@effect/rpc': 0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0) - '@effect/sql': 0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0) - effect: 3.21.0 - - '@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1)': - dependencies: - '@effect/platform': 0.96.0(effect@3.21.0) - effect: 3.21.0 - uuid: 11.1.0 - optionalDependencies: - ioredis: 5.6.1 - - '@effect/language-service@0.84.3': {} + '@effect/language-service@0.86.4': {} - '@effect/platform-node-shared@0.59.0(@effect/cluster@0.30.2(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0))(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0)': + '@effect/platform-node-shared@4.0.0-beta.93(effect@4.0.0-beta.93)': dependencies: - '@effect/cluster': 0.30.2(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0) - '@effect/platform': 0.96.0(effect@3.21.0) - '@effect/rpc': 0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0) - '@effect/sql': 0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0) - '@parcel/watcher': 2.5.6 - effect: 3.21.0 - multipasta: 0.2.7 + '@types/ws': 8.18.1 + effect: 4.0.0-beta.93 ws: 8.20.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@0.106.0(@effect/cluster@0.30.2(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0))(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0)': + '@effect/platform-node@4.0.0-beta.93(effect@4.0.0-beta.93)(ioredis@5.6.1)': dependencies: - '@effect/cluster': 0.30.2(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0) - '@effect/platform': 0.96.0(effect@3.21.0) - '@effect/platform-node-shared': 0.59.0(@effect/cluster@0.30.2(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0))(@effect/platform@0.96.0(effect@3.21.0))(@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0))(effect@3.21.0) - '@effect/rpc': 0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0) - '@effect/sql': 0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0) - effect: 3.21.0 - mime: 3.0.0 - undici: 7.24.7 - ws: 8.20.0 + '@effect/platform-node-shared': 4.0.0-beta.93(effect@4.0.0-beta.93) + effect: 4.0.0-beta.93 + ioredis: 5.6.1 + mime: 4.1.0 + undici: 8.7.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform@0.96.0(effect@3.21.0)': + '@effect/platform@0.96.0(effect@4.0.0-beta.93)': dependencies: - effect: 3.21.0 + effect: 4.0.0-beta.93 find-my-way-ts: 0.1.6 msgpackr: 1.11.9 multipasta: 0.2.7 - - '@effect/rpc@0.56.2(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)': - dependencies: - '@effect/platform': 0.96.0(effect@3.21.0) - effect: 3.21.0 + optional: true '@effect/schema@0.68.18(effect@3.4.8)': dependencies: effect: 3.4.8 fast-check: 3.23.2 - '@effect/sql@0.33.14(@effect/experimental@0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1))(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)': - dependencies: - '@effect/experimental': 0.44.14(@effect/platform@0.96.0(effect@3.21.0))(effect@3.21.0)(ioredis@5.6.1) - '@effect/platform': 0.96.0(effect@3.21.0) - '@opentelemetry/semantic-conventions': 1.40.0 - effect: 3.21.0 - uuid: 11.1.0 - - '@effect/vitest@0.29.0(effect@3.21.0)(vitest@3.2.4)': + '@effect/vitest@4.0.0-beta.93(effect@4.0.0-beta.93)(vitest@3.2.4)': dependencies: - effect: 3.21.0 - vitest: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + effect: 4.0.0-beta.93 + vitest: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) '@egjs/agent@2.4.3': {} @@ -23882,7 +23871,6 @@ snapshots: '@inquirer/core': 10.1.2(@types/node@25.5.0) '@inquirer/type': 3.0.2(@types/node@25.5.0) '@types/node': 25.5.0 - optional: true '@inquirer/core@10.1.2(@types/node@22.12.0)': dependencies: @@ -23911,7 +23899,6 @@ snapshots: yoctocolors-cjs: 2.1.2 transitivePeerDependencies: - '@types/node' - optional: true '@inquirer/figures@1.0.9': {} @@ -23922,7 +23909,6 @@ snapshots: '@inquirer/type@3.0.2(@types/node@25.5.0)': dependencies: '@types/node': 25.5.0 - optional: true '@internationalized/date@3.7.0': dependencies: @@ -24305,21 +24291,39 @@ snapshots: '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + optional: true + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': optional: true + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + optional: true + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': optional: true + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + optional: true + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': optional: true + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + optional: true + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': optional: true + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + optional: true + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + optional: true + '@mswjs/interceptors@0.37.4': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -24545,23 +24549,23 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@3.29.5) '@nuxt/schema': 3.15.0(magicast@0.3.5)(rollup@3.29.5) execa: 7.2.0 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - magicast - rollup - supports-color - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.44.0) '@nuxt/schema': 3.15.0(magicast@0.3.5)(rollup@4.44.0) execa: 7.2.0 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - magicast - rollup @@ -24580,13 +24584,13 @@ snapshots: rc9: 2.1.2 semver: 7.7.2 - '@nuxt/devtools@1.7.0(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))': + '@nuxt/devtools@1.7.0(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@nuxt/devtools-wizard': 1.7.0 '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@3.29.5) - '@vue/devtools-core': 7.6.8(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + '@vue/devtools-core': 7.6.8(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) '@vue/devtools-kit': 7.6.8 birpc: 0.2.19 consola: 3.4.2 @@ -24615,9 +24619,9 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 unimport: 3.14.5(rollup@3.29.5) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@3.29.5))(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) - vite-plugin-vue-inspector: 5.3.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@3.29.5))(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) + vite-plugin-vue-inspector: 5.3.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) which: 3.0.1 ws: 8.18.2 transitivePeerDependencies: @@ -24627,13 +24631,13 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@1.7.0(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))': + '@nuxt/devtools@1.7.0(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@nuxt/devtools-wizard': 1.7.0 '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.44.0) - '@vue/devtools-core': 7.6.8(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + '@vue/devtools-core': 7.6.8(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) '@vue/devtools-kit': 7.6.8 birpc: 0.2.19 consola: 3.4.2 @@ -24662,9 +24666,9 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 unimport: 3.14.5(rollup@4.44.0) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@4.44.0))(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) - vite-plugin-vue-inspector: 5.3.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@4.44.0))(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) + vite-plugin-vue-inspector: 5.3.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) which: 3.0.1 ws: 8.18.2 transitivePeerDependencies: @@ -24828,16 +24832,16 @@ snapshots: - rollup - supports-color - '@nuxt/vite-builder@3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0)': + '@nuxt/vite-builder@3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.9.0)': dependencies: '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@3.29.5) '@rollup/plugin-replace': 6.0.2(rollup@3.29.5) - '@vitejs/plugin-vue': 5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) - '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + '@vitejs/plugin-vue': 5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) + '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) autoprefixer: 10.4.20(postcss@8.4.49) consola: 3.4.2 cssnano: 7.0.6(postcss@8.4.49) - defu: 6.1.4 + defu: 6.1.6 esbuild: 0.24.2 escape-string-regexp: 5.0.0 externality: 1.0.2 @@ -24847,19 +24851,19 @@ snapshots: knitwork: 1.2.0 magic-string: 0.30.17 mlly: 1.7.4 - ohash: 1.1.4 + ohash: 1.1.6 pathe: 1.1.2 perfect-debounce: 1.0.0 pkg-types: 1.3.1 postcss: 8.4.49 rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.32)(rollup@3.29.5) std-env: 3.9.0 - ufo: 1.6.1 + ufo: 1.6.3 unenv: 1.10.0 unplugin: 2.3.5 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vite-node: 2.1.8(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) - vite-plugin-checker: 0.8.0(eslint@9.25.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vite-node: 2.1.8(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) + vite-plugin-checker: 0.8.0(eslint@9.25.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) vue: 3.5.13(typescript@5.8.3) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -24887,16 +24891,16 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0)': + '@nuxt/vite-builder@3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.9.0)': dependencies: '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.44.0) '@rollup/plugin-replace': 6.0.2(rollup@4.44.0) - '@vitejs/plugin-vue': 5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) - '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + '@vitejs/plugin-vue': 5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) + '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) autoprefixer: 10.4.20(postcss@8.4.49) consola: 3.4.2 cssnano: 7.0.6(postcss@8.4.49) - defu: 6.1.4 + defu: 6.1.6 esbuild: 0.24.2 escape-string-regexp: 5.0.0 externality: 1.0.2 @@ -24906,19 +24910,19 @@ snapshots: knitwork: 1.2.0 magic-string: 0.30.17 mlly: 1.7.4 - ohash: 1.1.4 + ohash: 1.1.6 pathe: 1.1.2 perfect-debounce: 1.0.0 pkg-types: 1.3.1 postcss: 8.4.49 rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.32)(rollup@4.44.0) std-env: 3.9.0 - ufo: 1.6.1 + ufo: 1.6.3 unenv: 1.10.0 unplugin: 2.3.5 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vite-node: 2.1.8(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) - vite-plugin-checker: 0.8.0(eslint@9.25.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vite-node: 2.1.8(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) + vite-plugin-checker: 0.8.0(eslint@9.25.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) vue: 3.5.13(typescript@5.8.3) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -25072,8 +25076,6 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opentelemetry/semantic-conventions@1.40.0': {} - '@oslojs/encoding@1.1.0': {} '@oxc-project/runtime@0.81.0': {} @@ -26780,7 +26782,7 @@ snapshots: dependencies: nanoid: 3.3.8 - '@react-router/dev@7.1.3(@react-router/serve@7.1.3(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(typescript@5.8.3))(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0))(yaml@2.7.0)': + '@react-router/dev@7.1.3(@react-router/serve@7.1.3(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(typescript@5.8.3))(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0))(yaml@2.9.0)': dependencies: '@babel/core': 7.27.4 '@babel/generator': 7.28.3 @@ -26811,8 +26813,8 @@ snapshots: semver: 7.7.2 set-cookie-parser: 2.7.1 valibot: 0.41.0(typescript@5.8.3) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vite-node: 3.0.0-beta.2(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vite-node: 3.0.0-beta.2(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) optionalDependencies: '@react-router/serve': 7.1.3(react-router@7.1.3(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(typescript@5.8.3) typescript: 5.8.3 @@ -26876,7 +26878,7 @@ snapshots: '@remirror/core-constants@2.0.2': {} - '@remix-run/dev@2.15.2(@remix-run/react@2.15.2(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.8.3))(@remix-run/serve@2.15.2(typescript@5.8.3))(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0))': + '@remix-run/dev@2.15.2(@remix-run/react@2.15.2(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.8.3))(@remix-run/serve@2.15.2(typescript@5.8.3))(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(wrangler@3.99.0(@cloudflare/workers-types@4.20241230.0))': dependencies: '@babel/core': 7.27.4 '@babel/generator': 7.28.3 @@ -26893,7 +26895,7 @@ snapshots: '@remix-run/router': 1.21.0 '@remix-run/server-runtime': 2.15.2(typescript@5.8.3) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) + '@vanilla-extract/integration': 6.5.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -26932,12 +26934,12 @@ snapshots: tar-fs: 2.1.2 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.8.3) - vite-node: 1.6.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) + vite-node: 1.6.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) ws: 7.5.10 optionalDependencies: '@remix-run/serve': 2.15.2(typescript@5.8.3) typescript: 5.8.3 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) wrangler: 3.99.0(@cloudflare/workers-types@4.20241230.0) transitivePeerDependencies: - '@types/node' @@ -27667,11 +27669,11 @@ snapshots: dependencies: solid-js: 1.9.3 - '@solidjs/start@1.0.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@solidjs/start@1.0.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: - '@vinxi/plugin-directives': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0)) - '@vinxi/server-components': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0)) - '@vinxi/server-functions': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0)) + '@vinxi/plugin-directives': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0)) + '@vinxi/server-components': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0)) + '@vinxi/server-functions': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.11 @@ -27682,7 +27684,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.3) tinyglobby: 0.2.14 - vite-plugin-solid: 2.11.0(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-solid: 2.11.0(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) transitivePeerDependencies: - '@testing-library/jest-dom' - solid-js @@ -27696,14 +27698,14 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))': dependencies: - '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) import-meta-resolve: 4.1.0 - '@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -27717,7 +27719,7 @@ snapshots: sirv: 3.0.1 svelte: 5.16.1 tiny-glob: 0.2.9 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) '@sveltejs/package@2.3.7(svelte@5.16.1)(typescript@5.8.3)': dependencies: @@ -27730,25 +27732,25 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) debug: 4.4.1 svelte: 5.16.1 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(svelte@5.16.1)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.16.1 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vitefu: 1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vitefu: 1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -27953,7 +27955,7 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.17 - '@tanstack/directive-functions-plugin@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@tanstack/directive-functions-plugin@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.4 @@ -27962,7 +27964,7 @@ snapshots: '@tanstack/router-utils': 1.121.21 babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -27998,11 +28000,11 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-plugin@1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1)': + '@tanstack/react-start-plugin@1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1)': dependencies: - '@tanstack/start-plugin-core': 1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1) - '@vitejs/plugin-react': 4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + '@tanstack/start-plugin-core': 1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1) + '@vitejs/plugin-react': 4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) zod: 3.25.67 transitivePeerDependencies: - '@azure/app-configuration' @@ -28048,17 +28050,17 @@ snapshots: react: 19.2.2 react-dom: 19.2.2(react@19.2.2) - '@tanstack/react-start@1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(encoding@0.1.13)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1)': + '@tanstack/react-start@1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(encoding@0.1.13)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1)': dependencies: '@tanstack/react-start-client': 1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2) - '@tanstack/react-start-plugin': 1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1) + '@tanstack/react-start-plugin': 1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1) '@tanstack/react-start-server': 1.121.32(react-dom@19.2.2(react@19.2.2))(react@19.2.2) - '@tanstack/start-server-functions-client': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) - '@tanstack/start-server-functions-server': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) - '@vitejs/plugin-react': 4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@tanstack/start-server-functions-client': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) + '@tanstack/start-server-functions-server': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) + '@vitejs/plugin-react': 4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) react: 19.2.2 react-dom: 19.2.2(react@19.2.2) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -28123,7 +28125,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.121.29(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1)': + '@tanstack/router-plugin@1.121.29(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1)': dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) @@ -28141,7 +28143,7 @@ snapshots: zod: 3.25.67 optionalDependencies: '@tanstack/react-router': 1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) webpack: 5.97.1 transitivePeerDependencies: - supports-color @@ -28157,7 +28159,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@tanstack/server-functions-plugin@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.4 @@ -28166,7 +28168,7 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.27.4 '@babel/types': 7.28.2 - '@tanstack/directive-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@tanstack/directive-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -28180,16 +28182,16 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1)': + '@tanstack/start-plugin-core@1.121.32(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(encoding@0.1.13)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1)': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.4 '@babel/types': 7.28.2 '@tanstack/router-core': 1.121.27 '@tanstack/router-generator': 1.121.27 - '@tanstack/router-plugin': 1.121.29(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(webpack@5.97.1) + '@tanstack/router-plugin': 1.121.29(@tanstack/react-router@1.121.27(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(webpack@5.97.1) '@tanstack/router-utils': 1.121.21 - '@tanstack/server-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@tanstack/server-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@tanstack/start-server-core': 1.121.32 '@types/babel__code-frame': 7.0.6 '@types/babel__core': 7.20.5 @@ -28199,7 +28201,7 @@ snapshots: nitropack: 2.11.12(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(rolldown@1.0.0-beta.32)(uploadthing@packages+uploadthing) pathe: 2.0.3 ufo: 1.6.3 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) xmlbuilder2: 3.1.1 zod: 3.25.67 transitivePeerDependencies: @@ -28246,9 +28248,9 @@ snapshots: tiny-warning: 1.0.3 unctx: 2.4.1 - '@tanstack/start-server-functions-client@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@tanstack/start-server-functions-client@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: - '@tanstack/server-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@tanstack/server-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@tanstack/start-server-functions-fetcher': 1.121.27 transitivePeerDependencies: - supports-color @@ -28259,9 +28261,9 @@ snapshots: '@tanstack/router-core': 1.121.27 '@tanstack/start-client-core': 1.121.27 - '@tanstack/start-server-functions-server@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@tanstack/start-server-functions-server@1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: - '@tanstack/server-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@tanstack/server-functions-plugin': 1.121.31(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color @@ -28711,7 +28713,6 @@ snapshots: '@types/node@22.19.15': dependencies: undici-types: 6.21.0 - optional: true '@types/node@25.5.0': dependencies: @@ -28766,6 +28767,10 @@ snapshots: '@types/web-bluetooth@0.0.20': {} + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.19.15 + '@types/ws@8.5.14': dependencies: '@types/node': 22.12.0 @@ -28786,7 +28791,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.12.0 + '@types/node': 22.19.15 optional: true '@typescript-eslint/eslint-plugin@8.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3)': @@ -28915,14 +28920,14 @@ snapshots: '@uploadthing/mime-types@0.2.10': {} - '@uploadthing/react@6.8.0(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(solid-js@1.9.3)(uploadthing@6.13.3(@effect/platform@0.96.0(effect@3.21.0))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0))(vue@3.5.13(typescript@5.8.3))': + '@uploadthing/react@6.8.0(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(solid-js@1.9.3)(uploadthing@6.13.3(@effect/platform@0.96.0(effect@4.0.0-beta.93))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0))(vue@3.5.13(typescript@5.8.3))': dependencies: '@uploadthing/dropzone': 0.4.1(react@19.2.2)(solid-js@1.9.3)(vue@3.5.13(typescript@5.8.3)) '@uploadthing/shared': 6.7.9 file-selector: 0.6.0 react: 19.2.2 tailwind-merge: 2.6.0 - uploadthing: 6.13.3(@effect/platform@0.96.0(effect@3.21.0))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0) + uploadthing: 6.13.3(@effect/platform@0.96.0(effect@4.0.0-beta.93))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0) optionalDependencies: next: 15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) transitivePeerDependencies: @@ -28990,7 +28995,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0)': + '@vanilla-extract/integration@6.5.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1)': dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) @@ -29003,8 +29008,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.4 outdent: 0.8.0 - vite: 5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) - vite-node: 1.6.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) + vite: 5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) + vite-node: 1.6.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -29058,7 +29063,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0))': + '@vinxi/plugin-directives@0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0))': dependencies: '@babel/parser': 7.28.3 acorn: 8.14.1 @@ -29069,73 +29074,73 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0) + vinxi: 0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0) - '@vinxi/server-components@0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0))': + '@vinxi/server-components@0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0))': dependencies: - '@vinxi/plugin-directives': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0)) + '@vinxi/plugin-directives': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0)) acorn: 8.14.1 acorn-loose: 8.4.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.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0) + vinxi: 0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0) - '@vinxi/server-functions@0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0))': + '@vinxi/server-functions@0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0))': dependencies: - '@vinxi/plugin-directives': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0)) + '@vinxi/plugin-directives': 0.4.3(vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0)) acorn: 8.14.1 acorn-loose: 8.4.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.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0) + vinxi: 0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0) - '@vitejs/plugin-react-swc@3.7.2(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@vitejs/plugin-react-swc@3.7.2(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@swc/core': 1.11.22 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.27.4) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.27.4) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.1.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))': + '@vitejs/plugin-vue-jsx@4.1.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.27.4) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vue: 3.5.13(typescript@5.8.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3))': dependencies: - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vue: 3.5.13(typescript@5.8.3) - '@vitest/browser@3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) ws: 8.18.2 optionalDependencies: playwright: 1.52.0 @@ -29145,16 +29150,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) ws: 8.18.2 optionalDependencies: playwright: 1.52.0 @@ -29176,7 +29181,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -29188,23 +29193,23 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.5(@types/node@22.12.0)(typescript@5.8.3) - vite: 6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) - '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.5(@types/node@25.5.0)(typescript@5.8.3) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -29375,14 +29380,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.8(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))': + '@vue/devtools-core@7.6.8(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3))': dependencies: '@vue/devtools-kit': 7.6.8 '@vue/devtools-shared': 7.6.8 mitt: 3.0.1 nanoid: 5.0.9 pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-hot-client: 0.2.4(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) vue: 3.5.13(typescript@5.8.3) transitivePeerDependencies: - vite @@ -29977,7 +29982,7 @@ snapshots: astring@1.9.0: {} - astro@5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.7.0): + astro@5.1.2(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(yaml@2.9.0): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.2 @@ -30029,8 +30034,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.16.0(db0@0.3.2)(ioredis@5.6.1)(uploadthing@packages+uploadthing) vfile: 6.0.3 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vitefu: 1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vitefu: 1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) which-pm: 3.0.0 xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 @@ -30515,12 +30520,12 @@ snapshots: dependencies: chokidar: 4.0.3 confbox: 0.1.8 - defu: 6.1.4 + defu: 6.1.6 dotenv: 16.5.0 giget: 1.2.3 jiti: 2.4.2 mlly: 1.7.4 - ohash: 1.1.4 + ohash: 1.1.6 pathe: 1.1.2 perfect-debounce: 1.0.0 pkg-types: 1.3.1 @@ -30532,7 +30537,7 @@ snapshots: dependencies: chokidar: 4.0.3 confbox: 0.2.2 - defu: 6.1.4 + defu: 6.1.6 dotenv: 16.5.0 exsolve: 1.0.7 giget: 2.0.0 @@ -30741,7 +30746,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 22.12.0 + '@types/node': 22.19.15 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -30753,7 +30758,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.15 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -31626,12 +31631,20 @@ snapshots: ee-first@1.1.1: {} - effect@3.21.0: + effect@3.4.8: {} + + effect@4.0.0-beta.93: dependencies: '@standard-schema/spec': 1.1.0 - fast-check: 3.23.2 - - effect@3.4.8: {} + fast-check: 4.8.0 + find-my-way-ts: 0.1.6 + ini: 7.0.0 + kubernetes-types: 1.30.0 + msgpackr: 2.0.4 + multipasta: 0.2.7 + toml: 4.1.2 + uuid: 14.0.1 + yaml: 2.9.0 electron-to-chromium@1.5.331: {} @@ -32425,7 +32438,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.12.0 + '@types/node': 22.19.15 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -32875,7 +32888,7 @@ snapshots: enhanced-resolve: 5.18.0 mlly: 1.7.4 pathe: 1.1.2 - ufo: 1.6.1 + ufo: 1.6.3 extract-zip@2.0.1: dependencies: @@ -32891,6 +32904,10 @@ snapshots: dependencies: pure-rand: 6.1.0 + fast-check@4.8.0: + dependencies: + pure-rand: 8.4.1 + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} @@ -33368,10 +33385,10 @@ snapshots: dependencies: citty: 0.1.6 consola: 3.4.2 - defu: 6.1.4 + defu: 6.1.6 node-fetch-native: 1.6.6 nypm: 0.3.11 - ohash: 1.1.4 + ohash: 1.1.6 pathe: 1.1.2 tar: 6.2.1 @@ -33379,7 +33396,7 @@ snapshots: dependencies: citty: 0.1.6 consola: 3.4.2 - defu: 6.1.4 + defu: 6.1.6 node-fetch-native: 1.6.6 nypm: 0.6.0 pathe: 2.0.3 @@ -34021,6 +34038,8 @@ snapshots: ini@4.1.1: {} + ini@7.0.0: {} + inline-style-parser@0.1.1: {} inline-style-parser@0.2.4: {} @@ -34453,7 +34472,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.12.0 + '@types/node': 22.19.15 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -34720,6 +34739,8 @@ snapshots: kolorist@1.8.0: {} + kubernetes-types@1.30.0: {} + kuler@2.0.0: {} ky@1.7.4: {} @@ -36370,9 +36391,26 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true + msgpackr-extract@3.0.4: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 + optional: true + msgpackr@1.11.9: optionalDependencies: msgpackr-extract: 3.0.3 + optional: true + + msgpackr@2.0.4: + optionalDependencies: + msgpackr-extract: 3.0.4 msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3): dependencies: @@ -36423,7 +36461,6 @@ snapshots: typescript: 5.8.3 transitivePeerDependencies: - '@types/node' - optional: true muggle-string@0.4.1: {} @@ -36580,7 +36617,7 @@ snapshots: croner: 9.0.0 crossws: 0.3.5 db0: 0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)) - defu: 6.1.4 + defu: 6.1.6 destr: 2.0.5 dot-prop: 9.0.0 esbuild: 0.25.5 @@ -36618,7 +36655,7 @@ snapshots: serve-static: 2.2.0 source-map: 0.7.4 std-env: 3.9.0 - ufo: 1.6.1 + ufo: 1.6.3 ultrahtml: 1.6.0 uncrypto: 0.1.3 unctx: 2.4.1 @@ -36859,14 +36896,14 @@ snapshots: nuxi@3.17.2: {} - nuxt@3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0): + nuxt@3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(yaml@2.9.0): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.7.0(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + '@nuxt/devtools': 1.7.0(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@3.29.5) '@nuxt/schema': 3.15.0(magicast@0.3.5)(rollup@3.29.5) '@nuxt/telemetry': 2.6.2(magicast@0.3.5)(rollup@3.29.5) - '@nuxt/vite-builder': 3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0) + '@nuxt/vite-builder': 3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@3.29.5)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.9.0) '@unhead/dom': 1.11.18 '@unhead/shared': 1.11.18 '@unhead/ssr': 1.11.14 @@ -36981,14 +37018,14 @@ snapshots: - xml2js - yaml - nuxt@3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0): + nuxt@3.15.0(@libsql/client@0.14.0)(@parcel/watcher@2.5.6)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(eslint@9.25.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(uploadthing@packages+uploadthing)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(yaml@2.9.0): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.7.0(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3)) + '@nuxt/devtools': 1.7.0(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vue@3.5.13(typescript@5.8.3)) '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.44.0) '@nuxt/schema': 3.15.0(magicast@0.3.5)(rollup@4.44.0) '@nuxt/telemetry': 2.6.2(magicast@0.3.5)(rollup@4.44.0) - '@nuxt/vite-builder': 3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0) + '@nuxt/vite-builder': 3.15.0(@types/node@25.5.0)(eslint@9.25.1(jiti@2.4.2))(lightningcss@1.29.3)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.32)(rollup@4.44.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))(yaml@2.9.0) '@unhead/dom': 1.11.18 '@unhead/shared': 1.11.18 '@unhead/ssr': 1.11.14 @@ -37142,7 +37179,7 @@ snapshots: execa: 8.0.1 pathe: 1.1.2 pkg-types: 1.3.1 - ufo: 1.6.1 + ufo: 1.6.3 nypm@0.4.1: dependencies: @@ -37151,7 +37188,7 @@ snapshots: pathe: 1.1.2 pkg-types: 1.3.1 tinyexec: 0.3.2 - ufo: 1.6.1 + ufo: 1.6.3 nypm@0.6.0: dependencies: @@ -37216,7 +37253,7 @@ snapshots: dependencies: destr: 2.0.5 node-fetch-native: 1.6.6 - ufo: 1.6.1 + ufo: 1.6.3 ohash@1.1.4: {} @@ -37780,14 +37817,14 @@ snapshots: postcss: 8.4.49 tsx: 4.19.2 - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.7.0): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.4.2 postcss: 8.4.49 tsx: 4.19.2 - yaml: 2.7.0 + yaml: 2.9.0 postcss-merge-longhand@6.0.5(postcss@8.4.49): dependencies: @@ -38394,6 +38431,8 @@ snapshots: pure-rand@6.1.0: {} + pure-rand@8.4.1: {} + qrcode-terminal@0.11.0: {} qs@6.13.0: @@ -40617,6 +40656,8 @@ snapshots: toml@3.0.0: {} + toml@4.1.2: {} + totalist@3.0.1: {} tough-cookie@4.1.4: @@ -40707,16 +40748,16 @@ snapshots: tsscmp@1.0.6: {} - tsup-preset-solid@2.2.0(esbuild@0.24.2)(solid-js@1.9.3)(tsup@8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.7.0)): + tsup-preset-solid@2.2.0(esbuild@0.24.2)(solid-js@1.9.3)(tsup@8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.9.0)): dependencies: esbuild-plugin-solid: 0.5.0(esbuild@0.24.2)(solid-js@1.9.3) - tsup: 8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.7.0) + tsup: 8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.9.0) transitivePeerDependencies: - esbuild - solid-js - supports-color - tsup@8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.7.0): + tsup@8.3.5(@swc/core@1.11.22)(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.9.0): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -40726,7 +40767,7 @@ snapshots: esbuild: 0.24.2 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.9.0) resolve-from: 5.0.0 rollup: 4.44.0 source-map: 0.8.0-beta.0 @@ -40958,8 +40999,7 @@ snapshots: undici-types@6.20.0: {} - undici-types@6.21.0: - optional: true + undici-types@6.21.0: {} undici-types@7.18.2: {} @@ -40973,6 +41013,8 @@ snapshots: undici@7.24.7: {} + undici@8.7.0: {} + unenv-nightly@2.0.0-20241204-140205-a5d5190: dependencies: defu: 6.1.6 @@ -40983,7 +41025,7 @@ snapshots: unenv@1.10.0: dependencies: consola: 3.4.2 - defu: 6.1.4 + defu: 6.1.6 mime: 3.0.0 node-fetch-native: 1.6.6 pathe: 1.1.2 @@ -41301,7 +41343,7 @@ snapshots: '@babel/standalone': 7.26.4 '@babel/types': 7.28.2 citty: 0.1.6 - defu: 6.1.4 + defu: 6.1.6 jiti: 2.4.2 knitwork: 1.2.0 scule: 1.3.0 @@ -41311,7 +41353,7 @@ snapshots: untyped@2.0.0: dependencies: citty: 0.1.6 - defu: 6.1.4 + defu: 6.1.6 jiti: 2.4.2 knitwork: 1.2.0 scule: 1.3.0 @@ -41337,7 +41379,7 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uploadthing@6.13.3(@effect/platform@0.96.0(effect@3.21.0))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0): + uploadthing@6.13.3(@effect/platform@0.96.0(effect@4.0.0-beta.93))(express@5.0.1)(fastify@5.2.0)(h3@1.15.3)(next@15.4.2-canary.51(@playwright/test@1.52.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(tailwindcss@4.0.0): dependencies: '@effect/schema': 0.68.18(effect@3.4.8) '@uploadthing/mime-types': 0.2.10 @@ -41346,7 +41388,7 @@ snapshots: effect: 3.4.8 std-env: 3.9.0 optionalDependencies: - '@effect/platform': 0.96.0(effect@3.21.0) + '@effect/platform': 0.96.0(effect@4.0.0-beta.93) express: 5.0.1 fastify: 5.2.0 h3: 1.15.3 @@ -41415,6 +41457,8 @@ snapshots: uuid@11.1.0: {} + uuid@14.0.1: {} + uuid@7.0.3: {} uuid@8.3.2: {} @@ -41480,7 +41524,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.37.0)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.7.0): + vinxi@0.5.1(@libsql/client@0.14.0)(@types/node@25.5.0)(db0@0.3.2(@libsql/client@0.14.0)(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2)))(drizzle-orm@0.38.3(@cloudflare/workers-types@4.20241230.0)(@libsql/client@0.14.0)(@types/react@19.2.7)(bun-types@1.2.5)(react@19.2.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.29.3)(rolldown@1.0.0-beta.32)(terser@5.46.1)(tsx@4.19.2)(uploadthing@packages+uploadthing)(yaml@2.9.0): dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) @@ -41514,7 +41558,7 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unstorage: 1.16.0(db0@0.3.2)(ioredis@5.6.1)(uploadthing@packages+uploadthing) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) zod: 3.25.67 transitivePeerDependencies: - '@azure/app-configuration' @@ -41558,17 +41602,17 @@ snapshots: - xml2js - yaml - vite-hot-client@0.2.4(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite-hot-client@0.2.4(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): dependencies: - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) - vite-node@1.6.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0): + vite-node@1.6.0(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1): dependencies: cac: 6.7.14 debug: 4.4.1 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) + vite: 5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) transitivePeerDependencies: - '@types/node' - less @@ -41580,13 +41624,13 @@ snapshots: - supports-color - terser - vite-node@2.1.8(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0): + vite-node@2.1.8(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0) + vite: 5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1) transitivePeerDependencies: - '@types/node' - less @@ -41598,13 +41642,13 @@ snapshots: - supports-color - terser - vite-node@3.0.0-beta.2(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + vite-node@3.0.0-beta.2(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -41619,13 +41663,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + vite-node@3.2.4(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -41640,13 +41684,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + vite-node@3.2.4(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -41661,7 +41705,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.8.0(eslint@9.25.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite-plugin-checker@0.8.0(eslint@9.25.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): dependencies: '@babel/code-frame': 7.27.1 ansi-escapes: 4.3.2 @@ -41673,7 +41717,7 @@ snapshots: npm-run-path: 4.0.1 strip-ansi: 6.0.1 tiny-invariant: 1.3.3 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.12 @@ -41683,7 +41727,7 @@ snapshots: optionator: 0.9.4 typescript: 5.8.3 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@3.29.5))(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@3.29.5))(rollup@3.29.5)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.4(rollup@3.29.5) @@ -41694,14 +41738,14 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.1 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) optionalDependencies: '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@3.29.5) transitivePeerDependencies: - rollup - supports-color - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@4.44.0))(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.0(magicast@0.3.5)(rollup@4.44.0))(rollup@4.44.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.4(rollup@4.44.0) @@ -41712,14 +41756,14 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.1 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) optionalDependencies: '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.44.0) transitivePeerDependencies: - rollup - supports-color - vite-plugin-solid@2.11.0(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite-plugin-solid@2.11.0(@testing-library/jest-dom@6.6.3)(solid-js@1.9.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): dependencies: '@babel/core': 7.27.4 '@types/babel__core': 7.20.5 @@ -41727,14 +41771,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.3 solid-refresh: 0.6.3(solid-js@1.9.3) - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vitefu: 1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vitefu: 1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) optionalDependencies: '@testing-library/jest-dom': 6.6.3 transitivePeerDependencies: - supports-color - vite-plugin-vue-inspector@5.3.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite-plugin-vue-inspector@5.3.1(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): dependencies: '@babel/core': 7.27.4 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.27.4) @@ -41745,22 +41789,22 @@ snapshots: '@vue/compiler-dom': 3.5.13 kolorist: 1.8.0 magic-string: 0.30.17 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.37.0): + vite@5.4.11(@types/node@25.5.0)(lightningcss@1.29.3)(terser@5.46.1): dependencies: esbuild: 0.21.5 postcss: 8.4.49 @@ -41769,9 +41813,9 @@ snapshots: '@types/node': 25.5.0 fsevents: 2.3.3 lightningcss: 1.29.3 - terser: 5.37.0 + terser: 5.46.1 - vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0): dependencies: esbuild: 0.25.5 fdir: 6.4.4(picomatch@4.0.2) @@ -41784,11 +41828,11 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.3 - terser: 5.37.0 + terser: 5.46.1 tsx: 4.19.2 - yaml: 2.7.0 + yaml: 2.9.0 - vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0): dependencies: esbuild: 0.25.5 fdir: 6.4.4(picomatch@4.0.2) @@ -41801,29 +41845,29 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.3 - terser: 5.37.0 + terser: 5.46.1 tsx: 4.19.2 - yaml: 2.7.0 + yaml: 2.9.0 - vitefu@1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vitefu@1.0.5(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)): optionalDependencies: - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) vitest-browser-react@0.3.0(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(@vitest/browser@3.2.4)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(vitest@3.2.4): dependencies: - '@vitest/browser': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vitest@3.2.4) react: 19.2.2 react-dom: 19.2.2(react@19.2.2) - vitest: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) optionalDependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - vitest@3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + vitest@3.2.4(@types/node@22.12.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -41841,12 +41885,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.12.0 - '@vitest/browser': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.7.5(@types/node@22.12.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@22.12.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vitest@3.2.4) happy-dom: 16.3.0 transitivePeerDependencies: - jiti @@ -41862,11 +41906,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + vitest@3.2.4(@types/node@25.5.0)(@vitest/browser@3.2.4)(happy-dom@16.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -41884,12 +41928,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vite-node: 3.2.4(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.0 - '@vitest/browser': 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.7.5(@types/node@25.5.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@25.5.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.46.1)(tsx@4.19.2)(yaml@2.9.0))(vitest@3.2.4) happy-dom: 16.3.0 transitivePeerDependencies: - jiti @@ -42025,7 +42069,7 @@ snapshots: vue-bundle-renderer@2.1.1: dependencies: - ufo: 1.6.1 + ufo: 1.6.3 vue-demi@0.14.10(vue@3.5.13(typescript@5.8.3)): dependencies: @@ -42438,6 +42482,8 @@ snapshots: yaml@2.7.0: {} + yaml@2.9.0: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 diff --git a/tooling/tsconfig/package.json b/tooling/tsconfig/package.json index 792a376032..10a9d21687 100644 --- a/tooling/tsconfig/package.json +++ b/tooling/tsconfig/package.json @@ -6,8 +6,8 @@ "base.json" ], "dependencies": { - "@effect/language-service": "0.84.3", - "effect": "3.21.0", + "@effect/language-service": "0.86.4", + "effect": "4.0.0-beta.93", "typescript": "5.8.3" } } diff --git a/tooling/vitest-config/configs/base-config.js b/tooling/vitest-config/configs/base-config.js index c7d5b5799d..a70981cf9e 100644 --- a/tooling/vitest-config/configs/base-config.js +++ b/tooling/vitest-config/configs/base-config.js @@ -33,6 +33,7 @@ export const baseConfig = defineConfig({ test: { silent: "passed-only", mockReset: true, + setupFiles: [new URL("./setup-effect.js", import.meta.url).pathname], coverage: { provider: "istanbul", reporter: [ diff --git a/tooling/vitest-config/configs/setup-effect.js b/tooling/vitest-config/configs/setup-effect.js new file mode 100644 index 0000000000..da6c5e2156 --- /dev/null +++ b/tooling/vitest-config/configs/setup-effect.js @@ -0,0 +1,14 @@ +/** + * Vitest browser mode defines `setImmediate` on `globalThis` with an + * `undefined` value. Effect's scheduler feature-detects `setImmediate` with an + * `in` check, so the broken stub makes every scheduled task die with + * `TypeError: globalThis.setImmediate is not a function`. Remove the stub so + * Effect falls back to `setTimeout` like it does in real browsers. + * This must run before `effect` is imported. + */ +if ( + "setImmediate" in globalThis && + typeof globalThis.setImmediate !== "function" +) { + delete globalThis.setImmediate; +}