From c0adbad773049bb5eb813321875ca1bba23f774c Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 19 May 2025 13:23:06 +0200 Subject: [PATCH] chore: normalize line endings + remove old reservation-platform --- .gitattributes | 41 +- Dokumentation.md | 11 +- README.md | 2 +- backend/docs/README.md | 8 +- docs/Aufräumarbeiten.md | 52 +- docs/Entwicklungsrichtlinien.md | 24 +- packages/reservation-platform/.dockerignore | 27 - packages/reservation-platform/.gitignore | 43 - packages/reservation-platform/Dockerfile | 34 - packages/reservation-platform/README.md | 32 - packages/reservation-platform/biome.json | 19 - packages/reservation-platform/components.json | 17 - .../debug-server/package.json | 21 - .../debug-server/public/css/style.css | 1 - .../debug-server/public/views/index.ejs | 186 - .../debug-server/src/index.js | 471 - packages/reservation-platform/docker/build.sh | 31 - .../docker/caddy/Caddyfile | 37 - .../reservation-platform/docker/compose.yml | 30 - .../reservation-platform/docker/deploy.sh | 36 - .../docker/images/.gitattributes | 2 - .../docker/images/caddy_2.8.tar.xz | 3 - .../docker/images/myp-rp_latest.tar.xz | 3 - packages/reservation-platform/docker/save.sh | 68 - .../docs/Admin-Dashboard.md | 116 - .../reservation-platform/docs/Architektur.md | 79 - .../docs/Bereitstellungsdetails .md | 150 - .../reservation-platform/docs/Datenbank.md | 153 - .../reservation-platform/docs/Installation.md | 93 - packages/reservation-platform/docs/Nutzung.md | 75 - packages/reservation-platform/docs/README.md | 37 - .../reservation-platform/drizzle.config.ts | 12 - .../drizzle/0000_overjoyed_strong_guy.sql | 35 - .../drizzle/meta/0000_snapshot.json | 241 - .../drizzle/meta/_journal.json | 13 - packages/reservation-platform/next.config.mjs | 26 - packages/reservation-platform/package.json | 83 - packages/reservation-platform/pnpm-lock.yaml | 5707 ---------- .../reservation-platform/postcss.config.mjs | 8 - packages/reservation-platform/public/next.svg | 1 - .../reservation-platform/public/vercel.svg | 1 - .../reservation-platform/repomix-output.txt | 9279 ----------------- .../scripts/generate-data.js | 367 - .../reservation-platform/setup-backend-url.sh | 82 - .../src/app/admin/about/page.tsx | 32 - .../src/app/admin/admin-sidebar.tsx | 66 - .../app/admin/charts/printer-error-chart.tsx | 68 - .../app/admin/charts/printer-error-rate.tsx | 66 - .../src/app/admin/charts/printer-forecast.tsx | 83 - .../app/admin/charts/printer-utilization.tsx | 80 - .../src/app/admin/charts/printer-volume.tsx | 69 - .../src/app/admin/jobs/page.tsx | 35 - .../src/app/admin/layout.tsx | 34 - .../src/app/admin/page.tsx | 121 - .../src/app/admin/printers/columns.tsx | 86 - .../src/app/admin/printers/data-table.tsx | 135 - .../admin/printers/dialogs/create-printer.tsx | 26 - .../admin/printers/dialogs/delete-printer.tsx | 83 - .../admin/printers/dialogs/edit-printer.tsx | 30 - .../src/app/admin/printers/form.tsx | 204 - .../src/app/admin/printers/page.tsx | 31 - .../src/app/admin/settings/download/route.ts | 7 - .../src/app/admin/settings/page.tsx | 30 - .../src/app/admin/users/columns.tsx | 137 - .../src/app/admin/users/data-table.tsx | 135 - .../src/app/admin/users/dialog.tsx | 56 - .../src/app/admin/users/form.tsx | 212 - .../src/app/admin/users/page.tsx | 26 - .../api/job/[jobId]/remaining-time/route.ts | 41 - .../src/app/api/jobs/[id]/route.ts | 99 - .../src/app/api/jobs/route.ts | 59 - .../src/app/api/printers/route.ts | 27 - .../src/app/auth/login/callback/route.ts | 123 - .../src/app/auth/login/route.ts | 30 - .../reservation-platform/src/app/favicon.ico | Bin 169755 -> 0 bytes .../reservation-platform/src/app/globals.css | 61 - .../src/app/job/[jobId]/cancel-form.tsx | 132 - .../src/app/job/[jobId]/edit-comments.tsx | 56 - .../src/app/job/[jobId]/extend-form.tsx | 151 - .../src/app/job/[jobId]/finish-form.tsx | 87 - .../src/app/job/[jobId]/page.tsx | 123 - .../reservation-platform/src/app/layout.tsx | 36 - .../src/app/my/jobs/columns.tsx | 141 - .../src/app/my/jobs/data-table.tsx | 73 - .../src/app/my/profile/page.tsx | 47 - .../src/app/not-found.tsx | 11 - .../reservation-platform/src/app/page.tsx | 71 - .../app/printer/[printerId]/reserve/form.tsx | 169 - .../app/printer/[printerId]/reserve/page.tsx | 36 - .../src/components/data-card.tsx | 38 - .../src/components/data-table.tsx | 0 .../src/components/dynamic-printer-cards.tsx | 38 - .../src/components/header/index.tsx | 85 - .../src/components/header/navigation.tsx | 49 - .../src/components/login-button.tsx | 37 - .../src/components/logout-button.tsx | 23 - .../src/components/personalized-cards.tsx | 71 - .../components/printer-availability-badge.tsx | 25 - .../src/components/printer-card/countdown.tsx | 44 - .../src/components/printer-card/index.tsx | 87 - .../src/components/ui/alert-dialog.tsx | 141 - .../src/components/ui/alert.tsx | 59 - .../src/components/ui/avatar.tsx | 50 - .../src/components/ui/badge.tsx | 36 - .../src/components/ui/breadcrumb.tsx | 115 - .../src/components/ui/button.tsx | 57 - .../src/components/ui/card.tsx | 76 - .../src/components/ui/chart.tsx | 370 - .../src/components/ui/dialog.tsx | 122 - .../src/components/ui/dropdown-menu.tsx | 205 - .../src/components/ui/form.tsx | 176 - .../src/components/ui/hover-card.tsx | 29 - .../src/components/ui/input.tsx | 25 - .../src/components/ui/label.tsx | 26 - .../src/components/ui/scroll-area.tsx | 48 - .../src/components/ui/select.tsx | 164 - .../src/components/ui/skeleton.tsx | 15 - .../src/components/ui/sonner.tsx | 31 - .../src/components/ui/table.tsx | 120 - .../src/components/ui/tabs.tsx | 55 - .../src/components/ui/textarea.tsx | 24 - .../src/components/ui/toast.tsx | 129 - .../src/components/ui/toaster.tsx | 35 - .../src/components/ui/use-toast.ts | 194 - .../server/actions/authentication/logout.ts | 29 - .../src/server/actions/printJobs.ts | 305 - .../src/server/actions/printers.ts | 130 - .../src/server/actions/timer.ts | 7 - .../src/server/actions/user/delete.ts | 56 - .../src/server/actions/user/update.ts | 41 - .../src/server/actions/users.ts | 80 - .../src/server/auth/index.ts | 72 - .../src/server/auth/oauth.ts | 54 - .../src/server/auth/permissions.ts | 28 - .../src/server/db/index.ts | 8 - .../src/server/db/migrate.ts | 4 - .../src/server/db/schema.ts | 78 - .../src/utils/analytics/error-rate.ts | 54 - .../src/utils/analytics/errors.ts | 39 - .../src/utils/analytics/forecast.ts | 97 - .../src/utils/analytics/utilization.ts | 32 - .../src/utils/analytics/volume.ts | 52 - .../src/utils/api-config.ts | 51 - .../reservation-platform/src/utils/drizzle.ts | 29 - .../reservation-platform/src/utils/errors.ts | 59 - .../src/utils/external-api.ts | 78 - .../reservation-platform/src/utils/fetch.ts | 1 - .../reservation-platform/src/utils/guard.ts | 35 - .../src/utils/printers.ts | 41 - .../reservation-platform/src/utils/strings.ts | 11 - .../reservation-platform/src/utils/styles.ts | 11 - .../reservation-platform/tailwind.config.ts | 208 - packages/reservation-platform/tsconfig.json | 26 - .../reservation-platform/update-package.js | 179 - scripts/debug.sh | 6 - scripts/deployment/raspi-cleanup.sh | 225 - scripts/deployment/raspi-frontend-deploy.sh | 567 - scripts/setup/configure-oauth.sh | 230 - scripts/setup/get-docker.sh | 753 -- scripts/setup/https-setup.sh | 376 - scripts/setup/install-backend.sh | 516 - 161 files changed, 122 insertions(+), 28427 deletions(-) delete mode 100644 packages/reservation-platform/.dockerignore delete mode 100644 packages/reservation-platform/.gitignore delete mode 100644 packages/reservation-platform/Dockerfile delete mode 100644 packages/reservation-platform/README.md delete mode 100644 packages/reservation-platform/biome.json delete mode 100644 packages/reservation-platform/components.json delete mode 100644 packages/reservation-platform/debug-server/package.json delete mode 100644 packages/reservation-platform/debug-server/public/css/style.css delete mode 100644 packages/reservation-platform/debug-server/public/views/index.ejs delete mode 100644 packages/reservation-platform/debug-server/src/index.js delete mode 100644 packages/reservation-platform/docker/build.sh delete mode 100644 packages/reservation-platform/docker/caddy/Caddyfile delete mode 100644 packages/reservation-platform/docker/compose.yml delete mode 100755 packages/reservation-platform/docker/deploy.sh delete mode 100644 packages/reservation-platform/docker/images/.gitattributes delete mode 100644 packages/reservation-platform/docker/images/caddy_2.8.tar.xz delete mode 100644 packages/reservation-platform/docker/images/myp-rp_latest.tar.xz delete mode 100644 packages/reservation-platform/docker/save.sh delete mode 100644 packages/reservation-platform/docs/Admin-Dashboard.md delete mode 100644 packages/reservation-platform/docs/Architektur.md delete mode 100644 packages/reservation-platform/docs/Bereitstellungsdetails .md delete mode 100644 packages/reservation-platform/docs/Datenbank.md delete mode 100644 packages/reservation-platform/docs/Installation.md delete mode 100644 packages/reservation-platform/docs/Nutzung.md delete mode 100644 packages/reservation-platform/docs/README.md delete mode 100644 packages/reservation-platform/drizzle.config.ts delete mode 100644 packages/reservation-platform/drizzle/0000_overjoyed_strong_guy.sql delete mode 100644 packages/reservation-platform/drizzle/meta/0000_snapshot.json delete mode 100644 packages/reservation-platform/drizzle/meta/_journal.json delete mode 100644 packages/reservation-platform/next.config.mjs delete mode 100644 packages/reservation-platform/package.json delete mode 100644 packages/reservation-platform/pnpm-lock.yaml delete mode 100644 packages/reservation-platform/postcss.config.mjs delete mode 100644 packages/reservation-platform/public/next.svg delete mode 100644 packages/reservation-platform/public/vercel.svg delete mode 100644 packages/reservation-platform/repomix-output.txt delete mode 100644 packages/reservation-platform/scripts/generate-data.js delete mode 100755 packages/reservation-platform/setup-backend-url.sh delete mode 100644 packages/reservation-platform/src/app/admin/about/page.tsx delete mode 100644 packages/reservation-platform/src/app/admin/admin-sidebar.tsx delete mode 100644 packages/reservation-platform/src/app/admin/charts/printer-error-chart.tsx delete mode 100644 packages/reservation-platform/src/app/admin/charts/printer-error-rate.tsx delete mode 100644 packages/reservation-platform/src/app/admin/charts/printer-forecast.tsx delete mode 100644 packages/reservation-platform/src/app/admin/charts/printer-utilization.tsx delete mode 100644 packages/reservation-platform/src/app/admin/charts/printer-volume.tsx delete mode 100644 packages/reservation-platform/src/app/admin/jobs/page.tsx delete mode 100644 packages/reservation-platform/src/app/admin/layout.tsx delete mode 100644 packages/reservation-platform/src/app/admin/page.tsx delete mode 100644 packages/reservation-platform/src/app/admin/printers/columns.tsx delete mode 100644 packages/reservation-platform/src/app/admin/printers/data-table.tsx delete mode 100644 packages/reservation-platform/src/app/admin/printers/dialogs/create-printer.tsx delete mode 100644 packages/reservation-platform/src/app/admin/printers/dialogs/delete-printer.tsx delete mode 100644 packages/reservation-platform/src/app/admin/printers/dialogs/edit-printer.tsx delete mode 100644 packages/reservation-platform/src/app/admin/printers/form.tsx delete mode 100644 packages/reservation-platform/src/app/admin/printers/page.tsx delete mode 100644 packages/reservation-platform/src/app/admin/settings/download/route.ts delete mode 100644 packages/reservation-platform/src/app/admin/settings/page.tsx delete mode 100644 packages/reservation-platform/src/app/admin/users/columns.tsx delete mode 100644 packages/reservation-platform/src/app/admin/users/data-table.tsx delete mode 100644 packages/reservation-platform/src/app/admin/users/dialog.tsx delete mode 100644 packages/reservation-platform/src/app/admin/users/form.tsx delete mode 100644 packages/reservation-platform/src/app/admin/users/page.tsx delete mode 100644 packages/reservation-platform/src/app/api/job/[jobId]/remaining-time/route.ts delete mode 100644 packages/reservation-platform/src/app/api/jobs/[id]/route.ts delete mode 100644 packages/reservation-platform/src/app/api/jobs/route.ts delete mode 100644 packages/reservation-platform/src/app/api/printers/route.ts delete mode 100644 packages/reservation-platform/src/app/auth/login/callback/route.ts delete mode 100644 packages/reservation-platform/src/app/auth/login/route.ts delete mode 100644 packages/reservation-platform/src/app/favicon.ico delete mode 100644 packages/reservation-platform/src/app/globals.css delete mode 100644 packages/reservation-platform/src/app/job/[jobId]/cancel-form.tsx delete mode 100644 packages/reservation-platform/src/app/job/[jobId]/edit-comments.tsx delete mode 100644 packages/reservation-platform/src/app/job/[jobId]/extend-form.tsx delete mode 100644 packages/reservation-platform/src/app/job/[jobId]/finish-form.tsx delete mode 100644 packages/reservation-platform/src/app/job/[jobId]/page.tsx delete mode 100644 packages/reservation-platform/src/app/layout.tsx delete mode 100644 packages/reservation-platform/src/app/my/jobs/columns.tsx delete mode 100644 packages/reservation-platform/src/app/my/jobs/data-table.tsx delete mode 100644 packages/reservation-platform/src/app/my/profile/page.tsx delete mode 100644 packages/reservation-platform/src/app/not-found.tsx delete mode 100644 packages/reservation-platform/src/app/page.tsx delete mode 100644 packages/reservation-platform/src/app/printer/[printerId]/reserve/form.tsx delete mode 100644 packages/reservation-platform/src/app/printer/[printerId]/reserve/page.tsx delete mode 100644 packages/reservation-platform/src/components/data-card.tsx delete mode 100644 packages/reservation-platform/src/components/data-table.tsx delete mode 100644 packages/reservation-platform/src/components/dynamic-printer-cards.tsx delete mode 100644 packages/reservation-platform/src/components/header/index.tsx delete mode 100644 packages/reservation-platform/src/components/header/navigation.tsx delete mode 100644 packages/reservation-platform/src/components/login-button.tsx delete mode 100644 packages/reservation-platform/src/components/logout-button.tsx delete mode 100644 packages/reservation-platform/src/components/personalized-cards.tsx delete mode 100644 packages/reservation-platform/src/components/printer-availability-badge.tsx delete mode 100644 packages/reservation-platform/src/components/printer-card/countdown.tsx delete mode 100644 packages/reservation-platform/src/components/printer-card/index.tsx delete mode 100644 packages/reservation-platform/src/components/ui/alert-dialog.tsx delete mode 100644 packages/reservation-platform/src/components/ui/alert.tsx delete mode 100644 packages/reservation-platform/src/components/ui/avatar.tsx delete mode 100644 packages/reservation-platform/src/components/ui/badge.tsx delete mode 100644 packages/reservation-platform/src/components/ui/breadcrumb.tsx delete mode 100644 packages/reservation-platform/src/components/ui/button.tsx delete mode 100644 packages/reservation-platform/src/components/ui/card.tsx delete mode 100644 packages/reservation-platform/src/components/ui/chart.tsx delete mode 100644 packages/reservation-platform/src/components/ui/dialog.tsx delete mode 100644 packages/reservation-platform/src/components/ui/dropdown-menu.tsx delete mode 100644 packages/reservation-platform/src/components/ui/form.tsx delete mode 100644 packages/reservation-platform/src/components/ui/hover-card.tsx delete mode 100644 packages/reservation-platform/src/components/ui/input.tsx delete mode 100644 packages/reservation-platform/src/components/ui/label.tsx delete mode 100644 packages/reservation-platform/src/components/ui/scroll-area.tsx delete mode 100644 packages/reservation-platform/src/components/ui/select.tsx delete mode 100644 packages/reservation-platform/src/components/ui/skeleton.tsx delete mode 100644 packages/reservation-platform/src/components/ui/sonner.tsx delete mode 100644 packages/reservation-platform/src/components/ui/table.tsx delete mode 100644 packages/reservation-platform/src/components/ui/tabs.tsx delete mode 100644 packages/reservation-platform/src/components/ui/textarea.tsx delete mode 100644 packages/reservation-platform/src/components/ui/toast.tsx delete mode 100644 packages/reservation-platform/src/components/ui/toaster.tsx delete mode 100644 packages/reservation-platform/src/components/ui/use-toast.ts delete mode 100644 packages/reservation-platform/src/server/actions/authentication/logout.ts delete mode 100644 packages/reservation-platform/src/server/actions/printJobs.ts delete mode 100644 packages/reservation-platform/src/server/actions/printers.ts delete mode 100644 packages/reservation-platform/src/server/actions/timer.ts delete mode 100644 packages/reservation-platform/src/server/actions/user/delete.ts delete mode 100644 packages/reservation-platform/src/server/actions/user/update.ts delete mode 100644 packages/reservation-platform/src/server/actions/users.ts delete mode 100644 packages/reservation-platform/src/server/auth/index.ts delete mode 100644 packages/reservation-platform/src/server/auth/oauth.ts delete mode 100644 packages/reservation-platform/src/server/auth/permissions.ts delete mode 100644 packages/reservation-platform/src/server/db/index.ts delete mode 100644 packages/reservation-platform/src/server/db/migrate.ts delete mode 100644 packages/reservation-platform/src/server/db/schema.ts delete mode 100644 packages/reservation-platform/src/utils/analytics/error-rate.ts delete mode 100644 packages/reservation-platform/src/utils/analytics/errors.ts delete mode 100644 packages/reservation-platform/src/utils/analytics/forecast.ts delete mode 100644 packages/reservation-platform/src/utils/analytics/utilization.ts delete mode 100644 packages/reservation-platform/src/utils/analytics/volume.ts delete mode 100644 packages/reservation-platform/src/utils/api-config.ts delete mode 100644 packages/reservation-platform/src/utils/drizzle.ts delete mode 100644 packages/reservation-platform/src/utils/errors.ts delete mode 100644 packages/reservation-platform/src/utils/external-api.ts delete mode 100644 packages/reservation-platform/src/utils/fetch.ts delete mode 100644 packages/reservation-platform/src/utils/guard.ts delete mode 100644 packages/reservation-platform/src/utils/printers.ts delete mode 100644 packages/reservation-platform/src/utils/strings.ts delete mode 100644 packages/reservation-platform/src/utils/styles.ts delete mode 100644 packages/reservation-platform/tailwind.config.ts delete mode 100644 packages/reservation-platform/tsconfig.json delete mode 100755 packages/reservation-platform/update-package.js delete mode 100644 scripts/debug.sh delete mode 100644 scripts/deployment/raspi-cleanup.sh delete mode 100644 scripts/deployment/raspi-frontend-deploy.sh delete mode 100644 scripts/setup/configure-oauth.sh delete mode 100644 scripts/setup/get-docker.sh delete mode 100644 scripts/setup/https-setup.sh delete mode 100644 scripts/setup/install-backend.sh diff --git a/.gitattributes b/.gitattributes index 6b8d874b..2f378656 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,40 @@ -packages/reservation-platform/docker/images/*.tar.xz filter=lfs diff=lfs merge=lfs -text +frontend/docker/images/*.tar.xz filter=lfs diff=lfs merge=lfs -text +# Shell-Skripte: immer LF +*.sh text eol=lf + +# Windows-Batch-Dateien: immer CRLF +*.bat text eol=crlf +*.cmd text eol=crlf + +# Python, JS, HTML etc.: bevorzugt LF (aber nicht erzwungen) +*.py text eol=lf +*.js text eol=lf +*.ts text eol=lf +*.html text eol=lf +*.css text eol=lf +*.json text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.md text eol=lf + +# Konfigurationsdateien +*.env text eol=lf +*.conf text eol=lf +*.ini text eol=lf + +# Binärdateien +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.webp binary +*.pdf binary +*.ico binary +*.ttf binary +*.woff binary +*.zip binary +*.tar binary +*.gz binary +*.7z binary +*.exe binary +*.dll binary diff --git a/Dokumentation.md b/Dokumentation.md index 4564ee89..01803490 100755 --- a/Dokumentation.md +++ b/Dokumentation.md @@ -1,23 +1,28 @@ # Dokumentation MYP - Manage your Printer ## Projektbeschreibung + MYP (Manage your Printer) ist eine Plattform zur Reservierung von 3D-Druckern, die für die TBA im Werk 040, Berlin-Marienfelde, entwickelt wurde. ## Projektstruktur + - `backend/`: Flask-Backend für die API-Anbindung und Datenbankzugriff -- `packages/reservation-platform/`: Next.js Frontend für die Benutzeroberfläche +- `frontend/`: Next.js Frontend für die Benutzeroberfläche - `docs/`: Ausführliche Dokumentationen, Datenbankschema und Diagramme - `scripts/`: Deployment- und Setup-Skripte - `logs/`: Fehlerprotokolle und Logs ## Umfassende Dokumentation + Detaillierte Dokumentationen finden Sie in den folgenden Dateien: + - [Technische Dokumentation](docs/README.md) - [Datenbankstruktur](docs/MYP.dbml) - [Aktueller Projektstand](docs/Aktueller%20Stand.md) - [IHK-Dokumentation](docs/Dokumentation_IHK.md) ## Herausforderungen und Komplikationen + - Netzwerkanbindung - Ermitteln der Schnittstellen der Drucker - Auswahl der Anbindung, Entwickeln eines Netzwerkkonzeptes @@ -27,6 +32,7 @@ Detaillierte Dokumentationen finden Sie in den folgenden Dateien: - Netzwerk einrichten, Frontend anbinden ## Verwendete Technologien + - Backend: Python, Flask - Frontend: Next.js, React, TypeScript - Datenbank: SQL @@ -34,7 +40,8 @@ Detaillierte Dokumentationen finden Sie in den folgenden Dateien: - Raspberry Pi für Druckersteuerung ## Installation und Einsatz + Installation und Einrichtung werden durch die Skripte im Verzeichnis `scripts/` unterstützt. + - `scripts/setup/`: Einrichtungsskripte für Backend, Docker und OAuth - `scripts/deployment/`: Bereitstellungsskripte für Raspberry Pi - diff --git a/README.md b/README.md index 02caf5f5..fe479d38 100755 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ MYP *(Manage your Printer)* ist eine Plattform zur Reservierung von 3D-Druckern, die für die TBA im Werk 040, Berlin-Marienfelde, entwickelt wurde. -> Frontend: https://git.i.mercedes-benz.com/TBA-Berlin-FI/MYP/tree/main/packages/reservation-platform +> Frontend: https://git.i.mercedes-benz.com/TBA-Berlin-FI/MYP/tree/main/frontend > ⚠️ MYP ist zzt. in Entwicklung diff --git a/backend/docs/README.md b/backend/docs/README.md index 0da735c5..e2a97714 100644 --- a/backend/docs/README.md +++ b/backend/docs/README.md @@ -55,7 +55,7 @@ Dies ist das Backend für das MYP (Manage Your Printer) Projekt, ein IHK-Abschlu ``` python app.py ``` - + Die Anwendung ist dann unter http://localhost:5000 erreichbar. ### Mit Docker @@ -116,6 +116,7 @@ Die Anwendung ist dann unter http://localhost:5000 erreichbar. ## Datenmodell ### Benutzer (User) + - id (String UUID, Primary Key) - username (String, Unique) - password_hash (String) @@ -124,11 +125,13 @@ Die Anwendung ist dann unter http://localhost:5000 erreichbar. - role (String, 'admin', 'user' oder 'guest') ### Session + - id (String UUID, Primary Key) - user_id (String UUID, Foreign Key zu User) - expires_at (DateTime) ### Drucker (Printer) + - id (String UUID, Primary Key) - name (String) - description (Text) @@ -136,6 +139,7 @@ Die Anwendung ist dann unter http://localhost:5000 erreichbar. - ip_address (String, IP-Adresse der Tapo-Steckdose) ### Druckauftrag (PrintJob) + - id (String UUID, Primary Key) - printer_id (String UUID, Foreign Key zu Printer) - user_id (String UUID, Foreign Key zu User) @@ -182,4 +186,4 @@ Die Anwendung beinhaltet einen CLI-Befehl `flask check-jobs`, der regelmäßig a ## Kompatibilität mit dem Frontend -Das Backend wurde speziell für die Kompatibilität mit dem bestehenden Frontend entwickelt, welches in `/packages/reservation-platform` zu finden ist. Die API-Endpunkte und Datenstrukturen sind so gestaltet, dass sie nahtlos mit dem Frontend zusammenarbeiten. \ No newline at end of file +Das Backend wurde speziell für die Kompatibilität mit dem bestehenden Frontend entwickelt, welches in `/frontend` zu finden ist. Die API-Endpunkte und Datenstrukturen sind so gestaltet, dass sie nahtlos mit dem Frontend zusammenarbeiten. diff --git a/docs/Aufräumarbeiten.md b/docs/Aufräumarbeiten.md index 0519ecba..a5cff498 100644 --- a/docs/Aufräumarbeiten.md +++ b/docs/Aufräumarbeiten.md @@ -1 +1,51 @@ - \ No newline at end of file +# Aufräumarbeiten MYP-Projekt (19.05.2025) + +## Durchgeführte Änderungen + +### Verzeichnisstruktur + +- Skriptdateien in logische Kategorien reorganisiert: + - `scripts/setup/`: Einrichtungsskripte + - `scripts/deployment/`: Bereitstellungsskripte für Raspberry Pi +- Neue Verzeichnisse erstellt: + - `logs/`: Für Fehlerprotokolle und Logdateien + - `config/secure/`: Für sensible Konfigurationsdaten + +### Dokumentation + +- Zentrale `Dokumentation.md` aktualisiert und erweitert +- Entwicklungsrichtlinien von `CLAUDE.md` nach `docs/Entwicklungsrichtlinien.md` verschoben +- README.md korrigiert und Git-Konfliktmarkierungen entfernt + +### Sicherheit + +- Sensible Daten (CREDENTIALS) in `config/secure/` verschoben +- `.gitignore` aktualisiert, um sensible Dateien und temporäre Dateien auszuschließen + +### Dateiorganisation + +- Fehlerlogs in `logs/` verschoben +- Temporäre Dateien bereinigt +- Skript-Dateien in sinnvolle Kategorien einsortiert + +## Projektstruktur nach Aufräumarbeiten + +``` +Projektarbeit-MYP/ +├── backend/ # Flask-Backend +├── config/ +│ └── secure/ # Sensible Konfigurationen +├── docs/ # Projektdokumentation +├── frontend/ +├── logs/ # Fehlerprotokolle +└── scripts/ + ├── deployment/ # Raspberry Pi Deployment + └── setup/ # Einrichtungsskripte +``` + +## Empfehlungen für zukünftige Arbeiten + +- Gemeinsames Datenbankmodell zwischen Backend und Frontend überarbeiten +- Weitere Dokumentation der API-Schnittstellen erstellen +- Testabdeckung erhöhen +- Deployment-Prozess automatisieren diff --git a/docs/Entwicklungsrichtlinien.md b/docs/Entwicklungsrichtlinien.md index 27dc6a3a..209079cf 100644 --- a/docs/Entwicklungsrichtlinien.md +++ b/docs/Entwicklungsrichtlinien.md @@ -1,44 +1,49 @@ # MYP Project Development Guidelines ## System Architecture -- **Frontend**: - - Located in `packages/reservation-platform` + +- **Frontend**: + + - Located in `frontend` - Runs on a Raspberry Pi connected to company network - Has internet access on one interface - Connected via LAN to an offline network - Serves as the user interface - Developed by another apprentice as part of IHK project work - - **Backend**: + - Located in `backend` directory - Flask application running on a separate Raspberry Pi - Connected only to the offline network - Communicates with WiFi smart plugs - Part of my IHK project work for digital networking qualification - - **Printers/Smart Plugs**: + - Printers can only be controlled (on/off) via WiFi smart plugs - No other control mechanisms available - Smart plugs and printers are equivalent in the system context ## Build/Run Commands + - Backend: `cd backend && source venv/bin/activate && python app.py` -- Frontend: `cd packages/reservation-platform && pnpm dev` +- Frontend: `cd frontend && pnpm dev` - Run tests: `cd backend && python -m unittest development/tests/tests.py` - Run single test: `cd backend && python -m unittest development.tests.tests.MYPBackendTestCase.test_name` - Check jobs manually: `cd backend && source venv/bin/activate && flask check-jobs` -- Lint frontend: `cd packages/reservation-platform && pnpm lint` -- Format frontend: `cd packages/reservation-platform && npx @biomejs/biome format --write ./src` +- Lint frontend: `cd frontend && pnpm lint` +- Format frontend: `cd frontend && npx @biomejs/biome format --write ./src` ## Code Style + - **Python Backend**: + - Use PEP 8 conventions, 4-space indentation - Line width: 100 characters max - Add docstrings to functions and classes - Error handling: Use try/except with specific exceptions - Naming: snake_case for functions/variables, PascalCase for classes - - **Frontend (Next.js/TypeScript)**: + - Use Biome for formatting and linting (line width: 120 chars) - Organize imports automatically with Biome - Use TypeScript types for all code @@ -46,8 +51,9 @@ - Naming: camelCase for functions/variables, PascalCase for components ## Work Guidelines + - All changes must be committed to git - Work efficiently and cost-effectively - Don't repeatedly try the same solution if it doesn't work - Create and check notes when encountering issues -- Clearly communicate if something is not possible so I can handle it manually \ No newline at end of file +- Clearly communicate if something is not possible so I can handle it manually diff --git a/packages/reservation-platform/.dockerignore b/packages/reservation-platform/.dockerignore deleted file mode 100644 index 57e8785c..00000000 --- a/packages/reservation-platform/.dockerignore +++ /dev/null @@ -1,27 +0,0 @@ -# Build and utility assets -docker/ -scripts/ - -# Ignore node_modules as they will be installed in the container -node_modules - -# Ignore build artifacts -.next - -# Ignore runtime data -db/ - -# Ignore local configuration files -#.env -.env.example - -# Ignore version control files -.git -.gitignore - -# Ignore IDE/editor specific files -*.log -*.tmp -*.DS_Store -.vscode/ -.idea/ diff --git a/packages/reservation-platform/.gitignore b/packages/reservation-platform/.gitignore deleted file mode 100644 index 70020991..00000000 --- a/packages/reservation-platform/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# db folder -db/ - -# Env file -.env - - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/packages/reservation-platform/Dockerfile b/packages/reservation-platform/Dockerfile deleted file mode 100644 index 11ed8ada..00000000 --- a/packages/reservation-platform/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM node:20-bookworm-slim - -# Create application directory -RUN mkdir -p /usr/src/app - -# Set environment variables -ENV PORT=3000 -ENV NEXT_TELEMETRY_DISABLED=1 - -WORKDIR /usr/src/app - -# Copy package.json and pnpm-lock.yaml -COPY package.json /usr/src/app -COPY pnpm-lock.yaml /usr/src/app - -# Install pnpm -RUN corepack enable pnpm - -# Install dependencies -RUN pnpm install - -# Copy the rest of the application code -COPY . /usr/src/app - -# Initialize Database, if it not already exists -RUN pnpm run db - -# Build the application -RUN pnpm run build - -EXPOSE 3000 - -# Start the application -CMD ["/bin/sh", "-c", "if [ ! -f ./db/sqlite.db ]; then pnpm db; fi && pnpm start"] diff --git a/packages/reservation-platform/README.md b/packages/reservation-platform/README.md deleted file mode 100644 index 8faebf07..00000000 --- a/packages/reservation-platform/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# MYP - Manage Your Printer - -MYP (Manage Your Printer) ist eine Webanwendung zur Reservierung von 3D-Druckern. -Sie wurde im Rahmen des Abschlussprojektes der Fachinformatiker Ausbildung für Daten- und Prozessanalyse für die Technische Berufsausbildung des Mercedes-Benz Werkes Berlin-Marienfelde entwickelt. - -## Deployment - -### Voraussetzungen - -- Netzwerk auf Raspberry Pi ist eingerichtet -- Docker ist installiert - -### Schritte - -1. Docker-Container bauen (docker/build.sh) -2. Docker-Container speichern (docker/save.sh caddy:2.8 myp-rp:latest) -3. Docker-Container auf Raspberry Pi bereitstellen (docker/deploy.sh) - -## Entwicklerinformationen - -### Raspberry Pi Einstellungen - -Auf dem Raspberry Pi wurde Raspbian Lite installiert. -Unter /srv/* sind die Projektdateien zu finden. - -### Anmeldedaten - -``` -Benutzer: myp -Passwort: (persönlich bekannt) -``` - diff --git a/packages/reservation-platform/biome.json b/packages/reservation-platform/biome.json deleted file mode 100644 index 4a0b3f42..00000000 --- a/packages/reservation-platform/biome.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.7.0/schema.json", - "organizeImports": { - "enabled": true - }, - "formatter": { - "enabled": true, - "lineWidth": 120 - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "correctness": { - "noUnusedImports": "error" - } - } - } -} \ No newline at end of file diff --git a/packages/reservation-platform/components.json b/packages/reservation-platform/components.json deleted file mode 100644 index a158e943..00000000 --- a/packages/reservation-platform/components.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": true, - "tsx": true, - "tailwind": { - "config": "tailwind.config.ts", - "css": "src/app/globals.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/utils/styles" - } -} \ No newline at end of file diff --git a/packages/reservation-platform/debug-server/package.json b/packages/reservation-platform/debug-server/package.json deleted file mode 100644 index 648a9f83..00000000 --- a/packages/reservation-platform/debug-server/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "myp-frontend-debug-server", - "version": "1.0.0", - "description": "Debug-Server für das MYP Frontend", - "main": "src/index.js", - "scripts": { - "start": "node src/index.js", - "dev": "nodemon src/index.js" - }, - "dependencies": { - "express": "^4.18.2", - "systeminformation": "^5.18.15", - "ejs": "^3.1.9", - "os-utils": "^0.0.14", - "node-fetch": "^2.6.7", - "socket.io": "^4.7.2" - }, - "devDependencies": { - "nodemon": "^3.0.2" - } -} \ No newline at end of file diff --git a/packages/reservation-platform/debug-server/public/css/style.css b/packages/reservation-platform/debug-server/public/css/style.css deleted file mode 100644 index 0519ecba..00000000 --- a/packages/reservation-platform/debug-server/public/css/style.css +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/reservation-platform/debug-server/public/views/index.ejs b/packages/reservation-platform/debug-server/public/views/index.ejs deleted file mode 100644 index a9a1da96..00000000 --- a/packages/reservation-platform/debug-server/public/views/index.ejs +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - MYP Frontend Debug-Server - - - - - -
-
-

MYP Frontend Debug-Server

-
- Hostname: <%= hostname %> - <% for(const [interface, ip] of Object.entries(ipAddresses)) { %> - <%= interface %>: <%= ip %> - <% } %> - Zeitstempel: <%= timestamp %> -
-
-
- - - -
- -
-

Systeminformationen

-
Lade Daten...
- -
- - -
-

Netzwerkinformationen

-
Lade Daten...
- -
- - -
-

Dienststatus

-
Lade Daten...
- -
- - -
-

Netzwerk-Diagnosetools

-
-
-

Ping

-
- - -
-
Geben Sie einen Hostnamen oder eine IP-Adresse ein...
-
- -
-

Traceroute

-
- - -
-
Geben Sie einen Hostnamen oder eine IP-Adresse ein...
-
- -
-

DNS-Lookup

-
- - -
-
Geben Sie einen Hostnamen oder eine IP-Adresse ein...
-
-
-
- - -
-

Echtzeit-Monitoring

-
-
-

CPU-Auslastung

-
-
-
-
-
-
-
0%
-
-
-
-
- -
-

Arbeitsspeicher

-
-
-
-
-
-
-
0%
-
-
-
-
- -
-

Netzwerkdurchsatz

-
- -
-
-
-
- - - - - - \ No newline at end of file diff --git a/packages/reservation-platform/debug-server/src/index.js b/packages/reservation-platform/debug-server/src/index.js deleted file mode 100644 index f3bf3f20..00000000 --- a/packages/reservation-platform/debug-server/src/index.js +++ /dev/null @@ -1,471 +0,0 @@ -// Frontend Debug-Server für MYP -const express = require('express'); -const path = require('path'); -const http = require('http'); -const si = require('systeminformation'); -const os = require('os'); -const osUtils = require('os-utils'); -const { exec } = require('child_process'); -const fetch = require('node-fetch'); -const socketIo = require('socket.io'); - -// Konfiguration -const app = express(); -const server = http.createServer(app); -const io = socketIo(server); -const PORT = 6666; -const FRONTEND_PORT = 3000; -const FRONTEND_HOST = 'localhost'; -const BACKEND_HOST = 'localhost'; -const BACKEND_PORT = 5000; - -// View Engine einrichten -app.set('view engine', 'ejs'); -app.set('views', path.join(__dirname, '../public/views')); -app.use(express.static(path.join(__dirname, '../public'))); -app.use(express.json()); - -// Hauptseite rendern -app.get('/', async (req, res) => { - const hostname = os.hostname(); - const networkInterfaces = os.networkInterfaces(); - const ipAddresses = {}; - - // IP-Adressen sammeln - Object.keys(networkInterfaces).forEach(interfaceName => { - const interfaceInfo = networkInterfaces[interfaceName]; - const ipv4Addresses = interfaceInfo.filter(info => info.family === 'IPv4'); - if (ipv4Addresses.length > 0) { - ipAddresses[interfaceName] = ipv4Addresses[0].address; - } - }); - - // Rendere die Hauptseite mit Basisdaten - res.render('index', { - hostname: hostname, - ipAddresses: ipAddresses, - timestamp: new Date().toLocaleString('de-DE'), - }); -}); - -// API-Endpunkte - -// Systeminformationen -app.get('/api/system', async (req, res) => { - try { - const [cpu, mem, osInfo, diskLayout, fsSize] = await Promise.all([ - si.cpu(), - si.mem(), - si.osInfo(), - si.diskLayout(), - si.fsSize() - ]); - - const data = { - cpu: { - manufacturer: cpu.manufacturer, - brand: cpu.brand, - speed: cpu.speed, - cores: cpu.cores, - physicalCores: cpu.physicalCores - }, - memory: { - total: formatBytes(mem.total), - free: formatBytes(mem.free), - used: formatBytes(mem.used), - usedPercent: Math.round(mem.used / mem.total * 100) - }, - os: { - platform: osInfo.platform, - distro: osInfo.distro, - release: osInfo.release, - arch: osInfo.arch, - uptime: formatUptime(os.uptime()) - }, - filesystem: fsSize.map(fs => ({ - fs: fs.fs, - type: fs.type, - size: formatBytes(fs.size), - used: formatBytes(fs.used), - available: formatBytes(fs.available), - mount: fs.mount, - usePercent: Math.round(fs.use) - })), - disks: diskLayout.map(disk => ({ - device: disk.device, - type: disk.type, - name: disk.name, - size: formatBytes(disk.size) - })) - }; - - res.json(data); - } catch (error) { - console.error('Fehler beim Abrufen der Systemdaten:', error); - res.status(500).json({ error: 'Fehler beim Abrufen der Systemdaten' }); - } -}); - -// Netzwerkinformationen -app.get('/api/network', async (req, res) => { - try { - const [netInterfaces, netStats] = await Promise.all([ - si.networkInterfaces(), - si.networkStats() - ]); - - const dns = await getDnsServers(); - const gateway = await getDefaultGateway(); - - const data = { - interfaces: netInterfaces.map(iface => ({ - iface: iface.iface, - ip4: iface.ip4, - ip6: iface.ip6, - mac: iface.mac, - internal: iface.internal, - operstate: iface.operstate, - type: iface.type, - speed: iface.speed, - dhcp: iface.dhcp - })), - stats: netStats.map(stat => ({ - iface: stat.iface, - rx_bytes: formatBytes(stat.rx_bytes), - tx_bytes: formatBytes(stat.tx_bytes), - rx_sec: formatBytes(stat.rx_sec), - tx_sec: formatBytes(stat.tx_sec) - })), - dns: dns, - gateway: gateway - }; - - res.json(data); - } catch (error) { - console.error('Fehler beim Abrufen der Netzwerkdaten:', error); - res.status(500).json({ error: 'Fehler beim Abrufen der Netzwerkdaten' }); - } -}); - -// Dienststatus -app.get('/api/services', async (req, res) => { - try { - // Prüfen ob Frontend (Next.js) läuft - const frontendStatus = await checkServiceStatus(FRONTEND_HOST, FRONTEND_PORT); - - // Prüfen ob Backend (Flask) läuft - const backendStatus = await checkServiceStatus(BACKEND_HOST, BACKEND_PORT); - - // Docker-Container Status abrufen - const containers = await getDockerContainers(); - - const data = { - frontend: { - name: 'Next.js Frontend', - status: frontendStatus ? 'online' : 'offline', - port: FRONTEND_PORT, - host: FRONTEND_HOST - }, - backend: { - name: 'Flask Backend', - status: backendStatus ? 'online' : 'offline', - port: BACKEND_PORT, - host: BACKEND_HOST - }, - docker: { - containers: containers - } - }; - - res.json(data); - } catch (error) { - console.error('Fehler beim Abrufen der Dienststatus:', error); - res.status(500).json({ error: 'Fehler beim Abrufen der Dienststatus' }); - } -}); - -// Ping-Endpunkt für Netzwerkdiagnose -app.get('/api/ping/:host', (req, res) => { - const host = req.params.host; - - // Sicherheitscheck für den Hostnamen - if (!isValidHostname(host)) { - return res.status(400).json({ error: 'Ungültiger Hostname oder IP-Adresse' }); - } - - // Ping-Befehl ausführen - exec(`ping -n 4 ${host}`, (error, stdout, stderr) => { - if (error) { - return res.json({ - success: false, - output: stderr || stdout, - error: error.message - }); - } - - res.json({ - success: true, - output: stdout - }); - }); -}); - -// Traceroute-Endpunkt für Netzwerkdiagnose -app.get('/api/traceroute/:host', (req, res) => { - const host = req.params.host; - - // Sicherheitscheck für den Hostnamen - if (!isValidHostname(host)) { - return res.status(400).json({ error: 'Ungültiger Hostname oder IP-Adresse' }); - } - - // Traceroute-Befehl ausführen (Windows: tracert, Unix: traceroute) - const command = process.platform === 'win32' ? 'tracert' : 'traceroute'; - exec(`${command} ${host}`, (error, stdout, stderr) => { - // Traceroute kann einen Nicht-Null-Exit-Code zurückgeben, selbst wenn es teilweise erfolgreich ist - res.json({ - success: true, - output: stdout, - error: stderr - }); - }); -}); - -// DNS-Lookup-Endpunkt für Netzwerkdiagnose -app.get('/api/nslookup/:host', (req, res) => { - const host = req.params.host; - - // Sicherheitscheck für den Hostnamen - if (!isValidHostname(host)) { - return res.status(400).json({ error: 'Ungültiger Hostname oder IP-Adresse' }); - } - - // NSLookup-Befehl ausführen - exec(`nslookup ${host}`, (error, stdout, stderr) => { - if (error) { - return res.json({ - success: false, - output: stderr || stdout, - error: error.message - }); - } - - res.json({ - success: true, - output: stdout - }); - }); -}); - -// Echtzeit-Updates über WebSockets -io.on('connection', (socket) => { - console.log('Neue WebSocket-Verbindung'); - - // CPU- und Arbeitsspeichernutzung im Intervall senden - const systemMonitorInterval = setInterval(async () => { - try { - const [cpu, mem] = await Promise.all([ - si.currentLoad(), - si.mem() - ]); - - socket.emit('system-stats', { - cpu: { - load: Math.round(cpu.currentLoad), - cores: cpu.cpus.map(core => Math.round(core.load)) - }, - memory: { - total: mem.total, - used: mem.used, - free: mem.free, - usedPercent: Math.round(mem.used / mem.total * 100) - } - }); - } catch (error) { - console.error('Fehler beim Senden der Systemstatistiken:', error); - } - }, 2000); - - // Netzwerkstatistiken im Intervall senden - const networkMonitorInterval = setInterval(async () => { - try { - const netStats = await si.networkStats(); - - socket.emit('network-stats', { - stats: netStats.map(stat => ({ - iface: stat.iface, - rx_bytes: stat.rx_bytes, - tx_bytes: stat.tx_bytes, - rx_sec: stat.rx_sec, - tx_sec: stat.tx_sec - })) - }); - } catch (error) { - console.error('Fehler beim Senden der Netzwerkstatistiken:', error); - } - }, 2000); - - // Aufräumen, wenn die Verbindung getrennt wird - socket.on('disconnect', () => { - console.log('WebSocket-Verbindung getrennt'); - clearInterval(systemMonitorInterval); - clearInterval(networkMonitorInterval); - }); -}); - -// Hilfsfunktionen - -// Bytes in lesbare Größen formatieren -function formatBytes(bytes, decimals = 2) { - if (bytes === 0) return '0 B'; - - const k = 1024; - const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']; - - const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i]; -} - -// Uptime in lesbare Zeit formatieren -function formatUptime(seconds) { - const days = Math.floor(seconds / 86400); - const hours = Math.floor((seconds % 86400) / 3600); - const minutes = Math.floor((seconds % 3600) / 60); - const secs = Math.floor(seconds % 60); - - return `${days} Tage, ${hours} Stunden, ${minutes} Minuten, ${secs} Sekunden`; -} - -// Service-Status überprüfen -async function checkServiceStatus(host, port) { - return new Promise(resolve => { - const socket = new (require('net').Socket)(); - - socket.setTimeout(1000); - - socket.on('connect', () => { - socket.destroy(); - resolve(true); - }); - - socket.on('timeout', () => { - socket.destroy(); - resolve(false); - }); - - socket.on('error', () => { - socket.destroy(); - resolve(false); - }); - - socket.connect(port, host); - }); -} - -// Docker-Container abfragen -async function getDockerContainers() { - return new Promise((resolve) => { - exec('docker ps --format "{{.ID}},{{.Image}},{{.Status}},{{.Ports}},{{.Names}}"', (error, stdout) => { - if (error) { - resolve([]); - return; - } - - const containers = []; - const lines = stdout.trim().split('\n'); - - for (const line of lines) { - if (line) { - const [id, image, status, ports, name] = line.split(','); - containers.push({ id, image, status, ports, name }); - } - } - - resolve(containers); - }); - }); -} - -// DNS-Server abfragen -async function getDnsServers() { - return new Promise((resolve) => { - if (process.platform === 'win32') { - // Windows: DNS-Server über PowerShell abfragen - exec('powershell.exe -Command "Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses"', (error, stdout) => { - if (error) { - resolve(['DNS-Server konnten nicht ermittelt werden']); - return; - } - - const servers = stdout.trim().split('\r\n').filter(Boolean); - resolve(servers); - }); - } else { - // Unix: DNS-Server aus /etc/resolv.conf lesen - exec('cat /etc/resolv.conf | grep nameserver | cut -d " " -f 2', (error, stdout) => { - if (error) { - resolve(['DNS-Server konnten nicht ermittelt werden']); - return; - } - - const servers = stdout.trim().split('\n').filter(Boolean); - resolve(servers); - }); - } - }); -} - -// Standard-Gateway abfragen -async function getDefaultGateway() { - return new Promise((resolve) => { - if (process.platform === 'win32') { - // Windows: Gateway über PowerShell abfragen - exec('powershell.exe -Command "Get-NetRoute -DestinationPrefix 0.0.0.0/0 | Select-Object -ExpandProperty NextHop"', (error, stdout) => { - if (error) { - resolve('Gateway konnte nicht ermittelt werden'); - return; - } - - resolve(stdout.trim()); - }); - } else { - // Unix: Gateway aus den Routentabellen lesen - exec("ip route | grep default | awk '{print $3}'", (error, stdout) => { - if (error) { - resolve('Gateway konnte nicht ermittelt werden'); - return; - } - - resolve(stdout.trim()); - }); - } - }); -} - -// Validierung des Hostnamens für Sicherheit -function isValidHostname(hostname) { - // Längenprüfung - if (!hostname || hostname.length > 255) { - return false; - } - - // Erlaubte Hostnamen - if (hostname === 'localhost' || hostname === '127.0.0.1') { - return true; - } - - // IPv4-Prüfung - const ipv4Regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; - if (ipv4Regex.test(hostname)) { - return true; - } - - // Hostname-Prüfung - const hostnameRegex = /^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$/; - return hostnameRegex.test(hostname); -} - -// Server starten -server.listen(PORT, () => { - console.log(`MYP Frontend Debug-Server läuft auf http://localhost:${PORT}`); -}); \ No newline at end of file diff --git a/packages/reservation-platform/docker/build.sh b/packages/reservation-platform/docker/build.sh deleted file mode 100644 index 8b04b01b..00000000 --- a/packages/reservation-platform/docker/build.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Define image name -MYP_RP_IMAGE_NAME="myp-rp" - -# Function to build Docker image -build_image() { - local image_name=$1 - local dockerfile=$2 - local platform=$3 - - echo "Building $image_name Docker image for $platform..." - - docker buildx build --platform $platform -t ${image_name}:latest -f $dockerfile --load . - if [ $? -eq 0 ]; then - echo "$image_name Docker image built successfully" - else - echo "Error occurred while building $image_name Docker image" - exit 1 - fi -} - -# Create and use a builder instance (if not already created) -BUILDER_NAME="myp-rp-arm64-builder" -docker buildx create --name $BUILDER_NAME --use || docker buildx use $BUILDER_NAME - -# Build myp-rp image -build_image "$MYP_RP_IMAGE_NAME" "$PWD/Dockerfile" "linux/arm64" - -# Remove the builder instance -docker buildx rm $BUILDER_NAME diff --git a/packages/reservation-platform/docker/caddy/Caddyfile b/packages/reservation-platform/docker/caddy/Caddyfile deleted file mode 100644 index 8534b943..00000000 --- a/packages/reservation-platform/docker/caddy/Caddyfile +++ /dev/null @@ -1,37 +0,0 @@ -{ - debug -} - -# Hauptdomain für die Anwendung -m040tbaraspi001.de040.corpintra.net, m040tbaraspi001, localhost { - reverse_proxy myp-rp:3000 - tls internal - - # Erlaube HTTP -> HTTPS Redirects für OAuth - @oauth path /auth/login/callback* - handle @oauth { - header Cache-Control "no-cache" - reverse_proxy myp-rp:3000 - } - - # Allgemeine Header für Sicherheit und Caching - header { - # Sicherheitsheader - Strict-Transport-Security "max-age=31536000; includeSubDomains" - X-Content-Type-Options "nosniff" - X-Frame-Options "SAMEORIGIN" - Referrer-Policy "strict-origin-when-cross-origin" - - # Cache-Control für statische Assets - @static { - path *.js *.css *.png *.jpg *.svg *.ico *.woff *.woff2 - } - header @static Cache-Control "public, max-age=86400" - - # Keine Caches für dynamische Inhalte - @dynamic { - not path *.js *.css *.png *.jpg *.svg *.ico *.woff *.woff2 - } - header @dynamic Cache-Control "no-store, no-cache, must-revalidate" - } -} \ No newline at end of file diff --git a/packages/reservation-platform/docker/compose.yml b/packages/reservation-platform/docker/compose.yml deleted file mode 100644 index 0c79dff6..00000000 --- a/packages/reservation-platform/docker/compose.yml +++ /dev/null @@ -1,30 +0,0 @@ -services: - caddy: - image: caddy:2.8 - container_name: caddy - restart: unless-stopped - ports: - - 80:80 - - 443:443 - volumes: - - ./caddy/data:/data - - ./caddy/config:/config - - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro - myp-rp: - image: myp-rp:latest - container_name: myp-rp - environment: - - NEXT_PUBLIC_API_URL=http://192.168.0.105:5000 - - OAUTH_CLIENT_ID=client_id - - OAUTH_CLIENT_SECRET=client_secret - env_file: "/srv/myp-env/github.env" - volumes: - - /srv/MYP-DB:/usr/src/app/db - restart: unless-stopped - # Füge Healthcheck hinzu für besseres Monitoring - healthcheck: - test: ["CMD", "wget", "--spider", "http://localhost:3000"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s diff --git a/packages/reservation-platform/docker/deploy.sh b/packages/reservation-platform/docker/deploy.sh deleted file mode 100755 index 09b73d6c..00000000 --- a/packages/reservation-platform/docker/deploy.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# Directory containing the Docker images -IMAGE_DIR="docker/images" - -# Load all Docker images from the tar.xz files in the IMAGE_DIR -echo "Loading Docker images from $IMAGE_DIR..." - -for image_file in "$IMAGE_DIR"/*.tar.xz; do - if [ -f "$image_file" ]; then - echo "Loading Docker image from $image_file..." - docker load -i "$image_file" - - # Check if the image loading was successful - if [ $? -ne 0 ]; then - echo "Error occurred while loading Docker image from $image_file" - exit 1 - fi - else - echo "No Docker image tar.xz files found in $IMAGE_DIR." - fi -done - -# Execute docker compose -echo "Running docker compose..." -docker compose -f "docker/compose.yml" up -d - -# Check if the operation was successful -if [ $? -eq 0 ]; then - echo "Docker compose executed successfully" -else - echo "Error occurred while executing docker compose" - exit 1 -fi - -echo "Deployment completed successfully" diff --git a/packages/reservation-platform/docker/images/.gitattributes b/packages/reservation-platform/docker/images/.gitattributes deleted file mode 100644 index 8b3e666a..00000000 --- a/packages/reservation-platform/docker/images/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -caddy_2.8.tar.xz filter=lfs diff=lfs merge=lfs -text -myp-rp_latest.tar.xz filter=lfs diff=lfs merge=lfs -text diff --git a/packages/reservation-platform/docker/images/caddy_2.8.tar.xz b/packages/reservation-platform/docker/images/caddy_2.8.tar.xz deleted file mode 100644 index 1b4070e3..00000000 --- a/packages/reservation-platform/docker/images/caddy_2.8.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e04636560b45cf05774bb4fb734329951c1693a3febd56358ba4d58b10fee82 -size 12365924 diff --git a/packages/reservation-platform/docker/images/myp-rp_latest.tar.xz b/packages/reservation-platform/docker/images/myp-rp_latest.tar.xz deleted file mode 100644 index f617dcd2..00000000 --- a/packages/reservation-platform/docker/images/myp-rp_latest.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e6b377b9a7a36b32f229567ad766eb06b1e959c7572b7e92dc81c6a3d03e13b -size 191478008 diff --git a/packages/reservation-platform/docker/save.sh b/packages/reservation-platform/docker/save.sh deleted file mode 100644 index 2ce2712e..00000000 --- a/packages/reservation-platform/docker/save.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -# Get image name as argument -IMAGE_NAME=$1 -PLATFORM="linux/arm64" - -# Define paths -IMAGE_DIR="docker/images" -IMAGE_FILE="${IMAGE_DIR}/${IMAGE_NAME//[:\/]/_}.tar" -COMPRESSED_FILE="${IMAGE_FILE}.xz" - -# Function to pull the image -pull_image() { - local image=$1 - if [[ $image == arm64v8/* ]]; then - echo "Pulling image $image without platform specification..." - docker pull $image - else - echo "Pulling image $image for platform $PLATFORM..." - docker pull --platform $PLATFORM $image - fi - return $? -} - -# Pull the image if it is not available locally -if ! docker image inspect ${IMAGE_NAME} &>/dev/null; then - if pull_image ${IMAGE_NAME}; then - echo "Image $IMAGE_NAME pulled successfully." - else - echo "Error occurred while pulling $IMAGE_NAME for platform $PLATFORM" - echo "Trying to pull $IMAGE_NAME without platform specification..." - - # Attempt to pull again without platform - if pull_image ${IMAGE_NAME}; then - echo "Image $IMAGE_NAME pulled successfully without platform." - else - echo "Error occurred while pulling $IMAGE_NAME without platform." - echo "Trying to pull arm64v8/${IMAGE_NAME} instead..." - - # Construct new image name - NEW_IMAGE_NAME="arm64v8/${IMAGE_NAME}" - if pull_image ${NEW_IMAGE_NAME}; then - echo "Image $NEW_IMAGE_NAME pulled successfully." - IMAGE_NAME=${NEW_IMAGE_NAME} # Update IMAGE_NAME to use the new one - else - echo "Error occurred while pulling $NEW_IMAGE_NAME" - exit 1 - fi - fi - fi -else - echo "Image $IMAGE_NAME found locally. Skipping pull." -fi - -# Save the Docker image -echo "Saving $IMAGE_NAME Docker image..." -docker save ${IMAGE_NAME} > $IMAGE_FILE - -# Compress the Docker image (overwriting if file exists) -echo "Compressing $IMAGE_FILE..." -xz -z --force $IMAGE_FILE - -if [ $? -eq 0 ]; then - echo "$IMAGE_NAME Docker image saved and compressed successfully as $COMPRESSED_FILE" -else - echo "Error occurred while compressing $IMAGE_NAME Docker image" - exit 1 -fi diff --git a/packages/reservation-platform/docs/Admin-Dashboard.md b/packages/reservation-platform/docs/Admin-Dashboard.md deleted file mode 100644 index e192aa69..00000000 --- a/packages/reservation-platform/docs/Admin-Dashboard.md +++ /dev/null @@ -1,116 +0,0 @@ -# **Detaillierte Dokumentation des Admin-Dashboards** - -In diesem Abschnitt werde ich die Funktionen und Nutzung des Admin-Dashboards genauer beschreiben, einschließlich der verschiedenen Module, Diagramme und deren Zweck. - ---- - -## **1. Überblick über das Admin-Dashboard** - -Das Admin-Dashboard ist der zentrale Verwaltungsbereich für Administratoren. Es bietet Funktionen wie die Verwaltung von Druckern, Benutzern und Druckaufträgen sowie detaillierte Statistiken und Analysen. - -### **1.1. Navigation** -Das Dashboard enthält ein Sidebar-Menü mit den folgenden Hauptbereichen: -1. **Dashboard:** Übersicht der wichtigsten Statistiken. -2. **Benutzer:** Verwaltung von Benutzerkonten. -3. **Drucker:** Hinzufügen, Bearbeiten und Verwalten von Druckern. -4. **Druckaufträge:** Einsicht in alle Druckaufträge und deren Status. -5. **Einstellungen:** Konfiguration der Anwendung. -6. **Über MYP:** Informationen über das Projekt und den Entwickler. - -Die Sidebar wird in der Datei `src/app/admin/admin-sidebar.tsx` definiert und dynamisch basierend auf der aktuellen Seite hervorgehoben. - ---- - -## **2. Funktionen des Admin-Dashboards** - -### **2.1. Benutzerverwaltung** -- **Datei:** `src/app/admin/users/page.tsx` -- **Beschreibung:** Ermöglicht das Anzeigen, Bearbeiten und Löschen von Benutzerkonten. -- **Funktionen:** - - Anzeige einer Liste aller registrierten Benutzer. - - Bearbeiten von Benutzerrollen (z. B. „admin“ oder „user“). - - Deaktivieren oder Löschen von Benutzerkonten. - ---- - -### **2.2. Druckerverwaltung** -- **Datei:** `src/app/admin/printers/page.tsx` -- **Beschreibung:** Verwaltung der Drucker, einschließlich Hinzufügen, Bearbeiten und Deaktivieren. -- **Funktionen:** - - Statusanzeige der Drucker (aktiv/inaktiv). - - Hinzufügen neuer Drucker mit Namen und Beschreibung. - - Löschen oder Bearbeiten bestehender Drucker. - ---- - -### **2.3. Druckaufträge** -- **Datei:** `src/app/admin/jobs/page.tsx` -- **Beschreibung:** Übersicht aller Druckaufträge, einschließlich Details wie Startzeit, Dauer und Status. -- **Funktionen:** - - Filtern nach Benutzern, Druckern oder Status (abgeschlossen, abgebrochen). - - Anzeigen von Abbruchgründen und Fehlermeldungen. - - Sortieren nach Zeit oder Benutzer. - ---- - -### **2.4. Einstellungen** -- **Datei:** `src/app/admin/settings/page.tsx` -- **Beschreibung:** Konfigurationsseite für die Anwendung. -- **Funktionen:** - - Ändern von globalen Einstellungen wie Standardzeiten oder Fehlerrichtlinien. - - Download von Daten (z. B. Export der Druckhistorie). - ---- - -## **3. Statistiken und Diagramme** - -Das Admin-Dashboard enthält interaktive Diagramme, die wichtige Statistiken visualisieren. Hier einige der zentralen Diagramme: - -### **3.1. Abbruchgründe** -- **Datei:** `src/app/admin/charts/printer-error-chart.tsx` -- **Beschreibung:** Zeigt die Häufigkeit der Abbruchgründe für Druckaufträge in einem Balkendiagramm. -- **Nutzen:** Identifiziert häufige Probleme wie Materialmangel oder Düsenverstopfungen. - ---- - -### **3.2. Fehlerraten** -- **Datei:** `src/app/admin/charts/printer-error-rate.tsx` -- **Beschreibung:** Zeigt die prozentuale Fehlerrate für jeden Drucker in einem Balkendiagramm. -- **Nutzen:** Ermöglicht die Überwachung und Identifizierung von problematischen Druckern. - ---- - -### **3.3. Druckvolumen** -- **Datei:** `src/app/admin/charts/printer-volume.tsx` -- **Beschreibung:** Zeigt das Druckvolumen für heute, diese Woche und diesen Monat. -- **Nutzen:** Vergleich des Druckeroutputs über verschiedene Zeiträume. - ---- - -### **3.4. Prognostizierte Nutzung** -- **Datei:** `src/app/admin/charts/printer-forecast.tsx` -- **Beschreibung:** Ein Bereichsdiagramm zeigt die erwartete Druckernutzung pro Wochentag. -- **Nutzen:** Hilft bei der Planung von Wartungsarbeiten oder Ressourcenzuweisungen. - ---- - -### **3.5. Druckerauslastung** -- **Datei:** `src/app/admin/charts/printer-utilization.tsx` -- **Beschreibung:** Zeigt die aktuelle Nutzung eines Druckers in Prozent in einem Kreisdiagramm. -- **Nutzen:** Überwacht die Auslastung und identifiziert ungenutzte Ressourcen. - ---- - -## **4. Rollenbasierte Zugriffssteuerung** - -Das Admin-Dashboard ist nur für Benutzer mit der Rolle „admin“ zugänglich. Nicht berechtigte Benutzer werden auf die Startseite umgeleitet. Die Zugriffssteuerung erfolgt durch folgende Logik: -- **Datei:** `src/app/admin/layout.tsx` -- **Funktion:** `validateRequest` prüft die Rolle des aktuellen Benutzers. -- **Umleitung:** Falls die Rolle unzureichend ist, wird der Benutzer automatisch umgeleitet: - ```typescript - if (guard(user, IS_NOT, UserRole.ADMIN)) { - redirect("/"); - } - ``` - -Nächster Schritt: [=> API-Endpunkte und deren Nutzung](./API.md) \ No newline at end of file diff --git a/packages/reservation-platform/docs/Architektur.md b/packages/reservation-platform/docs/Architektur.md deleted file mode 100644 index f64fc96b..00000000 --- a/packages/reservation-platform/docs/Architektur.md +++ /dev/null @@ -1,79 +0,0 @@ -# **Technische Architektur und Codeaufbau** - -In diesem Abschnitt erläutere ich die Architektur und Struktur des MYP-Projekts sowie die Funktionalitäten der zentralen Komponenten. - ---- - -## **1. Technische Architektur** - -### **1.1. Architekturübersicht** -MYP basiert auf einer modernen Webanwendungsarchitektur: -- **Frontend:** Entwickelt mit React und Next.js. Stellt die Benutzeroberfläche bereit. -- **Backend:** Nutzt Node.js und Drizzle ORM für die Datenbankinteraktion und Geschäftslogik. -- **Datenbank:** SQLite zur Speicherung von Nutzerdaten, Druckaufträgen und Druckerkonfigurationen. -- **Containerisierung:** Docker wird verwendet, um die Anwendung in isolierten Containern bereitzustellen. -- **Webserver:** Caddy dient als Reverse Proxy mit HTTPS-Unterstützung. - -### **1.2. Modulübersicht** -- **Datenfluss:** Die Anwendung ist stark datengetrieben. API-Routen werden genutzt, um Daten zwischen Frontend und Backend auszutauschen. -- **Rollenbasierter Zugriff:** Über ein Berechtigungssystem können Administratoren und Benutzer unterschiedliche Funktionen nutzen. - ---- - -## **2. Codeaufbau** - -### **2.1. Ordnerstruktur** -Die Datei `repomix-output.txt` zeigt eine strukturierte Übersicht des Projekts. Nachfolgend einige wichtige Verzeichnisse: - -| **Verzeichnis** | **Inhalt** | -|--------------------------|---------------------------------------------------------------------------| -| `src/app` | Next.js-Seiten und Komponenten für Benutzer und Admins. | -| `src/components` | Wiederverwendbare UI-Komponenten wie Karten, Diagramme, Buttons etc. | -| `src/server` | Backend-Logik, Authentifizierung und Datenbankinteraktionen. | -| `src/utils` | Hilfsfunktionen für Analysen, Validierungen und Datenbankzugriffe. | -| `drizzle` | Datenbank-Migrationsdateien und Metadaten. | -| `docker` | Docker-Konfigurations- und Bereitstellungsskripte. | - ---- - -### **2.2. Hauptdateien** -#### **Frontend** -- **`src/app/page.tsx`:** Startseite der Anwendung. -- **`src/app/admin/`:** Admin-spezifische Seiten, z. B. Druckerverwaltung oder Fehlerstatistiken. -- **`src/components/ui/`:** UI-Komponenten wie Dialoge, Formulare und Tabellen. - -#### **Backend** -- **`src/server/auth/`:** Authentifizierung und Benutzerrollenmanagement. -- **`src/server/actions/`:** Funktionen zur Interaktion mit Druckaufträgen und Druckern. -- **`src/utils/`:** Analyse und Verarbeitung von Druckdaten (z. B. Fehlerquoten und Auslastung). - -#### **Datenbank** -- **`drizzle/0000_overjoyed_strong_guy.sql`:** SQLite-Datenbankschema mit Tabellen für Drucker, Benutzer und Druckaufträge. -- **`drizzle.meta/`:** Metadaten zur Datenbankmigration. - ---- - -### **2.3. Datenbankschema** -Das Schema enthält vier Haupttabellen: -1. **`user`:** Speichert Benutzerinformationen, einschließlich Rollen und E-Mail-Adressen. -2. **`printer`:** Beschreibt die Drucker, ihren Status und ihre Eigenschaften. -3. **`printJob`:** Zeichnet Druckaufträge auf, einschließlich Startzeit, Dauer und Abbruchgrund. -4. **`session`:** Verwaltert Benutzer-Sitzungen und Ablaufzeiten. - ---- - -## **3. Wichtige Funktionen** - -### **3.1. Authentifizierung** -Das System nutzt OAuth zur Anmeldung. Benutzerrollen werden in der Tabelle `user` gespeichert und im Backend überprüft. - -### **3.2. Statistiken** -- **Fehlerrate:** Berechnet die Häufigkeit von Abbrüchen für jeden Drucker. -- **Auslastung:** Prozentuale Nutzung der Drucker, basierend auf geplanten und abgeschlossenen Druckaufträgen. -- **Prognosen:** Verwenden historische Daten, um zukünftige Drucknutzungen vorherzusagen. - -### **3.3. API-Endpunkte** -- **`src/app/api/printers/`:** Zugriff auf Druckerkonfigurationsdaten. -- **`src/app/api/job/[jobId]/`:** Verwaltung einzelner Druckaufträge. - -Nächster Schritt: [=> Datenbank und Analytik-Funktionen](./Datenbank.md) \ No newline at end of file diff --git a/packages/reservation-platform/docs/Bereitstellungsdetails .md b/packages/reservation-platform/docs/Bereitstellungsdetails .md deleted file mode 100644 index 78a5b5a3..00000000 --- a/packages/reservation-platform/docs/Bereitstellungsdetails .md +++ /dev/null @@ -1,150 +0,0 @@ -# **Bereitstellungsdetails und Best Practices** - -In diesem Abschnitt erläutere ich, wie das MYP-Projekt auf einem Server bereitgestellt wird, sowie empfohlene Praktiken zur Verwaltung und Optimierung des Systems. - ---- - -## **1. Bereitstellungsschritte** - -### **1.1. Voraussetzungen** -- **Server:** Raspberry Pi mit installiertem Raspbian Lite. -- **Docker:** Docker und Docker Compose müssen vorab installiert sein. -- **Netzwerk:** Der Server muss über eine statische IP-Adresse oder einen DNS-Namen erreichbar sein. - -### **1.2. Vorbereitung** -#### **1.2.1. Docker-Images erstellen und speichern** -Führen Sie die folgenden Schritte auf dem Entwicklungssystem aus: -1. **Images erstellen:** - ```bash - bash docker/build.sh - ``` -2. **Images exportieren und komprimieren:** - ```bash - bash docker/save.sh - ``` - Dies speichert die Docker-Images im Verzeichnis `docker/images/`. - -#### **1.2.2. Übertragung auf den Server** -Kopieren Sie die erzeugten `.tar.xz`-Dateien auf den Raspberry Pi: -```bash -scp docker/images/*.tar.xz @:/path/to/destination/ -``` - ---- - -### **1.3. Images auf dem Server laden** -Loggen Sie sich auf dem Server ein und laden Sie die Docker-Images: -```bash -docker load -i /path/to/destination/.tar.xz -``` - ---- - -### **1.4. Starten der Anwendung** -Führen Sie das Bereitstellungsskript aus: -```bash -bash docker/deploy.sh -``` -Dieses Skript: -- Startet die Docker-Container mithilfe von `docker compose`. -- Verbindet den Reverse Proxy (Caddy) mit der Anwendung. - -Die Anwendung sollte unter `http://` oder der konfigurierten Domain erreichbar sein. - ---- - -## **2. Best Practices** - -### **2.1. Sicherheit** -1. **Umgebungsvariablen schützen:** - - Stellen Sie sicher, dass die Datei `.env` nicht versehentlich in ein öffentliches Repository hochgeladen wird. - - Verwenden Sie geeignete Zugriffsrechte: - ```bash - chmod 600 .env - ``` -2. **HTTPS aktivieren:** - - Der Caddy-Webserver unterstützt automatisch HTTPS. Stellen Sie sicher, dass eine gültige Domain konfiguriert ist. - -3. **Zugriffsrechte beschränken:** - - Verwenden Sie Benutzerrollen („admin“, „guest“), um den Zugriff auf kritische Funktionen zu steuern. - ---- - -### **2.2. Performance** -1. **Docker-Container optimieren:** - - Reduzieren Sie die Größe der Docker-Images, indem Sie unnötige Dateien in `.dockerignore` ausschließen. - -2. **Datenbankwartung:** - - Führen Sie regelmäßige Backups der SQLite-Datenbank durch: - ```bash - cp db/sqlite.db /path/to/backup/location/ - ``` - - Optimieren Sie die Datenbank regelmäßig: - ```sql - VACUUM; - ``` - -3. **Skalierung:** - - Bei hoher Last kann die Anwendung mit Kubernetes oder einer Cloud-Lösung (z. B. AWS oder Azure) skaliert werden. - ---- - -### **2.3. Fehlerbehebung** -1. **Logs überprüfen:** - - Docker-Logs können wichtige Debug-Informationen liefern: - ```bash - docker logs - ``` - -2. **Health Checks:** - - Integrieren Sie Health Checks in die Docker Compose-Datei, um sicherzustellen, dass die Dienste korrekt laufen. - -3. **Fehlerhafte Drucker deaktivieren:** - - Deaktivieren Sie Drucker mit einer hohen Fehlerrate über das Admin-Dashboard, um die Benutzererfahrung zu verbessern. - ---- - -### **2.4. Updates** -1. **Neue Funktionen hinzufügen:** - - Aktualisieren Sie die Anwendung und erstellen Sie neue Docker-Images: - ```bash - git pull origin main - bash docker/build.sh - ``` - - Stellen Sie die aktualisierten Images bereit: - ```bash - bash docker/deploy.sh - ``` - -2. **Datenbankmigrationen:** - - Führen Sie neue Migrationsskripte mit folgendem Befehl aus: - ```bash - pnpm run db:migrate - ``` - ---- - -## **3. Backup und Wiederherstellung** - -### **3.1. Backups erstellen** -Sichern Sie wichtige Dateien und Datenbanken regelmäßig: -- **SQLite-Datenbank:** - ```bash - cp db/sqlite.db /backup/location/sqlite-$(date +%F).db - ``` -- **Docker-Images:** - ```bash - docker save myp-rp:latest | gzip > /backup/location/myp-rp-$(date +%F).tar.gz - ``` - -### **3.2. Wiederherstellung** -- **Datenbank wiederherstellen:** - ```bash - cp /backup/location/sqlite-.db db/sqlite.db - ``` -- **Docker-Images importieren:** - ```bash - docker load < /backup/location/myp-rp-.tar.gz - ``` - -Nächster Schritt: [=> Admin-Dashboard](./Admin-Dashboard.md) \ No newline at end of file diff --git a/packages/reservation-platform/docs/Datenbank.md b/packages/reservation-platform/docs/Datenbank.md deleted file mode 100644 index 253a16ea..00000000 --- a/packages/reservation-platform/docs/Datenbank.md +++ /dev/null @@ -1,153 +0,0 @@ -# **Datenbank und Analytik-Funktionen** - -Dieser Abschnitt konzentriert sich auf die Struktur der Datenbank sowie die Analyse- und Prognosefunktionen, die im Projekt verwendet werden. - ---- - -## **1. Datenbankstruktur** - -Das Datenbankschema wurde mit **Drizzle ORM** definiert und basiert auf SQLite. Die wichtigsten Tabellen und ihre Zwecke sind: - -### **1.1. Tabellenübersicht** - -#### **`user`** -- Speichert Benutzerinformationen. -- Enthält Rollen wie „admin“ oder „guest“ zur Verwaltung von Berechtigungen. - -| **Feld** | **Typ** | **Beschreibung** | -|-------------------|------------|-------------------------------------------| -| `id` | `text` | Eindeutige ID des Benutzers. | -| `github_id` | `integer` | ID des Benutzers aus dem OAuth-Dienst. | -| `name` | `text` | Benutzername. | -| `displayName` | `text` | Angezeigter Name. | -| `email` | `text` | E-Mail-Adresse. | -| `role` | `text` | Benutzerrolle, Standardwert: „guest“. | - ---- - -#### **`printer`** -- Beschreibt verfügbare Drucker und deren Status. - -| **Feld** | **Typ** | **Beschreibung** | -|-------------------|------------|-------------------------------------------| -| `id` | `text` | Eindeutige Drucker-ID. | -| `name` | `text` | Name des Druckers. | -| `description` | `text` | Beschreibung oder Spezifikationen. | -| `status` | `integer` | Betriebsstatus (0 = inaktiv, 1 = aktiv). | - ---- - -#### **`printJob`** -- Speichert Informationen zu Druckaufträgen. - -| **Feld** | **Typ** | **Beschreibung** | -|-----------------------|---------------|-------------------------------------------------------| -| `id` | `text` | Eindeutige Auftrags-ID. | -| `printerId` | `text` | Verweis auf die ID des Druckers. | -| `userId` | `text` | Verweis auf die ID des Benutzers. | -| `startAt` | `integer` | Startzeit des Druckauftrags (Unix-Timestamp). | -| `durationInMinutes` | `integer` | Dauer des Druckauftrags in Minuten. | -| `comments` | `text` | Zusätzliche Kommentare. | -| `aborted` | `integer` | 1 = Abgebrochen, 0 = Erfolgreich abgeschlossen. | -| `abortReason` | `text` | Grund für den Abbruch (falls zutreffend). | - ---- - -#### **`session`** -- Verwaltert Benutzer-Sitzungen und Ablaufzeiten. - -| **Feld** | **Typ** | **Beschreibung** | -|-------------------|------------|-------------------------------------------| -| `id` | `text` | Eindeutige Sitzungs-ID. | -| `user_id` | `text` | Verweis auf die ID des Benutzers. | -| `expires_at` | `integer` | Zeitpunkt, wann die Sitzung abläuft. | - ---- - -### **1.2. Relationen** -- `printer` → `printJob`: Druckaufträge sind an spezifische Drucker gebunden. -- `user` → `printJob`: Druckaufträge werden Benutzern zugewiesen. -- `user` → `session`: Sitzungen verknüpfen Benutzer mit Login-Details. - ---- - -## **2. Analytik-Funktionen** - -Das Projekt bietet verschiedene Analytik- und Prognosetools, um die Druckernutzung und Fehler zu überwachen. - -### **2.1. Fehlerratenanalyse** -- Funktion: `calculatePrinterErrorRate` (in `src/utils/analytics/error-rate.ts`). -- Berechnet die prozentuale Fehlerrate für jeden Drucker basierend auf abgebrochenen Aufträgen. - -Beispielausgabe: -```json -[ - { "name": "Drucker 1", "errorRate": 5.2 }, - { "name": "Drucker 2", "errorRate": 3.7 } -] -``` - ---- - -### **2.2. Abbruchgründe** -- Funktion: `calculateAbortReasonsCount` (in `src/utils/analytics/errors.ts`). -- Zählt die Häufigkeit der Abbruchgründe aus der Tabelle `printJob`. - -Beispielausgabe: -```json -[ - { "abortReason": "Materialmangel", "count": 10 }, - { "abortReason": "Düsenverstopfung", "count": 7 } -] -``` - ---- - -### **2.3. Nutzung und Prognosen** -#### Nutzung: -- Funktion: `calculatePrinterUtilization` (in `src/utils/analytics/utilization.ts`). -- Berechnet die Nutzung der Drucker in Prozent. - -Beispielausgabe: -```json -{ "printerId": "1", "utilizationPercentage": 85 } -``` - -#### Prognosen: -- Funktion: `forecastPrinterUsage` (in `src/utils/analytics/forecast.ts`). -- Nutzt historische Daten, um die erwartete Druckernutzung für kommende Tage/Wochen zu schätzen. - -Beispielausgabe: -```json -[ - { "day": 1, "usageMinutes": 300 }, - { "day": 2, "usageMinutes": 200 } -] -``` - ---- - -### **2.4. Druckvolumen** -- Funktion: `calculatePrintVolumes` (in `src/utils/analytics/volume.ts`). -- Vergleicht die Anzahl der abgeschlossenen Druckaufträge für heute, diese Woche und diesen Monat. - -Beispielausgabe: -```json -{ - "today": 15, - "thisWeek": 90, - "thisMonth": 300 -} -``` - ---- - -## **3. Datenbankinitialisierung** -Die Datenbank wird über Skripte in der `package.json` initialisiert: -```bash -pnpm run db:clean # Datenbank und Migrationsordner löschen -pnpm run db:generate # Neues Schema generieren -pnpm run db:migrate # Migrationsskripte ausführen -``` - -Nächster Schritt: [=> Bereitstellungsdetails und Best Practices](./Bereitstellungsdetails.md) \ No newline at end of file diff --git a/packages/reservation-platform/docs/Installation.md b/packages/reservation-platform/docs/Installation.md deleted file mode 100644 index c1d866da..00000000 --- a/packages/reservation-platform/docs/Installation.md +++ /dev/null @@ -1,93 +0,0 @@ -# **Installation und Einrichtung** - -In diesem Abschnitt wird beschrieben, wie die MYP-Anwendung installiert und eingerichtet wird. Diese Schritte umfassen die Vorbereitung der Umgebung, das Konfigurieren der notwendigen Dienste und die Bereitstellung des Projekts. - ---- - -## **Voraussetzungen** -### **Hardware und Software** -- **Raspberry Pi:** Die Anwendung ist für den Einsatz auf einem Raspberry Pi optimiert, auf dem Raspbian Lite installiert sein sollte. -- **Docker:** Docker und Docker Compose müssen installiert sein. -- **Netzwerkzugriff:** Der Raspberry Pi muss im Netzwerk erreichbar sein. - -### **Abhängigkeiten** -- Node.js (mindestens Version 20) -- PNPM (Paketmanager) -- SQLite (für lokale Datenbankverwaltung) - ---- - -## **Schritte zur Einrichtung** - -### **1. Repository klonen** -Klonen Sie das Repository auf Ihr System: -```bash -git clone -cd -``` - -### **2. Konfiguration der Umgebungsvariablen** -Passen Sie die Datei `.env.example` an und benennen Sie sie in `.env` um: -```bash -cp .env.example .env -``` -Erforderliche Variablen: -- `OAUTH_CLIENT_ID`: Client-ID für die OAuth-Authentifizierung -- `OAUTH_CLIENT_SECRET`: Geheimnis für die OAuth-Authentifizierung - -### **3. Docker-Container erstellen** -Führen Sie das Skript `build.sh` aus, um Docker-Images zu erstellen: -```bash -bash docker/build.sh -``` -Dies erstellt die notwendigen Docker-Images, einschließlich der Anwendung und eines Caddy-Webservers. - -### **4. Docker-Images speichern** -Speichern Sie die Images in komprimierter Form, um sie auf anderen Geräten bereitzustellen: -```bash -bash docker/save.sh -``` - -### **5. Bereitstellung** -Kopieren Sie die Docker-Images auf den Zielserver (z. B. Raspberry Pi) und führen Sie `deploy.sh` aus: -```bash -scp docker/images/*.tar.xz :/path/to/deployment/ -bash docker/deploy.sh -``` -Das Skript führt die Docker Compose-Konfiguration aus und startet die Anwendung. - -### **(Optional: 6. Admin-User anlegen)** - -Um einen Admin-User anzulegen, muss zuerst das Container-Image gestartet werden. Anschließend meldet man sich mittels -der GitHub-Authentifizierung bei der Anwendung an. - -Der nun in der Datenbank angelegte User hat die Rolle `guest`. Über das CLI muss man nun in die SQLite-Datenbank (die Datenbank sollte außerhalb des Container-Images liegen) wechseln und -den User updaten. - - -#### SQL-Befehl, um den User zu updaten: -```bash -sqlite3 db.sqlite3 -UPDATE users SET role = 'admin' WHERE id = ; -``` - ---- - -## **Start der Anwendung** -Sobald die Docker-Container laufen, ist die Anwendung unter der angegebenen Domain oder IP-Adresse erreichbar. Standardmäßig verwendet der Caddy-Webserver Port 80 (HTTP) und 443 (HTTPS). - ---- - -## **Optional: Entwicklungsmodus** -Für lokale Tests können Sie die Anwendung ohne Docker starten: -1. Installieren Sie Abhängigkeiten: - ```bash - pnpm install - ``` -2. Starten Sie den Entwicklungsserver: - ```bash - pnpm dev - ``` - Die Anwendung ist dann unter `http://localhost:3000` verfügbar. - -Nächster Schritt: [=> Nutzung](./Nutzung.md) \ No newline at end of file diff --git a/packages/reservation-platform/docs/Nutzung.md b/packages/reservation-platform/docs/Nutzung.md deleted file mode 100644 index 2080933b..00000000 --- a/packages/reservation-platform/docs/Nutzung.md +++ /dev/null @@ -1,75 +0,0 @@ -# **Features und Nutzung der Anwendung** - -In diesem Abschnitt beschreibe ich die Hauptfunktionen von MYP (Manage Your Printer) und gebe Anweisungen zur Nutzung der verschiedenen Module. - ---- - -## **1. Hauptfunktionen** - -### **1.1. Druckerreservierung** -- Nutzer können Drucker für einen definierten Zeitraum reservieren. -- Konflikte bei Reservierungen werden durch ein Echtzeit-Überprüfungssystem verhindert. - -### **1.2. Fehler- und Auslastungsanalyse** -- Darstellung von Druckfehlern nach Kategorien und Häufigkeiten. -- Übersicht der aktuellen und historischen Druckernutzung. -- Diagramme zur Fehlerrate, Nutzung und Druckvolumen. - -### **1.3. Admin-Dashboard** -- Verwaltung von Druckern, Nutzern und Druckaufträgen. -- Überblick über alle Abbruchgründe und Druckfehler. -- Zugriff auf erweiterte Statistiken und Prognosen. - ---- - -## **2. Nutzung der Anwendung** - -### **2.1. Login und Authentifizierung** -- Die Anwendung unterstützt OAuth-basierte Authentifizierung. -- Nutzer müssen sich mit einem gültigen Konto anmelden, um Zugriff auf die Funktionen zu erhalten. - -### **2.2. Dashboard** -- Nach dem Login gelangen die Nutzer auf das Dashboard, das einen Überblick über die aktuelle Druckernutzung bietet. -- Administratoren haben Zugriff auf zusätzliche Menüpunkte, wie z. B. Benutzerverwaltung. - ---- - -## **3. Admin-Funktionen** - -### **3.1. Druckerverwaltung** -- Administratoren können Drucker hinzufügen, bearbeiten oder löschen. -- Status eines Druckers (z. B. „in Betrieb“, „außer Betrieb“) kann angepasst werden. - -### **3.2. Nutzerverwaltung** -- Verwalten von Benutzerkonten, einschließlich Rollen (z. B. „Admin“ oder „User“). -- Benutzer können aktiviert oder deaktiviert werden. - -### **3.3. Statistiken und Berichte** -- Diagramme wie: - - **Abbruchgründe:** Zeigt häufige Fehlerursachen. - - **Fehlerrate:** Prozentuale Fehlerquote der Drucker. - - **Nutzung:** Prognosen für die Druckernutzung pro Wochentag. - ---- - -## **4. Diagramme und Visualisierungen** - -### **4.1. Abbruchgründe** -- Ein Säulendiagramm zeigt die Häufigkeiten der Fehlerursachen. -- Nutzt Echtzeit-Daten aus der Druckhistorie. - -### **4.2. Prognostizierte Nutzung** -- Ein Liniendiagramm zeigt die erwartete Druckernutzung pro Tag. -- Hilft bei der Planung von Wartungszeiten. - -### **4.3. Druckvolumen** -- Balkendiagramme vergleichen Druckaufträge heute, diese Woche und diesen Monat. - ---- - -## **5. Interaktive Komponenten** -- **Benachrichtigungen:** Informieren über Druckaufträge, Fehler oder Systemereignisse. -- **Filter und Suchfunktionen:** Erleichtern das Auffinden von Druckern oder Druckaufträgen. -- **Rollenbasierter Zugriff:** Funktionen sind je nach Benutzerrolle eingeschränkt. - -Nächster Schritt: [=> Technische Architektur und Codeaufbau](./Architektur.md) \ No newline at end of file diff --git a/packages/reservation-platform/docs/README.md b/packages/reservation-platform/docs/README.md deleted file mode 100644 index 741f73b2..00000000 --- a/packages/reservation-platform/docs/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# **Einleitung** - -> Information: Die Dokumenation wurde mit generativer AI erstellt und kann fehlerhaft sein. Im Zweifel bitte die Quellcode-Dateien anschauen oder die Entwickler kontaktieren. - -## **Projektbeschreibung** -MYP (Manage Your Printer) ist eine Webanwendung zur Verwaltung und Reservierung von 3D-Druckern. Das Projekt wurde als Abschlussarbeit im Rahmen der Fachinformatiker-Ausbildung mit Schwerpunkt Daten- und Prozessanalyse entwickelt und dient als Plattform zur einfachen Koordination und Überwachung von Druckressourcen. Es wurde speziell für die Technische Berufsausbildung des Mercedes-Benz Werkes in Berlin-Marienfelde erstellt. - ---- - -## **Hauptmerkmale** -- **Druckerreservierungen:** Nutzer können 3D-Drucker in definierten Zeitfenstern reservieren. -- **Fehleranalyse:** Statistiken über Druckfehler und Abbruchgründe werden visuell dargestellt. -- **Druckauslastung:** Echtzeit-Daten über die Nutzung der Drucker. -- **Admin-Dashboard:** Übersichtliche Verwaltung und Konfiguration von Druckern, Benutzern und Druckaufträgen. -- **Datenbankintegration:** Alle Daten werden in einer SQLite-Datenbank gespeichert und verwaltet. - ---- - -## **Technologien** -- **Frontend:** React, Next.js, TailwindCSS -- **Backend:** Node.js, Drizzle ORM -- **Datenbank:** SQLite -- **Deployment:** Docker und Raspberry Pi -- **Zusätzliche Bibliotheken:** recharts für Diagramme, Faker.js für Testdaten, sowie diverse Radix-UI-Komponenten. - ---- - -## **Dateistruktur** -Die Repository-Dateien sind in logische Abschnitte unterteilt: -1. **Docker-Konfigurationen** (`docker/`) - Skripte und Konfigurationsdateien für die Bereitstellung. -2. **Frontend-Komponenten** (`src/app/`) - Weboberfläche und deren Funktionalitäten. -3. **Backend-Funktionen** (`src/server/`) - Datenbankinteraktionen und Authentifizierungslogik. -4. **Utils und Helferfunktionen** (`src/utils/`) - Wiederverwendbare Dienste und Hilfsmethoden. -5. **Datenbank-Skripte** (`drizzle/`) - Datenbankschemas und Migrationsdateien. - - -Nächster Schritt: [=> Installation](./Installation.md) diff --git a/packages/reservation-platform/drizzle.config.ts b/packages/reservation-platform/drizzle.config.ts deleted file mode 100644 index 965ecba7..00000000 --- a/packages/reservation-platform/drizzle.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from "drizzle-kit"; - -//@ts-ignore - better-sqlite driver throws an error even though its an valid value -export default defineConfig({ - dialect: "sqlite", - schema: "./src/server/db/schema.ts", - out: "./drizzle", - driver: "libsql", - dbCredentials: { - url: "file:./db/sqlite.db", - }, -}); diff --git a/packages/reservation-platform/drizzle/0000_overjoyed_strong_guy.sql b/packages/reservation-platform/drizzle/0000_overjoyed_strong_guy.sql deleted file mode 100644 index 13501e10..00000000 --- a/packages/reservation-platform/drizzle/0000_overjoyed_strong_guy.sql +++ /dev/null @@ -1,35 +0,0 @@ -CREATE TABLE `printJob` ( - `id` text PRIMARY KEY NOT NULL, - `printerId` text NOT NULL, - `userId` text NOT NULL, - `startAt` integer NOT NULL, - `durationInMinutes` integer NOT NULL, - `comments` text, - `aborted` integer DEFAULT false NOT NULL, - `abortReason` text, - FOREIGN KEY (`printerId`) REFERENCES `printer`(`id`) ON UPDATE no action ON DELETE cascade, - FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `printer` ( - `id` text PRIMARY KEY NOT NULL, - `name` text NOT NULL, - `description` text NOT NULL, - `status` integer DEFAULT 0 NOT NULL -); ---> statement-breakpoint -CREATE TABLE `session` ( - `id` text PRIMARY KEY NOT NULL, - `user_id` text NOT NULL, - `expires_at` integer NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `user` ( - `id` text PRIMARY KEY NOT NULL, - `github_id` integer NOT NULL, - `name` text, - `displayName` text, - `email` text NOT NULL, - `role` text DEFAULT 'guest' -); diff --git a/packages/reservation-platform/drizzle/meta/0000_snapshot.json b/packages/reservation-platform/drizzle/meta/0000_snapshot.json deleted file mode 100644 index 6a12d0d9..00000000 --- a/packages/reservation-platform/drizzle/meta/0000_snapshot.json +++ /dev/null @@ -1,241 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "791dc197-5254-4432-bd9f-1368d1a5aa6a", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "printJob": { - "name": "printJob", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "printerId": { - "name": "printerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "startAt": { - "name": "startAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "durationInMinutes": { - "name": "durationInMinutes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "comments": { - "name": "comments", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "aborted": { - "name": "aborted", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "abortReason": { - "name": "abortReason", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "printJob_printerId_printer_id_fk": { - "name": "printJob_printerId_printer_id_fk", - "tableFrom": "printJob", - "tableTo": "printer", - "columnsFrom": [ - "printerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "printJob_userId_user_id_fk": { - "name": "printJob_userId_user_id_fk", - "tableFrom": "printJob", - "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "printer": { - "name": "printer", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "session": { - "name": "session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "session_user_id_user_id_fk": { - "name": "session_user_id_user_id_fk", - "tableFrom": "session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "github_id": { - "name": "github_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "displayName": { - "name": "displayName", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'guest'" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/packages/reservation-platform/drizzle/meta/_journal.json b/packages/reservation-platform/drizzle/meta/_journal.json deleted file mode 100644 index 73e233ca..00000000 --- a/packages/reservation-platform/drizzle/meta/_journal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "6", - "when": 1715416514336, - "tag": "0000_overjoyed_strong_guy", - "breakpoints": true - } - ] -} \ No newline at end of file diff --git a/packages/reservation-platform/next.config.mjs b/packages/reservation-platform/next.config.mjs deleted file mode 100644 index 887b2d21..00000000 --- a/packages/reservation-platform/next.config.mjs +++ /dev/null @@ -1,26 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - async headers() { - return [ - { - source: "/:path*", - headers: [ - { - key: "Access-Control-Allow-Origin", - value: "m040tbaraspi001.de040.corpintra.net", - }, - { - key: "Access-Control-Allow-Methods", - value: "GET, POST, PUT, DELETE, OPTIONS", - }, - { - key: "Access-Control-Allow-Headers", - value: "Content-Type, Authorization", - }, - ], - }, - ]; - }, -}; - -export default nextConfig; diff --git a/packages/reservation-platform/package.json b/packages/reservation-platform/package.json deleted file mode 100644 index 23f19656..00000000 --- a/packages/reservation-platform/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "myp-rp", - "version": "1.0.0", - "private": true, - "packageManager": "pnpm@9.12.1", - "scripts": { - "dev": "next dev", - "build": "node update-package.js && next build", - "start": "next start", - "lint": "next lint", - "db:create-default": "mkdir -p db/", - "db:generate-sqlite": "pnpm drizzle-kit generate", - "db:clean": "rm -rf db/ drizzle/", - "db:migrate": "pnpm drizzle-kit migrate", - "db": "pnpm db:create-default && pnpm db:generate-sqlite && pnpm db:migrate", - "db:reset": "pnpm db:clean && pnpm db" - }, - "dependencies": { - "@faker-js/faker": "^9.2.0", - "@headlessui/react": "^2.1.10", - "@headlessui/tailwindcss": "^0.2.1", - "@hookform/resolvers": "^3.9.0", - "@libsql/client": "^0.14.0", - "@lucia-auth/adapter-drizzle": "^1.1.0", - "@radix-ui/react-alert-dialog": "^1.1.2", - "@radix-ui/react-avatar": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.2", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-hover-card": "^1.1.2", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-scroll-area": "^1.2.0", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-tabs": "^1.1.1", - "@radix-ui/react-toast": "^1.2.2", - "@remixicon/react": "^4.3.0", - "@tanstack/react-table": "^8.20.5", - "@tremor/react": "^3.18.3", - "arctic": "^1.9.2", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "date-fns": "^4.1.0", - "drizzle-orm": "^0.30.10", - "lodash": "^4.17.21", - "lucia": "^3.2.1", - "lucide-react": "^0.378.0", - "luxon": "^3.5.0", - "next": "14.2.3", - "next-themes": "^0.3.0", - "oslo": "^1.2.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", - "react-if": "^4.1.5", - "react-timer-hook": "^3.0.7", - "recharts": "^2.13.3", - "regression": "^2.0.1", - "sonner": "^1.5.0", - "sqlite": "^5.1.1", - "sqlite3": "^5.1.7", - "swr": "^2.2.5", - "tailwind-merge": "^2.5.3", - "tailwindcss-animate": "^1.0.7", - "use-debounce": "^10.0.3", - "uuid": "^11.0.2", - "zod": "^3.23.8" - }, - "devDependencies": { - "@biomejs/biome": "^1.9.3", - "@tailwindcss/forms": "^0.5.9", - "@types/lodash": "^4.17.13", - "@types/luxon": "^3.4.2", - "@types/node": "^20.16.11", - "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.1", - "drizzle-kit": "^0.21.4", - "postcss": "^8.4.47", - "tailwindcss": "^3.4.13", - "ts-node": "^10.9.2", - "typescript": "^5.6.3" - } -} diff --git a/packages/reservation-platform/pnpm-lock.yaml b/packages/reservation-platform/pnpm-lock.yaml deleted file mode 100644 index cef9b75a..00000000 --- a/packages/reservation-platform/pnpm-lock.yaml +++ /dev/null @@ -1,5707 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@faker-js/faker': - specifier: ^9.2.0 - version: 9.2.0 - '@headlessui/react': - specifier: ^2.1.10 - version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@headlessui/tailwindcss': - specifier: ^0.2.1 - version: 0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) - '@hookform/resolvers': - specifier: ^3.9.0 - version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) - '@libsql/client': - specifier: ^0.14.0 - version: 0.14.0 - '@lucia-auth/adapter-drizzle': - specifier: ^1.1.0 - version: 1.1.0(drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7))(lucia@3.2.1) - '@radix-ui/react-alert-dialog': - specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-avatar': - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': - specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dropdown-menu': - specifier: ^2.1.2 - version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-hover-card': - specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-icons': - specifier: ^1.3.0 - version: 1.3.0(react@18.3.1) - '@radix-ui/react-label': - specifier: ^2.1.0 - version: 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-scroll-area': - specifier: ^1.2.0 - version: 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': - specifier: ^2.1.2 - version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': - specifier: ^1.1.0 - version: 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-tabs': - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toast': - specifier: ^1.2.2 - version: 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remixicon/react': - specifier: ^4.3.0 - version: 4.3.0(react@18.3.1) - '@tanstack/react-table': - specifier: ^8.20.5 - version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tremor/react': - specifier: ^3.18.3 - version: 3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) - arctic: - specifier: ^1.9.2 - version: 1.9.2 - class-variance-authority: - specifier: ^0.7.0 - version: 0.7.0 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - date-fns: - specifier: ^4.1.0 - version: 4.1.0 - drizzle-orm: - specifier: ^0.30.10 - version: 0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7) - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lucia: - specifier: ^3.2.1 - version: 3.2.1 - lucide-react: - specifier: ^0.378.0 - version: 0.378.0(react@18.3.1) - luxon: - specifier: ^3.5.0 - version: 3.5.0 - next: - specifier: 14.2.3 - version: 14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: - specifier: ^0.3.0 - version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - oslo: - specifier: ^1.2.1 - version: 1.2.1 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - react-hook-form: - specifier: ^7.53.0 - version: 7.53.0(react@18.3.1) - react-if: - specifier: ^4.1.5 - version: 4.1.5(react@18.3.1) - react-timer-hook: - specifier: ^3.0.7 - version: 3.0.7(react@18.3.1) - recharts: - specifier: ^2.13.3 - version: 2.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - regression: - specifier: ^2.0.1 - version: 2.0.1 - sonner: - specifier: ^1.5.0 - version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - sqlite: - specifier: ^5.1.1 - version: 5.1.1 - sqlite3: - specifier: ^5.1.7 - version: 5.1.7 - swr: - specifier: ^2.2.5 - version: 2.2.5(react@18.3.1) - tailwind-merge: - specifier: ^2.5.3 - version: 2.5.3 - tailwindcss-animate: - specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) - use-debounce: - specifier: ^10.0.3 - version: 10.0.3(react@18.3.1) - uuid: - specifier: ^11.0.2 - version: 11.0.2 - zod: - specifier: ^3.23.8 - version: 3.23.8 - devDependencies: - '@biomejs/biome': - specifier: ^1.9.3 - version: 1.9.3 - '@tailwindcss/forms': - specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) - '@types/lodash': - specifier: ^4.17.13 - version: 4.17.13 - '@types/luxon': - specifier: ^3.4.2 - version: 3.4.2 - '@types/node': - specifier: ^20.16.11 - version: 20.16.11 - '@types/react': - specifier: ^18.3.11 - version: 18.3.11 - '@types/react-dom': - specifier: ^18.3.1 - version: 18.3.1 - drizzle-kit: - specifier: ^0.21.4 - version: 0.21.4 - postcss: - specifier: ^8.4.47 - version: 8.4.47 - tailwindcss: - specifier: ^3.4.13 - version: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.16.11)(typescript@5.6.3) - typescript: - specifier: ^5.6.3 - version: 5.6.3 - -packages: - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} - - '@biomejs/biome@1.9.3': - resolution: {integrity: sha512-POjAPz0APAmX33WOQFGQrwLvlu7WLV4CFJMlB12b6ZSg+2q6fYu9kZwLCOA+x83zXfcPd1RpuWOKJW0GbBwLIQ==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@1.9.3': - resolution: {integrity: sha512-QZzD2XrjJDUyIZK+aR2i5DDxCJfdwiYbUKu9GzkCUJpL78uSelAHAPy7m0GuPMVtF/Uo+OKv97W3P9nuWZangQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@1.9.3': - resolution: {integrity: sha512-vSCoIBJE0BN3SWDFuAY/tRavpUtNoqiceJ5PrU3xDfsLcm/U6N93JSM0M9OAiC/X7mPPfejtr6Yc9vSgWlEgVw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@1.9.3': - resolution: {integrity: sha512-VBzyhaqqqwP3bAkkBrhVq50i3Uj9+RWuj+pYmXrMDgjS5+SKYGE56BwNw4l8hR3SmYbLSbEo15GcV043CDSk+Q==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@1.9.3': - resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@1.9.3': - resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@1.9.3': - resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@1.9.3': - resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@1.9.3': - resolution: {integrity: sha512-cQMy2zanBkVLpmmxXdK6YePzmZx0s5Z7KEnwmrW54rcXK3myCNbQa09SwGZ8i/8sLw0H9F3X7K4rxVNGU8/D4Q==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@emnapi/core@0.45.0': - resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} - - '@emnapi/runtime@0.45.0': - resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} - - '@esbuild-kit/core-utils@3.3.2': - resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' - - '@esbuild-kit/esm-loader@2.6.5': - resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' - - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@faker-js/faker@9.2.0': - resolution: {integrity: sha512-ulqQu4KMr1/sTFIYvqSdegHT8NIkt66tFAkugGnHA+1WAfEn6hMzNR+svjXGFRVLnapxvej67Z/LwchFrnLBUg==} - engines: {node: '>=18.0.0', npm: '>=9.0.0'} - - '@floating-ui/core@1.6.1': - resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} - - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - - '@floating-ui/react-dom@1.3.0': - resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react-dom@2.0.9': - resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.19.2': - resolution: {integrity: sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.24': - resolution: {integrity: sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - - '@headlessui/react@1.7.19': - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - - '@headlessui/react@2.1.10': - resolution: {integrity: sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 - react-dom: ^18 - - '@headlessui/tailwindcss@0.2.1': - resolution: {integrity: sha512-2+5+NZ+RzMyrVeCZOxdbvkUSssSxGvcUxphkIfSVLpRiKsj+/63T2TOL9dBYMXVfj/CGr6hMxSRInzXv6YY7sA==} - engines: {node: '>=10'} - peerDependencies: - tailwindcss: ^3.0 - - '@hookform/resolvers@3.9.0': - resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==} - peerDependencies: - react-hook-form: ^7.0.0 - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@libsql/client@0.14.0': - resolution: {integrity: sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==} - - '@libsql/core@0.14.0': - resolution: {integrity: sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==} - - '@libsql/darwin-arm64@0.4.6': - resolution: {integrity: sha512-45i604CJ2Lubbg7NqtDodjarF6VgST8rS5R8xB++MoRqixtDns9PZ6tocT9pRJDWuTWEiy2sjthPOFWMKwYAsg==} - cpu: [arm64] - os: [darwin] - - '@libsql/darwin-x64@0.4.6': - resolution: {integrity: sha512-dRKliflhfr5zOPSNgNJ6C2nZDd4YA8bTXF3MUNqNkcxQ8BffaH9uUwL9kMq89LkFIZQHcyP75bBgZctxfJ/H5Q==} - cpu: [x64] - os: [darwin] - - '@libsql/hrana-client@0.7.0': - resolution: {integrity: sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==} - - '@libsql/isomorphic-fetch@0.3.1': - resolution: {integrity: sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==} - engines: {node: '>=18.0.0'} - - '@libsql/isomorphic-ws@0.1.5': - resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - - '@libsql/linux-arm64-gnu@0.4.6': - resolution: {integrity: sha512-DMPavVyY6vYPAYcQR1iOotHszg+5xSjHSg6F9kNecPX0KKdGq84zuPJmORfKOPtaWvzPewNFdML/e+s1fu09XQ==} - cpu: [arm64] - os: [linux] - - '@libsql/linux-arm64-musl@0.4.6': - resolution: {integrity: sha512-whuHSYAZyclGjM3L0mKGXyWqdAy7qYvPPn+J1ve7FtGkFlM0DiIPjA5K30aWSGJSRh72sD9DBZfnu8CpfSjT6w==} - cpu: [arm64] - os: [linux] - - '@libsql/linux-x64-gnu@0.4.6': - resolution: {integrity: sha512-0ggx+5RwEbYabIlDBBAvavdfIJCZ757u6nDZtBeQIhzW99EKbWG3lvkXHM3qudFb/pDWSUY4RFBm6vVtF1cJGA==} - cpu: [x64] - os: [linux] - - '@libsql/linux-x64-musl@0.4.6': - resolution: {integrity: sha512-SWNrv7Hz72QWlbM/ZsbL35MPopZavqCUmQz2HNDZ55t0F+kt8pXuP+bbI2KvmaQ7wdsoqAA4qBmjol0+bh4ndw==} - cpu: [x64] - os: [linux] - - '@libsql/win32-x64-msvc@0.4.6': - resolution: {integrity: sha512-Q0axn110zDNELfkEog3Nl8p9BU4eI/UvgaHevGyOiSDN7s0KPfj0j6jwVHk4oz3o/d/Gg3DRIxomZ4ftfTOy/g==} - cpu: [x64] - os: [win32] - - '@lucia-auth/adapter-drizzle@1.1.0': - resolution: {integrity: sha512-iCTnZWvfI5lLZOdUHZYiXA1jaspIFEeo2extLxQ3DjP3uOVys7IPwBi7zezLIRu9dhro4H4Kji+7gSYyjcef2A==} - peerDependencies: - drizzle-orm: '>= 0.29 <1' - lucia: 3.x - - '@neon-rs/load@0.0.4': - resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - - '@next/env@14.2.3': - resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} - - '@next/swc-darwin-arm64@14.2.3': - resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@14.2.3': - resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@14.2.3': - resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@14.2.3': - resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@14.2.3': - resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@14.2.3': - resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@14.2.3': - resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-ia32-msvc@14.2.3': - resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.3': - resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@node-rs/argon2-android-arm-eabi@1.7.0': - resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@node-rs/argon2-android-arm64@1.7.0': - resolution: {integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@node-rs/argon2-darwin-arm64@1.7.0': - resolution: {integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@node-rs/argon2-darwin-x64@1.7.0': - resolution: {integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@node-rs/argon2-freebsd-x64@1.7.0': - resolution: {integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': - resolution: {integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@node-rs/argon2-linux-arm64-gnu@1.7.0': - resolution: {integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/argon2-linux-arm64-musl@1.7.0': - resolution: {integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/argon2-linux-x64-gnu@1.7.0': - resolution: {integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/argon2-linux-x64-musl@1.7.0': - resolution: {integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/argon2-wasm32-wasi@1.7.0': - resolution: {integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@node-rs/argon2-win32-arm64-msvc@1.7.0': - resolution: {integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@node-rs/argon2-win32-ia32-msvc@1.7.0': - resolution: {integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@node-rs/argon2-win32-x64-msvc@1.7.0': - resolution: {integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@node-rs/argon2@1.7.0': - resolution: {integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==} - engines: {node: '>= 10'} - - '@node-rs/bcrypt-android-arm-eabi@1.9.0': - resolution: {integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@node-rs/bcrypt-android-arm64@1.9.0': - resolution: {integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@node-rs/bcrypt-darwin-arm64@1.9.0': - resolution: {integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@node-rs/bcrypt-darwin-x64@1.9.0': - resolution: {integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@node-rs/bcrypt-freebsd-x64@1.9.0': - resolution: {integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': - resolution: {integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': - resolution: {integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/bcrypt-linux-arm64-musl@1.9.0': - resolution: {integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/bcrypt-linux-x64-gnu@1.9.0': - resolution: {integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/bcrypt-linux-x64-musl@1.9.0': - resolution: {integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/bcrypt-wasm32-wasi@1.9.0': - resolution: {integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': - resolution: {integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': - resolution: {integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@node-rs/bcrypt-win32-x64-msvc@1.9.0': - resolution: {integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@node-rs/bcrypt@1.9.0': - resolution: {integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==} - engines: {node: '>= 10'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/fs@1.1.1': - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - - '@npmcli/move-file@1.1.2': - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - deprecated: This functionality has been moved to @npmcli/fs - - '@oslojs/asn1@1.0.0': - resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} - - '@oslojs/binary@1.0.0': - resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} - - '@oslojs/crypto@1.0.1': - resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} - - '@oslojs/encoding@1.1.0': - resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@radix-ui/number@1.1.0': - resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} - - '@radix-ui/primitive@1.1.0': - resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} - - '@radix-ui/react-alert-dialog@1.1.2': - resolution: {integrity: sha512-eGSlLzPhKO+TErxkiGcCZGuvbVMnLA1MTnyBksGOeGRGkxHiiJUujsjmNTdWTm4iHVSRaUao9/4Ur671auMghQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-arrow@1.1.0': - resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-avatar@1.1.1': - resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.1.0': - resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.1.0': - resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.0': - resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.1': - resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.2': - resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-direction@1.1.0': - resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.1': - resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dropdown-menu@2.1.2': - resolution: {integrity: sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.1': - resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.0': - resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-hover-card@1.1.2': - resolution: {integrity: sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-icons@1.3.0': - resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} - peerDependencies: - react: ^16.x || ^17.x || ^18.x - - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-label@2.1.0': - resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menu@2.1.2': - resolution: {integrity: sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.2.0': - resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.2': - resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.1': - resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.0.0': - resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.0': - resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-scroll-area@1.2.0': - resolution: {integrity: sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-select@2.1.2': - resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.1.0': - resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-tabs@1.1.1': - resolution: {integrity: sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toast@1.2.2': - resolution: {integrity: sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.0': - resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.0': - resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-previous@1.1.0': - resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.0': - resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.0': - resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.1.0': - resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.1.0': - resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} - - '@react-aria/focus@3.18.3': - resolution: {integrity: sha512-WKUElg+5zS0D3xlVn8MntNnkzJql2J6MuzAMP8Sv5WTgFDse/XGR842dsxPTIyKKdrWVCRegCuwa4m3n/GzgJw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/interactions@3.22.3': - resolution: {integrity: sha512-RRUb/aG+P0IKTIWikY/SylB6bIbLZeztnZY2vbe7RAG5MgVaCgn5HQ45SI15GlTmhsFG8CnF6slJsUFJiNHpbQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/ssr@3.9.6': - resolution: {integrity: sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/utils@3.25.3': - resolution: {integrity: sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-stately/utils@3.10.4': - resolution: {integrity: sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/shared@3.25.0': - resolution: {integrity: sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@remixicon/react@4.3.0': - resolution: {integrity: sha512-mAVDn8pAa9dURltGwiYrf7bPIqjG4ZAnCUHfjpgz3g+HLSDNXOaJ67Z5wmjVB5KMGpp9JbbTN5vsp2z+ajVLWg==} - peerDependencies: - react: '>=18.2.0' - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - - '@tailwindcss/forms@0.5.9': - resolution: {integrity: sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==} - peerDependencies: - tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20' - - '@tanstack/react-table@8.20.5': - resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - '@tanstack/react-virtual@3.10.8': - resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@tanstack/react-virtual@3.5.0': - resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@tanstack/table-core@8.20.5': - resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} - engines: {node: '>=12'} - - '@tanstack/virtual-core@3.10.8': - resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} - - '@tanstack/virtual-core@3.5.0': - resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} - - '@tootallnate/once@1.1.2': - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - - '@tremor/react@3.18.3': - resolution: {integrity: sha512-7QyGE2W9f2FpwH24TKy3/mqBgLl4sHZeQcXP3rxXZ8W2AUq7AVaG1+vIT3xXxISrkh7zknjWlZsuhoF8NWNVDw==} - peerDependencies: - react: ^18.0.0 - react-dom: '>=16.6.0' - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@tybys/wasm-util@0.8.3': - resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} - - '@types/better-sqlite3@7.6.11': - resolution: {integrity: sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==} - - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.0': - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-shape@3.1.6': - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} - - '@types/luxon@3.4.2': - resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} - - '@types/node@20.16.11': - resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==} - - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - - '@types/react@18.3.11': - resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - arctic@1.9.2: - resolution: {integrity: sha512-VTnGpYx+ypboJdNrWnK17WeD7zN/xSCHnpecd5QYsBfVZde/5i+7DJ1wrf/ioSDMiEjagXmyNWAE3V2C9f1hNg==} - - are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} - engines: {node: '>=10'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - better-sqlite3@9.6.0: - resolution: {integrity: sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - cacache@15.3.0: - resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} - engines: {node: '>= 10'} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - caniuse-lite@1.0.30001617: - resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - class-variance-authority@0.7.0: - resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} - engines: {node: '>=0.10'} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - - date-fns@3.6.0: - resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - - date-fns@4.1.0: - resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - - dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - - drizzle-kit@0.21.4: - resolution: {integrity: sha512-Nxcc1ONJLRgbhmR+azxjNF9Ly9privNLEIgW53c92whb4xp8jZLH1kMCh/54ci1mTMuYxPdOukqLwJ8wRudNwA==} - hasBin: true - - drizzle-orm@0.30.10: - resolution: {integrity: sha512-IRy/QmMWw9lAQHpwbUh1b8fcn27S/a9zMIzqea1WNOxK9/4EB8gIo+FZWLiPXzl2n9ixGSv8BhsLZiOppWEwBw==} - peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=3' - '@electric-sql/pglite': '>=0.1.1' - '@libsql/client': '*' - '@neondatabase/serverless': '>=0.1' - '@op-engineering/op-sqlite': '>=2' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1' - '@types/better-sqlite3': '*' - '@types/pg': '*' - '@types/react': '>=18' - '@types/sql.js': '*' - '@vercel/postgres': '>=0.8.0' - '@xata.io/client': '*' - better-sqlite3: '>=7' - bun-types: '*' - expo-sqlite: '>=13.2.0' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - react: '>=18' - sql.js: '>=1' - sqlite3: '>=5' - peerDependenciesMeta: - '@aws-sdk/client-rds-data': - optional: true - '@cloudflare/workers-types': - optional: true - '@electric-sql/pglite': - optional: true - '@libsql/client': - optional: true - '@neondatabase/serverless': - optional: true - '@op-engineering/op-sqlite': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@types/better-sqlite3': - optional: true - '@types/pg': - optional: true - '@types/react': - optional: true - '@types/sql.js': - optional: true - '@vercel/postgres': - optional: true - '@xata.io/client': - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - react: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - - esbuild-register@3.5.0: - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' - - esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - - fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.3.14: - resolution: {integrity: sha512-4fkAqu93xe9Mk7le9v0y3VrPDqLKHarNi2s4Pv7f2yOvfhWfhc7hRPHC/JyqMqb8B/Dt/eGS4n7ykwf3fOsl8g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - - js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - json-diff@0.9.0: - resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} - hasBin: true - - libsql@0.4.6: - resolution: {integrity: sha512-F5M+ltteK6dCcpjMahrkgT96uFJvVI8aQ4r9f2AzHQjC7BkAYtvfMSTWGvRBezRgMUIU2h1Sy0pF9nOGOD5iyA==} - os: [darwin, linux, win32] - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - - lucia@3.2.1: - resolution: {integrity: sha512-yIVBS/wU3R+8cLClh2ksBNxqHkAd0VUcjvib53azkSdRT1cPkKuFglkxFsghuspaioX+AHhmIECEkdOz/vIJsQ==} - - lucide-react@0.378.0: - resolution: {integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 - - luxon@3.5.0: - resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} - engines: {node: '>=12'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - make-fetch-happen@9.1.0: - resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} - engines: {node: '>= 10'} - - memfs-browser@3.5.10302: - resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} - - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - - memoizee@0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} - hasBin: true - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@1.4.1: - resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} - engines: {node: '>=8'} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.1: - resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - next-themes@0.3.0: - resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} - peerDependencies: - react: ^16.8 || ^17 || ^18 - react-dom: ^16.8 || ^17 || ^18 - - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - - next@14.2.3: - resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true - - node-abi@3.62.0: - resolution: {integrity: sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==} - engines: {node: '>=10'} - - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-gyp@8.4.1: - resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} - engines: {node: '>= 10.12.0'} - hasBin: true - - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - oslo@1.2.0: - resolution: {integrity: sha512-OoFX6rDsNcOQVAD2gQD/z03u4vEjWZLzJtwkmgfRF+KpQUXwdgEXErD7zNhyowmHwHefP+PM9Pw13pgpHMRlzw==} - - oslo@1.2.1: - resolution: {integrity: sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.0: - resolution: {integrity: sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==} - engines: {node: '>=16 || 14 >=14.17'} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} - engines: {node: ^10 || ^12 || >=14} - - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-limit@2.7.0: - resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - react-day-picker@8.10.1: - resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} - peerDependencies: - date-fns: ^2.28.0 || ^3.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-hook-form@7.53.0: - resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - react-if@4.1.5: - resolution: {integrity: sha512-Uk+Ub2gC83PAakuU4+7iLdTEP4LPi2ihNEPCtz/vr8SLGbzkMApbpYbkDZ5z9zYXurd0gg+EK/bpOLFFC1r1eQ==} - engines: {node: '>=12'} - peerDependencies: - react: ^16.x || ^17.x || ^18.x - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-remove-scroll-bar@2.3.6: - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.6.0: - resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-smooth@4.0.1: - resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - react-style-singleton@2.2.1: - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-timer-hook@3.0.7: - resolution: {integrity: sha512-ATpNcU+PQRxxfNBPVqce2+REtjGAlwmfoNQfcEBMZFxPj0r3GYdKhyPHdStvqrejejEi0QvqaJZjy2lBlFvAsA==} - peerDependencies: - react: '>=16.8.0' - - react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - - react-transition-state@2.1.2: - resolution: {integrity: sha512-RkDYBkj1V1ZqBA5AwQPrMt2Uagwsx6b//GVJdRDhs/t0o66w2nhQiyHyFGQEI60mgtbaIdLm8yhBRCvhA+FxEg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - recharts-scale@0.4.5: - resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} - - recharts@2.13.3: - resolution: {integrity: sha512-YDZ9dOfK9t3ycwxgKbrnDlRC4BHdjlY73fet3a0C1+qGMjXVZe6+VXmpOIIhzkje5MMEL8AN4hLIe4AMskBzlA==} - engines: {node: '>=14'} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regression@2.0.1: - resolution: {integrity: sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - socks-proxy-agent@6.2.1: - resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} - engines: {node: '>= 10'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - sonner@1.5.0: - resolution: {integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - sqlite3@5.1.7: - resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} - - sqlite@5.1.1: - resolution: {integrity: sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==} - - ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - swr@2.2.5: - resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - tailwind-merge@2.5.3: - resolution: {integrity: sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==} - - tailwindcss-animate@1.0.7: - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - - tailwindcss@3.4.13: - resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} - engines: {node: '>=14.0.0'} - hasBin: true - - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - - unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} - - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-debounce@10.0.3: - resolution: {integrity: sha512-DxQSI9ZKso689WM1mjgGU3ozcxU1TJElBJ3X6S4SMzMNcm2lVH0AHmyXB+K7ewjz2BSUKJTDqTcwtSMRfB89dg==} - engines: {node: '>= 16.0.0'} - peerDependencies: - react: '*' - - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-sync-external-store@1.2.2: - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@11.0.2: - resolution: {integrity: sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ==} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - victory-vendor@36.9.2: - resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} - - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - -snapshots: - - '@alloc/quick-lru@5.2.0': {} - - '@babel/runtime@7.24.5': - dependencies: - regenerator-runtime: 0.14.1 - - '@biomejs/biome@1.9.3': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.3 - '@biomejs/cli-darwin-x64': 1.9.3 - '@biomejs/cli-linux-arm64': 1.9.3 - '@biomejs/cli-linux-arm64-musl': 1.9.3 - '@biomejs/cli-linux-x64': 1.9.3 - '@biomejs/cli-linux-x64-musl': 1.9.3 - '@biomejs/cli-win32-arm64': 1.9.3 - '@biomejs/cli-win32-x64': 1.9.3 - - '@biomejs/cli-darwin-arm64@1.9.3': - optional: true - - '@biomejs/cli-darwin-x64@1.9.3': - optional: true - - '@biomejs/cli-linux-arm64-musl@1.9.3': - optional: true - - '@biomejs/cli-linux-arm64@1.9.3': - optional: true - - '@biomejs/cli-linux-x64-musl@1.9.3': - optional: true - - '@biomejs/cli-linux-x64@1.9.3': - optional: true - - '@biomejs/cli-win32-arm64@1.9.3': - optional: true - - '@biomejs/cli-win32-x64@1.9.3': - optional: true - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@emnapi/core@0.45.0': - dependencies: - tslib: 2.6.2 - optional: true - - '@emnapi/runtime@0.45.0': - dependencies: - tslib: 2.6.2 - optional: true - - '@esbuild-kit/core-utils@3.3.2': - dependencies: - esbuild: 0.18.20 - source-map-support: 0.5.21 - - '@esbuild-kit/esm-loader@2.6.5': - dependencies: - '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.7.5 - - '@esbuild/aix-ppc64@0.19.12': - optional: true - - '@esbuild/android-arm64@0.18.20': - optional: true - - '@esbuild/android-arm64@0.19.12': - optional: true - - '@esbuild/android-arm@0.18.20': - optional: true - - '@esbuild/android-arm@0.19.12': - optional: true - - '@esbuild/android-x64@0.18.20': - optional: true - - '@esbuild/android-x64@0.19.12': - optional: true - - '@esbuild/darwin-arm64@0.18.20': - optional: true - - '@esbuild/darwin-arm64@0.19.12': - optional: true - - '@esbuild/darwin-x64@0.18.20': - optional: true - - '@esbuild/darwin-x64@0.19.12': - optional: true - - '@esbuild/freebsd-arm64@0.18.20': - optional: true - - '@esbuild/freebsd-arm64@0.19.12': - optional: true - - '@esbuild/freebsd-x64@0.18.20': - optional: true - - '@esbuild/freebsd-x64@0.19.12': - optional: true - - '@esbuild/linux-arm64@0.18.20': - optional: true - - '@esbuild/linux-arm64@0.19.12': - optional: true - - '@esbuild/linux-arm@0.18.20': - optional: true - - '@esbuild/linux-arm@0.19.12': - optional: true - - '@esbuild/linux-ia32@0.18.20': - optional: true - - '@esbuild/linux-ia32@0.19.12': - optional: true - - '@esbuild/linux-loong64@0.18.20': - optional: true - - '@esbuild/linux-loong64@0.19.12': - optional: true - - '@esbuild/linux-mips64el@0.18.20': - optional: true - - '@esbuild/linux-mips64el@0.19.12': - optional: true - - '@esbuild/linux-ppc64@0.18.20': - optional: true - - '@esbuild/linux-ppc64@0.19.12': - optional: true - - '@esbuild/linux-riscv64@0.18.20': - optional: true - - '@esbuild/linux-riscv64@0.19.12': - optional: true - - '@esbuild/linux-s390x@0.18.20': - optional: true - - '@esbuild/linux-s390x@0.19.12': - optional: true - - '@esbuild/linux-x64@0.18.20': - optional: true - - '@esbuild/linux-x64@0.19.12': - optional: true - - '@esbuild/netbsd-x64@0.18.20': - optional: true - - '@esbuild/netbsd-x64@0.19.12': - optional: true - - '@esbuild/openbsd-x64@0.18.20': - optional: true - - '@esbuild/openbsd-x64@0.19.12': - optional: true - - '@esbuild/sunos-x64@0.18.20': - optional: true - - '@esbuild/sunos-x64@0.19.12': - optional: true - - '@esbuild/win32-arm64@0.18.20': - optional: true - - '@esbuild/win32-arm64@0.19.12': - optional: true - - '@esbuild/win32-ia32@0.18.20': - optional: true - - '@esbuild/win32-ia32@0.19.12': - optional: true - - '@esbuild/win32-x64@0.18.20': - optional: true - - '@esbuild/win32-x64@0.19.12': - optional: true - - '@faker-js/faker@9.2.0': {} - - '@floating-ui/core@1.6.1': - dependencies: - '@floating-ui/utils': 0.2.8 - - '@floating-ui/dom@1.6.5': - dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.8 - - '@floating-ui/react-dom@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/react-dom@2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/react@0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.2.0 - - '@floating-ui/react@0.26.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.8 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.2.0 - - '@floating-ui/utils@0.2.8': {} - - '@gar/promisify@1.1.3': - optional: true - - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - client-only: 0.0.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@headlessui/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react': 0.26.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)))': - dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) - - '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': - dependencies: - react-hook-form: 7.53.0(react@18.3.1) - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@libsql/client@0.14.0': - dependencies: - '@libsql/core': 0.14.0 - '@libsql/hrana-client': 0.7.0 - js-base64: 3.7.7 - libsql: 0.4.6 - promise-limit: 2.7.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@libsql/core@0.14.0': - dependencies: - js-base64: 3.7.7 - - '@libsql/darwin-arm64@0.4.6': - optional: true - - '@libsql/darwin-x64@0.4.6': - optional: true - - '@libsql/hrana-client@0.7.0': - dependencies: - '@libsql/isomorphic-fetch': 0.3.1 - '@libsql/isomorphic-ws': 0.1.5 - js-base64: 3.7.7 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@libsql/isomorphic-fetch@0.3.1': {} - - '@libsql/isomorphic-ws@0.1.5': - dependencies: - '@types/ws': 8.5.12 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@libsql/linux-arm64-gnu@0.4.6': - optional: true - - '@libsql/linux-arm64-musl@0.4.6': - optional: true - - '@libsql/linux-x64-gnu@0.4.6': - optional: true - - '@libsql/linux-x64-musl@0.4.6': - optional: true - - '@libsql/win32-x64-msvc@0.4.6': - optional: true - - '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7))(lucia@3.2.1)': - dependencies: - drizzle-orm: 0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7) - lucia: 3.2.1 - - '@neon-rs/load@0.0.4': {} - - '@next/env@14.2.3': {} - - '@next/swc-darwin-arm64@14.2.3': - optional: true - - '@next/swc-darwin-x64@14.2.3': - optional: true - - '@next/swc-linux-arm64-gnu@14.2.3': - optional: true - - '@next/swc-linux-arm64-musl@14.2.3': - optional: true - - '@next/swc-linux-x64-gnu@14.2.3': - optional: true - - '@next/swc-linux-x64-musl@14.2.3': - optional: true - - '@next/swc-win32-arm64-msvc@14.2.3': - optional: true - - '@next/swc-win32-ia32-msvc@14.2.3': - optional: true - - '@next/swc-win32-x64-msvc@14.2.3': - optional: true - - '@node-rs/argon2-android-arm-eabi@1.7.0': - optional: true - - '@node-rs/argon2-android-arm64@1.7.0': - optional: true - - '@node-rs/argon2-darwin-arm64@1.7.0': - optional: true - - '@node-rs/argon2-darwin-x64@1.7.0': - optional: true - - '@node-rs/argon2-freebsd-x64@1.7.0': - optional: true - - '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': - optional: true - - '@node-rs/argon2-linux-arm64-gnu@1.7.0': - optional: true - - '@node-rs/argon2-linux-arm64-musl@1.7.0': - optional: true - - '@node-rs/argon2-linux-x64-gnu@1.7.0': - optional: true - - '@node-rs/argon2-linux-x64-musl@1.7.0': - optional: true - - '@node-rs/argon2-wasm32-wasi@1.7.0': - dependencies: - '@emnapi/core': 0.45.0 - '@emnapi/runtime': 0.45.0 - '@tybys/wasm-util': 0.8.3 - memfs-browser: 3.5.10302 - optional: true - - '@node-rs/argon2-win32-arm64-msvc@1.7.0': - optional: true - - '@node-rs/argon2-win32-ia32-msvc@1.7.0': - optional: true - - '@node-rs/argon2-win32-x64-msvc@1.7.0': - optional: true - - '@node-rs/argon2@1.7.0': - optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.7.0 - '@node-rs/argon2-android-arm64': 1.7.0 - '@node-rs/argon2-darwin-arm64': 1.7.0 - '@node-rs/argon2-darwin-x64': 1.7.0 - '@node-rs/argon2-freebsd-x64': 1.7.0 - '@node-rs/argon2-linux-arm-gnueabihf': 1.7.0 - '@node-rs/argon2-linux-arm64-gnu': 1.7.0 - '@node-rs/argon2-linux-arm64-musl': 1.7.0 - '@node-rs/argon2-linux-x64-gnu': 1.7.0 - '@node-rs/argon2-linux-x64-musl': 1.7.0 - '@node-rs/argon2-wasm32-wasi': 1.7.0 - '@node-rs/argon2-win32-arm64-msvc': 1.7.0 - '@node-rs/argon2-win32-ia32-msvc': 1.7.0 - '@node-rs/argon2-win32-x64-msvc': 1.7.0 - - '@node-rs/bcrypt-android-arm-eabi@1.9.0': - optional: true - - '@node-rs/bcrypt-android-arm64@1.9.0': - optional: true - - '@node-rs/bcrypt-darwin-arm64@1.9.0': - optional: true - - '@node-rs/bcrypt-darwin-x64@1.9.0': - optional: true - - '@node-rs/bcrypt-freebsd-x64@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-arm64-musl@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-x64-gnu@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-x64-musl@1.9.0': - optional: true - - '@node-rs/bcrypt-wasm32-wasi@1.9.0': - dependencies: - '@emnapi/core': 0.45.0 - '@emnapi/runtime': 0.45.0 - '@tybys/wasm-util': 0.8.3 - memfs-browser: 3.5.10302 - optional: true - - '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': - optional: true - - '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': - optional: true - - '@node-rs/bcrypt-win32-x64-msvc@1.9.0': - optional: true - - '@node-rs/bcrypt@1.9.0': - optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.9.0 - '@node-rs/bcrypt-android-arm64': 1.9.0 - '@node-rs/bcrypt-darwin-arm64': 1.9.0 - '@node-rs/bcrypt-darwin-x64': 1.9.0 - '@node-rs/bcrypt-freebsd-x64': 1.9.0 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.0 - '@node-rs/bcrypt-linux-arm64-gnu': 1.9.0 - '@node-rs/bcrypt-linux-arm64-musl': 1.9.0 - '@node-rs/bcrypt-linux-x64-gnu': 1.9.0 - '@node-rs/bcrypt-linux-x64-musl': 1.9.0 - '@node-rs/bcrypt-wasm32-wasi': 1.9.0 - '@node-rs/bcrypt-win32-arm64-msvc': 1.9.0 - '@node-rs/bcrypt-win32-ia32-msvc': 1.9.0 - '@node-rs/bcrypt-win32-x64-msvc': 1.9.0 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@npmcli/fs@1.1.1': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.6.2 - optional: true - - '@npmcli/move-file@1.1.2': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - optional: true - - '@oslojs/asn1@1.0.0': - dependencies: - '@oslojs/binary': 1.0.0 - - '@oslojs/binary@1.0.0': {} - - '@oslojs/crypto@1.0.1': - dependencies: - '@oslojs/asn1': 1.0.0 - '@oslojs/binary': 1.0.0 - - '@oslojs/encoding@1.1.0': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@radix-ui/number@1.1.0': {} - - '@radix-ui/primitive@1.1.0': {} - - '@radix-ui/react-alert-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-context@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-context@1.1.1(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-direction@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-icons@1.3.0(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@radix-ui/react-id@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/rect': 1.1.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-slot@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-tabs@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-toast@1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - '@radix-ui/rect': 1.1.0 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - - '@radix-ui/rect@1.1.0': {} - - '@react-aria/focus@3.18.3(react@18.3.1)': - dependencies: - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@swc/helpers': 0.5.5 - clsx: 2.1.1 - react: 18.3.1 - - '@react-aria/interactions@3.22.3(react@18.3.1)': - dependencies: - '@react-aria/ssr': 3.9.6(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@swc/helpers': 0.5.5 - react: 18.3.1 - - '@react-aria/ssr@3.9.6(react@18.3.1)': - dependencies: - '@swc/helpers': 0.5.5 - react: 18.3.1 - - '@react-aria/utils@3.25.3(react@18.3.1)': - dependencies: - '@react-aria/ssr': 3.9.6(react@18.3.1) - '@react-stately/utils': 3.10.4(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@swc/helpers': 0.5.5 - clsx: 2.1.1 - react: 18.3.1 - - '@react-stately/utils@3.10.4(react@18.3.1)': - dependencies: - '@swc/helpers': 0.5.5 - react: 18.3.1 - - '@react-types/shared@3.25.0(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@remixicon/react@4.3.0(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.5': - dependencies: - '@swc/counter': 0.1.3 - tslib: 2.6.2 - - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)))': - dependencies: - mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) - - '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/table-core': 8.20.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/virtual-core': 3.10.8 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/virtual-core': 3.5.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@tanstack/table-core@8.20.5': {} - - '@tanstack/virtual-core@3.10.8': {} - - '@tanstack/virtual-core@3.5.0': {} - - '@tootallnate/once@1.1.2': - optional: true - - '@tremor/react@3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)))': - dependencies: - '@floating-ui/react': 0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) - date-fns: 3.6.0 - react: 18.3.1 - react-day-picker: 8.10.1(date-fns@3.6.0)(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) - react-transition-state: 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - recharts: 2.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tailwind-merge: 2.5.3 - transitivePeerDependencies: - - tailwindcss - - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@tybys/wasm-util@0.8.3': - dependencies: - tslib: 2.6.2 - optional: true - - '@types/better-sqlite3@7.6.11': - dependencies: - '@types/node': 20.16.11 - optional: true - - '@types/d3-array@3.2.1': {} - - '@types/d3-color@3.1.3': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-interpolate@3.0.4': - dependencies: - '@types/d3-color': 3.1.3 - - '@types/d3-path@3.1.0': {} - - '@types/d3-scale@4.0.8': - dependencies: - '@types/d3-time': 3.0.3 - - '@types/d3-shape@3.1.6': - dependencies: - '@types/d3-path': 3.1.0 - - '@types/d3-time@3.0.3': {} - - '@types/d3-timer@3.0.2': {} - - '@types/lodash@4.17.13': {} - - '@types/luxon@3.4.2': {} - - '@types/node@20.16.11': - dependencies: - undici-types: 6.19.8 - - '@types/prop-types@15.7.12': {} - - '@types/react-dom@18.3.1': - dependencies: - '@types/react': 18.3.11 - - '@types/react@18.3.11': - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 20.16.11 - - abbrev@1.1.1: - optional: true - - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.0 - - acorn@8.14.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - optional: true - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - optional: true - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - optional: true - - ansi-regex@5.0.1: {} - - ansi-regex@6.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - aproba@2.0.0: - optional: true - - arctic@1.9.2: - dependencies: - oslo: 1.2.0 - - are-we-there-yet@3.0.1: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - optional: true - - arg@4.1.3: {} - - arg@5.0.2: {} - - aria-hidden@1.2.4: - dependencies: - tslib: 2.6.2 - - balanced-match@1.0.2: {} - - base64-js@1.5.1: {} - - better-sqlite3@9.6.0: - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.2 - optional: true - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - optional: true - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - buffer-from@1.1.2: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - cacache@15.3.0: - dependencies: - '@npmcli/fs': 1.1.1 - '@npmcli/move-file': 1.1.2 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 7.2.3 - infer-owner: 1.0.4 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.2.1 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - optional: true - - camelcase-css@2.0.1: {} - - caniuse-lite@1.0.30001617: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chownr@1.1.4: {} - - chownr@2.0.0: {} - - class-variance-authority@0.7.0: - dependencies: - clsx: 2.0.0 - - clean-stack@2.2.0: - optional: true - - cli-color@2.0.4: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - - client-only@0.0.1: {} - - clsx@2.0.0: {} - - clsx@2.1.1: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - color-support@1.1.3: - optional: true - - commander@4.1.1: {} - - commander@9.5.0: {} - - concat-map@0.0.1: - optional: true - - console-control-strings@1.1.0: - optional: true - - create-require@1.1.1: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - cssesc@3.0.0: {} - - csstype@3.1.3: {} - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-color@3.1.0: {} - - d3-ease@3.0.1: {} - - d3-format@3.1.0: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@3.1.0: {} - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.2 - - data-uri-to-buffer@4.0.1: {} - - date-fns@3.6.0: {} - - date-fns@4.1.0: {} - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decimal.js-light@2.5.1: {} - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-extend@0.6.0: {} - - delegates@1.0.0: - optional: true - - detect-libc@2.0.2: {} - - detect-libc@2.0.3: {} - - detect-node-es@1.1.0: {} - - didyoumean@1.2.2: {} - - diff@4.0.2: {} - - difflib@0.2.4: - dependencies: - heap: 0.2.7 - - dlv@1.1.3: {} - - dom-helpers@5.2.1: - dependencies: - '@babel/runtime': 7.24.5 - csstype: 3.1.3 - - dreamopt@0.8.0: - dependencies: - wordwrap: 1.0.0 - - drizzle-kit@0.21.4: - dependencies: - '@esbuild-kit/esm-loader': 2.6.5 - commander: 9.5.0 - env-paths: 3.0.0 - esbuild: 0.19.12 - esbuild-register: 3.5.0(esbuild@0.19.12) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - zod: 3.23.8 - transitivePeerDependencies: - - supports-color - - drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7): - optionalDependencies: - '@libsql/client': 0.14.0 - '@types/better-sqlite3': 7.6.11 - '@types/react': 18.3.11 - better-sqlite3: 9.6.0 - react: 18.3.1 - sqlite3: 5.1.7 - - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - env-paths@2.2.1: - optional: true - - env-paths@3.0.0: {} - - err-code@2.0.3: - optional: true - - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - - esbuild-register@3.5.0(esbuild@0.19.12): - dependencies: - debug: 4.3.4 - esbuild: 0.19.12 - transitivePeerDependencies: - - supports-color - - esbuild@0.18.20: - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.2 - - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - - eventemitter3@4.0.7: {} - - expand-template@2.0.3: {} - - ext@1.7.0: - dependencies: - type: 2.7.2 - - fast-equals@5.0.1: {} - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - - file-uri-to-path@1.0.0: {} - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - - fs-constants@1.0.0: {} - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs-monkey@1.0.6: - optional: true - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gauge@4.0.4: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - optional: true - - get-nonce@1.0.1: {} - - get-tsconfig@4.7.5: - dependencies: - resolve-pkg-maps: 1.0.0 - - github-from-package@0.0.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.3.14: - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.1.1 - path-scurry: 1.11.0 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - optional: true - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - graceful-fs@4.2.11: {} - - hanji@0.0.5: - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - - has-unicode@2.0.1: - optional: true - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - heap@0.2.7: {} - - http-cache-semantics@4.1.1: - optional: true - - http-proxy-agent@4.0.1: - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - optional: true - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - optional: true - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.2 - optional: true - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - optional: true - - ieee754@1.2.1: {} - - imurmurhash@0.1.4: - optional: true - - indent-string@4.0.0: - optional: true - - infer-owner@1.0.4: - optional: true - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - internmap@2.0.3: {} - - invariant@2.2.4: - dependencies: - loose-envify: 1.4.0 - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - optional: true - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-core-module@2.13.1: - dependencies: - hasown: 2.0.2 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-lambda@1.0.1: - optional: true - - is-number@7.0.0: {} - - is-promise@2.2.2: {} - - isexe@2.0.0: {} - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jiti@1.21.0: {} - - js-base64@3.7.7: {} - - js-tokens@4.0.0: {} - - jsbn@1.1.0: - optional: true - - json-diff@0.9.0: - dependencies: - cli-color: 2.0.4 - difflib: 0.2.4 - dreamopt: 0.8.0 - - libsql@0.4.6: - dependencies: - '@neon-rs/load': 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - '@libsql/darwin-arm64': 0.4.6 - '@libsql/darwin-x64': 0.4.6 - '@libsql/linux-arm64-gnu': 0.4.6 - '@libsql/linux-arm64-musl': 0.4.6 - '@libsql/linux-x64-gnu': 0.4.6 - '@libsql/linux-x64-musl': 0.4.6 - '@libsql/win32-x64-msvc': 0.4.6 - - lilconfig@2.1.0: {} - - lilconfig@3.1.1: {} - - lines-and-columns@1.2.4: {} - - lodash.throttle@4.1.1: {} - - lodash@4.17.21: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lru-cache@10.2.2: {} - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - optional: true - - lru-queue@0.1.0: - dependencies: - es5-ext: 0.10.64 - - lucia@3.2.1: - dependencies: - '@oslojs/crypto': 1.0.1 - '@oslojs/encoding': 1.1.0 - - lucide-react@0.378.0(react@18.3.1): - dependencies: - react: 18.3.1 - - luxon@3.5.0: {} - - make-error@1.3.6: {} - - make-fetch-happen@9.1.0: - dependencies: - agentkeepalive: 4.5.0 - cacache: 15.3.0 - http-cache-semantics: 4.1.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1 - ssri: 8.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - optional: true - - memfs-browser@3.5.10302: - dependencies: - memfs: 3.5.3 - optional: true - - memfs@3.5.3: - dependencies: - fs-monkey: 1.0.6 - optional: true - - memoizee@0.4.15: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.7 - - merge2@1.4.1: {} - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - mimic-response@3.1.0: {} - - mini-svg-data-uri@1.4.4: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - optional: true - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.4: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - optional: true - - minipass-fetch@1.4.1: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - optional: true - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - optional: true - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - optional: true - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - optional: true - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - - minipass@7.1.1: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp-classic@0.5.3: {} - - mkdirp@1.0.4: {} - - ms@2.1.2: {} - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.7: {} - - napi-build-utils@1.0.2: {} - - negotiator@0.6.4: - optional: true - - next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - next-tick@1.1.0: {} - - next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.2.3 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001617 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.3 - '@next/swc-darwin-x64': 14.2.3 - '@next/swc-linux-arm64-gnu': 14.2.3 - '@next/swc-linux-arm64-musl': 14.2.3 - '@next/swc-linux-x64-gnu': 14.2.3 - '@next/swc-linux-x64-musl': 14.2.3 - '@next/swc-win32-arm64-msvc': 14.2.3 - '@next/swc-win32-ia32-msvc': 14.2.3 - '@next/swc-win32-x64-msvc': 14.2.3 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - node-abi@3.62.0: - dependencies: - semver: 7.6.2 - - node-addon-api@7.1.1: {} - - node-domexception@1.0.0: {} - - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - - node-gyp@8.4.1: - dependencies: - env-paths: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0 - nopt: 5.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.6.2 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - optional: true - - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - optional: true - - normalize-path@3.0.0: {} - - npmlog@6.0.2: - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - optional: true - - object-assign@4.1.1: {} - - object-hash@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - oslo@1.2.0: - dependencies: - '@node-rs/argon2': 1.7.0 - '@node-rs/bcrypt': 1.9.0 - - oslo@1.2.1: - dependencies: - '@node-rs/argon2': 1.7.0 - '@node-rs/bcrypt': 1.9.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - optional: true - - path-is-absolute@1.0.1: - optional: true - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.0: - dependencies: - lru-cache: 10.2.2 - minipass: 7.1.1 - - picocolors@1.0.0: {} - - picocolors@1.1.0: {} - - picomatch@2.3.1: {} - - pify@2.3.0: {} - - pirates@4.0.6: {} - - postcss-import@15.1.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - - postcss-js@4.0.1(postcss@8.4.47): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.47 - - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)): - dependencies: - lilconfig: 3.1.1 - yaml: 2.4.2 - optionalDependencies: - postcss: 8.4.47 - ts-node: 10.9.2(@types/node@20.16.11)(typescript@5.6.3) - - postcss-nested@6.0.1(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.0.16 - - postcss-selector-parser@6.0.16: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} - - postcss@8.4.31: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - - postcss@8.4.47: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 - source-map-js: 1.2.1 - - prebuild-install@7.1.2: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.62.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - - promise-inflight@1.0.1: - optional: true - - promise-limit@2.7.0: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - optional: true - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - queue-microtask@1.2.3: {} - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): - dependencies: - date-fns: 3.6.0 - react: 18.3.1 - - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-hook-form@7.53.0(react@18.3.1): - dependencies: - react: 18.3.1 - - react-if@4.1.5(react@18.3.1): - dependencies: - react: 18.3.1 - - react-is@16.13.1: {} - - react-is@18.3.1: {} - - react-remove-scroll-bar@2.3.6(@types/react@18.3.11)(react@18.3.1): - dependencies: - react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.11 - - react-remove-scroll@2.6.0(@types/react@18.3.11)(react@18.3.1): - dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) - tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - - react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - fast-equals: 5.0.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - react-style-singleton@2.2.1(@types/react@18.3.11)(react@18.3.1): - dependencies: - get-nonce: 1.0.1 - invariant: 2.2.4 - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.11 - - react-timer-hook@3.0.7(react@18.3.1): - dependencies: - react: 18.3.1 - - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.24.5 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-transition-state@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - recharts-scale@0.4.5: - dependencies: - decimal.js-light: 2.5.1 - - recharts@2.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - clsx: 2.1.1 - eventemitter3: 4.0.7 - lodash: 4.17.21 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 - react-smooth: 4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - recharts-scale: 0.4.5 - tiny-invariant: 1.3.3 - victory-vendor: 36.9.2 - - regenerator-runtime@0.14.1: {} - - regression@2.0.1: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - retry@0.12.0: - optional: true - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - optional: true - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: - optional: true - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - semver@7.6.2: {} - - set-blocking@2.0.0: - optional: true - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - signal-exit@3.0.7: - optional: true - - signal-exit@4.1.0: {} - - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - sisteransi@1.0.5: {} - - smart-buffer@4.2.0: - optional: true - - socks-proxy-agent@6.2.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - optional: true - - socks@2.8.3: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - optional: true - - sonner@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - source-map-js@1.2.0: {} - - source-map-js@1.2.1: {} - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - sprintf-js@1.1.3: - optional: true - - sqlite3@5.1.7: - dependencies: - bindings: 1.5.0 - node-addon-api: 7.1.1 - prebuild-install: 7.1.2 - tar: 6.2.1 - optionalDependencies: - node-gyp: 8.4.1 - transitivePeerDependencies: - - bluebird - - supports-color - - sqlite@5.1.1: {} - - ssri@8.0.1: - dependencies: - minipass: 3.3.6 - optional: true - - streamsearch@1.1.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - - strip-json-comments@2.0.1: {} - - styled-jsx@5.1.1(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - commander: 4.1.1 - glob: 10.3.14 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - - supports-preserve-symlinks-flag@1.0.0: {} - - swr@2.2.5(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - use-sync-external-store: 1.2.2(react@18.3.1) - - tabbable@6.2.0: {} - - tailwind-merge@2.5.3: {} - - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))): - dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) - - tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)): - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.47 - postcss-import: 15.1.0(postcss@8.4.47) - postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) - postcss-nested: 6.0.1(postcss@8.4.47) - postcss-selector-parser: 6.0.16 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - timers-ext@0.1.7: - dependencies: - es5-ext: 0.10.64 - next-tick: 1.1.0 - - tiny-invariant@1.3.3: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - ts-interface-checker@0.1.13: {} - - ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.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': 20.16.11 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - tslib@2.6.2: {} - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - type@2.7.2: {} - - typescript@5.6.3: {} - - undici-types@6.19.8: {} - - unique-filename@1.1.1: - dependencies: - unique-slug: 2.0.2 - optional: true - - unique-slug@2.0.2: - dependencies: - imurmurhash: 0.1.4 - optional: true - - use-callback-ref@1.3.2(@types/react@18.3.11)(react@18.3.1): - dependencies: - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.11 - - use-debounce@10.0.3(react@18.3.1): - dependencies: - react: 18.3.1 - - use-sidecar@1.1.2(@types/react@18.3.11)(react@18.3.1): - dependencies: - detect-node-es: 1.1.0 - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.11 - - use-sync-external-store@1.2.2(react@18.3.1): - dependencies: - react: 18.3.1 - - util-deprecate@1.0.2: {} - - uuid@11.0.2: {} - - v8-compile-cache-lib@3.0.1: {} - - victory-vendor@36.9.2: - dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-ease': 3.0.2 - '@types/d3-interpolate': 3.0.4 - '@types/d3-scale': 4.0.8 - '@types/d3-shape': 3.1.6 - '@types/d3-time': 3.0.3 - '@types/d3-timer': 3.0.2 - d3-array: 3.2.4 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-scale: 4.0.2 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-timer: 3.0.1 - - web-streams-polyfill@3.3.3: {} - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - optional: true - - wordwrap@1.0.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - ws@8.18.0: {} - - yallist@4.0.0: {} - - yaml@2.4.2: {} - - yn@3.1.1: {} - - zod@3.23.8: {} diff --git a/packages/reservation-platform/postcss.config.mjs b/packages/reservation-platform/postcss.config.mjs deleted file mode 100644 index 1a69fd2a..00000000 --- a/packages/reservation-platform/postcss.config.mjs +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('postcss-load-config').Config} */ -const config = { - plugins: { - tailwindcss: {}, - }, -}; - -export default config; diff --git a/packages/reservation-platform/public/next.svg b/packages/reservation-platform/public/next.svg deleted file mode 100644 index 5174b28c..00000000 --- a/packages/reservation-platform/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/reservation-platform/public/vercel.svg b/packages/reservation-platform/public/vercel.svg deleted file mode 100644 index d2f84222..00000000 --- a/packages/reservation-platform/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/reservation-platform/repomix-output.txt b/packages/reservation-platform/repomix-output.txt deleted file mode 100644 index 68f0be14..00000000 --- a/packages/reservation-platform/repomix-output.txt +++ /dev/null @@ -1,9279 +0,0 @@ -This file is a merged representation of the entire codebase, combining all repository files into a single document. -Generated by Repomix on: 2024-12-09T06:29:51.427Z - -================================================================ -File Summary -================================================================ - -Purpose: --------- -This file contains a packed representation of the entire repository's contents. -It is designed to be easily consumable by AI systems for analysis, code review, -or other automated processes. - -File Format: ------------- -The content is organized as follows: -1. This summary section -2. Repository information -3. Repository structure -4. Multiple file entries, each consisting of: - a. A separator line (================) - b. The file path (File: path/to/file) - c. Another separator line - d. The full contents of the file - e. A blank line - -Usage Guidelines: ------------------ -- This file should be treated as read-only. Any changes should be made to the - original repository files, not this packed version. -- When processing this file, use the file path to distinguish - between different files in the repository. -- Be aware that this file may contain sensitive information. Handle it with - the same level of security as you would the original repository. - -Notes: ------- -- Some files may have been excluded based on .gitignore rules and Repomix's - configuration. -- Binary files are not included in this packed representation. Please refer to - the Repository Structure section for a complete list of file paths, including - binary files. - -Additional Info: ----------------- - -For more information about Repomix, visit: https://github.com/yamadashy/repomix - -================================================================ -Repository Structure -================================================================ -.dockerignore -.env.example -.gitignore -biome.json -components.json -docker/build.sh -docker/caddy/Caddyfile -docker/compose.yml -docker/deploy.sh -docker/images/.gitattributes -docker/save.sh -Dockerfile -drizzle.config.ts -drizzle/0000_overjoyed_strong_guy.sql -drizzle/meta/_journal.json -drizzle/meta/0000_snapshot.json -next.config.mjs -package.json -postcss.config.mjs -public/next.svg -public/vercel.svg -README.md -scripts/generate-data.js -src/app/admin/about/page.tsx -src/app/admin/admin-sidebar.tsx -src/app/admin/charts/printer-error-chart.tsx -src/app/admin/charts/printer-error-rate.tsx -src/app/admin/charts/printer-forecast.tsx -src/app/admin/charts/printer-utilization.tsx -src/app/admin/charts/printer-volume.tsx -src/app/admin/jobs/page.tsx -src/app/admin/layout.tsx -src/app/admin/page.tsx -src/app/admin/printers/columns.tsx -src/app/admin/printers/data-table.tsx -src/app/admin/printers/dialogs/create-printer.tsx -src/app/admin/printers/dialogs/delete-printer.tsx -src/app/admin/printers/dialogs/edit-printer.tsx -src/app/admin/printers/form.tsx -src/app/admin/printers/page.tsx -src/app/admin/settings/download/route.ts -src/app/admin/settings/page.tsx -src/app/admin/users/columns.tsx -src/app/admin/users/data-table.tsx -src/app/admin/users/dialog.tsx -src/app/admin/users/form.tsx -src/app/admin/users/page.tsx -src/app/api/job/[jobId]/remaining-time/route.ts -src/app/api/printers/route.ts -src/app/auth/login/callback/route.ts -src/app/auth/login/route.ts -src/app/globals.css -src/app/job/[jobId]/cancel-form.tsx -src/app/job/[jobId]/edit-comments.tsx -src/app/job/[jobId]/extend-form.tsx -src/app/job/[jobId]/finish-form.tsx -src/app/job/[jobId]/page.tsx -src/app/layout.tsx -src/app/my/jobs/columns.tsx -src/app/my/jobs/data-table.tsx -src/app/my/profile/page.tsx -src/app/not-found.tsx -src/app/page.tsx -src/app/printer/[printerId]/reserve/form.tsx -src/app/printer/[printerId]/reserve/page.tsx -src/components/data-card.tsx -src/components/dynamic-printer-cards.tsx -src/components/header/index.tsx -src/components/header/navigation.tsx -src/components/login-button.tsx -src/components/logout-button.tsx -src/components/personalized-cards.tsx -src/components/printer-availability-badge.tsx -src/components/printer-card/countdown.tsx -src/components/printer-card/index.tsx -src/components/ui/alert-dialog.tsx -src/components/ui/alert.tsx -src/components/ui/avatar.tsx -src/components/ui/badge.tsx -src/components/ui/breadcrumb.tsx -src/components/ui/button.tsx -src/components/ui/card.tsx -src/components/ui/chart.tsx -src/components/ui/dialog.tsx -src/components/ui/dropdown-menu.tsx -src/components/ui/form.tsx -src/components/ui/hover-card.tsx -src/components/ui/input.tsx -src/components/ui/label.tsx -src/components/ui/scroll-area.tsx -src/components/ui/select.tsx -src/components/ui/skeleton.tsx -src/components/ui/sonner.tsx -src/components/ui/table.tsx -src/components/ui/tabs.tsx -src/components/ui/textarea.tsx -src/components/ui/toast.tsx -src/components/ui/toaster.tsx -src/components/ui/use-toast.ts -src/server/actions/authentication/logout.ts -src/server/actions/printers.ts -src/server/actions/printJobs.ts -src/server/actions/timer.ts -src/server/actions/user/delete.ts -src/server/actions/user/update.ts -src/server/actions/users.ts -src/server/auth/index.ts -src/server/auth/oauth.ts -src/server/auth/permissions.ts -src/utils/analytics/error-rate.ts -src/utils/analytics/errors.ts -src/utils/analytics/forecast.ts -src/utils/analytics/utilization.ts -src/utils/analytics/volume.ts -src/utils/drizzle.ts -src/utils/errors.ts -src/utils/fetch.ts -src/utils/guard.ts -src/utils/printers.ts -src/utils/strings.ts -src/utils/styles.ts -tailwind.config.ts -tsconfig.json - -================================================================ -Repository Files -================================================================ - -================ -File: .dockerignore -================ -# Build and utility assets -docker/ -scripts/ - -# Ignore node_modules as they will be installed in the container -node_modules - -# Ignore build artifacts -.next - -# Ignore runtime data -db/ - -# Ignore local configuration files -.env -.env.example - -# Ignore version control files -.git -.gitignore - -# Ignore IDE/editor specific files -*.log -*.tmp -*.DS_Store -.vscode/ -.idea/ - -================ -File: .env.example -================ -# OAuth Configuration -OAUTH_CLIENT_ID=client_id -OAUTH_CLIENT_SECRET=client_secret - -================ -File: .gitignore -================ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# db folder -db/ - -# Env file -.env - - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - -================ -File: biome.json -================ -{ - "$schema": "https://biomejs.dev/schemas/1.7.0/schema.json", - "organizeImports": { - "enabled": true - }, - "formatter": { - "enabled": true, - "lineWidth": 120 - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "correctness": { - "noUnusedImports": "error" - } - } - } -} - -================ -File: components.json -================ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": true, - "tsx": true, - "tailwind": { - "config": "tailwind.config.ts", - "css": "src/app/globals.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/utils/styles" - } -} - -================ -File: docker/build.sh -================ -#!/bin/bash - -# Define image name -MYP_RP_IMAGE_NAME="myp-rp" - -# Function to build Docker image -build_image() { - local image_name=$1 - local dockerfile=$2 - local platform=$3 - - echo "Building $image_name Docker image for $platform..." - - docker buildx build --platform $platform -t ${image_name}:latest -f $dockerfile --load . - if [ $? -eq 0 ]; then - echo "$image_name Docker image built successfully" - else - echo "Error occurred while building $image_name Docker image" - exit 1 - fi -} - -# Create and use a builder instance (if not already created) -BUILDER_NAME="myp-rp-arm64-builder" -docker buildx create --name $BUILDER_NAME --use || docker buildx use $BUILDER_NAME - -# Build myp-rp image -build_image "$MYP_RP_IMAGE_NAME" "$PWD/Dockerfile" "linux/arm64" - -# Remove the builder instance -docker buildx rm $BUILDER_NAME - -================ -File: docker/caddy/Caddyfile -================ -{ - debug -} - -m040tbaraspi001.de040.corpintra.net, m040tbaraspi001.de040.corpinter.net { - reverse_proxy myp-rp:3000 - tls internal -} - -================ -File: docker/compose.yml -================ -services: - caddy: - image: caddy:2.8 - container_name: caddy - restart: unless-stopped - ports: - - 80:80 - - 443:443 - volumes: - - ./caddy/data:/data - - ./caddy/config:/config - - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro - myp-rp: - image: myp-rp:latest - container_name: myp-rp - env_file: "/srv/myp-env/github.env" - volumes: - - /srv/MYP-DB:/usr/src/app/db - restart: unless-stopped - -================ -File: docker/deploy.sh -================ -#!/bin/bash - -# Directory containing the Docker images -IMAGE_DIR="docker/images" - -# Load all Docker images from the tar.xz files in the IMAGE_DIR -echo "Loading Docker images from $IMAGE_DIR..." - -for image_file in "$IMAGE_DIR"/*.tar.xz; do - if [ -f "$image_file" ]; then - echo "Loading Docker image from $image_file..." - docker load -i "$image_file" - - # Check if the image loading was successful - if [ $? -ne 0 ]; then - echo "Error occurred while loading Docker image from $image_file" - exit 1 - fi - else - echo "No Docker image tar.xz files found in $IMAGE_DIR." - fi -done - -# Execute docker compose -echo "Running docker compose..." -docker compose -f "docker/compose.yml" up -d - -# Check if the operation was successful -if [ $? -eq 0 ]; then - echo "Docker compose executed successfully" -else - echo "Error occurred while executing docker compose" - exit 1 -fi - -echo "Deployment completed successfully" - -================ -File: docker/images/.gitattributes -================ -caddy_2.8.tar.xz filter=lfs diff=lfs merge=lfs -text -myp-rp_latest.tar.xz filter=lfs diff=lfs merge=lfs -text - -================ -File: docker/save.sh -================ -#!/bin/bash - -# Get image name as argument -IMAGE_NAME=$1 -PLATFORM="linux/arm64" - -# Define paths -IMAGE_DIR="docker/images" -IMAGE_FILE="${IMAGE_DIR}/${IMAGE_NAME//[:\/]/_}.tar" -COMPRESSED_FILE="${IMAGE_FILE}.xz" - -# Function to pull the image -pull_image() { - local image=$1 - if [[ $image == arm64v8/* ]]; then - echo "Pulling image $image without platform specification..." - docker pull $image - else - echo "Pulling image $image for platform $PLATFORM..." - docker pull --platform $PLATFORM $image - fi - return $? -} - -# Pull the image if it is not available locally -if ! docker image inspect ${IMAGE_NAME} &>/dev/null; then - if pull_image ${IMAGE_NAME}; then - echo "Image $IMAGE_NAME pulled successfully." - else - echo "Error occurred while pulling $IMAGE_NAME for platform $PLATFORM" - echo "Trying to pull $IMAGE_NAME without platform specification..." - - # Attempt to pull again without platform - if pull_image ${IMAGE_NAME}; then - echo "Image $IMAGE_NAME pulled successfully without platform." - else - echo "Error occurred while pulling $IMAGE_NAME without platform." - echo "Trying to pull arm64v8/${IMAGE_NAME} instead..." - - # Construct new image name - NEW_IMAGE_NAME="arm64v8/${IMAGE_NAME}" - if pull_image ${NEW_IMAGE_NAME}; then - echo "Image $NEW_IMAGE_NAME pulled successfully." - IMAGE_NAME=${NEW_IMAGE_NAME} # Update IMAGE_NAME to use the new one - else - echo "Error occurred while pulling $NEW_IMAGE_NAME" - exit 1 - fi - fi - fi -else - echo "Image $IMAGE_NAME found locally. Skipping pull." -fi - -# Save the Docker image -echo "Saving $IMAGE_NAME Docker image..." -docker save ${IMAGE_NAME} > $IMAGE_FILE - -# Compress the Docker image (overwriting if file exists) -echo "Compressing $IMAGE_FILE..." -xz -z --force $IMAGE_FILE - -if [ $? -eq 0 ]; then - echo "$IMAGE_NAME Docker image saved and compressed successfully as $COMPRESSED_FILE" -else - echo "Error occurred while compressing $IMAGE_NAME Docker image" - exit 1 -fi - -================ -File: Dockerfile -================ -FROM node:20-bookworm-slim - -# Create application directory -RUN mkdir -p /usr/src/app - -# Set environment variables -ENV PORT=3000 -ENV NEXT_TELEMETRY_DISABLED=1 - -WORKDIR /usr/src/app - -# Copy package.json and pnpm-lock.yaml -COPY package.json /usr/src/app -COPY pnpm-lock.yaml /usr/src/app - -# Install pnpm -RUN corepack enable pnpm - -# Install dependencies -RUN pnpm install - -# Copy the rest of the application code -COPY . /usr/src/app - -# Initialize Database, if it not already exists -RUN pnpm run db - -# Build the application -RUN pnpm run build - -EXPOSE 3000 - -# Start the application -CMD ["/bin/sh", "-c", "if [ ! -f ./db/sqlite.db ]; then pnpm db; fi && pnpm start"] - -================ -File: drizzle.config.ts -================ -import { defineConfig } from "drizzle-kit"; - -//@ts-ignore - better-sqlite driver throws an error even though its an valid value -export default defineConfig({ - dialect: "sqlite", - schema: "./src/server/db/schema.ts", - out: "./drizzle", - driver: "libsql", - dbCredentials: { - url: "file:./db/sqlite.db", - }, -}); - -================ -File: drizzle/0000_overjoyed_strong_guy.sql -================ -CREATE TABLE `printJob` ( - `id` text PRIMARY KEY NOT NULL, - `printerId` text NOT NULL, - `userId` text NOT NULL, - `startAt` integer NOT NULL, - `durationInMinutes` integer NOT NULL, - `comments` text, - `aborted` integer DEFAULT false NOT NULL, - `abortReason` text, - FOREIGN KEY (`printerId`) REFERENCES `printer`(`id`) ON UPDATE no action ON DELETE cascade, - FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `printer` ( - `id` text PRIMARY KEY NOT NULL, - `name` text NOT NULL, - `description` text NOT NULL, - `status` integer DEFAULT 0 NOT NULL -); ---> statement-breakpoint -CREATE TABLE `session` ( - `id` text PRIMARY KEY NOT NULL, - `user_id` text NOT NULL, - `expires_at` integer NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `user` ( - `id` text PRIMARY KEY NOT NULL, - `github_id` integer NOT NULL, - `name` text, - `displayName` text, - `email` text NOT NULL, - `role` text DEFAULT 'guest' -); - -================ -File: drizzle/meta/_journal.json -================ -{ - "version": "6", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "6", - "when": 1715416514336, - "tag": "0000_overjoyed_strong_guy", - "breakpoints": true - } - ] -} - -================ -File: drizzle/meta/0000_snapshot.json -================ -{ - "version": "6", - "dialect": "sqlite", - "id": "791dc197-5254-4432-bd9f-1368d1a5aa6a", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "printJob": { - "name": "printJob", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "printerId": { - "name": "printerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "startAt": { - "name": "startAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "durationInMinutes": { - "name": "durationInMinutes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "comments": { - "name": "comments", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "aborted": { - "name": "aborted", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "abortReason": { - "name": "abortReason", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "printJob_printerId_printer_id_fk": { - "name": "printJob_printerId_printer_id_fk", - "tableFrom": "printJob", - "tableTo": "printer", - "columnsFrom": [ - "printerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "printJob_userId_user_id_fk": { - "name": "printJob_userId_user_id_fk", - "tableFrom": "printJob", - "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "printer": { - "name": "printer", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "session": { - "name": "session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "session_user_id_user_id_fk": { - "name": "session_user_id_user_id_fk", - "tableFrom": "session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "github_id": { - "name": "github_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "displayName": { - "name": "displayName", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'guest'" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} - -================ -File: next.config.mjs -================ -/** @type {import('next').NextConfig} */ -const nextConfig = { - async headers() { - return [ - { - source: "/:path*", - headers: [ - { - key: "Access-Control-Allow-Origin", - value: "m040tbaraspi001.de040.corpintra.net", - }, - { - key: "Access-Control-Allow-Methods", - value: "GET, POST, PUT, DELETE, OPTIONS", - }, - { - key: "Access-Control-Allow-Headers", - value: "Content-Type, Authorization", - }, - ], - }, - ]; - }, -}; - -export default nextConfig; - -================ -File: package.json -================ -{ - "name": "myp-rp", - "version": "1.0.0", - "private": true, - "packageManager": "pnpm@9.12.1", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "db:create-default": "mkdir -p db/", - "db:generate-sqlite": "pnpm drizzle-kit generate", - "db:clean": "rm -rf db/ drizzle/", - "db:migrate": "pnpm drizzle-kit migrate", - "db": "pnpm db:create-default && pnpm db:generate-sqlite && pnpm db:migrate", - "db:reset": "pnpm db:clean && pnpm db" - }, - "dependencies": { - "@faker-js/faker": "^9.2.0", - "@headlessui/react": "^2.1.10", - "@headlessui/tailwindcss": "^0.2.1", - "@hookform/resolvers": "^3.9.0", - "@libsql/client": "^0.14.0", - "@lucia-auth/adapter-drizzle": "^1.1.0", - "@radix-ui/react-alert-dialog": "^1.1.2", - "@radix-ui/react-avatar": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.2", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-hover-card": "^1.1.2", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-scroll-area": "^1.2.0", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-tabs": "^1.1.1", - "@radix-ui/react-toast": "^1.2.2", - "@remixicon/react": "^4.3.0", - "@tanstack/react-table": "^8.20.5", - "@tremor/react": "^3.18.3", - "arctic": "^1.9.2", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "date-fns": "^4.1.0", - "drizzle-orm": "^0.30.10", - "lodash": "^4.17.21", - "lucia": "^3.2.1", - "lucide-react": "^0.378.0", - "luxon": "^3.5.0", - "next": "14.2.3", - "next-themes": "^0.3.0", - "oslo": "^1.2.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", - "react-if": "^4.1.5", - "react-timer-hook": "^3.0.7", - "recharts": "^2.13.3", - "regression": "^2.0.1", - "sonner": "^1.5.0", - "sqlite": "^5.1.1", - "sqlite3": "^5.1.7", - "swr": "^2.2.5", - "tailwind-merge": "^2.5.3", - "tailwindcss-animate": "^1.0.7", - "use-debounce": "^10.0.3", - "uuid": "^11.0.2", - "zod": "^3.23.8" - }, - "devDependencies": { - "@biomejs/biome": "^1.9.3", - "@tailwindcss/forms": "^0.5.9", - "@types/lodash": "^4.17.13", - "@types/luxon": "^3.4.2", - "@types/node": "^20.16.11", - "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.1", - "drizzle-kit": "^0.21.4", - "postcss": "^8.4.47", - "tailwindcss": "^3.4.13", - "ts-node": "^10.9.2", - "typescript": "^5.6.3" - } -} - -================ -File: postcss.config.mjs -================ -/** @type {import('postcss-load-config').Config} */ -const config = { - plugins: { - tailwindcss: {}, - }, -}; - -export default config; - -================ -File: public/next.svg -================ - - -================ -File: public/vercel.svg -================ - - -================ -File: README.md -================ -# MYP - Manage Your Printer - -MYP (Manage Your Printer) ist eine Webanwendung zur Reservierung von 3D-Druckern. -Sie wurde im Rahmen des Abschlussprojektes der Fachinformatiker Ausbildung für Daten- und Prozessanalyse für die Technische Berufsausbildung des Mercedes-Benz Werkes Berlin-Marienfelde entwickelt. - -## Deployment - -### Voraussetzungen - -- Netzwerk auf Raspberry Pi ist eingerichtet -- Docker ist installiert - -### Schritte - -1. Docker-Container bauen (docker/build.sh) -2. Docker-Container speichern (docker/save.sh caddy:2.8 myp-rp:latest) -3. Docker-Container auf Raspberry Pi bereitstellen (docker/deploy.sh) - -## Entwicklerinformationen - -### Raspberry Pi Einstellungen - -Auf dem Raspberry Pi wurde Raspbian Lite installiert. -Unter /srv/* sind die Projektdateien zu finden. - -### Anmeldedaten - -``` -Benutzer: myp -Passwort: (persönlich bekannt) -``` - -================ -File: scripts/generate-data.js -================ -const sqlite3 = require("sqlite3"); -const faker = require("@faker-js/faker").faker; -const { random, sample, sampleSize, sum } = require("lodash"); -const { DateTime } = require("luxon"); -const { open } = require("sqlite"); -const { v4: uuidv4 } = require("uuid"); - -const dbPath = "./db/sqlite.db"; - -// Configuration for test data generation -let startDate = DateTime.fromISO("2024-10-08"); -let endDate = DateTime.fromISO("2024-11-08"); -let numberOfPrinters = 5; - -// Use weekday names for better readability and ease of setting trends -let avgPrintTimesPerDay = { - Monday: 4, - Tuesday: 2, - Wednesday: 5, - Thursday: 2, - Friday: 3, - Saturday: 0, - Sunday: 0, -}; // Average number of prints for each weekday - -let avgPrintDurationPerDay = { - Monday: 240, // Total average duration in minutes for Monday - Tuesday: 30, - Wednesday: 45, - Thursday: 40, - Friday: 120, - Saturday: 0, - Sunday: 0, -}; // Average total duration of prints for each weekday - -let printerUsage = { - "Drucker 1": 0.5, - "Drucker 2": 0.7, - "Drucker 3": 0.6, - "Drucker 4": 0.3, - "Drucker 5": 0.4, -}; // Usage percentages for each printer - -// **New Configurations for Error Rates** -let generalErrorRate = 0.05; // 5% chance any print job may fail -let printerErrorRates = { - "Drucker 1": 0.02, // 2% error rate for Printer 1 - "Drucker 2": 0.03, - "Drucker 3": 0.01, - "Drucker 4": 0.05, - "Drucker 5": 0.04, -}; // Error rates for each printer - -const holidays = []; // Example holidays -const existingJobs = []; - -const initDB = async () => { - console.log("Initializing database connection..."); - return open({ - filename: dbPath, - driver: sqlite3.Database, - }); -}; - -const createUser = (isPowerUser = false) => { - const name = [faker.person.firstName(), faker.person.lastName()]; - - const user = { - id: uuidv4(), - github_id: faker.number.int(), - username: `${name[0].slice(0, 2)}${name[1].slice(0, 6)}`.toUpperCase(), - displayName: `${name[0]} ${name[1]}`.toUpperCase(), - email: `${name[0]}.${name[1]}@example.com`, - role: sample(["user", "admin"]), - isPowerUser, - }; - console.log("Created user:", user); - return user; -}; - -const createPrinter = (index) => { - const printer = { - id: uuidv4(), - name: `Drucker ${index}`, - description: faker.lorem.sentence(), - status: random(0, 2), - }; - console.log("Created printer:", printer); - return printer; -}; - -const isPrinterAvailable = (printer, startAt, duration) => { - const endAt = startAt + duration * 60 * 1000; // Convert minutes to milliseconds - return !existingJobs.some((job) => { - const jobStart = job.startAt; - const jobEnd = job.startAt + job.durationInMinutes * 60 * 1000; - return ( - printer.id === job.printerId && - ((startAt >= jobStart && startAt < jobEnd) || - (endAt > jobStart && endAt <= jobEnd) || - (startAt <= jobStart && endAt >= jobEnd)) - ); - }); -}; - -const createPrintJob = (users, printers, startAt, duration) => { - const user = sample(users); - let printer; - - // Weighted selection based on printer usage - const printerNames = Object.keys(printerUsage); - const weightedPrinters = printers.filter((p) => printerNames.includes(p.name)); - - // Create a weighted array of printers based on usage percentages - const printerWeights = weightedPrinters.map((p) => ({ - printer: p, - weight: printerUsage[p.name], - })); - - const totalWeight = sum(printerWeights.map((pw) => pw.weight)); - const randomWeight = Math.random() * totalWeight; - let accumulatedWeight = 0; - for (const pw of printerWeights) { - accumulatedWeight += pw.weight; - if (randomWeight <= accumulatedWeight) { - printer = pw.printer; - break; - } - } - - if (!printer) { - printer = sample(printers); - } - - if (!isPrinterAvailable(printer, startAt, duration)) { - console.log("Printer not available, skipping job creation."); - return null; - } - - // **Determine if the job should be aborted based on error rates** - let aborted = false; - let abortReason = null; - - // Calculate the combined error rate - const printerErrorRate = printerErrorRates[printer.name] || 0; - const combinedErrorRate = 1 - (1 - generalErrorRate) * (1 - printerErrorRate); - - if (Math.random() < combinedErrorRate) { - aborted = true; - const errorMessages = [ - "Unbekannt", - "Keine Ahnung", - "Falsch gebucht", - "Filament gelöst", - "Druckabbruch", - "Düsenverstopfung", - "Schichthaftung fehlgeschlagen", - "Materialmangel", - "Dateifehler", - "Temperaturproblem", - "Mechanischer Fehler", - "Softwarefehler", - "Kalibrierungsfehler", - "Überhitzung", - ]; - abortReason = sample(errorMessages); // Generate a random abort reason - } - - const printJob = { - id: uuidv4(), - printerId: printer.id, - userId: user.id, - startAt, - durationInMinutes: duration, - comments: faker.lorem.sentence(), - aborted, - abortReason, - }; - console.log("Created print job:", printJob); - return printJob; -}; - -const generatePrintJobsForDay = async (users, printers, dayDate, totalJobsForDay, totalDurationForDay, db, dryRun) => { - console.log(`Generating print jobs for ${dayDate.toISODate()}...`); - - // Generate random durations that sum up approximately to totalDurationForDay - const durations = []; - let remainingDuration = totalDurationForDay; - for (let i = 0; i < totalJobsForDay; i++) { - const avgJobDuration = remainingDuration / (totalJobsForDay - i); - const jobDuration = Math.max( - Math.round(random(avgJobDuration * 0.8, avgJobDuration * 1.2)), - 5, // Minimum duration of 5 minutes - ); - durations.push(jobDuration); - remainingDuration -= jobDuration; - } - - // Shuffle durations to randomize job lengths - const shuffledDurations = sampleSize(durations, durations.length); - - for (let i = 0; i < totalJobsForDay; i++) { - const duration = shuffledDurations[i]; - - // Random start time between 8 AM and 6 PM, adjusted to avoid overlapping durations - const possibleStartHours = Array.from({ length: 10 }, (_, idx) => idx + 8); // 8 AM to 6 PM - let startAt; - let attempts = 0; - do { - const hour = sample(possibleStartHours); - const minute = random(0, 59); - startAt = dayDate.set({ hour, minute, second: 0, millisecond: 0 }).toMillis(); - attempts++; - if (attempts > 10) { - console.log("Unable to find available time slot, skipping job."); - break; - } - } while (!isPrinterAvailable(sample(printers), startAt, duration)); - - if (attempts > 10) continue; - - const printJob = createPrintJob(users, printers, startAt, duration); - if (printJob) { - if (!dryRun) { - await db.run( - `INSERT INTO printJob (id, printerId, userId, startAt, durationInMinutes, comments, aborted, abortReason) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, - [ - printJob.id, - printJob.printerId, - printJob.userId, - printJob.startAt, - printJob.durationInMinutes, - printJob.comments, - printJob.aborted ? 1 : 0, - printJob.abortReason, - ], - ); - } - existingJobs.push(printJob); - console.log("Inserted print job into database:", printJob.id); - } - } -}; - -const generateTestData = async (dryRun = false) => { - console.log("Starting test data generation..."); - const db = await initDB(); - - // Generate users and printers - const users = [ - ...Array.from({ length: 7 }, () => createUser(false)), - ...Array.from({ length: 3 }, () => createUser(true)), - ]; - const printers = Array.from({ length: numberOfPrinters }, (_, index) => createPrinter(index + 1)); - - if (!dryRun) { - // Insert users into the database - for (const user of users) { - await db.run( - `INSERT INTO user (id, github_id, name, displayName, email, role) - VALUES (?, ?, ?, ?, ?, ?)`, - [user.id, user.github_id, user.username, user.displayName, user.email, user.role], - ); - console.log("Inserted user into database:", user.id); - } - - // Insert printers into the database - for (const printer of printers) { - await db.run( - `INSERT INTO printer (id, name, description, status) - VALUES (?, ?, ?, ?)`, - [printer.id, printer.name, printer.description, printer.status], - ); - console.log("Inserted printer into database:", printer.id); - } - } - - // Generate print jobs for each day within the specified date range - let currentDay = startDate; - while (currentDay <= endDate) { - const weekdayName = currentDay.toFormat("EEEE"); // Get weekday name (e.g., 'Monday') - if (holidays.includes(currentDay.toISODate()) || avgPrintTimesPerDay[weekdayName] === 0) { - console.log(`Skipping holiday or no jobs scheduled: ${currentDay.toISODate()}`); - currentDay = currentDay.plus({ days: 1 }); - continue; - } - - const totalJobsForDay = avgPrintTimesPerDay[weekdayName]; - const totalDurationForDay = avgPrintDurationPerDay[weekdayName]; - - await generatePrintJobsForDay(users, printers, currentDay, totalJobsForDay, totalDurationForDay, db, dryRun); - currentDay = currentDay.plus({ days: 1 }); - } - - if (!dryRun) { - await db.close(); - console.log("Database connection closed. Test data generation complete."); - } else { - console.log("Dry run complete. No data was written to the database."); - } -}; - -const setConfigurations = (config) => { - if (config.startDate) startDate = DateTime.fromISO(config.startDate); - if (config.endDate) endDate = DateTime.fromISO(config.endDate); - if (config.numberOfPrinters) numberOfPrinters = config.numberOfPrinters; - if (config.avgPrintTimesPerDay) avgPrintTimesPerDay = config.avgPrintTimesPerDay; - if (config.avgPrintDurationPerDay) avgPrintDurationPerDay = config.avgPrintDurationPerDay; - if (config.printerUsage) printerUsage = config.printerUsage; - if (config.generalErrorRate !== undefined) generalErrorRate = config.generalErrorRate; - if (config.printerErrorRates) printerErrorRates = config.printerErrorRates; -}; - -// Example usage -setConfigurations({ - startDate: "2024-10-08", - endDate: "2024-11-08", - numberOfPrinters: 6, - avgPrintTimesPerDay: { - Monday: 4, // High usage - Tuesday: 2, // Low usage - Wednesday: 3, // Low usage - Thursday: 2, // Low usage - Friday: 8, // High usage - Saturday: 0, - Sunday: 0, - }, - avgPrintDurationPerDay: { - Monday: 300, // High total duration - Tuesday: 60, // Low total duration - Wednesday: 90, - Thursday: 60, - Friday: 240, - Saturday: 0, - Sunday: 0, - }, - printerUsage: { - "Drucker 1": 2.3, - "Drucker 2": 1.7, - "Drucker 3": 0.1, - "Drucker 4": 1.5, - "Drucker 5": 2.4, - "Drucker 6": 0.3, - "Drucker 7": 0.9, - "Drucker 8": 0.1, - }, - generalErrorRate: 0.05, // 5% general error rate - printerErrorRates: { - "Drucker 1": 0.02, - "Drucker 2": 0.03, - "Drucker 3": 0.1, - "Drucker 4": 0.05, - "Drucker 5": 0.04, - "Drucker 6": 0.02, - "Drucker 7": 0.01, - "PrinteDrucker 8": 0.03, - }, -}); - -generateTestData(process.argv.includes("--dry-run")) - .then(() => { - console.log("Test data generation script finished."); - }) - .catch((err) => { - console.error("Error generating test data:", err); - }); - -================ -File: src/app/admin/about/page.tsx -================ -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import type { Metadata } from "next"; - -export const metadata: Metadata = { - title: "Über MYP", -}; - -export default async function AdminPage() { - return ( - - - Über MYP - - MYP — Manage Your Printer - - - -

