diff --git a/client/testfixture/guests/typescript/src/index.ts b/client/testfixture/guests/typescript/src/index.ts index 33b68dd8..acaabbd6 100644 --- a/client/testfixture/guests/typescript/src/index.ts +++ b/client/testfixture/guests/typescript/src/index.ts @@ -2,22 +2,21 @@ import { defineConfig } from "trailbase-wasm"; import { HttpError, HttpHandler, - OutgoingResponse, - Request, + HttpRequest, + HttpResponse, StatusCode, - buildJsonResponse, } from "trailbase-wasm/http"; import { execute, query, Transaction } from "trailbase-wasm/db"; export default defineConfig({ httpHandlers: [ - HttpHandler.get("/fibonacci", (req: Request): string => { + HttpHandler.get("/fibonacci", (req: HttpRequest): string => { const n = req.getQueryParam("n"); return `${fibonacci(n ? parseInt(n) : 40)}\n`; }), HttpHandler.get("/json", jsonHandler), HttpHandler.post("/json", jsonHandler), - HttpHandler.get("/fetch", async (req: Request): Promise => { + HttpHandler.get("/fetch", async (req: HttpRequest): Promise => { const url = req.getQueryParam("url"); if (url) { return await (await fetch(url)).text(); @@ -94,9 +93,9 @@ export default defineConfig({ ], }); -function jsonHandler(req: Request): OutgoingResponse { +function jsonHandler(req: HttpRequest): HttpResponse { const json = req.json(); - return buildJsonResponse( + return HttpResponse.json( json ?? { int: 5, real: 4.2, diff --git a/docs/eslint.config.mjs b/docs/eslint.config.mjs index ad449e44..4ab2b2e0 100644 --- a/docs/eslint.config.mjs +++ b/docs/eslint.config.mjs @@ -23,7 +23,7 @@ const ignoredStarlightCustomTailwindClasses = [ export default [ { - ignores: ["dist/", "node_modules/", ".astro/", "src/env.d.ts"], + ignores: ["**/dist/", "**/node_modules/", ".astro/", "src/env.d.ts"], }, jsPlugin.configs.recommended, ...tsPlugin.configs.recommended, diff --git a/docs/examples/wasm-guest-ts/.gitignore b/docs/examples/wasm-guest-ts/.gitignore new file mode 100644 index 00000000..008175cf --- /dev/null +++ b/docs/examples/wasm-guest-ts/.gitignore @@ -0,0 +1,3 @@ +dist/ +node_modules/ +traildepot/ diff --git a/docs/examples/wasm-guest-ts/eslint.config.mjs b/docs/examples/wasm-guest-ts/eslint.config.mjs new file mode 100644 index 00000000..6440a3d5 --- /dev/null +++ b/docs/examples/wasm-guest-ts/eslint.config.mjs @@ -0,0 +1,30 @@ +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default [ + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + { + ignores: ["dist/", "node_modules/"], + }, + { + files: ["src/**/*.{js,mjs,cjs,mts,ts,tsx,jsx}"], + rules: { + // https://typescript-eslint.io/rules/no-explicit-any/ + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/no-wrapper-object-types": "warn", + "@typescript-eslint/no-namespace": "off", + "no-var": "off", + // http://eslint.org/docs/rules/no-unused-vars + "@typescript-eslint/no-unused-vars": [ + "error", + { + vars: "all", + args: "after-used", + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], + }, + }, +]; diff --git a/docs/examples/wasm-guest-ts/package.json b/docs/examples/wasm-guest-ts/package.json new file mode 100644 index 00000000..3ae36e39 --- /dev/null +++ b/docs/examples/wasm-guest-ts/package.json @@ -0,0 +1,29 @@ +{ + "name": "docs-example-wasm-guest-ts", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "build:wasm": "jco componentize dist/index.js -w node_modules/trailbase-wasm/wit -o dist/component.wasm", + "build:wasm:aot": "jco componentize dist/index.js -w node_modules/trailbase-wasm/wit --aot -o dist/component.wasm", + "build": "vite build && npm run build:wasm", + "check": "tsc --noEmit --skipLibCheck && eslint", + "dev": "node --experimental-strip-types hot-reload.ts", + "format": "prettier -w src" + }, + "dependencies": { + "trailbase-wasm": "workspace:*" + }, + "devDependencies": { + "@bytecodealliance/jco": "^1.16.1", + "@eslint/js": "^9.39.2", + "@types/node": "^25.2.1", + "commander": "^14.0.3", + "eslint": "^9.39.2", + "nano-spawn": "^2.0.0", + "prettier": "^3.8.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.54.0", + "vite": "^7.3.1" + } +} diff --git a/docs/examples/wasm-guest-ts/src/component.ts b/docs/examples/wasm-guest-ts/src/component.ts new file mode 100644 index 00000000..c012c591 --- /dev/null +++ b/docs/examples/wasm-guest-ts/src/component.ts @@ -0,0 +1,3 @@ +import e from "./index"; + +export const { initEndpoint, incomingHandler, sqliteFunctionEndpoint } = e; diff --git a/docs/examples/wasm-guest-ts/src/index.ts b/docs/examples/wasm-guest-ts/src/index.ts new file mode 100644 index 00000000..727bdf69 --- /dev/null +++ b/docs/examples/wasm-guest-ts/src/index.ts @@ -0,0 +1,21 @@ +import { defineConfig } from "trailbase-wasm"; +import { query } from "trailbase-wasm/db"; +import { HttpHandler, HttpResponse, StatusCode } from "trailbase-wasm/http"; +import type { HttpRequest } from "trailbase-wasm/http"; + +async function countRecordsHandler(req: HttpRequest): Promise { + const table = req.getPathParam("table"); + if (!table) { + return HttpResponse.status( + StatusCode.BAD_REQUEST, + `Table not found for '?table=${table}'`, + ); + } + + const rows = await query(`SELECT COUNT(*) FROM ${table}`, []); + return HttpResponse.text(`count: ${rows[0][0]}`); +} + +export default defineConfig({ + httpHandlers: [HttpHandler.get("/count/{table}", countRecordsHandler)], +}); diff --git a/docs/examples/wasm-guest-ts/tsconfig.json b/docs/examples/wasm-guest-ts/tsconfig.json new file mode 100644 index 00000000..3ed2ed03 --- /dev/null +++ b/docs/examples/wasm-guest-ts/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "module": "es2022" /* Specify what module code is generated. */, + "moduleResolution": "bundler", + "paths": {}, + "outDir": "./dist/" /* Specify an output folder for all emitted files. */, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "strict": true /* Enable all strict type-checking options. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/docs/examples/wasm-guest-ts/vite.config.ts b/docs/examples/wasm-guest-ts/vite.config.ts new file mode 100644 index 00000000..d334f21e --- /dev/null +++ b/docs/examples/wasm-guest-ts/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + outDir: "./dist", + minify: false, + lib: { + entry: "./src/component.ts", + name: "runtime", + fileName: "index", + formats: ["es"], + }, + rollupOptions: { + external: (source) => + source.startsWith("wasi:") || source.startsWith("trailbase:"), + }, + }, +}); diff --git a/docs/src/content/docs/documentation/apis_js.mdx b/docs/src/content/docs/documentation/apis_js.mdx index 22e60f19..f9e0d013 100644 --- a/docs/src/content/docs/documentation/apis_js.mdx +++ b/docs/src/content/docs/documentation/apis_js.mdx @@ -2,40 +2,68 @@ title: Custom APIs --- -import { Aside } from "@astrojs/starlight/components"; +import { Aside, Code } from "@astrojs/starlight/components"; +import { githubPath } from "@/lib/github.ts" On startup TrailBase will automatically load any WASM component, i.e. `*.wasm` -files in `traildepot/wasm`. +files, that it finds in `/wasm`. This can be used to implement arbitrary HTTP APIs with custom handlers. -## Example HTTP Endpoint -The following TypeScript WASM example illustrates a few things: +## Examples -* How to register a parameterized route with `{table}`. -* How to query the database. -* How to return an HTTP error. +At this point the documentation is embarrassingly "thin", take a look at the examples +for further context. Some are provided here, more can be found in `/examples` including +project templates: -```ts -import { defineConfig } from "trailbase-wasm"; -import { Request, HttpError, HttpHandler, StatusCode } from "trailbase-wasm/http"; -import { query } from "trailbase-wasm/db"; -async function handler(req: Request): Promise { - const table = req.getPathParam("table"); - if (table) { - const rows = await query(`SELECT COUNT(*) FROM ${table}`, []) - return `entries: ${rows[0][0]}`; - } - throw new HttpError( - StatusCode.BAD_REQUEST, "Missing '?table=' search query param"); -} + * TypeScript: /examples/wasm-guest-ts + * JavaScript: /examples/wasm-guest-js + * Rust: /examples/wasm-guest-rust -export default defineConfig({ - httpHandlers: [ HttpHandler.get("/test/{table}", handler) ], -}); -``` +### (Java|Type)Script -More examples can be found in the repository under `examples/wasm-guest-ts/`, -`examples/wasm-guest-js/` and `examples/wasm-guest-rust/`. +The following example demonstrates how to: + +* register a parameterized route with `{table}`, +* query the database, +* return a string body or HTTP error. + +import tsDocsExample from "@examples/wasm-guest-ts/src/index.ts?raw"; + + + +Another example reading query parameters and producing a JSON response. + +import tsCoffeeExample from "@root/examples/coffee-vector-search/guests/typescript/src/index.ts?raw"; + + + +### Rust + +The following example demonstrates how to: + +* register an HTTP route, +* read query parameters, +* query the database, +* and return a JSON response or errors. + +import rustExample from "@root/examples/coffee-vector-search/guests/rust/src/lib.rs?raw"; + + diff --git a/examples/coffee-vector-search/guests/rust/src/lib.rs b/examples/coffee-vector-search/guests/rust/src/lib.rs index e4bcda85..22e51ee5 100644 --- a/examples/coffee-vector-search/guests/rust/src/lib.rs +++ b/examples/coffee-vector-search/guests/rust/src/lib.rs @@ -8,18 +8,8 @@ use trailbase_wasm::{Guest, export}; type SearchResponse = (String, f64, f64, f64, f64); -fn as_real(v: &Value) -> Result { - if let Value::Real(f) = v { - return Ok(*f); - } - return Err(format!("Not a real: {v:?}")); -} - async fn search_handler(req: Request) -> Result>, HttpError> { - let mut aroma: i64 = 8; - let mut flavor: i64 = 8; - let mut acidity: i64 = 8; - let mut sweetness: i64 = 8; + let (mut aroma, mut flavor, mut acidity, mut sweetness) = (8, 8, 8, 8); for (param, value) in req.url().query_pairs() { match param.as_ref() { @@ -31,7 +21,7 @@ async fn search_handler(req: Request) -> Result>, HttpE } } - // Query with vector-search for the closest match. + // Query the closest match using vector-search. let results: Vec = query( r#" SELECT Owner, Aroma, Flavor, Acidity, Sweetness @@ -39,9 +29,8 @@ async fn search_handler(req: Request) -> Result>, HttpE ORDER BY vec_distance_L2( embedding, FORMAT("[%f, %f, %f, %f]", $1, $2, $3, $4)) LIMIT 100 - "# - .to_string(), - vec![ + "#, + [ Value::Integer(aroma), Value::Integer(flavor), Value::Integer(acidity), @@ -54,7 +43,7 @@ async fn search_handler(req: Request) -> Result>, HttpE .map(|row| { // Convert to json response. let Value::Text(owner) = row[0].clone() else { - panic!("unreachable"); + panic!("invariant"); }; return ( @@ -70,13 +59,20 @@ async fn search_handler(req: Request) -> Result>, HttpE return Ok(Json(results)); } -// Implement the function exported in this world (see above). -struct Endpoints; +fn as_real(v: &Value) -> Result { + return match v { + Value::Real(f) => Ok(*f), + _ => Err(format!("Not a real: {v:?}")), + }; +} -impl Guest for Endpoints { +// Lastly, implement and export a TrailBase component. +struct GuestImpl; + +impl Guest for GuestImpl { fn http_handlers() -> Vec { return vec![routing::get("/search", search_handler)]; } } -export!(Endpoints); +export!(GuestImpl); diff --git a/examples/coffee-vector-search/guests/typescript/src/index.ts b/examples/coffee-vector-search/guests/typescript/src/index.ts index 4875399f..02a01697 100644 --- a/examples/coffee-vector-search/guests/typescript/src/index.ts +++ b/examples/coffee-vector-search/guests/typescript/src/index.ts @@ -1,8 +1,8 @@ import { defineConfig } from "trailbase-wasm"; -import { Request, HttpHandler } from "trailbase-wasm/http"; +import { HttpHandler, HttpRequest, HttpResponse } from "trailbase-wasm/http"; import { query } from "trailbase-wasm/db"; -async function searchHandler(req: Request): Promise { +async function searchHandler(req: HttpRequest): Promise { // Get the query params from the url, e.g. '/search?aroma=4&acidity=7'. const aroma = req.getQueryParam("aroma") ?? 8; const flavor = req.getQueryParam("flavor") ?? 8; @@ -19,7 +19,7 @@ async function searchHandler(req: Request): Promise { [+aroma, +flavor, +acid, +sweet], ); - return JSON.stringify(rows); + return HttpResponse.json(rows); } export default defineConfig({ diff --git a/examples/wasm-guest-js/src/index.js b/examples/wasm-guest-js/src/index.js index 726d07dc..ba0ec74d 100644 --- a/examples/wasm-guest-js/src/index.js +++ b/examples/wasm-guest-js/src/index.js @@ -1,5 +1,5 @@ import { defineConfig, addPeriodicCallback } from "trailbase-wasm"; -import { HttpHandler, buildJsonResponse } from "trailbase-wasm/http"; +import { HttpHandler, JsonResponse } from "trailbase-wasm/http"; import { JobHandler } from "trailbase-wasm/job"; import { query } from "trailbase-wasm/db"; @@ -43,7 +43,7 @@ export default defineConfig({ }); function jsonHandler(req) { - return buildJsonResponse( + return JsonResponse.from( req.json() ?? { int: 5, real: 4.2, diff --git a/examples/wasm-guest-ts/src/index.ts b/examples/wasm-guest-ts/src/index.ts index 2746eda3..62db69a5 100644 --- a/examples/wasm-guest-ts/src/index.ts +++ b/examples/wasm-guest-ts/src/index.ts @@ -1,17 +1,17 @@ import { defineConfig, addPeriodicCallback } from "trailbase-wasm"; -import { HttpHandler, Request, buildJsonResponse } from "trailbase-wasm/http"; +import { HttpHandler, HttpRequest, HttpResponse } from "trailbase-wasm/http"; import { JobHandler } from "trailbase-wasm/job"; import { query } from "trailbase-wasm/db"; export default defineConfig({ httpHandlers: [ - HttpHandler.get("/fibonacci", (req: Request) => { + HttpHandler.get("/fibonacci", (req: HttpRequest) => { const n = req.getQueryParam("n"); return fibonacci(n ? parseInt(n) : 40).toString(); }), HttpHandler.get("/json", jsonHandler), HttpHandler.post("/json", jsonHandler), - HttpHandler.get("/a", (req: Request) => { + HttpHandler.get("/a", (req: HttpRequest) => { const n = req.getQueryParam("n"); return "a".repeat(n ? parseInt(n) : 5000); }), @@ -25,13 +25,13 @@ export default defineConfig({ } }); }), - HttpHandler.get("/sleep", async (req: Request) => { + HttpHandler.get("/sleep", async (req: HttpRequest) => { const param = req.getQueryParam("ms"); const ms: number = param ? parseInt(param) : 500; await sleep(ms); return `slept: ${ms}ms`; }), - HttpHandler.get("/count/{table}/", async (req: Request) => { + HttpHandler.get("/count/{table}/", async (req: HttpRequest) => { const table = req.getPathParam("table"); if (table) { const rows = await query(`SELECT COUNT(*) FROM ${table}`, []); @@ -42,8 +42,8 @@ export default defineConfig({ jobHandlers: [JobHandler.minutely("myjob", () => console.log("Hello Job!"))], }); -function jsonHandler(req: Request) { - return buildJsonResponse( +function jsonHandler(req: HttpRequest) { + return HttpResponse.json( req.json() ?? { int: 5, real: 4.2, diff --git a/guests/typescript/package.json b/guests/typescript/package.json index b15c1ce4..993a718e 100644 --- a/guests/typescript/package.json +++ b/guests/typescript/package.json @@ -2,7 +2,7 @@ "name": "trailbase-wasm", "description": "WASM Guest Runtime for custom JS/TS endpoints in TrailBase", "homepage": "https://trailbase.io", - "version": "0.4.0", + "version": "0.5.0", "license": "OSL-3.0", "type": "module", "exports": { diff --git a/guests/typescript/src/http/incoming.ts b/guests/typescript/src/http/incoming.ts index e98aa278..5b2379fb 100644 --- a/guests/typescript/src/http/incoming.ts +++ b/guests/typescript/src/http/incoming.ts @@ -7,8 +7,13 @@ import { import type { HttpContext } from "@common/HttpContext"; import type { HttpHandlerInterface, ResponseType } from "./index"; -import { HttpError, StatusCode, buildResponse } from "./index"; -import { type Method, RequestImpl } from "./request"; +import { StatusCode } from "./index"; +import { + HttpError, + responseToOutgoingResponse, + errorToOutgoingResponse, +} from "./response"; +import { type Method, HttpRequestImpl } from "./request"; import { JobHandlerInterface } from "../job"; import { awaitPendingTimers } from "../timer"; @@ -53,7 +58,7 @@ export function buildIncomingHttpHandler(args: { } return await handler( - new RequestImpl( + new HttpRequestImpl( wasiMethodToMethod(req.method()), req.pathWithQuery() ?? "", context.path_params, @@ -70,30 +75,10 @@ export function buildIncomingHttpHandler(args: { return async function (req: IncomingRequest, respOutparam: ResponseOutparam) { try { const resp: ResponseType = await handle(req); - writeResponse( - respOutparam, - resp instanceof OutgoingResponse - ? resp - : buildResponse( - resp instanceof Uint8Array ? resp : encodeBytes(resp ?? ""), - ), - ); + const outgoingResp = responseToOutgoingResponse(resp); + writeResponse(respOutparam, outgoingResp); } catch (err) { - if (err instanceof HttpError) { - writeResponse( - respOutparam, - buildResponse(encodeBytes(`${err.message}\n`), { - status: err.statusCode, - }), - ); - } else { - writeResponse( - respOutparam, - buildResponse(encodeBytes(`Other: ${err}\n`), { - status: StatusCode.INTERNAL_SERVER_ERROR, - }), - ); - } + writeResponse(respOutparam, errorToOutgoingResponse(err)); } finally { await awaitPendingTimers(); } diff --git a/guests/typescript/src/http/index.ts b/guests/typescript/src/http/index.ts index a89b8189..ab3b0936 100644 --- a/guests/typescript/src/http/index.ts +++ b/guests/typescript/src/http/index.ts @@ -1,19 +1,19 @@ -import { Fields, OutgoingBody, OutgoingResponse } from "wasi:http/types@0.2.3"; - -import { StatusCode } from "./status"; -import { Request, type Method } from "./request"; -import { encodeBytes } from "./incoming"; +import { HttpRequest } from "./request"; +import type { Method } from "./request"; +import type { ResponseType } from "./response"; // Override setInterval/setTimeout. import "../timer"; +// Exports: export { OutgoingResponse } from "wasi:http/types@0.2.3"; export { StatusCode } from "./status"; -export type { Method, Request, Scheme, User } from "./request"; +export type { Method, HttpRequest, Scheme, User } from "./request"; +export { HttpResponse, HttpError } from "./response"; +export type { ResponseType } from "./response"; -export type ResponseType = string | Uint8Array | OutgoingResponse | void; export type HttpHandlerCallback = ( - req: Request, + req: HttpRequest, ) => ResponseType | Promise; export interface HttpHandlerInterface { @@ -57,158 +57,3 @@ export class HttpHandler implements HttpHandlerInterface { return new HttpHandler(path, "put", handler); } } - -export class HttpError extends Error { - readonly statusCode: number; - readonly headers: [string, string][] | undefined; - - constructor( - statusCode: number, - message?: string, - headers?: [string, string][], - ) { - super(message); - this.statusCode = statusCode; - this.headers = headers; - } - - public override toString(): string { - return `HttpError(${this.statusCode}, ${this.message})`; - } -} - -export type ResponseOptions = { - status?: StatusCode; - headers?: [string, Uint8Array][]; -}; - -export function buildJsonResponse( - body: object, - opts?: ResponseOptions, -): OutgoingResponse { - return buildResponse(encodeBytes(JSON.stringify(body)), { - ...opts, - - headers: [ - ["Content-Type", encodeBytes("application/json")], - ...(opts?.headers ?? []), - ], - }); -} - -export function buildResponse( - body: Uint8Array, - opts?: ResponseOptions, -): OutgoingResponse { - // NOTE: `outputStream.blockingWriteAndFlush` only writes up to 4kB, see documentation. - if (body.length <= 4096) { - return buildSmallResponse(body, opts); - } - return buildLargeResponse(body, opts); -} - -function buildSmallResponse( - body: Uint8Array, - opts?: ResponseOptions, -): OutgoingResponse { - const outgoingResponse = new OutgoingResponse( - Fields.fromList(opts?.headers ?? []), - ); - - const outgoingBody = outgoingResponse.body(); - { - // Create a stream for the response body - const outputStream = outgoingBody.write(); - outputStream.blockingWriteAndFlush(body); - - outputStream[Symbol.dispose]?.(); - } - - outgoingResponse.setStatusCode(opts?.status ?? StatusCode.OK); - - OutgoingBody.finish(outgoingBody, undefined); - - return outgoingResponse; -} - -function buildLargeResponse( - body: Uint8Array, - opts?: ResponseOptions, -): OutgoingResponse { - const outgoingResponse = new OutgoingResponse( - Fields.fromList(opts?.headers ?? []), - ); - - const outgoingBody = outgoingResponse.body(); - { - const outputStream = outgoingBody.write(); - - // Retrieve a Preview 2 I/O pollable to coordinate writing to the output stream - const pollable = outputStream.subscribe(); - - let written = 0n; - let remaining = BigInt(body.length); - while (remaining > 0) { - // Wait for the stream to become writable - pollable.block(); - - // Get the amount of bytes that we're allowed to write - let writableByteCount = outputStream.checkWrite(); - if (remaining <= writableByteCount) { - writableByteCount = BigInt(remaining); - } - - // If we are not allowed to write any more, but there are still bytes - // remaining then flush and try again - if (writableByteCount === 0n && remaining !== 0n) { - outputStream.flush(); - continue; - } - - outputStream.write( - new Uint8Array(body.buffer, Number(written), Number(writableByteCount)), - ); - written += writableByteCount; - remaining -= written; - - // While we can track *when* to flush separately and implement our own logic, - // the simplest way is to flush the written chunk immediately - outputStream.flush(); - } - - pollable[Symbol.dispose]?.(); - outputStream[Symbol.dispose]?.(); - } - - outgoingResponse.setStatusCode(opts?.status ?? StatusCode.OK); - - OutgoingBody.finish(outgoingBody, undefined); - - return outgoingResponse; -} - -// function writeResponseOriginal( -// responseOutparam: ResponseOutparam, -// status: number, -// body: Uint8Array, -// ) { -// /* eslint-disable prefer-const */ -// const outgoingResponse = new OutgoingResponse(new Fields()); -// -// let outgoingBody = outgoingResponse.body(); -// { -// // Create a stream for the response body -// let outputStream = outgoingBody.write(); -// outputStream.blockingWriteAndFlush(body); -// -// // eslint-disable-next-line @typescript-eslint/ban-ts-comment -// // @ts-ignore: This is required in order to dispose the stream before we return -// outputStream[Symbol.dispose](); -// //outputStream[Symbol.dispose]?.(); -// } -// -// outgoingResponse.setStatusCode(status); -// OutgoingBody.finish(outgoingBody, undefined); -// -// ResponseOutparam.set(responseOutparam, { tag: "ok", val: outgoingResponse }); -// } diff --git a/guests/typescript/src/http/request.ts b/guests/typescript/src/http/request.ts index 4ab9b659..d37af0f6 100644 --- a/guests/typescript/src/http/request.ts +++ b/guests/typescript/src/http/request.ts @@ -15,7 +15,7 @@ export type User = { csrf: string; }; -export interface Request { +export interface HttpRequest { path(): string; method(): Method; scheme(): Scheme | undefined; @@ -36,7 +36,7 @@ export interface Request { json(): object | undefined; } -export class RequestImpl implements Request { +export class HttpRequestImpl implements HttpRequest { constructor( private readonly _method: Method, private readonly _path: string, diff --git a/guests/typescript/src/http/response.ts b/guests/typescript/src/http/response.ts new file mode 100644 index 00000000..231ed526 --- /dev/null +++ b/guests/typescript/src/http/response.ts @@ -0,0 +1,219 @@ +import { Fields, OutgoingBody, OutgoingResponse } from "wasi:http/types@0.2.3"; +import { StatusCode } from "./status"; +import { encodeBytes } from "./incoming"; + +export type ResponseType = + | string + | Uint8Array + | HttpResponse + | OutgoingResponse + | void; + +export class HttpResponse { + protected constructor( + public readonly status: StatusCode, + public body?: Uint8Array, + public headers: [string, Uint8Array][] = [], + ) {} + + public static status( + status: StatusCode | number, + body?: string | Uint8Array, + ): HttpResponse { + return new HttpResponse( + status, + typeof body === "string" ? encodeBytes(body) : body, + ); + } + + public static ok(body?: string | Uint8Array): HttpResponse { + return new HttpResponse( + StatusCode.OK, + typeof body === "string" ? encodeBytes(body) : body, + ); + } + + public static text(body: string | Uint8Array): HttpResponse { + return new HttpResponse( + StatusCode.OK, + typeof body === "string" ? encodeBytes(body) : body, + [["Content-Type", encodeBytes("text/plain; charset=utf-8")]], + ); + } + + public static json(value: object): HttpResponse { + return new HttpResponse(StatusCode.OK, encodeBytes(JSON.stringify(value)), [ + ["Content-Type", encodeBytes("application/json")], + ]); + } + + public setBody(body: string | Uint8Array): HttpResponse { + this.body = typeof body === "string" ? encodeBytes(body) : body; + return this; + } + + public setHeader(key: string, value: string | Uint8Array): HttpResponse { + this.headers.push([ + key, + typeof value === "string" ? encodeBytes(value) : value, + ]); + return this; + } +} + +export class HttpError extends Error { + public constructor( + public readonly status: StatusCode, + message?: string, + ) { + super(message); + } + + public static from(status: StatusCode | number, message?: string): HttpError { + return new HttpError(status, message); + } + + public override toString(): string { + return `HttpError(${this.status}, ${this.message})`; + } +} + +export function responseToOutgoingResponse( + resp: ResponseType, +): OutgoingResponse { + if (resp instanceof OutgoingResponse) { + return resp; + } else if (resp instanceof HttpResponse) { + return buildResponse({ + status: resp.status, + headers: resp.headers, + body: resp.body ?? new Uint8Array(), + }); + } else if (resp instanceof Uint8Array) { + return buildResponse({ + status: StatusCode.OK, + headers: [], + body: resp, + }); + } else if (typeof resp === "string") { + return buildResponse({ + status: StatusCode.OK, + headers: [], + body: encodeBytes(resp), + }); + } else { + // void case. + return buildResponse({ + status: StatusCode.OK, + headers: [], + body: new Uint8Array(), + }); + } +} + +export function errorToOutgoingResponse(err: unknown): OutgoingResponse { + if (err instanceof HttpError) { + return buildResponse({ + status: err.status, + headers: [["Content-Type", encodeBytes("text/plain; charset=utf-8")]], + body: err.message ? encodeBytes(err.message) : new Uint8Array(), + }); + } + return buildResponse({ + body: encodeBytes(`uncaught: ${err}`), + status: StatusCode.INTERNAL_SERVER_ERROR, + headers: [], + }); +} + +type ResponseOptions = { + status: StatusCode; + headers: [string, Uint8Array][]; + body: Uint8Array; +}; + +function buildResponse(opts: ResponseOptions): OutgoingResponse { + // NOTE: `outputStream.blockingWriteAndFlush` only writes up to 4kB, see documentation. + if (opts.body.length <= 4096) { + return buildSmallResponse(opts); + } + return buildLargeResponse(opts); +} + +function buildSmallResponse({ + status, + headers, + body, +}: ResponseOptions): OutgoingResponse { + const outgoingResponse = new OutgoingResponse(Fields.fromList(headers)); + + const outgoingBody = outgoingResponse.body(); + { + // Create a stream for the response body + const outputStream = outgoingBody.write(); + outputStream.blockingWriteAndFlush(body); + + outputStream[Symbol.dispose]?.(); + } + + outgoingResponse.setStatusCode(status); + + OutgoingBody.finish(outgoingBody, undefined); + + return outgoingResponse; +} + +function buildLargeResponse({ + status, + headers, + body, +}: ResponseOptions): OutgoingResponse { + const outgoingResponse = new OutgoingResponse(Fields.fromList(headers)); + + const outgoingBody = outgoingResponse.body(); + { + const outputStream = outgoingBody.write(); + + // Retrieve a Preview 2 I/O pollable to coordinate writing to the output stream + const pollable = outputStream.subscribe(); + + let written = 0n; + let remaining = BigInt(body.length); + while (remaining > 0) { + // Wait for the stream to become writable + pollable.block(); + + // Get the amount of bytes that we're allowed to write + let writableByteCount = outputStream.checkWrite(); + if (remaining <= writableByteCount) { + writableByteCount = BigInt(remaining); + } + + // If we are not allowed to write any more, but there are still bytes + // remaining then flush and try again + if (writableByteCount === 0n && remaining !== 0n) { + outputStream.flush(); + continue; + } + + outputStream.write( + new Uint8Array(body.buffer, Number(written), Number(writableByteCount)), + ); + written += writableByteCount; + remaining -= written; + + // While we can track *when* to flush separately and implement our own logic, + // the simplest way is to flush the written chunk immediately + outputStream.flush(); + } + + pollable[Symbol.dispose]?.(); + outputStream[Symbol.dispose]?.(); + } + + outgoingResponse.setStatusCode(status); + + OutgoingBody.finish(outgoingBody, undefined); + + return outgoingResponse; +} diff --git a/guests/typescript/vite.config.ts b/guests/typescript/vite.config.ts index c3b40f90..4441f5bb 100644 --- a/guests/typescript/vite.config.ts +++ b/guests/typescript/vite.config.ts @@ -29,8 +29,8 @@ export default defineConfig({ // NOTE: Needs to be in `rollupOptions` rather than vite's plugins to apply to each input. dts({ rollupTypes: true, - // NOTE: Inlucde .d.ts files generated by `jco`. - copyDtsFiles: true, + // NOTE: Include .d.ts files generated by `jco`. + copyDtsFiles: false, // NOTE: The .d.ts files generated by `jco` contain dynamic imports. staticImport: true, }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a272a819..d00d4539 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,7 +156,7 @@ importers: version: 0.5.19(tailwindcss@4.1.18) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -213,19 +213,19 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) vite-plugin-csp-guard: specifier: ^3.0.0 - version: 3.0.0(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 3.0.0(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) vite-tsconfig-paths: specifier: 6.0.5 - version: 6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) crates/assets/js/client: dependencies: @@ -274,10 +274,10 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite-node: specifier: ^5.3.0 - version: 5.3.0(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 5.3.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.2.1)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.2.3)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) crates/auth-ui/ui: dependencies: @@ -286,7 +286,7 @@ importers: version: 0.9.6(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3) '@astrojs/solid-js': specifier: ^5.1.3 - version: 5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)))(solid-js@1.9.11)(terser@5.46.0)(yaml@2.8.2) + version: 5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)))(solid-js@1.9.11)(terser@5.46.0)(yaml@2.8.2) '@kobalte/core': specifier: ^0.13.11 version: 0.13.11(solid-js@1.9.11) @@ -295,7 +295,7 @@ importers: version: 1.1.1(nanostores@1.1.0)(solid-js@1.9.11) astro: specifier: ^5.17.1 - version: 5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + version: 5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) astro-icon: specifier: ^1.1.5 version: 1.1.5 @@ -338,7 +338,7 @@ importers: version: 0.5.19(tailwindcss@4.1.18) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) @@ -389,19 +389,19 @@ importers: version: 4.0.15 '@astrojs/starlight': specifier: ^0.37.6 - version: 0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + version: 0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) '@astrojs/starlight-tailwind': specifier: ^4.0.2 - version: 4.0.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(tailwindcss@4.1.18) + version: 4.0.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(tailwindcss@4.1.18) '@iconify-json/tabler': specifier: ^1.2.26 version: 1.2.26 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) astro: specifier: ^5.17.1 - version: 5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + version: 5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) astro-icon: specifier: ^1.1.5 version: 1.1.5 @@ -425,10 +425,10 @@ importers: version: 1.9.11 starlight-links-validator: specifier: ^0.19.2 - version: 0.19.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + version: 0.19.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) starlight-openapi: specifier: ^0.22.0 - version: 0.22.0(@astrojs/markdown-remark@6.3.10)(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(openapi-types@12.1.3) + version: 0.22.0(@astrojs/markdown-remark@6.3.10)(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(openapi-types@12.1.3) tailwind-merge: specifier: ^3.4.0 version: 3.4.0 @@ -444,7 +444,7 @@ importers: version: 3.7.0 '@astrojs/solid-js': specifier: ^5.1.3 - version: 5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)))(solid-js@1.9.11)(terser@5.46.0)(yaml@2.8.2) + version: 5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)))(solid-js@1.9.11)(terser@5.46.0)(yaml@2.8.2) '@eslint/js': specifier: ^9.39.2 version: 9.39.2 @@ -507,6 +507,43 @@ importers: specifier: ^4.0.18 version: 4.0.18(@types/node@25.2.1)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + docs/examples/wasm-guest-ts: + dependencies: + trailbase-wasm: + specifier: workspace:* + version: link:../../../guests/typescript + devDependencies: + '@bytecodealliance/jco': + specifier: ^1.16.1 + version: 1.17.0 + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 + '@types/node': + specifier: ^25.2.1 + version: 25.2.3 + commander: + specifier: ^14.0.3 + version: 14.0.3 + eslint: + specifier: ^9.39.2 + version: 9.39.2(jiti@2.6.1) + nano-spawn: + specifier: ^2.0.0 + version: 2.0.0 + prettier: + specifier: ^3.8.1 + version: 3.8.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.54.0 + version: 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + examples/blog/web: dependencies: '@iconify-json/tabler': @@ -606,7 +643,7 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.3(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) @@ -630,7 +667,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) examples/coffee-vector-search/guests/typescript: dependencies: @@ -806,7 +843,7 @@ importers: version: 9.39.2 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) '@types/react': specifier: ^19.2.13 version: 19.2.13 @@ -815,7 +852,7 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.3(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) @@ -842,7 +879,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) examples/wasm-guest-js: dependencies: @@ -873,7 +910,7 @@ importers: version: 3.8.1 vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) examples/wasm-guest-ts: dependencies: @@ -883,13 +920,13 @@ importers: devDependencies: '@bytecodealliance/jco': specifier: ^1.16.1 - version: 1.16.1 + version: 1.17.0 '@eslint/js': specifier: ^9.39.2 version: 9.39.2 '@types/node': specifier: ^25.2.1 - version: 25.2.1 + version: 25.2.3 commander: specifier: ^14.0.3 version: 14.0.3 @@ -907,10 +944,10 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.54.0 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) guests/typescript: devDependencies: @@ -934,13 +971,13 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@25.2.1)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.2.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.2.1)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.2.3)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) packages: @@ -1158,9 +1195,16 @@ packages: resolution: {integrity: sha512-j5C32PuS2QHyG9+Sly7vQMkeaM7oOFi9JISiCtPswmOOdTV9i0dTwkDpviZMJ+itpfZHKuGO9OEmhH2QRKXtbw==} hasBin: true + '@bytecodealliance/jco@1.17.0': + resolution: {integrity: sha512-+8cLL6p++K+KKJiG+xqRDyKcjoWvAB1cwH+diIvuUf8O0AEN+QfzW7GdZJ0zzvfpCfGYX+uO7ylmPFvn+pWxCA==} + hasBin: true + '@bytecodealliance/preview2-shim@0.17.7': resolution: {integrity: sha512-VFUQHwSScO+zO466DlsmNlNeCf6sUsHBazvisb3hmGCbiPxwAMn1rGmnwinM+6zcLJw0CqkV0h2JzL3MdudhJQ==} + '@bytecodealliance/preview2-shim@0.17.8': + resolution: {integrity: sha512-wS5kg8u0KCML1UeHQPJ1IuOI24x/XLentCzsqPER1+gDNC5Cz2hG4G2blLOZap+3CEGhIhnJ9mmZYj6a2W0Lww==} + '@bytecodealliance/wizer-darwin-arm64@10.0.0': resolution: {integrity: sha512-dhZTWel+xccGTKSJtI9A7oM4yyP20FWflsT+AoqkOqkCY7kCNrj4tmMtZ6GXZFRDkrPY5+EnOh62sfShEibAMA==} cpu: [arm64] @@ -2854,6 +2898,9 @@ packages: '@types/node@25.2.1': resolution: {integrity: sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==} + '@types/node@25.2.3': + resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + '@types/picomatch@3.0.2': resolution: {integrity: sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==} @@ -2903,6 +2950,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/eslint-plugin@8.56.0': + resolution: {integrity: sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.54.0': resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2910,22 +2965,45 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.56.0': + resolution: {integrity: sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.54.0': resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.56.0': + resolution: {integrity: sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.54.0': resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.56.0': + resolution: {integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.54.0': resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.56.0': + resolution: {integrity: sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.54.0': resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2933,16 +3011,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.56.0': + resolution: {integrity: sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.54.0': resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.56.0': + resolution: {integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.54.0': resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.56.0': + resolution: {integrity: sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.54.0': resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2950,10 +3045,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.56.0': + resolution: {integrity: sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.54.0': resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.56.0': + resolution: {integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/raw-json@0.4.4': resolution: {integrity: sha512-mUDobz3DeEItDmI34Hg+eL9hTTJSZbIvsvGAr42YoK4IyS7SWKmF5Xa0pI8RWFZSijL8QmfvCNH3s8HYJNxKaw==} @@ -3884,6 +3990,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6054,6 +6164,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + typescript-eslint@8.56.0: + resolution: {integrity: sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} @@ -6846,12 +6963,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.13(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': + '@astrojs/mdx@4.3.13(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -6902,13 +7019,13 @@ snapshots: - tsx - yaml - '@astrojs/solid-js@5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)))(solid-js@1.9.11)(terser@5.46.0)(yaml@2.8.2)': + '@astrojs/solid-js@5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)))(solid-js@1.9.11)(terser@5.46.0)(yaml@2.8.2)': dependencies: solid-js: 1.9.11 - vite: 6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) - vite-plugin-solid: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite-plugin-solid: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) optionalDependencies: - solid-devtools: 0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + solid-devtools: 0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) transitivePeerDependencies: - '@testing-library/jest-dom' - '@types/node' @@ -6924,22 +7041,22 @@ snapshots: - tsx - yaml - '@astrojs/starlight-tailwind@4.0.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(tailwindcss@4.1.18)': + '@astrojs/starlight-tailwind@4.0.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(tailwindcss@4.1.18)': dependencies: - '@astrojs/starlight': 0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + '@astrojs/starlight': 0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) tailwindcss: 4.1.18 - '@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': + '@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 - '@astrojs/mdx': 4.3.13(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + '@astrojs/mdx': 4.3.13(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) '@astrojs/sitemap': 3.7.0 '@pagefind/default-ui': 1.4.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) - astro-expressive-code: 0.41.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + astro: 5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + astro-expressive-code: 0.41.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -7112,7 +7229,7 @@ snapshots: '@bytecodealliance/componentize-js@0.19.3': dependencies: - '@bytecodealliance/jco': 1.16.1 + '@bytecodealliance/jco': 1.17.0 '@bytecodealliance/wizer': 10.0.0 es-module-lexer: 1.7.0 oxc-parser: 0.76.0 @@ -7127,8 +7244,20 @@ snapshots: ora: 8.2.0 terser: 5.46.0 + '@bytecodealliance/jco@1.17.0': + dependencies: + '@bytecodealliance/componentize-js': 0.19.3 + '@bytecodealliance/preview2-shim': 0.17.8 + binaryen: 123.0.0 + commander: 14.0.3 + mkdirp: 3.0.1 + ora: 8.2.0 + terser: 5.46.0 + '@bytecodealliance/preview2-shim@0.17.7': {} + '@bytecodealliance/preview2-shim@0.17.8': {} + '@bytecodealliance/wizer-darwin-arm64@10.0.0': optional: true @@ -7862,23 +7991,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@microsoft/api-extractor-model@7.32.2(@types/node@25.2.1)': + '@microsoft/api-extractor-model@7.32.2(@types/node@25.2.3)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.1(@types/node@25.2.1) + '@rushstack/node-core-library': 5.19.1(@types/node@25.2.3) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.56.2(@types/node@25.2.1)': + '@microsoft/api-extractor@7.56.2(@types/node@25.2.3)': dependencies: - '@microsoft/api-extractor-model': 7.32.2(@types/node@25.2.1) + '@microsoft/api-extractor-model': 7.32.2(@types/node@25.2.3) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.1(@types/node@25.2.1) + '@rushstack/node-core-library': 5.19.1(@types/node@25.2.3) '@rushstack/rig-package': 0.6.0 - '@rushstack/terminal': 0.21.0(@types/node@25.2.1) - '@rushstack/ts-command-line': 5.2.0(@types/node@25.2.1) + '@rushstack/terminal': 0.21.0(@types/node@25.2.3) + '@rushstack/ts-command-line': 5.2.0(@types/node@25.2.3) diff: 8.0.3 lodash: 4.17.23 minimatch: 10.1.2 @@ -8136,7 +8265,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@rushstack/node-core-library@5.19.1(@types/node@25.2.1)': + '@rushstack/node-core-library@5.19.1(@types/node@25.2.3)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -8147,28 +8276,28 @@ snapshots: resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 - '@rushstack/problem-matcher@0.1.1(@types/node@25.2.1)': + '@rushstack/problem-matcher@0.1.1(@types/node@25.2.3)': optionalDependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 '@rushstack/rig-package@0.6.0': dependencies: resolve: 1.22.11 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.21.0(@types/node@25.2.1)': + '@rushstack/terminal@0.21.0(@types/node@25.2.3)': dependencies: - '@rushstack/node-core-library': 5.19.1(@types/node@25.2.1) - '@rushstack/problem-matcher': 0.1.1(@types/node@25.2.1) + '@rushstack/node-core-library': 5.19.1(@types/node@25.2.3) + '@rushstack/problem-matcher': 0.1.1(@types/node@25.2.3) supports-color: 8.1.1 optionalDependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 - '@rushstack/ts-command-line@5.2.0(@types/node@25.2.1)': + '@rushstack/ts-command-line@5.2.0(@types/node@25.2.3)': dependencies: - '@rushstack/terminal': 0.21.0(@types/node@25.2.1) + '@rushstack/terminal': 0.21.0(@types/node@25.2.3) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -8452,6 +8581,13 @@ snapshots: tailwindcss: 4.1.18 vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + '@tanstack/db-ivm@0.1.17(typescript@5.9.3)': dependencies: fractional-indexing: 3.2.0 @@ -8599,7 +8735,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 25.2.1 + '@types/node': 25.2.3 '@types/chai@5.2.3': dependencies: @@ -8608,7 +8744,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 '@types/dateformat@5.0.3': {} @@ -8626,7 +8762,7 @@ snapshots: '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -8669,6 +8805,10 @@ snapshots: dependencies: undici-types: 7.16.0 + '@types/node@25.2.3': + dependencies: + undici-types: 7.16.0 + '@types/picomatch@3.0.2': {} '@types/qs@6.14.0': {} @@ -8685,16 +8825,16 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 17.0.45 + '@types/node': 25.2.3 '@types/send@1.2.1': dependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 25.2.1 + '@types/node': 25.2.3 '@types/supercluster@7.1.3': dependencies: @@ -8708,7 +8848,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 optional: true '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': @@ -8727,6 +8867,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.56.0 + '@typescript-eslint/type-utils': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.0 + eslint: 9.39.2(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 @@ -8739,6 +8895,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.56.0 + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.0 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) @@ -8748,15 +8916,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.56.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) + '@typescript-eslint/types': 8.56.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.54.0': dependencies: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/scope-manager@8.56.0': + dependencies: + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/visitor-keys': 8.56.0 + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils@8.56.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.54.0 @@ -8769,8 +8955,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.54.0': {} + '@typescript-eslint/types@8.56.0': {} + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) @@ -8786,6 +8986,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.56.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.56.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/visitor-keys': 8.56.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -8797,11 +9012,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.56.0 + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.54.0': dependencies: '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.56.0': + dependencies: + '@typescript-eslint/types': 8.56.0 + eslint-visitor-keys: 5.0.0 + '@ungap/raw-json@0.4.4': {} '@ungap/structured-clone@1.3.0': {} @@ -8810,7 +9041,7 @@ snapshots: dependencies: valibot: 1.2.0(typescript@5.9.3) - '@vitejs/plugin-react@5.1.3(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.3(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -8818,7 +9049,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.2 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -8839,13 +9070,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': dependencies: @@ -8855,6 +9086,14 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 @@ -9117,9 +9356,9 @@ snapshots: transitivePeerDependencies: - supports-color - astro-expressive-code@0.41.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): + astro-expressive-code@0.41.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): dependencies: - astro: 5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) rehype-expressive-code: 0.41.6 astro-icon@1.1.5: @@ -9237,7 +9476,7 @@ snapshots: - uploadthing - yaml - astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2): + astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/internal-helpers': 0.7.5 @@ -9294,8 +9533,8 @@ snapshots: unist-util-visit: 5.1.0 unstorage: 1.17.4 vfile: 6.0.3 - vite: 6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -10035,6 +10274,8 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.0: {} + eslint@9.39.2(jiti@2.6.1): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -11831,7 +12072,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 25.2.1 + '@types/node': 25.2.3 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -12382,7 +12623,7 @@ snapshots: - supports-color optional: true - solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + solid-devtools@0.30.1(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) @@ -12391,7 +12632,7 @@ snapshots: '@solid-devtools/shared': 0.13.2(solid-js@1.9.11) solid-js: 1.9.11 optionalDependencies: - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color optional: true @@ -12444,11 +12685,11 @@ snapshots: stackback@0.0.2: {} - starlight-links-validator@0.19.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): + starlight-links-validator@0.19.2(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): dependencies: - '@astrojs/starlight': 0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + '@astrojs/starlight': 0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) '@types/picomatch': 3.0.2 - astro: 5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-has-property: 3.0.0 @@ -12462,12 +12703,12 @@ snapshots: transitivePeerDependencies: - supports-color - starlight-openapi@0.22.0(@astrojs/markdown-remark@6.3.10)(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(openapi-types@12.1.3): + starlight-openapi@0.22.0(@astrojs/markdown-remark@6.3.10)(@astrojs/starlight@0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(openapi-types@12.1.3): dependencies: '@astrojs/markdown-remark': 6.3.10 - '@astrojs/starlight': 0.37.6(astro@5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + '@astrojs/starlight': 0.37.6(astro@5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) '@readme/openapi-parser': 4.1.2(openapi-types@12.1.3) - astro: 5.17.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.17.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) github-slugger: 2.0.0 url-template: 3.1.1 transitivePeerDependencies: @@ -12804,6 +13045,17 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@4.9.4: {} typescript@4.9.5: {} @@ -12966,13 +13218,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -12987,13 +13239,13 @@ snapshots: - tsx - yaml - vite-node@5.3.0(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): + vite-node@5.3.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): dependencies: cac: 6.7.14 es-module-lexer: 2.0.0 obug: 2.1.1 pathe: 2.0.3 - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -13007,15 +13259,15 @@ snapshots: - tsx - yaml - vite-plugin-csp-guard@3.0.0(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + vite-plugin-csp-guard@3.0.0(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): dependencies: cheerio: 1.2.0 csp-toolkit: 1.4.0 - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) - vite-plugin-dts@4.5.4(@types/node@25.2.1)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@25.2.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): dependencies: - '@microsoft/api-extractor': 7.56.2(@types/node@25.2.1) + '@microsoft/api-extractor': 7.56.2(@types/node@25.2.3) '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@volar/typescript': 2.4.28 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -13026,7 +13278,7 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup @@ -13047,7 +13299,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -13055,8 +13307,8 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.11 solid-refresh: 0.6.3(solid-js@1.9.11) - vite: 6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: @@ -13077,12 +13329,27 @@ snapshots: transitivePeerDependencies: - supports-color - vite-tsconfig-paths@6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + dependencies: + '@babel/core': 7.29.0 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.10(@babel/core@7.29.0)(solid-js@1.9.11) + merge-anything: 5.1.7 + solid-js: 1.9.11 + solid-refresh: 0.6.3(solid-js@1.9.11) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.1 + transitivePeerDependencies: + - supports-color + + vite-tsconfig-paths@6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript @@ -13103,7 +13370,7 @@ snapshots: terser: 5.46.0 yaml: 2.8.2 - vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): + vite@6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -13112,7 +13379,7 @@ snapshots: rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.2.1 + '@types/node': 25.2.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 @@ -13151,23 +13418,43 @@ snapshots: terser: 5.46.0 yaml: 2.8.2 + vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.2.3 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + terser: 5.46.0 + yaml: 2.8.2 + vitefu@1.1.1(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): optionalDependencies: vite: 6.4.1(@types/node@16.18.126)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) - vitefu@1.1.1(vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) vitefu@1.1.1(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): optionalDependencies: vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.1)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): + vitefu@1.1.1(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)): + optionalDependencies: + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.3)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -13185,12 +13472,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 25.2.1 + '@types/node': 25.2.3 happy-dom: 15.11.7 jsdom: 28.0.0 transitivePeerDependencies: @@ -13246,6 +13533,45 @@ snapshots: - tsx - yaml + vitest@4.0.18(@types/node@25.2.3)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@28.0.0)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.2.3 + happy-dom: 15.11.7 + jsdom: 28.0.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + volar-service-css@0.0.68(@volar/language-service@2.4.28): dependencies: vscode-css-languageservice: 6.3.9 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0daad516..35e11231 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,6 +5,7 @@ packages: - 'crates/auth-ui/ui' - 'docs' - 'docs/examples/record_api_ts' + - 'docs/examples/wasm-guest-ts' - 'examples/blog/web' - 'examples/coffee-vector-search' - 'examples/coffee-vector-search/guests/typescript'