From dd4bb883966ec4842c6d16261335f96ac7252933 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 30 May 2025 09:43:25 -0700 Subject: [PATCH] Render task messages (#52) --- package.json | 27 +- pnpm-lock.yaml | 1263 +++++++++++++---- .../{analytics.ts => analytics/events.ts} | 20 +- src/actions/analytics/index.ts | 2 + src/actions/analytics/messages.ts | 25 + src/app/(authenticated)/usage/Messages.tsx | 61 + src/app/(authenticated)/usage/TaskDrawer.tsx | 175 +-- src/app/(authenticated)/usage/Tasks.tsx | 8 +- src/app/(authenticated)/usage/Usage.tsx | 7 +- src/app/globals.css | 58 + src/hooks/__tests__/useAuthState.test.ts | 320 +++++ src/lib/formatters.ts | 3 + src/types/analytics/index.ts | 2 + src/types/analytics/message.ts | 18 + src/types/analytics/task.ts | 14 + vitest-global-setup.ts | 12 +- vitest.config.mts | 8 - vitest.workspace.ts | 37 + 18 files changed, 1613 insertions(+), 447 deletions(-) rename src/actions/{analytics.ts => analytics/events.ts} (94%) create mode 100644 src/actions/analytics/index.ts create mode 100644 src/actions/analytics/messages.ts create mode 100644 src/app/(authenticated)/usage/Messages.tsx create mode 100644 src/hooks/__tests__/useAuthState.test.ts create mode 100644 src/types/analytics/index.ts create mode 100644 src/types/analytics/message.ts create mode 100644 src/types/analytics/task.ts create mode 100644 vitest.workspace.ts diff --git a/package.json b/package.json index 649296f04c..c0c3b6f242 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,9 @@ "prepare": "husky" }, "dependencies": { - "@clerk/localizations": "^3.16.2", - "@clerk/nextjs": "^6.20.1", - "@clerk/themes": "^2.2.47", + "@clerk/localizations": "^3.16.3", + "@clerk/nextjs": "^6.20.2", + "@clerk/themes": "^2.2.48", "@clickhouse/client": "^1.11.1", "@hookform/resolvers": "^5.0.1", "@logtail/pino": "^0.5.5", @@ -50,7 +50,7 @@ "@sentry/nextjs": "^9.23.0", "@t3-oss/env-nextjs": "^0.13.6", "@tailwindcss/postcss": "^4.1.8", - "@tanstack/react-query": "^5.77.2", + "@tanstack/react-query": "^5.79.0", "@tanstack/react-table": "^8.21.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -59,7 +59,7 @@ "drizzle-orm": "^0.43.1", "drizzle-zod": "^0.7.1", "lucide-react": "^0.509.0", - "next": "^15.3.2", + "next": "^15.3.3", "next-intl": "^4.1.0", "next-themes": "^0.4.6", "next-typesafe-url": "^5.1.7", @@ -70,20 +70,21 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "react-hook-form": "^7.56.4", + "react-markdown": "^10.1.0", "react-use": "^17.6.0", "sonner": "^2.0.3", - "stripe": "^18.1.1", + "stripe": "^18.2.0", "tailwind-merge": "^3.3.0", "uuid": "^11.1.0", "vaul": "^1.1.2", - "zod": "^3.25.32" + "zod": "^3.25.41" }, "devDependencies": { - "@clerk/testing": "^1.7.4", + "@clerk/testing": "^1.7.5", "@dotenvx/dotenvx": "^1.44.1", "@eslint/js": "^9.27.0", - "@next/bundle-analyzer": "^15.3.2", - "@next/eslint-plugin-next": "^15.3.2", + "@next/bundle-analyzer": "^15.3.3", + "@next/eslint-plugin-next": "^15.3.3", "@percy/cli": "1.30.10", "@percy/playwright": "^1.0.8", "@playwright/test": "^1.52.0", @@ -99,7 +100,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/node": "^22.15.23", + "@types/node": "^22.15.27", "@types/pg": "^8.15.2", "@types/react": "^19.1.6", "@vitejs/plugin-react": "^4.5.0", @@ -121,7 +122,7 @@ "jsdom": "^26.1.0", "lint-staged": "^16.1.0", "npm-run-all": "^4.1.5", - "postcss": "^8.5.3", + "postcss": "^8.5.4", "require-in-the-middle": "^7.5.2", "rimraf": "^6.0.1", "start-server-and-test": "^2.0.12", @@ -129,7 +130,7 @@ "tailwindcss": "^4.1.8", "tailwindcss-animate": "^1.0.7", "tsx": "^4.19.4", - "tw-animate-css": "^1.3.0", + "tw-animate-css": "^1.3.2", "typescript": "^5.8.3", "typescript-eslint": "^8.33.0", "vite-tsconfig-paths": "^5.1.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97d700c513..38379bee4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,14 +9,14 @@ importers: .: dependencies: '@clerk/localizations': - specifier: ^3.16.2 - version: 3.16.2 + specifier: ^3.16.3 + version: 3.16.3 '@clerk/nextjs': - specifier: ^6.20.1 - version: 6.20.1(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^6.20.2 + version: 6.20.2(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@clerk/themes': - specifier: ^2.2.47 - version: 2.2.47 + specifier: ^2.2.48 + version: 2.2.48 '@clickhouse/client': specifier: ^1.11.1 version: 1.11.1 @@ -70,16 +70,16 @@ importers: version: 1.22.0 '@sentry/nextjs': specifier: ^9.23.0 - version: 9.23.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) + version: 9.23.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) '@t3-oss/env-nextjs': specifier: ^0.13.6 - version: 0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.32) + version: 0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.41) '@tailwindcss/postcss': specifier: ^4.1.8 version: 4.1.8 '@tanstack/react-query': - specifier: ^5.77.2 - version: 5.77.2(react@19.1.0) + specifier: ^5.79.0 + version: 5.79.0(react@19.1.0) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -100,22 +100,22 @@ importers: version: 0.43.1(@electric-sql/pglite@0.3.0)(@libsql/client-wasm@0.15.5)(@opentelemetry/api@1.9.0)(@types/pg@8.15.2)(pg@8.15.6)(postgres@3.4.7) drizzle-zod: specifier: ^0.7.1 - version: 0.7.1(drizzle-orm@0.43.1(@electric-sql/pglite@0.3.0)(@libsql/client-wasm@0.15.5)(@opentelemetry/api@1.9.0)(@types/pg@8.15.2)(pg@8.15.6)(postgres@3.4.7))(zod@3.25.32) + version: 0.7.1(drizzle-orm@0.43.1(@electric-sql/pglite@0.3.0)(@libsql/client-wasm@0.15.5)(@opentelemetry/api@1.9.0)(@types/pg@8.15.2)(pg@8.15.6)(postgres@3.4.7))(zod@3.25.41) lucide-react: specifier: ^0.509.0 version: 0.509.0(react@19.1.0) next: - specifier: ^15.3.2 - version: 15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.3.3 + version: 15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-intl: specifier: ^4.1.0 - version: 4.1.0(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 4.1.0(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-typesafe-url: specifier: ^5.1.7 - version: 5.1.7(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(zod@3.25.32) + version: 5.1.7(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(zod@3.25.41) pino: specifier: ^9.7.0 version: 9.7.0 @@ -137,6 +137,9 @@ importers: react-hook-form: specifier: ^7.56.4 version: 7.56.4(react@19.1.0) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.1.6)(react@19.1.0) react-use: specifier: ^17.6.0 version: 17.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -144,8 +147,8 @@ importers: specifier: ^2.0.3 version: 2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) stripe: - specifier: ^18.1.1 - version: 18.1.1(@types/node@22.15.23) + specifier: ^18.2.0 + version: 18.2.0(@types/node@22.15.27) tailwind-merge: specifier: ^3.3.0 version: 3.3.0 @@ -156,12 +159,12 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) zod: - specifier: ^3.25.32 - version: 3.25.32 + specifier: ^3.25.41 + version: 3.25.41 devDependencies: '@clerk/testing': - specifier: ^1.7.4 - version: 1.7.4(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^1.7.5 + version: 1.7.5(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@dotenvx/dotenvx': specifier: ^1.44.1 version: 1.44.1 @@ -169,11 +172,11 @@ importers: specifier: ^9.27.0 version: 9.27.0 '@next/bundle-analyzer': - specifier: ^15.3.2 - version: 15.3.2 + specifier: ^15.3.3 + version: 15.3.3 '@next/eslint-plugin-next': - specifier: ^15.3.2 - version: 15.3.2 + specifier: ^15.3.3 + version: 15.3.3 '@percy/cli': specifier: 1.30.10 version: 1.30.10(typescript@5.8.3) @@ -200,7 +203,7 @@ importers: version: 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3)) '@storybook/nextjs': specifier: ^8.6.14 - version: 8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) + version: 8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) '@storybook/react': specifier: ^8.6.14 version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) @@ -209,7 +212,7 @@ importers: version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) '@storybook/test-runner': specifier: ^0.22.0 - version: 0.22.0(@types/node@22.15.23)(storybook@8.6.14(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + version: 0.22.0(@types/node@22.15.27)(storybook@8.6.14(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -220,8 +223,8 @@ importers: specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) '@types/node': - specifier: ^22.15.23 - version: 22.15.23 + specifier: ^22.15.27 + version: 22.15.27 '@types/pg': specifier: ^8.15.2 version: 8.15.2 @@ -230,16 +233,16 @@ importers: version: 19.1.6 '@vitejs/plugin-react': specifier: ^4.5.0 - version: 4.5.0(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.5.0(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/coverage-v8': specifier: ^3.1.4 - version: 3.1.4(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + version: 3.1.4(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/expect': specifier: ^3.1.4 version: 3.1.4 autoprefixer: specifier: ^10.4.21 - version: 10.4.21(postcss@8.5.3) + version: 10.4.21(postcss@8.5.4) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -286,8 +289,8 @@ importers: specifier: ^4.1.5 version: 4.1.5 postcss: - specifier: ^8.5.3 - version: 8.5.3 + specifier: ^8.5.4 + version: 8.5.4 require-in-the-middle: specifier: ^7.5.2 version: 7.5.2 @@ -310,8 +313,8 @@ importers: specifier: ^4.19.4 version: 4.19.4 tw-animate-css: - specifier: ^1.3.0 - version: 1.3.0 + specifier: ^1.3.2 + version: 1.3.2 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -320,13 +323,13 @@ importers: version: 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: ^3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vitest-fail-on-console: specifier: ^0.7.1 - version: 0.7.1(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + version: 0.7.1(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) packages: @@ -992,8 +995,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@clerk/backend@1.33.1': - resolution: {integrity: sha512-2TjO8z13a1TQj+LgAMDmXZSD1MgFZbFPkWKHhP46E+ylVlQVULfsOYb08GolDdYz8ga1vG/B2yzFIro1zIsiSA==} + '@clerk/backend@1.34.0': + resolution: {integrity: sha512-9rZ8hQJVpX5KX2bEpiuVXfpjhojQCiqCWADJDdCI0PCeKxn58Ep0JPYiIcczg4VKUc3a7jve9vXylykG2XajLQ==} engines: {node: '>=18.17.0'} peerDependencies: svix: ^1.62.0 @@ -1001,27 +1004,27 @@ packages: svix: optional: true - '@clerk/clerk-react@5.31.7': - resolution: {integrity: sha512-Zu23e/vFdUTvHcNjjxZed9BmW+2TezeP9JuVEg0KfC9j1VDoek3trbNuCgpibWTsbOAZM7GCMm81ojj9KygL8w==} + '@clerk/clerk-react@5.31.8': + resolution: {integrity: sha512-GPhOdI7drAaamiKIhzfWiOVe4zw4wUi1sKp6khgUzcjr9hRopdZvzMts0fU+XLHFnYUSX8IPw4c0CDXY1wBKuw==} engines: {node: '>=18.17.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - '@clerk/localizations@3.16.2': - resolution: {integrity: sha512-PTxk/k46xxNP2VstsURbmw/Ec9l/eryEMKF4JDWacf9XDUMaaMid5ihcEb0nxjaJE6SYG84Z39z5EuHBd3H5fQ==} + '@clerk/localizations@3.16.3': + resolution: {integrity: sha512-vbEsitmvBWTfY4PrJdVVYa9MgQddDWBnIarlEGwn61I5I9BjRJsZXG/s/JS4x2pEM4LDrFE7z4p43646NDwYrA==} engines: {node: '>=18.17.0'} - '@clerk/nextjs@6.20.1': - resolution: {integrity: sha512-tpaCpMh29IJBVQM5foKgFYFNwG2+JGEqmINdUF1SP0n0xxK2tPM0lgkX/sYs/5doGHDLMwLfthsDKrMBxoncEg==} + '@clerk/nextjs@6.20.2': + resolution: {integrity: sha512-rBtAdx2PFxexBDU41GEmEQwSsfbTU7J7OVBKRtmXAXFMYdknGNw41674sFBTaG+wjbTYrhW7wsXcyphEUyVMoQ==} engines: {node: '>=18.17.0'} peerDependencies: next: ^13.5.7 || ^14.2.25 || ^15.2.3 react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - '@clerk/shared@3.9.4': - resolution: {integrity: sha512-kUYPFlQ6T5FC8gw87vApahzvGYQ7sj3QLg2cFnJl7t0717+g509GzdXfh3+jMqCPN/PDK7HRYSAnX3kpKYIzqg==} + '@clerk/shared@3.9.5': + resolution: {integrity: sha512-KeIug5qV4LnzZD+16SLkJvdONPs2HQ7I1A7jbHYOGB37vQrQrus64Wu5XeNzbWFTN1Z5fAPSGuja8MfT2cBT4A==} engines: {node: '>=18.17.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 @@ -1032,8 +1035,8 @@ packages: react-dom: optional: true - '@clerk/testing@1.7.4': - resolution: {integrity: sha512-r97rIT09/BlmcFUuRKWevIG+C2rd6KDpM4FJso0cS6PAoLBdczmbcI61VOOcmYyW+PXjVLTEoxLWEJOCD4S2Cw==} + '@clerk/testing@1.7.5': + resolution: {integrity: sha512-orBMQAs4agjCUWKLgrHnGDZlRhlgwSoA6HZv5b+8RIjCOmV6/+k6Ny8PcqBoXRfO7IilcoN/uIAdvJJFwUkrKg==} engines: {node: '>=18.17.0'} peerDependencies: '@playwright/test': ^1 @@ -1044,12 +1047,12 @@ packages: cypress: optional: true - '@clerk/themes@2.2.47': - resolution: {integrity: sha512-Rm+SBYupoj7KrsBOUkoYmtUSv+hXf5Cqt2Gr1hpIXZ6awaNWH3S/gg5UdQy2jKLcg1hwJ2IINM2O8VylIcmJ9A==} + '@clerk/themes@2.2.48': + resolution: {integrity: sha512-vylu+2IShOCBr6OBhIFlXL3ULqIZc4L5A/muB0HEum7BHR0bjq6UWHyNZuPKla0W4QGc3azPrTgi19zI4PlZ6A==} engines: {node: '>=18.17.0'} - '@clerk/types@4.59.2': - resolution: {integrity: sha512-PO16hwdpwnZZMJu5BN69v8gqBnK5mfJkcHK3k5XymsPG9t+rply2K5fyP43+HoNkxluufk6SObDmY9NTzd+lKw==} + '@clerk/types@4.59.3': + resolution: {integrity: sha512-xwOO/hfABzbFr3f1RaVXHsDDQ0+jYpm84GiaUDxo+mLsYUgD9f2GmGjKkgWybXzvsBsgZlycSwRXkeDD6utFqg==} engines: {node: '>=18.17.0'} '@clickhouse/client-common@1.11.1': @@ -1872,59 +1875,59 @@ packages: resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} engines: {node: '>= 10'} - '@next/bundle-analyzer@15.3.2': - resolution: {integrity: sha512-zY5O1PNKNxWEjaFX8gKzm77z2oL0cnj+m5aiqNBgay9LPLCDO13Cf+FJONeNq/nJjeXptwHFT9EMmTecF9U4Iw==} + '@next/bundle-analyzer@15.3.3': + resolution: {integrity: sha512-9gddnjACK6yOa5IkmeFyzcwZh2rscsb6ZspTd7tymPYKQM96fJuKjn9HrRtPNKiMm7ExKNadAJqREmHdBgHZ9A==} - '@next/env@15.3.2': - resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==} + '@next/env@15.3.3': + resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} - '@next/eslint-plugin-next@15.3.2': - resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} + '@next/eslint-plugin-next@15.3.3': + resolution: {integrity: sha512-VKZJEiEdpKkfBmcokGjHu0vGDG+8CehGs90tBEy/IDoDDKGngeyIStt2MmE5FYNyU9BhgR7tybNWTAJY/30u+Q==} - '@next/swc-darwin-arm64@15.3.2': - resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==} + '@next/swc-darwin-arm64@15.3.3': + resolution: {integrity: sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.2': - resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==} + '@next/swc-darwin-x64@15.3.3': + resolution: {integrity: sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.2': - resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==} + '@next/swc-linux-arm64-gnu@15.3.3': + resolution: {integrity: sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.2': - resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==} + '@next/swc-linux-arm64-musl@15.3.3': + resolution: {integrity: sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.2': - resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==} + '@next/swc-linux-x64-gnu@15.3.3': + resolution: {integrity: sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.2': - resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==} + '@next/swc-linux-x64-musl@15.3.3': + resolution: {integrity: sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.2': - resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==} + '@next/swc-win32-arm64-msvc@15.3.3': + resolution: {integrity: sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.2': - resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==} + '@next/swc-win32-x64-msvc@15.3.3': + resolution: {integrity: sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3476,11 +3479,11 @@ packages: '@tailwindcss/postcss@4.1.8': resolution: {integrity: sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw==} - '@tanstack/query-core@5.77.2': - resolution: {integrity: sha512-1lqJwPsR6GX6nZFw06erRt518O19tWU6Q+x0fJUygl4lxHCYF2nhzBPwLKk2NPjYOrpR0K567hxPc5K++xDe9Q==} + '@tanstack/query-core@5.79.0': + resolution: {integrity: sha512-s+epTqqLM0/TbJzMAK7OEhZIzh63P9sWz5HEFc5XHL4FvKQXQkcjI8F3nee+H/xVVn7mrP610nVXwOytTSYd0w==} - '@tanstack/react-query@5.77.2': - resolution: {integrity: sha512-BRHxWdy1mHmgAcYA/qy2IPLylT81oebLgkm9K85viN2Qol/Vq48t1dzDFeDIVQjTWDV96AmqsLNPlH5HjyKCxA==} + '@tanstack/react-query@5.79.0': + resolution: {integrity: sha512-DjC4JIYZnYzxaTzbg3osOU63VNLP67dOrWet2cZvXgmgwAXNxfS52AMq86M5++ILuzW+BqTUEVMTjhrZ7/XBuA==} peerDependencies: react: ^18 || ^19 @@ -3579,6 +3582,9 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -3588,6 +3594,9 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -3606,6 +3615,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} @@ -3618,8 +3630,8 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} - '@types/node@22.15.23': - resolution: {integrity: sha512-7Ec1zaFPF4RJ0eXu1YT/xgiebqwqoJz8rYPDi/O2BcZ++Wpt0Kq9cl0eg6NN6bYbPnR67ZLo7St5Q3UK0SnARw==} + '@types/node@22.15.27': + resolution: {integrity: sha512-5fF+eu5mwihV2BeVtX5vijhdaZOfkQTATrePEaXTcKqI16LhJ7gi2/Vhd9OZM0UojcdmiOCVg5rrax+i1MdoQQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3657,6 +3669,12 @@ packages: '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -3729,6 +3747,9 @@ packages: resolution: {integrity: sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitejs/plugin-react@4.5.0': resolution: {integrity: sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4116,6 +4137,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -4189,8 +4213,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.24.5: - resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4255,13 +4279,16 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001718: - resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + caniuse-lite@1.0.30001720: + resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} @@ -4294,6 +4321,18 @@ packages: resolution: {integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==} engines: {node: '>=12.20'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -4398,6 +4437,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -4619,6 +4661,9 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -4683,6 +4728,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4871,8 +4919,8 @@ packages: resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} - electron-to-chromium@1.5.159: - resolution: {integrity: sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==} + electron-to-chromium@1.5.161: + resolution: {integrity: sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -4928,8 +4976,8 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.23.10: - resolution: {integrity: sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -5081,6 +5129,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -5134,6 +5185,9 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} @@ -5490,6 +5544,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -5533,6 +5593,9 @@ packages: engines: {node: '>=12'} hasBin: true + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-webpack-plugin@5.6.3: resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} engines: {node: '>=10.13.0'} @@ -5643,6 +5706,9 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-prefixer@7.0.1: resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} @@ -5657,6 +5723,12 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arguments@1.2.0: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} @@ -5703,6 +5775,9 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -5740,6 +5815,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -5748,6 +5826,10 @@ packages: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -5760,6 +5842,10 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -6292,6 +6378,9 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6370,6 +6459,30 @@ packages: md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -6395,6 +6508,69 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -6541,8 +6717,8 @@ packages: react: ^18.2.0 || ^19.0.0 zod: ^3.21.4 - next@15.3.2: - resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==} + next@15.3.3: + resolution: {integrity: sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -6775,6 +6951,9 @@ packages: resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} engines: {node: '>= 0.10'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -7025,8 +7204,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -7113,6 +7292,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -7197,6 +7379,12 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -7327,6 +7515,12 @@ packages: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} engines: {node: '>=4'} + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} @@ -7690,6 +7884,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-wrap@2.0.0: resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} engines: {node: '>=8'} @@ -7756,6 +7953,10 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + storybook@8.6.14: resolution: {integrity: sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==} hasBin: true @@ -7831,6 +8032,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -7863,8 +8067,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - stripe@18.1.1: - resolution: {integrity: sha512-hlF0ripc2nJrihpsJZQDl3xirS7tpdpS7DlmSNLEDRW8j7Qr215y5DHOI3+aEY/lq6PG8y4GR1RZPtEoIoAs/g==} + stripe@18.2.0: + resolution: {integrity: sha512-RpOaGh5CLs3SYeVXw1CIQZNwPVADBJtgNyUgu+ZkIvu3u4pkZvNrlKr+WaLoNjSPQWef0dikxDS2AKHBl/l3bg==} engines: {node: '>=12.*'} peerDependencies: '@types/node': '>=12.x.x' @@ -7878,6 +8082,12 @@ packages: peerDependencies: webpack: ^5.0.0 + style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -8064,10 +8274,16 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -8167,8 +8383,8 @@ packages: resolution: {integrity: sha512-iHuaNcq5GZZnr3XDZNuu2LSyCzAOPwDuo5Qt+q64DfsTP1i3T2bKfxJhni2ZQxsvAoxRbuUK5QetJki4qc5aYA==} hasBin: true - tw-animate-css@1.3.0: - resolution: {integrity: sha512-jrJ0XenzS9KVuDThJDvnhalbl4IYiMQ/XvpA0a2FL8KmlK+6CSMviO7ROY/I7z1NnUs5NnDhlM6fXmF40xPxzw==} + tw-animate-css@1.3.2: + resolution: {integrity: sha512-khGYcg4sHWFWcjpiWvy0KN0Bd6yVy6Ecc4r9ZP2u7FV+n4/Fp8MQscCWJkM0KMIRvrpGyKpIQnIbEd1hrewdeg==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -8264,10 +8480,28 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + union@0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -8362,6 +8596,12 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.1.4: resolution: {integrity: sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -8708,8 +8948,11 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} - zod@3.25.32: - resolution: {integrity: sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==} + zod@3.25.41: + resolution: {integrity: sha512-8+sDJTGtCYIDBhdqDygp0ffj8kzziRKqAJPhpYObbElJ+3TRe/mnlnwH+/OMa3kKhueS4Drm5UMW00/u1p07zA==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: @@ -8782,7 +9025,7 @@ snapshots: dependencies: '@babel/compat-data': 7.27.3 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.5 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -9549,10 +9792,10 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@clerk/backend@1.33.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@clerk/backend@1.34.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@clerk/shared': 3.9.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@clerk/types': 4.59.2 + '@clerk/shared': 3.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/types': 4.59.3 cookie: 1.0.2 snakecase-keys: 8.0.1 tslib: 2.8.1 @@ -9560,25 +9803,25 @@ snapshots: - react - react-dom - '@clerk/clerk-react@5.31.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@clerk/clerk-react@5.31.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@clerk/shared': 3.9.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@clerk/types': 4.59.2 + '@clerk/shared': 3.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/types': 4.59.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) tslib: 2.8.1 - '@clerk/localizations@3.16.2': + '@clerk/localizations@3.16.3': dependencies: - '@clerk/types': 4.59.2 + '@clerk/types': 4.59.3 - '@clerk/nextjs@6.20.1(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@clerk/nextjs@6.20.2(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@clerk/backend': 1.33.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@clerk/clerk-react': 5.31.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@clerk/shared': 3.9.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@clerk/types': 4.59.2 - next: 15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/backend': 1.34.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/clerk-react': 5.31.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/shared': 3.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/types': 4.59.3 + next: 15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) server-only: 0.0.1 @@ -9586,9 +9829,9 @@ snapshots: transitivePeerDependencies: - svix - '@clerk/shared@3.9.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@clerk/shared@3.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@clerk/types': 4.59.2 + '@clerk/types': 4.59.3 dequal: 2.0.3 glob-to-regexp: 0.4.1 js-cookie: 3.0.5 @@ -9598,11 +9841,11 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@clerk/testing@1.7.4(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@clerk/testing@1.7.5(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@clerk/backend': 1.33.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@clerk/shared': 3.9.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@clerk/types': 4.59.2 + '@clerk/backend': 1.34.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/shared': 3.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/types': 4.59.3 dotenv: 16.4.7 optionalDependencies: '@playwright/test': 1.52.0 @@ -9611,12 +9854,12 @@ snapshots: - react-dom - svix - '@clerk/themes@2.2.47': + '@clerk/themes@2.2.48': dependencies: - '@clerk/types': 4.59.2 + '@clerk/types': 4.59.3 tslib: 2.8.1 - '@clerk/types@4.59.2': + '@clerk/types@4.59.3': dependencies: csstype: 3.1.3 @@ -10127,27 +10370,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10176,7 +10419,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -10194,7 +10437,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.23 + '@types/node': 22.15.27 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -10216,7 +10459,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.15.23 + '@types/node': 22.15.27 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -10286,7 +10529,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.23 + '@types/node': 22.15.27 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10365,41 +10608,41 @@ snapshots: '@msgpack/msgpack@2.8.0': {} - '@next/bundle-analyzer@15.3.2': + '@next/bundle-analyzer@15.3.3': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@15.3.2': {} + '@next/env@15.3.3': {} - '@next/eslint-plugin-next@15.3.2': + '@next/eslint-plugin-next@15.3.3': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.3.2': + '@next/swc-darwin-arm64@15.3.3': optional: true - '@next/swc-darwin-x64@15.3.2': + '@next/swc-darwin-x64@15.3.3': optional: true - '@next/swc-linux-arm64-gnu@15.3.2': + '@next/swc-linux-arm64-gnu@15.3.3': optional: true - '@next/swc-linux-arm64-musl@15.3.2': + '@next/swc-linux-arm64-musl@15.3.3': optional: true - '@next/swc-linux-x64-gnu@15.3.2': + '@next/swc-linux-x64-gnu@15.3.3': optional: true - '@next/swc-linux-x64-musl@15.3.2': + '@next/swc-linux-x64-musl@15.3.3': optional: true - '@next/swc-win32-arm64-msvc@15.3.2': + '@next/swc-win32-arm64-msvc@15.3.3': optional: true - '@next/swc-win32-x64-msvc@15.3.2': + '@next/swc-win32-x64-msvc@15.3.3': optional: true '@noble/ciphers@1.3.0': {} @@ -11501,7 +11744,7 @@ snapshots: '@sentry/core@9.23.0': {} - '@sentry/nextjs@9.23.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': + '@sentry/nextjs@9.23.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.34.0 @@ -11514,7 +11757,7 @@ snapshots: '@sentry/vercel-edge': 9.23.0 '@sentry/webpack-plugin': 3.5.0(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) chalk: 3.0.0 - next: 15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) resolve: 1.22.8 rollup: 4.35.0 stacktrace-parser: 0.1.11 @@ -11819,7 +12062,7 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/nextjs@8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': + '@storybook/nextjs@8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': dependencies: '@babel/core': 7.27.3 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.3) @@ -11845,11 +12088,11 @@ snapshots: find-up: 5.0.0 image-size: 1.2.1 loader-utils: 3.3.1 - next: 15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) node-polyfill-webpack-plugin: 2.0.1(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) pnp-webpack-plugin: 1.7.0(typescript@5.8.3) - postcss: 8.5.3 - postcss-loader: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) + postcss: 8.5.4 + postcss-loader: 8.1.1(postcss@8.5.4)(typescript@5.8.3)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-refresh: 0.14.2 @@ -11949,7 +12192,7 @@ snapshots: '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.5.3)) typescript: 5.8.3 - '@storybook/test-runner@0.22.0(@types/node@22.15.23)(storybook@8.6.14(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3))': + '@storybook/test-runner@0.22.0(@types/node@22.15.27)(storybook@8.6.14(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3))': dependencies: '@babel/core': 7.27.3 '@babel/generator': 7.27.3 @@ -11960,14 +12203,14 @@ snapshots: '@swc/core': 1.11.29 '@swc/jest': 0.2.38(@swc/core@1.11.29) expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + jest: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-junit: 16.0.0 - jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3))) + jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3))) jest-runner: 29.7.0 jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3))) + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3))) nyc: 15.1.0 playwright: 1.52.0 storybook: 8.6.14(prettier@3.5.3) @@ -12058,19 +12301,19 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@t3-oss/env-core@0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.32)': + '@t3-oss/env-core@0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.41)': optionalDependencies: arktype: 2.1.20 typescript: 5.8.3 - zod: 3.25.32 + zod: 3.25.41 - '@t3-oss/env-nextjs@0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.32)': + '@t3-oss/env-nextjs@0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.41)': dependencies: - '@t3-oss/env-core': 0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.32) + '@t3-oss/env-core': 0.13.6(arktype@2.1.20)(typescript@5.8.3)(zod@3.25.41) optionalDependencies: arktype: 2.1.20 typescript: 5.8.3 - zod: 3.25.32 + zod: 3.25.41 '@tailwindcss/node@4.1.8': dependencies: @@ -12141,14 +12384,14 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.1.8 '@tailwindcss/oxide': 4.1.8 - postcss: 8.5.3 + postcss: 8.5.4 tailwindcss: 4.1.8 - '@tanstack/query-core@5.77.2': {} + '@tanstack/query-core@5.79.0': {} - '@tanstack/react-query@5.77.2(react@19.1.0)': + '@tanstack/react-query@5.79.0(react@19.1.0)': dependencies: - '@tanstack/query-core': 5.77.2 + '@tanstack/query-core': 5.79.0 react: 19.1.0 '@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': @@ -12246,12 +12489,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 - optional: true '@types/doctrine@0.0.9': {} @@ -12265,13 +12507,21 @@ snapshots: '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.7 + '@types/estree@1.0.6': {} '@types/estree@1.0.7': {} '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 '@types/html-minifier-terser@6.1.0': {} @@ -12289,18 +12539,21 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/mdx@2.0.13': {} '@types/minimist@1.2.5': {} - '@types/ms@2.1.0': - optional: true + '@types/ms@2.1.0': {} '@types/mysql@2.15.26': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 - '@types/node@22.15.23': + '@types/node@22.15.27': dependencies: undici-types: 6.21.0 @@ -12314,13 +12567,13 @@ snapshots: '@types/pg@8.15.2': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 pg-protocol: 1.10.0 pg-types: 4.0.2 '@types/pg@8.6.1': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 pg-protocol: 1.10.0 pg-types: 2.2.0 @@ -12340,13 +12593,17 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} '@types/uuid@9.0.8': {} '@types/wait-on@5.3.4': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 '@types/yargs-parser@21.0.3': {} @@ -12356,7 +12613,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 optional: true '@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': @@ -12451,7 +12708,9 @@ snapshots: '@typescript-eslint/types': 8.33.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-react@4.5.0(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@4.5.0(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.3 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.3) @@ -12459,11 +12718,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.9 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.1.4(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/coverage-v8@3.1.4(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12477,7 +12736,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -12495,13 +12754,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.4(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.1.4(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.1.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -12775,7 +13034,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -12784,7 +13043,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -12793,21 +13052,21 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -12816,7 +13075,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -12855,14 +13114,14 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.21(postcss@8.5.3): + autoprefixer@10.4.21(postcss@8.5.4): dependencies: - browserslist: 4.24.5 - caniuse-lite: 1.0.30001718 + browserslist: 4.25.0 + caniuse-lite: 1.0.30001720 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.4 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -12963,6 +13222,8 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.3) + bail@2.0.2: {} + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -13051,12 +13312,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.24.5: + browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001718 - electron-to-chromium: 1.5.159 + caniuse-lite: 1.0.30001720 + electron-to-chromium: 1.5.161 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.5) + update-browserslist-db: 1.1.3(browserslist@4.25.0) bser@2.1.1: dependencies: @@ -13122,10 +13383,12 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001718: {} + caniuse-lite@1.0.30001720: {} case-sensitive-paths-webpack-plugin@2.4.0: {} + ccount@2.0.1: {} + chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -13158,6 +13421,14 @@ snapshots: char-regex@2.0.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + check-error@2.1.1: {} check-more-types@2.24.0: {} @@ -13268,6 +13539,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} commander@12.1.0: {} @@ -13308,7 +13581,7 @@ snapshots: core-js-compat@3.42.0: dependencies: - browserslist: 4.24.5 + browserslist: 4.25.0 core-js-pure@3.42.0: {} @@ -13364,13 +13637,13 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - create-jest@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13421,12 +13694,12 @@ snapshots: css-loader@6.11.0(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.3) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.3) - postcss-modules-scope: 3.2.1(postcss@8.5.3) - postcss-modules-values: 4.0.0(postcss@8.5.3) + icss-utils: 5.1.0(postcss@8.5.4) + postcss: 8.5.4 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.4) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.4) + postcss-modules-scope: 3.2.1(postcss@8.5.4) + postcss-modules-values: 4.0.0(postcss@8.5.4) postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: @@ -13507,6 +13780,10 @@ snapshots: decimal.js@10.5.0: {} + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + dedent@0.7.0: {} dedent@1.6.0: {} @@ -13556,6 +13833,10 @@ snapshots: detect-node-es@1.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff-sequences@29.6.3: {} diff@4.0.2: @@ -13652,10 +13933,10 @@ snapshots: pg: 8.15.6 postgres: 3.4.7 - drizzle-zod@0.7.1(drizzle-orm@0.43.1(@electric-sql/pglite@0.3.0)(@libsql/client-wasm@0.15.5)(@opentelemetry/api@1.9.0)(@types/pg@8.15.2)(pg@8.15.6)(postgres@3.4.7))(zod@3.25.32): + drizzle-zod@0.7.1(drizzle-orm@0.43.1(@electric-sql/pglite@0.3.0)(@libsql/client-wasm@0.15.5)(@opentelemetry/api@1.9.0)(@types/pg@8.15.2)(pg@8.15.6)(postgres@3.4.7))(zod@3.25.41): dependencies: drizzle-orm: 0.43.1(@electric-sql/pglite@0.3.0)(@libsql/client-wasm@0.15.5)(@opentelemetry/api@1.9.0)(@types/pg@8.15.2)(pg@8.15.6)(postgres@3.4.7) - zod: 3.25.32 + zod: 3.25.41 dunder-proto@1.0.1: dependencies: @@ -13674,7 +13955,7 @@ snapshots: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 - electron-to-chromium@1.5.159: {} + electron-to-chromium@1.5.161: {} elliptic@6.6.1: dependencies: @@ -13729,7 +14010,7 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.23.10: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -13758,7 +14039,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -13773,6 +14056,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -13792,7 +14076,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -14021,6 +14305,8 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -14082,6 +14368,8 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + extend@3.0.2: {} + extract-zip@2.0.1: dependencies: debug: 4.4.1 @@ -14461,6 +14749,30 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.7 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + he@1.2.0: {} help-me@5.0.0: {} @@ -14507,6 +14819,8 @@ snapshots: relateurl: 0.2.7 terser: 5.40.0 + html-url-attributes@3.0.1: {} + html-webpack-plugin@5.6.3(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -14593,9 +14907,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.3): + icss-utils@5.1.0(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 ieee754@1.2.1: {} @@ -14637,6 +14951,8 @@ snapshots: ini@1.3.8: {} + inline-style-parser@0.2.4: {} + inline-style-prefixer@7.0.1: dependencies: css-in-js-utils: 3.1.0 @@ -14659,6 +14975,13 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-arguments@1.2.0: dependencies: call-bound: 1.0.4 @@ -14713,6 +15036,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} + is-docker@2.2.1: {} is-extglob@2.1.1: {} @@ -14742,6 +15067,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-map@2.0.3: {} is-nan@1.3.2: @@ -14749,6 +15076,8 @@ snapshots: call-bind: 1.0.8 define-properties: 1.2.1 + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -14758,6 +15087,8 @@ snapshots: is-plain-obj@1.1.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@5.0.0: {} is-potential-custom-element-name@1.0.1: {} @@ -14927,7 +15258,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -14947,16 +15278,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14966,7 +15297,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)): dependencies: '@babel/core': 7.27.3 '@jest/test-sequencer': 29.7.0 @@ -14991,8 +15322,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.15.23 - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3) + '@types/node': 22.15.27 + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -15021,7 +15352,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -15031,7 +15362,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.23 + '@types/node': 22.15.27 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -15077,13 +15408,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 jest-util: 29.7.0 - jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3))): + jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3))): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + jest: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-process-manager: 0.4.0 @@ -15144,7 +15475,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -15172,7 +15503,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -15222,7 +15553,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15237,11 +15568,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3))): + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3))): dependencies: ansi-escapes: 6.2.1 chalk: 5.4.1 - jest: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + jest: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -15252,7 +15583,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.23 + '@types/node': 22.15.27 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -15261,23 +15592,23 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)): + jest@29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.23)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@22.15.27)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15517,6 +15848,8 @@ snapshots: loglevel@1.9.2: {} + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -15590,6 +15923,95 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdn-data@2.0.14: {} memfs@3.5.3: @@ -15621,6 +16043,139 @@ snapshots: merge2@1.4.1: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -15716,11 +16271,11 @@ snapshots: netmask@2.0.2: {} - next-intl@4.1.0(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3): + next-intl@4.1.0(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 negotiator: 1.0.0 - next: 15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 use-intl: 4.1.0(react@19.1.0) optionalDependencies: @@ -15731,34 +16286,34 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next-typesafe-url@5.1.7(next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(zod@3.25.32): + next-typesafe-url@5.1.7(next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(zod@3.25.41): dependencies: chokidar: 3.6.0 meow: 9.0.0 - next: 15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 - zod: 3.25.32 + zod: 3.25.41 - next@15.3.2(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.3.3(@babel/core@7.27.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.3.2 + '@next/env': 15.3.3 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001718 + caniuse-lite: 1.0.30001720 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) styled-jsx: 5.1.6(@babel/core@7.27.3)(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.2 - '@next/swc-darwin-x64': 15.3.2 - '@next/swc-linux-arm64-gnu': 15.3.2 - '@next/swc-linux-arm64-musl': 15.3.2 - '@next/swc-linux-x64-gnu': 15.3.2 - '@next/swc-linux-x64-musl': 15.3.2 - '@next/swc-win32-arm64-msvc': 15.3.2 - '@next/swc-win32-x64-msvc': 15.3.2 + '@next/swc-darwin-arm64': 15.3.3 + '@next/swc-darwin-x64': 15.3.3 + '@next/swc-linux-arm64-gnu': 15.3.3 + '@next/swc-linux-arm64-musl': 15.3.3 + '@next/swc-linux-x64-gnu': 15.3.3 + '@next/swc-linux-x64-musl': 15.3.3 + '@next/swc-win32-arm64-msvc': 15.3.3 + '@next/swc-win32-x64-msvc': 15.3.3 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.52.0 sharp: 0.34.2 @@ -15921,7 +16476,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.values@1.2.1: @@ -16055,6 +16610,16 @@ snapshots: pbkdf2: 3.1.2 safe-buffer: 5.2.1 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.1.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@4.0.0: dependencies: error-ex: 1.3.2 @@ -16269,37 +16834,37 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)): + postcss-loader@8.1.1(postcss@8.5.4)(typescript@5.8.3)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 - postcss: 8.5.3 + postcss: 8.5.4 semver: 7.7.2 optionalDependencies: webpack: 5.99.9(@swc/core@1.11.29)(esbuild@0.25.5) transitivePeerDependencies: - typescript - postcss-modules-extract-imports@3.1.0(postcss@8.5.3): + postcss-modules-extract-imports@3.1.0(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 - postcss-modules-local-by-default@4.2.0(postcss@8.5.3): + postcss-modules-local-by-default@4.2.0(postcss@8.5.4): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 + icss-utils: 5.1.0(postcss@8.5.4) + postcss: 8.5.4 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.3): + postcss-modules-scope@3.2.1(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.3): + postcss-modules-values@4.0.0(postcss@8.5.4): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 + icss-utils: 5.1.0(postcss@8.5.4) + postcss: 8.5.4 postcss-selector-parser@7.1.0: dependencies: @@ -16314,7 +16879,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.3: + postcss@8.5.4: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -16388,6 +16953,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@7.1.0: {} + proxy-from-env@1.1.0: {} ps-tree@1.2.0: @@ -16475,6 +17042,24 @@ snapshots: react-is@18.3.1: {} + react-markdown@10.1.0(@types/react@19.1.6)(react@19.1.0): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.1.6 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react-refresh@0.14.2: {} react-refresh@0.17.0: {} @@ -16598,7 +17183,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -16643,6 +17228,23 @@ snapshots: dependencies: es6-error: 4.1.1 + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + renderkid@3.0.0: dependencies: css-select: 4.3.0 @@ -16689,7 +17291,7 @@ snapshots: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.5.3 + postcss: 8.5.4 source-map: 0.6.1 resolve.exports@2.0.3: {} @@ -17093,6 +17695,8 @@ snapshots: source-map@0.7.4: {} + space-separated-tokens@2.0.2: {} + spawn-wrap@2.0.0: dependencies: foreground-child: 2.0.0 @@ -17179,6 +17783,11 @@ snapshots: std-env@3.9.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + storybook@8.6.14(prettier@3.5.3): dependencies: '@storybook/core': 8.6.14(prettier@3.5.3)(storybook@8.6.14(prettier@3.5.3)) @@ -17242,7 +17851,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -17257,13 +17866,13 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -17271,7 +17880,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -17296,6 +17905,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -17320,16 +17934,24 @@ snapshots: strip-json-comments@3.1.1: {} - stripe@18.1.1(@types/node@22.15.23): + stripe@18.2.0(@types/node@22.15.27): dependencies: qs: 6.14.0 optionalDependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 style-loader@3.3.4(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)): dependencies: webpack: 5.99.9(@swc/core@1.11.29)(esbuild@0.25.5) + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + styled-jsx@5.1.6(@babel/core@7.27.3)(react@19.1.0): dependencies: client-only: 0.0.1 @@ -17479,8 +18101,12 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + trim-newlines@3.0.1: {} + trough@2.2.0: {} + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -17489,14 +18115,14 @@ snapshots: ts-easing@0.2.0: {} - ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.23)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.15.27)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.15.23 + '@types/node': 22.15.27 acorn: 8.14.1 acorn-walk: 8.3.4 arg: 4.1.3 @@ -17569,7 +18195,7 @@ snapshots: turbo-windows-64: 2.5.3 turbo-windows-arm64: 2.5.3 - tw-animate-css@1.3.0: {} + tw-animate-css@1.3.2: {} type-check@0.4.0: dependencies: @@ -17662,10 +18288,43 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + union@0.5.0: dependencies: qs: 6.14.0 + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universalify@2.0.1: {} unplugin@1.0.1: @@ -17680,9 +18339,9 @@ snapshots: acorn: 8.14.1 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.1.3(browserslist@4.24.5): + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: - browserslist: 4.24.5 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -17764,13 +18423,23 @@ snapshots: - '@types/react' - '@types/react-dom' - vite-node@3.1.4(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite-node@3.1.4(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -17785,27 +18454,27 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): + vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.3 + postcss: 8.5.4 rollup: 4.41.1 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.15.23 + '@types/node': 22.15.27 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -17813,16 +18482,16 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 - vitest-fail-on-console@0.7.1(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): + vitest-fail-on-console@0.7.1(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): dependencies: chalk: 5.3.0 - vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) - vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.23)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.27)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.4(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.1.4(vite@6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.1.4 '@vitest/runner': 3.1.4 '@vitest/snapshot': 3.1.4 @@ -17839,12 +18508,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.1.4(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.1.4(@types/node@22.15.27)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.15.23 + '@types/node': 22.15.27 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -17957,7 +18626,7 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.1 - browserslist: 4.24.5 + browserslist: 4.25.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 es-module-lexer: 1.7.0 @@ -18170,4 +18839,6 @@ snapshots: yocto-queue@1.2.1: {} - zod@3.25.32: {} + zod@3.25.41: {} + + zwitch@2.0.4: {} diff --git a/src/actions/analytics.ts b/src/actions/analytics/events.ts similarity index 94% rename from src/actions/analytics.ts rename to src/actions/analytics/events.ts index 6bd71db3a3..98989f2243 100644 --- a/src/actions/analytics.ts +++ b/src/actions/analytics/events.ts @@ -8,6 +8,7 @@ import { } from '@roo-code/types'; import type { TimePeriod } from '@/types'; +import { type Task, taskSchema } from '@/types/analytics'; import { analytics } from '@/lib/server'; import { type User, getUsersById } from '@/db/server'; @@ -224,26 +225,11 @@ export const getModelUsage = async ({ * getTasks */ -const taskSchema = z.object({ - taskId: z.string(), - userId: z.string(), - provider: z.string(), - model: z.string(), - completed: z.coerce.boolean(), - tokens: z.coerce.number(), - cost: z.coerce.number(), - timestamp: z.coerce.number(), -}); - -export type Task = z.infer & { - user: User; -}; - export const getTasks = async ({ orgId, }: { orgId?: string | null; -}): Promise => { +}): Promise<(Task & { user: User })[]> => { if (!orgId) { return []; } @@ -283,5 +269,5 @@ export const getTasks = async ({ return tasks .map((usage) => ({ ...usage, user: users[usage.userId] })) - .filter((usage): usage is Task => !!usage.user); + .filter((usage): usage is Task & { user: User } => !!usage.user); }; diff --git a/src/actions/analytics/index.ts b/src/actions/analytics/index.ts new file mode 100644 index 0000000000..aae29d87d5 --- /dev/null +++ b/src/actions/analytics/index.ts @@ -0,0 +1,2 @@ +export * from './events'; +export * from './messages'; diff --git a/src/actions/analytics/messages.ts b/src/actions/analytics/messages.ts new file mode 100644 index 0000000000..a7c0afa1ff --- /dev/null +++ b/src/actions/analytics/messages.ts @@ -0,0 +1,25 @@ +'use server'; + +import { z } from 'zod'; + +import { messageSchema, type Message } from '@/types/analytics'; +import { analytics } from '@/lib/server'; + +/** + * getMessages + */ + +export const getMessages = async (taskId: string): Promise => { + const results = await analytics.query({ + query: ` + SELECT * + FROM messages + WHERE taskId = {taskId: String} + ORDER BY ts ASC + `, + format: 'JSONEachRow', + query_params: { taskId }, + }); + + return z.array(messageSchema).parse(await results.json()); +}; diff --git a/src/app/(authenticated)/usage/Messages.tsx b/src/app/(authenticated)/usage/Messages.tsx new file mode 100644 index 0000000000..9143602b8e --- /dev/null +++ b/src/app/(authenticated)/usage/Messages.tsx @@ -0,0 +1,61 @@ +import { useMemo } from 'react'; +import ReactMarkdown from 'react-markdown'; + +import type { Message } from '@/types/analytics'; +import { cn } from '@/lib/utils'; +import { formatTimestamp } from '@/lib/formatters'; + +type MessagesProps = { + messages: Message[]; +}; + +export const Messages = ({ messages }: MessagesProps) => { + const conversation = useMemo( + () => + messages + .filter(isVisible) + .map((message, index) => decorate({ message, index })), + [messages], + ); + + return ( +
+ {conversation.map((message) => ( +
+
+
{message.name}
+
·
+
{message.timestamp}
+
+
+ {message.text} +
+
+ ))} +
+ ); +}; + +const decorate = ({ message, index }: { message: Message; index: number }) => { + const role = + index === 0 || message.say === 'user_feedback' ? 'user' : 'assistant'; + + const name = role === 'user' ? 'User' : 'Roo Code'; + const timestamp = formatTimestamp(message.timestamp); + + return { ...message, role, name, timestamp }; +}; + +const isVisible = (message: Message) => + (message.ask === 'text' || + message.say === 'text' || + message.say === 'completion_result' || + message.say === 'user_feedback') && + typeof message.text === 'string' && + message.text.length > 0; diff --git a/src/app/(authenticated)/usage/TaskDrawer.tsx b/src/app/(authenticated)/usage/TaskDrawer.tsx index 5e6dd99802..7d34ceec90 100644 --- a/src/app/(authenticated)/usage/TaskDrawer.tsx +++ b/src/app/(authenticated)/usage/TaskDrawer.tsx @@ -1,6 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; import { X } from 'lucide-react'; -import type { Task } from '@/actions/analytics'; +import type { User } from '@/db/server'; +import type { Task } from '@/types/analytics'; +import { getMessages } from '@/actions/analytics'; import { formatCurrency, formatNumber } from '@/lib/formatters'; import { Drawer, @@ -12,114 +15,78 @@ import { } from '@/components/ui'; import { Status } from './Status'; +import { Messages } from './Messages'; type TaskDrawerProps = { - task: Task; + task: Task & { user: User }; onClose: () => void; }; -export const TaskDrawer = ({ task, onClose }: TaskDrawerProps) => ( - - - - Task - {task.taskId} -
- -
-
-
-
-
- Developer - {task.user.name} -
-
- Provider - {task.provider} -
-
- Model - {task.model} -
-
- Tokens - - {formatNumber(task.tokens)} - -
-
- Cost - - {formatCurrency(task.cost)} - -
-
- Date - - {new Date(task.timestamp * 1000).toLocaleString()} - -
-
- Status - -
-
+export const TaskDrawer = ({ task, onClose }: TaskDrawerProps) => { + const { data: messages } = useQuery({ + queryKey: ['messages', task.taskId], + queryFn: () => getMessages(task.taskId), + }); -

Conversation

-
- {conversation.map((message) => ( -
-
- {message.role.charAt(0).toUpperCase() + message.role.slice(1)} • - {message.timestamp.toLocaleTimeString()} -
-
{message.content}
+ return ( + + + + Task + {task.taskId} +
+ +
+
+
+
+
+ Developer + {task.user.name}
- ))} +
+ Provider + + {task.provider} + +
+
+ Model + {task.model} +
+
+ Tokens + + {formatNumber(task.tokens)} + +
+
+ Cost + + {formatCurrency(task.cost)} + +
+
+ Date + + {new Date(task.timestamp * 1000).toLocaleString()} + +
+
+ Status + +
+
+ {typeof messages !== 'undefined' && messages.length > 0 && ( + <> +

Conversation

+ + + )}
-
- - -); - -const conversation = [ - { - id: 'msg1', - role: 'user', - content: - 'Create a React component that displays a list of items with pagination.', - timestamp: new Date('2025-05-01T10:00:00'), - }, - { - id: 'msg2', - role: 'assistant', - content: - "I'll create a React component for displaying a paginated list. Here's how we can implement it...", - timestamp: new Date('2025-05-01T10:00:30'), - }, - { - id: 'msg3', - role: 'user', - content: 'Can you add sorting functionality as well?', - timestamp: new Date('2025-05-01T10:02:00'), - }, - { - id: 'msg4', - role: 'assistant', - content: - "Certainly! I'll add sorting functionality to the component. Here's the updated implementation...", - timestamp: new Date('2025-05-01T10:02:30'), - }, -]; + + + ); +}; diff --git a/src/app/(authenticated)/usage/Tasks.tsx b/src/app/(authenticated)/usage/Tasks.tsx index 2619199e77..efcf69d93c 100644 --- a/src/app/(authenticated)/usage/Tasks.tsx +++ b/src/app/(authenticated)/usage/Tasks.tsx @@ -3,7 +3,9 @@ import type { ColumnDef } from '@tanstack/react-table'; import { useAuth } from '@clerk/nextjs'; import { useQuery } from '@tanstack/react-query'; -import { type Task, getTasks } from '@/actions/analytics'; +import type { User } from '@/db/server'; +import type { Task } from '@/types/analytics'; +import { getTasks } from '@/actions/analytics'; import { formatNumber, formatCurrency } from '@/lib/formatters'; import { Button, Skeleton } from '@/components/ui'; import { DataTable } from '@/components/layout/DataTable'; @@ -18,7 +20,7 @@ export const Tasks = ({ }: { filter: Filter | null; onFilter: (filter: Filter) => void; - onTaskSelected: (task: Task) => void; + onTaskSelected: (task: Task & { user: User }) => void; }) => { const { orgId } = useAuth(); @@ -40,7 +42,7 @@ export const Tasks = ({ ); }, [filter, data]); - const cols: ColumnDef[] = useMemo( + const cols: ColumnDef[] = useMemo( () => [ { header: 'Task ID', diff --git a/src/app/(authenticated)/usage/Usage.tsx b/src/app/(authenticated)/usage/Usage.tsx index c597b5ff54..f3e0c33715 100644 --- a/src/app/(authenticated)/usage/Usage.tsx +++ b/src/app/(authenticated)/usage/Usage.tsx @@ -4,7 +4,8 @@ import { useState, useCallback } from 'react'; import { useTranslations } from 'next-intl'; import { X } from 'lucide-react'; -import type { Task } from '@/actions/analytics'; +import type { User } from '@/db/server'; +import type { Task } from '@/types/analytics'; import { Badge, Button } from '@/components/ui'; import { UsageCard } from '@/components/usage'; @@ -18,7 +19,7 @@ export const Usage = () => { const t = useTranslations('Analytics'); const [viewMode, setViewMode] = useState('tasks'); const [filter, setFilter] = useState(null); - const [task, setTask] = useState(null); + const [task, setTask] = useState<(Task & { user: User }) | null>(null); const onFilter = useCallback((filter: Filter) => { setFilter(filter); @@ -61,7 +62,7 @@ export const Usage = () => { setTask(task)} + onTaskSelected={(task: Task & { user: User }) => setTask(task)} /> ) : viewMode === 'developers' ? ( diff --git a/src/app/globals.css b/src/app/globals.css index d44de4c113..b808ffaddd 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -217,3 +217,61 @@ letter-spacing: var(--tracking-normal); } } + +@layer components { + .markdown-prose { + & > * { + @apply mb-3; + } + & > *:last-child { + @apply mb-0; + } + & h1 { + @apply text-lg font-bold; + } + & h2 { + @apply text-base font-bold; + } + & h3 { + @apply font-semibold; + } + & h4, + & h5, + & h6 { + @apply font-medium; + } + & p { + @apply leading-relaxed; + } + & code { + @apply bg-muted px-1.5 py-0.5 rounded text-sm font-mono; + } + & pre { + @apply bg-muted p-3 rounded overflow-x-auto; + & code { + @apply bg-transparent p-0; + } + } + & blockquote { + @apply border-l-4 border-muted-foreground pl-4 italic; + } + & ul { + @apply list-disc ml-6; + } + & ol { + @apply list-decimal ml-6; + } + & li { + @apply mb-1; + } + & a { + @apply text-primary underline hover:no-underline; + } + & strong { + @apply font-semibold; + } + & em { + @apply italic; + } + } +} diff --git a/src/hooks/__tests__/useAuthState.test.ts b/src/hooks/__tests__/useAuthState.test.ts new file mode 100644 index 0000000000..ae7c107d37 --- /dev/null +++ b/src/hooks/__tests__/useAuthState.test.ts @@ -0,0 +1,320 @@ +// npx vitest run src/hooks/__tests__/useAuthState.test.ts + +import { renderHook, act } from '@testing-library/react'; +import { useSessionStorage, useMount } from 'react-use'; +import { useSearchParams } from 'next/navigation'; + +import { AuthStateParam } from '@/types'; +import { EXTENSION_URI_SCHEME } from '@/lib/constants'; + +import { useAuthState, useSetAuthState } from '../useAuthState'; + +const mockSetState = vi.fn(); +const mockSetAuthRedirect = vi.fn(); +const mockUseMount = vi.fn(); + +vi.mock('react-use', () => ({ + useSessionStorage: vi.fn(), + useMount: vi.fn(), +})); + +const mockSearchParams = new Map(); + +vi.mock('next/navigation', () => ({ + useSearchParams: vi.fn(() => ({ + get: (key: string) => mockSearchParams.get(key) || null, + })), +})); + +const mockedUseSessionStorage = vi.mocked(useSessionStorage); +const mockedUseMount = vi.mocked(useMount); +const mockedUseSearchParams = vi.mocked(useSearchParams); + +describe('useAuthState', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockSearchParams.clear(); + + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return [defaultValue, mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return [defaultValue, mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + mockedUseMount.mockImplementation(mockUseMount); + + mockedUseSearchParams.mockReturnValue({ + get: (key: string) => mockSearchParams.get(key) || null, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any); + }); + + describe('initialization', () => { + it('should initialize with undefined values when no search params are present', () => { + const { result } = renderHook(() => useAuthState()); + + expect(result.current.state).toBeUndefined(); + expect(result.current.authRedirect).toBeUndefined(); + expect(result.current.params).toBeUndefined(); + expect(typeof result.current.set).toBe('function'); + }); + + it('should initialize with values from search params', () => { + mockSearchParams.set(AuthStateParam.State, 'test-state'); + mockSearchParams.set(AuthStateParam.AuthRedirect, 'test-redirect'); + + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return ['test-state', mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return ['test-redirect', mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + const { result } = renderHook(() => useAuthState()); + + expect(result.current.state).toBe('test-state'); + expect(result.current.authRedirect).toBe('test-redirect'); + expect(result.current.params).toBeInstanceOf(URLSearchParams); + expect(result.current.params?.get(AuthStateParam.State)).toBe( + 'test-state', + ); + expect(result.current.params?.get(AuthStateParam.AuthRedirect)).toBe( + 'test-redirect', + ); + }); + + it('should use EXTENSION_URI_SCHEME as default authRedirect in params when authRedirect is undefined', () => { + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return ['test-state', mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return [undefined, mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + const { result } = renderHook(() => useAuthState()); + + expect(result.current.state).toBe('test-state'); + expect(result.current.authRedirect).toBeUndefined(); + expect(result.current.params).toBeInstanceOf(URLSearchParams); + expect(result.current.params?.get(AuthStateParam.State)).toBe( + 'test-state', + ); + expect(result.current.params?.get(AuthStateParam.AuthRedirect)).toBe( + EXTENSION_URI_SCHEME, + ); + }); + }); + + describe('params generation', () => { + it('should not generate params when state is undefined', () => { + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return [undefined, mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return ['test-redirect', mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + const { result } = renderHook(() => useAuthState()); + + expect(result.current.state).toBeUndefined(); + expect(result.current.authRedirect).toBe('test-redirect'); + expect(result.current.params).toBeUndefined(); + }); + + it('should generate params when state is defined', () => { + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return ['test-state', mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return ['test-redirect', mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + const { result } = renderHook(() => useAuthState()); + + expect(result.current.params).toBeInstanceOf(URLSearchParams); + expect(result.current.params?.get(AuthStateParam.State)).toBe( + 'test-state', + ); + expect(result.current.params?.get(AuthStateParam.AuthRedirect)).toBe( + 'test-redirect', + ); + }); + }); + + describe('set function', () => { + it('should call setState and setAuthRedirect with correct values', () => { + const { result } = renderHook(() => useAuthState()); + + const newAuthState = { + state: 'new-state', + authRedirect: 'new-redirect', + }; + + act(() => { + result.current.set(newAuthState); + }); + + expect(mockSetState).toHaveBeenCalledWith('new-state'); + expect(mockSetAuthRedirect).toHaveBeenCalledWith('new-redirect'); + }); + + it('should handle undefined values in set function', () => { + const { result } = renderHook(() => useAuthState()); + + const newAuthState = { + state: undefined, + authRedirect: undefined, + }; + + act(() => { + result.current.set(newAuthState); + }); + + expect(mockSetState).toHaveBeenCalledWith(undefined); + expect(mockSetAuthRedirect).toHaveBeenCalledWith(undefined); + }); + }); + + describe('return value structure', () => { + it('should return all expected properties', () => { + const { result } = renderHook(() => useAuthState()); + + expect(result.current).toHaveProperty('state'); + expect(result.current).toHaveProperty('authRedirect'); + expect(result.current).toHaveProperty('params'); + expect(result.current).toHaveProperty('set'); + expect(typeof result.current.set).toBe('function'); + }); + }); +}); + +describe('useSetAuthState', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockSearchParams.clear(); + + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return [defaultValue, mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return [defaultValue, mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + mockedUseMount.mockImplementation((callback) => { + mockUseMount.mockImplementation(callback); + }); + + mockedUseSearchParams.mockReturnValue({ + get: (key: string) => mockSearchParams.get(key) || null, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any); + }); + + it('should not call set when state is undefined', () => { + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return [undefined, mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return [undefined, mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + renderHook(() => useSetAuthState()); + + expect(mockedUseMount).toHaveBeenCalled(); + + // Execute the mount callback + const mountCallback = mockedUseMount.mock.calls[0]?.[0]; + expect(mountCallback).toBeDefined(); + mountCallback?.(); + + expect(mockSetState).not.toHaveBeenCalled(); + expect(mockSetAuthRedirect).not.toHaveBeenCalled(); + }); + + it('should call set when state is defined', () => { + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return ['test-state', mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return ['test-redirect', mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + renderHook(() => useSetAuthState()); + + expect(mockedUseMount).toHaveBeenCalled(); + + // Execute the mount callback + const mountCallback = mockedUseMount.mock.calls[0]?.[0]; + expect(mountCallback).toBeDefined(); + mountCallback?.(); + + expect(mockSetState).toHaveBeenCalledWith('test-state'); + expect(mockSetAuthRedirect).toHaveBeenCalledWith('test-redirect'); + }); + + it('should use EXTENSION_URI_SCHEME as default authRedirect when undefined', () => { + mockedUseSessionStorage.mockImplementation( + (key: string, defaultValue: unknown) => { + if (key === AuthStateParam.State) { + return ['test-state', mockSetState]; + } + if (key === AuthStateParam.AuthRedirect) { + return [undefined, mockSetAuthRedirect]; + } + return [defaultValue, vi.fn()]; + }, + ); + + renderHook(() => useSetAuthState()); + + expect(mockedUseMount).toHaveBeenCalled(); + + const mountCallback = mockedUseMount.mock.calls[0]?.[0]; + expect(mountCallback).toBeDefined(); + mountCallback?.(); + + expect(mockSetState).toHaveBeenCalledWith('test-state'); + expect(mockSetAuthRedirect).toHaveBeenCalledWith(EXTENSION_URI_SCHEME); + }); +}); diff --git a/src/lib/formatters.ts b/src/lib/formatters.ts index 0ac0d59b18..de5b7d2724 100644 --- a/src/lib/formatters.ts +++ b/src/lib/formatters.ts @@ -50,3 +50,6 @@ export function formatCurrency( maximumFractionDigits: 2, }).format(value); } + +export const formatTimestamp = (timestamp: number) => + new Date(timestamp * 1000).toLocaleString(); diff --git a/src/types/analytics/index.ts b/src/types/analytics/index.ts new file mode 100644 index 0000000000..60a0e684e4 --- /dev/null +++ b/src/types/analytics/index.ts @@ -0,0 +1,2 @@ +export * from './message'; +export * from './task'; diff --git a/src/types/analytics/message.ts b/src/types/analytics/message.ts new file mode 100644 index 0000000000..191469807d --- /dev/null +++ b/src/types/analytics/message.ts @@ -0,0 +1,18 @@ +import { z } from 'zod'; + +export const messageSchema = z.object({ + id: z.string(), + orgId: z.string(), + userId: z.string(), + taskId: z.string(), + ts: z.number(), + type: z.enum(['ask', 'say']), + ask: z.string().nullable(), + say: z.string().nullable(), + text: z.string().nullable(), + reasoning: z.string().nullable(), + partial: z.boolean().nullable(), + timestamp: z.number(), +}); + +export type Message = z.infer; diff --git a/src/types/analytics/task.ts b/src/types/analytics/task.ts new file mode 100644 index 0000000000..3c277968d1 --- /dev/null +++ b/src/types/analytics/task.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; + +export const taskSchema = z.object({ + taskId: z.string(), + userId: z.string(), + provider: z.string(), + model: z.string(), + completed: z.coerce.boolean(), + tokens: z.coerce.number(), + cost: z.coerce.number(), + timestamp: z.coerce.number(), +}); + +export type Task = z.infer; diff --git a/vitest-global-setup.ts b/vitest-global-setup.ts index e9baf7dcc3..91e1740321 100644 --- a/vitest-global-setup.ts +++ b/vitest-global-setup.ts @@ -4,12 +4,18 @@ import { Env } from '@/lib/server'; import { testDb, disconnect } from '@/db/server'; async function resetTestDatabase() { - const db = testDb!; + const db = testDb; + + // Skip database reset if no database connection is available + if (!db) { + console.log('No database connection available, skipping database reset'); + return; + } try { const tables = await db.execute<{ table_name: string }>(sql` - SELECT table_name - FROM information_schema.tables + SELECT table_name + FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE'; `); diff --git a/vitest.config.mts b/vitest.config.mts index 08626c5a23..8f9b8aee73 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -1,18 +1,10 @@ -import react from '@vitejs/plugin-react'; -import tsconfigPaths from 'vite-tsconfig-paths'; import { defineConfig } from 'vitest/config'; export default defineConfig({ - plugins: [react(), tsconfigPaths()], test: { - globals: true, // This is needed by @testing-library to be cleaned up after each test. - include: ['src/**/*.test.{js,jsx,ts,tsx}'], coverage: { include: ['src/**/*'], exclude: ['src/**/*.stories.{js,jsx,ts,tsx}', '**/*.d.ts'], }, - environment: 'node', // jsdom - setupFiles: './vitest-setup.ts', - globalSetup: './vitest-global-setup.ts', }, }); diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 0000000000..eaef921fba --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,37 @@ +import { defineWorkspace } from 'vitest/config'; +import react from '@vitejs/plugin-react'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +export default defineWorkspace([ + // Server-side tests (node environment). + { + plugins: [react(), tsconfigPaths()], + test: { + name: 'server', + globals: true, + include: [ + 'src/**/*.test.{js,jsx,ts,tsx}', + '!src/hooks/**/*.test.{js,jsx,ts,tsx}', // Exclude hooks tests. + '!src/components/**/*.test.{js,jsx,ts,tsx}', // Exclude component tests. + ], + environment: 'node', + setupFiles: './vitest-setup.ts', + globalSetup: './vitest-global-setup.ts', + }, + }, + // Client-side tests (jsdom environment). + { + plugins: [react(), tsconfigPaths()], + test: { + name: 'client', + globals: true, + include: [ + 'src/hooks/**/*.test.{js,jsx,ts,tsx}', + 'src/components/**/*.test.{js,jsx,ts,tsx}', + ], + environment: 'jsdom', + setupFiles: './vitest-setup.ts', + // No globalSetup for client tests to avoid database connection issues. + }, + }, +]);