- MYP ist eine Webanwendung zur Reservierung von 3D-Druckern. Sie wurde im Rahmen des - Abschlussprojektes der Fachinformatiker Ausbildung für Daten- und Prozessanalyse für die Technische - Berufsausbildung des Mercedes-Benz Werkes Berlin-Marienfelde entwickelt. -

-

- © 2024{" "} - - Torben Haack - -

-
-
- ); -} - -================ -File: src/app/admin/admin-sidebar.tsx -================ -"use client"; - -import { cn } from "@/utils/styles"; -import { FileIcon, HeartIcon, LayoutDashboardIcon, PrinterIcon, UsersIcon, WrenchIcon } from "lucide-react"; -import Link from "next/link"; -import { usePathname } from "next/navigation"; - -interface AdminSite { - name: string; - path: string; - icon: React.ReactNode; -} - -export function AdminSidebar() { - const pathname = usePathname(); - const adminSites: AdminSite[] = [ - { - name: "Dashboard", - path: "/admin", - icon: , - }, - { - name: "Benutzer", - path: "/admin/users", - icon: , - }, - { - name: "Drucker", - path: "/admin/printers", - icon: , - }, - { - name: "Druckaufträge", - path: "/admin/jobs", - icon: , - }, - { - name: "Einstellungen", - path: "/admin/settings", - icon: , - }, - { - name: "Über MYP", - path: "/admin/about", - icon: , - }, - ]; - - return ( -
    - {adminSites.map((site) => ( -
  • - - {site.icon} - {site.name} - -
  • - ))} -
- ); -} - -================ -File: src/app/admin/charts/printer-error-chart.tsx -================ -"use client"; - -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart"; -import { Bar, BarChart, CartesianGrid, LabelList, XAxis, YAxis } from "recharts"; - -export const description = "Ein Säulendiagramm zur Darstellung der Abbruchgründe und ihrer Häufigkeit"; - -interface AbortReasonCountChartProps { - abortReasonCount: { - abortReason: string; - count: number; - }[]; -} - -const chartConfig = { - abortReason: { - label: "Abbruchgrund", - }, -} satisfies ChartConfig; - -export function AbortReasonCountChart({ abortReasonCount }: AbortReasonCountChartProps) { - // Transform data to fit the chart structure - const chartData = abortReasonCount.map((reason) => ({ - abortReason: reason.abortReason, - count: reason.count, - })); - - return ( - - - Abbruchgründe - Häufigkeit der Abbruchgründe für Druckaufträge - - - - - - value} - /> - `${value}`} /> - } /> - - `${value}`} - /> - - - - - - ); -} - -================ -File: src/app/admin/charts/printer-error-rate.tsx -================ -"use client"; -import { Bar, BarChart, CartesianGrid, LabelList, XAxis, YAxis } from "recharts"; - -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart"; -import type { PrinterErrorRate } from "@/utils/analytics/error-rate"; - -export const description = "Ein Säulendiagramm zur Darstellung der Fehlerrate"; - -interface PrinterErrorRateChartProps { - printerErrorRate: PrinterErrorRate[]; -} - -const chartConfig = { - errorRate: { - label: "Fehlerrate", - }, -} satisfies ChartConfig; - -export function PrinterErrorRateChart({ printerErrorRate }: PrinterErrorRateChartProps) { - // Transform data to fit the chart structure - const chartData = printerErrorRate.map((printer) => ({ - printer: printer.name, - errorRate: printer.errorRate, - })); - - return ( - - - Fehlerrate - Fehlerrate der Drucker in Prozent - - - - - - value} - /> - `${value}%`} /> - } /> - - `${value}%`} - /> - - - - - - ); -} - -================ -File: src/app/admin/charts/printer-forecast.tsx -================ -"use client"; - -import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; -import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart"; -import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; - -export const description = "Ein Bereichsdiagramm zur Darstellung der prognostizierten Nutzung pro Wochentag"; - -interface ForecastData { - day: number; // 0 for Sunday, 1 for Monday, ..., 6 for Saturday - usageMinutes: number; -} - -interface ForecastChartProps { - forecastData: ForecastData[]; -} - -const chartConfig = { - usage: { - label: "Prognostizierte Nutzung", - color: "hsl(var(--chart-1))", - }, -} satisfies ChartConfig; - -const daysOfWeek = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; - -export function ForecastPrinterUsageChart({ forecastData }: ForecastChartProps) { - // Transform and slice data to fit the chart structure - const chartData = forecastData.map((data) => ({ - //slice(1, forecastData.length - 1). - day: daysOfWeek[data.day], // Map day number to weekday name - usage: data.usageMinutes, - })); - - return ( - - - Prognostizierte Nutzung pro Wochentag - - - - - - - - } /> - - - - - -
- Zeigt die prognostizierte Nutzungszeit pro Wochentag in Minuten. -
-
- Besten Tage zur Wartung: {bestMaintenanceDays(forecastData)} -
-
-
- ); -} - -function bestMaintenanceDays(forecastData: ForecastData[]) { - const sortedData = forecastData.map((a) => a).sort((a, b) => a.usageMinutes - b.usageMinutes); // Sort ascending - - const q1Index = Math.floor(sortedData.length * 0.33); - const q1 = sortedData[q1Index].usageMinutes; // First quartile (Q1) value - - const filteredData = sortedData.filter((data) => data.usageMinutes <= q1); - - return filteredData - .map((data) => { - const days = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; - return days[data.day]; - }) - .join(", "); -} - -================ -File: src/app/admin/charts/printer-utilization.tsx -================ -"use client"; - -import { TrendingUp } from "lucide-react"; -import * as React from "react"; -import { Label, Pie, PieChart } from "recharts"; - -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; -import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart"; - -export const description = "Nutzung des Druckers"; - -interface ComponentProps { - data: { - printerId: string; - utilizationPercentage: number; - name: string; - }; -} - -const chartConfig = {} satisfies ChartConfig; - -export function PrinterUtilizationChart({ data }: ComponentProps) { - const totalUtilization = React.useMemo(() => data.utilizationPercentage, [data]); - const dataWithColor = { - ...data, - fill: "rgb(34 197 94)", - }; - const free = { - printerId: "-", - utilizationPercentage: 1 - data.utilizationPercentage, - name: "(Frei)", - fill: "rgb(212 212 212)", - }; - - return ( - - - {data.name} - Nutzung des ausgewählten Druckers - - - - - } /> - - - - - - -
- Übersicht der Nutzung -
-
Aktuelle Auslastung des Druckers
-
-
- ); -} - -================ -File: src/app/admin/charts/printer-volume.tsx -================ -"use client"; -import { Bar, BarChart, CartesianGrid, LabelList, XAxis } from "recharts"; - -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; -import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart"; - -export const description = "Ein Balkendiagramm mit Beschriftung"; - -interface PrintVolumes { - today: number; - thisWeek: number; - thisMonth: number; -} - -const chartConfig = { - volume: { - label: "Volumen", - }, -} satisfies ChartConfig; - -interface PrinterVolumeChartProps { - printerVolume: PrintVolumes; -} - -export function PrinterVolumeChart({ printerVolume }: PrinterVolumeChartProps) { - const chartData = [ - { period: "Heute", volume: printerVolume.today, color: "hsl(var(--chart-1))" }, - { period: "Diese Woche", volume: printerVolume.thisWeek, color: "hsl(var(--chart-2))" }, - { period: "Diesen Monat", volume: printerVolume.thisMonth, color: "hsl(var(--chart-3))" }, - ]; - - return ( - - - Druckvolumen - Vergleich: Heute, Diese Woche, Diesen Monat - - - - - - value} - /> - } /> - - - - - - - -
- Zeigt das Druckvolumen für heute, diese Woche und diesen Monat -
-
-
- ); -} - -================ -File: src/app/admin/jobs/page.tsx -================ -import { columns } from "@/app/my/jobs/columns"; -import { JobsTable } from "@/app/my/jobs/data-table"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { db } from "@/server/db"; -import { printJobs } from "@/server/db/schema"; -import { desc } from "drizzle-orm"; -import type { Metadata } from "next"; - -export const metadata: Metadata = { - title: "Alle Druckaufträge", -}; - -export default async function AdminJobsPage() { - const allJobs = await db.query.printJobs.findMany({ - orderBy: [desc(printJobs.startAt)], - with: { - user: true, - printer: true, - }, - }); - - return ( - - -
- Druckaufträge - Alle Druckaufträge -
-
- - - -
- ); -} - -================ -File: src/app/admin/layout.tsx -================ -import { AdminSidebar } from "@/app/admin/admin-sidebar"; -import { validateRequest } from "@/server/auth"; -import { UserRole } from "@/server/auth/permissions"; -import { IS_NOT, guard } from "@/utils/guard"; -import { redirect } from "next/navigation"; - -interface AdminLayoutProps { - children: React.ReactNode; -} - -export const dynamic = "force-dynamic"; - -export default async function AdminLayout(props: AdminLayoutProps) { - const { children } = props; - const { user } = await validateRequest(); - - if (guard(user, IS_NOT, UserRole.ADMIN)) { - redirect("/"); - } - - return ( -
-
-

Admin

-
-
- -
{children}
-
-
- ); -} - -================ -File: src/app/admin/page.tsx -================ -import { AbortReasonCountChart } from "@/app/admin/charts/printer-error-chart"; -import { PrinterErrorRateChart } from "@/app/admin/charts/printer-error-rate"; -import { ForecastPrinterUsageChart } from "@/app/admin/charts/printer-forecast"; -import { PrinterUtilizationChart } from "@/app/admin/charts/printer-utilization"; -import { PrinterVolumeChart } from "@/app/admin/charts/printer-volume"; -import { DataCard } from "@/components/data-card"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { db } from "@/server/db"; -import { calculatePrinterErrorRate } from "@/utils/analytics/error-rate"; -import { calculateAbortReasonsCount } from "@/utils/analytics/errors"; -import { forecastPrinterUsage } from "@/utils/analytics/forecast"; -import { calculatePrinterUtilization } from "@/utils/analytics/utilization"; -import { calculatePrintVolumes } from "@/utils/analytics/volume"; -import type { Metadata } from "next"; - -export const metadata: Metadata = { - title: "Admin Dashboard", -}; - -export const dynamic = "force-dynamic"; - -export default async function AdminPage() { - const currentDate = new Date(); - - const lastMonth = new Date(); - lastMonth.setDate(currentDate.getDate() - 31); - const printers = await db.query.printers.findMany({}); - const printJobs = await db.query.printJobs.findMany({ - where: (job, { gte }) => gte(job.startAt, lastMonth), - with: { - printer: true, - }, - }); - if (printJobs.length < 1) { - return ( - - - Druckaufträge - Zurzeit sind keine Druckaufträge verfügbar. - - -

Aktualisieren Sie die Seite oder prüfen Sie später erneut, ob neue Druckaufträge verfügbar sind.

-
-
- ); - } - - const currentPrintJobs = printJobs.filter((job) => { - if (job.aborted) return false; - - const endAt = job.startAt.getTime() + job.durationInMinutes * 1000 * 60; - - return endAt > currentDate.getTime(); - }); - const occupiedPrinters = currentPrintJobs.map((job) => job.printer.id); - const freePrinters = printers.filter((printer) => !occupiedPrinters.includes(printer.id)); - const printerUtilization = calculatePrinterUtilization(printJobs); - const printerVolume = calculatePrintVolumes(printJobs); - const printerAbortReasons = calculateAbortReasonsCount(printJobs); - const printerErrorRate = calculatePrinterErrorRate(printJobs); - const printerForecast = forecastPrinterUsage(printJobs); - - return ( - <> - - - Allgemein - Druckerauslastung - Fehlerberichte - Prognosen - - -
-
- -
- - -
-
- -
-
- -
- {printerUtilization.map((data) => ( - - ))} -
-
- -
-
- -
-
- -
-
-
- -
-
- ({ - day: index, - usageMinutes, - }))} - /> -
-
-
-
- - ); -} - -================ -File: src/app/admin/printers/columns.tsx -================ -"use client"; -import type { printers } from "@/server/db/schema"; -import type { ColumnDef } from "@tanstack/react-table"; -import type { InferSelectModel } from "drizzle-orm"; -import { ArrowUpDown, MoreHorizontal, PencilIcon } from "lucide-react"; - -import { EditPrinterDialogContent, EditPrinterDialogTrigger } from "@/app/admin/printers/dialogs/edit-printer"; -import { Button } from "@/components/ui/button"; -import { Dialog } from "@/components/ui/dialog"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { type PrinterStatus, translatePrinterStatus } from "@/utils/printers"; -import { useState } from "react"; - -// This type is used to define the shape of our data. -// You can use a Zod schema here if you want. - -export const columns: ColumnDef>[] = [ - { - accessorKey: "id", - header: ({ column }) => { - return ( - - ); - }, - }, - { - accessorKey: "name", - header: "Name", - }, - { - accessorKey: "description", - header: "Beschreibung", - }, - { - accessorKey: "status", - header: "Status", - cell: ({ row }) => { - const status = row.getValue("status"); - const translated = translatePrinterStatus(status as PrinterStatus); - - return translated; - }, - }, - { - id: "actions", - cell: ({ row }) => { - const printer = row.original; - const [open, setOpen] = useState(false); - - return ( - - - - - - - Aktionen - ABC - - -
- - Bearbeiten -
-
-
-
-
- -
- ); - }, - }, -]; - -================ -File: src/app/admin/printers/data-table.tsx -================ -"use client"; - -import { - type ColumnDef, - type ColumnFiltersState, - type SortingState, - type VisibilityState, - flexRender, - getCoreRowModel, - getFilteredRowModel, - getPaginationRowModel, - getSortedRowModel, - useReactTable, -} from "@tanstack/react-table"; - -import { Button } from "@/components/ui/button"; -import { - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { Input } from "@/components/ui/input"; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; -import { SlidersHorizontalIcon } from "lucide-react"; -import { useState } from "react"; - -interface DataTableProps { - columns: ColumnDef[]; - data: TData[]; -} - -export function DataTable({ columns, data }: DataTableProps) { - const [sorting, setSorting] = useState([]); - const [columnFilters, setColumnFilters] = useState([]); - const [columnVisibility, setColumnVisibility] = useState({}); - - const table = useReactTable({ - data, - columns, - getCoreRowModel: getCoreRowModel(), - getPaginationRowModel: getPaginationRowModel(), - onSortingChange: setSorting, - getSortedRowModel: getSortedRowModel(), - onColumnFiltersChange: setColumnFilters, - getFilteredRowModel: getFilteredRowModel(), - onColumnVisibilityChange: setColumnVisibility, - state: { - sorting, - columnFilters, - columnVisibility, - }, - }); - - return ( -
-
- table.getColumn("name")?.setFilterValue(event.target.value)} - className="max-w-sm" - /> - - - - - - {table - .getAllColumns() - .filter((column) => column.getCanHide()) - .map((column) => { - return ( - column.toggleVisibility(!!value)} - > - {column.id} - - ); - })} - - -
- -
- - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - return ( - - {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} - - ); - })} - - ))} - - - {table.getRowModel().rows?.length ? ( - table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - {flexRender(cell.column.columnDef.cell, cell.getContext())} - ))} - - )) - ) : ( - - - Keine Ergebnisse gefunden. - - - )} - -
-
-
- - -
-
- ); -} - -================ -File: src/app/admin/printers/dialogs/create-printer.tsx -================ -"use client"; - -import { PrinterForm } from "@/app/admin/printers/form"; -import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; -import { useState } from "react"; - -interface CreatePrinterDialogProps { - children: React.ReactNode; -} - -export function CreatePrinterDialog(props: CreatePrinterDialogProps) { - const { children } = props; - const [open, setOpen] = useState(false); - - return ( - - {children} - - - Drucker erstellen - - - - - ); -} - -================ -File: src/app/admin/printers/dialogs/delete-printer.tsx -================ -"use client"; - -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from "@/components/ui/alert-dialog"; -import { Button } from "@/components/ui/button"; -import { useToast } from "@/components/ui/use-toast"; -import { deletePrinter } from "@/server/actions/printers"; -import { TrashIcon } from "lucide-react"; - -interface DeletePrinterDialogProps { - printerId: string; - setOpen: (state: boolean) => void; -} -export function DeletePrinterDialog(props: DeletePrinterDialogProps) { - const { printerId, setOpen } = props; - const { toast } = useToast(); - - async function onSubmit() { - toast({ - description: "Drucker wird gelöscht...", - }); - try { - const result = await deletePrinter(printerId); - if (result?.error) { - toast({ - description: result.error, - variant: "destructive", - }); - } - toast({ - description: "Drucker wurde gelöscht.", - }); - setOpen(false); - } catch (error) { - if (error instanceof Error) { - toast({ - description: error.message, - variant: "destructive", - }); - } else { - toast({ - description: "Ein unbekannter Fehler ist aufgetreten.", - variant: "destructive", - }); - } - } - } - - return ( - - - - - - - Bist Du dir sicher? - - Diese Aktion kann nicht rückgängig gemacht werden. Der Drucker und die damit verbundenen Daten werden - unwiderruflich gelöscht. - - - - Abbrechen - - Ja, löschen - - - - - ); -} - -================ -File: src/app/admin/printers/dialogs/edit-printer.tsx -================ -import { PrinterForm } from "@/app/admin/printers/form"; -import { DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; -import type { InferResultType } from "@/utils/drizzle"; - -interface EditPrinterDialogTriggerProps { - children: React.ReactNode; -} - -export function EditPrinterDialogTrigger(props: EditPrinterDialogTriggerProps) { - const { children } = props; - - return {children}; -} - -interface EditPrinterDialogContentProps { - printer: InferResultType<"printers">; - setOpen: (open: boolean) => void; -} -export function EditPrinterDialogContent(props: EditPrinterDialogContentProps) { - const { printer, setOpen } = props; - - return ( - - - Drucker bearbeiten - - - - ); -} - -================ -File: src/app/admin/printers/form.tsx -================ -"use client"; -import { DeletePrinterDialog } from "@/app/admin/printers/dialogs/delete-printer"; -import { Button } from "@/components/ui/button"; -import { DialogClose } from "@/components/ui/dialog"; -import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { useToast } from "@/components/ui/use-toast"; -import { createPrinter, updatePrinter } from "@/server/actions/printers"; -import type { InferResultType } from "@/utils/drizzle"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { SaveIcon, XCircleIcon } from "lucide-react"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; - -export const formSchema = z.object({ - name: z - .string() - .min(2, { - message: "Der Name muss mindestens 2 Zeichen lang sein.", - }) - .max(50), - description: z - .string() - .min(2, { - message: "Die Beschreibung muss mindestens 2 Zeichen lang sein.", - }) - .max(50), - status: z.coerce.number().int().min(0).max(1), -}); - -interface PrinterFormProps { - printer?: InferResultType<"printers">; - setOpen: (state: boolean) => void; -} - -export function PrinterForm(props: PrinterFormProps) { - const { printer, setOpen } = props; - const { toast } = useToast(); - - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: { - name: printer?.name ?? "", - description: printer?.description ?? "", - status: printer?.status ?? 0, - }, - }); - - // 2. Define a submit handler. - async function onSubmit(values: z.infer) { - // TODO: create or update - if (printer) { - toast({ - description: "Drucker wird aktualisiert...", - }); - - // Update - try { - const result = await updatePrinter(printer.id, { - description: values.description, - name: values.name, - status: values.status, - }); - if (result?.error) { - toast({ - description: result.error, - variant: "destructive", - }); - } - - setOpen(false); - - toast({ - description: "Drucker wurde aktualisiert.", - variant: "default", - }); - } catch (error) { - if (error instanceof Error) { - toast({ - description: error.message, - variant: "destructive", - }); - } else { - toast({ - description: "Ein unbekannter Fehler ist aufgetreten.", - variant: "destructive", - }); - } - } - } else { - toast({ - description: "Drucker wird erstellt...", - variant: "default", - }); - - // Create - try { - const result = await createPrinter({ - description: values.description, - name: values.name, - status: values.status, - }); - if (result?.error) { - toast({ - description: result.error, - variant: "destructive", - }); - } - - setOpen(false); - - toast({ - description: "Drucker wurde erstellt.", - variant: "default", - }); - } catch (error) { - if (error instanceof Error) { - toast({ - description: error.message, - variant: "destructive", - }); - } else { - toast({ - description: "Ein unbekannter Fehler ist aufgetreten.", - variant: "destructive", - }); - } - } - } - } - - return ( -
- - ( - - Name - - - - Bitte gib einen eindeutigen Namen für den Drucker ein. - - - )} - /> - ( - - Beschreibung - - - - Füge eine kurze Beschreibung des Druckers hinzu. - - - )} - /> - ( - - Status - - Wähle den aktuellen Status des Druckers. - - - )} - /> -
- {printer && } - {!printer && ( - - - - )} - -
- - - ); -} - -================ -File: src/app/admin/printers/page.tsx -================ -import { columns } from "@/app/admin/printers/columns"; -import { DataTable } from "@/app/admin/printers/data-table"; -import { CreatePrinterDialog } from "@/app/admin/printers/dialogs/create-printer"; -import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { db } from "@/server/db"; -import { PlusCircleIcon } from "lucide-react"; - -export default async function AdminPage() { - const data = await db.query.printers.findMany(); - - return ( - - -
- Druckerverwaltung - Suche, Bearbeite, Lösche und Erstelle Drucker -
- - - -
- - - -
- ); -} - -================ -File: src/app/admin/settings/download/route.ts -================ -import fs from "node:fs"; - -export const dynamic = 'force-dynamic'; - -export async function GET() { - return new Response(fs.readFileSync("./db/sqlite.db")); -} - -================ -File: src/app/admin/settings/page.tsx -================ -import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import Link from "next/link"; - -import type { Metadata } from "next"; - -export const metadata: Metadata = { - title: "Systemeinstellungen", -}; - -export default function AdminPage() { - return ( - - - Einstellungen - Systemeinstellungen - - -
-

Datenbank herunterladen

- -
-
-
- ); -} - -================ -File: src/app/admin/users/columns.tsx -================ -"use client"; - -import { type UserRole, translateUserRole } from "@/server/auth/permissions"; -import type { users } from "@/server/db/schema"; -import type { ColumnDef } from "@tanstack/react-table"; -import type { InferSelectModel } from "drizzle-orm"; -import { - ArrowUpDown, - MailIcon, - MessageCircleIcon, - MoreHorizontal, -} from "lucide-react"; - -import { Button } from "@/components/ui/button"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import Link from "next/link"; -import { - EditUserDialogContent, - EditUserDialogRoot, - EditUserDialogTrigger, -} from "@/app/admin/users/dialog"; - -// This type is used to define the shape of our data. -// You can use a Zod schema here if you want. -export type User = { - id: string; - github_id: number; - username: string; - displayName: string; - email: string; - role: string; -}; - -export const columns: ColumnDef>[] = [ - { - accessorKey: "id", - header: ({ column }) => { - return ( - - ); - }, - }, - { - accessorKey: "github_id", - header: "GitHub ID", - }, - { - accessorKey: "username", - header: "Username", - }, - { - accessorKey: "displayName", - header: "Name", - }, - { - accessorKey: "email", - header: "E-Mail", - }, - { - accessorKey: "role", - header: "Rolle", - cell: ({ row }) => { - const role = row.getValue("role"); - const translated = translateUserRole(role as UserRole); - - return translated; - }, - }, - { - id: "actions", - cell: ({ row }) => { - const user = row.original; - - return ( - - - - - - - Aktionen - - - - Teams-Chat öffnen - - - - - - E-Mail schicken - - - - - - - - - - - ); - }, - }, -]; - -function generateTeamsChatURL(email: string) { - return `https://teams.microsoft.com/l/chat/0/0?users=${email}`; -} - -function generateEMailURL(email: string) { - return `mailto:${email}`; -} - -================ -File: src/app/admin/users/data-table.tsx -================ -"use client"; - -import { - type ColumnDef, - type ColumnFiltersState, - type SortingState, - type VisibilityState, - flexRender, - getCoreRowModel, - getFilteredRowModel, - getPaginationRowModel, - getSortedRowModel, - useReactTable, -} from "@tanstack/react-table"; - -import { Button } from "@/components/ui/button"; -import { - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { Input } from "@/components/ui/input"; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; -import { SlidersHorizontalIcon } from "lucide-react"; -import { useState } from "react"; - -interface DataTableProps { - columns: ColumnDef[]; - data: TData[]; -} - -export function DataTable({ columns, data }: DataTableProps) { - const [sorting, setSorting] = useState([]); - const [columnFilters, setColumnFilters] = useState([]); - const [columnVisibility, setColumnVisibility] = useState({}); - - const table = useReactTable({ - data, - columns, - getCoreRowModel: getCoreRowModel(), - getPaginationRowModel: getPaginationRowModel(), - onSortingChange: setSorting, - getSortedRowModel: getSortedRowModel(), - onColumnFiltersChange: setColumnFilters, - getFilteredRowModel: getFilteredRowModel(), - onColumnVisibilityChange: setColumnVisibility, - state: { - sorting, - columnFilters, - columnVisibility, - }, - }); - - return ( -
-
- table.getColumn("email")?.setFilterValue(event.target.value)} - className="max-w-sm" - /> - - - - - - {table - .getAllColumns() - .filter((column) => column.getCanHide()) - .map((column) => { - return ( - column.toggleVisibility(!!value)} - > - {column.id} - - ); - })} - - -
- -
- - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - return ( - - {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} - - ); - })} - - ))} - - - {table.getRowModel().rows?.length ? ( - table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - {flexRender(cell.column.columnDef.cell, cell.getContext())} - ))} - - )) - ) : ( - - - Keine Ergebnisse gefunden. - - - )} - -
-
-
- - -
-
- ); -} - -================ -File: src/app/admin/users/dialog.tsx -================ -import type { User } from "@/app/admin/users/columns"; -import { ProfileForm } from "@/app/admin/users/form"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { PencilIcon } from "lucide-react"; - -interface EditUserDialogRootProps { - children: React.ReactNode; -} - -export function EditUserDialogRoot(props: EditUserDialogRootProps) { - const { children } = props; - - return {children}; -} - -export function EditUserDialogTrigger() { - return ( - - - Benutzer bearbeiten - - ); -} - -interface EditUserDialogContentProps { - user: User; -} - -export function EditUserDialogContent(props: EditUserDialogContentProps) { - const { user } = props; - - if (!user) { - return; - } - - return ( - - - Benutzer bearbeiten - - Hinweis: In den seltensten Fällen sollten die Daten - eines Benutzers geändert werden. Dies kann zu unerwarteten Problemen - führen. - - - - - ); -} - -================ -File: src/app/admin/users/form.tsx -================ -"use client"; - -import type { User } from "@/app/admin/users/columns"; -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from "@/components/ui/alert-dialog"; -import { Button } from "@/components/ui/button"; -import { DialogClose } from "@/components/ui/dialog"; -import { - Form, - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { useToast } from "@/components/ui/use-toast"; -import { deleteUser, updateUser } from "@/server/actions/users"; -import type { UserRole } from "@/server/auth/permissions"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { SaveIcon, TrashIcon } from "lucide-react"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; - -export const formSchema = z.object({ - username: z - .string() - .min(2, { - message: "Der Benutzername muss mindestens 2 Zeichen lang sein.", - }) - .max(50), - displayName: z - .string() - .min(2, { - message: "Der Anzeigename muss mindestens 2 Zeichen lang sein.", - }) - .max(50), - email: z.string().email(), - role: z.enum(["admin", "user", "guest"]), -}); - -interface ProfileFormProps { - user: User; -} - -export function ProfileForm(props: ProfileFormProps) { - const { user } = props; - const { toast } = useToast(); - - // 1. Define your form. - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: { - username: user.username, - displayName: user.displayName, - email: user.email, - role: user.role as UserRole, - }, - }); - - // 2. Define a submit handler. - async function onSubmit(values: z.infer) { - toast({ description: "Benutzerprofil wird aktualisiert..." }); - - await updateUser(user.id, values); - - toast({ description: "Benutzerprofil wurde aktualisiert." }); - } - - return ( -
- - ( - - Benutzername - - - - - Nur in Ausnahmefällen sollte der Benutzername geändert werden. - - - - )} - /> - ( - - Anzeigename - - - - - Der Anzeigename darf frei verändert werden. - - - - )} - /> - ( - - E-Mail Adresse - - - - - Nur in Ausnahmefällen sollte die E-Mail Adresse geändert werden. - - - - )} - /> - ( - - Benutzerrolle - - - Die Benutzerrolle bestimmt die Berechtigungen des Benutzers. - - - - )} - /> -
- - - - - - - Bist du dir sicher? - - Diese Aktion kann nicht rückgängig gemacht werden. Das - Benutzerprofil und die damit verbundenen Daten werden - unwiderruflich gelöscht. - - - - Abbrechen - { - toast({ description: "Benutzerprofil wird gelöscht..." }); - deleteUser(user.id); - toast({ description: "Benutzerprofil wurde gelöscht." }); - }} - > - Ja, löschen - - - - - - - -
- - - ); -} - -================ -File: src/app/admin/users/page.tsx -================ -import { columns } from "@/app/admin/users/columns"; -import { DataTable } from "@/app/admin/users/data-table"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { db } from "@/server/db"; - -import type { Metadata } from "next"; - -export const metadata: Metadata = { - title: "Alle Benutzer", -}; - -export default async function AdminPage() { - const data = await db.query.users.findMany(); - - return ( - - - Benutzerverwaltung - Suche, Bearbeite und Lösche Benutzer - - - - - - ); -} - -================ -File: src/app/api/job/[jobId]/remaining-time/route.ts -================ -import { db } from "@/server/db"; -import { printJobs } from "@/server/db/schema"; -import { eq } from "drizzle-orm"; - -export const dynamic = "force-dynamic"; - -interface RemainingTimeRouteProps { - params: { - jobId: string; - }; -} -export async function GET(request: Request, { params }: RemainingTimeRouteProps) { - // Trying to fix build error in container... - if (params.jobId === undefined) { - return Response.json({}); - } - - // Get the job details - const jobDetails = await db.query.printJobs.findFirst({ - where: eq(printJobs.id, params.jobId), - }); - - // Check if the job exists - if (!jobDetails) { - return Response.json({ - id: params.jobId, - error: "Job not found", - }); - } - - // Calculate the remaining time - const startAt = new Date(jobDetails.startAt).getTime(); - const endAt = startAt + jobDetails.durationInMinutes * 60 * 1000; - const remainingTime = Math.max(0, endAt - Date.now()); - - // Return the remaining time - return Response.json({ - id: params.jobId, - remainingTime, - }); -} - -================ -File: src/app/api/printers/route.ts -================ -import { getPrinters } from "@/server/actions/printers"; - -export const dynamic = "force-dynamic"; - -export async function GET() { - const printers = await getPrinters(); - - return Response.json(printers); -} - -================ -File: src/app/auth/login/callback/route.ts -================ -import { lucia } from "@/server/auth"; -import { type GitHubUserResult, github } from "@/server/auth/oauth"; -import { db } from "@/server/db"; -import { users } from "@/server/db/schema"; -import { OAuth2RequestError } from "arctic"; -import { eq } from "drizzle-orm"; -import { generateIdFromEntropySize } from "lucia"; -import { cookies } from "next/headers"; - -export const dynamic = "force-dynamic"; - -interface GithubEmailResponse { - email: string; - primary: boolean; - verified: boolean; - visibility: string; -} - -export async function GET(request: Request): Promise { - const url = new URL(request.url); - const code = url.searchParams.get("code"); - const state = url.searchParams.get("state"); - const storedState = cookies().get("github_oauth_state")?.value ?? null; - if (!code || !state || !storedState || state !== storedState) { - return new Response( - JSON.stringify({ - status_text: "Something is wrong", - data: { code, state, storedState }, - }), - { - status: 400, - }, - ); - } - - try { - const tokens = await github.validateAuthorizationCode(code); - const githubUserResponse = await fetch("https://git.i.mercedes-benz.com/api/v3/user", { - headers: { - Authorization: `Bearer ${tokens.accessToken}`, - }, - }); - const githubUser: GitHubUserResult = await githubUserResponse.json(); - - // Sometimes email can be null in the user query. - if (githubUser.email === null || githubUser.email === undefined) { - const githubEmailResponse = await fetch("https://git.i.mercedes-benz.com/api/v3/user/emails", { - headers: { - Authorization: `Bearer ${tokens.accessToken}`, - }, - }); - const githubUserEmail: GithubEmailResponse[] = await githubEmailResponse.json(); - githubUser.email = githubUserEmail[0].email; - } - const existingUser = await db.query.users.findFirst({ - where: eq(users.github_id, githubUser.id), - }); - - if (existingUser) { - const session = await lucia.createSession(existingUser.id, {}); - const sessionCookie = lucia.createSessionCookie(session.id); - cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes); - return new Response(null, { - status: 302, - headers: { - Location: "/", - }, - }); - } - - const userId = generateIdFromEntropySize(10); // 16 characters long - - await db.insert(users).values({ - id: userId, - github_id: githubUser.id, - username: githubUser.login, - displayName: githubUser.name, - email: githubUser.email, - }); - - const session = await lucia.createSession(userId, {}); - const sessionCookie = lucia.createSessionCookie(session.id); - cookies().set(sessionCookie.name, sessionCookie.value, { - ...sessionCookie.attributes, - secure: false, // Else cookie does not get set cause IT has not provided us an SSL certificate yet - }); - return new Response(null, { - status: 302, - headers: { - Location: "/", - }, - }); - } catch (e) { - // the specific error message depends on the provider - if (e instanceof OAuth2RequestError) { - // invalid code - return new Response( - JSON.stringify({ - status_text: "Invalid code", - error: JSON.stringify(e), - }), - { - status: 400, - }, - ); - } - return new Response(null, { - status: 500, - }); - } -} - -================ -File: src/app/auth/login/route.ts -================ -import { github } from "@/server/auth/oauth"; -import { generateState } from "arctic"; -import { cookies } from "next/headers"; - -export const dynamic = "force-dynamic"; - -export async function GET(): Promise { - const state = generateState(); - const url = await github.createAuthorizationURL(state, { - scopes: ["user"], - }); - const ONE_HOUR = 60 * 60; - - cookies().set("github_oauth_state", state, { - path: "/", - secure: false, //process.env.NODE_ENV === "production", -- can't be used until SSL certificate is provided by IT - httpOnly: true, - maxAge: ONE_HOUR, - sameSite: "lax", - }); - - return Response.redirect(url); -} - -================ -File: src/app/globals.css -================ -@tailwind base; -@tailwind components; -@tailwind utilities; - - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - --primary: 221.2 83.2% 53.3%; - --primary-foreground: 210 40% 98%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 221.2 83.2% 53.3%; - --radius: 0.75rem; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; - } - - .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - --primary: 217.2 91.2% 59.8%; - --primary-foreground: 222.2 47.4% 11.2%; - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 224.3 76.3% 48%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; - } -} - -================ -File: src/app/job/[jobId]/cancel-form.tsx -================ -"use client"; - -import { zodResolver } from "@hookform/resolvers/zod"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; - -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogClose, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; -import { useToast } from "@/components/ui/use-toast"; -import { abortPrintJob } from "@/server/actions/printJobs"; -import { TriangleAlertIcon } from "lucide-react"; -import { useState } from "react"; - -const formSchema = z.object({ - abortReason: z - .string() - .min(1, { - message: "Bitte gebe einen Grund für den Abbruch an.", - }) - .max(255, { - message: "Der Grund darf maximal 255 Zeichen lang sein.", - }), -}); - -interface CancelFormProps { - jobId: string; -} - -export function CancelForm(props: CancelFormProps) { - const { jobId } = props; - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: { - abortReason: "", - }, - }); - const { toast } = useToast(); - const [open, setOpen] = useState(false); - - async function onSubmit(values: z.infer) { - toast({ - description: "Druckauftrag wird abgebrochen...", - }); - try { - const result = await abortPrintJob(jobId, values.abortReason); - if (result?.error) { - toast({ - description: result.error, - variant: "destructive", - }); - } - setOpen(false); - toast({ - description: "Druckauftrag wurde abgebrochen.", - }); - } catch (error) { - if (error instanceof Error) { - toast({ - description: error.message, - variant: "destructive", - }); - } else { - toast({ - description: "Ein unbekannter Fehler ist aufgetreten.", - variant: "destructive", - }); - } - } - } - - return ( - - - - - - - Druckauftrag abbrechen? - - Du bist dabei, den Druckauftrag abzubrechen. Bitte beachte, dass ein abgebrochener Druckauftrag nicht wieder - aufgenommen werden kann und der Drucker sich automatisch abschaltet. - - -
- - ( - - Grund für den Abbruch - - - - - Bitte teile uns den Grund für den Abbruch des Druckauftrags mit. Wenn der Drucker eine Fehlermeldung - anzeigt, gib bitte nur diese Fehlermeldung an. - - - - )} - /> -
- - - - -
- - -
-
- ); -} - -================ -File: src/app/job/[jobId]/edit-comments.tsx -================ -"use client"; - -import { Label } from "@/components/ui/label"; -import { Textarea } from "@/components/ui/textarea"; -import { useToast } from "@/components/ui/use-toast"; -import { updatePrintComments } from "@/server/actions/printJobs"; -import { useDebouncedCallback } from "use-debounce"; - -interface EditCommentsProps { - defaultValue: string | null; - jobId: string; - disabled?: boolean; -} -export function EditComments(props: EditCommentsProps) { - const { defaultValue, jobId, disabled } = props; - const { toast } = useToast(); - - const debounced = useDebouncedCallback(async (value) => { - try { - const result = await updatePrintComments(jobId, value); - if (result?.error) { - toast({ - description: result.error, - variant: "destructive", - }); - } - toast({ - description: "Anmerkungen wurden gespeichert.", - }); - } catch (error) { - if (error instanceof Error) { - toast({ - description: error.message, - variant: "destructive", - }); - } else { - toast({ - description: "Ein unbekannter Fehler ist aufgetreten.", - variant: "destructive", - }); - } - } - }, 1000); - - return ( -
- -