From a6c7c862f922054ee0651af739fc038228896476 Mon Sep 17 00:00:00 2001 From: Clement Denis Date: Fri, 3 Apr 2026 17:42:47 +0200 Subject: [PATCH 1/3] WIP --- Dockerfile | 1 + README.md | 21 + api/clickhouse-client.ts | 50 +- api/lib/env.ts | 8 +- api/routes.ts | 27 +- api/server.ts | 2 + compose.yaml | 57 +++ deno.json | 42 +- deno.lock | 909 +++++++++++++++------------------- tasks/clickhouse.ts | 46 -- tasks/vite.ts | 30 +- web/components/BrandIcons.tsx | 20 - web/components/SideBar.tsx | 8 +- web/layout.tsx | 14 +- web/lib/session.ts | 13 + web/pages/DeploymentPage.tsx | 16 +- web/pages/ProjectPage.tsx | 20 +- 17 files changed, 617 insertions(+), 667 deletions(-) create mode 100644 compose.yaml delete mode 100644 tasks/clickhouse.ts delete mode 100644 web/components/BrandIcons.tsx diff --git a/Dockerfile b/Dockerfile index d170cf2..0f8e7d7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,7 @@ COPY ./web /app/web RUN deno cache --allow-scripts --lock=deno.lock api/server.ts tasks/vite.ts # Build frontend (dist/web) and compile backend with static files +ENV BASE_URL="/" RUN deno task prod # Stage 2: Final image diff --git a/README.md b/README.md index 0b30a8e..9ac154f 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,27 @@ deno task docker:prod deno task docker:logs ``` +### Docker Compose + +Use the compose stack when you want ClickHouse and the app started together. +It has inline defaults, so no env file is required. + +```bash +docker compose up --build +``` + +Override any value from your shell or a local `.env` file. Example: + +```bash +PORT=8877 CLICKHOUSE_PASSWORD=strong-password docker compose up --build +``` + +The stack starts: + +- `clickhouse`: database server on ports `8123` and `9000` +- `clickhouse-init`: one-shot schema creation for the `logs` table +- `app`: compiled application on port `3021` + ### Available Tasks ```bash diff --git a/api/clickhouse-client.ts b/api/clickhouse-client.ts index ce044f5..7be74e5 100644 --- a/api/clickhouse-client.ts +++ b/api/clickhouse-client.ts @@ -15,7 +15,7 @@ import { UNION, } from '@01edu/api/validator' -const LogSchema = OBJ({ +export const LogSchema = OBJ({ timestamp: NUM('The timestamp of the log event'), trace_id: NUM('A float64 representation of the trace ID'), span_id: optional(NUM('A float64 representation of the span ID')), @@ -41,7 +41,7 @@ export const LogSchemaOutput = OBJ({ service_instance_id: optional(STR('Service instance ID')), }, 'A log event') -const LogsInputSchema = UNION( +export const LogsInputSchema = UNION( LogSchema, ARR(LogSchema, 'An array of log events'), ) @@ -49,7 +49,7 @@ const LogsInputSchema = UNION( type Log = Asserted type LogsInput = Asserted -const client = createClient({ +export const client = createClient({ url: CLICKHOUSE_HOST, username: CLICKHOUSE_USER, password: CLICKHOUSE_PASSWORD, @@ -79,10 +79,7 @@ const numberToHex128 = (() => { } })() -async function insertLogs( - service_name: string, - data: LogsInput, -) { +export async function insertLogs(service_name: string,data: LogsInput) { const logsToInsert = Array.isArray(data) ? data : [data] if (logsToInsert.length === 0) throw respond.NoContent() @@ -202,7 +199,7 @@ function inferParamType(key: string, value: string): string { return 'String' } -async function getLogs(dep: string, data: FetchTablesParams) { +export async function getLogs(dep: string, data: FetchTablesParams) { const { query, params } = buildLogsQuery(dep, data) try { const rs = await client.query({ @@ -240,4 +237,39 @@ async function getLogs(dep: string, data: FetchTablesParams) { // } // } -export { client, getLogs, insertLogs, LogSchema, LogsInputSchema } +export const initLogTable = async () => { + await client.ping() + await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS logs ( + id UUID DEFAULT generateUUIDv4(), + -- Flattened resource fields + service_name LowCardinality(String), + service_version LowCardinality(String), + service_instance_id String, + + timestamp DateTime64(3, 'UTC') DEFAULT now64(3, 'UTC'), + observed_timestamp DateTime64(3, 'UTC') DEFAULT now64(3, 'UTC'), + trace_id FixedString(16), + span_id FixedString(16), + severity_number UInt8, + -- derived column, computed by DB from severity_number + severity_text LowCardinality(String) MATERIALIZED CASE + WHEN severity_number > 4 AND severity_number <= 8 THEN 'DEBUG' + WHEN severity_number > 8 AND severity_number <= 12 THEN 'INFO' + WHEN severity_number > 12 AND severity_number <= 16 THEN 'WARN' + WHEN severity_number > 20 AND severity_number <= 24 THEN 'FATAL' + ELSE 'ERROR' + END, + -- Often empty, but kept for OTEL spec compliance + body Nullable(String), + attributes JSON, + event_name LowCardinality(String) + ) + ENGINE = MergeTree + PARTITION BY toYYYYMMDD(timestamp) + ORDER BY (service_name, timestamp, trace_id) + SETTINGS index_granularity = 8192, min_bytes_for_wide_part = 0; + `, + }) +} diff --git a/api/lib/env.ts b/api/lib/env.ts index 40f8f07..543fd67 100644 --- a/api/lib/env.ts +++ b/api/lib/env.ts @@ -2,9 +2,9 @@ import { ENV } from '@01edu/api/env' export const PORT = Number(ENV('PORT', '2119')) export const PICTURE_DIR = ENV('PICTURE_DIR', './.picture') -export const GOOGLE_CLIENT_ID = ENV('GOOGLE_CLIENT_ID') -export const CLIENT_SECRET = ENV('CLIENT_SECRET') -export const REDIRECT_URI = ENV('REDIRECT_URI') +export const GOOGLE_CLIENT_ID = ENV('GOOGLE_CLIENT_ID', '') +export const CLIENT_SECRET = ENV('CLIENT_SECRET', '') +export const REDIRECT_URI = ENV('REDIRECT_URI', `http://localhost:${PORT}`) export const ORIGIN = new URL(REDIRECT_URI).origin export const SECRET = ENV( 'SECRET', @@ -23,3 +23,5 @@ export const DB_SCHEMA_REFRESH_MS = Number( export const STORE_URL = ENV('STORE_URL') export const STORE_SECRET = ENV('STORE_SECRET') +const LOCAL_ENV = ENV('LOCAL_ENV', '') +export const isLocal = LOCAL_ENV === 'yes' || LOCAL_ENV == '1' || LOCAL_ENV === 'true' diff --git a/api/routes.ts b/api/routes.ts index 843d516..0608b0c 100644 --- a/api/routes.ts +++ b/api/routes.ts @@ -11,7 +11,7 @@ import { TeamDetailDef, User, UserDef, -} from './schema.ts' +} from '/api/schema.ts' import { ARR, BOOL, @@ -40,14 +40,25 @@ import { updateTableData, } from '/api/sql.ts' import { Log } from '@01edu/api/log' -import { get, getOne } from './lmdb-store.ts' +import { get, getOne } from '/api/lmdb-store.ts' +import { isLocal } from '/api/lib/env.ts' -const withUserSession = async ({ cookies }: RequestContext) => { - const session = await decodeSession(cookies.session) - if (!session) throw Error('Missing user session') - const admin = AdminsCollection.get(session.id) - return { ...session, isAdmin: !!admin } -} +const localUser = { + id: 'local', // this id is for local env, it will ignore permissions + email: 'local@admin.dev', + fullName: 'Local Dev', + picture: 'https://www.npmjs.com/npm-avatar/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdmF0YXJVUkwiOiJodHRwczovL3MuZ3JhdmF0YXIuY29tL2F2YXRhci9jMzQ1YzkyNTExNjZjNDVlYmViOWFjZTRiYmY5MjFiOT9zaXplPTQ5NiZkZWZhdWx0PXJldHJvIn0.7mU8AfQy7sYbuGZLwK5ZxkfwxfZnxaLOjDqoh5g4H5g', + isAdmin: true, +} as const + +const withUserSession = isLocal + ? () => localUser + : async ({ cookies }: RequestContext) => { + const session = await decodeSession(cookies.session) + if (!session) throw Error('Missing user session') + const admin = AdminsCollection.get(session.id) + return { ...session, isAdmin: !!admin } + } const withAdminSession = async (ctx: RequestContext) => { const session = await withUserSession(ctx) diff --git a/api/server.ts b/api/server.ts index 3e5500c..ba25598 100644 --- a/api/server.ts +++ b/api/server.ts @@ -5,8 +5,10 @@ import { Log } from '@01edu/api/log' import { routeHandler } from '/api/routes.ts' import { PORT } from './lib/env.ts' import { init } from '/api/lib/functions.ts' +import { initLogTable } from '/api/clickhouse-client.ts' import { startSchemaRefreshLoop } from './sql.ts' +await initLogTable() await init() startSchemaRefreshLoop() diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..b8b6323 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,57 @@ +services: + clickhouse: + image: clickhouse/clickhouse-server:latest + restart: unless-stopped + environment: + CLICKHOUSE_USER: ${CLICKHOUSE_USER:-devtools} + CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-devtools-password} + CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: ${CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT:-1} + ports: + - "8123:8123" + - "9000:9000" + ulimits: + nofile: + soft: 262144 + hard: 262144 + volumes: + - clickhouse-data:/var/lib/clickhouse + healthcheck: + test: + [ + "CMD-SHELL", + "clickhouse-client --host 127.0.0.1 --user \"$${CLICKHOUSE_USER}\" --password \"$${CLICKHOUSE_PASSWORD}\" --query 'SELECT 1' >/dev/null 2>&1", + ] + interval: 5s + timeout: 5s + retries: 20 + start_period: 10s + + app: + build: + context: . + restart: unless-stopped + environment: + APP_ENV: ${APP_ENV:-prod} + PORT: ${PORT:-3021} + PICTURE_DIR: ${PICTURE_DIR:-/app/.picture} + GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-} + CLIENT_SECRET: ${CLIENT_SECRET:-} + REDIRECT_URI: ${REDIRECT_URI:-http://localhost:3021/auth/callback} + SECRET: ${SECRET:-replace-with-a-real-secret} + STORE_URL: ${STORE_URL:-} + STORE_SECRET: ${STORE_SECRET:-} + CLICKHOUSE_HOST: ${CLICKHOUSE_HOST:-http://clickhouse:8123} + CLICKHOUSE_USER: ${CLICKHOUSE_USER:-devtools} + CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-devtools-password} + depends_on: + clickhouse: + condition: service_healthy + ports: + - "${PORT:-3021}:3021" + volumes: + - ./db:/app/db + - app-pictures:/app/.picture + +volumes: + clickhouse-data: + app-pictures: diff --git a/deno.json b/deno.json index b131e1e..872dc4b 100644 --- a/deno.json +++ b/deno.json @@ -4,7 +4,6 @@ "check": "deno check", "dev": { "dependencies": ["dev:clickhouse", "dev:api", "dev:vite"] }, "dev:api": "deno serve --port 3021 -A --env-file=.env.dev api/server.ts", - "dev:clickhouse": "deno run -A --env-file=.env.dev tasks/clickhouse.ts", "dev:env": "deno run -A tasks/env.ts", "dev:vite": "deno run -A --env-file=.env.dev tasks/vite.ts", "dev:with-seed": "deno task seed && deno task dev", @@ -21,7 +20,6 @@ "lint": "deno lint", "prod": "deno task prod:vite && deno task prod:api", "prod:api": "deno compile -A --no-check --output dist/api --target x86_64-unknown-linux-gnu --include dist/web api/server.ts --env=prod", - "prod:clickhouse": "APP_ENV=prod deno run -A --env-file tasks/clickhouse.ts", "prod:start": "deno task clickhouse:prod && dist/api", "prod:vite": "APP_ENV=prod deno run -A tasks/vite.ts", "review": "deno run -A https://gistcdn.githack.com/kigiri/7658b4af30bb5eaca3e4cad1fcac7b0c/raw/review.js", @@ -31,29 +29,29 @@ "imports": { "./": "./", "/": "./", - "@01edu/api": "jsr:@01edu/api@^0.1.3", - "@01edu/api-client": "jsr:@01edu/api-client@^0.1.3", - "@01edu/api-proxy": "jsr:@01edu/api-proxy@^0.1.2", - "@01edu/signal-router": "jsr:@01edu/signal-router@^0.1.6", + "@01edu/api": "jsr:@01edu/api@^0.2.3", + "@01edu/api-client": "jsr:@01edu/api-client@^0.2.3", + "@01edu/api-proxy": "jsr:@01edu/api-proxy@^0.2.1", + "@01edu/signal-router": "jsr:@01edu/signal-router@^0.2.1", "@01edu/time": "jsr:@01edu/time@^0.1.0", - "@deno/vite-plugin": "npm:@deno/vite-plugin@^1.0.5", - "@std/assert": "jsr:@std/assert@^1.0.16", + "@deno/vite-plugin": "npm:@deno/vite-plugin@^2.0.2", + "@std/assert": "jsr:@std/assert@^1.0.19", "@std/crypto": "jsr:@std/crypto@^1.0.5", "@std/encoding": "jsr:@std/encoding@^1.0.10", - "@std/fmt": "jsr:@std/fmt@^1.0.8", - "@std/fs": "jsr:@std/fs@^1.0.20", - "@std/http": "jsr:@std/http@^1.0.22", - "@std/path": "jsr:@std/path@^1.1.3", - "@std/testing": "jsr:@std/testing@^1.0.16", - "vite": "npm:vite@^7.3.0", - "preact": "npm:preact@^10.28.0", - "@preact/preset-vite": "npm:@preact/preset-vite@^2.10.2", - "@preact/signals": "npm:@preact/signals@^2.5.1", - "@clickhouse/client": "npm:@clickhouse/client@^1.14.0", - "@tailwindcss/vite": "npm:@tailwindcss/vite@^4.1.17", - "tailwindcss": "npm:tailwindcss@^4.1.17", - "daisyui": "npm:daisyui@^5.5.8", - "lucide-preact": "npm:lucide-preact@^0.525.0" + "@std/fmt": "jsr:@std/fmt@^1.0.9", + "@std/fs": "jsr:@std/fs@^1.0.23", + "@std/http": "jsr:@std/http@^1.0.25", + "@std/path": "jsr:@std/path@^1.1.4", + "@std/testing": "jsr:@std/testing@^1.0.17", + "vite": "npm:vite@^8.0.3", + "preact": "npm:preact@^10.29.0", + "@preact/preset-vite": "npm:@preact/preset-vite@^2.10.5", + "@preact/signals": "npm:@preact/signals@^2.9.0", + "@clickhouse/client": "npm:@clickhouse/client@^1.18.2", + "@tailwindcss/vite": "npm:@tailwindcss/vite@^4.2.2", + "tailwindcss": "npm:tailwindcss@^4.2.2", + "daisyui": "npm:daisyui@^5.5.19", + "lucide-preact": "npm:lucide-preact@^1.7.0" }, "fmt": { "useTabs": false, diff --git a/deno.lock b/deno.lock index f179502..44a510f 100644 --- a/deno.lock +++ b/deno.lock @@ -1,125 +1,148 @@ { "version": "5", "specifiers": { - "jsr:@01edu/api-client@~0.1.3": "0.1.3", - "jsr:@01edu/api-proxy@~0.1.2": "0.1.2", - "jsr:@01edu/api@~0.1.3": "0.1.3", - "jsr:@01edu/signal-router@~0.1.6": "0.1.6", + "jsr:@01edu/api-client@~0.2.3": "0.2.3", + "jsr:@01edu/api-proxy@~0.2.1": "0.2.1", + "jsr:@01edu/api@~0.2.3": "0.2.3", + "jsr:@01edu/signal-router@~0.2.1": "0.2.1", "jsr:@01edu/time@0.1": "0.1.0", - "jsr:@01edu/types@~0.1.2": "0.1.2", - "jsr:@std/assert@^1.0.15": "1.0.16", - "jsr:@std/assert@^1.0.16": "1.0.16", - "jsr:@std/async@^1.0.15": "1.0.15", - "jsr:@std/cli@^1.0.24": "1.0.24", + "jsr:@01edu/types@~0.2.3": "0.2.3", + "jsr:@cd/sqlite@~0.13.1": "0.13.1", + "jsr:@denosaurs/plug@1": "1.1.0", + "jsr:@std/assert@^1.0.17": "1.0.19", + "jsr:@std/assert@^1.0.19": "1.0.19", + "jsr:@std/async@^1.1.0": "1.2.0", + "jsr:@std/cli@^1.0.28": "1.0.28", "jsr:@std/crypto@^1.0.5": "1.0.5", - "jsr:@std/data-structures@^1.0.9": "1.0.9", + "jsr:@std/data-structures@^1.0.10": "1.0.10", + "jsr:@std/encoding@1": "1.0.10", "jsr:@std/encoding@^1.0.10": "1.0.10", - "jsr:@std/fmt@^1.0.8": "1.0.8", - "jsr:@std/fs@^1.0.19": "1.0.20", - "jsr:@std/fs@^1.0.20": "1.0.20", + "jsr:@std/fmt@1": "1.0.9", + "jsr:@std/fmt@^1.0.9": "1.0.9", + "jsr:@std/fs@1": "1.0.23", + "jsr:@std/fs@^1.0.22": "1.0.23", + "jsr:@std/fs@^1.0.23": "1.0.23", "jsr:@std/html@^1.0.5": "1.0.5", - "jsr:@std/http@^1.0.22": "1.0.22", + "jsr:@std/http@^1.0.25": "1.0.25", "jsr:@std/internal@^1.0.12": "1.0.12", "jsr:@std/media-types@^1.1.0": "1.1.0", "jsr:@std/net@^1.0.6": "1.0.6", - "jsr:@std/path@^1.1.2": "1.1.3", - "jsr:@std/path@^1.1.3": "1.1.3", - "jsr:@std/streams@^1.0.14": "1.0.14", - "jsr:@std/testing@^1.0.16": "1.0.16", - "npm:@clickhouse/client@^1.14.0": "1.15.0", - "npm:@deno/vite-plugin@^1.0.5": "1.0.5_vite@7.3.0__picomatch@4.0.3", - "npm:@preact/preset-vite@^2.10.2": "2.10.2_@babel+core@7.28.5_vite@7.3.0__picomatch@4.0.3_preact@10.28.0", - "npm:@preact/signals@^2.5.1": "2.5.1_preact@10.28.0", - "npm:@tailwindcss/vite@^4.1.17": "4.1.18_vite@7.3.0__picomatch@4.0.3", - "npm:daisyui@^5.5.8": "5.5.14", - "npm:lucide-preact@0.525": "0.525.0_preact@10.28.0", - "npm:preact@^10.27.2": "10.28.0", - "npm:preact@^10.28.0": "10.28.0", - "npm:tailwindcss@^4.1.17": "4.1.18", - "npm:vite@^7.2.4": "7.3.0_picomatch@4.0.3", - "npm:vite@^7.3.0": "7.3.0_picomatch@4.0.3" + "jsr:@std/path@1": "1.1.4", + "jsr:@std/path@1.0": "1.0.9", + "jsr:@std/path@^1.1.4": "1.1.4", + "jsr:@std/streams@^1.0.17": "1.0.17", + "jsr:@std/testing@^1.0.17": "1.0.17", + "npm:@clickhouse/client@^1.18.2": "1.18.2", + "npm:@deno/vite-plugin@^2.0.2": "2.0.2_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1", + "npm:@preact/preset-vite@^2.10.5": "2.10.5_@babel+core@7.29.0_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_preact@10.29.0", + "npm:@preact/signals@^2.9.0": "2.9.0_preact@10.29.0", + "npm:@tailwindcss/vite@^4.2.2": "4.2.2_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1", + "npm:daisyui@^5.5.19": "5.5.19", + "npm:lucide-preact@^1.7.0": "1.7.0_preact@10.29.0", + "npm:preact@^10.29.0": "10.29.0", + "npm:tailwindcss@^4.2.2": "4.2.2", + "npm:vite@^8.0.3": "8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1" }, "jsr": { - "@01edu/api@0.1.3": { - "integrity": "fcb88766e2772c6f6e5c2b9d7ede5460f532f9398c4c20f466c6d1f667d2a0d1", + "@01edu/api@0.2.3": { + "integrity": "bdd84e35381886c1a001c1d1cc7148e133ca52f8238de07801e47d7eabfdd8a7", "dependencies": [ "jsr:@01edu/time", "jsr:@01edu/types", - "jsr:@std/fmt", + "jsr:@std/fmt@^1.0.9", "jsr:@std/http" ] }, - "@01edu/api-client@0.1.3": { - "integrity": "292c41437b7b77aa0b0c128a152e1b09434f45d84e8f252b5f8ce088c07f01b4", + "@01edu/api-client@0.2.3": { + "integrity": "6a561be260a6babd5c689c2a1ae62eaa9c407009cbebe73482ba92b1ce44cef5", "dependencies": [ "jsr:@01edu/types", "npm:@preact/signals" ] }, - "@01edu/api-proxy@0.1.2": { - "integrity": "1fa3fbd790dfd435893d3b3554f509749411ef342f3b62515a78cdd83a09b80e", + "@01edu/api-proxy@0.2.1": { + "integrity": "ea188b029a324c920c22dfe52f6cd389fcd3764124dc405874cdfc9f4d78f271", "dependencies": [ - "npm:vite@^7.2.4" + "npm:vite" ] }, - "@01edu/signal-router@0.1.6": { - "integrity": "816485c671b21472da571f692731901a15ed77725ac9dfffdcee1dba0d736c22", + "@01edu/signal-router@0.2.1": { + "integrity": "ee444d4f4672ba9ec6b67f827da60b092746053bebf6b43f2dee08bce1f0dde4", "dependencies": [ "npm:@preact/signals", - "npm:preact@^10.27.2" + "npm:preact" ] }, "@01edu/time@0.1.0": { "integrity": "638ea7d2d00bfbf487e5262b4d6207de7f2101793d0d27a63d492e113a07dcb2" }, - "@01edu/types@0.1.2": { - "integrity": "58c6925af51586a33bb8a42a2c191c760044aec7f85fb00e8824781176d7b6e2" + "@01edu/types@0.2.3": { + "integrity": "49880a688add4d786cb90a41822066ab8c41499ba746cb80356c61a3e485dac6", + "dependencies": [ + "jsr:@cd/sqlite" + ] + }, + "@cd/sqlite@0.13.1": { + "integrity": "b1399921167e28857f15ad2728759d83b28471d6571a4a9ef8cb434fa0a8a9fe", + "dependencies": [ + "jsr:@denosaurs/plug", + "jsr:@std/path@1.0" + ] }, - "@std/assert@1.0.16": { - "integrity": "6a7272ed1eaa77defe76e5ff63ca705d9c495077e2d5fd0126d2b53fc5bd6532", + "@denosaurs/plug@1.1.0": { + "integrity": "eb2f0b7546c7bca2000d8b0282c54d50d91cf6d75cb26a80df25a6de8c4bc044", + "dependencies": [ + "jsr:@std/encoding@1", + "jsr:@std/fmt@1", + "jsr:@std/fs@1", + "jsr:@std/path@1" + ] + }, + "@std/assert@1.0.19": { + "integrity": "eaada96ee120cb980bc47e040f82814d786fe8162ecc53c91d8df60b8755991e", "dependencies": [ "jsr:@std/internal" ] }, - "@std/async@1.0.15": { - "integrity": "55d1d9d04f99403fe5730ab16bdcc3c47f658a6bf054cafb38a50f046238116e" + "@std/async@1.2.0": { + "integrity": "c059c6f6d95ca7cc012ae8e8d7164d1697113d54b0b679e4372b354b11c2dee5" }, - "@std/cli@1.0.24": { - "integrity": "b655a5beb26aa94f98add6bc8889f5fb9bc3ee2cc3fc954e151201f4c4200a5e" + "@std/cli@1.0.28": { + "integrity": "74ef9b976db59ca6b23a5283469c9072be6276853807a83ec6c7ce412135c70a" }, "@std/crypto@1.0.5": { "integrity": "0dcfbb319fe0bba1bd3af904ceb4f948cde1b92979ec1614528380ed308a3b40" }, - "@std/data-structures@1.0.9": { - "integrity": "033d6e17e64bf1f84a614e647c1b015fa2576ae3312305821e1a4cb20674bb4d" + "@std/data-structures@1.0.10": { + "integrity": "f574f86b0e07c69b9edc555fcc814b57d29258bad39fd5a34ba8a80ecf033cfe" }, "@std/encoding@1.0.10": { "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" }, - "@std/fmt@1.0.8": { - "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" + "@std/fmt@1.0.9": { + "integrity": "2487343e8899fb2be5d0e3d35013e54477ada198854e52dd05ed0422eddcabe0" }, - "@std/fs@1.0.20": { - "integrity": "e953206aae48d46ee65e8783ded459f23bec7dd1f3879512911c35e5484ea187", + "@std/fs@1.0.23": { + "integrity": "3ecbae4ce4fee03b180fa710caff36bb5adb66631c46a6460aaad49515565a37", "dependencies": [ "jsr:@std/internal", - "jsr:@std/path@^1.1.3" + "jsr:@std/path@^1.1.4" ] }, "@std/html@1.0.5": { "integrity": "4e2d693f474cae8c16a920fa5e15a3b72267b94b84667f11a50c6dd1cb18d35e" }, - "@std/http@1.0.22": { - "integrity": "53f0bb70e23a2eec3e17c4240a85bb23d185b2e20635adb37ce0f03cc4ca012a", + "@std/http@1.0.25": { + "integrity": "577b4252290af1097132812b339fffdd55fb0f4aeb98ff11bdbf67998aa17193", "dependencies": [ "jsr:@std/cli", - "jsr:@std/encoding", - "jsr:@std/fmt", - "jsr:@std/fs@^1.0.20", + "jsr:@std/encoding@^1.0.10", + "jsr:@std/fmt@^1.0.9", + "jsr:@std/fs@^1.0.23", "jsr:@std/html", "jsr:@std/media-types", "jsr:@std/net", - "jsr:@std/path@^1.1.3", + "jsr:@std/path@^1.1.4", "jsr:@std/streams" ] }, @@ -132,41 +155,44 @@ "@std/net@1.0.6": { "integrity": "110735f93e95bb9feb95790a8b1d1bf69ec0dc74f3f97a00a76ea5efea25500c" }, - "@std/path@1.1.3": { - "integrity": "b015962d82a5e6daea980c32b82d2c40142149639968549c649031a230b1afb3", + "@std/path@1.0.9": { + "integrity": "260a49f11edd3db93dd38350bf9cd1b4d1366afa98e81b86167b4e3dd750129e" + }, + "@std/path@1.1.4": { + "integrity": "1d2d43f39efb1b42f0b1882a25486647cb851481862dc7313390b2bb044314b5", "dependencies": [ "jsr:@std/internal" ] }, - "@std/streams@1.0.14": { - "integrity": "c0df6cdd73bd4bbcbe4baa89e323b88418c90ceb2d926f95aa99bdcdbfca2411" + "@std/streams@1.0.17": { + "integrity": "7859f3d9deed83cf4b41f19223d4a67661b3d3819e9fc117698f493bf5992140" }, - "@std/testing@1.0.16": { - "integrity": "a917ffdeb5924c9be436dc78bc32e511760e14d3a96e49c607fc5ecca86d0092", + "@std/testing@1.0.17": { + "integrity": "87bdc2700fa98249d48a17cd72413352d3d3680dcfbdb64947fd0982d6bbf681", "dependencies": [ - "jsr:@std/assert@^1.0.15", + "jsr:@std/assert@^1.0.17", "jsr:@std/async", "jsr:@std/data-structures", - "jsr:@std/fs@^1.0.19", + "jsr:@std/fs@^1.0.22", "jsr:@std/internal", - "jsr:@std/path@^1.1.2" + "jsr:@std/path@^1.1.4" ] } }, "npm": { - "@babel/code-frame@7.27.1": { - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "@babel/code-frame@7.29.0": { + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dependencies": [ "@babel/helper-validator-identifier", "js-tokens", "picocolors" ] }, - "@babel/compat-data@7.28.5": { - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" + "@babel/compat-data@7.29.0": { + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==" }, - "@babel/core@7.28.5": { - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "@babel/core@7.29.0": { + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dependencies": [ "@babel/code-frame", "@babel/generator", @@ -185,8 +211,8 @@ "semver" ] }, - "@babel/generator@7.28.5": { - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "@babel/generator@7.29.1": { + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dependencies": [ "@babel/parser", "@babel/types", @@ -201,8 +227,8 @@ "@babel/types" ] }, - "@babel/helper-compilation-targets@7.27.2": { - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "@babel/helper-compilation-targets@7.28.6": { + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dependencies": [ "@babel/compat-data", "@babel/helper-validator-option", @@ -214,15 +240,15 @@ "@babel/helper-globals@7.28.0": { "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" }, - "@babel/helper-module-imports@7.27.1": { - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "@babel/helper-module-imports@7.28.6": { + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dependencies": [ "@babel/traverse", "@babel/types" ] }, - "@babel/helper-module-transforms@7.28.3_@babel+core@7.28.5": { - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "@babel/helper-module-transforms@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dependencies": [ "@babel/core", "@babel/helper-module-imports", @@ -230,8 +256,8 @@ "@babel/traverse" ] }, - "@babel/helper-plugin-utils@7.27.1": { - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" + "@babel/helper-plugin-utils@7.28.6": { + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==" }, "@babel/helper-string-parser@7.27.1": { "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" @@ -242,36 +268,36 @@ "@babel/helper-validator-option@7.27.1": { "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" }, - "@babel/helpers@7.28.4": { - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "@babel/helpers@7.29.2": { + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dependencies": [ "@babel/template", "@babel/types" ] }, - "@babel/parser@7.28.5": { - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "@babel/parser@7.29.2": { + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dependencies": [ "@babel/types" ], "bin": true }, - "@babel/plugin-syntax-jsx@7.27.1_@babel+core@7.28.5": { - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "@babel/plugin-syntax-jsx@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "dependencies": [ "@babel/core", "@babel/helper-plugin-utils" ] }, - "@babel/plugin-transform-react-jsx-development@7.27.1_@babel+core@7.28.5": { + "@babel/plugin-transform-react-jsx-development@7.27.1_@babel+core@7.29.0": { "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "dependencies": [ "@babel/core", "@babel/plugin-transform-react-jsx" ] }, - "@babel/plugin-transform-react-jsx@7.27.1_@babel+core@7.28.5": { - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "@babel/plugin-transform-react-jsx@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "dependencies": [ "@babel/core", "@babel/helper-annotate-as-pure", @@ -281,16 +307,16 @@ "@babel/types" ] }, - "@babel/template@7.27.2": { - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "@babel/template@7.28.6": { + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dependencies": [ "@babel/code-frame", "@babel/parser", "@babel/types" ] }, - "@babel/traverse@7.28.5": { - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "@babel/traverse@7.29.0": { + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dependencies": [ "@babel/code-frame", "@babel/generator", @@ -301,157 +327,48 @@ "debug" ] }, - "@babel/types@7.28.5": { - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "@babel/types@7.29.0": { + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dependencies": [ "@babel/helper-string-parser", "@babel/helper-validator-identifier" ] }, - "@clickhouse/client-common@1.15.0": { - "integrity": "sha512-/1BXaNNsBzH2w5ALWiH6M9zS+cJwlM9uMnMj9e8ETwvDjJzO+nIYlyxzp8Prc+9pEDZ5iAilZ4F8c0YVCzzNaA==" + "@clickhouse/client-common@1.18.2": { + "integrity": "sha512-J0SG6q9V31ydxonglpj9xhNRsUxCsF71iEZ784yldqMYwsHixj/9xHFDgBDX3DuMiDx/kPDfXnf+pimp08wIBA==" }, - "@clickhouse/client@1.15.0": { - "integrity": "sha512-QmW+p4c/r0oa3X6Un6lcBs4GZtJEQUdvf//x8GeqM5ru6m4oIUg3WwvermP3HE31kpEGoFOQfKbMN5ooR5gvNw==", + "@clickhouse/client@1.18.2": { + "integrity": "sha512-fuquQswRSHWM6D079ZeuGqkMOsqtcUPL06UdTnowmoeeYjVrqisfVmvnw8pc3OeKS4kVb91oygb/MfLDiMs0TQ==", "dependencies": [ "@clickhouse/client-common" ] }, - "@deno/vite-plugin@1.0.5_vite@7.3.0__picomatch@4.0.3": { - "integrity": "sha512-tLja5n4dyMhcze1NzvSs2iiriBymfBlDCZIrjMTxb9O2ru0gvmV6mn5oBD2teNw5Sd92cj3YJzKwsAs8tMJXlg==", + "@deno/vite-plugin@2.0.2_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-bzuKApn9Jr2x1jSrbuJEJzy++8LUwjFVOAopAbepcE3RgYzdcPEWd36PSp7P5dNMQlNnQlgtm3MeNbcKZ/Eh/Q==", "dependencies": [ + "@deno/loader@npm:@jsr/deno__loader@0.5.0", + "@std/jsonc@npm:@jsr/std__jsonc@1.0.2", "vite" ] }, - "@esbuild/aix-ppc64@0.27.2": { - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "os": ["aix"], - "cpu": ["ppc64"] - }, - "@esbuild/android-arm64@0.27.2": { - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "os": ["android"], - "cpu": ["arm64"] - }, - "@esbuild/android-arm@0.27.2": { - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "os": ["android"], - "cpu": ["arm"] - }, - "@esbuild/android-x64@0.27.2": { - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "os": ["android"], - "cpu": ["x64"] - }, - "@esbuild/darwin-arm64@0.27.2": { - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "os": ["darwin"], - "cpu": ["arm64"] - }, - "@esbuild/darwin-x64@0.27.2": { - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "os": ["darwin"], - "cpu": ["x64"] - }, - "@esbuild/freebsd-arm64@0.27.2": { - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "os": ["freebsd"], - "cpu": ["arm64"] - }, - "@esbuild/freebsd-x64@0.27.2": { - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "os": ["freebsd"], - "cpu": ["x64"] - }, - "@esbuild/linux-arm64@0.27.2": { - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@esbuild/linux-arm@0.27.2": { - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@esbuild/linux-ia32@0.27.2": { - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", - "os": ["linux"], - "cpu": ["ia32"] - }, - "@esbuild/linux-loong64@0.27.2": { - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", - "os": ["linux"], - "cpu": ["loong64"] - }, - "@esbuild/linux-mips64el@0.27.2": { - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", - "os": ["linux"], - "cpu": ["mips64el"] - }, - "@esbuild/linux-ppc64@0.27.2": { - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", - "os": ["linux"], - "cpu": ["ppc64"] - }, - "@esbuild/linux-riscv64@0.27.2": { - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@esbuild/linux-s390x@0.27.2": { - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", - "os": ["linux"], - "cpu": ["s390x"] - }, - "@esbuild/linux-x64@0.27.2": { - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@esbuild/netbsd-arm64@0.27.2": { - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", - "os": ["netbsd"], - "cpu": ["arm64"] - }, - "@esbuild/netbsd-x64@0.27.2": { - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", - "os": ["netbsd"], - "cpu": ["x64"] - }, - "@esbuild/openbsd-arm64@0.27.2": { - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "os": ["openbsd"], - "cpu": ["arm64"] - }, - "@esbuild/openbsd-x64@0.27.2": { - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "os": ["openbsd"], - "cpu": ["x64"] - }, - "@esbuild/openharmony-arm64@0.27.2": { - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "os": ["openharmony"], - "cpu": ["arm64"] - }, - "@esbuild/sunos-x64@0.27.2": { - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "os": ["sunos"], - "cpu": ["x64"] - }, - "@esbuild/win32-arm64@0.27.2": { - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "os": ["win32"], - "cpu": ["arm64"] + "@emnapi/core@1.9.1": { + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dependencies": [ + "@emnapi/wasi-threads", + "tslib" + ] }, - "@esbuild/win32-ia32@0.27.2": { - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "os": ["win32"], - "cpu": ["ia32"] + "@emnapi/runtime@1.9.1": { + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dependencies": [ + "tslib" + ] }, - "@esbuild/win32-x64@0.27.2": { - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "os": ["win32"], - "cpu": ["x64"] + "@emnapi/wasi-threads@1.2.0": { + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dependencies": [ + "tslib" + ] }, "@jridgewell/gen-mapping@0.3.13": { "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", @@ -480,35 +397,77 @@ "@jridgewell/sourcemap-codec" ] }, - "@preact/preset-vite@2.10.2_@babel+core@7.28.5_vite@7.3.0__picomatch@4.0.3_preact@10.28.0": { - "integrity": "sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==", + "@jsr/deno__loader@0.5.0": { + "integrity": "sha512-sf/YBwnyAsbyeYYB71Zdj2Ca2Q9tt25EZpAiZdDA9W7Mm3GcpjA2WMeqj19xPIurZK12G3OAsa5yrtPB7E+gvA==", + "tarball": "https://npm.jsr.io/~/11/@jsr/deno__loader/0.5.0.tgz" + }, + "@jsr/std__bytes@1.0.6": { + "integrity": "sha512-St6yKggjFGhxS52IFLJWvkchRFbAKg2Xh8UxA4S1EGz7GJ2Ui+ssDDldj/w2c8vCxvl6qgR0HaYbKeFJNqujmA==", + "tarball": "https://npm.jsr.io/~/11/@jsr/std__bytes/1.0.6.tgz" + }, + "@jsr/std__json@1.0.3": { + "integrity": "sha512-hxHx1j4Wd4une+SHlpsSchKIPwtmP4naETNaQYqqY2iBawZPkcR7oiZBFwKcdhzjUWqMw5wV6ryZSI4d4YNzbQ==", + "dependencies": [ + "@jsr/std__streams" + ], + "tarball": "https://npm.jsr.io/~/11/@jsr/std__json/1.0.3.tgz" + }, + "@jsr/std__jsonc@1.0.2": { + "integrity": "sha512-Lva9lY0UPvvgmS8INUHU8Tqijq2SPfdlnSAvofOYUBiB6ALPxo0rTMznRlY5Wt30nMW+rhMTha1x5RGpMBKUoQ==", + "dependencies": [ + "@jsr/std__json" + ], + "tarball": "https://npm.jsr.io/~/11/@jsr/std__jsonc/1.0.2.tgz" + }, + "@jsr/std__streams@1.0.17": { + "integrity": "sha512-LnPlWk20mDIV5/nqoUomAB8umOimfGEyWRApxLgekXFuqKGDsGpUAi58amieVU2XAGNclmUOtQOcQ/qOl3PNFg==", + "dependencies": [ + "@jsr/std__bytes" + ], + "tarball": "https://npm.jsr.io/~/11/@jsr/std__streams/1.0.17.tgz" + }, + "@napi-rs/wasm-runtime@1.1.2_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "dependencies": [ + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util" + ] + }, + "@oxc-project/types@0.122.0": { + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==" + }, + "@preact/preset-vite@2.10.5_@babel+core@7.29.0_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_preact@10.29.0": { + "integrity": "sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==", "dependencies": [ "@babel/core", "@babel/plugin-transform-react-jsx", "@babel/plugin-transform-react-jsx-development", "@prefresh/vite", - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0", "babel-plugin-transform-hook-names", "debug", + "magic-string", "picocolors", "vite", - "vite-prerender-plugin" + "vite-prerender-plugin", + "zimmerframe" ] }, - "@preact/signals-core@1.12.1": { - "integrity": "sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==" + "@preact/signals-core@1.14.1": { + "integrity": "sha512-vxPpfXqrwUe9lpjqfYNjAF/0RF/eFGeLgdJzdmIIZjpOnTmGmAB4BjWone562mJGMRP4frU6iZ6ei3PDsu52Ng==" }, - "@preact/signals@2.5.1_preact@10.28.0": { - "integrity": "sha512-VPjk5YFt7i11Fi4UK0tzaEe5xLwfhUxXL3l89ocxQ5aPz7bRo8M5+N73LjBMPklyXKYKz6YsNo4Smp8n6nplng==", + "@preact/signals@2.9.0_preact@10.29.0": { + "integrity": "sha512-hYrY0KyUqkDgOl1qba/JGn6y81pXnurn21PMaxfcMwdncdZ3M/oVdmpTvEnsGjh48dIwDVc7bjWHqIsngSjYug==", "dependencies": [ "@preact/signals-core", "preact" ] }, - "@prefresh/babel-plugin@0.5.2": { - "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==" + "@prefresh/babel-plugin@0.5.3": { + "integrity": "sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==" }, - "@prefresh/core@1.5.9_preact@10.28.0": { + "@prefresh/core@1.5.9_preact@10.29.0": { "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", "dependencies": [ "preact" @@ -517,137 +476,115 @@ "@prefresh/utils@1.2.1": { "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==" }, - "@prefresh/vite@2.4.11_preact@10.28.0_vite@7.3.0__picomatch@4.0.3": { - "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", + "@prefresh/vite@2.4.12_preact@10.29.0_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==", "dependencies": [ "@babel/core", "@prefresh/babel-plugin", "@prefresh/core", "@prefresh/utils", - "@rollup/pluginutils", + "@rollup/pluginutils@4.2.1", "preact", "vite" ] }, - "@rollup/pluginutils@4.2.1": { - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dependencies": [ - "estree-walker", - "picomatch@2.3.1" - ] - }, - "@rollup/rollup-android-arm-eabi@4.53.5": { - "integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==", - "os": ["android"], - "cpu": ["arm"] - }, - "@rollup/rollup-android-arm64@4.53.5": { - "integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==", + "@rolldown/binding-android-arm64@1.0.0-rc.12": { + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", "os": ["android"], "cpu": ["arm64"] }, - "@rollup/rollup-darwin-arm64@4.53.5": { - "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", + "@rolldown/binding-darwin-arm64@1.0.0-rc.12": { + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", "os": ["darwin"], "cpu": ["arm64"] }, - "@rollup/rollup-darwin-x64@4.53.5": { - "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", + "@rolldown/binding-darwin-x64@1.0.0-rc.12": { + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", "os": ["darwin"], "cpu": ["x64"] }, - "@rollup/rollup-freebsd-arm64@4.53.5": { - "integrity": "sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==", - "os": ["freebsd"], - "cpu": ["arm64"] - }, - "@rollup/rollup-freebsd-x64@4.53.5": { - "integrity": "sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==", + "@rolldown/binding-freebsd-x64@1.0.0-rc.12": { + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", "os": ["freebsd"], "cpu": ["x64"] }, - "@rollup/rollup-linux-arm-gnueabihf@4.53.5": { - "integrity": "sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==", + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12": { + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", "os": ["linux"], "cpu": ["arm"] }, - "@rollup/rollup-linux-arm-musleabihf@4.53.5": { - "integrity": "sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@rollup/rollup-linux-arm64-gnu@4.53.5": { - "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", + "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12": { + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", "os": ["linux"], "cpu": ["arm64"] }, - "@rollup/rollup-linux-arm64-musl@4.53.5": { - "integrity": "sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==", + "@rolldown/binding-linux-arm64-musl@1.0.0-rc.12": { + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", "os": ["linux"], "cpu": ["arm64"] }, - "@rollup/rollup-linux-loong64-gnu@4.53.5": { - "integrity": "sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==", - "os": ["linux"], - "cpu": ["loong64"] - }, - "@rollup/rollup-linux-ppc64-gnu@4.53.5": { - "integrity": "sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==", + "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12": { + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", "os": ["linux"], "cpu": ["ppc64"] }, - "@rollup/rollup-linux-riscv64-gnu@4.53.5": { - "integrity": "sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@rollup/rollup-linux-riscv64-musl@4.53.5": { - "integrity": "sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@rollup/rollup-linux-s390x-gnu@4.53.5": { - "integrity": "sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==", + "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12": { + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", "os": ["linux"], "cpu": ["s390x"] }, - "@rollup/rollup-linux-x64-gnu@4.53.5": { - "integrity": "sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==", + "@rolldown/binding-linux-x64-gnu@1.0.0-rc.12": { + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", "os": ["linux"], "cpu": ["x64"] }, - "@rollup/rollup-linux-x64-musl@4.53.5": { - "integrity": "sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==", + "@rolldown/binding-linux-x64-musl@1.0.0-rc.12": { + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", "os": ["linux"], "cpu": ["x64"] }, - "@rollup/rollup-openharmony-arm64@4.53.5": { - "integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==", + "@rolldown/binding-openharmony-arm64@1.0.0-rc.12": { + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", "os": ["openharmony"], "cpu": ["arm64"] }, - "@rollup/rollup-win32-arm64-msvc@4.53.5": { - "integrity": "sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==", - "os": ["win32"], - "cpu": ["arm64"] + "@rolldown/binding-wasm32-wasi@1.0.0-rc.12_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "dependencies": [ + "@napi-rs/wasm-runtime" + ], + "cpu": ["wasm32"] }, - "@rollup/rollup-win32-ia32-msvc@4.53.5": { - "integrity": "sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==", + "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12": { + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", "os": ["win32"], - "cpu": ["ia32"] + "cpu": ["arm64"] }, - "@rollup/rollup-win32-x64-gnu@4.53.5": { - "integrity": "sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==", + "@rolldown/binding-win32-x64-msvc@1.0.0-rc.12": { + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", "os": ["win32"], "cpu": ["x64"] }, - "@rollup/rollup-win32-x64-msvc@4.53.5": { - "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", - "os": ["win32"], - "cpu": ["x64"] + "@rolldown/pluginutils@1.0.0-rc.12": { + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==" + }, + "@rollup/pluginutils@4.2.1": { + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dependencies": [ + "estree-walker", + "picomatch@2.3.2" + ] + }, + "@rollup/pluginutils@5.3.0": { + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dependencies": [ + "@types/estree", + "estree-walker", + "picomatch@4.0.4" + ] }, - "@tailwindcss/node@4.1.18": { - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "@tailwindcss/node@4.2.2": { + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", "dependencies": [ "@jridgewell/remapping", "enhanced-resolve", @@ -658,67 +595,67 @@ "tailwindcss" ] }, - "@tailwindcss/oxide-android-arm64@4.1.18": { - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "@tailwindcss/oxide-android-arm64@4.2.2": { + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", "os": ["android"], "cpu": ["arm64"] }, - "@tailwindcss/oxide-darwin-arm64@4.1.18": { - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "@tailwindcss/oxide-darwin-arm64@4.2.2": { + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", "os": ["darwin"], "cpu": ["arm64"] }, - "@tailwindcss/oxide-darwin-x64@4.1.18": { - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "@tailwindcss/oxide-darwin-x64@4.2.2": { + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", "os": ["darwin"], "cpu": ["x64"] }, - "@tailwindcss/oxide-freebsd-x64@4.1.18": { - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "@tailwindcss/oxide-freebsd-x64@4.2.2": { + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", "os": ["freebsd"], "cpu": ["x64"] }, - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18": { - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2": { + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", "os": ["linux"], "cpu": ["arm"] }, - "@tailwindcss/oxide-linux-arm64-gnu@4.1.18": { - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "@tailwindcss/oxide-linux-arm64-gnu@4.2.2": { + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", "os": ["linux"], "cpu": ["arm64"] }, - "@tailwindcss/oxide-linux-arm64-musl@4.1.18": { - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "@tailwindcss/oxide-linux-arm64-musl@4.2.2": { + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", "os": ["linux"], "cpu": ["arm64"] }, - "@tailwindcss/oxide-linux-x64-gnu@4.1.18": { - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "@tailwindcss/oxide-linux-x64-gnu@4.2.2": { + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", "os": ["linux"], "cpu": ["x64"] }, - "@tailwindcss/oxide-linux-x64-musl@4.1.18": { - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "@tailwindcss/oxide-linux-x64-musl@4.2.2": { + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", "os": ["linux"], "cpu": ["x64"] }, - "@tailwindcss/oxide-wasm32-wasi@4.1.18": { - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "@tailwindcss/oxide-wasm32-wasi@4.2.2": { + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", "cpu": ["wasm32"] }, - "@tailwindcss/oxide-win32-arm64-msvc@4.1.18": { - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "@tailwindcss/oxide-win32-arm64-msvc@4.2.2": { + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", "os": ["win32"], "cpu": ["arm64"] }, - "@tailwindcss/oxide-win32-x64-msvc@4.1.18": { - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "@tailwindcss/oxide-win32-x64-msvc@4.2.2": { + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", "os": ["win32"], "cpu": ["x64"] }, - "@tailwindcss/oxide@4.1.18": { - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "@tailwindcss/oxide@4.2.2": { + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", "optionalDependencies": [ "@tailwindcss/oxide-android-arm64", "@tailwindcss/oxide-darwin-arm64", @@ -734,8 +671,8 @@ "@tailwindcss/oxide-win32-x64-msvc" ] }, - "@tailwindcss/vite@4.1.18_vite@7.3.0__picomatch@4.0.3": { - "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "@tailwindcss/vite@4.2.2_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", "dependencies": [ "@tailwindcss/node", "@tailwindcss/oxide", @@ -743,24 +680,30 @@ "vite" ] }, + "@tybys/wasm-util@0.10.1": { + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dependencies": [ + "tslib" + ] + }, "@types/estree@1.0.8": { "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, - "babel-plugin-transform-hook-names@1.0.2_@babel+core@7.28.5": { + "babel-plugin-transform-hook-names@1.0.2_@babel+core@7.29.0": { "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", "dependencies": [ "@babel/core" ] }, - "baseline-browser-mapping@2.9.9": { - "integrity": "sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==", + "baseline-browser-mapping@2.10.13": { + "integrity": "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==", "bin": true }, "boolbase@1.0.0": { "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, - "browserslist@4.28.1": { - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "browserslist@4.28.2": { + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dependencies": [ "baseline-browser-mapping", "caniuse-lite", @@ -770,8 +713,8 @@ ], "bin": true }, - "caniuse-lite@1.0.30001760": { - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==" + "caniuse-lite@1.0.30001784": { + "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==" }, "convert-source-map@2.0.0": { "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" @@ -789,8 +732,8 @@ "css-what@6.2.2": { "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" }, - "daisyui@5.5.14": { - "integrity": "sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==" + "daisyui@5.5.19": { + "integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==" }, "debug@4.4.3": { "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", @@ -826,11 +769,11 @@ "domhandler" ] }, - "electron-to-chromium@1.5.267": { - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==" + "electron-to-chromium@1.5.330": { + "integrity": "sha512-jFNydB5kFtYUobh4IkWUnXeyDbjf/r9gcUEXe1xcrcUxIGfTdzPXA+ld6zBRbwvgIGVzDll/LTIiDztEtckSnA==" }, - "enhanced-resolve@5.18.4": { - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "enhanced-resolve@5.20.1": { + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "dependencies": [ "graceful-fs", "tapable" @@ -839,52 +782,19 @@ "entities@4.5.0": { "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, - "esbuild@0.27.2": { - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "optionalDependencies": [ - "@esbuild/aix-ppc64", - "@esbuild/android-arm", - "@esbuild/android-arm64", - "@esbuild/android-x64", - "@esbuild/darwin-arm64", - "@esbuild/darwin-x64", - "@esbuild/freebsd-arm64", - "@esbuild/freebsd-x64", - "@esbuild/linux-arm", - "@esbuild/linux-arm64", - "@esbuild/linux-ia32", - "@esbuild/linux-loong64", - "@esbuild/linux-mips64el", - "@esbuild/linux-ppc64", - "@esbuild/linux-riscv64", - "@esbuild/linux-s390x", - "@esbuild/linux-x64", - "@esbuild/netbsd-arm64", - "@esbuild/netbsd-x64", - "@esbuild/openbsd-arm64", - "@esbuild/openbsd-x64", - "@esbuild/openharmony-arm64", - "@esbuild/sunos-x64", - "@esbuild/win32-arm64", - "@esbuild/win32-ia32", - "@esbuild/win32-x64" - ], - "scripts": true, - "bin": true - }, "escalade@3.2.0": { "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, "estree-walker@2.0.2": { "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, - "fdir@6.5.0_picomatch@4.0.3": { + "fdir@6.5.0_picomatch@4.0.4": { "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dependencies": [ - "picomatch@4.0.3" + "picomatch@4.0.4" ], "optionalPeers": [ - "picomatch@4.0.3" + "picomatch@4.0.4" ] }, "fsevents@2.3.3": { @@ -920,63 +830,63 @@ "kolorist@1.8.0": { "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" }, - "lightningcss-android-arm64@1.30.2": { - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "lightningcss-android-arm64@1.32.0": { + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", "os": ["android"], "cpu": ["arm64"] }, - "lightningcss-darwin-arm64@1.30.2": { - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "lightningcss-darwin-arm64@1.32.0": { + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "os": ["darwin"], "cpu": ["arm64"] }, - "lightningcss-darwin-x64@1.30.2": { - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "lightningcss-darwin-x64@1.32.0": { + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", "os": ["darwin"], "cpu": ["x64"] }, - "lightningcss-freebsd-x64@1.30.2": { - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "lightningcss-freebsd-x64@1.32.0": { + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", "os": ["freebsd"], "cpu": ["x64"] }, - "lightningcss-linux-arm-gnueabihf@1.30.2": { - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "lightningcss-linux-arm-gnueabihf@1.32.0": { + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "os": ["linux"], "cpu": ["arm"] }, - "lightningcss-linux-arm64-gnu@1.30.2": { - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "lightningcss-linux-arm64-gnu@1.32.0": { + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "os": ["linux"], "cpu": ["arm64"] }, - "lightningcss-linux-arm64-musl@1.30.2": { - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "lightningcss-linux-arm64-musl@1.32.0": { + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "os": ["linux"], "cpu": ["arm64"] }, - "lightningcss-linux-x64-gnu@1.30.2": { - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "lightningcss-linux-x64-gnu@1.32.0": { + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "os": ["linux"], "cpu": ["x64"] }, - "lightningcss-linux-x64-musl@1.30.2": { - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "lightningcss-linux-x64-musl@1.32.0": { + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "os": ["linux"], "cpu": ["x64"] }, - "lightningcss-win32-arm64-msvc@1.30.2": { - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "lightningcss-win32-arm64-msvc@1.32.0": { + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "os": ["win32"], "cpu": ["arm64"] }, - "lightningcss-win32-x64-msvc@1.30.2": { - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "lightningcss-win32-x64-msvc@1.32.0": { + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "os": ["win32"], "cpu": ["x64"] }, - "lightningcss@1.30.2": { - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "lightningcss@1.32.0": { + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dependencies": [ "detect-libc" ], @@ -1000,8 +910,8 @@ "yallist" ] }, - "lucide-preact@0.525.0_preact@10.28.0": { - "integrity": "sha512-6nvEe7KdEBa36IZ/jjoOHZxd6YyrjfE3Lf/M2PxJXAVeIY8ywKRVkRwjkcXKNa+F9qiN7Bfv334TeREAk8iAtQ==", + "lucide-preact@1.7.0_preact@10.29.0": { + "integrity": "sha512-gv743hfkCH2MeUmZQ9g4+Yd+/zZyAOLuXvxWo6CUY6kMrnnoDZnnwpSZqWsEveCC9LNp+NgHkeTfztObIue+SA==", "dependencies": [ "preact" ] @@ -1026,8 +936,8 @@ "he" ] }, - "node-releases@2.0.27": { - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" + "node-releases@2.0.36": { + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==" }, "nth-check@2.1.1": { "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", @@ -1038,52 +948,45 @@ "picocolors@1.1.1": { "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, - "picomatch@2.3.1": { - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "picomatch@2.3.2": { + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==" }, - "picomatch@4.0.3": { - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "picomatch@4.0.4": { + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" }, - "postcss@8.5.6": { - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "postcss@8.5.8": { + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dependencies": [ "nanoid", "picocolors", "source-map-js" ] }, - "preact@10.28.0": { - "integrity": "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==" + "preact@10.29.0": { + "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==" }, - "rollup@4.53.5": { - "integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==", + "rolldown@1.0.0-rc.12_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dependencies": [ - "@types/estree" + "@oxc-project/types", + "@rolldown/pluginutils" ], "optionalDependencies": [ - "@rollup/rollup-android-arm-eabi", - "@rollup/rollup-android-arm64", - "@rollup/rollup-darwin-arm64", - "@rollup/rollup-darwin-x64", - "@rollup/rollup-freebsd-arm64", - "@rollup/rollup-freebsd-x64", - "@rollup/rollup-linux-arm-gnueabihf", - "@rollup/rollup-linux-arm-musleabihf", - "@rollup/rollup-linux-arm64-gnu", - "@rollup/rollup-linux-arm64-musl", - "@rollup/rollup-linux-loong64-gnu", - "@rollup/rollup-linux-ppc64-gnu", - "@rollup/rollup-linux-riscv64-gnu", - "@rollup/rollup-linux-riscv64-musl", - "@rollup/rollup-linux-s390x-gnu", - "@rollup/rollup-linux-x64-gnu", - "@rollup/rollup-linux-x64-musl", - "@rollup/rollup-openharmony-arm64", - "@rollup/rollup-win32-arm64-msvc", - "@rollup/rollup-win32-ia32-msvc", - "@rollup/rollup-win32-x64-gnu", - "@rollup/rollup-win32-x64-msvc", - "fsevents" + "@rolldown/binding-android-arm64", + "@rolldown/binding-darwin-arm64", + "@rolldown/binding-darwin-x64", + "@rolldown/binding-freebsd-x64", + "@rolldown/binding-linux-arm-gnueabihf", + "@rolldown/binding-linux-arm64-gnu", + "@rolldown/binding-linux-arm64-musl", + "@rolldown/binding-linux-ppc64-gnu", + "@rolldown/binding-linux-s390x-gnu", + "@rolldown/binding-linux-x64-gnu", + "@rolldown/binding-linux-x64-musl", + "@rolldown/binding-openharmony-arm64", + "@rolldown/binding-wasm32-wasi", + "@rolldown/binding-win32-arm64-msvc", + "@rolldown/binding-win32-x64-msvc" ], "bin": true }, @@ -1106,20 +1009,23 @@ "stack-trace@1.0.0-pre2": { "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==" }, - "tailwindcss@4.1.18": { - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==" + "tailwindcss@4.2.2": { + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==" }, - "tapable@2.3.0": { - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==" + "tapable@2.3.2": { + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==" }, - "tinyglobby@0.2.15_picomatch@4.0.3": { + "tinyglobby@0.2.15": { "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dependencies": [ "fdir", - "picomatch@4.0.3" + "picomatch@4.0.4" ] }, - "update-browserslist-db@1.2.3_browserslist@4.28.1": { + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "update-browserslist-db@1.2.3_browserslist@4.28.2": { "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dependencies": [ "browserslist", @@ -1128,8 +1034,8 @@ ], "bin": true }, - "vite-prerender-plugin@0.5.12_vite@7.3.0__picomatch@4.0.3": { - "integrity": "sha512-EiwhbMn+flg14EysbLTmZSzq8NGTxhytgK3bf4aGRF1evWLGwZiHiUJ1KZDvbxgKbMf2pG6fJWGEa3UZXOnR1g==", + "vite-prerender-plugin@0.5.13_vite@8.0.3__@emnapi+core@1.9.1__@emnapi+runtime@1.9.1_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-IKSpYkzDBsKAxa05naRbj7GvNVMSdww/Z/E89oO3xndz+gWnOBOKOAbEXv7qDhktY/j3vHgJmoV1pPzqU2tx9g==", "dependencies": [ "kolorist", "magic-string", @@ -1140,14 +1046,13 @@ "vite" ] }, - "vite@7.3.0_picomatch@4.0.3": { - "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1": { + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dependencies": [ - "esbuild", - "fdir", - "picomatch@4.0.3", + "lightningcss", + "picomatch@4.0.4", "postcss", - "rollup", + "rolldown", "tinyglobby" ], "optionalDependencies": [ @@ -1157,36 +1062,36 @@ }, "yallist@3.1.1": { "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "zimmerframe@1.1.4": { + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==" } }, - "remote": { - "https://gistcdn.githack.com/kigiri/21df06d173fcdced5281b86ba6ac1382/raw/crypto.js": "e85976e655898538dbade9d87b05ca0a6bb167b3128cd4098622000a582f5f6d" - }, "workspace": { "dependencies": [ - "jsr:@01edu/api-client@~0.1.3", - "jsr:@01edu/api-proxy@~0.1.2", - "jsr:@01edu/api@~0.1.3", - "jsr:@01edu/signal-router@~0.1.6", + "jsr:@01edu/api-client@~0.2.3", + "jsr:@01edu/api-proxy@~0.2.1", + "jsr:@01edu/api@~0.2.3", + "jsr:@01edu/signal-router@~0.2.1", "jsr:@01edu/time@0.1", - "jsr:@std/assert@^1.0.16", + "jsr:@std/assert@^1.0.19", "jsr:@std/crypto@^1.0.5", "jsr:@std/encoding@^1.0.10", - "jsr:@std/fmt@^1.0.8", - "jsr:@std/fs@^1.0.20", - "jsr:@std/http@^1.0.22", - "jsr:@std/path@^1.1.3", - "jsr:@std/testing@^1.0.16", - "npm:@clickhouse/client@^1.14.0", - "npm:@deno/vite-plugin@^1.0.5", - "npm:@preact/preset-vite@^2.10.2", - "npm:@preact/signals@^2.5.1", - "npm:@tailwindcss/vite@^4.1.17", - "npm:daisyui@^5.5.8", - "npm:lucide-preact@0.525", - "npm:preact@^10.28.0", - "npm:tailwindcss@^4.1.17", - "npm:vite@^7.3.0" + "jsr:@std/fmt@^1.0.9", + "jsr:@std/fs@^1.0.23", + "jsr:@std/http@^1.0.25", + "jsr:@std/path@^1.1.4", + "jsr:@std/testing@^1.0.17", + "npm:@clickhouse/client@^1.18.2", + "npm:@deno/vite-plugin@^2.0.2", + "npm:@preact/preset-vite@^2.10.5", + "npm:@preact/signals@^2.9.0", + "npm:@tailwindcss/vite@^4.2.2", + "npm:daisyui@^5.5.19", + "npm:lucide-preact@^1.7.0", + "npm:preact@^10.29.0", + "npm:tailwindcss@^4.2.2", + "npm:vite@^8.0.3" ] } } diff --git a/tasks/clickhouse.ts b/tasks/clickhouse.ts deleted file mode 100644 index d147dde..0000000 --- a/tasks/clickhouse.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { client } from '/api/clickhouse-client.ts' - -if (import.meta.main) { - try { - await client.ping() - - await client.command({ - query: ` - CREATE TABLE IF NOT EXISTS logs ( - id UUID DEFAULT generateUUIDv4(), - -- Flattened resource fields - service_name LowCardinality(String), - service_version LowCardinality(String), - service_instance_id String, - - timestamp DateTime64(3, 'UTC') DEFAULT now64(3, 'UTC'), - observed_timestamp DateTime64(3, 'UTC') DEFAULT now64(3, 'UTC'), - trace_id FixedString(16), - span_id FixedString(16), - severity_number UInt8, - -- derived column, computed by DB from severity_number - severity_text LowCardinality(String) MATERIALIZED CASE - WHEN severity_number > 4 AND severity_number <= 8 THEN 'DEBUG' - WHEN severity_number > 8 AND severity_number <= 12 THEN 'INFO' - WHEN severity_number > 12 AND severity_number <= 16 THEN 'WARN' - WHEN severity_number > 20 AND severity_number <= 24 THEN 'FATAL' - ELSE 'ERROR' - END, - -- Often empty, but kept for OTEL spec compliance - body Nullable(String), - attributes JSON, - event_name LowCardinality(String) - ) - ENGINE = MergeTree - PARTITION BY toYYYYMMDD(timestamp) - ORDER BY (service_name, timestamp, trace_id) - SETTINGS index_granularity = 8192, min_bytes_for_wide_part = 0; - `, - }) - - console.log('logs table is ready') - } catch (error) { - console.error('Error creating ClickHouse table:', { error }) - Deno.exit(1) - } -} diff --git a/tasks/vite.ts b/tasks/vite.ts index 0fb51f7..1f6786d 100644 --- a/tasks/vite.ts +++ b/tasks/vite.ts @@ -1,6 +1,6 @@ // tasks/vite.js import { join } from 'node:path' -import { AliasOptions, build, createServer } from 'vite' +import { build, createServer } from 'vite' import { apiProxy } from '@01edu/api-proxy' import deno from '@deno/vite-plugin' import preact from '@preact/preset-vite' @@ -13,27 +13,27 @@ const plugins = [ deno(), ] -const alias: AliasOptions = [ +const BASE_URL = Deno.env.get('BASE_URL') || '/' +const preactRuntimeAlias = [ { - find: 'npm:@preact/signals@^2.5.1', - replacement: '@preact/signals', + find: /^npm:preact(?:@[^/]+)?\/jsx-runtime$/, + replacement: 'preact/jsx-runtime', }, { - find: 'npm:preact@^10.27.2', - replacement: 'preact', + find: /^npm:preact(?:@[^/]+)?\/jsx-dev-runtime$/, + replacement: 'preact/jsx-dev-runtime', }, ] + // Production build if (APP_ENV === 'prod') { await build({ configFile: false, root: join(import.meta.dirname!, '../web'), plugins, - resolve: { alias }, - build: { - outDir: '../dist/web', - emptyOutDir: true, - }, + base: BASE_URL, + resolve: { alias: preactRuntimeAlias }, + build: { outDir: '../dist/web', emptyOutDir: true }, }) Deno.exit(0) } @@ -43,12 +43,10 @@ const PORT = Number(Deno.env.get('PORT')) || 2119 const server = await createServer({ configFile: false, root: join(import.meta.dirname!, '../web'), + base: BASE_URL, plugins: [...plugins, apiProxy({ port: PORT, prefix: '/api/' })], - resolve: { alias }, - server: { - port: 7737, - host: true, - }, + resolve: { alias: preactRuntimeAlias }, + server: { port: 7737, host: true }, }) await server.listen() server.printUrls() diff --git a/web/components/BrandIcons.tsx b/web/components/BrandIcons.tsx deleted file mode 100644 index f8c410b..0000000 --- a/web/components/BrandIcons.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import type { SVGAttributes } from 'preact' -// Copy path / name from: https://simpleicons.org/ - -type SVGProps = SVGAttributes -const Icon = (title: string, path: string) => (props: SVGProps) => ( - - {title} - - -) - -export const GitHub = Icon( - 'GibHub', - 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12', -) diff --git a/web/components/SideBar.tsx b/web/components/SideBar.tsx index ba853c7..2e85035 100644 --- a/web/components/SideBar.tsx +++ b/web/components/SideBar.tsx @@ -5,8 +5,8 @@ import { LucideIcon, Settings, } from 'lucide-preact' -import { user } from '../lib/session.ts' import { A, url } from '@01edu/signal-router' +import { sidebarItems } from '../lib/shared.tsx' export type SidebarItem = { label: string @@ -15,10 +15,10 @@ export type SidebarItem = { } export function Sidebar( - { sidebarItems, sbi, title }: { - sidebarItems: Record + { sbi, title, isAdmin }: { sbi?: string title?: string + isAdmin?: boolean }, ) { const sb = url.params.sb @@ -70,7 +70,7 @@ export function Sidebar( params={{ sbi: 'settings' }} replace class={`rounded p-2 w-full flex items-center gap-2 ${ - user.data?.isAdmin + isAdmin ? 'settings' === sbi ? 'bg-primary text-primary-content' : '' : 'opacity-50 pointer-events-none' }`} diff --git a/web/layout.tsx b/web/layout.tsx index 741a20c..33657c9 100644 --- a/web/layout.tsx +++ b/web/layout.tsx @@ -1,7 +1,6 @@ import { effect, signal } from '@preact/signals' import { A, url } from '@01edu/signal-router' import { Code, LogOut, Moon, Sun } from 'lucide-preact' -import { GitHub } from './components/BrandIcons.tsx' import { user } from './lib/session.ts' const $theme = signal(localStorage.theme || 'dark') @@ -58,25 +57,16 @@ export const SwitchTheme = () => ( export const Header = () => (