From 3d00a87d1f4b0ff8988dc2e728cc295d65f7e278 Mon Sep 17 00:00:00 2001 From: Francesco Pasqua Date: Tue, 11 Jun 2024 19:04:40 +0200 Subject: [PATCH] feat(client): isomorphic pinorama client --- examples/create-server-example/package.json | 10 +- examples/fastify-example/package.json | 10 +- package.json | 3 +- packages/pinorama-client/package.json | 45 +- packages/pinorama-client/rollup.config.mjs | 115 ++++ packages/pinorama-client/src/index.mts | 183 ------ packages/pinorama-client/src/index.ts | 118 ++++ .../pinorama-client/src/platform/browser.ts | 4 + packages/pinorama-client/src/platform/node.ts | 3 + packages/pinorama-client/tsconfig.json | 24 +- packages/pinorama-docs/package.json | 4 +- packages/pinorama-server/package.json | 10 +- packages/pinorama-server/src/index.mts | 11 +- packages/pinorama-studio/cli.mjs | 109 ++-- packages/pinorama-studio/package.json | 6 +- packages/pinorama-studio/src/app.tsx | 5 +- .../components/pinorama-client-provider.tsx | 41 ++ packages/pinorama-studio/src/hooks/index.ts | 16 + packages/pinorama-studio/src/main.tsx | 22 +- packages/pinorama-transport/package.json | 9 +- packages/pinorama-transport/src/cli.mts | 4 +- packages/pinorama-transport/src/lib.mts | 102 ++- .../tests/integration.test.mts | 6 +- .../pinorama-transport/tests/unit.test.mts | 50 +- pnpm-lock.yaml | 584 +++++++++++++----- 25 files changed, 978 insertions(+), 516 deletions(-) create mode 100644 packages/pinorama-client/rollup.config.mjs delete mode 100644 packages/pinorama-client/src/index.mts create mode 100644 packages/pinorama-client/src/index.ts create mode 100644 packages/pinorama-client/src/platform/browser.ts create mode 100644 packages/pinorama-client/src/platform/node.ts create mode 100644 packages/pinorama-studio/src/components/pinorama-client-provider.tsx create mode 100644 packages/pinorama-studio/src/hooks/index.ts diff --git a/examples/create-server-example/package.json b/examples/create-server-example/package.json index d3c8f60..1c6d694 100644 --- a/examples/create-server-example/package.json +++ b/examples/create-server-example/package.json @@ -4,12 +4,16 @@ "type": "module", "private": true, "scripts": { - "start": "node index.mjs" + "start": "node index.mjs", + "clean": "rimraf node_modules" }, "dependencies": { "@fastify/one-line-logger": "^1.3.0", "fastify": "^4.26.2", - "pinorama-transport": "workspace:*", - "pinorama-server": "workspace:*" + "pinorama-server": "workspace:*", + "pinorama-transport": "workspace:*" + }, + "devDependencies": { + "rimraf": "^5.0.7" } } diff --git a/examples/fastify-example/package.json b/examples/fastify-example/package.json index 727db00..5b5f770 100644 --- a/examples/fastify-example/package.json +++ b/examples/fastify-example/package.json @@ -4,12 +4,16 @@ "type": "module", "private": true, "scripts": { - "start": "node index.mjs" + "start": "node index.mjs", + "clean": "rimraf node_modules" }, "dependencies": { "@fastify/one-line-logger": "^1.3.0", "fastify": "^4.26.2", - "pinorama-transport": "workspace:*", - "pinorama-server": "workspace:*" + "pinorama-server": "workspace:*", + "pinorama-transport": "workspace:*" + }, + "devDependencies": { + "rimraf": "^5.0.7" } } diff --git a/package.json b/package.json index 2fdd6af..92ba760 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "scripts": { "test": "turbo test", - "clean": "turbo clean", + "clean": "turbo clean && rimraf node_modules .turbo", "build": "turbo build", "dev": "turbo dev", "biome": "biome check --write --no-errors-on-unmatched", @@ -26,6 +26,7 @@ "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "husky": "^9.0.11", + "rimraf": "^5.0.7", "turbo": "^2.0.3" }, "packageManager": "pnpm@9.2.0", diff --git a/packages/pinorama-client/package.json b/packages/pinorama-client/package.json index ead301d..707178d 100644 --- a/packages/pinorama-client/package.json +++ b/packages/pinorama-client/package.json @@ -2,26 +2,47 @@ "name": "pinorama-client", "version": "0.1.0", "license": "MIT", - "type": "module", - "types": "./dist/index.d.mts", - "exports": "./dist/index.mjs", - "files": ["dist"], - "scripts": { - "clean": "rimraf ./dist", - "build": "pnpm clean && tsc" + "main": "./dist/node/pinorama-client.cjs", + "module": "./dist/node/pinorama-client.mjs", + "exports": { + ".": { + "types": "./dist/types/pinorama-client.d.ts", + "require": "./dist/node/pinorama-client.cjs", + "import": "./dist/node/pinorama-client.mjs" + }, + "./node": { + "types": "./dist/types/pinorama-client.d.ts", + "require": "./dist/node/pinorama-client.cjs", + "import": "./dist/node/pinorama-client.mjs" + }, + "./browser": { + "types": "./dist/types/pinorama-client.d.ts", + "import": "./dist/browser/pinorama-client.esm.js" + } }, - "author": { - "email": "cesconix@me.com", - "name": "Francesco Pasqua", - "url": "https://github.com/cesconix" + "types": "./dist/types/pinorama-client.d.ts", + "files": [ + "dist" + ], + "scripts": { + "clean": "rimraf dist node_modules", + "build": "rollup --config" }, + "author": "Francesco Pasqua ", "devDependencies": { + "@rollup/plugin-alias": "^5.1.0", + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "^11.1.6", "@types/node": "^20.14.2", "rimraf": "^5.0.7", + "rollup": "^4.18.0", + "rollup-plugin-dts": "^6.1.1", + "tslib": "^2.6.3", "typescript": "^5.4.5" }, "dependencies": { - "undici": "^6.18.2", "zod": "^3.23.8" }, "publishConfig": { diff --git a/packages/pinorama-client/rollup.config.mjs b/packages/pinorama-client/rollup.config.mjs new file mode 100644 index 0000000..42434d0 --- /dev/null +++ b/packages/pinorama-client/rollup.config.mjs @@ -0,0 +1,115 @@ +import alias from "@rollup/plugin-alias"; +import commonjs from "@rollup/plugin-commonjs"; +import resolve from "@rollup/plugin-node-resolve"; +import terser from "@rollup/plugin-terser"; +import typescript from "@rollup/plugin-typescript"; +import { dts } from "rollup-plugin-dts"; + +const inputFile = "src/index.ts"; +const outputFileName = "pinorama-client"; + +export default [ + // Declaration file + { + input: inputFile, + output: [{ file: "dist/types/pinorama-client.d.ts", format: "es" }], + plugins: [dts()], + }, + + // Browser ESM build + { + input: inputFile, + output: [ + { + file: `dist/browser/${outputFileName}.esm.js`, + format: "es", + sourcemap: true, + }, + ], + plugins: [ + alias({ + entries: [ + { find: "./platform/node.js", replacement: "./platform/browser.js" }, + ], + }), + resolve({ browser: true }), + commonjs(), + typescript(), + terser(), + ], + external: ["zod"], + }, + + // // Browser UMD build + // { + // input: inputFile, + // output: [ + // { + // file: `dist/browser/${outputFileName}.umd.js`, + // format: "umd", + // name: "pinorama-client", + // }, + // ], + // plugins: [ + // alias({ + // entries: [ + // { find: "./platform/node.js", replacement: "./platform/browser.js" }, + // ], + // }), + // resolve({ browser: true }), + // commonjs(), + // typescript(), + // ], + // external: ["zod"], + // }, + + // // Browser CJS build + // { + // input: inputFile, + // output: [ + // { + // file: `dist/browser/${outputFileName}.cjs.js`, + // format: "cjs", + // }, + // ], + // plugins: [ + // alias({ + // entries: [ + // { find: "./platform/node.js", replacement: "./platform/browser.js" }, + // ], + // }), + // resolve({ browser: true }), + // commonjs(), + // typescript(), + // ], + // external: ["zod"], + // }, + + // Node.js ESM bundle + { + input: inputFile, + output: [ + { + file: `dist/node/${outputFileName}.mjs`, + format: "es", + sourcemap: true, + }, + ], + plugins: [resolve(), commonjs(), typescript()], + external: ["zod"], + }, + + // Node.js CJS build + { + input: inputFile, + output: [ + { + file: `dist/node/${outputFileName}.cjs`, + format: "cjs", + sourcemap: true, + }, + ], + plugins: [resolve(), commonjs(), typescript()], + external: ["zod"], + }, +]; diff --git a/packages/pinorama-client/src/index.mts b/packages/pinorama-client/src/index.mts deleted file mode 100644 index 1d8e6a5..0000000 --- a/packages/pinorama-client/src/index.mts +++ /dev/null @@ -1,183 +0,0 @@ -import { setTimeout } from "node:timers/promises" -import { URL } from "node:url" -import { Client } from "undici" -import { z } from "zod" - -import type { Readable } from "node:stream" -import type { IncomingHttpHeaders } from "undici/types/header.js" - -const clientOptionsSchema = z.object({ - url: z.string(), - maxRetries: z.number().min(2), - backoff: z.number().min(0), - backoffFactor: z.number().min(2), - backoffMax: z.number().min(1000), - adminSecret: z.string().optional() -}) - -const bulkOptionsSchema = z.object({ - batchSize: z.number(), - flushInterval: z.number() -}) - -export type PinoramaClientOptions = z.infer -export type PinoramaBulkOptions = z.infer - -export const defaultClientOptions: Partial = { - maxRetries: 5, - backoff: 1000, - backoffFactor: 2, - backoffMax: 30000 -} - -export const defaultBulkOptions: Partial = { - batchSize: 100, - flushInterval: 5000 -} - -export class PinoramaClient { - /** Base path derived from the URL */ - private basePath: string - - /** Maximum number of retry attempts */ - private maxRetries: number - - /** Initial backoff delay in milliseconds */ - private backoff: number - - /** Factor by which the backoff delay increases */ - private backoffFactor: number - - /** Maximum backoff delay in milliseconds */ - private backoffMax: number - - /** HTTP client for making requests */ - private client: Client - - /** Default headers for HTTP requests */ - private defaultHeaders: IncomingHttpHeaders - - constructor(options?: Partial) { - const opts = clientOptionsSchema.parse({ - ...defaultClientOptions, - ...options - }) - - const { origin, pathname } = new URL(opts.url) - this.basePath = pathname.length === 1 ? "" : pathname - - this.client = new Client(origin) - this.maxRetries = opts.maxRetries - this.backoff = opts.backoff - this.backoffFactor = opts.backoffFactor - this.backoffMax = opts.backoffMax - - this.defaultHeaders = this.getDefaultHeaders(opts) - } - - private getDefaultHeaders(options: Partial) { - const headers: IncomingHttpHeaders = { - "content-type": "application/json" - } - - if (options.adminSecret) { - headers["x-pinorama-admin-secret"] = options.adminSecret - } - - return headers - } - - private async retryOperation(operation: () => Promise): Promise { - let retries = 0 - let currentBackoff = this.backoff - while (retries < this.maxRetries) { - try { - await operation() - return - } catch (error) { - console.error("error during operation:", error) - retries++ - if (retries >= this.maxRetries) throw new Error("max retries reached") - await setTimeout(Math.min(currentBackoff, this.backoffMax)) - currentBackoff *= this.backoffFactor - } - } - } - - public async insert(docs: any[]): Promise { - await this.retryOperation(async () => { - const { statusCode } = await this.client.request({ - path: `${this.basePath}/bulk`, - method: "POST", - headers: this.defaultHeaders, - body: JSON.stringify(docs) - }) - - if (statusCode !== 201) { - throw new Error("[TODO ERROR]: PinoramaClient.insert failed") - } - }) - } - - public bulkInsert(stream: Readable, options?: Partial) { - const opts = bulkOptionsSchema.parse({ ...defaultBulkOptions, ...options }) - - const buffer: any[] = [] - let flushing = false - - const flush = async () => { - if (buffer.length === 0 || flushing) return - flushing = true - - try { - stream.pause() - await this.insert(buffer) - buffer.length = 0 - } catch (error) { - console.error("Failed to flush logs:", error) - } finally { - stream.resume() - flushing = false - } - } - - const intervalId = setInterval(() => { - flush() - }, opts.flushInterval) - - stream.on("data", async (data) => { - buffer.push(data) - if (buffer.length >= opts.batchSize) { - await flush() - } - }) - - stream.on("end", async () => { - clearInterval(intervalId) - await flush() - }) - - return { flush } - } - - public async search(payload: unknown): Promise { - try { - const { statusCode, body } = await this.client.request({ - path: `${this.basePath}/search`, - method: "POST", - headers: this.defaultHeaders, - body: JSON.stringify(payload) - }) - - const json = (await body.json()) as { error: string } - if (statusCode !== 200) { - throw new Error(json.error) - } - - return json - } catch (error) { - console.error("error searching logs:", error) - throw error - } - } -} diff --git a/packages/pinorama-client/src/index.ts b/packages/pinorama-client/src/index.ts new file mode 100644 index 0000000..456c01b --- /dev/null +++ b/packages/pinorama-client/src/index.ts @@ -0,0 +1,118 @@ +import { z } from "zod"; +import { setTimeout } from "./platform/node.js"; + +const clientOptionsSchema = z.object({ + url: z.string(), + maxRetries: z.number().min(2), + backoff: z.number().min(0), + backoffFactor: z.number().min(2), + backoffMax: z.number().min(1000), + adminSecret: z.string().optional(), +}); + +export type PinoramaClientOptions = z.infer; + +export const defaultClientOptions: Partial = { + maxRetries: 5, + backoff: 1000, + backoffFactor: 2, + backoffMax: 30000, +}; + +export class PinoramaClient { + /** Pinorama Server URL */ + private url: string; + + /** Maximum number of retry attempts */ + private maxRetries: number; + + /** Initial backoff delay in milliseconds */ + private backoff: number; + + /** Factor by which the backoff delay increases */ + private backoffFactor: number; + + /** Maximum backoff delay in milliseconds */ + private backoffMax: number; + + /** Default headers for HTTP requests */ + private defaultHeaders: Record; + + constructor(options?: Partial) { + const opts = clientOptionsSchema.parse({ + ...defaultClientOptions, + ...options, + }); + + this.url = opts.url; + this.maxRetries = opts.maxRetries; + this.backoff = opts.backoff; + this.backoffFactor = opts.backoffFactor; + this.backoffMax = opts.backoffMax; + + this.defaultHeaders = this.getDefaultHeaders(opts); + } + + private getDefaultHeaders(options: Partial) { + const headers: Record = { + "content-type": "application/json", + }; + + if (options.adminSecret) { + headers["x-pinorama-admin-secret"] = options.adminSecret; + } + + return headers; + } + + private async retryOperation(operation: () => Promise): Promise { + let retries = 0; + let currentBackoff = this.backoff; + while (retries < this.maxRetries) { + try { + await operation(); + return; + } catch (error) { + console.error("error during operation:", error); + retries++; + if (retries >= this.maxRetries) throw new Error("max retries reached"); + await setTimeout(Math.min(currentBackoff, this.backoffMax)); + currentBackoff *= this.backoffFactor; + } + } + } + + public async insert(docs: any[]): Promise { + await this.retryOperation(async () => { + const response = await fetch(`${this.url}/bulk`, { + method: "POST", + headers: this.defaultHeaders, + body: JSON.stringify(docs), + }); + + if (response.status !== 201) { + throw new Error("[TODO ERROR]: PinoramaClient.insert failed"); + } + }); + } + + public async search(payload: unknown): Promise { + try { + const response = await fetch(`${this.url}/search`, { + method: "POST", + headers: this.defaultHeaders, + body: JSON.stringify(payload), + }); + + const json = await response.json(); + if (response.status !== 200) { + throw new Error(json.error); + } + + return json; + } catch (error) { + console.error("error searching logs:", error); + throw error; + } + } +} diff --git a/packages/pinorama-client/src/platform/browser.ts b/packages/pinorama-client/src/platform/browser.ts new file mode 100644 index 0000000..7401e23 --- /dev/null +++ b/packages/pinorama-client/src/platform/browser.ts @@ -0,0 +1,4 @@ +const setTimeout = (ms: number) => + new Promise((resolve) => window.setTimeout(resolve, ms)); + +export { setTimeout }; diff --git a/packages/pinorama-client/src/platform/node.ts b/packages/pinorama-client/src/platform/node.ts new file mode 100644 index 0000000..8ddcf97 --- /dev/null +++ b/packages/pinorama-client/src/platform/node.ts @@ -0,0 +1,3 @@ +import { setTimeout } from "node:timers/promises"; + +export { setTimeout }; diff --git a/packages/pinorama-client/tsconfig.json b/packages/pinorama-client/tsconfig.json index 4ed5f17..de99eea 100644 --- a/packages/pinorama-client/tsconfig.json +++ b/packages/pinorama-client/tsconfig.json @@ -3,21 +3,27 @@ "compilerOptions": { "esModuleInterop": true, "skipLibCheck": true, - "target": "es2022", + "target": "ES5", "allowJs": true, "resolveJsonModule": true, "moduleDetection": "force", "isolatedModules": true, "strict": true, "noUncheckedIndexedAccess": true, - "moduleResolution": "NodeNext", - "module": "NodeNext", + "moduleResolution": "Node", + "module": "ESNext", "sourceMap": true, - "declaration": true, - "declarationMap": true, - "lib": ["ES2022"], - "outDir": "dist" + "lib": [ + "ESNext", + "DOM" + ], }, - "include": ["src"], - "exclude": ["node_modules", "dist", "tests"] + "include": [ + "src" + ], + "exclude": [ + "node_modules", + "dist", + "tests" + ] } diff --git a/packages/pinorama-docs/package.json b/packages/pinorama-docs/package.json index d9d4eac..f507eef 100644 --- a/packages/pinorama-docs/package.json +++ b/packages/pinorama-docs/package.json @@ -6,9 +6,11 @@ "scripts": { "dev": "vitepress dev", "build": "vitepress build", - "preview": "vitepress preview" + "preview": "vitepress preview", + "clean": "rimraf .vitepress/cache .vitepress/dist node_modules" }, "devDependencies": { + "rimraf": "^5.0.7", "vitepress": "^1.2.3" } } diff --git a/packages/pinorama-server/package.json b/packages/pinorama-server/package.json index 7d61d12..1234ce5 100644 --- a/packages/pinorama-server/package.json +++ b/packages/pinorama-server/package.json @@ -5,10 +5,12 @@ "type": "module", "types": "./dist/index.d.mts", "exports": "./dist/index.mjs", - "files": ["dist"], + "files": [ + "dist" + ], "scripts": { - "clean": "rimraf ./dist", - "build": "pnpm clean && tsc" + "clean": "rimraf dist node_modules", + "build": "tsc" }, "author": { "email": "cesconix@me.com", @@ -17,7 +19,7 @@ }, "devDependencies": { "@types/node": "^20.12.7", - "rimraf": "^5.0.5", + "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "dependencies": { diff --git a/packages/pinorama-server/src/index.mts b/packages/pinorama-server/src/index.mts index a95dcc6..ff6824d 100644 --- a/packages/pinorama-server/src/index.mts +++ b/packages/pinorama-server/src/index.mts @@ -1,6 +1,4 @@ import fs from "node:fs" -import path from "node:path" -import url from "node:url" import { create } from "@orama/orama" import { restoreFromFile } from "@orama/plugin-data-persistence/server" import Fastify from "fastify" @@ -19,9 +17,6 @@ import type { RegisterOptions } from "fastify" -const __filename = url.fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) - declare module "fastify" { interface FastifyInstance { pinoramaDb: AnyOrama @@ -76,9 +71,9 @@ const fastifyPinoramaServer: FastifyPluginAsync = async ( registerOpts.logLevel = opts.logLevel } - fastify.register(routes.bulkRoute) - fastify.register(routes.persistRoute) - fastify.register(routes.searchRoute) + fastify.register(routes.bulkRoute, registerOpts) + fastify.register(routes.persistRoute, registerOpts) + fastify.register(routes.searchRoute, registerOpts) fastify.register(plugins.gracefulSaveHook) fastify.register(plugins.authHook) diff --git a/packages/pinorama-studio/cli.mjs b/packages/pinorama-studio/cli.mjs index 9a7afea..5d9bf1f 100755 --- a/packages/pinorama-studio/cli.mjs +++ b/packages/pinorama-studio/cli.mjs @@ -1,17 +1,18 @@ #! /usr/bin/env node -import { readFileSync } from "node:fs" -import os from "node:os" -import path from "node:path" -import { pipeline } from "node:stream/promises" -import { fileURLToPath } from "node:url" -import fastifyStatic from "@fastify/static" -import c from "chalk" -import fastify from "fastify" -import minimist from "minimist" -import open from "open" -import { fastifyPinoramaServer } from "pinorama-server" -import pinoramaTransport from "pinorama-transport" +import { readFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { pipeline } from "node:stream/promises"; +import { fileURLToPath } from "node:url"; +import fastifyCors from "@fastify/cors"; +import fastifyStatic from "@fastify/static"; +import c from "chalk"; +import fastify from "fastify"; +import minimist from "minimist"; +import open from "open"; +import { fastifyPinoramaServer } from "pinorama-server"; +import pinoramaTransport from "pinorama-transport"; const defaultOptions = { host: "localhost", @@ -21,14 +22,14 @@ const defaultOptions = { server: false, "server-prefix": "/pinorama", "server-db-path": path.resolve(os.tmpdir(), "pinorama.msp"), - "admin-secret": "your-secret" -} + "admin-secret": "your-secret", +}; async function start(options) { - const opts = { ...defaultOptions, ...options } + const opts = { ...defaultOptions, ...options }; - const pj = fileURLToPath(new URL("./package.json", import.meta.url)) - const { version } = JSON.parse(readFileSync(pj, "utf8")) + const pj = fileURLToPath(new URL("./package.json", import.meta.url)); + const { version } = JSON.parse(readFileSync(pj, "utf8")); if (opts.help) { console.log(` @@ -58,63 +59,63 @@ async function start(options) { cat logs | pinorama -l -o pinorama --host 192.168.1.1 --port 8080 pinorama --server --logger -`) - return +`); + return; } if (opts.version) { - console.log(version) - return + console.log(version); + return; } - const isPiped = !process.stdin.isTTY - opts.server = isPiped || opts.server + const isPiped = !process.stdin.isTTY; + opts.server = isPiped || opts.server; - const app = createServer(opts) + const app = createServer(opts); if (opts.server) { app.register(fastifyPinoramaServer, { adminSecret: opts["admin-secret"], dbPath: opts["server-db-path"], - prefix: opts["server-prefix"] - }) + prefix: opts["server-prefix"], + }); } - const studioUrl = `http://${opts.host}:${opts.port}` - const serverUrl = `${studioUrl}${opts["server-prefix"]}` + const studioUrl = `http://${opts.host}:${opts.port}`; + const serverUrl = `${studioUrl}${opts["server-prefix"]}`; app.listen({ host: opts.host, port: opts.port }, async (err) => { - if (err) throw err + if (err) throw err; - const msg = [`${"Pinorama Studio Web:"} ${c.dim(studioUrl)}`] + const msg = [`${"Pinorama Studio Web:"} ${c.dim(studioUrl)}`]; if (opts.server) { - msg.push(`${"Pinorama Server API:"} ${c.dim(serverUrl)}`) - msg.push(`${"Server DB File Path:"} ${c.dim(opts["server-db-path"])}`) + msg.push(`${"Pinorama Server API:"} ${c.dim(serverUrl)}`); + msg.push(`${"Server DB File Path:"} ${c.dim(opts["server-db-path"])}`); } - console.log(msg.join("\n")) + console.log(msg.join("\n")); - opts.open && (await open(studioUrl)) - }) + opts.open && (await open(studioUrl)); + }); if (isPiped) { console.log( c.yellow("Detected piped output. Server mode activated by default.") - ) + ); const stream = pinoramaTransport({ url: serverUrl, batchSize: 1000, - adminSecret: opts["admin-secret"] - }) + adminSecret: opts["admin-secret"], + }); stream.on("error", (error) => { - console.error(error) - }) + console.error(error); + }); - await app.ready() - pipeline(process.stdin, stream) + await app.ready(); + pipeline(process.stdin, stream); } } @@ -125,18 +126,20 @@ function createServer(opts) { transport: { target: "@fastify/one-line-logger", options: { - colorize: true - } - } + colorize: true, + }, + }, } - : false - }) + : false, + }); + + app.register(fastifyCors); app.register(fastifyStatic, { - root: fileURLToPath(new URL("dist", import.meta.url)) - }) + root: fileURLToPath(new URL("dist", import.meta.url)), + }); - return app + return app; } start( @@ -151,9 +154,9 @@ start( server: "s", "server-prefix": "e", "server-db-path": "f", - "admin-secret": "k" + "admin-secret": "k", }, boolean: ["server", "open"], - default: defaultOptions + default: defaultOptions, }) -) +); diff --git a/packages/pinorama-studio/package.json b/packages/pinorama-studio/package.json index fed43a5..945412f 100644 --- a/packages/pinorama-studio/package.json +++ b/packages/pinorama-studio/package.json @@ -13,9 +13,11 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "preview": "vite preview" + "preview": "vite preview", + "clean": "rimraf dist node_modules" }, "dependencies": { + "@fastify/cors": "^9.0.1", "@fastify/one-line-logger": "^1.3.0", "@fastify/static": "^7.0.4", "@radix-ui/react-dropdown-menu": "^2.0.6", @@ -29,6 +31,7 @@ "lucide-react": "^0.390.0", "minimist": "^1.2.8", "open": "^10.1.0", + "pinorama-client": "workspace:*", "pinorama-server": "workspace:*", "pinorama-transport": "workspace:*", "react": "^18.3.1", @@ -43,6 +46,7 @@ "@vitejs/plugin-react": "^4.3.0", "autoprefixer": "^10.4.19", "postcss": "^8.4.38", + "rimraf": "^5.0.7", "tailwindcss": "^3.4.4", "typescript": "^5.4.5", "vite": "^5.2.13" diff --git a/packages/pinorama-studio/src/app.tsx b/packages/pinorama-studio/src/app.tsx index ea65c95..33f1e63 100644 --- a/packages/pinorama-studio/src/app.tsx +++ b/packages/pinorama-studio/src/app.tsx @@ -1,5 +1,8 @@ +import { useLogs } from "@/hooks" + function App() { - return
Pinorama Studio
+ const { data } = useLogs() + return
{JSON.stringify(data)}
} export default App diff --git a/packages/pinorama-studio/src/components/pinorama-client-provider.tsx b/packages/pinorama-studio/src/components/pinorama-client-provider.tsx new file mode 100644 index 0000000..a97655c --- /dev/null +++ b/packages/pinorama-studio/src/components/pinorama-client-provider.tsx @@ -0,0 +1,41 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { + PinoramaClient, + type PinoramaClientOptions, +} from "pinorama-client/browser"; +import { createContext, useContext } from "react"; + +type PinoramaClientProviderProps = { + options: Partial; + children: React.ReactNode; +}; + +const PinoramaClientContext = createContext(null); + +export function PinoramaClientProvider({ + options, + children, +}: PinoramaClientProviderProps) { + const queryClient = new QueryClient(); + const pinoramaClient = new PinoramaClient(options); + + return ( + + + {children} + + + ); +} + +export const usePinoramaClient = () => { + const context = useContext(PinoramaClientContext); + + if (context === undefined) { + throw new Error( + "usePinoramaClient must be used within a PinoramaClientProvider" + ); + } + + return context; +}; diff --git a/packages/pinorama-studio/src/hooks/index.ts b/packages/pinorama-studio/src/hooks/index.ts new file mode 100644 index 0000000..3d32e49 --- /dev/null +++ b/packages/pinorama-studio/src/hooks/index.ts @@ -0,0 +1,16 @@ +import { usePinoramaClient } from "@/components/pinorama-client-provider" +import { useQuery } from "@tanstack/react-query" + +export const useLogs = () => { + const client = usePinoramaClient() + + const query = useQuery({ + queryKey: ["logs"], + queryFn: async () => { + const response: any = await client?.search({}) + response.json() + } + }) + + return query +} diff --git a/packages/pinorama-studio/src/main.tsx b/packages/pinorama-studio/src/main.tsx index dad4d69..51b40f4 100644 --- a/packages/pinorama-studio/src/main.tsx +++ b/packages/pinorama-studio/src/main.tsx @@ -1,19 +1,17 @@ -import { QueryClient, QueryClientProvider } from "@tanstack/react-query" -import React from "react" -import ReactDOM from "react-dom/client" +import React from "react"; +import ReactDOM from "react-dom/client"; -import { ThemeProvider } from "@/components/theme-provider" -import App from "./app.tsx" -import "./globals.css" - -const queryClient = new QueryClient() +import { PinoramaClientProvider } from "@/components/pinorama-client-provider"; +import { ThemeProvider } from "@/components/theme-provider"; +import App from "./app.tsx"; +import "./globals.css"; ReactDOM.createRoot(document.getElementById("app") as HTMLElement).render( - - + + - + -) +); diff --git a/packages/pinorama-transport/package.json b/packages/pinorama-transport/package.json index 69bc6e2..e600d86 100644 --- a/packages/pinorama-transport/package.json +++ b/packages/pinorama-transport/package.json @@ -8,14 +8,15 @@ "bin": { "pino-pinorama": "./dist/cli.mjs" }, - "files": ["dist"], + "files": [ + "dist" + ], "scripts": { "test": "vitest run", "test:watch": "vitest", - "test:coverage": "vitest run --coverage", "test:debug": "vitest --inspect-brk --no-file-parallelism", - "clean": "rimraf ./dist", - "build": "pnpm clean && tsc", + "clean": "rimraf dist node_modules", + "build": "tsc", "postbuild": "chmod u+x ./dist/cli.mjs" }, "author": { diff --git a/packages/pinorama-transport/src/cli.mts b/packages/pinorama-transport/src/cli.mts index f6f4fde..af144f7 100755 --- a/packages/pinorama-transport/src/cli.mts +++ b/packages/pinorama-transport/src/cli.mts @@ -5,8 +5,8 @@ import type { Transform } from "node:stream" import { pipeline } from "node:stream/promises" import { fileURLToPath } from "node:url" import minimist from "minimist" -import { defaultBulkOptions, defaultClientOptions } from "pinorama-client" -import pinoramaTransport from "./lib.mjs" +import { defaultClientOptions } from "pinorama-client" +import pinoramaTransport, { defaultBulkOptions } from "./lib.mjs" import type { PinoramaTransportOptions } from "./lib.mjs" type PinoramaCliOptions = PinoramaTransportOptions & { diff --git a/packages/pinorama-transport/src/lib.mts b/packages/pinorama-transport/src/lib.mts index 71ba184..45c5a3e 100644 --- a/packages/pinorama-transport/src/lib.mts +++ b/packages/pinorama-transport/src/lib.mts @@ -1,14 +1,21 @@ -import abstractTransport from "pino-abstract-transport" -import { PinoramaClient } from "pinorama-client" +import { setInterval } from "node:timers"; +import abstractTransport from "pino-abstract-transport"; +import { PinoramaClient } from "pinorama-client/node"; -import type { Transform } from "node:stream" -import type { - PinoramaBulkOptions, - PinoramaClientOptions -} from "pinorama-client" +import type { Transform } from "node:stream"; +import type { PinoramaClientOptions } from "pinorama-client/node"; -export type PinoramaTransportOptions = PinoramaClientOptions & - PinoramaBulkOptions +type BulkOptions = { + batchSize: number; + flushInterval: number; +}; + +export const defaultBulkOptions: BulkOptions = { + batchSize: 100, + flushInterval: 5000, +}; + +export type PinoramaTransportOptions = PinoramaClientOptions & BulkOptions; /** * Creates a pino transport that sends logs to a Pinorama server. @@ -25,42 +32,73 @@ export default function pinoramaTransport( "backoff", "backoffFactor", "backoffMax", - "adminSecret" - ]) - - const bulkOpts = filterOptions(options, ["batchSize", "flushInterval"]) + "adminSecret", + ]); - const client = new PinoramaClient(clientOpts) + const bulkOpts = filterOptions(options, ["batchSize", "flushInterval"]); - let flushFn: () => Promise + const client = new PinoramaClient(clientOpts); /* build */ const buildFn = async (stream: Transform) => { - const { flush } = client.bulkInsert(stream, bulkOpts) - flushFn = flush - } + const buffer: unknown[] = []; + let flushing = false; - /* close */ - const closeFn = async () => { - return flushFn && (await flushFn()) - } + const opts: BulkOptions = { + batchSize: bulkOpts?.batchSize ?? defaultBulkOptions.batchSize, + flushInterval: + bulkOpts?.flushInterval ?? defaultBulkOptions.flushInterval, + }; + + const flush = async () => { + if (buffer.length === 0 || flushing) return; + flushing = true; + + try { + stream.pause(); + await client.insert(buffer); + buffer.length = 0; + } catch (error) { + console.error("Failed to flush logs:", error); + } finally { + stream.resume(); + flushing = false; + } + }; + + const intervalId = setInterval(() => { + flush(); + }, opts.flushInterval); + + stream.on("data", async (data) => { + buffer.push(data); + if (buffer.length >= opts.batchSize) { + await flush(); + } + }); + + stream.on("end", async () => { + clearInterval(intervalId); + await flush(); + }); + }; /* parseLine */ const parseLineFn = (line: string) => { - const obj = JSON.parse(line) + const obj = JSON.parse(line); if (Object.prototype.toString.call(obj) !== "[object Object]") { - throw new Error("not a plain object.") + throw new Error("not a plain object."); } if (Object.keys(obj).length === 0) { - throw new Error("object is empty.") + throw new Error("object is empty."); } - return obj - } + return obj; + }; - return abstractTransport(buildFn, { close: closeFn, parseLine: parseLineFn }) + return abstractTransport(buildFn, { parseLine: parseLineFn }); } /** @@ -70,12 +108,12 @@ export function filterOptions( options: Partial, keys: (keyof T)[] ): Partial | undefined { - let result: Partial | undefined + let result: Partial | undefined; for (const key of keys) { if (key in options) { - result = result || {} - result[key] = options[key] + result = result || {}; + result[key] = options[key]; } } - return result + return result; } diff --git a/packages/pinorama-transport/tests/integration.test.mts b/packages/pinorama-transport/tests/integration.test.mts index 0f8ab61..d7c1821 100644 --- a/packages/pinorama-transport/tests/integration.test.mts +++ b/packages/pinorama-transport/tests/integration.test.mts @@ -42,7 +42,7 @@ describe("pinoramaTransport", async () => { expect(response.hits[0].document.msg).toBe("hello world") }) - it.skip("should store a deeply nested log line to pinorama server", async () => { + it("should store a deeply nested log line to pinorama server", async () => { const transport = pinoramaTransport({ url: pinoramaServerUrl }) const log = pino(transport) @@ -63,7 +63,7 @@ describe("pinoramaTransport", async () => { expect(response.hits[0].document.deeply.nested.hello).toBe("world") }) - it.skip("should store log lines in bulk", async () => { + it("should store log lines in bulk", async () => { const transport = pinoramaTransport({ url: pinoramaServerUrl }) const log = pino(transport) @@ -84,7 +84,7 @@ describe("pinoramaTransport", async () => { } }) - it.skip("should ignore all values except non-empty plain objects", async () => { + it("should ignore all values except non-empty plain objects", async () => { const transport = pinoramaTransport({ url: pinoramaServerUrl }) // act diff --git a/packages/pinorama-transport/tests/unit.test.mts b/packages/pinorama-transport/tests/unit.test.mts index 46d5293..c0766c3 100644 --- a/packages/pinorama-transport/tests/unit.test.mts +++ b/packages/pinorama-transport/tests/unit.test.mts @@ -2,23 +2,6 @@ import { PinoramaClient } from "pinorama-client" import { afterEach, describe, expect, it, vi } from "vitest" import pinoramaTransport, { filterOptions } from "../src/lib.mts" -vi.mock("pinorama-client", async (importOriginal) => { - const mod = await importOriginal() - return { - ...mod, - PinoramaClient: vi.fn(function () { - this.isFlushed = false - this.bulkInsert = vi.fn(() => { - return { - flush: () => { - this.isFlushed = true - } - } - }) - }) - } -}) - const exampleOptions = { url: "http://example.com", maxRetries: 3, @@ -30,6 +13,14 @@ const exampleOptions = { flushInterval: 2000 // not a client option } +vi.mock("pinorama-client", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + PinoramaClient: vi.fn() + } +}) + describe("pinoramaTransport", () => { const mockedClient = vi.mocked(PinoramaClient) @@ -37,10 +28,10 @@ describe("pinoramaTransport", () => { vi.restoreAllMocks() }) - it("should initialize client with correct filtered options", async () => { + it("should initialize client with correct options", async () => { pinoramaTransport(exampleOptions) - expect(PinoramaClient).toHaveBeenCalledWith({ + expect(mockedClient).toHaveBeenCalledWith({ url: "http://example.com", maxRetries: 3, backoff: 500, @@ -49,27 +40,6 @@ describe("pinoramaTransport", () => { adminSecret: "secret123" }) }) - - it("should properly call the bulkInsert client function", async () => { - const stream = pinoramaTransport(exampleOptions) - - expect(mockedClient.mock.instances[0].bulkInsert).toHaveBeenCalledWith( - stream, - { - batchSize: exampleOptions.batchSize, - flushInterval: exampleOptions.flushInterval - } - ) - }) - - it("should call the flush client function on destroy stream", async () => { - const stream = pinoramaTransport(exampleOptions) - - stream.write('{"msg":"hello world"}\n') - stream.destroy() - - expect(mockedClient.mock.instances[0].isFlushed).toBe(true) - }) }) describe("filterOptions", () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf4c0b7..04024c7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@biomejs/biome': specifier: ^1.8.0 - version: 1.8.0 + version: 1.8.1 '@changesets/cli': specifier: ^2.27.1 version: 2.27.5 @@ -23,6 +23,9 @@ importers: husky: specifier: ^9.0.11 version: 9.0.11 + rimraf: + specifier: ^5.0.7 + version: 5.0.7 turbo: specifier: ^2.0.3 version: 2.0.3 @@ -41,6 +44,10 @@ importers: pinorama-transport: specifier: workspace:* version: link:../../packages/pinorama-transport + devDependencies: + rimraf: + specifier: ^5.0.7 + version: 5.0.7 examples/fastify-example: dependencies: @@ -56,31 +63,59 @@ importers: pinorama-transport: specifier: workspace:* version: link:../../packages/pinorama-transport + devDependencies: + rimraf: + specifier: ^5.0.7 + version: 5.0.7 packages/pinorama-client: dependencies: - undici: - specifier: ^6.18.2 - version: 6.18.2 zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: + '@rollup/plugin-alias': + specifier: ^5.1.0 + version: 5.1.0(rollup@4.18.0) + '@rollup/plugin-commonjs': + specifier: ^26.0.1 + version: 26.0.1(rollup@4.18.0) + '@rollup/plugin-node-resolve': + specifier: ^15.2.3 + version: 15.2.3(rollup@4.18.0) + '@rollup/plugin-terser': + specifier: ^0.4.4 + version: 0.4.4(rollup@4.18.0) + '@rollup/plugin-typescript': + specifier: ^11.1.6 + version: 11.1.6(rollup@4.18.0)(tslib@2.6.3)(typescript@5.4.5) '@types/node': specifier: ^20.14.2 version: 20.14.2 rimraf: specifier: ^5.0.7 version: 5.0.7 + rollup: + specifier: ^4.18.0 + version: 4.18.0 + rollup-plugin-dts: + specifier: ^6.1.1 + version: 6.1.1(rollup@4.18.0)(typescript@5.4.5) + tslib: + specifier: ^2.6.3 + version: 2.6.3 typescript: specifier: ^5.4.5 version: 5.4.5 packages/pinorama-docs: devDependencies: + rimraf: + specifier: ^5.0.7 + version: 5.0.7 vitepress: specifier: ^1.2.3 - version: 1.2.3(@algolia/client-search@4.23.3)(@types/node@20.14.2)(@types/react@18.3.3)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.4.5) + version: 1.2.3(@algolia/client-search@4.23.3)(@types/node@20.14.2)(@types/react@18.3.3)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(terser@5.31.1)(typescript@5.4.5) packages/pinorama-server: dependencies: @@ -101,7 +136,7 @@ importers: specifier: ^20.12.7 version: 20.14.2 rimraf: - specifier: ^5.0.5 + specifier: ^5.0.7 version: 5.0.7 typescript: specifier: ^5.4.5 @@ -109,6 +144,9 @@ importers: packages/pinorama-studio: dependencies: + '@fastify/cors': + specifier: ^9.0.1 + version: 9.0.1 '@fastify/one-line-logger': specifier: ^1.3.0 version: 1.3.0 @@ -126,7 +164,7 @@ importers: version: 1.0.2(@types/react@18.3.3)(react@18.3.1) '@tanstack/react-query': specifier: ^5.40.1 - version: 5.40.1(react@18.3.1) + version: 5.44.0(react@18.3.1) chalk: specifier: ^5.3.0 version: 5.3.0 @@ -148,6 +186,9 @@ importers: open: specifier: ^10.1.0 version: 10.1.0 + pinorama-client: + specifier: workspace:* + version: link:../pinorama-client pinorama-server: specifier: workspace:* version: link:../pinorama-server @@ -178,13 +219,16 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.0 - version: 4.3.0(vite@5.2.13(@types/node@20.14.2)) + version: 4.3.1(vite@5.2.13(@types/node@20.14.2)(terser@5.31.1)) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.38) postcss: specifier: ^8.4.38 version: 8.4.38 + rimraf: + specifier: ^5.0.7 + version: 5.0.7 tailwindcss: specifier: ^3.4.4 version: 3.4.4 @@ -193,7 +237,7 @@ importers: version: 5.4.5 vite: specifier: ^5.2.13 - version: 5.2.13(@types/node@20.14.2) + version: 5.2.13(@types/node@20.14.2)(terser@5.31.1) packages/pinorama-transport: dependencies: @@ -212,7 +256,7 @@ importers: version: 20.14.2 '@vitest/coverage-v8': specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.14.2)) + version: 1.6.0(vitest@1.6.0(@types/node@20.14.2)(terser@5.31.1)) pino: specifier: ^9.1.0 version: 9.1.0 @@ -230,7 +274,7 @@ importers: version: 5.4.5 vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.2) + version: 1.6.0(@types/node@20.14.2)(terser@5.31.1) packages: @@ -417,55 +461,55 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@1.8.0': - resolution: {integrity: sha512-34xcE2z8GWrIz1sCFEmlHT/+4d+SN7YOqqvzlAKXKvaWPRJ2/NUwxPbRsP01P9QODkQ5bvGvc9rpBihmP+7RJQ==} + '@biomejs/biome@1.8.1': + resolution: {integrity: sha512-fQXGfvq6DIXem12dGQCM2tNF+vsNHH1qs3C7WeOu75Pd0trduoTmoO7G4ntLJ2qDs5wuw981H+cxQhi1uHnAtA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.8.0': - resolution: {integrity: sha512-dBAYzfIJ1JmWigKlWourT3sJ3I60LZPjqNwwlsyFjiv5AV7vPeWlHVVIImV2BpINwNjZQhpXnwDfVnGS4vr7AA==} + '@biomejs/cli-darwin-arm64@1.8.1': + resolution: {integrity: sha512-XLiB7Uu6GALIOBWzQ2aMD0ru4Ly5/qSeQF7kk3AabzJ/kwsEWSe33iVySBP/SS2qv25cgqNiLksjGcw2bHT3mw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.8.0': - resolution: {integrity: sha512-ZTTSD0bP0nn9UpRDGQrQNTILcYSj+IkxTYr3CAV64DWBDtQBomlk2oVKWzDaA1LOhpAsTh0giLCbPJaVk2jfMQ==} + '@biomejs/cli-darwin-x64@1.8.1': + resolution: {integrity: sha512-uMTSxVLMfqkBVqyc25hSn83jBbp+wtWjzM/pHFlKXt3htJuw7FErVGW0nmQ9Sxa9vJ7GcqoltLMl28VQRIMYzg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.8.0': - resolution: {integrity: sha512-+ee/pZWsvhDv6eRI00krRNSgAg8DKSxzOv3LUsCjto6N1VzqatTASeQv2HRfG1nitf79rRKM75LkMJbqEfiKww==} + '@biomejs/cli-linux-arm64-musl@1.8.1': + resolution: {integrity: sha512-UQ8Wc01J0wQL+5AYOc7qkJn20B4PZmQL1KrmDZh7ot0DvD6aX4+8mmfd/dG5b6Zjo/44QvCKcvkFGCMRYuhWZA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.8.0': - resolution: {integrity: sha512-cx725jTlJS6dskvJJwwCQaaMRBKE2Qss7ukzmx27Rn/DXRxz6tnnBix4FUGPf1uZfwrERkiJlbWM05JWzpvvXg==} + '@biomejs/cli-linux-arm64@1.8.1': + resolution: {integrity: sha512-3SzZRuC/9Oi2P2IBNPsEj0KXxSXUEYRR2kfRF/Ve8QAfGgrt4qnwuWd6QQKKN5R+oYH691qjm+cXBKEcrP1v/Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.8.0': - resolution: {integrity: sha512-VPA4ocrAOak50VYl8gOAVnjuFFDpIUolShntc/aWM0pZfSIMbRucxnrfUfp44EVwayxjK6ruJTR5xEWj93WvDA==} + '@biomejs/cli-linux-x64-musl@1.8.1': + resolution: {integrity: sha512-fYbP/kNu/rtZ4kKzWVocIdqZOtBSUEg9qUhZaao3dy3CRzafR6u6KDtBeSCnt47O+iLnks1eOR1TUxzr5+QuqA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.8.0': - resolution: {integrity: sha512-cmgmhlD4QUxMhL1VdaNqnB81xBHb3R7huVNyYnPYzP+AykZ7XqJbPd1KcWAszNjUk2AHdx0aLKEBwCOWemxb2g==} + '@biomejs/cli-linux-x64@1.8.1': + resolution: {integrity: sha512-AeBycVdNrTzsyYKEOtR2R0Ph0hCD0sCshcp2aOnfGP0hCZbtFg09D0SdKLbyzKntisY41HxKVrydYiaApp+2uw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.8.0': - resolution: {integrity: sha512-J31spvlh39FfRHQacYXxJX9PvTCH/a8+2Jx9D1lxw+LSF0JybqZcw/4JrlFUWUl4kF3yv8AuYUK0sENScc3g9w==} + '@biomejs/cli-win32-arm64@1.8.1': + resolution: {integrity: sha512-6tEd1H/iFKpgpE3OIB7oNgW5XkjiVMzMRPL8zYoZ036YfuJ5nMYm9eB9H/y81+8Z76vL48fiYzMPotJwukGPqQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.8.0': - resolution: {integrity: sha512-uPHHvu76JC1zYe9zZDcOU9PAg+1MZmPuNgWkb5jljaDeATvzLFPB+0nuJTilf603LXL+E8IdPQAO61Wy2VuEJA==} + '@biomejs/cli-win32-x64@1.8.1': + resolution: {integrity: sha512-g2H31jJzYmS4jkvl6TiyEjEX+Nv79a5km/xn+5DARTp5MBFzC9gwceusSSB2AkJKqZzY131AiACAWjKrVt5Ijw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -762,6 +806,9 @@ packages: '@fastify/ajv-compiler@3.5.0': resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + '@fastify/cors@9.0.1': + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + '@fastify/error@3.4.1': resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} @@ -819,6 +866,9 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -1132,6 +1182,64 @@ packages: '@radix-ui/rect@1.0.1': resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + '@rollup/plugin-alias@5.1.0': + resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@26.0.1': + resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.2.3': + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-typescript@11.1.6': + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] @@ -1212,20 +1320,20 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.6.3': - resolution: {integrity: sha512-QnJKHFUW95GnlJLJGP6QLx4M69HM0KlXk+R2Y8lr/x4nAx1Yb/lsuxq4XwybuUjTxbJk+BT0g/kvn0bcsjGGHg==} + '@shikijs/core@1.6.4': + resolution: {integrity: sha512-WTU9rzZae1p2v6LOxMf6LhtmZOkIHYYW160IuahUyJy7YXPPjyWZLR1ag+SgD22ZMxZtz1gfU6Tccc8t0Il/XA==} - '@shikijs/transformers@1.6.3': - resolution: {integrity: sha512-ptBuP/IIeqCzK3zZO/knFICZWs58uZWzbv7ND+bKOewe5NcCjZfSiMyzFwOyl23ewPJ1APjRBwLi6Asrodmmxw==} + '@shikijs/transformers@1.6.4': + resolution: {integrity: sha512-NqDt7gUg3ayVBnsipT/KoL1pqsVbsvT/2cB0pb5SG2q72qjAv9Lb5OP99pL//BMmI+sMTo+TeARntklyBu4mZQ==} '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@tanstack/query-core@5.40.0': - resolution: {integrity: sha512-eD8K8jsOIq0Z5u/QbvOmfvKKE/XC39jA7yv4hgpl/1SRiU+J8QCIwgM/mEHuunQsL87dcvnHqSVLmf9pD4CiaA==} + '@tanstack/query-core@5.44.0': + resolution: {integrity: sha512-Fa1J7iEEyJnjXG1N4+Fz4OXNH/INve3XSn0Htms3X4wgRsXHxMDwqBE2XtDCts7swkwSIs4izEtaFqWVFr/eLQ==} - '@tanstack/react-query@5.40.1': - resolution: {integrity: sha512-gOcmu+gpFd2taHrrgMM9RemLYYEDYfsCqszxCC0xtx+csDa4R8t7Hr7SfWXQP13S2sF+mOxySo/+FNXJFYBqcA==} + '@tanstack/react-query@5.44.0': + resolution: {integrity: sha512-zmaD6cw8P2cBOfRHhqRmwvDsAi56gqbiwG2CDR6oQOCXSDOvRagvpP6RUStn+RrfcVUrNjKsxBmrgG6Za8p5zg==} peerDependencies: react: ^18.0.0 @@ -1277,14 +1385,17 @@ packages: '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@vitejs/plugin-react@4.3.0': - resolution: {integrity: sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==} + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 @@ -1356,11 +1467,11 @@ packages: '@vue/shared@3.4.27': resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} - '@vueuse/core@10.10.0': - resolution: {integrity: sha512-vexJ/YXYs2S42B783rI95lMt3GzEwkxzC8Hb0Ndpd8rD+p+Lk/Za4bd797Ym7yq4jXqdSyj3JLChunF/vyYjUw==} + '@vueuse/core@10.10.1': + resolution: {integrity: sha512-8Vr8wxILdK+qfBjbngav8LVI+6UuM2TQCufRKMPz/GrpLHQ6dbY6kL5PLa9Eobq8JRrMaDyArPX9Jj18fMTPew==} - '@vueuse/integrations@10.10.0': - resolution: {integrity: sha512-vHGeK7X6mkdkpcm1eE9t3Cpm21pNVfZRwrjwwbrEs9XftnSgszF4831G2rei8Dt9cIYJIfFV+iyx/29muimJPQ==} + '@vueuse/integrations@10.10.1': + resolution: {integrity: sha512-b4iPz4NLk2g5u9GNgTpYqNN1pzYWPpIglHTg6eDjJwKB7OfzJP4m5kQlzn2oRH7U0OlEOCVPrdDfqneuS9YNTg==} peerDependencies: async-validator: '*' axios: '*' @@ -1400,11 +1511,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@10.10.0': - resolution: {integrity: sha512-UNAo2sTCAW5ge6OErPEHb5z7NEAg3XcO9Cj7OK45aZXfLLH1QkexDcZD77HBi5zvEiLOm1An+p/4b5K3Worpug==} + '@vueuse/metadata@10.10.1': + resolution: {integrity: sha512-dpEL5afVLUqbchwGiLrV6spkl4/6UOKJ3YgxFE+wWLj/LakyIZUC83bfeFgbHkRcNhsAqTQCGR74jImsLfK8pg==} - '@vueuse/shared@10.10.0': - resolution: {integrity: sha512-2aW33Ac0Uk0U+9yo3Ypg9s5KcR42cuehRWl7vnUHadQyFvCktseyxxEPBi1Eiq4D2yBGACOnqLZpx1eMc7g5Og==} + '@vueuse/shared@10.10.1': + resolution: {integrity: sha512-edqexI+RQpoeqDxTatqBZa+K87ganbrwpoP++Fd9828U3js5jzwcEDeyrYcUgkKZ5LLL8q7M5SOMvSpMrxBPxg==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} @@ -1567,14 +1678,21 @@ packages: breakword@1.0.6: resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -1603,8 +1721,8 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001629: - resolution: {integrity: sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==} + caniuse-lite@1.0.30001632: + resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==} chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} @@ -1674,10 +1792,16 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -1796,6 +1920,10 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + default-browser-id@5.0.0: resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} engines: {node: '>=18'} @@ -1854,8 +1982,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.795: - resolution: {integrity: sha512-hHo4lK/8wb4NUa+NJYSFyJ0xedNHiR6ylilDtb8NUW9d4dmBFmGiecYEKCEbti1wTNzbKXLfl4hPWEkAFbHYlw==} + electron-to-chromium@1.4.798: + resolution: {integrity: sha512-by9J2CiM9KPGj9qfp5U4FcPSbXJG7FNzqnYaY4WLzX+v2PHieVGmnsA4dxfpGE3QEC7JofpPZmn7Vn1B9NR2+Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1983,8 +2111,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@2.3.1: - resolution: {integrity: sha512-iC7SLdMJx2KGdBkhJ6UulbNfpeIGTMS3/OIJpPa1JkZu9DKVQmPtBBme9Esoa4XP2eLGaHBv4vzRqlolXKo9cg==} + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} fastify-plugin@4.5.1: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} @@ -2259,6 +2387,10 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -2296,6 +2428,9 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -2316,6 +2451,9 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2385,8 +2523,8 @@ packages: resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} - jiti@1.21.3: - resolution: {integrity: sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true joycon@3.1.1: @@ -2448,8 +2586,8 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -2608,6 +2746,9 @@ packages: mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2656,6 +2797,9 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -2898,6 +3042,9 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -3021,6 +3168,13 @@ packages: engines: {node: '>=14.18'} hasBin: true + rollup-plugin-dts@6.1.1: + resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + rollup@4.18.0: resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3076,6 +3230,9 @@ packages: engines: {node: '>=10'} hasBin: true + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -3109,8 +3266,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.6.3: - resolution: {integrity: sha512-lE1/YGlzFY0hQSyEfsZj18xGrTWxyhFQkaiILALqTBZPbJeYFWpbUhlmTGPOupYB/qC+H6sV4UznJzcEh3WMHQ==} + shiki@1.6.4: + resolution: {integrity: sha512-X88chM7w8jnadoZtjPTi5ahCJx9pc9f8GfEkZAEYUTlcUZIEw2D/RY86HI/LkkE7Nj8TQWkiBfaFTJ3VJT6ESg==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -3130,11 +3287,18 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + smartwrap@2.0.2: resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} engines: {node: '>=6'} hasBin: true + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + sonic-boom@3.8.1: resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} @@ -3145,6 +3309,13 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} @@ -3270,6 +3441,11 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3417,10 +3593,6 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@6.18.2: - resolution: {integrity: sha512-o/MQLTwRm9IVhOqhZ0NQ9oXax1ygPjw6Vs+Vq/4QRjbOAC3B1GCHy7TYxxbExKlb7bzDRzt9vBWU6BDz0RFfYg==} - engines: {node: '>=18.17'} - unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -3612,8 +3784,8 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.4.3: - resolution: {integrity: sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==} + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} engines: {node: '>= 14'} hasBin: true @@ -3795,7 +3967,7 @@ snapshots: dependencies: '@babel/compat-data': 7.24.7 '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.0 + browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -3908,39 +4080,39 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@1.8.0': + '@biomejs/biome@1.8.1': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.8.0 - '@biomejs/cli-darwin-x64': 1.8.0 - '@biomejs/cli-linux-arm64': 1.8.0 - '@biomejs/cli-linux-arm64-musl': 1.8.0 - '@biomejs/cli-linux-x64': 1.8.0 - '@biomejs/cli-linux-x64-musl': 1.8.0 - '@biomejs/cli-win32-arm64': 1.8.0 - '@biomejs/cli-win32-x64': 1.8.0 - - '@biomejs/cli-darwin-arm64@1.8.0': + '@biomejs/cli-darwin-arm64': 1.8.1 + '@biomejs/cli-darwin-x64': 1.8.1 + '@biomejs/cli-linux-arm64': 1.8.1 + '@biomejs/cli-linux-arm64-musl': 1.8.1 + '@biomejs/cli-linux-x64': 1.8.1 + '@biomejs/cli-linux-x64-musl': 1.8.1 + '@biomejs/cli-win32-arm64': 1.8.1 + '@biomejs/cli-win32-x64': 1.8.1 + + '@biomejs/cli-darwin-arm64@1.8.1': optional: true - '@biomejs/cli-darwin-x64@1.8.0': + '@biomejs/cli-darwin-x64@1.8.1': optional: true - '@biomejs/cli-linux-arm64-musl@1.8.0': + '@biomejs/cli-linux-arm64-musl@1.8.1': optional: true - '@biomejs/cli-linux-arm64@1.8.0': + '@biomejs/cli-linux-arm64@1.8.1': optional: true - '@biomejs/cli-linux-x64-musl@1.8.0': + '@biomejs/cli-linux-x64-musl@1.8.1': optional: true - '@biomejs/cli-linux-x64@1.8.0': + '@biomejs/cli-linux-x64@1.8.1': optional: true - '@biomejs/cli-win32-arm64@1.8.0': + '@biomejs/cli-win32-arm64@1.8.1': optional: true - '@biomejs/cli-win32-x64@1.8.0': + '@biomejs/cli-win32-x64@1.8.1': optional: true '@changesets/apply-release-plan@7.0.3': @@ -4313,7 +4485,12 @@ snapshots: dependencies: ajv: 8.16.0 ajv-formats: 2.1.1(ajv@8.16.0) - fast-uri: 2.3.1 + fast-uri: 2.4.0 + + '@fastify/cors@9.0.1': + dependencies: + fastify-plugin: 4.5.1 + mnemonist: 0.39.6 '@fastify/error@3.4.1': {} @@ -4388,6 +4565,11 @@ snapshots: '@jridgewell/set-array@1.2.1': {} + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/trace-mapping@0.3.25': @@ -4715,6 +4897,59 @@ snapshots: dependencies: '@babel/runtime': 7.24.7 + '@rollup/plugin-alias@5.1.0(rollup@4.18.0)': + dependencies: + slash: 4.0.0 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-commonjs@26.0.1(rollup@4.18.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 10.4.1 + is-reference: 1.2.1 + magic-string: 0.30.10 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-terser@0.4.4(rollup@4.18.0)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.31.1 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-typescript@11.1.6(rollup@4.18.0)(tslib@2.6.3)(typescript@5.4.5)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + resolve: 1.22.8 + typescript: 5.4.5 + optionalDependencies: + rollup: 4.18.0 + tslib: 2.6.3 + + '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.18.0 + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true @@ -4763,19 +4998,19 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - '@shikijs/core@1.6.3': {} + '@shikijs/core@1.6.4': {} - '@shikijs/transformers@1.6.3': + '@shikijs/transformers@1.6.4': dependencies: - shiki: 1.6.3 + shiki: 1.6.4 '@sinclair/typebox@0.27.8': {} - '@tanstack/query-core@5.40.0': {} + '@tanstack/query-core@5.44.0': {} - '@tanstack/react-query@5.40.1(react@18.3.1)': + '@tanstack/react-query@5.44.0(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.40.0 + '@tanstack/query-core': 5.44.0 react: 18.3.1 '@types/babel__core@7.20.5': @@ -4835,27 +5070,29 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/resolve@1.20.2': {} + '@types/semver@7.5.8': {} '@types/web-bluetooth@0.0.20': {} - '@vitejs/plugin-react@4.3.0(vite@5.2.13(@types/node@20.14.2))': + '@vitejs/plugin-react@4.3.1(vite@5.2.13(@types/node@20.14.2)(terser@5.31.1))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.13(@types/node@20.14.2) + vite: 5.2.13(@types/node@20.14.2)(terser@5.31.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.5(vite@5.2.13(@types/node@20.14.2))(vue@3.4.27(typescript@5.4.5))': + '@vitejs/plugin-vue@5.0.5(vite@5.2.13(@types/node@20.14.2)(terser@5.31.1))(vue@3.4.27(typescript@5.4.5))': dependencies: - vite: 5.2.13(@types/node@20.14.2) + vite: 5.2.13(@types/node@20.14.2)(terser@5.31.1) vue: 3.4.27(typescript@5.4.5) - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.2))': + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.2)(terser@5.31.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -4870,7 +5107,7 @@ snapshots: std-env: 3.7.0 strip-literal: 2.1.0 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.14.2) + vitest: 1.6.0(@types/node@20.14.2)(terser@5.31.1) transitivePeerDependencies: - supports-color @@ -4975,20 +5212,20 @@ snapshots: '@vue/shared@3.4.27': {} - '@vueuse/core@10.10.0(vue@3.4.27(typescript@5.4.5))': + '@vueuse/core@10.10.1(vue@3.4.27(typescript@5.4.5))': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.10.0 - '@vueuse/shared': 10.10.0(vue@3.4.27(typescript@5.4.5)) + '@vueuse/metadata': 10.10.1 + '@vueuse/shared': 10.10.1(vue@3.4.27(typescript@5.4.5)) vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/integrations@10.10.0(focus-trap@7.5.4)(vue@3.4.27(typescript@5.4.5))': + '@vueuse/integrations@10.10.1(focus-trap@7.5.4)(vue@3.4.27(typescript@5.4.5))': dependencies: - '@vueuse/core': 10.10.0(vue@3.4.27(typescript@5.4.5)) - '@vueuse/shared': 10.10.0(vue@3.4.27(typescript@5.4.5)) + '@vueuse/core': 10.10.1(vue@3.4.27(typescript@5.4.5)) + '@vueuse/shared': 10.10.1(vue@3.4.27(typescript@5.4.5)) vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) optionalDependencies: focus-trap: 7.5.4 @@ -4996,9 +5233,9 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/metadata@10.10.0': {} + '@vueuse/metadata@10.10.1': {} - '@vueuse/shared@10.10.0(vue@3.4.27(typescript@5.4.5))': + '@vueuse/shared@10.10.1(vue@3.4.27(typescript@5.4.5))': dependencies: vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) transitivePeerDependencies: @@ -5125,8 +5362,8 @@ snapshots: autoprefixer@10.4.19(postcss@8.4.38): dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001629 + browserslist: 4.23.1 + caniuse-lite: 1.0.30001632 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.1 @@ -5169,18 +5406,22 @@ snapshots: dependencies: wcwidth: 1.0.1 - browserslist@4.23.0: + browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001629 - electron-to-chromium: 1.4.795 + caniuse-lite: 1.0.30001632 + electron-to-chromium: 1.4.798 node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.1) + + buffer-from@1.1.2: {} buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + builtin-modules@3.3.0: {} + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 @@ -5207,7 +5448,7 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001629: {} + caniuse-lite@1.0.30001632: {} chai@4.4.1: dependencies: @@ -5288,8 +5529,12 @@ snapshots: colorette@2.0.20: {} + commander@2.20.3: {} + commander@4.1.1: {} + commondir@1.0.1: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -5326,7 +5571,7 @@ snapshots: dependencies: '@types/node': 20.14.2 cosmiconfig: 9.0.0(typescript@5.4.5) - jiti: 1.21.3 + jiti: 1.21.6 typescript: 5.4.5 cosmiconfig@9.0.0(typescript@5.4.5): @@ -5404,6 +5649,8 @@ snapshots: dependencies: type-detect: 4.0.8 + deepmerge@4.3.1: {} + default-browser-id@5.0.0: {} default-browser@5.2.1: @@ -5453,7 +5700,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.795: {} + electron-to-chromium@1.4.798: {} emoji-regex@8.0.0: {} @@ -5637,7 +5884,7 @@ snapshots: ajv: 8.16.0 ajv-formats: 3.0.1(ajv@8.16.0) fast-deep-equal: 3.1.3 - fast-uri: 2.3.1 + fast-uri: 2.4.0 json-schema-ref-resolver: 1.0.1 rfdc: 1.3.1 @@ -5649,7 +5896,7 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@2.3.1: {} + fast-uri@2.4.0: {} fastify-plugin@4.5.1: {} @@ -5939,6 +6186,10 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + is-callable@1.2.7: {} is-core-module@2.13.1: @@ -5967,6 +6218,8 @@ snapshots: dependencies: is-docker: 3.0.0 + is-module@1.0.0: {} + is-negative-zero@2.0.3: {} is-number-object@1.0.7: @@ -5979,6 +6232,10 @@ snapshots: is-plain-obj@1.1.0: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.5 + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -6051,7 +6308,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.21.3: {} + jiti@1.21.6: {} joycon@3.1.1: {} @@ -6098,7 +6355,7 @@ snapshots: lilconfig@2.1.0: {} - lilconfig@3.1.1: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -6249,6 +6506,10 @@ snapshots: pkg-types: 1.1.1 ufo: 1.5.3 + mnemonist@0.39.6: + dependencies: + obliterator: 2.0.4 + ms@2.1.2: {} mz@2.7.0: @@ -6291,6 +6552,8 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 + obliterator@2.0.4: {} + on-exit-leak-free@2.1.2: {} once@1.4.0: @@ -6458,8 +6721,8 @@ snapshots: postcss-load-config@4.0.2(postcss@8.4.38): dependencies: - lilconfig: 3.1.1 - yaml: 2.4.3 + lilconfig: 3.1.2 + yaml: 2.4.5 optionalDependencies: postcss: 8.4.38 @@ -6522,6 +6785,10 @@ snapshots: quick-lru@4.0.1: {} + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -6642,6 +6909,14 @@ snapshots: dependencies: glob: 10.4.1 + rollup-plugin-dts@6.1.1(rollup@4.18.0)(typescript@5.4.5): + dependencies: + magic-string: 0.30.10 + rollup: 4.18.0 + typescript: 5.4.5 + optionalDependencies: + '@babel/code-frame': 7.24.7 + rollup@4.18.0: dependencies: '@types/estree': 1.0.5 @@ -6707,6 +6982,10 @@ snapshots: semver@7.6.2: {} + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + set-blocking@2.0.0: {} set-cookie-parser@2.6.0: {} @@ -6741,9 +7020,9 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.6.3: + shiki@1.6.4: dependencies: - '@shikijs/core': 1.6.3 + '@shikijs/core': 1.6.4 side-channel@1.0.6: dependencies: @@ -6760,6 +7039,8 @@ snapshots: slash@3.0.0: {} + slash@4.0.0: {} + smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.2 @@ -6769,6 +7050,8 @@ snapshots: wcwidth: 1.0.1 yargs: 15.4.1 + smob@1.5.0: {} + sonic-boom@3.8.1: dependencies: atomic-sleep: 1.0.0 @@ -6779,6 +7062,13 @@ snapshots: source-map-js@1.2.0: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + spawndamnit@2.0.0: dependencies: cross-spawn: 5.1.0 @@ -6911,7 +7201,7 @@ snapshots: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.3 + jiti: 1.21.6 lilconfig: 2.1.0 micromatch: 4.0.7 normalize-path: 3.0.0 @@ -6930,6 +7220,13 @@ snapshots: term-size@2.2.1: {} + terser@5.31.1: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -7068,15 +7365,13 @@ snapshots: undici-types@5.26.5: {} - undici@6.18.2: {} - unicorn-magic@0.1.0: {} universalify@0.1.2: {} - update-browserslist-db@1.0.16(browserslist@4.23.0): + update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.1 @@ -7106,13 +7401,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@1.6.0(@types/node@20.14.2): + vite-node@1.6.0(@types/node@20.14.2)(terser@5.31.1): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.2.13(@types/node@20.14.2) + vite: 5.2.13(@types/node@20.14.2)(terser@5.31.1) transitivePeerDependencies: - '@types/node' - less @@ -7123,7 +7418,7 @@ snapshots: - supports-color - terser - vite@5.2.13(@types/node@20.14.2): + vite@5.2.13(@types/node@20.14.2)(terser@5.31.1): dependencies: esbuild: 0.20.2 postcss: 8.4.38 @@ -7131,24 +7426,25 @@ snapshots: optionalDependencies: '@types/node': 20.14.2 fsevents: 2.3.3 + terser: 5.31.1 - vitepress@1.2.3(@algolia/client-search@4.23.3)(@types/node@20.14.2)(@types/react@18.3.3)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.4.5): + vitepress@1.2.3(@algolia/client-search@4.23.3)(@types/node@20.14.2)(@types/react@18.3.3)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(terser@5.31.1)(typescript@5.4.5): dependencies: '@docsearch/css': 3.6.0 '@docsearch/js': 3.6.0(@algolia/client-search@4.23.3)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0) - '@shikijs/core': 1.6.3 - '@shikijs/transformers': 1.6.3 + '@shikijs/core': 1.6.4 + '@shikijs/transformers': 1.6.4 '@types/markdown-it': 14.1.1 - '@vitejs/plugin-vue': 5.0.5(vite@5.2.13(@types/node@20.14.2))(vue@3.4.27(typescript@5.4.5)) + '@vitejs/plugin-vue': 5.0.5(vite@5.2.13(@types/node@20.14.2)(terser@5.31.1))(vue@3.4.27(typescript@5.4.5)) '@vue/devtools-api': 7.2.1(vue@3.4.27(typescript@5.4.5)) '@vue/shared': 3.4.27 - '@vueuse/core': 10.10.0(vue@3.4.27(typescript@5.4.5)) - '@vueuse/integrations': 10.10.0(focus-trap@7.5.4)(vue@3.4.27(typescript@5.4.5)) + '@vueuse/core': 10.10.1(vue@3.4.27(typescript@5.4.5)) + '@vueuse/integrations': 10.10.1(focus-trap@7.5.4)(vue@3.4.27(typescript@5.4.5)) focus-trap: 7.5.4 mark.js: 8.11.1 minisearch: 6.3.0 - shiki: 1.6.3 - vite: 5.2.13(@types/node@20.14.2) + shiki: 1.6.4 + vite: 5.2.13(@types/node@20.14.2)(terser@5.31.1) vue: 3.4.27(typescript@5.4.5) optionalDependencies: postcss: 8.4.38 @@ -7179,7 +7475,7 @@ snapshots: - typescript - universal-cookie - vitest@1.6.0(@types/node@20.14.2): + vitest@1.6.0(@types/node@20.14.2)(terser@5.31.1): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -7198,8 +7494,8 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.2.13(@types/node@20.14.2) - vite-node: 1.6.0(@types/node@20.14.2) + vite: 5.2.13(@types/node@20.14.2)(terser@5.31.1) + vite-node: 1.6.0(@types/node@20.14.2)(terser@5.31.1) why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 20.14.2 @@ -7294,7 +7590,7 @@ snapshots: yallist@3.1.1: {} - yaml@2.4.3: {} + yaml@2.4.5: {} yargs-parser@18.1.3: dependencies: