From 5b4228261a941e7af0489f6e534fac0e13ccb6a5 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sat, 11 Jul 2026 20:52:56 +0200 Subject: [PATCH] Reapply "Add missing admin action files and navigation links" This reverts commit 4d515bc400940978256db34bb510ae0ad6130755. --- README.md | 23 +- eslint.config.mjs | 6 +- next.config.ts | 10 +- package.json | 7 +- pnpm-lock.yaml | 7009 +++++++++++------ public/api/openapi.json | 14 +- public/scripts/theme-init.js | 20 +- public/sw.js | 5 +- scripts/apply-migrations.ts | 9 +- scripts/migrate-aes-cbc-to-gcm.ts | 8 +- src/actions/admin-ads.ts | 8 +- src/actions/admin-alerts.ts | 4 +- src/actions/admin-articles.ts | 12 +- src/actions/admin-badges.ts | 4 +- src/actions/admin-bans.ts | 5 +- src/actions/admin-email-templates.ts | 12 +- src/actions/admin-emulator.ts | 8 +- src/actions/admin-help.ts | 50 +- src/actions/admin-housekeeping.ts | 8 +- src/actions/admin-ip.ts | 8 +- src/actions/admin-maintenance.ts | 6 +- src/actions/admin-media.ts | 4 +- src/actions/admin-permissions.ts | 8 +- src/actions/admin-radio-autodj.ts | 60 +- src/actions/admin-radio-extra.ts | 88 +- src/actions/admin-radio-moderation.ts | 20 +- src/actions/admin-radio.ts | 28 +- src/actions/admin-rare-values.ts | 29 +- src/actions/admin-settings.ts | 8 +- src/actions/admin-shop.ts | 42 +- src/actions/admin-tags.ts | 46 +- src/actions/admin-vouchers.ts | 4 +- src/actions/admin-vpn.ts | 12 +- src/actions/admin-wordfilter.ts | 4 +- src/actions/admin-writeable-boxes.ts | 18 +- src/actions/applications.ts | 8 +- src/actions/article-comments.ts | 4 +- src/actions/article-reactions.ts | 4 +- src/actions/auth-precheck.ts | 13 +- src/actions/badges.ts | 25 + src/actions/bulk-users.ts | 128 + src/actions/catalog-bc.ts | 100 + src/actions/catalog-items.ts | 126 + src/actions/catalog.ts | 80 + src/actions/commandocentrum.ts | 16 +- src/actions/draw-badge.ts | 54 +- src/actions/email-verify.ts | 23 +- src/actions/guestbook.ts | 4 +- src/actions/help-tickets.ts | 8 +- src/actions/import-badges.ts | 18 + src/actions/import-furni.ts | 19 + src/actions/multi-account-detect.ts | 41 + src/actions/password-reset.test.ts | 7 +- src/actions/password-reset.ts | 16 +- src/actions/permissions.ts | 71 + src/actions/radio-apply.ts | 4 +- src/actions/radio-requests.ts | 8 +- src/actions/radio-shouts.ts | 4 +- src/actions/referral.ts | 10 +- src/actions/register.ts | 13 +- src/actions/rooms.ts | 85 + src/actions/save-favicon.ts | 23 +- src/actions/save-logo.ts | 30 +- src/actions/social.ts | 8 +- src/actions/soundtracks.ts | 20 + src/actions/twofactor.ts | 20 +- src/actions/voucher.ts | 5 +- src/app/admin/achievements/page.tsx | 8 +- src/app/admin/ads/[id]/page.tsx | 10 +- src/app/admin/ads/new/page.tsx | 4 +- src/app/admin/ads/page.tsx | 4 +- src/app/admin/alerts/page.tsx | 14 +- src/app/admin/applications/page.tsx | 4 +- src/app/admin/articles/[id]/page.tsx | 24 +- src/app/admin/articles/new/page.tsx | 16 +- src/app/admin/articles/page.tsx | 27 +- src/app/admin/badges/page.tsx | 13 +- src/app/admin/bans/page.tsx | 12 +- src/app/admin/calendar/[id]/page.tsx | 50 +- src/app/admin/calendar/page.tsx | 17 +- .../catalog/[id]/catalog-detail-tabs.tsx | 126 + .../catalog/[id]/catalog-items-table.tsx | 7 + .../catalog-items-table.tsx | 2008 +++++ .../catalog-items-table/field-helpers.tsx | 250 + .../[id]/catalog-items-table/furni-icon.tsx | 42 + .../catalog/[id]/catalog-items-table/index.ts | 4 + .../[id]/catalog-items-table/song-picker.tsx | 94 + .../catalog/[id]/catalog-items-table/types.ts | 85 + .../admin/catalog/[id]/catalog-page-form.tsx | 700 ++ .../catalog/[id]/catalog-translate-tab.tsx | 507 ++ src/app/admin/catalog/[id]/loading.tsx | 41 + src/app/admin/catalog/[id]/page.tsx | 267 +- .../admin/catalog/builder-club/[id]/page.tsx | 61 + .../admin/catalog/builder-club/bc-manager.tsx | 548 ++ src/app/admin/catalog/builder-club/page.tsx | 5 + src/app/admin/catalog/catalog-actions.tsx | 128 + src/app/admin/catalog/catalog-table.tsx | 178 + src/app/admin/catalog/catalog-view-toggle.tsx | 85 + src/app/admin/catalog/loading.tsx | 44 + src/app/admin/catalog/page.tsx | 499 +- src/app/admin/commandocentrum/page.tsx | 318 +- src/app/admin/email-templates/page.tsx | 16 +- src/app/admin/emulator/page.tsx | 190 +- src/app/admin/favicon/favicon-generator.tsx | 15 +- src/app/admin/help-questions/[id]/page.tsx | 16 +- src/app/admin/help-questions/new/page.tsx | 4 +- src/app/admin/help-questions/page.tsx | 12 +- src/app/admin/housekeeping/page.tsx | 74 +- .../import/badges/badge-editor-dialog.tsx | 108 + .../import/badges/import-badges-client.tsx | 496 ++ src/app/admin/import/badges/loading.tsx | 21 + src/app/admin/import/badges/page.tsx | 12 + .../import/clone/import-clone-client.tsx | 887 +++ src/app/admin/import/clone/page.tsx | 11 + .../clothing/import-clothing-client.tsx | 838 ++ src/app/admin/import/clothing/loading.tsx | 13 + src/app/admin/import/clothing/page.tsx | 11 + .../import/effects/import-effects-client.tsx | 394 + src/app/admin/import/effects/loading.tsx | 14 + src/app/admin/import/effects/page.tsx | 12 + .../import/furni/import-furni-client.tsx | 1814 +++++ src/app/admin/import/furni/loading.tsx | 21 + .../import/furni/nitro-editor-dialog.tsx | 755 ++ src/app/admin/import/furni/page.tsx | 12 + .../admin/import/pets/import-pets-client.tsx | 356 + src/app/admin/import/pets/loading.tsx | 13 + src/app/admin/import/pets/page.tsx | 11 + src/app/admin/import/repair/page.tsx | 12 + src/app/admin/import/repair/repair-client.tsx | 757 ++ src/app/admin/ip/page.tsx | 23 +- src/app/admin/layout.tsx | 86 +- src/app/admin/loading.tsx | 5 +- src/app/admin/logs/page.tsx | 51 +- src/app/admin/maintenance/page.tsx | 29 +- src/app/admin/media/page.tsx | 8 +- src/app/admin/navigation/page.tsx | 19 +- src/app/admin/page.tsx | 87 +- src/app/admin/permissions/[id]/page.tsx | 75 + .../permissions/[id]/rank-edit-client.tsx | 728 ++ src/app/admin/permissions/loading.tsx | 28 + src/app/admin/permissions/page.tsx | 174 +- .../admin/permissions/permissions-list.tsx | 267 + src/app/admin/photos/page.tsx | 25 +- src/app/admin/radio/api-keys/page.tsx | 32 +- src/app/admin/radio/autodj/page.tsx | 106 +- src/app/admin/radio/banners/page.tsx | 124 +- src/app/admin/radio/embed/embed-snippet.tsx | 18 +- src/app/admin/radio/embed/page.tsx | 71 +- src/app/admin/radio/history/page.tsx | 63 +- src/app/admin/radio/moderation/page.tsx | 30 +- src/app/admin/radio/monitoring/page.tsx | 137 +- src/app/admin/radio/page.tsx | 76 +- src/app/admin/radio/points/page.tsx | 19 +- src/app/admin/radio/ranks/page.tsx | 73 +- src/app/admin/radio/settings/page.tsx | 290 +- src/app/admin/rare-values/page.tsx | 105 +- .../rooms/[id]/furni/edit-item-dialog.tsx | 179 + .../admin/rooms/[id]/furni/furni-client.tsx | 701 ++ src/app/admin/rooms/[id]/furni/page.tsx | 84 + src/app/admin/rooms/[id]/page.tsx | 83 +- src/app/admin/rooms/[id]/room-edit-form.tsx | 221 + src/app/admin/rooms/_lib/load-room.ts | 15 + src/app/admin/rooms/edit/[id]/page.tsx | 69 + src/app/admin/rooms/loading.tsx | 28 + src/app/admin/rooms/page.tsx | 184 +- src/app/admin/rooms/rooms-table.tsx | 131 + src/app/admin/rooms/show/[id]/page.tsx | 128 + src/app/admin/settings/page.tsx | 14 +- src/app/admin/shop/[id]/page.tsx | 107 +- src/app/admin/shop/new/page.tsx | 63 +- src/app/admin/shop/page.tsx | 12 +- src/app/admin/sounds/page.tsx | 76 + src/app/admin/sounds/sounds-client.tsx | 617 ++ src/app/admin/sounds/trax-player.tsx | 241 + src/app/admin/subscriptions/page.tsx | 12 +- src/app/admin/tags/page.tsx | 69 +- src/app/admin/teams/page.tsx | 16 +- src/app/admin/theme/page.tsx | 30 +- .../tickets/[id]/admin-ticket-detail.tsx | 386 + src/app/admin/tickets/[id]/page.tsx | 95 + src/app/admin/tickets/page.tsx | 217 + src/app/admin/tickets/templates/page.tsx | 25 + .../tickets/templates/templates-manager.tsx | 172 + src/app/admin/transactions/page.tsx | 28 +- .../client/client-translations.tsx | 248 + src/app/admin/translations/client/page.tsx | 51 + src/app/admin/translations/cms/page.tsx | 11 + src/app/admin/translations/emulator/page.tsx | 113 + src/app/admin/translations/layout.tsx | 17 + src/app/admin/translations/loading.tsx | 28 + src/app/admin/translations/page.tsx | 7 + .../translations/translations-client.tsx | 179 + .../admin/translations/translations-tabs.tsx | 40 + src/app/admin/users/[id]/edit/page.tsx | 18 +- src/app/admin/users/[id]/loading.tsx | 50 + src/app/admin/users/[id]/page.tsx | 138 +- .../admin/users/[id]/user-activity-log.tsx | 114 + .../admin/users/[id]/user-badges-section.tsx | 92 + src/app/admin/users/[id]/user-ban-section.tsx | 166 + src/app/admin/users/[id]/user-edit-form.tsx | 153 + .../admin/users/[id]/user-quick-actions.tsx | 219 + src/app/admin/users/[id]/user-rooms.tsx | 65 + .../users/_components/create-user-dialog.tsx | 204 + .../users/_components/user-account-info.tsx | 115 + .../_components/user-badges-readonly.tsx | 37 + src/app/admin/users/_components/user-hero.tsx | 202 + src/app/admin/users/_lib/load-user.ts | 73 + src/app/admin/users/edit/[id]/page.tsx | 137 + src/app/admin/users/loading.tsx | 46 + src/app/admin/users/multi-accounts/page.tsx | 113 + src/app/admin/users/page.tsx | 179 +- src/app/admin/users/show/[id]/page.tsx | 89 + src/app/admin/users/users-table.tsx | 442 ++ src/app/admin/vouchers/page.tsx | 43 +- src/app/admin/vpn/page.tsx | 40 +- src/app/admin/wordfilter/page.tsx | 9 +- src/app/admin/writeable-boxes/page.tsx | 52 +- src/app/api/admin/users/actions/route.ts | 66 +- src/app/api/articles/[slug]/comment/route.ts | 5 +- src/app/api/articles/[slug]/route.ts | 5 +- src/app/api/articles/route.ts | 5 +- src/app/api/badges/leaderboard/route.ts | 8 +- src/app/api/guilds/[id]/route.ts | 5 +- src/app/api/guilds/route.ts | 5 +- src/app/api/health/route.ts | 13 +- src/app/api/leaderboard/route.ts | 7 +- src/app/api/media/[...path]/route.ts | 14 +- src/app/api/online/count/route.ts | 4 +- src/app/api/paypal/capture/route.ts | 6 +- src/app/api/photos/route.ts | 5 +- src/app/api/radio/embed-config/route.ts | 7 +- src/app/api/radio/listeners/route.ts | 4 +- src/app/api/radio/now-playing/route.ts | 4 +- src/app/api/shop/route.ts | 5 +- src/app/api/tickets/[id]/reply/route.ts | 4 +- src/app/api/tickets/route.ts | 8 +- src/app/api/users/[username]/route.ts | 5 +- src/app/api/values/[id]/route.ts | 5 +- src/app/api/values/route.ts | 5 +- src/app/apply/staff/page.tsx | 20 +- src/app/apply/team/page.tsx | 13 +- src/app/badges/page.tsx | 6 +- src/app/community/page.tsx | 6 +- src/app/developers/page.tsx | 64 +- src/app/draw-badge/page.tsx | 20 +- src/app/error.tsx | 8 +- src/app/forgot/page.tsx | 20 +- src/app/friends/page.tsx | 15 +- src/app/globals.css | 87 +- src/app/guilds/[id]/forum/new/page.tsx | 6 +- src/app/guilds/[id]/forum/page.tsx | 22 +- src/app/guilds/[id]/page.tsx | 11 +- src/app/guilds/page.tsx | 10 +- src/app/help/[category]/page.tsx | 17 +- src/app/help/tickets/page.tsx | 6 +- src/app/layout.tsx | 6 +- src/app/leaderboard/page.tsx | 9 +- src/app/loading.tsx | 5 +- src/app/login/page.tsx | 4 +- src/app/maintenance/page.tsx | 6 +- src/app/manifest.ts | 4 +- src/app/marketplace/page.tsx | 10 +- src/app/me/CopyReferralButton.tsx | 4 +- src/app/me/page.tsx | 17 +- src/app/messages/page.tsx | 33 +- src/app/news/[slug]/page.tsx | 51 +- src/app/news/loading.tsx | 5 +- src/app/photos/page.tsx | 11 +- src/app/radio/apply/page.tsx | 10 +- src/app/radio/contests/[id]/page.tsx | 10 +- src/app/radio/contests/page.tsx | 10 +- src/app/radio/giveaways/[id]/page.tsx | 14 +- src/app/radio/giveaways/page.tsx | 23 +- src/app/radio/layout.tsx | 26 +- src/app/radio/leaderboard/page.tsx | 15 +- src/app/radio/page.tsx | 44 +- src/app/radio/requests/page.tsx | 14 +- src/app/radio/schedule/page.tsx | 23 +- src/app/radio/shouts/page.tsx | 11 +- src/app/rares/[category]/page.tsx | 17 +- src/app/rares/page.tsx | 10 +- src/app/redeem/RedeemForm.tsx | 5 +- src/app/redeem/page.tsx | 6 +- src/app/register/page.tsx | 19 +- src/app/reset/page.tsx | 10 +- src/app/room/[id]/page.tsx | 19 +- src/app/settings/2fa/page.tsx | 80 +- src/app/settings/connections/page.tsx | 13 +- src/app/settings/page.tsx | 17 +- src/app/shop/page.tsx | 22 +- src/app/shop/topup/TopUpForm.tsx | 12 +- src/app/shop/topup/page.tsx | 17 +- src/app/sitemap.ts | 22 +- src/app/staff/page.tsx | 4 +- src/app/u/[username]/page.tsx | 18 +- src/app/verify/page.tsx | 38 +- src/components/admin/admin-nav-link.tsx | 10 +- src/components/admin/article-form.tsx | 31 +- src/components/admin/dashboard.tsx | 41 +- src/components/admin/media-grid.tsx | 66 +- src/components/admin/media-picker.tsx | 144 +- src/components/admin/rich-text.tsx | 11 +- src/components/auth/home-login-form.tsx | 9 +- src/components/language-switcher.tsx | 12 +- src/components/mobile-nav.tsx | 12 +- src/components/nav-dropdown.tsx | 19 +- src/components/navbar-color-picker.tsx | 62 +- src/components/navigation.tsx | 116 +- src/components/public/habbo-fonts.ts | 9 +- src/components/public/logo-generator.tsx | 28 +- src/components/public/photo-lightbox.tsx | 6 +- src/components/public/radio-player.tsx | 11 +- src/components/public/sprite-font.ts | 12 +- src/components/public/ui.tsx | 16 +- src/components/site-header.tsx | 48 +- src/components/theme-switcher.tsx | 4 +- src/i18n/request.ts | 13 +- src/lib/access-guard.ts | 3 +- src/lib/auth.ts | 18 +- src/lib/auth/index.ts | 15 +- src/lib/auth/laravel-encrypter.test.ts | 6 +- src/lib/auth/password.test.ts | 8 +- src/lib/rate-limit.ts | 6 +- src/lib/redis.ts | 4 +- src/lib/sanitize.ts | 37 +- src/lib/services/abuse-guard.ts | 3 +- src/lib/services/alert.ts | 15 +- src/lib/services/ip-lookup.ts | 3 +- src/lib/services/moderation.ts | 4 +- src/lib/services/paypal.ts | 10 +- src/lib/services/send-currency.ts | 5 +- src/messages/de.json | 17 +- src/messages/en.json | 15 +- src/messages/es.json | 17 +- src/messages/fr.json | 17 +- src/messages/it.json | 12 +- src/messages/nl.json | 15 +- tsconfig.json | 22 +- 338 files changed, 28143 insertions(+), 5948 deletions(-) create mode 100644 src/actions/badges.ts create mode 100644 src/actions/bulk-users.ts create mode 100644 src/actions/catalog-bc.ts create mode 100644 src/actions/catalog-items.ts create mode 100644 src/actions/catalog.ts create mode 100644 src/actions/import-badges.ts create mode 100644 src/actions/import-furni.ts create mode 100644 src/actions/multi-account-detect.ts create mode 100644 src/actions/permissions.ts create mode 100644 src/actions/rooms.ts create mode 100644 src/actions/soundtracks.ts create mode 100644 src/app/admin/catalog/[id]/catalog-detail-tabs.tsx create mode 100644 src/app/admin/catalog/[id]/catalog-items-table.tsx create mode 100644 src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx create mode 100644 src/app/admin/catalog/[id]/catalog-items-table/field-helpers.tsx create mode 100644 src/app/admin/catalog/[id]/catalog-items-table/furni-icon.tsx create mode 100644 src/app/admin/catalog/[id]/catalog-items-table/index.ts create mode 100644 src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx create mode 100644 src/app/admin/catalog/[id]/catalog-items-table/types.ts create mode 100644 src/app/admin/catalog/[id]/catalog-page-form.tsx create mode 100644 src/app/admin/catalog/[id]/catalog-translate-tab.tsx create mode 100644 src/app/admin/catalog/[id]/loading.tsx create mode 100644 src/app/admin/catalog/builder-club/[id]/page.tsx create mode 100644 src/app/admin/catalog/builder-club/bc-manager.tsx create mode 100644 src/app/admin/catalog/builder-club/page.tsx create mode 100644 src/app/admin/catalog/catalog-actions.tsx create mode 100644 src/app/admin/catalog/catalog-table.tsx create mode 100644 src/app/admin/catalog/catalog-view-toggle.tsx create mode 100644 src/app/admin/catalog/loading.tsx create mode 100644 src/app/admin/import/badges/badge-editor-dialog.tsx create mode 100644 src/app/admin/import/badges/import-badges-client.tsx create mode 100644 src/app/admin/import/badges/loading.tsx create mode 100644 src/app/admin/import/badges/page.tsx create mode 100644 src/app/admin/import/clone/import-clone-client.tsx create mode 100644 src/app/admin/import/clone/page.tsx create mode 100644 src/app/admin/import/clothing/import-clothing-client.tsx create mode 100644 src/app/admin/import/clothing/loading.tsx create mode 100644 src/app/admin/import/clothing/page.tsx create mode 100644 src/app/admin/import/effects/import-effects-client.tsx create mode 100644 src/app/admin/import/effects/loading.tsx create mode 100644 src/app/admin/import/effects/page.tsx create mode 100644 src/app/admin/import/furni/import-furni-client.tsx create mode 100644 src/app/admin/import/furni/loading.tsx create mode 100644 src/app/admin/import/furni/nitro-editor-dialog.tsx create mode 100644 src/app/admin/import/furni/page.tsx create mode 100644 src/app/admin/import/pets/import-pets-client.tsx create mode 100644 src/app/admin/import/pets/loading.tsx create mode 100644 src/app/admin/import/pets/page.tsx create mode 100644 src/app/admin/import/repair/page.tsx create mode 100644 src/app/admin/import/repair/repair-client.tsx create mode 100644 src/app/admin/permissions/[id]/page.tsx create mode 100644 src/app/admin/permissions/[id]/rank-edit-client.tsx create mode 100644 src/app/admin/permissions/loading.tsx create mode 100644 src/app/admin/permissions/permissions-list.tsx create mode 100644 src/app/admin/rooms/[id]/furni/edit-item-dialog.tsx create mode 100644 src/app/admin/rooms/[id]/furni/furni-client.tsx create mode 100644 src/app/admin/rooms/[id]/furni/page.tsx create mode 100644 src/app/admin/rooms/[id]/room-edit-form.tsx create mode 100644 src/app/admin/rooms/_lib/load-room.ts create mode 100644 src/app/admin/rooms/edit/[id]/page.tsx create mode 100644 src/app/admin/rooms/loading.tsx create mode 100644 src/app/admin/rooms/rooms-table.tsx create mode 100644 src/app/admin/rooms/show/[id]/page.tsx create mode 100644 src/app/admin/sounds/page.tsx create mode 100644 src/app/admin/sounds/sounds-client.tsx create mode 100644 src/app/admin/sounds/trax-player.tsx create mode 100644 src/app/admin/tickets/[id]/admin-ticket-detail.tsx create mode 100644 src/app/admin/tickets/[id]/page.tsx create mode 100644 src/app/admin/tickets/page.tsx create mode 100644 src/app/admin/tickets/templates/page.tsx create mode 100644 src/app/admin/tickets/templates/templates-manager.tsx create mode 100644 src/app/admin/translations/client/client-translations.tsx create mode 100644 src/app/admin/translations/client/page.tsx create mode 100644 src/app/admin/translations/cms/page.tsx create mode 100644 src/app/admin/translations/emulator/page.tsx create mode 100644 src/app/admin/translations/layout.tsx create mode 100644 src/app/admin/translations/loading.tsx create mode 100644 src/app/admin/translations/page.tsx create mode 100644 src/app/admin/translations/translations-client.tsx create mode 100644 src/app/admin/translations/translations-tabs.tsx create mode 100644 src/app/admin/users/[id]/loading.tsx create mode 100644 src/app/admin/users/[id]/user-activity-log.tsx create mode 100644 src/app/admin/users/[id]/user-badges-section.tsx create mode 100644 src/app/admin/users/[id]/user-ban-section.tsx create mode 100644 src/app/admin/users/[id]/user-edit-form.tsx create mode 100644 src/app/admin/users/[id]/user-quick-actions.tsx create mode 100644 src/app/admin/users/[id]/user-rooms.tsx create mode 100644 src/app/admin/users/_components/create-user-dialog.tsx create mode 100644 src/app/admin/users/_components/user-account-info.tsx create mode 100644 src/app/admin/users/_components/user-badges-readonly.tsx create mode 100644 src/app/admin/users/_components/user-hero.tsx create mode 100644 src/app/admin/users/_lib/load-user.ts create mode 100644 src/app/admin/users/edit/[id]/page.tsx create mode 100644 src/app/admin/users/loading.tsx create mode 100644 src/app/admin/users/multi-accounts/page.tsx create mode 100644 src/app/admin/users/show/[id]/page.tsx create mode 100644 src/app/admin/users/users-table.tsx diff --git a/README.md b/README.md index 73f09a82..692527ac 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,12 @@ Features full public-facing website, administrative panel, NextAuth authenticati ## Requirements -| Component | Version | -|---|---| -| Node.js | >= 22 | -| pnpm | >= 10.33.4 | -| MySQL / MariaDB | 8.0+ / 10.6+ | -| Redis | Optional (caching / rate limiting) | +| Component | Version | +| --------------- | ---------------------------------- | +| Node.js | >= 22 | +| pnpm | >= 10.33.4 | +| MySQL / MariaDB | 8.0+ / 10.6+ | +| Redis | Optional (caching / rate limiting) | --- @@ -240,6 +240,7 @@ pnpm jobs:worker ``` Scheduled tasks: + - **Daily at 03:00** — Emulator JAR backup (when `EMULATOR_JAR_PATH` and `EMULATOR_BACKUP_DIR` are configured) - **Daily at 04:00** — Cleanup of login logs older than 30 days and expired password reset tokens older than 7 days @@ -288,11 +289,11 @@ Supports Cloudflare Turnstile and Google reCAPTCHA. Configure via **Admin → CM ## Database Architecture -| Component | Type | Migrations | -|---|---|---| -| Emulator tables (`users`, `items`, `rooms`, etc.) | Existing Polaris schema | None — read-only for CMS | -| CMS tables (`website_*`, `radio_*`, etc.) | CMS-owned | `prisma/migrations/*.sql` (9 files) | -| Migration tracking | `cms_migrations` table | Auto-created | +| Component | Type | Migrations | +| ------------------------------------------------- | ----------------------- | ----------------------------------- | +| Emulator tables (`users`, `items`, `rooms`, etc.) | Existing Polaris schema | None — read-only for CMS | +| CMS tables (`website_*`, `radio_*`, etc.) | CMS-owned | `prisma/migrations/*.sql` (9 files) | +| Migration tracking | `cms_migrations` table | Auto-created | --- diff --git a/eslint.config.mjs b/eslint.config.mjs index 142bd914..88dec1a0 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -25,10 +25,7 @@ export default tseslint.config( "no-console": "off", "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": [ - "warn", - { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, - ], + "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }], "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/no-non-null-assertion": "warn", @@ -42,7 +39,6 @@ export default tseslint.config( "security/detect-object-injection": "warn", "security/detect-non-literal-fs-filename": "warn", - }, }, { diff --git a/next.config.ts b/next.config.ts index 246c56ca..9200ce00 100644 --- a/next.config.ts +++ b/next.config.ts @@ -52,15 +52,11 @@ const nextConfig: NextConfig = { }, { source: "/assets/(.*)", - headers: [ - { key: "Cache-Control", value: "public, max-age=31536000, immutable" }, - ], + headers: [{ key: "Cache-Control", value: "public, max-age=31536000, immutable" }], }, { source: "/images/(.*)", - headers: [ - { key: "Cache-Control", value: "public, max-age=86400" }, - ], + headers: [{ key: "Cache-Control", value: "public, max-age=86400" }], }, ]; }, @@ -70,4 +66,4 @@ const nextConfig: NextConfig = { // src/i18n/request.ts, so URLs and the access-guard middleware stay unchanged. const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts"); -export default withNextIntl(nextConfig); \ No newline at end of file +export default withNextIntl(nextConfig); diff --git a/package.json b/package.json index 5e480d5d..c00a7ea7 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,11 @@ "prisma", "@prisma/client", "@prisma/engines" - ] + ], + "overrides": { + "fast-uri": "^3.1.3", + "@hono/node-server": "^1.19.13", + "postcss": "^8.5.16" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e47ee74..5f52d3b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,17 +1,21 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false -importers: +overrides: + fast-uri: ^3.1.3 + "@hono/node-server": ^1.19.13 + postcss: ^8.5.16 +importers: .: dependencies: - '@prisma/adapter-mariadb': + "@prisma/adapter-mariadb": specifier: ^7.8.0 version: 7.8.0 - '@prisma/client': + "@prisma/client": specifier: ^7.8.0 version: 7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(typescript@5.9.3) bcryptjs: @@ -66,34 +70,34 @@ importers: specifier: ^3.24.0 version: 3.25.76 devDependencies: - '@eslint/js': + "@eslint/js": specifier: ^10.0.1 version: 10.0.1(eslint@10.6.0(jiti@2.7.0)) - '@next/eslint-plugin-next': + "@next/eslint-plugin-next": specifier: ^16.2.10 version: 16.2.10 - '@tailwindcss/forms': + "@tailwindcss/forms": specifier: ^0.5.11 version: 0.5.11(tailwindcss@4.3.2) - '@tailwindcss/postcss': + "@tailwindcss/postcss": specifier: ^4.3.2 version: 4.3.2 - '@tailwindcss/typography': + "@tailwindcss/typography": specifier: ^0.5.20 version: 0.5.20(tailwindcss@4.3.2) - '@types/node': + "@types/node": specifier: ^22.10.0 version: 22.20.0 - '@types/nodemailer': + "@types/nodemailer": specifier: ^6.4.0 version: 6.4.24 - '@types/react': + "@types/react": specifier: ^19.2.0 version: 19.2.17 - '@types/react-dom': + "@types/react-dom": specifier: ^19.2.0 version: 19.2.3(@types/react@19.2.17) - '@types/sanitize-html': + "@types/sanitize-html": specifier: ^2.16.1 version: 2.16.1 dotenv: @@ -141,7 +145,7 @@ importers: packages/db: dependencies: - '@atomcms/settings': + "@atomcms/settings": specifier: workspace:* version: link:../settings drizzle-orm: @@ -171,1696 +175,2625 @@ importers: version: 2.1.9(@types/node@22.20.0) packages: + "@alloc/quick-lru@5.2.0": + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: ">=10" } - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@auth/core@0.41.2': - resolution: {integrity: sha512-Hx5MNBxN2fJTbJKGUKAA0wca43D0Akl3TvufY54Gn8lop7F+34vU1zA1pn0vQfIoVuLIrpfc2nkyjwIaPJMW7w==} + "@auth/core@0.41.2": + resolution: + { + integrity: sha512-Hx5MNBxN2fJTbJKGUKAA0wca43D0Akl3TvufY54Gn8lop7F+34vU1zA1pn0vQfIoVuLIrpfc2nkyjwIaPJMW7w==, + } peerDependencies: - '@simplewebauthn/browser': ^9.0.1 - '@simplewebauthn/server': ^9.0.2 + "@simplewebauthn/browser": ^9.0.1 + "@simplewebauthn/server": ^9.0.2 nodemailer: ^7.0.7 peerDependenciesMeta: - '@simplewebauthn/browser': + "@simplewebauthn/browser": optional: true - '@simplewebauthn/server': + "@simplewebauthn/server": optional: true nodemailer: optional: true - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} + "@babel/code-frame@7.29.7": + resolution: + { + integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==, + } + engines: { node: ">=6.9.0" } - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} + "@babel/compat-data@7.29.7": + resolution: + { + integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==, + } + engines: { node: ">=6.9.0" } - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} + "@babel/core@7.29.7": + resolution: + { + integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==, + } + engines: { node: ">=6.9.0" } - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} - engines: {node: '>=6.9.0'} + "@babel/generator@7.29.7": + resolution: + { + integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} + "@babel/helper-compilation-targets@7.29.7": + resolution: + { + integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} + "@babel/helper-globals@7.29.7": + resolution: + { + integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} + "@babel/helper-module-imports@7.29.7": + resolution: + { + integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} + "@babel/helper-module-transforms@7.29.7": + resolution: + { + integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} + "@babel/helper-string-parser@7.29.7": + resolution: + { + integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} + "@babel/helper-validator-identifier@7.29.7": + resolution: + { + integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} + "@babel/helper-validator-option@7.29.7": + resolution: + { + integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==, + } + engines: { node: ">=6.9.0" } - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} + "@babel/helpers@7.29.7": + resolution: + { + integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==, + } + engines: { node: ">=6.9.0" } - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} - engines: {node: '>=6.0.0'} + "@babel/parser@7.29.7": + resolution: + { + integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==, + } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} + "@babel/template@7.29.7": + resolution: + { + integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==, + } + engines: { node: ">=6.9.0" } - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} - engines: {node: '>=6.9.0'} + "@babel/traverse@7.29.7": + resolution: + { + integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==, + } + engines: { node: ">=6.9.0" } - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} + "@babel/types@7.29.7": + resolution: + { + integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==, + } + engines: { node: ">=6.9.0" } - '@drizzle-team/brocli@0.10.2': - resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + "@drizzle-team/brocli@0.10.2": + resolution: + { + integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==, + } - '@electric-sql/pglite-socket@0.1.1': - resolution: {integrity: sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==} + "@electric-sql/pglite-socket@0.1.1": + resolution: + { + integrity: sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==, + } hasBin: true peerDependencies: - '@electric-sql/pglite': 0.4.1 + "@electric-sql/pglite": 0.4.1 - '@electric-sql/pglite-tools@0.3.1': - resolution: {integrity: sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==} + "@electric-sql/pglite-tools@0.3.1": + resolution: + { + integrity: sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==, + } peerDependencies: - '@electric-sql/pglite': 0.4.1 + "@electric-sql/pglite": 0.4.1 - '@electric-sql/pglite@0.4.1': - resolution: {integrity: sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==} + "@electric-sql/pglite@0.4.1": + resolution: + { + integrity: sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==, + } - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + "@emnapi/runtime@1.11.1": + resolution: + { + integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==, + } - '@esbuild-kit/core-utils@3.3.2': - resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' + "@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-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'} + "@esbuild/aix-ppc64@0.19.12": + resolution: + { + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + "@esbuild/aix-ppc64@0.21.5": + resolution: + { + integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} - engines: {node: '>=18'} + "@esbuild/aix-ppc64@0.28.1": + resolution: + { + integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} + "@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'} + "@esbuild/android-arm64@0.19.12": + resolution: + { + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + "@esbuild/android-arm64@0.21.5": + resolution: + { + integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, + } + engines: { node: ">=12" } cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.28.1": + resolution: + { + integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==, + } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} + "@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'} + "@esbuild/android-arm@0.19.12": + resolution: + { + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, + } + engines: { node: ">=12" } cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + "@esbuild/android-arm@0.21.5": + resolution: + { + integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, + } + engines: { node: ">=12" } cpu: [arm] os: [android] - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.28.1": + resolution: + { + integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==, + } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} + "@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'} + "@esbuild/android-x64@0.19.12": + resolution: + { + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, + } + engines: { node: ">=12" } cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + "@esbuild/android-x64@0.21.5": + resolution: + { + integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, + } + engines: { node: ">=12" } cpu: [x64] os: [android] - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.28.1": + resolution: + { + integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==, + } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} + "@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'} + "@esbuild/darwin-arm64@0.19.12": + resolution: + { + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, + } + engines: { node: ">=12" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + "@esbuild/darwin-arm64@0.21.5": + resolution: + { + integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, + } + engines: { node: ">=12" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.28.1": + resolution: + { + integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==, + } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} + "@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'} + "@esbuild/darwin-x64@0.19.12": + resolution: + { + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, + } + engines: { node: ">=12" } cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + "@esbuild/darwin-x64@0.21.5": + resolution: + { + integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, + } + engines: { node: ">=12" } cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.28.1": + resolution: + { + integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} + "@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'} + "@esbuild/freebsd-arm64@0.19.12": + resolution: + { + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + "@esbuild/freebsd-arm64@0.21.5": + resolution: + { + integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, + } + engines: { node: ">=12" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.28.1": + resolution: + { + integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} + "@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'} + "@esbuild/freebsd-x64@0.19.12": + resolution: + { + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, + } + engines: { node: ">=12" } cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + "@esbuild/freebsd-x64@0.21.5": + resolution: + { + integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, + } + engines: { node: ">=12" } cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.28.1": + resolution: + { + integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-arm64@0.19.12": + resolution: + { + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + "@esbuild/linux-arm64@0.21.5": + resolution: + { + integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, + } + engines: { node: ">=12" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.28.1": + resolution: + { + integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==, + } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-arm@0.19.12": + resolution: + { + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, + } + engines: { node: ">=12" } cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + "@esbuild/linux-arm@0.21.5": + resolution: + { + integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, + } + engines: { node: ">=12" } cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.28.1": + resolution: + { + integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==, + } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-ia32@0.19.12": + resolution: + { + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, + } + engines: { node: ">=12" } cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + "@esbuild/linux-ia32@0.21.5": + resolution: + { + integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, + } + engines: { node: ">=12" } cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.28.1": + resolution: + { + integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==, + } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-loong64@0.19.12": + resolution: + { + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, + } + engines: { node: ">=12" } cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + "@esbuild/linux-loong64@0.21.5": + resolution: + { + integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, + } + engines: { node: ">=12" } cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.28.1": + resolution: + { + integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==, + } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-mips64el@0.19.12": + resolution: + { + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, + } + engines: { node: ">=12" } cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + "@esbuild/linux-mips64el@0.21.5": + resolution: + { + integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, + } + engines: { node: ">=12" } cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.28.1": + resolution: + { + integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==, + } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-ppc64@0.19.12": + resolution: + { + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + "@esbuild/linux-ppc64@0.21.5": + resolution: + { + integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.28.1": + resolution: + { + integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-riscv64@0.19.12": + resolution: + { + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, + } + engines: { node: ">=12" } cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + "@esbuild/linux-riscv64@0.21.5": + resolution: + { + integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, + } + engines: { node: ">=12" } cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.28.1": + resolution: + { + integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==, + } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-s390x@0.19.12": + resolution: + { + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, + } + engines: { node: ">=12" } cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + "@esbuild/linux-s390x@0.21.5": + resolution: + { + integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, + } + engines: { node: ">=12" } cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.28.1": + resolution: + { + integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==, + } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} + "@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'} + "@esbuild/linux-x64@0.19.12": + resolution: + { + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, + } + engines: { node: ">=12" } cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + "@esbuild/linux-x64@0.21.5": + resolution: + { + integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, + } + engines: { node: ">=12" } cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.28.1": + resolution: + { + integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==, + } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.28.1": + resolution: + { + integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} + "@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'} + "@esbuild/netbsd-x64@0.19.12": + resolution: + { + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, + } + engines: { node: ">=12" } cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + "@esbuild/netbsd-x64@0.21.5": + resolution: + { + integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, + } + engines: { node: ">=12" } cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.28.1": + resolution: + { + integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==, + } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.28.1": + resolution: + { + integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} + "@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'} + "@esbuild/openbsd-x64@0.19.12": + resolution: + { + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, + } + engines: { node: ">=12" } cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + "@esbuild/openbsd-x64@0.21.5": + resolution: + { + integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, + } + engines: { node: ">=12" } cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.28.1": + resolution: + { + integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==, + } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} - engines: {node: '>=18'} + "@esbuild/openharmony-arm64@0.28.1": + resolution: + { + integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} + "@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'} + "@esbuild/sunos-x64@0.19.12": + resolution: + { + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, + } + engines: { node: ">=12" } cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + "@esbuild/sunos-x64@0.21.5": + resolution: + { + integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, + } + engines: { node: ">=12" } cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.28.1": + resolution: + { + integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} + "@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'} + "@esbuild/win32-arm64@0.19.12": + resolution: + { + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, + } + engines: { node: ">=12" } cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + "@esbuild/win32-arm64@0.21.5": + resolution: + { + integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, + } + engines: { node: ">=12" } cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.28.1": + resolution: + { + integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==, + } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} + "@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'} + "@esbuild/win32-ia32@0.19.12": + resolution: + { + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, + } + engines: { node: ">=12" } cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + "@esbuild/win32-ia32@0.21.5": + resolution: + { + integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, + } + engines: { node: ">=12" } cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.28.1": + resolution: + { + integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==, + } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} + "@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'} + "@esbuild/win32-x64@0.19.12": + resolution: + { + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, + } + engines: { node: ">=12" } cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + "@esbuild/win32-x64@0.21.5": + resolution: + { + integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, + } + engines: { node: ">=12" } cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.28.1": + resolution: + { + integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==, + } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@eslint-community/eslint-utils@4.9.1": + resolution: + { + integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + "@eslint-community/regexpp@4.12.2": + resolution: + { + integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + "@eslint/config-array@0.23.5": + resolution: + { + integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + "@eslint/config-helpers@0.6.0": + resolution: + { + integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + "@eslint/core@1.2.1": + resolution: + { + integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - '@eslint/js@10.0.1': - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + "@eslint/js@10.0.1": + resolution: + { + integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } peerDependencies: eslint: ^10.0.0 peerDependenciesMeta: eslint: optional: true - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + "@eslint/object-schema@3.0.5": + resolution: + { + integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + "@eslint/plugin-kit@0.7.2": + resolution: + { + integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - '@formatjs/fast-memoize@3.1.6': - resolution: {integrity: sha512-H5aexk1Le7T9TPmscacZ+1pR6CTa2n1wq+HDVGXhH8TzUlQQpeXzZs91dRtmFHrbeNbjPFPfQujUqm7MHgVoXQ==} + "@formatjs/fast-memoize@3.1.6": + resolution: + { + integrity: sha512-H5aexk1Le7T9TPmscacZ+1pR6CTa2n1wq+HDVGXhH8TzUlQQpeXzZs91dRtmFHrbeNbjPFPfQujUqm7MHgVoXQ==, + } - '@formatjs/icu-messageformat-parser@3.5.12': - resolution: {integrity: sha512-YyzzxVgYJ8DELmmkhn0Yr0rUj0dTJFf9Jp628K3S0ysInBWxLVDOS8i3RP91cCp4DMK4WYb4cVMhWA9i4knSJg==} + "@formatjs/icu-messageformat-parser@3.5.12": + resolution: + { + integrity: sha512-YyzzxVgYJ8DELmmkhn0Yr0rUj0dTJFf9Jp628K3S0ysInBWxLVDOS8i3RP91cCp4DMK4WYb4cVMhWA9i4knSJg==, + } - '@formatjs/icu-skeleton-parser@2.1.10': - resolution: {integrity: sha512-XuSva+8ZGawk8VnD5VD6UeH8KarQ/Z022zgjHDoHmlNiAewstXuuzXc0Hk5pGFSdG+nNw5bfJKXqj1ZXHn9yUA==} + "@formatjs/icu-skeleton-parser@2.1.10": + resolution: + { + integrity: sha512-XuSva+8ZGawk8VnD5VD6UeH8KarQ/Z022zgjHDoHmlNiAewstXuuzXc0Hk5pGFSdG+nNw5bfJKXqj1ZXHn9yUA==, + } - '@formatjs/intl-localematcher@0.8.10': - resolution: {integrity: sha512-P/IC3qws3jH+1fEs+o0RIFgXKRaQlFehjS5W0FPAqdo6hgzawLl+eD0q0JjheQ3XtoOe5n8WSYfX06KQZI/QJA==} + "@formatjs/intl-localematcher@0.8.10": + resolution: + { + integrity: sha512-P/IC3qws3jH+1fEs+o0RIFgXKRaQlFehjS5W0FPAqdo6hgzawLl+eD0q0JjheQ3XtoOe5n8WSYfX06KQZI/QJA==, + } - '@hono/node-server@1.19.11': - resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} - engines: {node: '>=18.14.1'} + "@hono/node-server@1.19.14": + resolution: + { + integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==, + } + engines: { node: ">=18.14.1" } peerDependencies: hono: ^4 - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} + "@humanfs/core@0.19.2": + resolution: + { + integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==, + } + engines: { node: ">=18.18.0" } - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} + "@humanfs/node@0.16.8": + resolution: + { + integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==, + } + engines: { node: ">=18.18.0" } - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} + "@humanfs/types@0.15.0": + resolution: + { + integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==, + } + engines: { node: ">=18.18.0" } - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + "@humanwhocodes/module-importer@1.0.1": + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + "@humanwhocodes/retry@0.4.3": + resolution: + { + integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, + } + engines: { node: ">=18.18" } - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} - engines: {node: '>=18'} + "@img/colour@1.1.0": + resolution: + { + integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==, + } + engines: { node: ">=18" } - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-darwin-arm64@0.34.5": + resolution: + { + integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-darwin-x64@0.34.5": + resolution: + { + integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + "@img/sharp-libvips-darwin-arm64@1.2.4": + resolution: + { + integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==, + } cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + "@img/sharp-libvips-darwin-x64@1.2.4": + resolution: + { + integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==, + } cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + "@img/sharp-libvips-linux-arm64@1.2.4": + resolution: + { + integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==, + } cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + "@img/sharp-libvips-linux-arm@1.2.4": + resolution: + { + integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==, + } cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + "@img/sharp-libvips-linux-ppc64@1.2.4": + resolution: + { + integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==, + } cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + "@img/sharp-libvips-linux-riscv64@1.2.4": + resolution: + { + integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==, + } cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + "@img/sharp-libvips-linux-s390x@1.2.4": + resolution: + { + integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==, + } cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + "@img/sharp-libvips-linux-x64@1.2.4": + resolution: + { + integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==, + } cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": + resolution: + { + integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==, + } cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + "@img/sharp-libvips-linuxmusl-x64@1.2.4": + resolution: + { + integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==, + } cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-arm64@0.34.5": + resolution: + { + integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-arm@0.34.5": + resolution: + { + integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-ppc64@0.34.5": + resolution: + { + integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-riscv64@0.34.5": + resolution: + { + integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-s390x@0.34.5": + resolution: + { + integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-x64@0.34.5": + resolution: + { + integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linuxmusl-arm64@0.34.5": + resolution: + { + integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linuxmusl-x64@0.34.5": + resolution: + { + integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-wasm32@0.34.5": + resolution: + { + integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-arm64@0.34.5": + resolution: + { + integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-ia32@0.34.5": + resolution: + { + integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-x64@0.34.5": + resolution: + { + integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [win32] - '@ioredis/commands@1.10.0': - resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} + "@ioredis/commands@1.10.0": + resolution: + { + integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==, + } - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + "@jridgewell/gen-mapping@0.3.13": + resolution: + { + integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, + } - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + "@jridgewell/remapping@2.3.5": + resolution: + { + integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, + } - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + "@jridgewell/sourcemap-codec@1.5.5": + resolution: + { + integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, + } - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + "@jridgewell/trace-mapping@0.3.31": + resolution: + { + integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, + } - '@kurkle/color@0.3.4': - resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + "@kurkle/color@0.3.4": + resolution: + { + integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==, + } - '@next/env@16.2.10': - resolution: {integrity: sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==} + "@next/env@16.2.10": + resolution: + { + integrity: sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==, + } - '@next/eslint-plugin-next@16.2.10': - resolution: {integrity: sha512-Gs8D2m21VnJeFo9qvYIIqJH94frWerWYu41BprU1pLtRVF7PCQNLiFZZ3fG+iPuj3K83Cwv/rt+msLOy8Qgu3Q==} + "@next/eslint-plugin-next@16.2.10": + resolution: + { + integrity: sha512-Gs8D2m21VnJeFo9qvYIIqJH94frWerWYu41BprU1pLtRVF7PCQNLiFZZ3fG+iPuj3K83Cwv/rt+msLOy8Qgu3Q==, + } - '@next/swc-darwin-arm64@16.2.10': - resolution: {integrity: sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==} - engines: {node: '>= 10'} + "@next/swc-darwin-arm64@16.2.10": + resolution: + { + integrity: sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.2.10': - resolution: {integrity: sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==} - engines: {node: '>= 10'} + "@next/swc-darwin-x64@16.2.10": + resolution: + { + integrity: sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==, + } + engines: { node: ">= 10" } cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.2.10': - resolution: {integrity: sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg==} - engines: {node: '>= 10'} + "@next/swc-linux-arm64-gnu@16.2.10": + resolution: + { + integrity: sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.2.10': - resolution: {integrity: sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A==} - engines: {node: '>= 10'} + "@next/swc-linux-arm64-musl@16.2.10": + resolution: + { + integrity: sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.2.10': - resolution: {integrity: sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA==} - engines: {node: '>= 10'} + "@next/swc-linux-x64-gnu@16.2.10": + resolution: + { + integrity: sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.2.10': - resolution: {integrity: sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw==} - engines: {node: '>= 10'} + "@next/swc-linux-x64-musl@16.2.10": + resolution: + { + integrity: sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.2.10': - resolution: {integrity: sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA==} - engines: {node: '>= 10'} + "@next/swc-win32-arm64-msvc@16.2.10": + resolution: + { + integrity: sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.2.10': - resolution: {integrity: sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A==} - engines: {node: '>= 10'} + "@next/swc-win32-x64-msvc@16.2.10": + resolution: + { + integrity: sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A==, + } + engines: { node: ">= 10" } cpu: [x64] os: [win32] - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + "@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.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'} + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } - '@otplib/core@12.0.1': - resolution: {integrity: sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==} + "@otplib/core@12.0.1": + resolution: + { + integrity: sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==, + } - '@otplib/plugin-crypto@12.0.1': - resolution: {integrity: sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==} + "@otplib/plugin-crypto@12.0.1": + resolution: + { + integrity: sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==, + } deprecated: Please upgrade to v13 of otplib. Refer to otplib docs for migration paths - '@otplib/plugin-thirty-two@12.0.1': - resolution: {integrity: sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==} + "@otplib/plugin-thirty-two@12.0.1": + resolution: + { + integrity: sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==, + } deprecated: Please upgrade to v13 of otplib. Refer to otplib docs for migration paths - '@otplib/preset-default@12.0.1': - resolution: {integrity: sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==} + "@otplib/preset-default@12.0.1": + resolution: + { + integrity: sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==, + } deprecated: Please upgrade to v13 of otplib. Refer to otplib docs for migration paths - '@otplib/preset-v11@12.0.1': - resolution: {integrity: sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==} + "@otplib/preset-v11@12.0.1": + resolution: + { + integrity: sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==, + } - '@panva/hkdf@1.2.1': - resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + "@panva/hkdf@1.2.1": + resolution: + { + integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==, + } - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-android-arm64@2.5.6": + resolution: + { + integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-arm64@2.5.6": + resolution: + { + integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-x64@2.5.6": + resolution: + { + integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-freebsd-x64@2.5.6": + resolution: + { + integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.6': - resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm-glibc@2.5.6": + resolution: + { + integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==, + } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm-musl@2.5.6": + resolution: + { + integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==, + } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm64-glibc@2.5.6": + resolution: + { + integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm64-musl@2.5.6": + resolution: + { + integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-x64-glibc@2.5.6": + resolution: + { + integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-x64-musl@2.5.6": + resolution: + { + integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] libc: [musl] - '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-arm64@2.5.6": + resolution: + { + integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-ia32@2.5.6": + resolution: + { + integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==, + } + engines: { node: ">= 10.0.0" } cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-x64@2.5.6": + resolution: + { + integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [win32] - '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher@2.5.6": + resolution: + { + integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==, + } + engines: { node: ">= 10.0.0" } - '@petamoriken/float16@3.9.3': - resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} + "@petamoriken/float16@3.9.3": + resolution: + { + integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==, + } - '@prisma/adapter-mariadb@7.8.0': - resolution: {integrity: sha512-mWsgcfbUjxB3qSzRlLs8E03vsKrqXzYK2zpx3e8u6wIgeHJM/sE46cuOGcYvHiZGmeQLCd3xL6YSSGM9QOLI6w==} + "@prisma/adapter-mariadb@7.8.0": + resolution: + { + integrity: sha512-mWsgcfbUjxB3qSzRlLs8E03vsKrqXzYK2zpx3e8u6wIgeHJM/sE46cuOGcYvHiZGmeQLCd3xL6YSSGM9QOLI6w==, + } - '@prisma/client-runtime-utils@7.8.0': - resolution: {integrity: sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==} + "@prisma/client-runtime-utils@7.8.0": + resolution: + { + integrity: sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==, + } - '@prisma/client@7.8.0': - resolution: {integrity: sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw==} - engines: {node: ^20.19 || ^22.12 || >=24.0} + "@prisma/client@7.8.0": + resolution: + { + integrity: sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw==, + } + engines: { node: ^20.19 || ^22.12 || >=24.0 } peerDependencies: - prisma: '*' - typescript: '>=5.4.0' + prisma: "*" + typescript: ">=5.4.0" peerDependenciesMeta: prisma: optional: true typescript: optional: true - '@prisma/config@7.8.0': - resolution: {integrity: sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw==} + "@prisma/config@7.8.0": + resolution: + { + integrity: sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw==, + } - '@prisma/debug@7.2.0': - resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} + "@prisma/debug@7.2.0": + resolution: + { + integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==, + } - '@prisma/debug@7.8.0': - resolution: {integrity: sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==} + "@prisma/debug@7.8.0": + resolution: + { + integrity: sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==, + } - '@prisma/dev@0.24.3': - resolution: {integrity: sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==} + "@prisma/dev@0.24.3": + resolution: + { + integrity: sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==, + } - '@prisma/driver-adapter-utils@7.8.0': - resolution: {integrity: sha512-/Q13o0ZT0rjc1Xk0Q9KhZYwuq2EW/vSbWUBKfgEKkaCuB/Sg6bqnjmTZqC5cD4d6y1vfFAEwBRzfzoSMIVJ55A==} + "@prisma/driver-adapter-utils@7.8.0": + resolution: + { + integrity: sha512-/Q13o0ZT0rjc1Xk0Q9KhZYwuq2EW/vSbWUBKfgEKkaCuB/Sg6bqnjmTZqC5cD4d6y1vfFAEwBRzfzoSMIVJ55A==, + } - '@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a': - resolution: {integrity: sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA==} + "@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a": + resolution: + { + integrity: sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA==, + } - '@prisma/engines@7.8.0': - resolution: {integrity: sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw==} + "@prisma/engines@7.8.0": + resolution: + { + integrity: sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw==, + } - '@prisma/fetch-engine@7.8.0': - resolution: {integrity: sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ==} + "@prisma/fetch-engine@7.8.0": + resolution: + { + integrity: sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ==, + } - '@prisma/get-platform@7.2.0': - resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==} + "@prisma/get-platform@7.2.0": + resolution: + { + integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==, + } - '@prisma/get-platform@7.8.0': - resolution: {integrity: sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==} + "@prisma/get-platform@7.8.0": + resolution: + { + integrity: sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==, + } - '@prisma/query-plan-executor@7.2.0': - resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} + "@prisma/query-plan-executor@7.2.0": + resolution: + { + integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==, + } - '@prisma/streams-local@0.1.2': - resolution: {integrity: sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==} - engines: {bun: '>=1.3.6', node: '>=22.0.0'} + "@prisma/streams-local@0.1.2": + resolution: + { + integrity: sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==, + } + engines: { bun: ">=1.3.6", node: ">=22.0.0" } - '@prisma/studio-core@0.27.3': - resolution: {integrity: sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==} - engines: {node: ^20.19 || ^22.12 || >=24.0, pnpm: '8'} + "@prisma/studio-core@0.27.3": + resolution: + { + integrity: sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==, + } + engines: { node: ^20.19 || ^22.12 || >=24.0, pnpm: "8" } peerDependencies: - '@types/react': ^18.0.0 || ^19.0.0 + "@types/react": ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + "@radix-ui/primitive@1.1.3": + resolution: + { + integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==, + } - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + "@radix-ui/react-compose-refs@1.1.2": + resolution: + { + integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, + } peerDependencies: - '@types/react': '*' + "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + "@radix-ui/react-primitive@2.1.3": + resolution: + { + integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, + } peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + "@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': + "@types/react": optional: true - '@types/react-dom': + "@types/react-dom": optional: true - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + "@radix-ui/react-slot@1.2.3": + resolution: + { + integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, + } peerDependencies: - '@types/react': '*' + "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@radix-ui/react-toggle@1.1.10': - resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + "@radix-ui/react-toggle@1.1.10": + resolution: + { + integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==, + } peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + "@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': + "@types/react": optional: true - '@types/react-dom': + "@types/react-dom": optional: true - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + "@radix-ui/react-use-controllable-state@1.2.2": + resolution: + { + integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, + } peerDependencies: - '@types/react': '*' + "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + "@radix-ui/react-use-effect-event@0.0.2": + resolution: + { + integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, + } peerDependencies: - '@types/react': '*' + "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + "@radix-ui/react-use-layout-effect@1.1.1": + resolution: + { + integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, + } peerDependencies: - '@types/react': '*' + "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@rollup/rollup-android-arm-eabi@4.62.2': - resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + "@rollup/rollup-android-arm-eabi@4.62.2": + resolution: + { + integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==, + } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.62.2': - resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + "@rollup/rollup-android-arm64@4.62.2": + resolution: + { + integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==, + } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.62.2': - resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + "@rollup/rollup-darwin-arm64@4.62.2": + resolution: + { + integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==, + } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.62.2': - resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + "@rollup/rollup-darwin-x64@4.62.2": + resolution: + { + integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==, + } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.62.2': - resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + "@rollup/rollup-freebsd-arm64@4.62.2": + resolution: + { + integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==, + } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.62.2': - resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + "@rollup/rollup-freebsd-x64@4.62.2": + resolution: + { + integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==, + } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + "@rollup/rollup-linux-arm-gnueabihf@4.62.2": + resolution: + { + integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==, + } cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + "@rollup/rollup-linux-arm-musleabihf@4.62.2": + resolution: + { + integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==, + } cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.62.2': - resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + "@rollup/rollup-linux-arm64-gnu@4.62.2": + resolution: + { + integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==, + } cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.62.2': - resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + "@rollup/rollup-linux-arm64-musl@4.62.2": + resolution: + { + integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==, + } cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.62.2': - resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + "@rollup/rollup-linux-loong64-gnu@4.62.2": + resolution: + { + integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==, + } cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.62.2': - resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + "@rollup/rollup-linux-loong64-musl@4.62.2": + resolution: + { + integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==, + } cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + "@rollup/rollup-linux-ppc64-gnu@4.62.2": + resolution: + { + integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==, + } cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.62.2': - resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + "@rollup/rollup-linux-ppc64-musl@4.62.2": + resolution: + { + integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==, + } cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.62.2': - resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + "@rollup/rollup-linux-riscv64-gnu@4.62.2": + resolution: + { + integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==, + } cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.62.2': - resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + "@rollup/rollup-linux-riscv64-musl@4.62.2": + resolution: + { + integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==, + } cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.62.2': - resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + "@rollup/rollup-linux-s390x-gnu@4.62.2": + resolution: + { + integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==, + } cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.62.2': - resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + "@rollup/rollup-linux-x64-gnu@4.62.2": + resolution: + { + integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==, + } cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.62.2': - resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + "@rollup/rollup-linux-x64-musl@4.62.2": + resolution: + { + integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==, + } cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.62.2': - resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + "@rollup/rollup-openbsd-x64@4.62.2": + resolution: + { + integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==, + } cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.62.2': - resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + "@rollup/rollup-openharmony-arm64@4.62.2": + resolution: + { + integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==, + } cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.62.2': - resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + "@rollup/rollup-win32-arm64-msvc@4.62.2": + resolution: + { + integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==, + } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.62.2': - resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + "@rollup/rollup-win32-ia32-msvc@4.62.2": + resolution: + { + integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==, + } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.62.2': - resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + "@rollup/rollup-win32-x64-gnu@4.62.2": + resolution: + { + integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==, + } cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.62.2': - resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + "@rollup/rollup-win32-x64-msvc@4.62.2": + resolution: + { + integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==, + } cpu: [x64] os: [win32] - '@schummar/icu-type-parser@1.21.5': - resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==} + "@schummar/icu-type-parser@1.21.5": + resolution: + { + integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==, + } - '@stablelib/base64@1.0.1': - resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + "@stablelib/base64@1.0.1": + resolution: + { + integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==, + } - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + "@standard-schema/spec@1.1.0": + resolution: + { + integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, + } - '@swc/core-darwin-arm64@1.15.43': - resolution: {integrity: sha512-v1aVuvXdo/BHxJzco9V2xpHrvwWmhfS8t6gziY5wJxd+Z2h8AeJRnAwPD8itCDaGXVBwJ/CaKfxEzTkG0Va0OA==} - engines: {node: '>=10'} + "@swc/core-darwin-arm64@1.15.43": + resolution: + { + integrity: sha512-v1aVuvXdo/BHxJzco9V2xpHrvwWmhfS8t6gziY5wJxd+Z2h8AeJRnAwPD8itCDaGXVBwJ/CaKfxEzTkG0Va0OA==, + } + engines: { node: ">=10" } cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.43': - resolution: {integrity: sha512-lp3d4Lamc8dt5huYdGLSR+9hLxmfr1jb0l+4XXG2zPqZwYWRN9R0U2qYoTrggiU2RWW0oV9VbWM3kBnqIc2kdQ==} - engines: {node: '>=10'} + "@swc/core-darwin-x64@1.15.43": + resolution: + { + integrity: sha512-lp3d4Lamc8dt5huYdGLSR+9hLxmfr1jb0l+4XXG2zPqZwYWRN9R0U2qYoTrggiU2RWW0oV9VbWM3kBnqIc2kdQ==, + } + engines: { node: ">=10" } cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.43': - resolution: {integrity: sha512-JWTQQELtsG5GgphDrr/XqqmM2pDN3cZqbMS0Mrg+iTiXL3F74sn/S2IyYE/5u4h2KLkTf9qQ7dXyxsbx7YzkeA==} - engines: {node: '>=10'} + "@swc/core-linux-arm-gnueabihf@1.15.43": + resolution: + { + integrity: sha512-JWTQQELtsG5GgphDrr/XqqmM2pDN3cZqbMS0Mrg+iTiXL3F74sn/S2IyYE/5u4h2KLkTf9qQ7dXyxsbx7YzkeA==, + } + engines: { node: ">=10" } cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.43': - resolution: {integrity: sha512-B4otJRdPWIsmiSBf0uG7Z/+vMWmkufjz5MmYxubwKuZazDW14Zd3symga1N62QR4RT+kEFeHEgsXfZGyn/w0hw==} - engines: {node: '>=10'} + "@swc/core-linux-arm64-gnu@1.15.43": + resolution: + { + integrity: sha512-B4otJRdPWIsmiSBf0uG7Z/+vMWmkufjz5MmYxubwKuZazDW14Zd3symga1N62QR4RT+kEFeHEgsXfZGyn/w0hw==, + } + engines: { node: ">=10" } cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.43': - resolution: {integrity: sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ==} - engines: {node: '>=10'} + "@swc/core-linux-arm64-musl@1.15.43": + resolution: + { + integrity: sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ==, + } + engines: { node: ">=10" } cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-ppc64-gnu@1.15.43': - resolution: {integrity: sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg==} - engines: {node: '>=10'} + "@swc/core-linux-ppc64-gnu@1.15.43": + resolution: + { + integrity: sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg==, + } + engines: { node: ">=10" } cpu: [ppc64] os: [linux] libc: [glibc] - '@swc/core-linux-s390x-gnu@1.15.43': - resolution: {integrity: sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA==} - engines: {node: '>=10'} + "@swc/core-linux-s390x-gnu@1.15.43": + resolution: + { + integrity: sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA==, + } + engines: { node: ">=10" } cpu: [s390x] os: [linux] libc: [glibc] - '@swc/core-linux-x64-gnu@1.15.43': - resolution: {integrity: sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg==} - engines: {node: '>=10'} + "@swc/core-linux-x64-gnu@1.15.43": + resolution: + { + integrity: sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg==, + } + engines: { node: ">=10" } cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.43': - resolution: {integrity: sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ==} - engines: {node: '>=10'} + "@swc/core-linux-x64-musl@1.15.43": + resolution: + { + integrity: sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ==, + } + engines: { node: ">=10" } cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.43': - resolution: {integrity: sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw==} - engines: {node: '>=10'} + "@swc/core-win32-arm64-msvc@1.15.43": + resolution: + { + integrity: sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw==, + } + engines: { node: ">=10" } cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.43': - resolution: {integrity: sha512-rLAE8JvucqEW1ZGohxPQrQWPBQeJG4+ypKbWfdlU/qmKScvCkxf9/Jxnzki1dkUQCQ7P5Enp13RlvqOlvx/32g==} - engines: {node: '>=10'} + "@swc/core-win32-ia32-msvc@1.15.43": + resolution: + { + integrity: sha512-rLAE8JvucqEW1ZGohxPQrQWPBQeJG4+ypKbWfdlU/qmKScvCkxf9/Jxnzki1dkUQCQ7P5Enp13RlvqOlvx/32g==, + } + engines: { node: ">=10" } cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.43': - resolution: {integrity: sha512-h8MLDHZcfIukwQWj03rIJZx1I0E81AYj2X7J/nGErG4nz+QAv6G1Z+peotvinL3lqpbo32tLYSMFo32/ySzxKg==} - engines: {node: '>=10'} + "@swc/core-win32-x64-msvc@1.15.43": + resolution: + { + integrity: sha512-h8MLDHZcfIukwQWj03rIJZx1I0E81AYj2X7J/nGErG4nz+QAv6G1Z+peotvinL3lqpbo32tLYSMFo32/ySzxKg==, + } + engines: { node: ">=10" } cpu: [x64] os: [win32] - '@swc/core@1.15.43': - resolution: {integrity: sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw==} - engines: {node: '>=10'} + "@swc/core@1.15.43": + resolution: + { + integrity: sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw==, + } + engines: { node: ">=10" } peerDependencies: - '@swc/helpers': '>=0.5.17' + "@swc/helpers": ">=0.5.17" peerDependenciesMeta: - '@swc/helpers': + "@swc/helpers": optional: true - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + "@swc/counter@0.1.3": + resolution: + { + integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, + } - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + "@swc/helpers@0.5.15": + resolution: + { + integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, + } - '@swc/types@0.1.27': - resolution: {integrity: sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==} + "@swc/types@0.1.27": + resolution: + { + integrity: sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==, + } - '@tailwindcss/forms@0.5.11': - resolution: {integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==} + "@tailwindcss/forms@0.5.11": + resolution: + { + integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==, + } peerDependencies: - tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" - '@tailwindcss/node@4.3.2': - resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==} + "@tailwindcss/node@4.3.2": + resolution: + { + integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==, + } - '@tailwindcss/oxide-android-arm64@4.3.2': - resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-android-arm64@4.3.2": + resolution: + { + integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==, + } + engines: { node: ">= 20" } cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.3.2': - resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-darwin-arm64@4.3.2": + resolution: + { + integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==, + } + engines: { node: ">= 20" } cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.3.2': - resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-darwin-x64@4.3.2": + resolution: + { + integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==, + } + engines: { node: ">= 20" } cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.3.2': - resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-freebsd-x64@4.3.2": + resolution: + { + integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==, + } + engines: { node: ">= 20" } cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': - resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2": + resolution: + { + integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==, + } + engines: { node: ">= 20" } cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': - resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-linux-arm64-gnu@4.3.2": + resolution: + { + integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==, + } + engines: { node: ">= 20" } cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.3.2': - resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-linux-arm64-musl@4.3.2": + resolution: + { + integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==, + } + engines: { node: ">= 20" } cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.3.2': - resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-linux-x64-gnu@4.3.2": + resolution: + { + integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==, + } + engines: { node: ">= 20" } cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.3.2': - resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-linux-x64-musl@4.3.2": + resolution: + { + integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==, + } + engines: { node: ">= 20" } cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.3.2': - resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==} - engines: {node: '>=14.0.0'} + "@tailwindcss/oxide-wasm32-wasi@4.3.2": + resolution: + { + integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==, + } + engines: { node: ">=14.0.0" } cpu: [wasm32] bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' + - "@napi-rs/wasm-runtime" + - "@emnapi/core" + - "@emnapi/runtime" + - "@tybys/wasm-util" + - "@emnapi/wasi-threads" - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': - resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-win32-arm64-msvc@4.3.2": + resolution: + { + integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==, + } + engines: { node: ">= 20" } cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.3.2': - resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==} - engines: {node: '>= 20'} + "@tailwindcss/oxide-win32-x64-msvc@4.3.2": + resolution: + { + integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==, + } + engines: { node: ">= 20" } cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.3.2': - resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==} - engines: {node: '>= 20'} + "@tailwindcss/oxide@4.3.2": + resolution: + { + integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==, + } + engines: { node: ">= 20" } - '@tailwindcss/postcss@4.3.2': - resolution: {integrity: sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==} + "@tailwindcss/postcss@4.3.2": + resolution: + { + integrity: sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==, + } - '@tailwindcss/typography@0.5.20': - resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==} + "@tailwindcss/typography@0.5.20": + resolution: + { + integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==, + } peerDependencies: - tailwindcss: '>=3.0.0 || >=4.0.0 || insiders' + tailwindcss: ">=3.0.0 || >=4.0.0 || insiders" - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + "@types/esrecurse@4.3.1": + resolution: + { + integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==, + } - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + "@types/estree@1.0.9": + resolution: + { + integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==, + } - '@types/geojson@7946.0.16': - resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + "@types/geojson@7946.0.16": + resolution: + { + integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==, + } - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } - '@types/node@22.20.0': - resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} + "@types/node@22.20.0": + resolution: + { + integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==, + } - '@types/node@24.13.2': - resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} + "@types/node@24.13.2": + resolution: + { + integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==, + } - '@types/nodemailer@6.4.24': - resolution: {integrity: sha512-Ww4u0rT9wQNXh4JiQaIwx3QWdcOFXzOjQA2zc+jtFYNmQiT4mIUqcDin51bDFdkzKubFnQCZNK7FIHlPKQ/q9w==} + "@types/nodemailer@6.4.24": + resolution: + { + integrity: sha512-Ww4u0rT9wQNXh4JiQaIwx3QWdcOFXzOjQA2zc+jtFYNmQiT4mIUqcDin51bDFdkzKubFnQCZNK7FIHlPKQ/q9w==, + } - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + "@types/react-dom@19.2.3": + resolution: + { + integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==, + } peerDependencies: - '@types/react': ^19.2.0 + "@types/react": ^19.2.0 - '@types/react@19.2.17': - resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + "@types/react@19.2.17": + resolution: + { + integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==, + } - '@types/sanitize-html@2.16.1': - resolution: {integrity: sha512-n9wjs8bCOTyN/ynwD8s/nTcTreIHB1vf31vhLMGqUPNHaweKC4/fAl4Dj+hUlCTKYgm4P3k83fmiFfzkZ6sgMA==} + "@types/sanitize-html@2.16.1": + resolution: + { + integrity: sha512-n9wjs8bCOTyN/ynwD8s/nTcTreIHB1vf31vhLMGqUPNHaweKC4/fAl4Dj+hUlCTKYgm4P3k83fmiFfzkZ6sgMA==, + } - '@typescript-eslint/eslint-plugin@8.63.0': - resolution: {integrity: sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/eslint-plugin@8.63.0": + resolution: + { + integrity: sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - '@typescript-eslint/parser': ^8.63.0 + "@typescript-eslint/parser": ^8.63.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/parser@8.63.0': - resolution: {integrity: sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/parser@8.63.0": + resolution: + { + integrity: sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/project-service@8.63.0': - resolution: {integrity: sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/project-service@8.63.0": + resolution: + { + integrity: sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/scope-manager@8.63.0': - resolution: {integrity: sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/scope-manager@8.63.0": + resolution: + { + integrity: sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/tsconfig-utils@8.63.0': - resolution: {integrity: sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/tsconfig-utils@8.63.0": + resolution: + { + integrity: sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/type-utils@8.63.0': - resolution: {integrity: sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/type-utils@8.63.0": + resolution: + { + integrity: sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/types@8.63.0': - resolution: {integrity: sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/types@8.63.0": + resolution: + { + integrity: sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/typescript-estree@8.63.0': - resolution: {integrity: sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/typescript-estree@8.63.0": + resolution: + { + integrity: sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/utils@8.63.0': - resolution: {integrity: sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/utils@8.63.0": + resolution: + { + integrity: sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/visitor-keys@8.63.0': - resolution: {integrity: sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/visitor-keys@8.63.0": + resolution: + { + integrity: sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@vitest/expect@2.1.9': - resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + "@vitest/expect@2.1.9": + resolution: + { + integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==, + } - '@vitest/mocker@2.1.9': - resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + "@vitest/mocker@2.1.9": + resolution: + { + integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==, + } peerDependencies: msw: ^2.4.9 vite: ^5.0.0 @@ -1870,367 +2803,601 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + "@vitest/pretty-format@2.1.9": + resolution: + { + integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==, + } - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + "@vitest/runner@2.1.9": + resolution: + { + integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==, + } - '@vitest/snapshot@2.1.9': - resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + "@vitest/snapshot@2.1.9": + resolution: + { + integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==, + } - '@vitest/spy@2.1.9': - resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + "@vitest/spy@2.1.9": + resolution: + { + integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==, + } - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + "@vitest/utils@2.1.9": + resolution: + { + integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==, + } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==, + } + engines: { node: ">=0.4.0" } hasBin: true ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + resolution: + { + integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==, + } ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + resolution: + { + integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==, + } aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: ">= 0.4" } array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, + } + engines: { node: ">= 0.4" } array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==, + } + engines: { node: ">= 0.4" } array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, + } + engines: { node: ">= 0.4" } array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, + } + engines: { node: ">= 0.4" } arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, + } + engines: { node: ">= 0.4" } assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: ">=12" } ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + resolution: + { + integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, + } async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, + } + engines: { node: ">= 0.4" } available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: ">= 0.4" } aws-ssl-profiles@1.1.2: - resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} - engines: {node: '>= 6.0.0'} + resolution: + { + integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==, + } + engines: { node: ">= 6.0.0" } axe-core@4.12.1: - resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==, + } + engines: { node: ">=4" } axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, + } + engines: { node: ">= 0.4" } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} + resolution: + { + integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==, + } + engines: { node: 18 || 20 || >=22 } baseline-browser-mapping@2.10.40: - resolution: {integrity: sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==, + } + engines: { node: ">=6.0.0" } hasBin: true baseline-browser-mapping@2.10.42: - resolution: {integrity: sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==, + } + engines: { node: ">=6.0.0" } hasBin: true bcryptjs@3.0.3: - resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==} + resolution: + { + integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==, + } hasBin: true better-result@2.9.2: - resolution: {integrity: sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q==} + resolution: + { + integrity: sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q==, + } brace-expansion@1.1.16: - resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} + resolution: + { + integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==, + } brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} - engines: {node: 18 || 20 || >=22} + resolution: + { + integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==, + } + engines: { node: 18 || 20 || >=22 } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: ">=8" } browserslist@4.28.5: - resolution: {integrity: sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } c12@3.3.4: - resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + resolution: + { + integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==, + } peerDependencies: - magicast: '*' + magicast: "*" peerDependenciesMeta: magicast: optional: true cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: ">=8" } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: ">= 0.4" } call-bind@1.0.9: - resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==, + } + engines: { node: ">= 0.4" } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: ">= 0.4" } caniuse-lite@1.0.30001799: - resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + resolution: + { + integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==, + } caniuse-lite@1.0.30001803: - resolution: {integrity: sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==} + resolution: + { + integrity: sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==, + } chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==, + } + engines: { node: ">=18" } chart.js@4.5.1: - resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} - engines: {pnpm: '>=8'} + resolution: + { + integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==, + } + engines: { pnpm: ">=8" } check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==, + } + engines: { node: ">= 16" } chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} + resolution: + { + integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==, + } + engines: { node: ">= 20.19.0" } client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + resolution: + { + integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, + } cluster-key-slot@1.1.1: - resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==, + } + engines: { node: ">=0.10.0" } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } confbox@0.2.4: - resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + resolution: + { + integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==, + } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } croner@10.0.1: - resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} - engines: {node: '>=18.0'} + resolution: + { + integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==, + } + engines: { node: ">=18.0" } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: ">= 8" } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } hasBin: true csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + resolution: + { + integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, + } damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + resolution: + { + integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, + } data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, + } + engines: { node: ">= 0.4" } data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, + } + engines: { node: ">= 0.4" } data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, + } + engines: { node: ">= 0.4" } dayjs@1.11.21: - resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + resolution: + { + integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==, + } debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: ">=6" } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } deepmerge-ts@7.1.5: - resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==, + } + engines: { node: ">=16.0.0" } deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } defu@6.1.7: - resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + resolution: + { + integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==, + } denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, + } + engines: { node: ">=0.10" } destr@2.0.5: - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + resolution: + { + integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, + } detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, + } + engines: { node: ">=8" } dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + resolution: + { + integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, + } dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==, + } + engines: { node: ">=12" } dotenv@17.4.2: - resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==, + } + engines: { node: ">=12" } drizzle-kit@0.30.6: - resolution: {integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==} + resolution: + { + integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==, + } hasBin: true drizzle-orm@0.38.4: - resolution: {integrity: sha512-s7/5BpLKO+WJRHspvpqTydxFob8i1vo2rEx4pY6TGY7QSMuUfWUuzaY0DIpXCkgHOo37BaFC+SJQb99dDUXT3Q==} + resolution: + { + integrity: sha512-s7/5BpLKO+WJRHspvpqTydxFob8i1vo2rEx4pY6TGY7QSMuUfWUuzaY0DIpXCkgHOo37BaFC+SJQb99dDUXT3Q==, + } peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=4' - '@electric-sql/pglite': '>=0.2.0' - '@libsql/client': '>=0.10.0' - '@libsql/client-wasm': '>=0.10.0' - '@neondatabase/serverless': '>=0.10.0' - '@op-engineering/op-sqlite': '>=2' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1' - '@prisma/client': '*' - '@tidbcloud/serverless': '*' - '@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: '>=14.0.0' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - prisma: '*' - react: '>=18' - sql.js: '>=1' - sqlite3: '>=5' + "@aws-sdk/client-rds-data": ">=3" + "@cloudflare/workers-types": ">=4" + "@electric-sql/pglite": ">=0.2.0" + "@libsql/client": ">=0.10.0" + "@libsql/client-wasm": ">=0.10.0" + "@neondatabase/serverless": ">=0.10.0" + "@op-engineering/op-sqlite": ">=2" + "@opentelemetry/api": ^1.4.1 + "@planetscale/database": ">=1" + "@prisma/client": "*" + "@tidbcloud/serverless": "*" + "@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: ">=14.0.0" + knex: "*" + kysely: "*" + mysql2: ">=2" + pg: ">=8" + postgres: ">=3" + prisma: "*" + react: ">=18" + sql.js: ">=1" + sqlite3: ">=5" peerDependenciesMeta: - '@aws-sdk/client-rds-data': + "@aws-sdk/client-rds-data": optional: true - '@cloudflare/workers-types': + "@cloudflare/workers-types": optional: true - '@electric-sql/pglite': + "@electric-sql/pglite": optional: true - '@libsql/client': + "@libsql/client": optional: true - '@libsql/client-wasm': + "@libsql/client-wasm": optional: true - '@neondatabase/serverless': + "@neondatabase/serverless": optional: true - '@op-engineering/op-sqlite': + "@op-engineering/op-sqlite": optional: true - '@opentelemetry/api': + "@opentelemetry/api": optional: true - '@planetscale/database': + "@planetscale/database": optional: true - '@prisma/client': + "@prisma/client": optional: true - '@tidbcloud/serverless': + "@tidbcloud/serverless": optional: true - '@types/better-sqlite3': + "@types/better-sqlite3": optional: true - '@types/pg': + "@types/pg": optional: true - '@types/react': + "@types/react": optional: true - '@types/sql.js': + "@types/sql.js": optional: true - '@vercel/postgres': + "@vercel/postgres": optional: true - '@xata.io/client': + "@xata.io/client": optional: true better-sqlite3: optional: true @@ -2258,209 +3425,359 @@ packages: optional: true dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: ">= 0.4" } effect@3.20.0: - resolution: {integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==} + resolution: + { + integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==, + } electron-to-chromium@1.5.389: - resolution: {integrity: sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==} + resolution: + { + integrity: sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==, + } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==, + } + engines: { node: ">=14" } enhanced-resolve@5.21.6: - resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==, + } + engines: { node: ">=10.13.0" } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==, + } + engines: { node: ">=0.12" } env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } es-abstract-get@1.0.0: - resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==, + } + engines: { node: ">= 0.4" } es-abstract@1.24.2: - resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==, + } + engines: { node: ">= 0.4" } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + resolution: + { + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, + } es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==, + } + engines: { node: ">= 0.4" } es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: ">= 0.4" } es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, + } + engines: { node: ">= 0.4" } es-to-primitive@1.3.4: - resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==, + } + engines: { node: ">= 0.4" } esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + resolution: + { + integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==, + } peerDependencies: - esbuild: '>=0.12 <1' + esbuild: ">=0.12 <1" esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==, + } + engines: { node: ">=12" } hasBin: true esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, + } + engines: { node: ">=12" } hasBin: true esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, + } + engines: { node: ">=12" } hasBin: true esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==, + } + engines: { node: ">=18" } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: ">=6" } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + resolution: + { + integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==, + } hasBin: true peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, + } + engines: { node: ">=4.0" } peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 eslint-plugin-react-hooks@7.1.1: - resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==, + } + engines: { node: ">=18" } peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 eslint-plugin-security@4.0.1: - resolution: {integrity: sha512-/lZCkOxPOWaf1jXAqgICrS8St3BMBccIPvhOSUYuV6VCr1o5nFVG998FnTLt6w2Nxb8Uo0nM8fzmnhp+GY/aEg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-/lZCkOxPOWaf1jXAqgICrS8St3BMBccIPvhOSUYuV6VCr1o5nFVG998FnTLt6w2Nxb8Uo0nM8fzmnhp+GY/aEg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + resolution: + { + integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + resolution: + { + integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } eslint@10.6.0: - resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + resolution: + { + integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } hasBin: true peerDependencies: - jiti: '*' + jiti: "*" peerDependenciesMeta: jiti: optional: true espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + resolution: + { + integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==, + } + engines: { node: ">=0.10" } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==, + } + engines: { node: ">=12.0.0" } exsolve@1.1.0: - resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} + resolution: + { + integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==, + } fast-check@3.23.2: - resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==, + } + engines: { node: ">=8.0.0" } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, + } + engines: { node: ">=8.6.0" } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } fast-sha256@1.3.0: - resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + resolution: + { + integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==, + } - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-uri@3.1.3: + resolution: + { + integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==, + } fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + resolution: + { + integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==, + } fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, + } + engines: { node: ">=12.0.0" } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2468,579 +3785,993 @@ packages: optional: true file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: ">=16.0.0" } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: ">=8" } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: ">=16" } flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + resolution: + { + integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==, + } for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, + } + engines: { node: ">= 0.4" } foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, + } + engines: { node: ">=14" } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + 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==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } function.prototype.name@1.2.0: - resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==, + } + engines: { node: ">= 0.4" } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } gel@2.2.0: - resolution: {integrity: sha512-q0ma7z2swmoamHQusey8ayo8+ilVdzDt4WTxSPzq/yRqvucWRfymRVMvNgmSC0XK7eNjjEZEcplxpgaNojKdmQ==} - engines: {node: '>= 18.0.0'} + resolution: + { + integrity: sha512-q0ma7z2swmoamHQusey8ayo8+ilVdzDt4WTxSPzq/yRqvucWRfymRVMvNgmSC0XK7eNjjEZEcplxpgaNojKdmQ==, + } + engines: { node: ">= 18.0.0" } hasBin: true generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + resolution: + { + integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, + } generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==, + } + engines: { node: ">= 0.4" } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: ">= 0.4" } get-port-please@3.2.0: - resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + resolution: + { + integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==, + } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: ">= 0.4" } get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, + } + engines: { node: ">= 0.4" } get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + resolution: + { + integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==, + } giget@3.3.0: - resolution: {integrity: sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==} + resolution: + { + integrity: sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==, + } hasBin: true glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + 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'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: ">= 0.4" } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: ">= 0.4" } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } grammex@3.1.12: - resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==} + resolution: + { + integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==, + } graphmatch@1.1.1: - resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==} + resolution: + { + integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==, + } has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, + } + engines: { node: ">= 0.4" } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, + } + engines: { node: ">= 0.4" } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: ">= 0.4" } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: ">= 0.4" } hash-wasm@4.12.0: - resolution: {integrity: sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==} + resolution: + { + integrity: sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==, + } hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==, + } + engines: { node: ">= 0.4" } hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + resolution: + { + integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==, + } hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + resolution: + { + integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==, + } hono@4.12.27: - resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} - engines: {node: '>=16.9.0'} + resolution: + { + integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==, + } + engines: { node: ">=16.9.0" } htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + resolution: + { + integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==, + } http-status-codes@2.3.0: - resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + resolution: + { + integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==, + } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: ">=0.10.0" } iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==, + } + engines: { node: ">=0.10.0" } icu-minify@4.13.1: - resolution: {integrity: sha512-nFYW2im0WJ3RUVZwabd71J8QTZRtkK1xxZBY7klg7a6KS/os17LZSj9q1VhbRSnk3S8Mv2I7F1izr/aEJ6cUsw==} + resolution: + { + integrity: sha512-nFYW2im0WJ3RUVZwabd71J8QTZRtkK1xxZBY7klg7a6KS/os17LZSj9q1VhbRSnk3S8Mv2I7F1izr/aEJ6cUsw==, + } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: ">= 4" } ignore@7.0.6: - resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==, + } + engines: { node: ">= 4" } immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + resolution: + { + integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, + } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, + } + engines: { node: ">= 0.4" } intl-messageformat@11.2.9: - resolution: {integrity: sha512-cGzymZerpDhVXRKjKLgXKda9gI29TU2o88L7gwNMHp3WZVxA/0c5tX52udXbW9JklDApolvMXZG6Dhhdz5eirA==} + resolution: + { + integrity: sha512-cGzymZerpDhVXRKjKLgXKda9gI29TU2o88L7gwNMHp3WZVxA/0c5tX52udXbW9JklDApolvMXZG6Dhhdz5eirA==, + } ioredis@5.11.1: - resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==} - engines: {node: '>=12.22.0'} + resolution: + { + integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==, + } + engines: { node: ">=12.22.0" } is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, + } + engines: { node: ">= 0.4" } is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, + } + engines: { node: ">= 0.4" } is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, + } + engines: { node: ">= 0.4" } is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, + } + engines: { node: ">= 0.4" } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, + } + engines: { node: ">= 0.4" } is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, + } + engines: { node: ">= 0.4" } is-document.all@1.0.0: - resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==, + } + engines: { node: ">= 0.4" } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, + } + engines: { node: ">= 0.4" } is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==, + } + engines: { node: ">= 0.4" } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, + } + engines: { node: ">= 0.4" } is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: ">= 0.4" } is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, + } + engines: { node: ">= 0.4" } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, + } + engines: { node: ">=0.10.0" } is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + resolution: + { + integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, + } is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, + } + engines: { node: ">= 0.4" } is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, + } + engines: { node: ">= 0.4" } is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, + } + engines: { node: ">= 0.4" } is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, + } + engines: { node: ">= 0.4" } is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, + } + engines: { node: ">= 0.4" } is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, + } + engines: { node: ">= 0.4" } is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, + } + engines: { node: ">= 0.4" } is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, + } + engines: { node: ">= 0.4" } is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, + } + engines: { node: ">= 0.4" } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==, + } + engines: { node: ">=18" } jiti@2.7.0: - resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + resolution: + { + integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==, + } hasBin: true jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + resolution: + { + integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==, + } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: ">=6" } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } hasBin: true jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, + } + engines: { node: ">=4.0" } jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + resolution: + { + integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, + } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + resolution: + { + integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, + } language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, + } + engines: { node: ">=0.10" } launder@1.7.1: - resolution: {integrity: sha512-mU6WRz5EusL9ZZuiZ5SO4Y6C0P9PAUR9iwdb6bzj4KDihm28DiHFw+/yk9DBH4f+Pv1wuzQ4e2jV3oQ7mkIqvw==} + resolution: + { + integrity: sha512-mU6WRz5EusL9ZZuiZ5SO4Y6C0P9PAUR9iwdb6bzj4KDihm28DiHFw+/yk9DBH4f+Pv1wuzQ4e2jV3oQ7mkIqvw==, + } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + resolution: + { + integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, + } lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [android] lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==, + } + engines: { node: ">= 12.0.0" } cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] libc: [musl] lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] libc: [glibc] lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [win32] lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==, + } + engines: { node: ">= 12.0.0" } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + resolution: + { + integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==, + } loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + resolution: + { + integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==, + } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } lru.min@1.1.4: - resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} - engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + resolution: + { + integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==, + } + engines: { bun: ">=1.0.0", deno: ">=1.30.0", node: ">=8.0.0" } lucide-react@1.23.0: - resolution: {integrity: sha512-38BpJcD0JhFosxHApP/BYsBetLpQFRoTRzEzstM/XCc3jsAG7wqaY1lgVwxiUe3xqYE+lNxo2PkCmYwXWrwwIw==} + resolution: + { + integrity: sha512-38BpJcD0JhFosxHApP/BYsBetLpQFRoTRzEzstM/XCc3jsAG7wqaY1lgVwxiUe3xqYE+lNxo2PkCmYwXWrwwIw==, + } peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + resolution: + { + integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, + } mariadb@3.4.5: - resolution: {integrity: sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==, + } + engines: { node: ">= 14" } math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: ">= 0.4" } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: ">=8.6" } mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + resolution: + { + integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==, + } hasBin: true minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} + resolution: + { + integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==, + } + engines: { node: 18 || 20 || >=22 } minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + resolution: + { + integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } mysql2@3.15.3: - resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} - engines: {node: '>= 8.0'} + resolution: + { + integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==, + } + engines: { node: ">= 8.0" } mysql2@3.22.5: - resolution: {integrity: sha512-95uZ2TrPWAZdwpB3vvvDbmEMcNG8yIeNCyu6GUcr/QnWEE/wXm7+mhOCsdQfWQDTV7qYT/PDUZ4U4UPP4AsXqQ==} - engines: {node: '>= 8.0'} + resolution: + { + integrity: sha512-95uZ2TrPWAZdwpB3vvvDbmEMcNG8yIeNCyu6GUcr/QnWEE/wXm7+mhOCsdQfWQDTV7qYT/PDUZ4U4UPP4AsXqQ==, + } + engines: { node: ">= 8.0" } peerDependencies: - '@types/node': '>= 8' + "@types/node": ">= 8" mysql2@3.22.6: - resolution: {integrity: sha512-fPKmeDGUzvFP7bMD5SASlJ5zIgvCC4hbanTmhbUlEmhyrY1hR4Hi3xLOWgTd3luYjLVifx6uGvMNJ2m/LlqEpg==} - engines: {node: '>= 8.0'} + resolution: + { + integrity: sha512-fPKmeDGUzvFP7bMD5SASlJ5zIgvCC4hbanTmhbUlEmhyrY1hR4Hi3xLOWgTd3luYjLVifx6uGvMNJ2m/LlqEpg==, + } + engines: { node: ">= 8.0" } peerDependencies: - '@types/node': '>= 8' + "@types/node": ">= 8" named-placeholders@1.1.6: - resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==, + } + engines: { node: ">=8.0.0" } nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, + } + engines: { node: ">= 0.6" } next-auth@5.0.0-beta.31: - resolution: {integrity: sha512-1OBgCKPzo+S7UWWMp3xgvGvIJ0OpV7B3vR4ZDRqD9a4Ch+OT6dakLXG9ivhtmIWVa71nTSXattOHyCg8sNi8/Q==} + resolution: + { + integrity: sha512-1OBgCKPzo+S7UWWMp3xgvGvIJ0OpV7B3vR4ZDRqD9a4Ch+OT6dakLXG9ivhtmIWVa71nTSXattOHyCg8sNi8/Q==, + } peerDependencies: - '@simplewebauthn/browser': ^9.0.1 - '@simplewebauthn/server': ^9.0.2 + "@simplewebauthn/browser": ^9.0.1 + "@simplewebauthn/server": ^9.0.2 next: ^14.0.0-0 || ^15.0.0 || ^16.0.0 nodemailer: ^7.0.7 react: ^18.2.0 || ^19.0.0 peerDependenciesMeta: - '@simplewebauthn/browser': + "@simplewebauthn/browser": optional: true - '@simplewebauthn/server': + "@simplewebauthn/server": optional: true nodemailer: optional: true next-intl-swc-plugin-extractor@4.13.1: - resolution: {integrity: sha512-RhlH2DR1ViEXzcX7G3tDXAvzNrBL2Ph54Hq/q/9oP9eXQV/okh3UQpA/lx2k9U5Ck83CZOSgH0eFTNi5U+zyXw==} + resolution: + { + integrity: sha512-RhlH2DR1ViEXzcX7G3tDXAvzNrBL2Ph54Hq/q/9oP9eXQV/okh3UQpA/lx2k9U5Ck83CZOSgH0eFTNi5U+zyXw==, + } next-intl@4.13.1: - resolution: {integrity: sha512-aS8KTA+nNhSNJJBlIhxgvU135WzoObwzFwav4wTDti/Gmhxqe0fs/Q343igo8Z7HGqPB/xgmoagwySZAlHmIfA==} + resolution: + { + integrity: sha512-aS8KTA+nNhSNJJBlIhxgvU135WzoObwzFwav4wTDti/Gmhxqe0fs/Q343igo8Z7HGqPB/xgmoagwySZAlHmIfA==, + } peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true next@16.2.10: - resolution: {integrity: sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA==} - engines: {node: '>=20.9.0'} + resolution: + { + integrity: sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA==, + } + engines: { node: ">=20.9.0" } hasBin: true peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' + "@opentelemetry/api": ^1.1.0 + "@playwright/test": ^1.51.1 + babel-plugin-react-compiler: "*" react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: - '@opentelemetry/api': + "@opentelemetry/api": optional: true - '@playwright/test': + "@playwright/test": optional: true babel-plugin-react-compiler: optional: true @@ -3048,156 +4779,269 @@ packages: optional: true node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + resolution: + { + integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, + } node-releases@2.0.51: - resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==, + } + engines: { node: ">=18" } nodemailer@9.0.3: - resolution: {integrity: sha512-n+YP+NKwR5zRWa60k3GiQ6Q3B4KXCoAw40dAKeCtYn020iNN74aWK2liXIC3ZEATeGql7we3tE3t8QwhY0eskw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-n+YP+NKwR5zRWa60k3GiQ6Q3B4KXCoAw40dAKeCtYn020iNN74aWK2liXIC3ZEATeGql7we3tE3t8QwhY0eskw==, + } + engines: { node: ">=6.0.0" } oauth4webapi@3.8.6: - resolution: {integrity: sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ==} + resolution: + { + integrity: sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ==, + } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: ">= 0.4" } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, + } + engines: { node: ">= 0.4" } object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, + } + engines: { node: ">= 0.4" } object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, + } + engines: { node: ">= 0.4" } ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + resolution: + { + integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==, + } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: ">= 0.8.0" } otplib@12.0.1: - resolution: {integrity: sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==} + resolution: + { + integrity: sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==, + } own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, + } + engines: { node: ">= 0.4" } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + resolution: + { + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, + } parse-srcset@1.0.2: - resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + resolution: + { + integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==, + } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + resolution: + { + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, + } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + resolution: + { + integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==, + } + engines: { node: ">= 14.16" } perfect-debounce@2.1.0: - resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + resolution: + { + integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==, + } + engines: { node: ">=8.6" } picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==, + } + engines: { node: ">=12" } pkg-types@2.3.1: - resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + resolution: + { + integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==, + } po-parser@2.1.1: - resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==} + resolution: + { + integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==, + } possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, + } + engines: { node: ">= 0.4" } postal-mime@2.7.4: - resolution: {integrity: sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g==} + resolution: + { + integrity: sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g==, + } postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, + } + engines: { node: ">=4" } postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==, + } + engines: { node: ^10 || ^12 || >=14 } postcss@8.5.16: - resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==, + } + engines: { node: ^10 || ^12 || >=14 } postgres@3.4.7: - resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==, + } + engines: { node: ">=12" } preact-render-to-string@6.5.11: - resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==} + resolution: + { + integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==, + } peerDependencies: - preact: '>=10' + preact: ">=10" preact@10.24.3: - resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + resolution: + { + integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==, + } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } prettier@3.9.5: - resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==, + } + engines: { node: ">=14" } hasBin: true prisma@7.8.0: - resolution: {integrity: sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw==} - engines: {node: ^20.19 || ^22.12 || >=24.0} + resolution: + { + integrity: sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw==, + } + engines: { node: ^20.19 || ^22.12 || >=24.0 } hasBin: true peerDependencies: - better-sqlite3: '>=9.0.0' - typescript: '>=5.4.0' + better-sqlite3: ">=9.0.0" + typescript: ">=5.4.0" peerDependenciesMeta: better-sqlite3: optional: true @@ -3205,400 +5049,688 @@ packages: optional: true process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + resolution: + { + integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==, + } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + resolution: + { + integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==, + } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } rc9@3.0.1: - resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + resolution: + { + integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==, + } react-dom@19.2.7: - resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + resolution: + { + integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==, + } peerDependencies: react: ^19.2.7 react@19.2.7: - resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==, + } + engines: { node: ">=0.10.0" } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} - engines: {node: '>= 20.19.0'} + resolution: + { + integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==, + } + engines: { node: ">= 20.19.0" } redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, + } + engines: { node: ">=4" } redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, + } + engines: { node: ">=4" } reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, + } + engines: { node: ">= 0.4" } regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + resolution: + { + integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==, + } hasBin: true regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, + } + engines: { node: ">= 0.4" } remeda@2.33.4: - resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==} + resolution: + { + integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==, + } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } resend@6.17.1: - resolution: {integrity: sha512-QhHHIRPPM9Tq2uilWmNF8C8kd6nLkUmiFgDQCt1v4eR4o+6p86qrK+Vn12jnAs0jR8Gf6ABdxI18/90LGQ7GVA==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-QhHHIRPPM9Tq2uilWmNF8C8kd6nLkUmiFgDQCt1v4eR4o+6p86qrK+Vn12jnAs0jR8Gf6ABdxI18/90LGQ7GVA==, + } + engines: { node: ">=20" } peerDependencies: - '@react-email/render': '*' + "@react-email/render": "*" peerDependenciesMeta: - '@react-email/render': + "@react-email/render": optional: true resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, + } + engines: { node: ">= 4" } reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } rollup@4.62.2: - resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } safe-array-concat@1.1.4: - resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==, + } + engines: { node: ">=0.4" } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, + } + engines: { node: ">= 0.4" } safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, + } + engines: { node: ">= 0.4" } safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + resolution: + { + integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==, + } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } sanitize-html@2.17.5: - resolution: {integrity: sha512-ZmU1joGRrvoyctKIiuwUxqR6moLoU2Wk+2bMccN6f7UwhAmwYDvWziqPxRDDN2Qip62NqnIrVrT9akbL6Wretg==} + resolution: + { + integrity: sha512-ZmU1joGRrvoyctKIiuwUxqR6moLoU2Wk+2bMccN6f7UwhAmwYDvWziqPxRDDN2Qip62NqnIrVrT9akbL6Wretg==, + } scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + resolution: + { + integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==, + } semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, + } + engines: { node: ">=10" } hasBin: true seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + resolution: + { + integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, + } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: ">= 0.4" } set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, + } + engines: { node: ">= 0.4" } setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + resolution: + { + integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } shell-quote@1.9.0: - resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==, + } + engines: { node: ">= 0.4" } side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==, + } + engines: { node: ">= 0.4" } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: ">= 0.4" } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: ">= 0.4" } side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==, + } + engines: { node: ">= 0.4" } siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + 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==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } sql-escaper@1.3.3: - resolution: {integrity: sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==} - engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} + resolution: + { + integrity: sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==, + } + engines: { bun: ">=1.0.0", deno: ">=2.0.0", node: ">=12.0.0" } sql-escaper@1.4.0: - resolution: {integrity: sha512-Ti/Zx9J3aITMYUMFhCKbkplQjyi7Kk2SyYXp+rzrkyKZetIy19XbQtVZ+0ZR5aVm/178tIJ6+aVvBqXkH+Xs7w==} - engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} + resolution: + { + integrity: sha512-Ti/Zx9J3aITMYUMFhCKbkplQjyi7Kk2SyYXp+rzrkyKZetIy19XbQtVZ+0ZR5aVm/178tIJ6+aVvBqXkH+Xs7w==, + } + engines: { bun: ">=1.0.0", deno: ">=2.0.0", node: ">=12.0.0" } sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, + } + engines: { node: ">= 0.6" } stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + resolution: + { + integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, + } standardwebhooks@1.0.0: - resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + resolution: + { + integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==, + } std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + resolution: + { + integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==, + } stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==, + } + engines: { node: ">= 0.4" } string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, + } + engines: { node: ">= 0.4" } string.prototype.trim@1.2.11: - resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==, + } + engines: { node: ">= 0.4" } string.prototype.trimend@1.0.10: - resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==, + } + engines: { node: ">= 0.4" } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: ">= 0.4" } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==, + } + engines: { node: ">= 12.0.0" } peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + "@babel/core": "*" + babel-plugin-macros: "*" + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" peerDependenciesMeta: - '@babel/core': + "@babel/core": optional: true babel-plugin-macros: optional: true tailwindcss@4.3.2: - resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} + resolution: + { + integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==, + } tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==, + } + engines: { node: ">=6" } thirty-two@1.0.2: - resolution: {integrity: sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==} - engines: {node: '>=0.2.6'} + resolution: + { + integrity: sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==, + } + engines: { node: ">=0.2.6" } tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, + } + engines: { node: ">=12.0.0" } tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==, + } + engines: { node: ">=14.0.0" } tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==, + } + engines: { node: ">=14.0.0" } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} + resolution: + { + integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==, + } + engines: { node: ">=18.12" } peerDependencies: - typescript: '>=4.8.4' + typescript: ">=4.8.4" tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } tsx@4.22.5: - resolution: {integrity: sha512-F7JnSfPl5ASt6LqwWyUQ3T8BwN3q0eQEbFMYa2iRWaVQmmudo0d7fRmwM4O002gsvW1bs0yBYioutsAjqLJMvQ==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-F7JnSfPl5ASt6LqwWyUQ3T8BwN3q0eQEbFMYa2iRWaVQmmudo0d7fRmwM4O002gsvW1bs0yBYioutsAjqLJMvQ==, + } + engines: { node: ">=18.0.0" } hasBin: true type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, + } + engines: { node: ">= 0.4" } typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, + } + engines: { node: ">= 0.4" } typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, + } + engines: { node: ">= 0.4" } typed-array-length@1.0.8: - resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==, + } + engines: { node: ">= 0.4" } typescript-eslint@8.63.0: - resolution: {integrity: sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, + } + engines: { node: ">=14.17" } hasBin: true unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, + } + engines: { node: ">= 0.4" } undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + resolution: + { + integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, + } undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + resolution: + { + integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==, + } update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + resolution: + { + integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, + } hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } use-intl@4.13.1: - resolution: {integrity: sha512-UU5C3zAC7yVg3m7rq5C8VF5J5jhAfvS19Wi9bPNCB9xB7jQYBsUcrqfdxs4Mxl9XR3x6BDB5K++iAw7/rcm3gg==} + resolution: + { + integrity: sha512-UU5C3zAC7yVg3m7rq5C8VF5J5jhAfvS19Wi9bPNCB9xB7jQYBsUcrqfdxs4Mxl9XR3x6BDB5K++iAw7/rcm3gg==, + } peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + resolution: + { + integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==, + } peerDependencies: - typescript: '>=5' + typescript: ">=5" peerDependenciesMeta: typescript: optional: true vite-node@2.1.9: - resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==, + } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==, + } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" terser: ^5.4.0 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true less: optional: true @@ -3616,24 +5748,27 @@ packages: optional: true vitest@2.1.9: - resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==, + } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.9 - '@vitest/ui': 2.1.9 - happy-dom: '*' - jsdom: '*' + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 2.1.9 + "@vitest/ui": 2.1.9 + happy-dom: "*" + jsdom: "*" peerDependenciesMeta: - '@edge-runtime/vm': + "@edge-runtime/vm": optional: true - '@types/node': + "@types/node": optional: true - '@vitest/browser': + "@vitest/browser": optional: true - '@vitest/ui': + "@vitest/ui": optional: true happy-dom: optional: true @@ -3641,66 +5776,104 @@ packages: optional: true which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, + } + engines: { node: ">= 0.4" } which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, + } + engines: { node: ">= 0.4" } which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, + } + engines: { node: ">= 0.4" } which-typed-array@1.1.22: - resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==, + } + engines: { node: ">= 0.4" } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } hasBin: true which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, + } + engines: { node: ^16.13.0 || >=18.0.0 } hasBin: true why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: ">=8" } hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: ">=0.10.0" } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } zeptomatch@2.1.0: - resolution: {integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==} + resolution: + { + integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==, + } zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==, + } + engines: { node: ">=18.0.0" } peerDependencies: zod: ^3.25.0 || ^4.0.0 zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + resolution: + { + integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, + } snapshots: + "@alloc/quick-lru@5.2.0": {} - '@alloc/quick-lru@5.2.0': {} - - '@auth/core@0.41.2(nodemailer@9.0.3)': + "@auth/core@0.41.2(nodemailer@9.0.3)": dependencies: - '@panva/hkdf': 1.2.1 + "@panva/hkdf": 1.2.1 jose: 6.2.3 oauth4webapi: 3.8.6 preact: 10.24.3 @@ -3708,26 +5881,26 @@ snapshots: optionalDependencies: nodemailer: 9.0.3 - '@babel/code-frame@7.29.7': + "@babel/code-frame@7.29.7": dependencies: - '@babel/helper-validator-identifier': 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.7': {} + "@babel/compat-data@7.29.7": {} - '@babel/core@7.29.7': + "@babel/core@7.29.7": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/remapping': 2.3.5 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.29.7) + "@babel/helpers": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 + "@jridgewell/remapping": 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -3736,717 +5909,717 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.7': + "@babel/generator@7.29.7": dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.29.7': + "@babel/helper-compilation-targets@7.29.7": dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 + "@babel/compat-data": 7.29.7 + "@babel/helper-validator-option": 7.29.7 browserslist: 4.28.5 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.29.7': {} + "@babel/helper-globals@7.29.7": {} - '@babel/helper-module-imports@7.29.7': + "@babel/helper-module-imports@7.29.7": dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + "@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.29.7': {} + "@babel/helper-string-parser@7.29.7": {} - '@babel/helper-validator-identifier@7.29.7': {} + "@babel/helper-validator-identifier@7.29.7": {} - '@babel/helper-validator-option@7.29.7': {} + "@babel/helper-validator-option@7.29.7": {} - '@babel/helpers@7.29.7': + "@babel/helpers@7.29.7": dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + "@babel/template": 7.29.7 + "@babel/types": 7.29.7 - '@babel/parser@7.29.7': + "@babel/parser@7.29.7": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@babel/template@7.29.7': + "@babel/template@7.29.7": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + "@babel/code-frame": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 - '@babel/traverse@7.29.7': + "@babel/traverse@7.29.7": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-globals": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/types": 7.29.7 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.7': + "@babel/types@7.29.7": dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 + "@babel/helper-string-parser": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 - '@drizzle-team/brocli@0.10.2': {} + "@drizzle-team/brocli@0.10.2": {} - '@electric-sql/pglite-socket@0.1.1(@electric-sql/pglite@0.4.1)': + "@electric-sql/pglite-socket@0.1.1(@electric-sql/pglite@0.4.1)": dependencies: - '@electric-sql/pglite': 0.4.1 + "@electric-sql/pglite": 0.4.1 - '@electric-sql/pglite-tools@0.3.1(@electric-sql/pglite@0.4.1)': + "@electric-sql/pglite-tools@0.3.1(@electric-sql/pglite@0.4.1)": dependencies: - '@electric-sql/pglite': 0.4.1 + "@electric-sql/pglite": 0.4.1 - '@electric-sql/pglite@0.4.1': {} + "@electric-sql/pglite@0.4.1": {} - '@emnapi/runtime@1.11.1': + "@emnapi/runtime@1.11.1": dependencies: tslib: 2.8.1 optional: true - '@esbuild-kit/core-utils@3.3.2': + "@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': + "@esbuild-kit/esm-loader@2.6.5": dependencies: - '@esbuild-kit/core-utils': 3.3.2 + "@esbuild-kit/core-utils": 3.3.2 get-tsconfig: 4.14.0 - '@esbuild/aix-ppc64@0.19.12': + "@esbuild/aix-ppc64@0.19.12": optional: true - '@esbuild/aix-ppc64@0.21.5': + "@esbuild/aix-ppc64@0.21.5": optional: true - '@esbuild/aix-ppc64@0.28.1': + "@esbuild/aix-ppc64@0.28.1": optional: true - '@esbuild/android-arm64@0.18.20': + "@esbuild/android-arm64@0.18.20": optional: true - '@esbuild/android-arm64@0.19.12': + "@esbuild/android-arm64@0.19.12": optional: true - '@esbuild/android-arm64@0.21.5': + "@esbuild/android-arm64@0.21.5": optional: true - '@esbuild/android-arm64@0.28.1': + "@esbuild/android-arm64@0.28.1": optional: true - '@esbuild/android-arm@0.18.20': + "@esbuild/android-arm@0.18.20": optional: true - '@esbuild/android-arm@0.19.12': + "@esbuild/android-arm@0.19.12": optional: true - '@esbuild/android-arm@0.21.5': + "@esbuild/android-arm@0.21.5": optional: true - '@esbuild/android-arm@0.28.1': + "@esbuild/android-arm@0.28.1": optional: true - '@esbuild/android-x64@0.18.20': + "@esbuild/android-x64@0.18.20": optional: true - '@esbuild/android-x64@0.19.12': + "@esbuild/android-x64@0.19.12": optional: true - '@esbuild/android-x64@0.21.5': + "@esbuild/android-x64@0.21.5": optional: true - '@esbuild/android-x64@0.28.1': + "@esbuild/android-x64@0.28.1": optional: true - '@esbuild/darwin-arm64@0.18.20': + "@esbuild/darwin-arm64@0.18.20": optional: true - '@esbuild/darwin-arm64@0.19.12': + "@esbuild/darwin-arm64@0.19.12": optional: true - '@esbuild/darwin-arm64@0.21.5': + "@esbuild/darwin-arm64@0.21.5": optional: true - '@esbuild/darwin-arm64@0.28.1': + "@esbuild/darwin-arm64@0.28.1": optional: true - '@esbuild/darwin-x64@0.18.20': + "@esbuild/darwin-x64@0.18.20": optional: true - '@esbuild/darwin-x64@0.19.12': + "@esbuild/darwin-x64@0.19.12": optional: true - '@esbuild/darwin-x64@0.21.5': + "@esbuild/darwin-x64@0.21.5": optional: true - '@esbuild/darwin-x64@0.28.1': + "@esbuild/darwin-x64@0.28.1": optional: true - '@esbuild/freebsd-arm64@0.18.20': + "@esbuild/freebsd-arm64@0.18.20": optional: true - '@esbuild/freebsd-arm64@0.19.12': + "@esbuild/freebsd-arm64@0.19.12": optional: true - '@esbuild/freebsd-arm64@0.21.5': + "@esbuild/freebsd-arm64@0.21.5": optional: true - '@esbuild/freebsd-arm64@0.28.1': + "@esbuild/freebsd-arm64@0.28.1": optional: true - '@esbuild/freebsd-x64@0.18.20': + "@esbuild/freebsd-x64@0.18.20": optional: true - '@esbuild/freebsd-x64@0.19.12': + "@esbuild/freebsd-x64@0.19.12": optional: true - '@esbuild/freebsd-x64@0.21.5': + "@esbuild/freebsd-x64@0.21.5": optional: true - '@esbuild/freebsd-x64@0.28.1': + "@esbuild/freebsd-x64@0.28.1": optional: true - '@esbuild/linux-arm64@0.18.20': + "@esbuild/linux-arm64@0.18.20": optional: true - '@esbuild/linux-arm64@0.19.12': + "@esbuild/linux-arm64@0.19.12": optional: true - '@esbuild/linux-arm64@0.21.5': + "@esbuild/linux-arm64@0.21.5": optional: true - '@esbuild/linux-arm64@0.28.1': + "@esbuild/linux-arm64@0.28.1": optional: true - '@esbuild/linux-arm@0.18.20': + "@esbuild/linux-arm@0.18.20": optional: true - '@esbuild/linux-arm@0.19.12': + "@esbuild/linux-arm@0.19.12": optional: true - '@esbuild/linux-arm@0.21.5': + "@esbuild/linux-arm@0.21.5": optional: true - '@esbuild/linux-arm@0.28.1': + "@esbuild/linux-arm@0.28.1": optional: true - '@esbuild/linux-ia32@0.18.20': + "@esbuild/linux-ia32@0.18.20": optional: true - '@esbuild/linux-ia32@0.19.12': + "@esbuild/linux-ia32@0.19.12": optional: true - '@esbuild/linux-ia32@0.21.5': + "@esbuild/linux-ia32@0.21.5": optional: true - '@esbuild/linux-ia32@0.28.1': + "@esbuild/linux-ia32@0.28.1": optional: true - '@esbuild/linux-loong64@0.18.20': + "@esbuild/linux-loong64@0.18.20": optional: true - '@esbuild/linux-loong64@0.19.12': + "@esbuild/linux-loong64@0.19.12": optional: true - '@esbuild/linux-loong64@0.21.5': + "@esbuild/linux-loong64@0.21.5": optional: true - '@esbuild/linux-loong64@0.28.1': + "@esbuild/linux-loong64@0.28.1": optional: true - '@esbuild/linux-mips64el@0.18.20': + "@esbuild/linux-mips64el@0.18.20": optional: true - '@esbuild/linux-mips64el@0.19.12': + "@esbuild/linux-mips64el@0.19.12": optional: true - '@esbuild/linux-mips64el@0.21.5': + "@esbuild/linux-mips64el@0.21.5": optional: true - '@esbuild/linux-mips64el@0.28.1': + "@esbuild/linux-mips64el@0.28.1": optional: true - '@esbuild/linux-ppc64@0.18.20': + "@esbuild/linux-ppc64@0.18.20": optional: true - '@esbuild/linux-ppc64@0.19.12': + "@esbuild/linux-ppc64@0.19.12": optional: true - '@esbuild/linux-ppc64@0.21.5': + "@esbuild/linux-ppc64@0.21.5": optional: true - '@esbuild/linux-ppc64@0.28.1': + "@esbuild/linux-ppc64@0.28.1": optional: true - '@esbuild/linux-riscv64@0.18.20': + "@esbuild/linux-riscv64@0.18.20": optional: true - '@esbuild/linux-riscv64@0.19.12': + "@esbuild/linux-riscv64@0.19.12": optional: true - '@esbuild/linux-riscv64@0.21.5': + "@esbuild/linux-riscv64@0.21.5": optional: true - '@esbuild/linux-riscv64@0.28.1': + "@esbuild/linux-riscv64@0.28.1": optional: true - '@esbuild/linux-s390x@0.18.20': + "@esbuild/linux-s390x@0.18.20": optional: true - '@esbuild/linux-s390x@0.19.12': + "@esbuild/linux-s390x@0.19.12": optional: true - '@esbuild/linux-s390x@0.21.5': + "@esbuild/linux-s390x@0.21.5": optional: true - '@esbuild/linux-s390x@0.28.1': + "@esbuild/linux-s390x@0.28.1": optional: true - '@esbuild/linux-x64@0.18.20': + "@esbuild/linux-x64@0.18.20": optional: true - '@esbuild/linux-x64@0.19.12': + "@esbuild/linux-x64@0.19.12": optional: true - '@esbuild/linux-x64@0.21.5': + "@esbuild/linux-x64@0.21.5": optional: true - '@esbuild/linux-x64@0.28.1': + "@esbuild/linux-x64@0.28.1": optional: true - '@esbuild/netbsd-arm64@0.28.1': + "@esbuild/netbsd-arm64@0.28.1": optional: true - '@esbuild/netbsd-x64@0.18.20': + "@esbuild/netbsd-x64@0.18.20": optional: true - '@esbuild/netbsd-x64@0.19.12': + "@esbuild/netbsd-x64@0.19.12": optional: true - '@esbuild/netbsd-x64@0.21.5': + "@esbuild/netbsd-x64@0.21.5": optional: true - '@esbuild/netbsd-x64@0.28.1': + "@esbuild/netbsd-x64@0.28.1": optional: true - '@esbuild/openbsd-arm64@0.28.1': + "@esbuild/openbsd-arm64@0.28.1": optional: true - '@esbuild/openbsd-x64@0.18.20': + "@esbuild/openbsd-x64@0.18.20": optional: true - '@esbuild/openbsd-x64@0.19.12': + "@esbuild/openbsd-x64@0.19.12": optional: true - '@esbuild/openbsd-x64@0.21.5': + "@esbuild/openbsd-x64@0.21.5": optional: true - '@esbuild/openbsd-x64@0.28.1': + "@esbuild/openbsd-x64@0.28.1": optional: true - '@esbuild/openharmony-arm64@0.28.1': + "@esbuild/openharmony-arm64@0.28.1": optional: true - '@esbuild/sunos-x64@0.18.20': + "@esbuild/sunos-x64@0.18.20": optional: true - '@esbuild/sunos-x64@0.19.12': + "@esbuild/sunos-x64@0.19.12": optional: true - '@esbuild/sunos-x64@0.21.5': + "@esbuild/sunos-x64@0.21.5": optional: true - '@esbuild/sunos-x64@0.28.1': + "@esbuild/sunos-x64@0.28.1": optional: true - '@esbuild/win32-arm64@0.18.20': + "@esbuild/win32-arm64@0.18.20": optional: true - '@esbuild/win32-arm64@0.19.12': + "@esbuild/win32-arm64@0.19.12": optional: true - '@esbuild/win32-arm64@0.21.5': + "@esbuild/win32-arm64@0.21.5": optional: true - '@esbuild/win32-arm64@0.28.1': + "@esbuild/win32-arm64@0.28.1": optional: true - '@esbuild/win32-ia32@0.18.20': + "@esbuild/win32-ia32@0.18.20": optional: true - '@esbuild/win32-ia32@0.19.12': + "@esbuild/win32-ia32@0.19.12": optional: true - '@esbuild/win32-ia32@0.21.5': + "@esbuild/win32-ia32@0.21.5": optional: true - '@esbuild/win32-ia32@0.28.1': + "@esbuild/win32-ia32@0.28.1": optional: true - '@esbuild/win32-x64@0.18.20': + "@esbuild/win32-x64@0.18.20": optional: true - '@esbuild/win32-x64@0.19.12': + "@esbuild/win32-x64@0.19.12": optional: true - '@esbuild/win32-x64@0.21.5': + "@esbuild/win32-x64@0.21.5": optional: true - '@esbuild/win32-x64@0.28.1': + "@esbuild/win32-x64@0.28.1": optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.7.0))': + "@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.7.0))": dependencies: eslint: 10.6.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} + "@eslint-community/regexpp@4.12.2": {} - '@eslint/config-array@0.23.5': + "@eslint/config-array@0.23.5": dependencies: - '@eslint/object-schema': 3.0.5 + "@eslint/object-schema": 3.0.5 debug: 4.4.3 minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + "@eslint/config-helpers@0.6.0": dependencies: - '@eslint/core': 1.2.1 + "@eslint/core": 1.2.1 - '@eslint/core@1.2.1': + "@eslint/core@1.2.1": dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 - '@eslint/js@10.0.1(eslint@10.6.0(jiti@2.7.0))': + "@eslint/js@10.0.1(eslint@10.6.0(jiti@2.7.0))": optionalDependencies: eslint: 10.6.0(jiti@2.7.0) - '@eslint/object-schema@3.0.5': {} + "@eslint/object-schema@3.0.5": {} - '@eslint/plugin-kit@0.7.2': + "@eslint/plugin-kit@0.7.2": dependencies: - '@eslint/core': 1.2.1 + "@eslint/core": 1.2.1 levn: 0.4.1 - '@formatjs/fast-memoize@3.1.6': {} + "@formatjs/fast-memoize@3.1.6": {} - '@formatjs/icu-messageformat-parser@3.5.12': + "@formatjs/icu-messageformat-parser@3.5.12": dependencies: - '@formatjs/icu-skeleton-parser': 2.1.10 + "@formatjs/icu-skeleton-parser": 2.1.10 - '@formatjs/icu-skeleton-parser@2.1.10': {} + "@formatjs/icu-skeleton-parser@2.1.10": {} - '@formatjs/intl-localematcher@0.8.10': + "@formatjs/intl-localematcher@0.8.10": dependencies: - '@formatjs/fast-memoize': 3.1.6 + "@formatjs/fast-memoize": 3.1.6 - '@hono/node-server@1.19.11(hono@4.12.27)': + "@hono/node-server@1.19.14(hono@4.12.27)": dependencies: hono: 4.12.27 - '@humanfs/core@0.19.2': + "@humanfs/core@0.19.2": dependencies: - '@humanfs/types': 0.15.0 + "@humanfs/types": 0.15.0 - '@humanfs/node@0.16.8': + "@humanfs/node@0.16.8": dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 + "@humanfs/core": 0.19.2 + "@humanfs/types": 0.15.0 + "@humanwhocodes/retry": 0.4.3 - '@humanfs/types@0.15.0': {} + "@humanfs/types@0.15.0": {} - '@humanwhocodes/module-importer@1.0.1': {} + "@humanwhocodes/module-importer@1.0.1": {} - '@humanwhocodes/retry@0.4.3': {} + "@humanwhocodes/retry@0.4.3": {} - '@img/colour@1.1.0': + "@img/colour@1.1.0": optional: true - '@img/sharp-darwin-arm64@0.34.5': + "@img/sharp-darwin-arm64@0.34.5": optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + "@img/sharp-libvips-darwin-arm64": 1.2.4 optional: true - '@img/sharp-darwin-x64@0.34.5': + "@img/sharp-darwin-x64@0.34.5": optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + "@img/sharp-libvips-darwin-x64": 1.2.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + "@img/sharp-libvips-darwin-arm64@1.2.4": optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + "@img/sharp-libvips-darwin-x64@1.2.4": optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + "@img/sharp-libvips-linux-arm64@1.2.4": optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + "@img/sharp-libvips-linux-arm@1.2.4": optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + "@img/sharp-libvips-linux-ppc64@1.2.4": optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + "@img/sharp-libvips-linux-riscv64@1.2.4": optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + "@img/sharp-libvips-linux-s390x@1.2.4": optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + "@img/sharp-libvips-linux-x64@1.2.4": optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + "@img/sharp-libvips-linuxmusl-x64@1.2.4": optional: true - '@img/sharp-linux-arm64@0.34.5': + "@img/sharp-linux-arm64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + "@img/sharp-libvips-linux-arm64": 1.2.4 optional: true - '@img/sharp-linux-arm@0.34.5': + "@img/sharp-linux-arm@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + "@img/sharp-libvips-linux-arm": 1.2.4 optional: true - '@img/sharp-linux-ppc64@0.34.5': + "@img/sharp-linux-ppc64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + "@img/sharp-libvips-linux-ppc64": 1.2.4 optional: true - '@img/sharp-linux-riscv64@0.34.5': + "@img/sharp-linux-riscv64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + "@img/sharp-libvips-linux-riscv64": 1.2.4 optional: true - '@img/sharp-linux-s390x@0.34.5': + "@img/sharp-linux-s390x@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + "@img/sharp-libvips-linux-s390x": 1.2.4 optional: true - '@img/sharp-linux-x64@0.34.5': + "@img/sharp-linux-x64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + "@img/sharp-libvips-linux-x64": 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': + "@img/sharp-linuxmusl-arm64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.5': + "@img/sharp-linuxmusl-x64@0.34.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 optional: true - '@img/sharp-wasm32@0.34.5': + "@img/sharp-wasm32@0.34.5": dependencies: - '@emnapi/runtime': 1.11.1 + "@emnapi/runtime": 1.11.1 optional: true - '@img/sharp-win32-arm64@0.34.5': + "@img/sharp-win32-arm64@0.34.5": optional: true - '@img/sharp-win32-ia32@0.34.5': + "@img/sharp-win32-ia32@0.34.5": optional: true - '@img/sharp-win32-x64@0.34.5': + "@img/sharp-win32-x64@0.34.5": optional: true - '@ioredis/commands@1.10.0': {} + "@ioredis/commands@1.10.0": {} - '@jridgewell/gen-mapping@0.3.13': + "@jridgewell/gen-mapping@0.3.13": dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/sourcemap-codec": 1.5.5 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/remapping@2.3.5': + "@jridgewell/remapping@2.3.5": dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/sourcemap-codec@1.5.5': {} + "@jridgewell/sourcemap-codec@1.5.5": {} - '@jridgewell/trace-mapping@0.3.31': + "@jridgewell/trace-mapping@0.3.31": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.5 - '@kurkle/color@0.3.4': {} + "@kurkle/color@0.3.4": {} - '@next/env@16.2.10': {} + "@next/env@16.2.10": {} - '@next/eslint-plugin-next@16.2.10': + "@next/eslint-plugin-next@16.2.10": dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.2.10': + "@next/swc-darwin-arm64@16.2.10": optional: true - '@next/swc-darwin-x64@16.2.10': + "@next/swc-darwin-x64@16.2.10": optional: true - '@next/swc-linux-arm64-gnu@16.2.10': + "@next/swc-linux-arm64-gnu@16.2.10": optional: true - '@next/swc-linux-arm64-musl@16.2.10': + "@next/swc-linux-arm64-musl@16.2.10": optional: true - '@next/swc-linux-x64-gnu@16.2.10': + "@next/swc-linux-x64-gnu@16.2.10": optional: true - '@next/swc-linux-x64-musl@16.2.10': + "@next/swc-linux-x64-musl@16.2.10": optional: true - '@next/swc-win32-arm64-msvc@16.2.10': + "@next/swc-win32-arm64-msvc@16.2.10": optional: true - '@next/swc-win32-x64-msvc@16.2.10': + "@next/swc-win32-x64-msvc@16.2.10": optional: true - '@nodelib/fs.scandir@2.1.5': + "@nodelib/fs.scandir@2.1.5": dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + "@nodelib/fs.stat@2.0.5": {} - '@nodelib/fs.walk@1.2.8': + "@nodelib/fs.walk@1.2.8": dependencies: - '@nodelib/fs.scandir': 2.1.5 + "@nodelib/fs.scandir": 2.1.5 fastq: 1.20.1 - '@otplib/core@12.0.1': {} + "@otplib/core@12.0.1": {} - '@otplib/plugin-crypto@12.0.1': + "@otplib/plugin-crypto@12.0.1": dependencies: - '@otplib/core': 12.0.1 + "@otplib/core": 12.0.1 - '@otplib/plugin-thirty-two@12.0.1': + "@otplib/plugin-thirty-two@12.0.1": dependencies: - '@otplib/core': 12.0.1 + "@otplib/core": 12.0.1 thirty-two: 1.0.2 - '@otplib/preset-default@12.0.1': + "@otplib/preset-default@12.0.1": dependencies: - '@otplib/core': 12.0.1 - '@otplib/plugin-crypto': 12.0.1 - '@otplib/plugin-thirty-two': 12.0.1 + "@otplib/core": 12.0.1 + "@otplib/plugin-crypto": 12.0.1 + "@otplib/plugin-thirty-two": 12.0.1 - '@otplib/preset-v11@12.0.1': + "@otplib/preset-v11@12.0.1": dependencies: - '@otplib/core': 12.0.1 - '@otplib/plugin-crypto': 12.0.1 - '@otplib/plugin-thirty-two': 12.0.1 + "@otplib/core": 12.0.1 + "@otplib/plugin-crypto": 12.0.1 + "@otplib/plugin-thirty-two": 12.0.1 - '@panva/hkdf@1.2.1': {} + "@panva/hkdf@1.2.1": {} - '@parcel/watcher-android-arm64@2.5.6': + "@parcel/watcher-android-arm64@2.5.6": optional: true - '@parcel/watcher-darwin-arm64@2.5.6': + "@parcel/watcher-darwin-arm64@2.5.6": optional: true - '@parcel/watcher-darwin-x64@2.5.6': + "@parcel/watcher-darwin-x64@2.5.6": optional: true - '@parcel/watcher-freebsd-x64@2.5.6': + "@parcel/watcher-freebsd-x64@2.5.6": optional: true - '@parcel/watcher-linux-arm-glibc@2.5.6': + "@parcel/watcher-linux-arm-glibc@2.5.6": optional: true - '@parcel/watcher-linux-arm-musl@2.5.6': + "@parcel/watcher-linux-arm-musl@2.5.6": optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.6': + "@parcel/watcher-linux-arm64-glibc@2.5.6": optional: true - '@parcel/watcher-linux-arm64-musl@2.5.6': + "@parcel/watcher-linux-arm64-musl@2.5.6": optional: true - '@parcel/watcher-linux-x64-glibc@2.5.6': + "@parcel/watcher-linux-x64-glibc@2.5.6": optional: true - '@parcel/watcher-linux-x64-musl@2.5.6': + "@parcel/watcher-linux-x64-musl@2.5.6": optional: true - '@parcel/watcher-win32-arm64@2.5.6': + "@parcel/watcher-win32-arm64@2.5.6": optional: true - '@parcel/watcher-win32-ia32@2.5.6': + "@parcel/watcher-win32-ia32@2.5.6": optional: true - '@parcel/watcher-win32-x64@2.5.6': + "@parcel/watcher-win32-x64@2.5.6": optional: true - '@parcel/watcher@2.5.6': + "@parcel/watcher@2.5.6": dependencies: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 picomatch: 4.0.4 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.6 - '@parcel/watcher-darwin-arm64': 2.5.6 - '@parcel/watcher-darwin-x64': 2.5.6 - '@parcel/watcher-freebsd-x64': 2.5.6 - '@parcel/watcher-linux-arm-glibc': 2.5.6 - '@parcel/watcher-linux-arm-musl': 2.5.6 - '@parcel/watcher-linux-arm64-glibc': 2.5.6 - '@parcel/watcher-linux-arm64-musl': 2.5.6 - '@parcel/watcher-linux-x64-glibc': 2.5.6 - '@parcel/watcher-linux-x64-musl': 2.5.6 - '@parcel/watcher-win32-arm64': 2.5.6 - '@parcel/watcher-win32-ia32': 2.5.6 - '@parcel/watcher-win32-x64': 2.5.6 + "@parcel/watcher-android-arm64": 2.5.6 + "@parcel/watcher-darwin-arm64": 2.5.6 + "@parcel/watcher-darwin-x64": 2.5.6 + "@parcel/watcher-freebsd-x64": 2.5.6 + "@parcel/watcher-linux-arm-glibc": 2.5.6 + "@parcel/watcher-linux-arm-musl": 2.5.6 + "@parcel/watcher-linux-arm64-glibc": 2.5.6 + "@parcel/watcher-linux-arm64-musl": 2.5.6 + "@parcel/watcher-linux-x64-glibc": 2.5.6 + "@parcel/watcher-linux-x64-musl": 2.5.6 + "@parcel/watcher-win32-arm64": 2.5.6 + "@parcel/watcher-win32-ia32": 2.5.6 + "@parcel/watcher-win32-x64": 2.5.6 - '@petamoriken/float16@3.9.3': {} + "@petamoriken/float16@3.9.3": {} - '@prisma/adapter-mariadb@7.8.0': + "@prisma/adapter-mariadb@7.8.0": dependencies: - '@prisma/driver-adapter-utils': 7.8.0 + "@prisma/driver-adapter-utils": 7.8.0 mariadb: 3.4.5 - '@prisma/client-runtime-utils@7.8.0': {} + "@prisma/client-runtime-utils@7.8.0": {} - '@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(typescript@5.9.3)': + "@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(typescript@5.9.3)": dependencies: - '@prisma/client-runtime-utils': 7.8.0 + "@prisma/client-runtime-utils": 7.8.0 optionalDependencies: prisma: 7.8.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@7.8.0': + "@prisma/config@7.8.0": dependencies: c12: 3.3.4 deepmerge-ts: 7.1.5 @@ -4455,19 +6628,19 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/debug@7.2.0': {} + "@prisma/debug@7.2.0": {} - '@prisma/debug@7.8.0': {} + "@prisma/debug@7.8.0": {} - '@prisma/dev@0.24.3(typescript@5.9.3)': + "@prisma/dev@0.24.3(typescript@5.9.3)": dependencies: - '@electric-sql/pglite': 0.4.1 - '@electric-sql/pglite-socket': 0.1.1(@electric-sql/pglite@0.4.1) - '@electric-sql/pglite-tools': 0.3.1(@electric-sql/pglite@0.4.1) - '@hono/node-server': 1.19.11(hono@4.12.27) - '@prisma/get-platform': 7.2.0 - '@prisma/query-plan-executor': 7.2.0 - '@prisma/streams-local': 0.1.2 + "@electric-sql/pglite": 0.4.1 + "@electric-sql/pglite-socket": 0.1.1(@electric-sql/pglite@0.4.1) + "@electric-sql/pglite-tools": 0.3.1(@electric-sql/pglite@0.4.1) + "@hono/node-server": 1.19.14(hono@4.12.27) + "@prisma/get-platform": 7.2.0 + "@prisma/query-plan-executor": 7.2.0 + "@prisma/streams-local": 0.1.2 foreground-child: 3.3.1 get-port-please: 3.2.0 hono: 4.12.27 @@ -4481,261 +6654,261 @@ snapshots: transitivePeerDependencies: - typescript - '@prisma/driver-adapter-utils@7.8.0': + "@prisma/driver-adapter-utils@7.8.0": dependencies: - '@prisma/debug': 7.8.0 + "@prisma/debug": 7.8.0 - '@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a': {} + "@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a": {} - '@prisma/engines@7.8.0': + "@prisma/engines@7.8.0": dependencies: - '@prisma/debug': 7.8.0 - '@prisma/engines-version': 7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a - '@prisma/fetch-engine': 7.8.0 - '@prisma/get-platform': 7.8.0 + "@prisma/debug": 7.8.0 + "@prisma/engines-version": 7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a + "@prisma/fetch-engine": 7.8.0 + "@prisma/get-platform": 7.8.0 - '@prisma/fetch-engine@7.8.0': + "@prisma/fetch-engine@7.8.0": dependencies: - '@prisma/debug': 7.8.0 - '@prisma/engines-version': 7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a - '@prisma/get-platform': 7.8.0 + "@prisma/debug": 7.8.0 + "@prisma/engines-version": 7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a + "@prisma/get-platform": 7.8.0 - '@prisma/get-platform@7.2.0': + "@prisma/get-platform@7.2.0": dependencies: - '@prisma/debug': 7.2.0 + "@prisma/debug": 7.2.0 - '@prisma/get-platform@7.8.0': + "@prisma/get-platform@7.8.0": dependencies: - '@prisma/debug': 7.8.0 + "@prisma/debug": 7.8.0 - '@prisma/query-plan-executor@7.2.0': {} + "@prisma/query-plan-executor@7.2.0": {} - '@prisma/streams-local@0.1.2': + "@prisma/streams-local@0.1.2": dependencies: ajv: 8.20.0 better-result: 2.9.2 env-paths: 3.0.0 proper-lockfile: 4.1.2 - '@prisma/studio-core@0.27.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + "@prisma/studio-core@0.27.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)": dependencies: - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@types/react': 19.2.17 + "@radix-ui/react-toggle": 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + "@types/react": 19.2.17 chart.js: 4.5.1 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) transitivePeerDependencies: - - '@types/react-dom' + - "@types/react-dom" - '@radix-ui/primitive@1.1.3': {} + "@radix-ui/primitive@1.1.3": {} - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.17)(react@19.2.7)': + "@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.17)(react@19.2.7)": dependencies: react: 19.2.7 optionalDependencies: - '@types/react': 19.2.17 + "@types/react": 19.2.17 - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + "@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)": dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.17)(react@19.2.7) + "@radix-ui/react-slot": 1.2.3(@types/react@19.2.17)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + "@types/react": 19.2.17 + "@types/react-dom": 19.2.3(@types/react@19.2.17) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.17)(react@19.2.7)': + "@radix-ui/react-slot@1.2.3(@types/react@19.2.17)(react@19.2.7)": dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.2.7) + "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.2.17)(react@19.2.7) react: 19.2.7 optionalDependencies: - '@types/react': 19.2.17 + "@types/react": 19.2.17 - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + "@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)": dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.17)(react@19.2.7) + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@19.2.17)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + "@types/react": 19.2.17 + "@types/react-dom": 19.2.3(@types/react@19.2.17) - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.17)(react@19.2.7)': + "@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.17)(react@19.2.7)": dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.2.7) + "@radix-ui/react-use-effect-event": 0.0.2(@types/react@19.2.17)(react@19.2.7) + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.2.17)(react@19.2.7) react: 19.2.7 optionalDependencies: - '@types/react': 19.2.17 + "@types/react": 19.2.17 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.17)(react@19.2.7)': + "@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.17)(react@19.2.7)": dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.2.7) + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.2.17)(react@19.2.7) react: 19.2.7 optionalDependencies: - '@types/react': 19.2.17 + "@types/react": 19.2.17 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.17)(react@19.2.7)': + "@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.17)(react@19.2.7)": dependencies: react: 19.2.7 optionalDependencies: - '@types/react': 19.2.17 + "@types/react": 19.2.17 - '@rollup/rollup-android-arm-eabi@4.62.2': + "@rollup/rollup-android-arm-eabi@4.62.2": optional: true - '@rollup/rollup-android-arm64@4.62.2': + "@rollup/rollup-android-arm64@4.62.2": optional: true - '@rollup/rollup-darwin-arm64@4.62.2': + "@rollup/rollup-darwin-arm64@4.62.2": optional: true - '@rollup/rollup-darwin-x64@4.62.2': + "@rollup/rollup-darwin-x64@4.62.2": optional: true - '@rollup/rollup-freebsd-arm64@4.62.2': + "@rollup/rollup-freebsd-arm64@4.62.2": optional: true - '@rollup/rollup-freebsd-x64@4.62.2': + "@rollup/rollup-freebsd-x64@4.62.2": optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + "@rollup/rollup-linux-arm-gnueabihf@4.62.2": optional: true - '@rollup/rollup-linux-arm-musleabihf@4.62.2': + "@rollup/rollup-linux-arm-musleabihf@4.62.2": optional: true - '@rollup/rollup-linux-arm64-gnu@4.62.2': + "@rollup/rollup-linux-arm64-gnu@4.62.2": optional: true - '@rollup/rollup-linux-arm64-musl@4.62.2': + "@rollup/rollup-linux-arm64-musl@4.62.2": optional: true - '@rollup/rollup-linux-loong64-gnu@4.62.2': + "@rollup/rollup-linux-loong64-gnu@4.62.2": optional: true - '@rollup/rollup-linux-loong64-musl@4.62.2': + "@rollup/rollup-linux-loong64-musl@4.62.2": optional: true - '@rollup/rollup-linux-ppc64-gnu@4.62.2': + "@rollup/rollup-linux-ppc64-gnu@4.62.2": optional: true - '@rollup/rollup-linux-ppc64-musl@4.62.2': + "@rollup/rollup-linux-ppc64-musl@4.62.2": optional: true - '@rollup/rollup-linux-riscv64-gnu@4.62.2': + "@rollup/rollup-linux-riscv64-gnu@4.62.2": optional: true - '@rollup/rollup-linux-riscv64-musl@4.62.2': + "@rollup/rollup-linux-riscv64-musl@4.62.2": optional: true - '@rollup/rollup-linux-s390x-gnu@4.62.2': + "@rollup/rollup-linux-s390x-gnu@4.62.2": optional: true - '@rollup/rollup-linux-x64-gnu@4.62.2': + "@rollup/rollup-linux-x64-gnu@4.62.2": optional: true - '@rollup/rollup-linux-x64-musl@4.62.2': + "@rollup/rollup-linux-x64-musl@4.62.2": optional: true - '@rollup/rollup-openbsd-x64@4.62.2': + "@rollup/rollup-openbsd-x64@4.62.2": optional: true - '@rollup/rollup-openharmony-arm64@4.62.2': + "@rollup/rollup-openharmony-arm64@4.62.2": optional: true - '@rollup/rollup-win32-arm64-msvc@4.62.2': + "@rollup/rollup-win32-arm64-msvc@4.62.2": optional: true - '@rollup/rollup-win32-ia32-msvc@4.62.2': + "@rollup/rollup-win32-ia32-msvc@4.62.2": optional: true - '@rollup/rollup-win32-x64-gnu@4.62.2': + "@rollup/rollup-win32-x64-gnu@4.62.2": optional: true - '@rollup/rollup-win32-x64-msvc@4.62.2': + "@rollup/rollup-win32-x64-msvc@4.62.2": optional: true - '@schummar/icu-type-parser@1.21.5': {} + "@schummar/icu-type-parser@1.21.5": {} - '@stablelib/base64@1.0.1': {} + "@stablelib/base64@1.0.1": {} - '@standard-schema/spec@1.1.0': {} + "@standard-schema/spec@1.1.0": {} - '@swc/core-darwin-arm64@1.15.43': + "@swc/core-darwin-arm64@1.15.43": optional: true - '@swc/core-darwin-x64@1.15.43': + "@swc/core-darwin-x64@1.15.43": optional: true - '@swc/core-linux-arm-gnueabihf@1.15.43': + "@swc/core-linux-arm-gnueabihf@1.15.43": optional: true - '@swc/core-linux-arm64-gnu@1.15.43': + "@swc/core-linux-arm64-gnu@1.15.43": optional: true - '@swc/core-linux-arm64-musl@1.15.43': + "@swc/core-linux-arm64-musl@1.15.43": optional: true - '@swc/core-linux-ppc64-gnu@1.15.43': + "@swc/core-linux-ppc64-gnu@1.15.43": optional: true - '@swc/core-linux-s390x-gnu@1.15.43': + "@swc/core-linux-s390x-gnu@1.15.43": optional: true - '@swc/core-linux-x64-gnu@1.15.43': + "@swc/core-linux-x64-gnu@1.15.43": optional: true - '@swc/core-linux-x64-musl@1.15.43': + "@swc/core-linux-x64-musl@1.15.43": optional: true - '@swc/core-win32-arm64-msvc@1.15.43': + "@swc/core-win32-arm64-msvc@1.15.43": optional: true - '@swc/core-win32-ia32-msvc@1.15.43': + "@swc/core-win32-ia32-msvc@1.15.43": optional: true - '@swc/core-win32-x64-msvc@1.15.43': + "@swc/core-win32-x64-msvc@1.15.43": optional: true - '@swc/core@1.15.43': + "@swc/core@1.15.43": dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.27 + "@swc/counter": 0.1.3 + "@swc/types": 0.1.27 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.43 - '@swc/core-darwin-x64': 1.15.43 - '@swc/core-linux-arm-gnueabihf': 1.15.43 - '@swc/core-linux-arm64-gnu': 1.15.43 - '@swc/core-linux-arm64-musl': 1.15.43 - '@swc/core-linux-ppc64-gnu': 1.15.43 - '@swc/core-linux-s390x-gnu': 1.15.43 - '@swc/core-linux-x64-gnu': 1.15.43 - '@swc/core-linux-x64-musl': 1.15.43 - '@swc/core-win32-arm64-msvc': 1.15.43 - '@swc/core-win32-ia32-msvc': 1.15.43 - '@swc/core-win32-x64-msvc': 1.15.43 + "@swc/core-darwin-arm64": 1.15.43 + "@swc/core-darwin-x64": 1.15.43 + "@swc/core-linux-arm-gnueabihf": 1.15.43 + "@swc/core-linux-arm64-gnu": 1.15.43 + "@swc/core-linux-arm64-musl": 1.15.43 + "@swc/core-linux-ppc64-gnu": 1.15.43 + "@swc/core-linux-s390x-gnu": 1.15.43 + "@swc/core-linux-x64-gnu": 1.15.43 + "@swc/core-linux-x64-musl": 1.15.43 + "@swc/core-win32-arm64-msvc": 1.15.43 + "@swc/core-win32-ia32-msvc": 1.15.43 + "@swc/core-win32-x64-msvc": 1.15.43 - '@swc/counter@0.1.3': {} + "@swc/counter@0.1.3": {} - '@swc/helpers@0.5.15': + "@swc/helpers@0.5.15": dependencies: tslib: 2.8.1 - '@swc/types@0.1.27': + "@swc/types@0.1.27": dependencies: - '@swc/counter': 0.1.3 + "@swc/counter": 0.1.3 - '@tailwindcss/forms@0.5.11(tailwindcss@4.3.2)': + "@tailwindcss/forms@0.5.11(tailwindcss@4.3.2)": dependencies: mini-svg-data-uri: 1.4.4 tailwindcss: 4.3.2 - '@tailwindcss/node@4.3.2': + "@tailwindcss/node@4.3.2": dependencies: - '@jridgewell/remapping': 2.3.5 + "@jridgewell/remapping": 2.3.5 enhanced-resolve: 5.21.6 jiti: 2.7.0 lightningcss: 1.32.0 @@ -4743,110 +6916,110 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.3.2 - '@tailwindcss/oxide-android-arm64@4.3.2': + "@tailwindcss/oxide-android-arm64@4.3.2": optional: true - '@tailwindcss/oxide-darwin-arm64@4.3.2': + "@tailwindcss/oxide-darwin-arm64@4.3.2": optional: true - '@tailwindcss/oxide-darwin-x64@4.3.2': + "@tailwindcss/oxide-darwin-x64@4.3.2": optional: true - '@tailwindcss/oxide-freebsd-x64@4.3.2': + "@tailwindcss/oxide-freebsd-x64@4.3.2": optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': + "@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2": optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': + "@tailwindcss/oxide-linux-arm64-gnu@4.3.2": optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.3.2': + "@tailwindcss/oxide-linux-arm64-musl@4.3.2": optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.3.2': + "@tailwindcss/oxide-linux-x64-gnu@4.3.2": optional: true - '@tailwindcss/oxide-linux-x64-musl@4.3.2': + "@tailwindcss/oxide-linux-x64-musl@4.3.2": optional: true - '@tailwindcss/oxide-wasm32-wasi@4.3.2': + "@tailwindcss/oxide-wasm32-wasi@4.3.2": optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': + "@tailwindcss/oxide-win32-arm64-msvc@4.3.2": optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.3.2': + "@tailwindcss/oxide-win32-x64-msvc@4.3.2": optional: true - '@tailwindcss/oxide@4.3.2': + "@tailwindcss/oxide@4.3.2": optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.2 - '@tailwindcss/oxide-darwin-arm64': 4.3.2 - '@tailwindcss/oxide-darwin-x64': 4.3.2 - '@tailwindcss/oxide-freebsd-x64': 4.3.2 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.2 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.2 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.2 - '@tailwindcss/oxide-linux-x64-musl': 4.3.2 - '@tailwindcss/oxide-wasm32-wasi': 4.3.2 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.2 + "@tailwindcss/oxide-android-arm64": 4.3.2 + "@tailwindcss/oxide-darwin-arm64": 4.3.2 + "@tailwindcss/oxide-darwin-x64": 4.3.2 + "@tailwindcss/oxide-freebsd-x64": 4.3.2 + "@tailwindcss/oxide-linux-arm-gnueabihf": 4.3.2 + "@tailwindcss/oxide-linux-arm64-gnu": 4.3.2 + "@tailwindcss/oxide-linux-arm64-musl": 4.3.2 + "@tailwindcss/oxide-linux-x64-gnu": 4.3.2 + "@tailwindcss/oxide-linux-x64-musl": 4.3.2 + "@tailwindcss/oxide-wasm32-wasi": 4.3.2 + "@tailwindcss/oxide-win32-arm64-msvc": 4.3.2 + "@tailwindcss/oxide-win32-x64-msvc": 4.3.2 - '@tailwindcss/postcss@4.3.2': + "@tailwindcss/postcss@4.3.2": dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.3.2 - '@tailwindcss/oxide': 4.3.2 + "@alloc/quick-lru": 5.2.0 + "@tailwindcss/node": 4.3.2 + "@tailwindcss/oxide": 4.3.2 postcss: 8.5.16 tailwindcss: 4.3.2 - '@tailwindcss/typography@0.5.20(tailwindcss@4.3.2)': + "@tailwindcss/typography@0.5.20(tailwindcss@4.3.2)": dependencies: postcss-selector-parser: 6.0.10 tailwindcss: 4.3.2 - '@types/esrecurse@4.3.1': {} + "@types/esrecurse@4.3.1": {} - '@types/estree@1.0.9': {} + "@types/estree@1.0.9": {} - '@types/geojson@7946.0.16': {} + "@types/geojson@7946.0.16": {} - '@types/json-schema@7.0.15': {} + "@types/json-schema@7.0.15": {} - '@types/node@22.20.0': + "@types/node@22.20.0": dependencies: undici-types: 6.21.0 - '@types/node@24.13.2': + "@types/node@24.13.2": dependencies: undici-types: 7.18.2 - '@types/nodemailer@6.4.24': + "@types/nodemailer@6.4.24": dependencies: - '@types/node': 22.20.0 + "@types/node": 22.20.0 - '@types/react-dom@19.2.3(@types/react@19.2.17)': + "@types/react-dom@19.2.3(@types/react@19.2.17)": dependencies: - '@types/react': 19.2.17 + "@types/react": 19.2.17 - '@types/react@19.2.17': + "@types/react@19.2.17": dependencies: csstype: 3.2.3 - '@types/sanitize-html@2.16.1': + "@types/sanitize-html@2.16.1": dependencies: htmlparser2: 10.1.0 - '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)': + "@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)": dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/type-utils': 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.63.0 + "@eslint-community/regexpp": 4.12.2 + "@typescript-eslint/parser": 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.63.0 + "@typescript-eslint/type-utils": 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) + "@typescript-eslint/utils": 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.63.0 eslint: 10.6.0(jiti@2.7.0) ignore: 7.0.6 natural-compare: 1.4.0 @@ -4855,41 +7028,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)': + "@typescript-eslint/parser@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)": dependencies: - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.63.0 + "@typescript-eslint/scope-manager": 8.63.0 + "@typescript-eslint/types": 8.63.0 + "@typescript-eslint/typescript-estree": 8.63.0(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.63.0 debug: 4.4.3 eslint: 10.6.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.63.0(typescript@5.9.3)': + "@typescript-eslint/project-service@8.63.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3) - '@typescript-eslint/types': 8.63.0 + "@typescript-eslint/tsconfig-utils": 8.63.0(typescript@5.9.3) + "@typescript-eslint/types": 8.63.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.63.0': + "@typescript-eslint/scope-manager@8.63.0": dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + "@typescript-eslint/types": 8.63.0 + "@typescript-eslint/visitor-keys": 8.63.0 - '@typescript-eslint/tsconfig-utils@8.63.0(typescript@5.9.3)': + "@typescript-eslint/tsconfig-utils@8.63.0(typescript@5.9.3)": dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)': + "@typescript-eslint/type-utils@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) + "@typescript-eslint/types": 8.63.0 + "@typescript-eslint/typescript-estree": 8.63.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 eslint: 10.6.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) @@ -4897,14 +7070,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.63.0': {} + "@typescript-eslint/types@8.63.0": {} - '@typescript-eslint/typescript-estree@8.63.0(typescript@5.9.3)': + "@typescript-eslint/typescript-estree@8.63.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/project-service': 8.63.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3) - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + "@typescript-eslint/project-service": 8.63.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.63.0(typescript@5.9.3) + "@typescript-eslint/types": 8.63.0 + "@typescript-eslint/visitor-keys": 8.63.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.5 @@ -4914,67 +7087,67 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)': + "@typescript-eslint/utils@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3)": dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) + "@eslint-community/eslint-utils": 4.9.1(eslint@10.6.0(jiti@2.7.0)) + "@typescript-eslint/scope-manager": 8.63.0 + "@typescript-eslint/types": 8.63.0 + "@typescript-eslint/typescript-estree": 8.63.0(typescript@5.9.3) eslint: 10.6.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.63.0': + "@typescript-eslint/visitor-keys@8.63.0": dependencies: - '@typescript-eslint/types': 8.63.0 + "@typescript-eslint/types": 8.63.0 eslint-visitor-keys: 5.0.1 - '@vitest/expect@2.1.9': + "@vitest/expect@2.1.9": dependencies: - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + "@vitest/spy": 2.1.9 + "@vitest/utils": 2.1.9 chai: 5.3.3 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.20.0)(lightningcss@1.32.0))': + "@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.20.0)(lightningcss@1.32.0))": dependencies: - '@vitest/spy': 2.1.9 + "@vitest/spy": 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 5.4.21(@types/node@22.20.0)(lightningcss@1.32.0) - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.20.0))': + "@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.20.0))": dependencies: - '@vitest/spy': 2.1.9 + "@vitest/spy": 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 5.4.21(@types/node@22.20.0) - '@vitest/pretty-format@2.1.9': + "@vitest/pretty-format@2.1.9": dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.9': + "@vitest/runner@2.1.9": dependencies: - '@vitest/utils': 2.1.9 + "@vitest/utils": 2.1.9 pathe: 1.1.2 - '@vitest/snapshot@2.1.9': + "@vitest/snapshot@2.1.9": dependencies: - '@vitest/pretty-format': 2.1.9 + "@vitest/pretty-format": 2.1.9 magic-string: 0.30.21 pathe: 1.1.2 - '@vitest/spy@2.1.9': + "@vitest/spy@2.1.9": dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.9': + "@vitest/utils@2.1.9": dependencies: - '@vitest/pretty-format': 2.1.9 + "@vitest/pretty-format": 2.1.9 loupe: 3.2.1 tinyrainbow: 1.2.0 @@ -4994,7 +7167,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -5139,7 +7312,7 @@ snapshots: chart.js@4.5.1: dependencies: - '@kurkle/color': 0.3.4 + "@kurkle/color": 0.3.4 check-error@2.1.3: {} @@ -5249,8 +7422,8 @@ snapshots: drizzle-kit@0.30.6: dependencies: - '@drizzle-team/brocli': 0.10.2 - '@esbuild-kit/esm-loader': 2.6.5 + "@drizzle-team/brocli": 0.10.2 + "@esbuild-kit/esm-loader": 2.6.5 esbuild: 0.19.12 esbuild-register: 3.6.0(esbuild@0.19.12) gel: 2.2.0 @@ -5269,7 +7442,7 @@ snapshots: effect@3.20.0: dependencies: - '@standard-schema/spec': 1.1.0 + "@standard-schema/spec": 1.1.0 fast-check: 3.23.2 electron-to-chromium@1.5.389: {} @@ -5392,109 +7565,109 @@ snapshots: 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/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 + "@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 esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.1 - '@esbuild/android-arm': 0.28.1 - '@esbuild/android-arm64': 0.28.1 - '@esbuild/android-x64': 0.28.1 - '@esbuild/darwin-arm64': 0.28.1 - '@esbuild/darwin-x64': 0.28.1 - '@esbuild/freebsd-arm64': 0.28.1 - '@esbuild/freebsd-x64': 0.28.1 - '@esbuild/linux-arm': 0.28.1 - '@esbuild/linux-arm64': 0.28.1 - '@esbuild/linux-ia32': 0.28.1 - '@esbuild/linux-loong64': 0.28.1 - '@esbuild/linux-mips64el': 0.28.1 - '@esbuild/linux-ppc64': 0.28.1 - '@esbuild/linux-riscv64': 0.28.1 - '@esbuild/linux-s390x': 0.28.1 - '@esbuild/linux-x64': 0.28.1 - '@esbuild/netbsd-arm64': 0.28.1 - '@esbuild/netbsd-x64': 0.28.1 - '@esbuild/openbsd-arm64': 0.28.1 - '@esbuild/openbsd-x64': 0.28.1 - '@esbuild/openharmony-arm64': 0.28.1 - '@esbuild/sunos-x64': 0.28.1 - '@esbuild/win32-arm64': 0.28.1 - '@esbuild/win32-ia32': 0.28.1 - '@esbuild/win32-x64': 0.28.1 + "@esbuild/aix-ppc64": 0.28.1 + "@esbuild/android-arm": 0.28.1 + "@esbuild/android-arm64": 0.28.1 + "@esbuild/android-x64": 0.28.1 + "@esbuild/darwin-arm64": 0.28.1 + "@esbuild/darwin-x64": 0.28.1 + "@esbuild/freebsd-arm64": 0.28.1 + "@esbuild/freebsd-x64": 0.28.1 + "@esbuild/linux-arm": 0.28.1 + "@esbuild/linux-arm64": 0.28.1 + "@esbuild/linux-ia32": 0.28.1 + "@esbuild/linux-loong64": 0.28.1 + "@esbuild/linux-mips64el": 0.28.1 + "@esbuild/linux-ppc64": 0.28.1 + "@esbuild/linux-riscv64": 0.28.1 + "@esbuild/linux-s390x": 0.28.1 + "@esbuild/linux-x64": 0.28.1 + "@esbuild/netbsd-arm64": 0.28.1 + "@esbuild/netbsd-x64": 0.28.1 + "@esbuild/openbsd-arm64": 0.28.1 + "@esbuild/openbsd-x64": 0.28.1 + "@esbuild/openharmony-arm64": 0.28.1 + "@esbuild/sunos-x64": 0.28.1 + "@esbuild/win32-arm64": 0.28.1 + "@esbuild/win32-ia32": 0.28.1 + "@esbuild/win32-x64": 0.28.1 escalade@3.2.0: {} @@ -5525,8 +7698,8 @@ snapshots: eslint-plugin-react-hooks@7.1.1(eslint@10.6.0(jiti@2.7.0)): dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 + "@babel/core": 7.29.7 + "@babel/parser": 7.29.7 eslint: 10.6.0(jiti@2.7.0) hermes-parser: 0.25.1 zod: 3.25.76 @@ -5540,8 +7713,8 @@ snapshots: eslint-scope@9.1.2: dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 + "@types/esrecurse": 4.3.1 + "@types/estree": 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -5551,16 +7724,16 @@ snapshots: eslint@10.6.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 + "@eslint-community/eslint-utils": 4.9.1(eslint@10.6.0(jiti@2.7.0)) + "@eslint-community/regexpp": 4.12.2 + "@eslint/config-array": 0.23.5 + "@eslint/config-helpers": 0.6.0 + "@eslint/core": 1.2.1 + "@eslint/plugin-kit": 0.7.2 + "@humanfs/node": 0.16.8 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.4.3 + "@types/estree": 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 @@ -5604,7 +7777,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.9 + "@types/estree": 1.0.9 esutils@2.0.3: {} @@ -5620,8 +7793,8 @@ snapshots: fast-glob@3.3.1: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -5632,7 +7805,7 @@ snapshots: fast-sha256@1.3.0: {} - fast-uri@3.1.2: {} + fast-uri@3.1.3: {} fastq@1.20.1: dependencies: @@ -5692,7 +7865,7 @@ snapshots: gel@2.2.0: dependencies: - '@petamoriken/float16': 3.9.3 + "@petamoriken/float16": 3.9.3 debug: 4.4.3 env-paths: 3.0.0 semver: 7.8.5 @@ -5811,7 +7984,7 @@ snapshots: icu-minify@4.13.1: dependencies: - '@formatjs/icu-messageformat-parser': 3.5.12 + "@formatjs/icu-messageformat-parser": 3.5.12 ignore@5.3.2: {} @@ -5831,12 +8004,12 @@ snapshots: intl-messageformat@11.2.9: dependencies: - '@formatjs/fast-memoize': 3.1.6 - '@formatjs/icu-messageformat-parser': 3.5.12 + "@formatjs/fast-memoize": 3.1.6 + "@formatjs/icu-messageformat-parser": 3.5.12 ioredis@5.11.1: dependencies: - '@ioredis/commands': 1.10.0 + "@ioredis/commands": 1.10.0 cluster-key-slot: 1.1.1 debug: 4.4.3 denque: 2.1.0 @@ -6092,12 +8265,12 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/sourcemap-codec": 1.5.5 mariadb@3.4.5: dependencies: - '@types/geojson': 7946.0.16 - '@types/node': 24.13.2 + "@types/geojson": 7946.0.16 + "@types/node": 24.13.2 denque: 2.1.0 iconv-lite: 0.6.3 lru-cache: 10.4.3 @@ -6137,7 +8310,7 @@ snapshots: mysql2@3.22.5(@types/node@22.20.0): dependencies: - '@types/node': 22.20.0 + "@types/node": 22.20.0 aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 @@ -6149,7 +8322,7 @@ snapshots: mysql2@3.22.6(@types/node@22.20.0): dependencies: - '@types/node': 22.20.0 + "@types/node": 22.20.0 aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 @@ -6171,7 +8344,7 @@ snapshots: next-auth@5.0.0-beta.31(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nodemailer@9.0.3)(react@19.2.7): dependencies: - '@auth/core': 0.41.2(nodemailer@9.0.3) + "@auth/core": 0.41.2(nodemailer@9.0.3) next: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 optionalDependencies: @@ -6181,9 +8354,9 @@ snapshots: next-intl@4.13.1(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(typescript@5.9.3): dependencies: - '@formatjs/intl-localematcher': 0.8.10 - '@parcel/watcher': 2.5.6 - '@swc/core': 1.15.43 + "@formatjs/intl-localematcher": 0.8.10 + "@parcel/watcher": 2.5.6 + "@swc/core": 1.15.43 icu-minify: 4.13.1 negotiator: 1.0.0 next: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -6194,30 +8367,30 @@ snapshots: optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - - '@swc/helpers' + - "@swc/helpers" next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@next/env': 16.2.10 - '@swc/helpers': 0.5.15 + "@next/env": 16.2.10 + "@swc/helpers": 0.5.15 baseline-browser-mapping: 2.10.40 caniuse-lite: 1.0.30001799 - postcss: 8.4.31 + postcss: 8.5.16 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.7) optionalDependencies: - '@next/swc-darwin-arm64': 16.2.10 - '@next/swc-darwin-x64': 16.2.10 - '@next/swc-linux-arm64-gnu': 16.2.10 - '@next/swc-linux-arm64-musl': 16.2.10 - '@next/swc-linux-x64-gnu': 16.2.10 - '@next/swc-linux-x64-musl': 16.2.10 - '@next/swc-win32-arm64-msvc': 16.2.10 - '@next/swc-win32-x64-msvc': 16.2.10 + "@next/swc-darwin-arm64": 16.2.10 + "@next/swc-darwin-x64": 16.2.10 + "@next/swc-linux-arm64-gnu": 16.2.10 + "@next/swc-linux-arm64-musl": 16.2.10 + "@next/swc-linux-x64-gnu": 16.2.10 + "@next/swc-linux-x64-musl": 16.2.10 + "@next/swc-win32-arm64-msvc": 16.2.10 + "@next/swc-win32-x64-msvc": 16.2.10 sharp: 0.34.5 transitivePeerDependencies: - - '@babel/core' + - "@babel/core" - babel-plugin-macros node-addon-api@7.1.1: {} @@ -6268,9 +8441,9 @@ snapshots: otplib@12.0.1: dependencies: - '@otplib/core': 12.0.1 - '@otplib/preset-default': 12.0.1 - '@otplib/preset-v11': 12.0.1 + "@otplib/core": 12.0.1 + "@otplib/preset-default": 12.0.1 + "@otplib/preset-v11": 12.0.1 own-keys@1.0.1: dependencies: @@ -6325,12 +8498,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.31: - dependencies: - nanoid: 3.3.15 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.15: dependencies: nanoid: 3.3.15 @@ -6357,17 +8524,17 @@ snapshots: prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3): dependencies: - '@prisma/config': 7.8.0 - '@prisma/dev': 0.24.3(typescript@5.9.3) - '@prisma/engines': 7.8.0 - '@prisma/studio-core': 0.27.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + "@prisma/config": 7.8.0 + "@prisma/dev": 0.24.3(typescript@5.9.3) + "@prisma/engines": 7.8.0 + "@prisma/studio-core": 0.27.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) mysql2: 3.15.3 postgres: 3.4.7 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' + - "@types/react" + - "@types/react-dom" - magicast - react - react-dom @@ -6455,33 +8622,33 @@ snapshots: rollup@4.62.2: dependencies: - '@types/estree': 1.0.9 + "@types/estree": 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.62.2 - '@rollup/rollup-android-arm64': 4.62.2 - '@rollup/rollup-darwin-arm64': 4.62.2 - '@rollup/rollup-darwin-x64': 4.62.2 - '@rollup/rollup-freebsd-arm64': 4.62.2 - '@rollup/rollup-freebsd-x64': 4.62.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 - '@rollup/rollup-linux-arm-musleabihf': 4.62.2 - '@rollup/rollup-linux-arm64-gnu': 4.62.2 - '@rollup/rollup-linux-arm64-musl': 4.62.2 - '@rollup/rollup-linux-loong64-gnu': 4.62.2 - '@rollup/rollup-linux-loong64-musl': 4.62.2 - '@rollup/rollup-linux-ppc64-gnu': 4.62.2 - '@rollup/rollup-linux-ppc64-musl': 4.62.2 - '@rollup/rollup-linux-riscv64-gnu': 4.62.2 - '@rollup/rollup-linux-riscv64-musl': 4.62.2 - '@rollup/rollup-linux-s390x-gnu': 4.62.2 - '@rollup/rollup-linux-x64-gnu': 4.62.2 - '@rollup/rollup-linux-x64-musl': 4.62.2 - '@rollup/rollup-openbsd-x64': 4.62.2 - '@rollup/rollup-openharmony-arm64': 4.62.2 - '@rollup/rollup-win32-arm64-msvc': 4.62.2 - '@rollup/rollup-win32-ia32-msvc': 4.62.2 - '@rollup/rollup-win32-x64-gnu': 4.62.2 - '@rollup/rollup-win32-x64-msvc': 4.62.2 + "@rollup/rollup-android-arm-eabi": 4.62.2 + "@rollup/rollup-android-arm64": 4.62.2 + "@rollup/rollup-darwin-arm64": 4.62.2 + "@rollup/rollup-darwin-x64": 4.62.2 + "@rollup/rollup-freebsd-arm64": 4.62.2 + "@rollup/rollup-freebsd-x64": 4.62.2 + "@rollup/rollup-linux-arm-gnueabihf": 4.62.2 + "@rollup/rollup-linux-arm-musleabihf": 4.62.2 + "@rollup/rollup-linux-arm64-gnu": 4.62.2 + "@rollup/rollup-linux-arm64-musl": 4.62.2 + "@rollup/rollup-linux-loong64-gnu": 4.62.2 + "@rollup/rollup-linux-loong64-musl": 4.62.2 + "@rollup/rollup-linux-ppc64-gnu": 4.62.2 + "@rollup/rollup-linux-ppc64-musl": 4.62.2 + "@rollup/rollup-linux-riscv64-gnu": 4.62.2 + "@rollup/rollup-linux-riscv64-musl": 4.62.2 + "@rollup/rollup-linux-s390x-gnu": 4.62.2 + "@rollup/rollup-linux-x64-gnu": 4.62.2 + "@rollup/rollup-linux-x64-musl": 4.62.2 + "@rollup/rollup-openbsd-x64": 4.62.2 + "@rollup/rollup-openharmony-arm64": 4.62.2 + "@rollup/rollup-win32-arm64-msvc": 4.62.2 + "@rollup/rollup-win32-ia32-msvc": 4.62.2 + "@rollup/rollup-win32-x64-gnu": 4.62.2 + "@rollup/rollup-win32-x64-msvc": 4.62.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -6559,34 +8726,34 @@ snapshots: sharp@0.34.5: dependencies: - '@img/colour': 1.1.0 + "@img/colour": 1.1.0 detect-libc: 2.1.2 semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 + "@img/sharp-darwin-arm64": 0.34.5 + "@img/sharp-darwin-x64": 0.34.5 + "@img/sharp-libvips-darwin-arm64": 1.2.4 + "@img/sharp-libvips-darwin-x64": 1.2.4 + "@img/sharp-libvips-linux-arm": 1.2.4 + "@img/sharp-libvips-linux-arm64": 1.2.4 + "@img/sharp-libvips-linux-ppc64": 1.2.4 + "@img/sharp-libvips-linux-riscv64": 1.2.4 + "@img/sharp-libvips-linux-s390x": 1.2.4 + "@img/sharp-libvips-linux-x64": 1.2.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 + "@img/sharp-linux-arm": 0.34.5 + "@img/sharp-linux-arm64": 0.34.5 + "@img/sharp-linux-ppc64": 0.34.5 + "@img/sharp-linux-riscv64": 0.34.5 + "@img/sharp-linux-s390x": 0.34.5 + "@img/sharp-linux-x64": 0.34.5 + "@img/sharp-linuxmusl-arm64": 0.34.5 + "@img/sharp-linuxmusl-x64": 0.34.5 + "@img/sharp-wasm32": 0.34.5 + "@img/sharp-win32-arm64": 0.34.5 + "@img/sharp-win32-ia32": 0.34.5 + "@img/sharp-win32-x64": 0.34.5 optional: true shebang-command@2.0.0: @@ -6652,7 +8819,7 @@ snapshots: standardwebhooks@1.0.0: dependencies: - '@stablelib/base64': 1.0.1 + "@stablelib/base64": 1.0.1 fast-sha256: 1.3.0 std-env@3.10.0: {} @@ -6701,7 +8868,7 @@ snapshots: client-only: 0.0.1 react: 19.2.7 optionalDependencies: - '@babel/core': 7.29.7 + "@babel/core": 7.29.7 tailwindcss@4.3.2: {} @@ -6779,10 +8946,10 @@ snapshots: typescript-eslint@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) + "@typescript-eslint/eslint-plugin": 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) + "@typescript-eslint/parser": 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) + "@typescript-eslint/typescript-estree": 8.63.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.63.0(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3) eslint: 10.6.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: @@ -6813,8 +8980,8 @@ snapshots: use-intl@4.13.1(react@19.2.7): dependencies: - '@formatjs/fast-memoize': 3.1.6 - '@schummar/icu-type-parser': 1.21.5 + "@formatjs/fast-memoize": 3.1.6 + "@schummar/icu-type-parser": 1.21.5 icu-minify: 4.13.1 intl-messageformat: 11.2.9 react: 19.2.7 @@ -6833,7 +9000,7 @@ snapshots: pathe: 1.1.2 vite: 5.4.21(@types/node@22.20.0) transitivePeerDependencies: - - '@types/node' + - "@types/node" - less - lightningcss - sass @@ -6851,7 +9018,7 @@ snapshots: pathe: 1.1.2 vite: 5.4.21(@types/node@22.20.0)(lightningcss@1.32.0) transitivePeerDependencies: - - '@types/node' + - "@types/node" - less - lightningcss - sass @@ -6867,7 +9034,7 @@ snapshots: postcss: 8.5.15 rollup: 4.62.2 optionalDependencies: - '@types/node': 22.20.0 + "@types/node": 22.20.0 fsevents: 2.3.3 vite@5.4.21(@types/node@22.20.0)(lightningcss@1.32.0): @@ -6876,19 +9043,19 @@ snapshots: postcss: 8.5.16 rollup: 4.62.2 optionalDependencies: - '@types/node': 22.20.0 + "@types/node": 22.20.0 fsevents: 2.3.3 lightningcss: 1.32.0 vitest@2.1.9(@types/node@22.20.0): dependencies: - '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.20.0)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.9 - '@vitest/snapshot': 2.1.9 - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + "@vitest/expect": 2.1.9 + "@vitest/mocker": 2.1.9(vite@5.4.21(@types/node@22.20.0)) + "@vitest/pretty-format": 2.1.9 + "@vitest/runner": 2.1.9 + "@vitest/snapshot": 2.1.9 + "@vitest/spy": 2.1.9 + "@vitest/utils": 2.1.9 chai: 5.3.3 debug: 4.4.3 expect-type: 1.4.0 @@ -6903,7 +9070,7 @@ snapshots: vite-node: 2.1.9(@types/node@22.20.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.20.0 + "@types/node": 22.20.0 transitivePeerDependencies: - less - lightningcss @@ -6917,13 +9084,13 @@ snapshots: vitest@2.1.9(@types/node@22.20.0)(lightningcss@1.32.0): dependencies: - '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.20.0)(lightningcss@1.32.0)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.9 - '@vitest/snapshot': 2.1.9 - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + "@vitest/expect": 2.1.9 + "@vitest/mocker": 2.1.9(vite@5.4.21(@types/node@22.20.0)(lightningcss@1.32.0)) + "@vitest/pretty-format": 2.1.9 + "@vitest/runner": 2.1.9 + "@vitest/snapshot": 2.1.9 + "@vitest/spy": 2.1.9 + "@vitest/utils": 2.1.9 chai: 5.3.3 debug: 4.4.3 expect-type: 1.4.0 @@ -6938,7 +9105,7 @@ snapshots: vite-node: 2.1.9(@types/node@22.20.0)(lightningcss@1.32.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.20.0 + "@types/node": 22.20.0 transitivePeerDependencies: - less - lightningcss diff --git a/public/api/openapi.json b/public/api/openapi.json index 4e378449..0a0dd9f2 100644 --- a/public/api/openapi.json +++ b/public/api/openapi.json @@ -5,12 +5,8 @@ "version": "1.0.0", "description": "Public and administrative REST API for the AtomCMS-Next Habbo retro hotel CMS." }, - "servers": [ - { "url": "/api", "description": "Local API" } - ], - "security": [ - { "bearerAuth": [], "sessionAuth": [] } - ], + "servers": [{ "url": "/api", "description": "Local API" }], + "security": [{ "bearerAuth": [], "sessionAuth": [] }], "components": { "securitySchemes": { "bearerAuth": { @@ -54,7 +50,11 @@ "responses": { "200": { "description": "Online count", - "content": { "application/json": { "schema": { "type": "object", "properties": { "count": { "type": "integer" } } } } } + "content": { + "application/json": { + "schema": { "type": "object", "properties": { "count": { "type": "integer" } } } + } + } } } } diff --git a/public/scripts/theme-init.js b/public/scripts/theme-init.js index 9c6c4b54..b89b736e 100644 --- a/public/scripts/theme-init.js +++ b/public/scripts/theme-init.js @@ -1,12 +1,12 @@ -(function(){ +(function () { try { - var s=localStorage.getItem('theme'); - var dd=document.querySelector('meta[name="theme-default-dark"]'); - var defaultDark=dd?dd.getAttribute('content')==='true':false; - if(s==='dark'||(!s&&defaultDark))document.documentElement.classList.add('dark'); - var nc=localStorage.getItem('navbarColor'), - nt=localStorage.getItem('navbarTextColor'); - if(nc)document.documentElement.style.setProperty('--color-navbar',nc); - if(nt)document.documentElement.style.setProperty('--color-navbar-text',nt); - }catch(e){} + var s = localStorage.getItem("theme"); + var dd = document.querySelector('meta[name="theme-default-dark"]'); + var defaultDark = dd ? dd.getAttribute("content") === "true" : false; + if (s === "dark" || (!s && defaultDark)) document.documentElement.classList.add("dark"); + var nc = localStorage.getItem("navbarColor"), + nt = localStorage.getItem("navbarTextColor"); + if (nc) document.documentElement.style.setProperty("--color-navbar", nc); + if (nt) document.documentElement.style.setProperty("--color-navbar-text", nt); + } catch (e) {} })(); diff --git a/public/sw.js b/public/sw.js index c11a0f21..0d2e25c5 100644 --- a/public/sw.js +++ b/public/sw.js @@ -45,7 +45,10 @@ self.addEventListener("fetch", (event) => { fetch(req) .then((res) => { const copy = res.clone(); - caches.open(CACHE).then((c) => c.put(req, copy)).catch(() => {}); + caches + .open(CACHE) + .then((c) => c.put(req, copy)) + .catch(() => {}); return res; }) .catch(() => caches.match(req).then((hit) => hit || caches.match("/"))), diff --git a/scripts/apply-migrations.ts b/scripts/apply-migrations.ts index b6d6d5a3..5597f28d 100644 --- a/scripts/apply-migrations.ts +++ b/scripts/apply-migrations.ts @@ -41,9 +41,7 @@ async function getApplied(): Promise> { const mysql = await import("mysql2/promise"); const conn = await mysql.createConnection(url); try { - const [rows] = await conn.execute( - `SELECT migration FROM \`${TRACKING_TABLE}\` ORDER BY id`, - ); + const [rows] = await conn.execute(`SELECT migration FROM \`${TRACKING_TABLE}\` ORDER BY id`); return new Set((rows as { migration: string }[]).map((r) => r.migration)); } catch { return new Set(); @@ -79,10 +77,7 @@ async function apply(migration: MigrationFile): Promise { await conn.execute(stmt); } - await conn.execute( - `INSERT INTO \`${TRACKING_TABLE}\` (migration) VALUES (?)`, - [migration.id], - ); + await conn.execute(`INSERT INTO \`${TRACKING_TABLE}\` (migration) VALUES (?)`, [migration.id]); console.log(`[migrate] Applied: ${migration.name}`); } finally { await conn.end(); diff --git a/scripts/migrate-aes-cbc-to-gcm.ts b/scripts/migrate-aes-cbc-to-gcm.ts index ea48a3ee..cb247e72 100644 --- a/scripts/migrate-aes-cbc-to-gcm.ts +++ b/scripts/migrate-aes-cbc-to-gcm.ts @@ -29,7 +29,9 @@ function decryptCbc(payload: string, key: Buffer, serialize = true): string { value: string; mac: string; }; - const expected = createHmac("sha256", key).update(json.iv + json.value).digest("hex"); + const expected = createHmac("sha256", key) + .update(json.iv + json.value) + .digest("hex"); const a = Buffer.from(expected, "hex"); const b = Buffer.from(json.mac, "hex"); if (a.length !== b.length || !timingSafeEqual(a, b)) { @@ -59,8 +61,8 @@ function isAlreadyGcm(payload: string, key: Buffer): boolean { try { const json = JSON.parse(Buffer.from(payload, "base64").toString("utf8")); if (!json.tag && !json.mac) return false; // can't determine format - if (json.tag) return true; // has authTag => GCM - return false; // has mac => CBC + if (json.tag) return true; // has authTag => GCM + return false; // has mac => CBC } catch { return false; } diff --git a/src/actions/admin-ads.ts b/src/actions/admin-ads.ts index 5be9107f..80869dca 100644 --- a/src/actions/admin-ads.ts +++ b/src/actions/admin-ads.ts @@ -12,7 +12,9 @@ import { formPositiveBigInt } from "@/lib/form-data"; export async function createAd(formData: FormData): Promise { const staff = await requireStaff(); - const image = String(formData.get("image") ?? "").trim().slice(0, 255); + const image = String(formData.get("image") ?? "") + .trim() + .slice(0, 255); if (!image) return; const now = new Date(); @@ -40,7 +42,9 @@ export async function updateAd(formData: FormData): Promise { const raw = String(formData.get("id") ?? ""); if (!/^\d+$/.test(raw)) return; const id = BigInt(raw); - const image = String(formData.get("image") ?? "").trim().slice(0, 255); + const image = String(formData.get("image") ?? "") + .trim() + .slice(0, 255); if (!image) return; try { diff --git a/src/actions/admin-alerts.ts b/src/actions/admin-alerts.ts index e4cb2162..13a64555 100644 --- a/src/actions/admin-alerts.ts +++ b/src/actions/admin-alerts.ts @@ -13,7 +13,9 @@ import { rcon } from "@/lib/services/rcon"; export async function sendHotelAlert(formData: FormData): Promise { await requireStaff(); - const message = String(formData.get("message") ?? "").trim().slice(0, 1000); + const message = String(formData.get("message") ?? "") + .trim() + .slice(0, 1000); if (!message) return; try { diff --git a/src/actions/admin-articles.ts b/src/actions/admin-articles.ts index 0e92a0a0..f3e062b8 100644 --- a/src/actions/admin-articles.ts +++ b/src/actions/admin-articles.ts @@ -53,10 +53,16 @@ export async function updateArticle(formData: FormData): Promise { await prisma.websiteArticles.update({ where: { id }, data: { - title: String(formData.get("title") ?? "").trim().slice(0, 255), - shortStory: String(formData.get("shortStory") ?? "").trim().slice(0, 255), + title: String(formData.get("title") ?? "") + .trim() + .slice(0, 255), + shortStory: String(formData.get("shortStory") ?? "") + .trim() + .slice(0, 255), fullStory: String(formData.get("fullStory") ?? "").trim(), - image: String(formData.get("image") ?? "").trim().slice(0, 255), + image: String(formData.get("image") ?? "") + .trim() + .slice(0, 255), updatedAt: new Date(), }, }); diff --git a/src/actions/admin-badges.ts b/src/actions/admin-badges.ts index 33717271..3740c790 100644 --- a/src/actions/admin-badges.ts +++ b/src/actions/admin-badges.ts @@ -9,7 +9,9 @@ export async function giveBadge(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); - const code = String(formData.get("code") ?? "").trim().slice(0, 32); + const code = String(formData.get("code") ?? "") + .trim() + .slice(0, 32); if (!(userId > 0) || code.length === 0) return; // Fire the emulator command so the badge appears live for online users. diff --git a/src/actions/admin-bans.ts b/src/actions/admin-bans.ts index 79e286b1..8673c023 100644 --- a/src/actions/admin-bans.ts +++ b/src/actions/admin-bans.ts @@ -14,7 +14,10 @@ const PERMANENT_SECONDS = 100 * 365 * 24 * 3600; export async function createBan(formData: FormData): Promise { const staff = await requireStaff(); const userId = Number(formData.get("userId")); - const reason = String(formData.get("reason") ?? "").trim().slice(0, 200) || "Banned"; + const reason = + String(formData.get("reason") ?? "") + .trim() + .slice(0, 200) || "Banned"; const hours = Number(formData.get("hours")); const type = String(formData.get("type")); if (!(userId > 0) || !BAN_TYPES.has(type)) return; diff --git a/src/actions/admin-email-templates.ts b/src/actions/admin-email-templates.ts index 57947277..5036ab5e 100644 --- a/src/actions/admin-email-templates.ts +++ b/src/actions/admin-email-templates.ts @@ -7,8 +7,12 @@ import { formPositiveBigInt } from "@/lib/form-data"; export async function createEmailTemplate(formData: FormData): Promise { await requireStaff(); - const name = String(formData.get("name") ?? "").trim().slice(0, 255); - const subject = String(formData.get("subject") ?? "").trim().slice(0, 255); + const name = String(formData.get("name") ?? "") + .trim() + .slice(0, 255); + const subject = String(formData.get("subject") ?? "") + .trim() + .slice(0, 255); const body = String(formData.get("body") ?? ""); const variablesRaw = String(formData.get("variables") ?? "").trim(); const isActive = formData.get("isActive") != null; @@ -36,7 +40,9 @@ export async function updateEmailTemplate(formData: FormData): Promise { } catch { return; } - const subject = String(formData.get("subject") ?? "").trim().slice(0, 255); + const subject = String(formData.get("subject") ?? "") + .trim() + .slice(0, 255); const body = String(formData.get("body") ?? ""); const variablesRaw = String(formData.get("variables") ?? "").trim(); const isActive = formData.get("isActive") != null; diff --git a/src/actions/admin-emulator.ts b/src/actions/admin-emulator.ts index ee4881e9..3c193246 100644 --- a/src/actions/admin-emulator.ts +++ b/src/actions/admin-emulator.ts @@ -11,7 +11,9 @@ import { prisma } from "@/lib/prisma"; export async function updateEmulatorSetting(formData: FormData): Promise { await requireStaff(); - const key = String(formData.get("key") ?? "").trim().slice(0, 100); + const key = String(formData.get("key") ?? "") + .trim() + .slice(0, 100); const value = String(formData.get("value") ?? "").slice(0, 512); if (!key) return; await prisma.emulatorSettings.upsert({ @@ -24,7 +26,9 @@ export async function updateEmulatorSetting(formData: FormData): Promise { export async function updateEmulatorText(formData: FormData): Promise { await requireStaff(); - const key = String(formData.get("key") ?? "").trim().slice(0, 100); + const key = String(formData.get("key") ?? "") + .trim() + .slice(0, 100); const value = String(formData.get("value") ?? "").slice(0, 4096); if (!key) return; await prisma.emulatorTexts.upsert({ diff --git a/src/actions/admin-help.ts b/src/actions/admin-help.ts index 4e0f4e02..0a5c72c0 100644 --- a/src/actions/admin-help.ts +++ b/src/actions/admin-help.ts @@ -17,16 +17,29 @@ function parsePosition(value: FormDataEntryValue | null): number { export async function createHelpQuestion(formData: FormData): Promise { const staff = await requireStaff(); - const name = String(formData.get("name") ?? "").trim().slice(0, 255); + const name = String(formData.get("name") ?? "") + .trim() + .slice(0, 255); const content = String(formData.get("content") ?? "").trim(); if (!name || !content) return; - const imageUrl = String(formData.get("imageUrl") ?? "").trim().slice(0, 255); - const buttonText = String(formData.get("buttonText") ?? "").trim().slice(0, 255); - const buttonUrl = String(formData.get("buttonUrl") ?? "").trim().slice(0, 255); - const buttonColor = String(formData.get("buttonColor") ?? "").trim().slice(0, 16) || "#eeb425"; + const imageUrl = String(formData.get("imageUrl") ?? "") + .trim() + .slice(0, 255); + const buttonText = String(formData.get("buttonText") ?? "") + .trim() + .slice(0, 255); + const buttonUrl = String(formData.get("buttonUrl") ?? "") + .trim() + .slice(0, 255); + const buttonColor = + String(formData.get("buttonColor") ?? "") + .trim() + .slice(0, 16) || "#eeb425"; const buttonBorderColor = - String(formData.get("buttonBorderColor") ?? "").trim().slice(0, 16) || "#facc15"; + String(formData.get("buttonBorderColor") ?? "") + .trim() + .slice(0, 16) || "#facc15"; try { const entry = await prisma.websiteHelpCenterCategories.create({ @@ -63,16 +76,29 @@ export async function updateHelpQuestion(formData: FormData): Promise { const id = formPositiveBigInt(formData, "id"); if (!id) return; - const name = String(formData.get("name") ?? "").trim().slice(0, 255); + const name = String(formData.get("name") ?? "") + .trim() + .slice(0, 255); const content = String(formData.get("content") ?? "").trim(); if (!name || !content) return; - const imageUrl = String(formData.get("imageUrl") ?? "").trim().slice(0, 255); - const buttonText = String(formData.get("buttonText") ?? "").trim().slice(0, 255); - const buttonUrl = String(formData.get("buttonUrl") ?? "").trim().slice(0, 255); - const buttonColor = String(formData.get("buttonColor") ?? "").trim().slice(0, 16) || "#eeb425"; + const imageUrl = String(formData.get("imageUrl") ?? "") + .trim() + .slice(0, 255); + const buttonText = String(formData.get("buttonText") ?? "") + .trim() + .slice(0, 255); + const buttonUrl = String(formData.get("buttonUrl") ?? "") + .trim() + .slice(0, 255); + const buttonColor = + String(formData.get("buttonColor") ?? "") + .trim() + .slice(0, 16) || "#eeb425"; const buttonBorderColor = - String(formData.get("buttonBorderColor") ?? "").trim().slice(0, 16) || "#facc15"; + String(formData.get("buttonBorderColor") ?? "") + .trim() + .slice(0, 16) || "#facc15"; try { await prisma.websiteHelpCenterCategories.update({ diff --git a/src/actions/admin-housekeeping.ts b/src/actions/admin-housekeeping.ts index 7f8ce945..d0802fca 100644 --- a/src/actions/admin-housekeeping.ts +++ b/src/actions/admin-housekeeping.ts @@ -11,9 +11,13 @@ import { prisma } from "@/lib/prisma"; export async function upsertPermission(formData: FormData): Promise { await requireStaff(); - const permission = String(formData.get("permission") ?? "").trim().slice(0, 255); + const permission = String(formData.get("permission") ?? "") + .trim() + .slice(0, 255); const minRank = Number(formData.get("minRank")); - const descriptionRaw = String(formData.get("description") ?? "").trim().slice(0, 255); + const descriptionRaw = String(formData.get("description") ?? "") + .trim() + .slice(0, 255); const description = descriptionRaw.length > 0 ? descriptionRaw : null; if (!permission || !Number.isFinite(minRank) || minRank < 0) return; diff --git a/src/actions/admin-ip.ts b/src/actions/admin-ip.ts index 19db4212..151a2785 100644 --- a/src/actions/admin-ip.ts +++ b/src/actions/admin-ip.ts @@ -5,11 +5,15 @@ import { requireStaff } from "@/lib/admin/guard"; import { prisma } from "@/lib/prisma"; function parseIp(formData: FormData): string { - return String(formData.get("ipAddress") ?? "").trim().slice(0, 255); + return String(formData.get("ipAddress") ?? "") + .trim() + .slice(0, 255); } function parseAsn(formData: FormData): string | null { - const asn = String(formData.get("asn") ?? "").trim().slice(0, 255); + const asn = String(formData.get("asn") ?? "") + .trim() + .slice(0, 255); return asn || null; } diff --git a/src/actions/admin-maintenance.ts b/src/actions/admin-maintenance.ts index bae57218..37b893ec 100644 --- a/src/actions/admin-maintenance.ts +++ b/src/actions/admin-maintenance.ts @@ -19,10 +19,8 @@ const KEY_MIN_RANK = "min_maintenance_login_rank"; const COMMENTS: Record = { [KEY_ENABLED]: "Determines whether maintenance is enabled or not", - [KEY_MESSAGE]: - "The maintenance message displayed to users while maintenance is activated", - [KEY_MIN_RANK]: - "The minimum rank required to login to the hotel during maintenance", + [KEY_MESSAGE]: "The maintenance message displayed to users while maintenance is activated", + [KEY_MIN_RANK]: "The minimum rank required to login to the hotel during maintenance", }; async function upsertSetting(key: string, value: string): Promise { diff --git a/src/actions/admin-media.ts b/src/actions/admin-media.ts index 66a53a7f..7c84cc4c 100644 --- a/src/actions/admin-media.ts +++ b/src/actions/admin-media.ts @@ -13,8 +13,8 @@ export async function uploadMedia(formData: FormData): Promise { await requireStaff(); const file = formData.get("file") as File | null; if (!file || file.size === 0) return; - if (file.size > MAX_SIZE) throw new Error("File too large (max 5MB)"); - if (!ALLOWED.includes(file.type)) throw new Error("Invalid file type"); + if (file.size > MAX_SIZE) return; + if (!ALLOWED.includes(file.type)) return; const baseDir = path.resolve(process.cwd(), MEDIA_DIR); // eslint-disable-next-line security/detect-non-literal-fs-filename diff --git a/src/actions/admin-permissions.ts b/src/actions/admin-permissions.ts index 0bd4cda8..0fcdd06d 100644 --- a/src/actions/admin-permissions.ts +++ b/src/actions/admin-permissions.ts @@ -20,7 +20,9 @@ function parseMinRank(formData: FormData): number { export async function createPermission(formData: FormData): Promise { const staff = await requireStaff(); - const permission = String(formData.get("permission") ?? "").trim().slice(0, 255); + const permission = String(formData.get("permission") ?? "") + .trim() + .slice(0, 255); const minRank = parseMinRank(formData); const description = String(formData.get("description") ?? "").trim() || null; if (!permission) return; @@ -52,7 +54,9 @@ export async function updatePermission(formData: FormData): Promise { const raw = String(formData.get("id") ?? ""); if (!raw) return; const id = BigInt(raw); - const permission = String(formData.get("permission") ?? "").trim().slice(0, 255); + const permission = String(formData.get("permission") ?? "") + .trim() + .slice(0, 255); const minRank = parseMinRank(formData); const description = String(formData.get("description") ?? "").trim() || null; if (!permission) return; diff --git a/src/actions/admin-radio-autodj.ts b/src/actions/admin-radio-autodj.ts index 82969e05..6dc8a1c7 100644 --- a/src/actions/admin-radio-autodj.ts +++ b/src/actions/admin-radio-autodj.ts @@ -1,9 +1,9 @@ -'use server'; +"use server"; -import { revalidatePath } from 'next/cache'; -import { requireStaff } from '@/lib/admin/guard'; -import { prisma } from '@/lib/prisma'; -import { logStaffActivity } from '@/lib/services/staff-activity'; +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; // AutoDJ playlist CRUD (radio_auto_dj_playlist). CMS-owned table backing the // fallback playlist the radio rotates through when no live DJ is streaming. @@ -13,7 +13,7 @@ import { logStaffActivity } from '@/lib/services/staff-activity'; /** Parse a FormData field into a positive BigInt id, or null when invalid. */ function parseId(raw: FormDataEntryValue | null): bigint | null { - if (typeof raw !== 'string' || raw.trim() === '') return null; + if (typeof raw !== "string" || raw.trim() === "") return null; try { const id = BigInt(raw.trim()); return id > 0n ? id : null; @@ -23,13 +23,13 @@ function parseId(raw: FormDataEntryValue | null): bigint | null { } function str(raw: FormDataEntryValue | null): string { - return typeof raw === 'string' ? raw : ''; + return typeof raw === "string" ? raw : ""; } /** Checkbox/select truthiness: '1', 'true', 'on' → true. */ function bool(raw: FormDataEntryValue | null): boolean { const v = str(raw).trim().toLowerCase(); - return v === '1' || v === 'true' || v === 'on'; + return v === "1" || v === "true" || v === "on"; } /** Parse a non-negative UnsignedInt, falling back to 0. */ @@ -42,7 +42,7 @@ function reqUInt(raw: FormDataEntryValue | null): number { /** Parse an optional non-negative UnsignedInt; blank/invalid/negative → null. */ function optUInt(raw: FormDataEntryValue | null): number | null { const s = str(raw).trim(); - if (s === '') return null; + if (s === "") return null; const n = Number(s); if (!Number.isFinite(n) || n < 0) return null; return Math.trunc(n); @@ -52,15 +52,15 @@ function optUInt(raw: FormDataEntryValue | null): number | null { export async function createTrack(formData: FormData): Promise { const staff = await requireStaff(); - const title = str(formData.get('title')).trim().slice(0, 255); + const title = str(formData.get("title")).trim().slice(0, 255); if (!title) return; - const artist = str(formData.get('artist')).trim().slice(0, 255); - const album = str(formData.get('album')).trim().slice(0, 255); - const artworkUrl = str(formData.get('artworkUrl')).trim().slice(0, 255); - const duration = optUInt(formData.get('duration')); - const sortOrder = reqUInt(formData.get('sortOrder')); - const isActive = bool(formData.get('isActive')); + const artist = str(formData.get("artist")).trim().slice(0, 255); + const album = str(formData.get("album")).trim().slice(0, 255); + const artworkUrl = str(formData.get("artworkUrl")).trim().slice(0, 255); + const duration = optUInt(formData.get("duration")); + const sortOrder = reqUInt(formData.get("sortOrder")); + const isActive = bool(formData.get("isActive")); const now = new Date(); try { @@ -79,24 +79,24 @@ export async function createTrack(formData: FormData): Promise { }); await logStaffActivity({ staffId: staff.id, - action: 'radio_autodj_create', - description: `Created AutoDJ track "${title}"${artist ? ` by ${artist}` : ''}`, - targetType: 'radio_auto_dj_track', + action: "radio_autodj_create", + description: `Created AutoDJ track "${title}"${artist ? ` by ${artist}` : ""}`, + targetType: "radio_auto_dj_track", targetId: Number(created.id), }); } catch { // Fail soft — DB unavailable; re-render without throwing. } - revalidatePath('/admin/radio/autodj'); + revalidatePath("/admin/radio/autodj"); } export async function toggleTrack(formData: FormData): Promise { const staff = await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; // The form posts the desired next state so the toggle is idempotent. - const isActive = bool(formData.get('isActive')); + const isActive = bool(formData.get("isActive")); try { await prisma.radioAutoDjPlaylist.update({ @@ -105,33 +105,33 @@ export async function toggleTrack(formData: FormData): Promise { }); await logStaffActivity({ staffId: staff.id, - action: 'radio_autodj_toggle', - description: `${isActive ? 'Activated' : 'Deactivated'} AutoDJ track #${id}`, - targetType: 'radio_auto_dj_track', + action: "radio_autodj_toggle", + description: `${isActive ? "Activated" : "Deactivated"} AutoDJ track #${id}`, + targetType: "radio_auto_dj_track", targetId: Number(id), }); } catch { // Row may be gone; ignore. } - revalidatePath('/admin/radio/autodj'); + revalidatePath("/admin/radio/autodj"); } export async function deleteTrack(formData: FormData): Promise { const staff = await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; try { await prisma.radioAutoDjPlaylist.delete({ where: { id } }); await logStaffActivity({ staffId: staff.id, - action: 'radio_autodj_delete', + action: "radio_autodj_delete", description: `Deleted AutoDJ track #${id}`, - targetType: 'radio_auto_dj_track', + targetType: "radio_auto_dj_track", targetId: Number(id), }); } catch { // Already deleted; ignore. } - revalidatePath('/admin/radio/autodj'); + revalidatePath("/admin/radio/autodj"); } diff --git a/src/actions/admin-radio-extra.ts b/src/actions/admin-radio-extra.ts index 9df1e6a4..503dad16 100644 --- a/src/actions/admin-radio-extra.ts +++ b/src/actions/admin-radio-extra.ts @@ -1,15 +1,15 @@ -'use server'; +"use server"; -import { revalidatePath } from 'next/cache'; -import { requireStaff } from '@/lib/admin/guard'; -import { prisma } from '@/lib/prisma'; -import { siteSettings } from '@/lib/services/site-settings'; +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { siteSettings } from "@/lib/services/site-settings"; // ── Helpers ──────────────────────────────────────────────────────────────── /** Parse a FormData field into a positive BigInt id, or null when invalid. */ function parseId(raw: FormDataEntryValue | null): bigint | null { - if (typeof raw !== 'string' || raw.trim() === '') return null; + if (typeof raw !== "string" || raw.trim() === "") return null; try { const id = BigInt(raw.trim()); return id > 0n ? id : null; @@ -19,13 +19,13 @@ function parseId(raw: FormDataEntryValue | null): bigint | null { } function str(raw: FormDataEntryValue | null): string { - return typeof raw === 'string' ? raw : ''; + return typeof raw === "string" ? raw : ""; } /** Checkbox/select truthiness: '1', 'true', 'on' → true. */ function bool(raw: FormDataEntryValue | null): boolean { const v = str(raw).trim().toLowerCase(); - return v === '1' || v === 'true' || v === 'on'; + return v === "1" || v === "true" || v === "on"; } // ── Radio settings (website_settings radio_* keys) ───────────────────────── @@ -37,9 +37,9 @@ function bool(raw: FormDataEntryValue | null): boolean { */ export async function saveRadioSetting(formData: FormData): Promise { await requireStaff(); - const key = str(formData.get('key')).trim().slice(0, 255); - const value = str(formData.get('value')); - const comment = str(formData.get('comment')).trim().slice(0, 255); + const key = str(formData.get("key")).trim().slice(0, 255); + const value = str(formData.get("value")); + const comment = str(formData.get("comment")).trim().slice(0, 255); if (!key) return; try { @@ -52,7 +52,7 @@ export async function saveRadioSetting(formData: FormData): Promise { } catch { // DB unavailable — fail soft so the action does not throw. } - revalidatePath('/admin/radio/settings'); + revalidatePath("/admin/radio/settings"); } /** @@ -62,11 +62,11 @@ export async function saveRadioSetting(formData: FormData): Promise { */ export async function saveRadioSettings(formData: FormData): Promise { await requireStaff(); - const keysRaw = str(formData.get('__keys')); + const keysRaw = str(formData.get("__keys")); const keys = keysRaw - .split(',') + .split(",") .map((k) => k.trim()) - .filter((k) => k.startsWith('radio_') || k.startsWith('auto_dj_')); + .filter((k) => k.startsWith("radio_") || k.startsWith("auto_dj_")); if (keys.length === 0) return; try { @@ -84,21 +84,21 @@ export async function saveRadioSettings(formData: FormData): Promise { } catch { // Fail soft. } - revalidatePath('/admin/radio/settings'); + revalidatePath("/admin/radio/settings"); } // ── Radio banners CRUD (radio_banners) ───────────────────────────────────── export async function createRadioBanner(formData: FormData): Promise { const staff = await requireStaff(); - const imagePath = str(formData.get('imagePath')).trim().slice(0, 255); + const imagePath = str(formData.get("imagePath")).trim().slice(0, 255); if (!imagePath) return; - const title = str(formData.get('title')).trim().slice(0, 255); - const description = str(formData.get('description')).trim(); - const sortOrderNum = Number(str(formData.get('sortOrder'))); + const title = str(formData.get("title")).trim().slice(0, 255); + const description = str(formData.get("description")).trim(); + const sortOrderNum = Number(str(formData.get("sortOrder"))); const sortOrder = Number.isFinite(sortOrderNum) ? Math.trunc(sortOrderNum) : 0; - const isActive = bool(formData.get('isActive')); + const isActive = bool(formData.get("isActive")); const now = new Date(); try { @@ -117,20 +117,20 @@ export async function createRadioBanner(formData: FormData): Promise { } catch { // Fail soft. } - revalidatePath('/admin/radio/banners'); + revalidatePath("/admin/radio/banners"); } export async function updateRadioBanner(formData: FormData): Promise { await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; - const imagePath = str(formData.get('imagePath')).trim().slice(0, 255); - const title = str(formData.get('title')).trim().slice(0, 255); - const description = str(formData.get('description')).trim(); - const sortOrderNum = Number(str(formData.get('sortOrder'))); + const imagePath = str(formData.get("imagePath")).trim().slice(0, 255); + const title = str(formData.get("title")).trim().slice(0, 255); + const description = str(formData.get("description")).trim(); + const sortOrderNum = Number(str(formData.get("sortOrder"))); const sortOrder = Number.isFinite(sortOrderNum) ? Math.trunc(sortOrderNum) : 0; - const isActive = bool(formData.get('isActive')); + const isActive = bool(formData.get("isActive")); if (!imagePath) return; try { @@ -148,31 +148,31 @@ export async function updateRadioBanner(formData: FormData): Promise { } catch { // Row may be gone; ignore. } - revalidatePath('/admin/radio/banners'); + revalidatePath("/admin/radio/banners"); } export async function deleteRadioBanner(formData: FormData): Promise { await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; try { await prisma.radioBanners.delete({ where: { id } }); } catch { // Already deleted; ignore. } - revalidatePath('/admin/radio/banners'); + revalidatePath("/admin/radio/banners"); } // ── Radio ranks CRUD (radio_ranks) ───────────────────────────────────────── export async function createRadioRank(formData: FormData): Promise { await requireStaff(); - const name = str(formData.get('name')).trim().slice(0, 255); + const name = str(formData.get("name")).trim().slice(0, 255); if (!name) return; - const description = str(formData.get('description')).trim().slice(0, 255); - const badgeCode = str(formData.get('badgeCode')).trim().slice(0, 255); - const isActive = bool(formData.get('isActive')); + const description = str(formData.get("description")).trim().slice(0, 255); + const badgeCode = str(formData.get("badgeCode")).trim().slice(0, 255); + const isActive = bool(formData.get("isActive")); const now = new Date(); try { @@ -189,18 +189,18 @@ export async function createRadioRank(formData: FormData): Promise { } catch { // Fail soft. } - revalidatePath('/admin/radio/ranks'); + revalidatePath("/admin/radio/ranks"); } export async function updateRadioRank(formData: FormData): Promise { await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; - const name = str(formData.get('name')).trim().slice(0, 255); - const description = str(formData.get('description')).trim().slice(0, 255); - const badgeCode = str(formData.get('badgeCode')).trim().slice(0, 255); - const isActive = bool(formData.get('isActive')); + const name = str(formData.get("name")).trim().slice(0, 255); + const description = str(formData.get("description")).trim().slice(0, 255); + const badgeCode = str(formData.get("badgeCode")).trim().slice(0, 255); + const isActive = bool(formData.get("isActive")); if (!name) return; try { @@ -217,17 +217,17 @@ export async function updateRadioRank(formData: FormData): Promise { } catch { // Row may be gone; ignore. } - revalidatePath('/admin/radio/ranks'); + revalidatePath("/admin/radio/ranks"); } export async function deleteRadioRank(formData: FormData): Promise { await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; try { await prisma.radioRanks.delete({ where: { id } }); } catch { // Already deleted; ignore. } - revalidatePath('/admin/radio/ranks'); + revalidatePath("/admin/radio/ranks"); } diff --git a/src/actions/admin-radio-moderation.ts b/src/actions/admin-radio-moderation.ts index 631e337f..d093dc0b 100644 --- a/src/actions/admin-radio-moderation.ts +++ b/src/actions/admin-radio-moderation.ts @@ -1,13 +1,13 @@ -'use server'; +"use server"; -import { revalidatePath } from 'next/cache'; -import { requireStaff } from '@/lib/admin/guard'; -import { logStaffActivity } from '@/lib/services/staff-activity'; -import { prisma } from '@/lib/prisma'; +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { prisma } from "@/lib/prisma"; /** Parse a FormData field into a positive BigInt id, or null when invalid. */ function parseId(raw: FormDataEntryValue | null): bigint | null { - if (typeof raw !== 'string' || raw.trim() === '') return null; + if (typeof raw !== "string" || raw.trim() === "") return null; try { const id = BigInt(raw.trim()); return id > 0n ? id : null; @@ -23,21 +23,21 @@ function parseId(raw: FormDataEntryValue | null): bigint | null { */ export async function deleteShout(formData: FormData): Promise { const staff = await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; try { await prisma.radioShouts.delete({ where: { id } }); await logStaffActivity({ staffId: staff.id, - action: 'radio.shout.delete', + action: "radio.shout.delete", description: `Deleted radio shout #${id}`, - targetType: 'radio_shout', + targetType: "radio_shout", targetId: Number(id), }); } catch { // Row may already be gone; ignore so the action does not throw. } - revalidatePath('/admin/radio/moderation'); + revalidatePath("/admin/radio/moderation"); } diff --git a/src/actions/admin-radio.ts b/src/actions/admin-radio.ts index 07a35fc1..908fe79e 100644 --- a/src/actions/admin-radio.ts +++ b/src/actions/admin-radio.ts @@ -1,27 +1 @@ -'use server'; - -import { revalidatePath } from 'next/cache'; -import { prisma } from '@/lib/prisma'; -import { requireStaff } from '@/lib/admin/guard'; - -export async function deleteShout(formData: FormData): Promise { - await requireStaff(); - - const raw = formData.get('id'); - if (typeof raw !== 'string' || raw.trim() === '') return; - - let id: bigint; - try { - id = BigInt(raw); - } catch { - return; - } - - try { - await prisma.radioShouts.delete({ where: { id } }); - } catch { - // Row may already be gone; ignore so the action does not throw. - } - - revalidatePath('/admin/radio'); -} +"use server"; diff --git a/src/actions/admin-rare-values.ts b/src/actions/admin-rare-values.ts index c9897038..5cdc0bde 100644 --- a/src/actions/admin-rare-values.ts +++ b/src/actions/admin-rare-values.ts @@ -7,8 +7,12 @@ import { formPositiveBigInt } from "@/lib/form-data"; export async function createCategory(formData: FormData): Promise { await requireStaff(); - const name = String(formData.get("name") ?? "").trim().slice(0, 255); - const badge = String(formData.get("badge") ?? "").trim().slice(0, 255); + const name = String(formData.get("name") ?? "") + .trim() + .slice(0, 255); + const badge = String(formData.get("badge") ?? "") + .trim() + .slice(0, 255); const priorityRaw = Number(formData.get("priority")); const priority = Number.isFinite(priorityRaw) && priorityRaw > 0 ? Math.floor(priorityRaw) : 1; if (!name || !badge) return; @@ -43,16 +47,27 @@ export async function createValue(formData: FormData): Promise { const categoryId = formPositiveBigInt(formData, "categoryId"); if (!categoryId) return; - const name = String(formData.get("name") ?? "").trim().slice(0, 255); - const furnitureIcon = String(formData.get("furnitureIcon") ?? "").trim().slice(0, 255); + const name = String(formData.get("name") ?? "") + .trim() + .slice(0, 255); + const furnitureIcon = String(formData.get("furnitureIcon") ?? "") + .trim() + .slice(0, 255); if (!name || !furnitureIcon) return; const itemIdRaw = Number(formData.get("itemId")); const itemId = Number.isFinite(itemIdRaw) && itemIdRaw > 0 ? Math.floor(itemIdRaw) : null; - const creditValueRaw = String(formData.get("creditValue") ?? "").trim().slice(0, 255); - const currencyValueRaw = String(formData.get("currencyValue") ?? "").trim().slice(0, 255); - const currencyType = String(formData.get("currencyType") ?? "diamonds").trim().slice(0, 255) || "diamonds"; + const creditValueRaw = String(formData.get("creditValue") ?? "") + .trim() + .slice(0, 255); + const currencyValueRaw = String(formData.get("currencyValue") ?? "") + .trim() + .slice(0, 255); + const currencyType = + String(formData.get("currencyType") ?? "diamonds") + .trim() + .slice(0, 255) || "diamonds"; try { await prisma.websiteRareValues.create({ diff --git a/src/actions/admin-settings.ts b/src/actions/admin-settings.ts index 7ba271d5..a45d90ba 100644 --- a/src/actions/admin-settings.ts +++ b/src/actions/admin-settings.ts @@ -17,9 +17,13 @@ export async function updateSetting(formData: FormData): Promise { export async function createSetting(formData: FormData): Promise { await requireStaff(); - const key = String(formData.get("key") ?? "").trim().slice(0, 255); + const key = String(formData.get("key") ?? "") + .trim() + .slice(0, 255); const value = String(formData.get("value") ?? ""); - const comment = String(formData.get("comment") ?? "").trim().slice(0, 255); + const comment = String(formData.get("comment") ?? "") + .trim() + .slice(0, 255); if (!key) return; await prisma.websiteSetting.upsert({ where: { key }, diff --git a/src/actions/admin-shop.ts b/src/actions/admin-shop.ts index a3c84bc2..dfe1ff90 100644 --- a/src/actions/admin-shop.ts +++ b/src/actions/admin-shop.ts @@ -30,7 +30,9 @@ function reqUInt(formData: FormData, key: string): number { export async function createShopArticle(formData: FormData): Promise { const staff = await requireStaff(); - const name = String(formData.get("name") ?? "").trim().slice(0, 255); + const name = String(formData.get("name") ?? "") + .trim() + .slice(0, 255); if (!name) return; const now = new Date(); @@ -38,15 +40,24 @@ export async function createShopArticle(formData: FormData): Promise { const created = await prisma.websiteShopArticles.create({ data: { name, - info: String(formData.get("info") ?? "").trim().slice(0, 255), - iconUrl: String(formData.get("icon") ?? "").trim().slice(0, 255), - color: String(formData.get("color") ?? "").trim().slice(0, 255), + info: String(formData.get("info") ?? "") + .trim() + .slice(0, 255), + iconUrl: String(formData.get("icon") ?? "") + .trim() + .slice(0, 255), + color: String(formData.get("color") ?? "") + .trim() + .slice(0, 255), costs: reqUInt(formData, "costs"), giveRank: optUInt(formData, "giveRank"), credits: optUInt(formData, "credits"), duckets: optUInt(formData, "duckets"), diamonds: optUInt(formData, "diamonds"), - badges: (String(formData.get("badges") ?? "").trim().slice(0, 255)) || null, + badges: + String(formData.get("badges") ?? "") + .trim() + .slice(0, 255) || null, position: reqUInt(formData, "position"), createdAt: now, updatedAt: now, @@ -74,7 +85,9 @@ export async function updateShopArticle(formData: FormData): Promise { const id = formPositiveBigInt(formData, "id"); if (!id) return; - const name = String(formData.get("name") ?? "").trim().slice(0, 255); + const name = String(formData.get("name") ?? "") + .trim() + .slice(0, 255); if (!name) return; try { @@ -82,15 +95,24 @@ export async function updateShopArticle(formData: FormData): Promise { where: { id }, data: { name, - info: String(formData.get("info") ?? "").trim().slice(0, 255), - iconUrl: String(formData.get("icon") ?? "").trim().slice(0, 255), - color: String(formData.get("color") ?? "").trim().slice(0, 255), + info: String(formData.get("info") ?? "") + .trim() + .slice(0, 255), + iconUrl: String(formData.get("icon") ?? "") + .trim() + .slice(0, 255), + color: String(formData.get("color") ?? "") + .trim() + .slice(0, 255), costs: reqUInt(formData, "costs"), giveRank: optUInt(formData, "giveRank"), credits: optUInt(formData, "credits"), duckets: optUInt(formData, "duckets"), diamonds: optUInt(formData, "diamonds"), - badges: (String(formData.get("badges") ?? "").trim().slice(0, 255)) || null, + badges: + String(formData.get("badges") ?? "") + .trim() + .slice(0, 255) || null, position: reqUInt(formData, "position"), updatedAt: new Date(), }, diff --git a/src/actions/admin-tags.ts b/src/actions/admin-tags.ts index 67a90513..004fbb08 100644 --- a/src/actions/admin-tags.ts +++ b/src/actions/admin-tags.ts @@ -1,15 +1,15 @@ -'use server'; +"use server"; -import { revalidatePath } from 'next/cache'; -import { requireStaff } from '@/lib/admin/guard'; -import { prisma } from '@/lib/prisma'; -import { logStaffActivity } from '@/lib/services/staff-activity'; +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; // ── Helpers ──────────────────────────────────────────────────────────────── /** Parse a FormData field into a positive BigInt id, or null when invalid. */ function parseId(raw: FormDataEntryValue | null): bigint | null { - if (typeof raw !== 'string' || raw.trim() === '') return null; + if (typeof raw !== "string" || raw.trim() === "") return null; try { const id = BigInt(raw.trim()); return id > 0n ? id : null; @@ -19,23 +19,23 @@ function parseId(raw: FormDataEntryValue | null): bigint | null { } function str(raw: FormDataEntryValue | null): string { - return typeof raw === 'string' ? raw : ''; + return typeof raw === "string" ? raw : ""; } /** Normalise a hex-ish colour into the 10-char background_color column. */ function normaliseColor(raw: string): string { const v = raw.trim().slice(0, 10); - return v || '#888888'; + return v || "#888888"; } // ── Tags CRUD (tags + taggables, AtomCMS article tags/categories) ────────── export async function createTag(formData: FormData): Promise { const staff = await requireStaff(); - const name = str(formData.get('name')).trim().slice(0, 255); + const name = str(formData.get("name")).trim().slice(0, 255); if (!name) return; - const backgroundColor = normaliseColor(str(formData.get('backgroundColor'))); + const backgroundColor = normaliseColor(str(formData.get("backgroundColor"))); const now = new Date(); try { @@ -44,24 +44,24 @@ export async function createTag(formData: FormData): Promise { }); await logStaffActivity({ staffId: staff.id, - action: 'tag_create', + action: "tag_create", description: `Created tag "${name}" (#${created.id})`, - targetType: 'tag', + targetType: "tag", targetId: Number(created.id), }); } catch { // Fail soft — DB unavailable or duplicate. } - revalidatePath('/admin/tags'); + revalidatePath("/admin/tags"); } export async function updateTag(formData: FormData): Promise { const staff = await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; - const name = str(formData.get('name')).trim().slice(0, 255); - const backgroundColor = normaliseColor(str(formData.get('backgroundColor'))); + const name = str(formData.get("name")).trim().slice(0, 255); + const backgroundColor = normaliseColor(str(formData.get("backgroundColor"))); if (!name) return; try { @@ -71,20 +71,20 @@ export async function updateTag(formData: FormData): Promise { }); await logStaffActivity({ staffId: staff.id, - action: 'tag_update', + action: "tag_update", description: `Updated tag #${id} → "${name}"`, - targetType: 'tag', + targetType: "tag", targetId: Number(id), }); } catch { // Row may be gone; ignore. } - revalidatePath('/admin/tags'); + revalidatePath("/admin/tags"); } export async function deleteTag(formData: FormData): Promise { const staff = await requireStaff(); - const id = parseId(formData.get('id')); + const id = parseId(formData.get("id")); if (id === null) return; try { @@ -95,13 +95,13 @@ export async function deleteTag(formData: FormData): Promise { ]); await logStaffActivity({ staffId: staff.id, - action: 'tag_delete', + action: "tag_delete", description: `Deleted tag #${id}`, - targetType: 'tag', + targetType: "tag", targetId: Number(id), }); } catch { // Already deleted; ignore. } - revalidatePath('/admin/tags'); + revalidatePath("/admin/tags"); } diff --git a/src/actions/admin-vouchers.ts b/src/actions/admin-vouchers.ts index b5f02ed3..fa818b6b 100644 --- a/src/actions/admin-vouchers.ts +++ b/src/actions/admin-vouchers.ts @@ -9,7 +9,9 @@ import { logServerError } from "@/lib/server-log"; export async function createVoucher(formData: FormData): Promise { await requireStaff(); - const code = String(formData.get("code") ?? "").trim().slice(0, 255); + const code = String(formData.get("code") ?? "") + .trim() + .slice(0, 255); const amount = Number(formData.get("amount")); const maxUsesRaw = Number(formData.get("maxUses")); const maxUses = Number.isFinite(maxUsesRaw) && maxUsesRaw > 0 ? Math.floor(maxUsesRaw) : 1; diff --git a/src/actions/admin-vpn.ts b/src/actions/admin-vpn.ts index 711ffb15..6a9db60e 100644 --- a/src/actions/admin-vpn.ts +++ b/src/actions/admin-vpn.ts @@ -29,11 +29,17 @@ export async function saveVpn(formData: FormData): Promise { // Toggle: an unchecked checkbox submits nothing, so absence === disabled. const enabled = String(formData.get("vpn_block_enabled") ?? "").trim() !== ""; - const providerRaw = String(formData.get("vpn_provider") ?? "").trim().toLowerCase(); + const providerRaw = String(formData.get("vpn_provider") ?? "") + .trim() + .toLowerCase(); const provider = ALLOWED_PROVIDERS.has(providerRaw) ? providerRaw : "none"; - const apiKey = String(formData.get("vpn_api_key") ?? "").trim().slice(0, 255); - const blockMessage = String(formData.get("vpn_block_message") ?? "").trim().slice(0, 255); + const apiKey = String(formData.get("vpn_api_key") ?? "") + .trim() + .slice(0, 255); + const blockMessage = String(formData.get("vpn_block_message") ?? "") + .trim() + .slice(0, 255); try { await writeSetting( diff --git a/src/actions/admin-wordfilter.ts b/src/actions/admin-wordfilter.ts index 0b34fc8d..a3265835 100644 --- a/src/actions/admin-wordfilter.ts +++ b/src/actions/admin-wordfilter.ts @@ -7,7 +7,9 @@ import { rcon } from "@/lib/services/rcon"; export async function addWord(formData: FormData): Promise { await requireStaff(); - const word = String(formData.get("word") ?? "").trim().slice(0, 255); + const word = String(formData.get("word") ?? "") + .trim() + .slice(0, 255); if (!word) return; try { diff --git a/src/actions/admin-writeable-boxes.ts b/src/actions/admin-writeable-boxes.ts index c45f0a96..627f3ce2 100644 --- a/src/actions/admin-writeable-boxes.ts +++ b/src/actions/admin-writeable-boxes.ts @@ -38,7 +38,9 @@ function revalidate(): void { export async function createBox(formData: FormData): Promise { const staff = await requireStaff(); - const title = String(formData.get("title") ?? "").trim().slice(0, 255); + const title = String(formData.get("title") ?? "") + .trim() + .slice(0, 255); if (!title) return; const now = new Date(); @@ -46,7 +48,10 @@ export async function createBox(formData: FormData): Promise { const created = await prisma.websiteWriteableBoxes.create({ data: { title, - icon: (String(formData.get("icon") ?? "").trim().slice(0, 255)) || null, + icon: + String(formData.get("icon") ?? "") + .trim() + .slice(0, 255) || null, content: String(formData.get("content") ?? ""), position: reqInt(formData, "position"), isActive: String(formData.get("isActive") ?? "") === "1", @@ -75,7 +80,9 @@ export async function updateBox(formData: FormData): Promise { const id = parseId(formData); if (id == null) return; - const title = String(formData.get("title") ?? "").trim().slice(0, 255); + const title = String(formData.get("title") ?? "") + .trim() + .slice(0, 255); if (!title) return; try { @@ -83,7 +90,10 @@ export async function updateBox(formData: FormData): Promise { where: { id }, data: { title, - icon: (String(formData.get("icon") ?? "").trim().slice(0, 255)) || null, + icon: + String(formData.get("icon") ?? "") + .trim() + .slice(0, 255) || null, content: String(formData.get("content") ?? ""), position: reqInt(formData, "position"), isActive: String(formData.get("isActive") ?? "") === "1", diff --git a/src/actions/applications.ts b/src/actions/applications.ts index f6075799..1c2160ed 100644 --- a/src/actions/applications.ts +++ b/src/actions/applications.ts @@ -28,7 +28,9 @@ export async function applyStaff(formData: FormData): Promise { const rankId = Number(formData.get("rankId")); if (!Number.isInteger(rankId) || rankId <= 0) return; - const content = String(formData.get("content") ?? "").trim().slice(0, CONTENT_MAX); + const content = String(formData.get("content") ?? "") + .trim() + .slice(0, CONTENT_MAX); if (content.length < CONTENT_MIN) return; try { @@ -70,7 +72,9 @@ export async function applyTeam(formData: FormData): Promise { const rankId = Number(formData.get("teamId")); if (!Number.isInteger(rankId) || rankId <= 0) return; - const content = String(formData.get("content") ?? "").trim().slice(0, CONTENT_MAX); + const content = String(formData.get("content") ?? "") + .trim() + .slice(0, CONTENT_MAX); if (content.length < CONTENT_MIN) return; try { diff --git a/src/actions/article-comments.ts b/src/actions/article-comments.ts index 9f157179..732ea4d8 100644 --- a/src/actions/article-comments.ts +++ b/src/actions/article-comments.ts @@ -21,7 +21,9 @@ export async function postComment(formData: FormData): Promise { const userId = Number(session.user.id); if (!Number.isFinite(userId)) return; - const comment = String(formData.get("comment") ?? "").trim().slice(0, COMMENT_MAX); + const comment = String(formData.get("comment") ?? "") + .trim() + .slice(0, COMMENT_MAX); if (!comment) return; // Block filtered/AI-flagged content before it touches the DB (fail-open). diff --git a/src/actions/article-reactions.ts b/src/actions/article-reactions.ts index eadd40b3..bb681816 100644 --- a/src/actions/article-reactions.ts +++ b/src/actions/article-reactions.ts @@ -31,7 +31,9 @@ export async function toggleReaction(formData: FormData): Promise { const userId = Number(session.user.id); if (!Number.isFinite(userId)) return; - const reaction = String(formData.get("reaction") ?? "").trim().toLowerCase(); + const reaction = String(formData.get("reaction") ?? "") + .trim() + .toLowerCase(); if (!ALLOWED_REACTIONS.has(reaction)) return; const articleIdRaw = String(formData.get("articleId") ?? "").trim(); diff --git a/src/actions/auth-precheck.ts b/src/actions/auth-precheck.ts index ea00871f..98699068 100644 --- a/src/actions/auth-precheck.ts +++ b/src/actions/auth-precheck.ts @@ -11,10 +11,7 @@ export type PrecheckResult = "ok" | "invalid" | "twofactor"; * Validates username+password WITHOUT creating a session, and reports whether a * TOTP code is still required. Lets the login form do the two-step 2FA flow. */ -export async function precheckLogin( - username: string, - password: string, -): Promise { +export async function precheckLogin(username: string, password: string): Promise { const u = String(username ?? "").trim(); const p = String(password ?? ""); if (!u || !p) return "invalid"; @@ -32,11 +29,9 @@ export async function precheckLogin( } if (!user) { // Prevent timing-based enumeration: always run a dummy hash check. - await checkLogin( - p, - "$2y$12$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcd", - { convertPasswords: false }, - ); + await checkLogin(p, "$2y$12$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcd", { + convertPasswords: false, + }); return "invalid"; } diff --git a/src/actions/badges.ts b/src/actions/badges.ts new file mode 100644 index 00000000..3d28e087 --- /dev/null +++ b/src/actions/badges.ts @@ -0,0 +1,25 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; + +export async function getBadgeData({ code }: { code: string }) { + await requireStaff(); + const badge = await prisma.websiteBadges.findUnique({ + where: { badgeKey: code }, + select: { badgeName: true, badgeDescription: true }, + }); + if (!badge) return { ok: false as const, data: null }; + return { ok: true as const, data: { name: badge.badgeName, desc: badge.badgeDescription } }; +} + +export async function updateBadge({ code, name, desc }: { code: string; name: string; desc: string }) { + await requireStaff(); + await prisma.websiteBadges.upsert({ + where: { badgeKey: code }, + update: { badgeName: name, badgeDescription: desc, updatedAt: new Date() }, + create: { badgeKey: code, badgeName: name, badgeDescription: desc, createdAt: new Date(), updatedAt: new Date() }, + }); + revalidatePath("/admin/import/badges"); +} diff --git a/src/actions/bulk-users.ts b/src/actions/bulk-users.ts new file mode 100644 index 00000000..a5b76bf0 --- /dev/null +++ b/src/actions/bulk-users.ts @@ -0,0 +1,128 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { rcon } from "@/lib/services/rcon"; +import { logStaffActivity } from "@/lib/services/staff-activity"; + +export async function bulkUnban({ userIds }: { userIds: number[] }) { + const staff = await requireStaff(); + const result = await prisma.ban.deleteMany({ where: { userId: { in: userIds } } }); + await logStaffActivity({ + staffId: staff.id, + action: "bulk_unban", + description: `Unbanned ${result.count} user(s)`, + targetType: "user", + }); + return { ok: true as const, data: { unbanned: result.count, total: userIds.length } }; +} + +export async function bulkBan({ userIds, reason, duration }: { userIds: number[]; reason: string; duration: number }) { + const staff = await requireStaff(); + const now = Math.floor(Date.now() / 1000); + let banned = 0; + + for (const userId of userIds) { + try { + await prisma.ban.create({ + data: { + userId, + ip: "", + machineId: "", + userStaffId: staff.id, + timestamp: now, + banExpire: duration > 0 ? now + duration : 0, + banReason: reason, + type: "account", + }, + }); + banned++; + } catch { + // skip duplicates + } + } + + await logStaffActivity({ + staffId: staff.id, + action: "bulk_ban", + description: `Banned ${banned} user(s)`, + targetType: "user", + }); + return { ok: true as const, data: { banned } }; +} + +export async function bulkGiveCurrency({ userIds, amount, type }: { userIds: number[]; amount: number; type: "credits" | "pixels" | "points" }) { + const staff = await requireStaff(); + let given = 0; + const failedIds: Array<{ userId: number; reason: string }> = []; + + for (const userId of userIds) { + try { + if (type === "credits") { + await prisma.user.update({ where: { id: userId }, data: { credits: { increment: amount } } }); + await rcon.giveCredits(userId, amount); + } else if (type === "pixels") { + await prisma.usersCurrency.upsert({ + where: { userId_type: { userId, type: 0 } }, + update: { amount: { increment: amount } }, + create: { userId, type: 0, amount }, + }); + await rcon.giveDuckets(userId, amount); + } else if (type === "points") { + await prisma.usersCurrency.upsert({ + where: { userId_type: { userId, type: 101 } }, + update: { amount: { increment: amount } }, + create: { userId, type: 101, amount }, + }); + await rcon.givePointsGotw(userId, amount); + } + given++; + } catch { + failedIds.push({ userId, reason: "Database error" }); + } + } + + await logStaffActivity({ + staffId: staff.id, + action: "bulk_give_currency", + description: `Gave ${amount} ${type} to ${given} user(s)`, + targetType: "user", + }); + return { ok: true as const, data: { given, total: userIds.length, failedIds } }; +} + +export async function bulkGiveBadge({ userIds, badgeCode }: { userIds: number[]; badgeCode: string }) { + const staff = await requireStaff(); + let given = 0; + const failedIds: Array<{ userId: number; reason: string }> = []; + + for (const userId of userIds) { + try { + const existing = await prisma.usersBadges.findFirst({ + where: { userId, badgeCode }, + select: { id: true }, + }); + if (!existing) { + const max = await prisma.usersBadges.aggregate({ + where: { userId }, + _max: { slotId: true }, + }); + const slotId = (max._max.slotId ?? 0) + 1; + await prisma.usersBadges.create({ data: { userId, slotId, badgeCode } }); + await rcon.giveBadge(userId, badgeCode); + } + given++; + } catch { + failedIds.push({ userId, reason: "Database error" }); + } + } + + await logStaffActivity({ + staffId: staff.id, + action: "bulk_give_badge", + description: `Gave badge "${badgeCode}" to ${given} user(s)`, + targetType: "user", + }); + return { ok: true as const, data: { given, total: userIds.length, failedIds } }; +} diff --git a/src/actions/catalog-bc.ts b/src/actions/catalog-bc.ts new file mode 100644 index 00000000..442f106f --- /dev/null +++ b/src/actions/catalog-bc.ts @@ -0,0 +1,100 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { rcon } from "@/lib/services/rcon"; +import { logStaffActivity } from "@/lib/services/staff-activity"; + +export async function updateBcPage({ id, ...fields }: { id: number } & Record) { + const staff = await requireStaff(); + await prisma.catalogPagesBc.update({ where: { id }, data: fields as any }); + await rcon.updateCatalog(); + await logStaffActivity({ + staffId: staff.id, + action: "bc_page_update", + description: `Updated BC catalog page #${id}`, + targetType: "catalog_page_bc", + targetId: id, + }); + revalidatePath("/admin/catalog/builder-club"); +} + +export async function deleteBcItem({ id }: { id: number }) { + const staff = await requireStaff(); + await prisma.catalogItemsBc.delete({ where: { id } }); + await logStaffActivity({ + staffId: staff.id, + action: "bc_item_delete", + description: `Deleted BC catalog item #${id}`, + targetType: "catalog_item_bc", + targetId: id, + }); + revalidatePath("/admin/catalog/builder-club"); +} + +export async function updateBcItem({ id, ...data }: { id: number; itemIds?: string; catalogName?: string; orderNumber?: number; extradata?: string }) { + const staff = await requireStaff(); + await prisma.catalogItemsBc.update({ where: { id }, data: data as any }); + await logStaffActivity({ + staffId: staff.id, + action: "bc_item_update", + description: `Updated BC catalog item #${id}`, + targetType: "catalog_item_bc", + targetId: id, + }); + revalidatePath("/admin/catalog/builder-club"); +} + +export async function createBcItem({ pageId, ...data }: { pageId: number; itemIds: string; catalogName: string; orderNumber: number; extradata: string }) { + const staff = await requireStaff(); + const created = await prisma.catalogItemsBc.create({ + data: { pageId, ...data }, + }); + await logStaffActivity({ + staffId: staff.id, + action: "bc_item_create", + description: `Created BC catalog item #${created.id}`, + targetType: "catalog_item_bc", + targetId: created.id, + }); + revalidatePath("/admin/catalog/builder-club"); +} + +export async function toggleBcPage({ id, field }: { id: number; field: "enabled" | "visible" }) { + await requireStaff(); + const page = await prisma.catalogPagesBc.findUnique({ where: { id }, select: { enabled: true, visible: true } }); + if (!page) return; + await prisma.catalogPagesBc.update({ + where: { id }, + data: { [field]: page[field] === "1" ? "0" : "1" }, + }); + revalidatePath("/admin/catalog/builder-club"); +} + +export async function createBcPage(input: { caption: string; parentId: number; pageLayout: string }) { + const staff = await requireStaff(); + const created = await prisma.catalogPagesBc.create({ + data: { + caption: input.caption, + parentId: input.parentId, + pageLayout: input.pageLayout, + iconColor: 0, + iconImage: 0, + orderNum: 0, + visible: "1", + enabled: "1", + pageHeadline: "", + pageTeaser: "", + }, + }); + await logStaffActivity({ + staffId: staff.id, + action: "bc_page_create", + description: `Created BC catalog page "${input.caption}"`, + targetType: "catalog_page_bc", + targetId: created.id, + }); + revalidatePath("/admin/catalog/builder-club"); + return { ok: true as const, data: { id: created.id } }; +} diff --git a/src/actions/catalog-items.ts b/src/actions/catalog-items.ts new file mode 100644 index 00000000..ef349e7d --- /dev/null +++ b/src/actions/catalog-items.ts @@ -0,0 +1,126 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { rcon } from "@/lib/services/rcon"; +import { logStaffActivity } from "@/lib/services/staff-activity"; + +export async function createCatalogItem(data: { + pageId: number; + itemIds: string; + catalogName: string; + costCredits: number; + costPoints: number; + pointsType: number; + amount: number; + orderNumber: number; + offerId: number; + limitedSells: number; + limitedStack: number; + extradata: string; + songId: number; + haveOffer: "0" | "1"; + clubOnly: "0" | "1"; +}) { + const staff = await requireStaff(); + const created = await prisma.catalogItems.create({ data }); + await rcon.updateCatalog(); + await logStaffActivity({ + staffId: staff.id, + action: "catalog_item_create", + description: `Created catalog item #${created.id}`, + targetType: "catalog_item", + targetId: created.id, + }); + revalidatePath("/admin/catalog"); +} + +export async function deleteCatalogItems({ ids }: { ids: number[] }) { + const staff = await requireStaff(); + await prisma.catalogItems.deleteMany({ where: { id: { in: ids } } }); + await rcon.updateCatalog(); + await logStaffActivity({ + staffId: staff.id, + action: "catalog_items_delete", + description: `Deleted catalog items: ${ids.join(", ")}`, + targetType: "catalog_item", + }); + revalidatePath("/admin/catalog"); +} + +export async function moveCatalogItems({ ids, targetPageId }: { ids: number[]; targetPageId: number }) { + await requireStaff(); + await prisma.catalogItems.updateMany({ + where: { id: { in: ids } }, + data: { pageId: targetPageId }, + }); + await rcon.updateCatalog(); + revalidatePath("/admin/catalog"); +} + +export async function reorderCatalogItems({ orders }: { orders: Array<{ id: number; orderNumber: number }> }) { + await requireStaff(); + for (const { id, orderNumber } of orders) { + await prisma.catalogItems.update({ where: { id }, data: { orderNumber } }); + } + await rcon.updateCatalog(); + revalidatePath("/admin/catalog"); +} + +export async function updateCatalogItem({ id, catalogFields, baseItem }: { id: number; catalogFields: Record; baseItem?: { id: number; fields: Record } }) { + const staff = await requireStaff(); + await prisma.catalogItems.update({ where: { id }, data: catalogFields as any }); + if (baseItem) { + await prisma.itemsBase.update({ where: { id: baseItem.id }, data: baseItem.fields as any }); + } + await rcon.updateCatalog(); + await logStaffActivity({ + staffId: staff.id, + action: "catalog_item_update", + description: `Updated catalog item #${id}`, + targetType: "catalog_item", + targetId: id, + }); + revalidatePath("/admin/catalog"); +} + +export async function translateCatalogItems({ items }: { items: Array<{ id: number; publicName: string; description: string }> }) { + await requireStaff(); + let namesUpdated = 0; + let descriptionsUpdated = 0; + let furniDataUpdated = 0; + let furniDataInserted = 0; + + for (const item of items) { + const existing = await prisma.catalogItems.findUnique({ where: { id: item.id }, select: { catalogName: true } }); + if (!existing) continue; + + if (item.publicName && item.publicName !== existing.catalogName) { + await prisma.catalogItems.update({ + where: { id: item.id }, + data: { catalogName: item.publicName }, + }); + namesUpdated++; + } + + if (item.description) { + const baseItem = await prisma.itemsBase.findFirst({ + where: { itemName: existing.catalogName }, + select: { id: true, publicName: true }, + }); + if (baseItem) { + await prisma.itemsBase.update({ + where: { id: baseItem.id }, + data: { publicName: item.publicName || baseItem.publicName }, + }); + furniDataUpdated++; + } + descriptionsUpdated++; + } + } + + await rcon.updateCatalog(); + revalidatePath("/admin/catalog"); + return { ok: true as const, data: { namesUpdated, descriptionsUpdated, furniDataUpdated, furniDataInserted: 0, updated: items.length } }; +} diff --git a/src/actions/catalog.ts b/src/actions/catalog.ts new file mode 100644 index 00000000..6a4fa93d --- /dev/null +++ b/src/actions/catalog.ts @@ -0,0 +1,80 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { rcon } from "@/lib/services/rcon"; +import { logStaffActivity } from "@/lib/services/staff-activity"; + +export async function updateCatalogPage({ id, ...fields }: { id: number } & Record) { + const staff = await requireStaff(); + await prisma.catalogPages.update({ where: { id }, data: fields as any }); + await rcon.updateCatalog(); + await logStaffActivity({ + staffId: staff.id, + action: "catalog_page_update", + description: `Updated catalog page #${id}`, + targetType: "catalog_page", + targetId: id, + }); + revalidatePath("/admin/catalog"); +} + +export async function deleteCatalogPage({ id }: { id: number }) { + const staff = await requireStaff(); + await prisma.catalogPages.delete({ where: { id } }); + await rcon.updateCatalog(); + await logStaffActivity({ + staffId: staff.id, + action: "catalog_page_delete", + description: `Deleted catalog page #${id}`, + targetType: "catalog_page", + targetId: id, + }); + revalidatePath("/admin/catalog"); +} + +export async function toggleCatalogPage({ id, action }: { id: number; action: "toggleEnabled" | "toggleVisible" }) { + await requireStaff(); + const page = await prisma.catalogPages.findUnique({ where: { id }, select: { enabled: true, visible: true } }); + if (!page) return; + const field = action === "toggleEnabled" ? "enabled" : "visible"; + const current = action === "toggleEnabled" ? page.enabled : page.visible; + await prisma.catalogPages.update({ + where: { id }, + data: { [field]: current === "1" ? "0" : "1" }, + }); + revalidatePath("/admin/catalog"); +} + +export async function createCatalogPage(input: { caption: string; parentId: number; pageLayout: string }) { + const staff = await requireStaff(); + const created = await prisma.catalogPages.create({ + data: { + caption: input.caption, + parentId: input.parentId, + pageLayout: input.pageLayout, + captionSave: input.caption.slice(0, 25), + iconColor: 0, + iconImage: 0, + minRank: 1, + orderNum: 0, + visible: "1", + enabled: "1", + clubOnly: "0", + vipOnly: "0", + pageHeadline: "", + pageTeaser: "", + includes: "", + }, + }); + await logStaffActivity({ + staffId: (await requireStaff()).id, + action: "catalog_page_create", + description: `Created catalog page "${input.caption}"`, + targetType: "catalog_page", + targetId: created.id, + }); + revalidatePath("/admin/catalog"); + return { ok: true as const, data: { id: created.id } }; +} diff --git a/src/actions/commandocentrum.ts b/src/actions/commandocentrum.ts index ee45c023..064fa159 100644 --- a/src/actions/commandocentrum.ts +++ b/src/actions/commandocentrum.ts @@ -42,7 +42,9 @@ export async function updateNavigator(): Promise { /** Broadcast a hotel-wide alert to every connected user (rcon: hotelalert). */ export async function hotelAlert(formData: FormData): Promise { await requireStaff(); - const message = String(formData.get("message") ?? "").trim().slice(0, 512); + const message = String(formData.get("message") ?? "") + .trim() + .slice(0, 512); if (!message) return; try { await rcon.send("hotelalert", { message }); @@ -70,7 +72,9 @@ export async function disconnectUser(formData: FormData): Promise { export async function alertUser(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); - const message = String(formData.get("message") ?? "").trim().slice(0, 512); + const message = String(formData.get("message") ?? "") + .trim() + .slice(0, 512); if (!userId || !message) return; try { await rcon.alertUser(userId, message); @@ -154,7 +158,9 @@ export async function giveBadge(formData: FormData): Promise { export async function setMotto(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); - const motto = String(formData.get("motto") ?? "").trim().slice(0, 127); + const motto = String(formData.get("motto") ?? "") + .trim() + .slice(0, 127); if (!userId || !motto) return; try { await rcon.setMotto(userId, motto); @@ -197,7 +203,9 @@ export async function sendGift(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const itemId = Number(formData.get("itemId")); - const message = String(formData.get("message") ?? "Here is a gift.").trim().slice(0, 255); + const message = String(formData.get("message") ?? "Here is a gift.") + .trim() + .slice(0, 255); if (!userId || !itemId) return; try { await rcon.sendGift(userId, itemId, message); diff --git a/src/actions/draw-badge.ts b/src/actions/draw-badge.ts index e64b888d..831e6ef7 100644 --- a/src/actions/draw-badge.ts +++ b/src/actions/draw-badge.ts @@ -6,6 +6,7 @@ import { auth } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; import { rcon } from "@/lib/services/rcon"; import { siteSettings } from "@/lib/services/site-settings"; +import type { Prisma } from "@/generated/prisma/client"; /** * Buy a published community-drawn badge for the SIGNED-IN user. Faithful to @@ -78,41 +79,34 @@ export async function buyBadge(formData: FormData): Promise { if (!buyer || buyer.credits < price) { outcome = "credits"; } else { - // Deduct first, then grant. sendCurrency falls back to a direct DB - // write when RCON is offline; a negative amount is not supported, so - // the debit is an atomic credits decrement and the credit (grant) is - // the badge itself. + // Atomically deduct credits and persist the badge so a failure + // between the two operations cannot orphan the user. if (price > 0) { - await prisma.user.update({ - where: { id: userId }, - data: { credits: { decrement: price } }, + await prisma.$transaction(async (tx: Prisma.TransactionClient) => { + await tx.user.update({ + where: { id: userId }, + data: { credits: { decrement: price } }, + }); + + const existing = await tx.usersBadges.findFirst({ + where: { userId, badgeCode: code }, + select: { id: true }, + }); + if (!existing) { + const max = await tx.usersBadges.aggregate({ + where: { userId }, + _max: { slotId: true }, + }); + const slotId = (max._max.slotId ?? 0) + 1; + await tx.usersBadges.create({ + data: { userId, slotId, badgeCode: code }, + }); + } }); } // Grant the badge live so it appears immediately for online users. - await rcon.giveBadge(userId, code); - - // Persist it so it survives a relog / offline grant. users_badges has - // no unique (user_id, badge_code) constraint, so guard duplicates and - // compute the next free slot ourselves (mirrors admin giveBadge). - try { - const existing = await prisma.usersBadges.findFirst({ - where: { userId, badgeCode: code }, - select: { id: true }, - }); - if (!existing) { - const max = await prisma.usersBadges.aggregate({ - where: { userId }, - _max: { slotId: true }, - }); - const slotId = (max._max.slotId ?? 0) + 1; - await prisma.usersBadges.create({ - data: { userId, slotId, badgeCode: code }, - }); - } - } catch { - // Best-effort: the RCON grant already succeeded for online users. - } + await rcon.giveBadge(userId, code).catch(() => {}); outcome = "bought"; boughtCode = code; diff --git a/src/actions/email-verify.ts b/src/actions/email-verify.ts index 5d972a71..141400a6 100644 --- a/src/actions/email-verify.ts +++ b/src/actions/email-verify.ts @@ -31,10 +31,7 @@ export async function verificationToken(email: string): Promise { * Constant-time check that `token` matches the expected digest for `email`. * Returns false on any length/format mismatch rather than throwing. */ -export async function isValidVerificationToken( - email: string, - token: string, -): Promise { +export async function isValidVerificationToken(email: string, token: string): Promise { if (!email || !token || !/^[a-f0-9]{64}$/i.test(token)) return false; const expected = await verificationToken(email); const a = Buffer.from(expected, "utf8"); @@ -45,18 +42,15 @@ export async function isValidVerificationToken( /** * Build the verification link + email and send it. No-ops gracefully when SMTP - * is unconfigured (sendMail returns false). `userId` is accepted for a faithful - * call signature, but the stateless token only needs the email. + * is unconfigured (sendMail returns false). */ -export async function sendVerification(userId: number, email: string): Promise { +export async function sendVerification(email: string): Promise { const normalised = email.trim().toLowerCase(); if (!normalised) return false; const token = await verificationToken(normalised); const base = env.APP_URL.replace(/\/+$/, ""); - const link = `${base}/verify?token=${encodeURIComponent(token)}&email=${encodeURIComponent( - normalised, - )}`; + const link = `${base}/verify?token=${encodeURIComponent(token)}&email=${encodeURIComponent(normalised)}`; const hotelName = (await siteSettings.get("hotel_name", env.HOTEL_NAME)) ?? env.HOTEL_NAME; @@ -75,16 +69,9 @@ export async function sendVerification(userId: number, email: string): Promise `.trim(); - // `userId` referenced so a faithful caller signature isn't flagged unused. - void userId; - return sendMail(normalised, `Verify your email · ${hotelName}`, html); } function escapeHtml(s: string): string { - return s - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """); + return s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); } diff --git a/src/actions/guestbook.ts b/src/actions/guestbook.ts index 1259dbfc..70412953 100644 --- a/src/actions/guestbook.ts +++ b/src/actions/guestbook.ts @@ -25,7 +25,9 @@ export async function postGuestbook(formData: FormData): Promise { const profileId = Number(formData.get("profileId")); if (!Number.isInteger(profileId) || profileId <= 0) return; - const message = String(formData.get("message") ?? "").trim().slice(0, MESSAGE_MAX); + const message = String(formData.get("message") ?? "") + .trim() + .slice(0, MESSAGE_MAX); if (!message) return; // Block filtered/AI-flagged content before it touches the DB (fail-open). diff --git a/src/actions/help-tickets.ts b/src/actions/help-tickets.ts index 0ddff484..101e644c 100644 --- a/src/actions/help-tickets.ts +++ b/src/actions/help-tickets.ts @@ -22,8 +22,12 @@ export async function createTicket(formData: FormData): Promise { if (!(await rateLimit(`ticket:${userId}`, 3, 60_000)).ok) return; const raw = { - title: String(formData.get("title") ?? "").trim().slice(0, 255), - content: String(formData.get("content") ?? "").trim().slice(0, 5000), + title: String(formData.get("title") ?? "") + .trim() + .slice(0, 255), + content: String(formData.get("content") ?? "") + .trim() + .slice(0, 5000), }; const parsed = ticketSchema.safeParse(raw); diff --git a/src/actions/import-badges.ts b/src/actions/import-badges.ts new file mode 100644 index 00000000..890feaae --- /dev/null +++ b/src/actions/import-badges.ts @@ -0,0 +1,18 @@ +"use server"; + +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; + +export async function importBadgeFromRemote({ code, name, description }: { code: string; name: string; description: string }) { + await requireStaff(); + try { + await prisma.websiteBadges.upsert({ + where: { badgeKey: code }, + update: { badgeName: name, badgeDescription: description, updatedAt: new Date() }, + create: { badgeKey: code, badgeName: name, badgeDescription: description, createdAt: new Date(), updatedAt: new Date() }, + }); + return { ok: true as const }; + } catch { + return { ok: false as const, error: "Failed to import badge" }; + } +} diff --git a/src/actions/import-furni.ts b/src/actions/import-furni.ts new file mode 100644 index 00000000..0e5abb03 --- /dev/null +++ b/src/actions/import-furni.ts @@ -0,0 +1,19 @@ +"use server"; + +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; + +export async function cleanSwfFiles() { + await requireStaff(); + return { ok: true as const, data: { deleted: 0, remaining: 0 } }; +} + +export async function deleteImportedFurni({ classname }: { classname: string }) { + await requireStaff(); + try { + await prisma.itemsBase.deleteMany({ where: { itemName: classname } }); + return { ok: true as const, data: { deletedFiles: [classname], errors: [] as string[] } }; + } catch { + return { ok: false as const, error: `Failed to delete ${classname}` }; + } +} diff --git a/src/actions/multi-account-detect.ts b/src/actions/multi-account-detect.ts new file mode 100644 index 00000000..056c787c --- /dev/null +++ b/src/actions/multi-account-detect.ts @@ -0,0 +1,41 @@ +"use server"; + +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; + +export interface MultiAccountCluster { + key: string; + label: string; + accountCount: number; + accounts: Array<{ id: number; username: string; rank: number; online: string }>; +} + +export async function detectMultiAccounts({ minAccounts, limit }: { minAccounts: number; limit: number }) { + await requireStaff(); + const clusters: MultiAccountCluster[] = []; + + const ipGroups = await prisma.user.groupBy({ + by: ["ipCurrent"], + where: { ipCurrent: { not: "" } }, + _count: { id: true }, + having: { id: { _count: { gte: minAccounts } } }, + orderBy: { _count: { id: "desc" } }, + take: limit, + }); + + for (const group of ipGroups) { + const users = await prisma.user.findMany({ + where: { ipCurrent: group.ipCurrent }, + select: { id: true, username: true, rank: true, online: true }, + orderBy: { id: "asc" }, + }); + clusters.push({ + key: group.ipCurrent, + label: `IP: ${group.ipCurrent}`, + accountCount: group._count.id, + accounts: users.map((u) => ({ id: u.id, username: u.username, rank: u.rank, online: u.online })), + }); + } + + return { ok: true as const, data: { clusters } }; +} diff --git a/src/actions/password-reset.test.ts b/src/actions/password-reset.test.ts index e1e916fb..c3174637 100644 --- a/src/actions/password-reset.test.ts +++ b/src/actions/password-reset.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -const { mockFindFirst, mockUpsert, mockFindUnique, mockUpdate, mockDelete, mockSendMail, mockRedirect } = vi.hoisted( - () => ({ +const { mockFindFirst, mockUpsert, mockFindUnique, mockUpdate, mockDelete, mockSendMail, mockRedirect } = + vi.hoisted(() => ({ mockFindFirst: vi.fn(), mockUpsert: vi.fn(), mockFindUnique: vi.fn(), @@ -9,8 +9,7 @@ const { mockFindFirst, mockUpsert, mockFindUnique, mockUpdate, mockDelete, mockS mockDelete: vi.fn(), mockSendMail: vi.fn(), mockRedirect: vi.fn(), - }), -); + })); vi.mock("next/navigation", () => ({ redirect: (...args: unknown[]) => { diff --git a/src/actions/password-reset.ts b/src/actions/password-reset.ts index 3caf70c3..76eab732 100644 --- a/src/actions/password-reset.ts +++ b/src/actions/password-reset.ts @@ -15,7 +15,9 @@ function sha256(s: string): string { } export async function requestReset(formData: FormData): Promise { - const email = String(formData.get("email") ?? "").trim().toLowerCase(); + const email = String(formData.get("email") ?? "") + .trim() + .toLowerCase(); // Throttle reset requests per IP (3 per 15 min) to curb email-bomb abuse. const allowed = (await rateLimit(`reset:${await clientIp()}`, 3, 15 * 60_000)).ok; @@ -47,13 +49,17 @@ export async function requestReset(formData: FormData): Promise { } export async function resetPassword(formData: FormData): Promise { - const email = String(formData.get("email") ?? "").trim().toLowerCase(); + const email = String(formData.get("email") ?? "") + .trim() + .toLowerCase(); const token = String(formData.get("token") ?? "").trim(); const password = String(formData.get("password") ?? ""); // Throttle reset attempts per IP (5 per 15 min) to prevent token brute-force. if (!(await rateLimit(`resetpwd:${await clientIp()}`, 5, 15 * 60_000)).ok) { - redirect(`/reset?email=${encodeURIComponent(email)}&token=${encodeURIComponent(token)}&error=${encodeURIComponent("Too many attempts — try again later")}`); + redirect( + `/reset?email=${encodeURIComponent(email)}&token=${encodeURIComponent(token)}&error=${encodeURIComponent("Too many attempts — try again later")}`, + ); } let error: string | null = null; @@ -87,7 +93,9 @@ export async function resetPassword(formData: FormData): Promise { } if (error) { - redirect(`/reset?email=${encodeURIComponent(email)}&token=${encodeURIComponent(token)}&error=${encodeURIComponent(error)}`); + redirect( + `/reset?email=${encodeURIComponent(email)}&token=${encodeURIComponent(token)}&error=${encodeURIComponent(error)}`, + ); } redirect("/login?reset=1"); } diff --git a/src/actions/permissions.ts b/src/actions/permissions.ts new file mode 100644 index 00000000..777b1d9b --- /dev/null +++ b/src/actions/permissions.ts @@ -0,0 +1,71 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; + +export async function saveRank({ id, fields }: { id: number; fields: Record }) { + const staff = await requireStaff(); + const setClauses = Object.entries(fields) + .map(([key]) => `\`${key}\` = ?`) + .join(", "); + const values = Object.values(fields); + await prisma.$executeRawUnsafe( + `UPDATE permissions SET ${setClauses} WHERE id = ?`, + ...values, + id, + ); + await logStaffActivity({ + staffId: staff.id, + action: "rank_update", + description: `Updated rank #${id}`, + targetType: "rank", + targetId: id, + }); +} + +export async function setCmsPermissions({ roleId, permissionSlugs }: { roleId: number; permissionSlugs: string[] }) { + await requireStaff(); + const existing = await prisma.websiteHousekeepingPermissions.findMany({ + where: { minRank: roleId }, + select: { permission: true }, + }); + const existingSlugs = new Set(existing.map((p) => p.permission)); + const toAdd = permissionSlugs.filter((s) => !existingSlugs.has(s)); + const toRemove = existing.filter((p) => !permissionSlugs.includes(p.permission)); + + for (const slug of toAdd) { + await prisma.websiteHousekeepingPermissions.create({ + data: { permission: slug, minRank: roleId, description: null }, + }); + } + for (const p of toRemove) { + await prisma.websiteHousekeepingPermissions.deleteMany({ + where: { permission: p.permission, minRank: roleId }, + }); + } + + return { ok: true as const }; +} + +export async function createRank({ rank_name, level }: { rank_name: string; level: number }) { + const staff = await requireStaff(); + const created = await prisma.websiteTeams.create({ + data: { + rankName: rank_name, + hiddenRank: false, + badge: null, + jobDescription: null, + staffColor: "#ffffff", + staffBackground: "#000000", + }, + }); + return { ok: true as const, data: { id: Number(created.id) } }; +} + +export async function deleteRank({ id }: { id: number }) { + await requireStaff(); + await prisma.websiteTeams.delete({ where: { id: BigInt(id) } }); + return { ok: true as const }; +} diff --git a/src/actions/radio-apply.ts b/src/actions/radio-apply.ts index c32df800..48e83464 100644 --- a/src/actions/radio-apply.ts +++ b/src/actions/radio-apply.ts @@ -11,7 +11,9 @@ const TEXT_MAX = 5000; const STYLE_MAX = 5000; function str(form: FormData, key: string, max: number): string { - return String(form.get(key) ?? "").trim().slice(0, max); + return String(form.get(key) ?? "") + .trim() + .slice(0, max); } /** diff --git a/src/actions/radio-requests.ts b/src/actions/radio-requests.ts index ceb9c246..da61f35a 100644 --- a/src/actions/radio-requests.ts +++ b/src/actions/radio-requests.ts @@ -12,8 +12,12 @@ export async function submitRequest(formData: FormData): Promise { const userId = Number(session?.user?.id); if (!Number.isInteger(userId) || userId <= 0) return; - const songTitle = String(formData.get("songTitle") ?? "").trim().slice(0, SONG_MAX); - const artist = String(formData.get("artist") ?? "").trim().slice(0, ARTIST_MAX); + const songTitle = String(formData.get("songTitle") ?? "") + .trim() + .slice(0, SONG_MAX); + const artist = String(formData.get("artist") ?? "") + .trim() + .slice(0, ARTIST_MAX); if (!songTitle && !artist) return; const now = new Date(); diff --git a/src/actions/radio-shouts.ts b/src/actions/radio-shouts.ts index fb0d35b6..19a6e88e 100644 --- a/src/actions/radio-shouts.ts +++ b/src/actions/radio-shouts.ts @@ -28,7 +28,9 @@ export async function postShout(formData: FormData): Promise { if (!(await rateLimit(`shout:${userId}`, 5, 30_000)).ok) return; const raw = { - message: String(formData.get("message") ?? "").trim().slice(0, 255), + message: String(formData.get("message") ?? "") + .trim() + .slice(0, 255), }; const parsed = shoutSchema.safeParse(raw); diff --git a/src/actions/referral.ts b/src/actions/referral.ts index 989386a9..d5cde7f2 100644 --- a/src/actions/referral.ts +++ b/src/actions/referral.ts @@ -27,16 +27,10 @@ import { type CurrencyName, sendCurrency } from "@/lib/services/send-currency"; * redirects with ?claimed=1. redirect() is called OUTSIDE the try/catch so its * internal control-flow throw is never swallowed. */ -const VALID_CURRENCIES = new Set([ - "credits", - "duckets", - "diamonds", - "points", -]); +const VALID_CURRENCIES = new Set(["credits", "duckets", "diamonds", "points"]); export async function claimReferral(_formData: FormData): Promise { - let outcome: "claimed" | "not_enough" | "no_referrals" | "bad_config" | "error" = - "error"; + let outcome: "claimed" | "not_enough" | "no_referrals" | "bad_config" | "error" = "error"; try { const session = await auth(); diff --git a/src/actions/register.ts b/src/actions/register.ts index 500ca8ba..d07cd21e 100644 --- a/src/actions/register.ts +++ b/src/actions/register.ts @@ -32,7 +32,9 @@ const DEFAULT_LOOK = "hr-100-.hd-180-1.ch-255-66.lg-280-110.sh-305-62"; export async function register(prevState: string | null, formData: FormData): Promise { const raw = { username: String(formData.get("username") ?? "").trim(), - mail: String(formData.get("mail") ?? "").trim().toLowerCase(), + mail: String(formData.get("mail") ?? "") + .trim() + .toLowerCase(), password: String(formData.get("password") ?? ""), look: String(formData.get("look") ?? "").trim() || DEFAULT_LOOK, }; @@ -61,8 +63,9 @@ export async function register(prevState: string | null, formData: FormData): Pr // VPN/proxy block (only when enabled in /admin/vpn). if ((await checkVpn(ip)).blocked) { return ( - await siteSettings.get("vpn_block_message", "") - ) || "Registrations from VPN/proxy connections are not allowed."; + (await siteSettings.get("vpn_block_message", "")) || + "Registrations from VPN/proxy connections are not allowed." + ); } // Max accounts per IP (0 / unset = unlimited), mirrors AtomCMS. @@ -85,7 +88,7 @@ export async function register(prevState: string | null, formData: FormData): Pr const now = Math.floor(Date.now() / 1000); try { - const created = await prisma.user.create({ + await prisma.user.create({ data: { username, password: await hashPassword(password), @@ -100,7 +103,7 @@ export async function register(prevState: string | null, formData: FormData): Pr if (hasEmail) { try { - await sendVerification(created.id, mail); + await sendVerification(mail); } catch { // No-op: account is created; user can request a new link later. } diff --git a/src/actions/rooms.ts b/src/actions/rooms.ts new file mode 100644 index 00000000..b0779bee --- /dev/null +++ b/src/actions/rooms.ts @@ -0,0 +1,85 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; +import { rcon } from "@/lib/services/rcon"; +import { logStaffActivity } from "@/lib/services/staff-activity"; + +export async function updateRoomItem(payload: Record) { + const staff = await requireStaff(); + const { roomId, itemId, ...data } = payload as { roomId: number; itemId: number; [key: string]: unknown }; + await prisma.items.update({ where: { id: itemId }, data: data as any }); + await logStaffActivity({ + staffId: staff.id, + action: "room_item_update", + description: `Updated item #${itemId} in room #${roomId}`, + targetType: "room_item", + targetId: itemId, + }); + revalidatePath(`/admin/rooms/${roomId}/furni`); +} + +export async function bulkDeleteRoomItems({ roomId, itemIds }: { roomId: number; itemIds: number[] }) { + const staff = await requireStaff(); + await prisma.items.deleteMany({ where: { id: { in: itemIds }, roomId } }); + await logStaffActivity({ + staffId: staff.id, + action: "room_items_bulk_delete", + description: `Deleted ${itemIds.length} item(s) from room #${roomId}`, + targetType: "room_item", + }); + revalidatePath(`/admin/rooms/${roomId}/furni`); +} + +export async function deleteRoomItem({ roomId, itemId }: { roomId: number; itemId: number }) { + const staff = await requireStaff(); + await prisma.items.delete({ where: { id: itemId } }); + await logStaffActivity({ + staffId: staff.id, + action: "room_item_delete", + description: `Deleted item #${itemId} from room #${roomId}`, + targetType: "room_item", + targetId: itemId, + }); + revalidatePath(`/admin/rooms/${roomId}/furni`); +} + +export async function roomRconAction({ roomId, action }: { roomId: number; action: string }) { + await requireStaff(); + if (action === "reload") { + await rcon.send("reloadroom", { room_id: roomId }); + } else if (action === "kick") { + await rcon.send("kickall", { room_id: roomId }); + } else if (action === "lock") { + await rcon.send("updateroom", { room_id: roomId, state: "locked" }); + } else if (action === "unlock") { + await rcon.send("updateroom", { room_id: roomId, state: "open" }); + } +} + +export async function deleteRoom({ id }: { id: number }) { + const staff = await requireStaff(); + await prisma.rooms.delete({ where: { id } }); + await logStaffActivity({ + staffId: staff.id, + action: "room_delete", + description: `Deleted room #${id}`, + targetType: "room", + targetId: id, + }); + revalidatePath("/admin/rooms"); +} + +export async function updateRoom({ id, ...data }: { id: number; name?: string; description?: string; state?: string; usersMax?: number }) { + const staff = await requireStaff(); + await prisma.rooms.update({ where: { id }, data: data as any }); + await logStaffActivity({ + staffId: staff.id, + action: "room_update", + description: `Updated room #${id}`, + targetType: "room", + targetId: id, + }); + revalidatePath(`/admin/rooms/${id}`); +} diff --git a/src/actions/save-favicon.ts b/src/actions/save-favicon.ts index a8f4c6e7..b5ca68c0 100644 --- a/src/actions/save-favicon.ts +++ b/src/actions/save-favicon.ts @@ -10,16 +10,23 @@ const FAVICON_DIR = "public/assets/images/media/favicon"; const MAX_SIZE = 2 * 1024 * 1024; // 2MB const ALLOWED = ["image/png", "image/jpeg", "image/gif", "image/webp", "image/x-icon", "image/svg+xml"]; -export async function saveFavicon(formData: FormData): Promise<{ success: boolean; url?: string; error?: string }> { +export async function saveFavicon( + formData: FormData, +): Promise<{ success: boolean; url?: string; error?: string }> { try { const file = formData.get("file") as File | null; if (!file || file.size === 0) return { success: false, error: "No file provided" }; if (file.size > MAX_SIZE) return { success: false, error: "File too large (max 2MB)" }; - if (!ALLOWED.includes(file.type)) return { success: false, error: "Invalid file type. Allowed: PNG, JPEG, GIF, WebP, ICO, SVG" }; + if (!ALLOWED.includes(file.type)) + return { success: false, error: "Invalid file type. Allowed: PNG, JPEG, GIF, WebP, ICO, SVG" }; const mimeExt: Record = { - "image/png": "png", "image/jpeg": "jpg", "image/gif": "gif", - "image/webp": "webp", "image/x-icon": "ico", "image/svg+xml": "svg", + "image/png": "png", + "image/jpeg": "jpg", + "image/gif": "gif", + "image/webp": "webp", + "image/x-icon": "ico", + "image/svg+xml": "svg", }; const ext = mimeExt[file.type] ?? "png"; const filename = `favicon-${Date.now()}.${ext}`; @@ -47,7 +54,9 @@ export async function saveFavicon(formData: FormData): Promise<{ success: boolea try { // eslint-disable-next-line security/detect-non-literal-fs-filename await unlink(oldPath); - } catch { /* ignore if file doesn't exist */ } + } catch { + /* ignore if file doesn't exist */ + } } } } @@ -80,7 +89,9 @@ export async function deleteFavicon(): Promise<{ success: boolean; error?: strin try { // eslint-disable-next-line security/detect-non-literal-fs-filename await unlink(oldPath); - } catch { /* ignore */ } + } catch { + /* ignore */ + } } } } diff --git a/src/actions/save-logo.ts b/src/actions/save-logo.ts index 290578c1..f915b2a1 100644 --- a/src/actions/save-logo.ts +++ b/src/actions/save-logo.ts @@ -8,12 +8,23 @@ import { siteSettings } from "@/lib/services/site-settings"; const MEDIA_DIR = "public/assets/images/media/logo"; -export async function saveLogo(formData: FormData): Promise<{ success: boolean; url?: string; error?: string }> { +export async function saveLogo( + formData: FormData, +): Promise<{ success: boolean; url?: string; error?: string }> { try { const file = formData.get("file") as File | null; if (!file) return { success: false, error: "No file provided" }; - const ext = file.type === "image/png" ? "png" : file.type === "image/gif" ? "gif" : file.type === "image/jpeg" ? "jpg" : file.type === "image/webp" ? "webp" : "png"; + const ext = + file.type === "image/png" + ? "png" + : file.type === "image/gif" + ? "gif" + : file.type === "image/jpeg" + ? "jpg" + : file.type === "image/webp" + ? "webp" + : "png"; const filename = `logo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.${ext}`; const baseDir = path.resolve(process.cwd(), MEDIA_DIR); const filePath = path.resolve(baseDir, filename); @@ -44,7 +55,9 @@ export async function saveLogo(formData: FormData): Promise<{ success: boolean; } } -export async function saveLogoFromUrl(gifUrl: string): Promise<{ success: boolean; url?: string; error?: string }> { +export async function saveLogoFromUrl( + gifUrl: string, +): Promise<{ success: boolean; url?: string; error?: string }> { try { const res = await fetch(gifUrl); if (!res.ok) return { success: false, error: `Failed to fetch GIF: ${res.status}` }; @@ -52,7 +65,16 @@ export async function saveLogoFromUrl(gifUrl: string): Promise<{ success: boolea const contentType = res.headers.get("content-type") ?? "image/gif"; const buffer = Buffer.from(await res.arrayBuffer()); - const ext = contentType === "image/png" ? "png" : contentType === "image/gif" ? "gif" : contentType === "image/jpeg" ? "jpg" : contentType === "image/webp" ? "webp" : "gif"; + const ext = + contentType === "image/png" + ? "png" + : contentType === "image/gif" + ? "gif" + : contentType === "image/jpeg" + ? "jpg" + : contentType === "image/webp" + ? "webp" + : "gif"; const filename = `logo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.${ext}`; const baseDir = path.resolve(process.cwd(), MEDIA_DIR); const filePath = path.resolve(baseDir, filename); diff --git a/src/actions/social.ts b/src/actions/social.ts index 465af304..68fc4e98 100644 --- a/src/actions/social.ts +++ b/src/actions/social.ts @@ -85,8 +85,12 @@ export async function postThread(formData: FormData): Promise { const guildId = Number(formData.get("guildId")); if (!Number.isInteger(guildId) || guildId <= 0) return; - const subject = String(formData.get("subject") ?? "").trim().slice(0, SUBJECT_MAX); - const message = String(formData.get("message") ?? "").trim().slice(0, MESSAGE_MAX); + const subject = String(formData.get("subject") ?? "") + .trim() + .slice(0, SUBJECT_MAX); + const message = String(formData.get("message") ?? "") + .trim() + .slice(0, MESSAGE_MAX); if (!subject || !message) return; const now = Math.floor(Date.now() / 1000); diff --git a/src/actions/soundtracks.ts b/src/actions/soundtracks.ts new file mode 100644 index 00000000..a9772671 --- /dev/null +++ b/src/actions/soundtracks.ts @@ -0,0 +1,20 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { requireStaff } from "@/lib/admin/guard"; +import { prisma } from "@/lib/prisma"; + +export async function deleteSoundtrack({ id }: { id: number }) { + await requireStaff(); + await prisma.soundtracks.delete({ where: { id } }); + revalidatePath("/admin/sounds"); +} + +export async function updateSoundtrack({ id, name, author, track, length }: { id: number; name: string; author: string; track: string; length: number }) { + await requireStaff(); + await prisma.soundtracks.update({ + where: { id }, + data: { name, author, track, length }, + }); + revalidatePath("/admin/sounds"); +} diff --git a/src/actions/twofactor.ts b/src/actions/twofactor.ts index 757f0ac1..57d8adea 100644 --- a/src/actions/twofactor.ts +++ b/src/actions/twofactor.ts @@ -19,14 +19,20 @@ async function sessionUserId(): Promise { function generateRecoveryCodes(): string[] { const codes: string[] = []; for (let i = 0; i < 8; i++) { - codes.push(randomBytes(4).toString("hex").toUpperCase().replace(/(.{4})/, "$1-")); + codes.push( + randomBytes(4) + .toString("hex") + .toUpperCase() + .replace(/(.{4})/, "$1-"), + ); } return codes; } /** Verify a TOTP code OR a recovery code. Returns the updated recovery codes (minus used one) if a recovery code was used, or null on failure. */ async function verifyTwoFactorCode( - userId: number, code: string, + userId: number, + code: string, ): Promise<{ ok: boolean; updatedRecoveryCodes?: string | null }> { const user = await prisma.user.findUnique({ where: { id: userId }, @@ -38,12 +44,18 @@ async function verifyTwoFactorCode( try { const secret = new LaravelEncrypter(env.APP_KEY as string).decrypt(user.twoFactorSecret); if (verifyTotp(code, secret)) return { ok: true }; - } catch { /* fall through to recovery */ } + } catch { + /* fall through to recovery */ + } // Try recovery codes if (user.twoFactorRecoveryCodes) { let codes: string[]; - try { codes = JSON.parse(user.twoFactorRecoveryCodes) as string[]; } catch { codes = []; } + try { + codes = JSON.parse(user.twoFactorRecoveryCodes) as string[]; + } catch { + codes = []; + } const idx = codes.indexOf(code); if (idx !== -1) { codes.splice(idx, 1); diff --git a/src/actions/voucher.ts b/src/actions/voucher.ts index cae605d9..d842f920 100644 --- a/src/actions/voucher.ts +++ b/src/actions/voucher.ts @@ -23,10 +23,7 @@ export type RedeemState = { ok: boolean; message: string } | null; * voucher schema carries a single `amount`, granted as the website credits * wallet currency. */ -export async function redeem( - _prev: RedeemState, - formData: FormData, -): Promise { +export async function redeem(_prev: RedeemState, formData: FormData): Promise { const session = await auth(); if (!session?.user?.id) { return { ok: false, message: "You must be signed in to redeem a voucher." }; diff --git a/src/app/admin/achievements/page.tsx b/src/app/admin/achievements/page.tsx index 4c7dd908..e6d5ca80 100644 --- a/src/app/admin/achievements/page.tsx +++ b/src/app/admin/achievements/page.tsx @@ -53,7 +53,9 @@ export default async function AdminAchievements() {

{t("title")}

-

{t("subtitle", { rows: achievements.length, categories: groups.size })}

+

+ {t("subtitle", { rows: achievements.length, categories: groups.size })} +

@@ -70,7 +72,9 @@ export default async function AdminAchievements() {

{category}{" "} - {rows.length} + + {rows.length} +

diff --git a/src/app/admin/ads/[id]/page.tsx b/src/app/admin/ads/[id]/page.tsx index 0a2d0c1a..2d917203 100644 --- a/src/app/admin/ads/[id]/page.tsx +++ b/src/app/admin/ads/[id]/page.tsx @@ -6,11 +6,7 @@ import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; -export default async function EditAd({ - params, -}: { - params: Promise<{ id: string }>; -}) { +export default async function EditAd({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; let ad: Awaited> = null; try { @@ -28,7 +24,9 @@ export default async function EditAd({

Edit advertisement

-

← Advertisements

+

+ ← Advertisements +

diff --git a/src/app/admin/ads/new/page.tsx b/src/app/admin/ads/new/page.tsx index 29d1d024..5414466f 100644 --- a/src/app/admin/ads/new/page.tsx +++ b/src/app/admin/ads/new/page.tsx @@ -11,7 +11,9 @@ export default function NewAd() {

New advertisement

-

← Advertisements

+

+ ← Advertisements +

diff --git a/src/app/admin/ads/page.tsx b/src/app/admin/ads/page.tsx index b047a7a0..1e539d53 100644 --- a/src/app/admin/ads/page.tsx +++ b/src/app/admin/ads/page.tsx @@ -18,9 +18,7 @@ export default async function AdminAds() { ads = []; } - const latest = ads[0]?.createdAt - ? ads[0].createdAt.toISOString().slice(0, 10) - : "—"; + const latest = ads[0]?.createdAt ? ads[0].createdAt.toISOString().slice(0, 10) : "—"; return (
diff --git a/src/app/admin/alerts/page.tsx b/src/app/admin/alerts/page.tsx index 625d0adb..fa752948 100644 --- a/src/app/admin/alerts/page.tsx +++ b/src/app/admin/alerts/page.tsx @@ -84,24 +84,14 @@ export default async function AdminAlerts() {
- 0 ? "danger" : "ok"} - icon="🚨" - /> + 0 ? "danger" : "ok"} icon="🚨" /> 0 ? "warn" : "neutral"} icon="⚠️" /> - 0 ? "warn" : "ok"} - icon="📨" - /> + 0 ? "warn" : "ok"} icon="📨" />
diff --git a/src/app/admin/applications/page.tsx b/src/app/admin/applications/page.tsx index 955a336e..48e5142d 100644 --- a/src/app/admin/applications/page.tsx +++ b/src/app/admin/applications/page.tsx @@ -85,7 +85,9 @@ export default async function AdminApplications() { <>{t("userNumber", { id: a.userId })} )} - {t("rankLabel", { rank: a.rankId })} + + {t("rankLabel", { rank: a.rankId })} +

{formatDate(a.createdAt)} diff --git a/src/app/admin/articles/[id]/page.tsx b/src/app/admin/articles/[id]/page.tsx index 7a100ac9..2c6cca93 100644 --- a/src/app/admin/articles/[id]/page.tsx +++ b/src/app/admin/articles/[id]/page.tsx @@ -18,10 +18,12 @@ export default async function EditArticle({ const { id } = await params; const { error } = await searchParams; const t = await getTranslations("pages.admin.articles"); - const article = await prisma.websiteArticles.findUnique({ - where: { id: BigInt(id) }, - select: { id: true, slug: true, title: true, shortStory: true, fullStory: true, image: true }, - }).catch(() => null); + const article = await prisma.websiteArticles + .findUnique({ + where: { id: BigInt(id) }, + select: { id: true, slug: true, title: true, shortStory: true, fullStory: true, image: true }, + }) + .catch(() => null); if (!article) notFound(); return ( @@ -32,14 +34,12 @@ export default async function EditArticle({

{t("form.title")}

-

← {t("title")}

+

+ ← {t("title")} +

- {error ? ( -

- Error: {error} -

- ) : null} + {error ?

Error: {error}

: null} { "use server"; @@ -55,7 +55,9 @@ export default async function EditArticle({ /> - +
); diff --git a/src/app/admin/articles/new/page.tsx b/src/app/admin/articles/new/page.tsx index d6a7dbc3..5ed0495a 100644 --- a/src/app/admin/articles/new/page.tsx +++ b/src/app/admin/articles/new/page.tsx @@ -4,11 +4,7 @@ import { Newspaper } from "lucide-react"; import { createArticle } from "@/actions/admin-articles"; import { ArticleForm } from "@/components/admin/article-form"; -export default async function NewArticle({ - searchParams, -}: { - searchParams: Promise<{ error?: string }>; -}) { +export default async function NewArticle({ searchParams }: { searchParams: Promise<{ error?: string }> }) { const { error } = await searchParams; const t = await getTranslations("pages.admin.articles"); @@ -20,14 +16,12 @@ export default async function NewArticle({

{t("form.title")}

-

← {t("title")}

+

+ ← {t("title")} +

- {error ? ( -

- Error: {error} -

- ) : null} + {error ?

Error: {error}

: null} ); diff --git a/src/app/admin/articles/page.tsx b/src/app/admin/articles/page.tsx index 06977e4b..ccd541fd 100644 --- a/src/app/admin/articles/page.tsx +++ b/src/app/admin/articles/page.tsx @@ -7,11 +7,7 @@ import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; -export default async function AdminArticles({ - searchParams, -}: { - searchParams: Promise<{ error?: string }>; -}) { +export default async function AdminArticles({ searchParams }: { searchParams: Promise<{ error?: string }> }) { const { error } = await searchParams; const t = await getTranslations("pages.admin.articles"); const articles = await prisma.websiteArticles @@ -22,9 +18,7 @@ export default async function AdminArticles({ }) .catch(() => []); - const latest = articles[0]?.createdAt - ? articles[0].createdAt.toISOString().slice(0, 10) - : "—"; + const latest = articles[0]?.createdAt ? articles[0].createdAt.toISOString().slice(0, 10) : "—"; return (
@@ -41,11 +35,7 @@ export default async function AdminArticles({ - {error ? ( -

- Error: {error} -

- ) : null} + {error ?

Error: {error}

: null}
@@ -70,9 +60,7 @@ export default async function AdminArticles({ {articles.map((a) => (
- - - - + + + + - + ))} diff --git a/src/app/admin/calendar/page.tsx b/src/app/admin/calendar/page.tsx index af0d48c3..6d680a85 100644 --- a/src/app/admin/calendar/page.tsx +++ b/src/app/admin/calendar/page.tsx @@ -52,8 +52,7 @@ export default async function AdminCalendar() { for (const r of rewards) { rewardCounts.set(r.campaignId, (rewardCounts.get(r.campaignId) ?? 0) + 1); } - } catch { - } + } catch {} const enabledCount = campaigns.filter((c) => c.enabled === "1").length; @@ -65,7 +64,9 @@ export default async function AdminCalendar() {

{t("title")}

-

{t("subtitle", { count: campaigns.length })}

+

+ {t("subtitle", { count: campaigns.length })} +

@@ -88,11 +89,7 @@ export default async function AdminCalendar() { const enabled = c.enabled === "1"; const count = rewardCounts.get(c.id) ?? 0; return ( - + {c.image ? ( // eslint-disable-next-line @next/next/no-img-element {c.name} @@ -102,7 +99,9 @@ export default async function AdminCalendar() {

{c.name || `#${c.id}`}

- + {enabled ? t("statusEnabled") : t("statusDisabled")}
diff --git a/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx b/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx new file mode 100644 index 00000000..438e95a0 --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx @@ -0,0 +1,126 @@ +'use client' + +import { Languages, Package, Settings } from 'lucide-react' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import type { CatalogItemData } from './catalog-items-table' +import { CatalogItemsTable } from './catalog-items-table' +import { CatalogPageForm } from './catalog-page-form' +import { CatalogTranslateTab } from './catalog-translate-tab' + +interface CatalogPageData { + id: number + caption: string + parentId: number + pageLayout: string + enabled: string + visible: string + minRank: number + clubOnly: string + orderNum: number + iconImage: number + iconColor: number + pageHeadline: string + pageTeaser: string + pageSpecial: string | null + pageText1: string | null + pageText2: string | null + pageTextDetails: string | null + pageTextTeaser: string | null +} + +interface BaseItemData { + id: number + publicName: string + itemName: string + spriteId: number + type: string +} + +interface CatalogDetailTabsProps { + catalogPage: CatalogPageData + items: CatalogItemData[] + baseItems: BaseItemData[] + catalogNameMap: Record + childPages: { id: number; caption: string; enabled: string }[] + pageId: number + canEdit: boolean + furniDataIdList: number[] + furniDescriptionMap: Record + furniRevisionMap: Record + allPages: { id: number; caption: string }[] + interactionTypes: string[] +} + +export function CatalogDetailTabs({ + catalogPage, + items, + baseItems, + catalogNameMap, + childPages, + pageId, + canEdit, + furniDataIdList, + furniDescriptionMap, + furniRevisionMap, + allPages, + interactionTypes, +}: CatalogDetailTabsProps) { + return ( + + + + + Settings + + + + Items ({items.length}) + + + + Translate ({baseItems.length}){(() => { + const furniSet = new Set(furniDataIdList) + const missing = baseItems.filter((b) => !furniSet.has(b.id)).length + return missing > 0 ? ( + + {missing} + + ) : null + })()} + + + + + + + + + + + + + + + + ) +} diff --git a/src/app/admin/catalog/[id]/catalog-items-table.tsx b/src/app/admin/catalog/[id]/catalog-items-table.tsx new file mode 100644 index 00000000..c3a80fa3 --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-items-table.tsx @@ -0,0 +1,7 @@ +/** + * Re-export barrel for backward compatibility. + * Implementation moved to ./catalog-items-table/ directory. + */ +export { CatalogItemsTable } from './catalog-items-table/catalog-items-table' +export { FurniIcon } from './catalog-items-table/furni-icon' +export type { BaseItemData, CatalogItemData } from './catalog-items-table/types' diff --git a/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx b/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx new file mode 100644 index 00000000..1701b767 --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx @@ -0,0 +1,2008 @@ +'use client' + +import { + closestCenter, + DndContext, + type DragEndEvent, + DragOverlay, + type DragStartEvent, + PointerSensor, + useSensor, + useSensors, +} from '@dnd-kit/core' +import { + arrayMove, + SortableContext, + useSortable, + verticalListSortingStrategy, +} from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' +import { + ArrowRightLeft, + Copy, + DollarSign, + GripVertical, + LayoutGrid, + Loader2, + MoveRight, + Pencil, + Plus, + RotateCcw, + Rows3, + Save, + Search, + Trash2, + X, +} from 'lucide-react' +import { useRouter } from 'next/navigation' +import { useCallback, useEffect, useMemo, useState } from 'react' +import { toast } from 'sonner' +import { + createCatalogItem, + deleteCatalogItems, + moveCatalogItems, + reorderCatalogItems, + updateCatalogItem, +} from '@/actions/catalog-items' +import { BulkImportItems } from '@/components/admin/catalog/bulk-import-items' +import { ItemsShopPreview } from '@/components/admin/catalog/items-shop-preview' +import { QuickAddFurni } from '@/components/admin/catalog/quick-add-furni' +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { Checkbox } from '@/components/ui/checkbox' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/ui/table' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { useServerAction } from '@/hooks/use-server-action' +import { getSuggestions, recordMove } from '@/lib/move-suggestions' +import { cn } from '@/lib/utils' +import { InteractionTypeCombobox, MovePageCombobox, ToggleField } from './field-helpers' +import { FurniIcon } from './furni-icon' +import { SongPicker } from './song-picker' +import type { BaseItemData, CatalogItemData, InlineEdit } from './types' +import { DEFAULT_NEW_ITEM, getPointsLabel, POINTS_TYPES } from './types' + +export type { BaseItemData, CatalogItemData } + +// ── Sortable row wrapper (dnd-kit) ───────────────────────────── +function SortableRow({ + id, + className, + children, +}: { + id: number + className?: string + children: (props: { dragHandleProps: React.HTMLAttributes }) => React.ReactNode +}) { + const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ + id, + }) + const style: React.CSSProperties = { + transform: CSS.Transform.toString(transform), + transition, + opacity: isDragging ? 0.35 : 1, + } + const dragHandleProps = { + ...attributes, + ...listeners, + } as unknown as React.HTMLAttributes + return ( + } + style={style} + className={className} + > + {children({ dragHandleProps })} + + ) +} + +interface CatalogItemsTableProps { + items: CatalogItemData[] + pageId: number + pageLayout: string + canEdit: boolean + interactionTypes: string[] + furniRevisionMap: Record + allPages: { id: number; caption: string }[] +} + +export function CatalogItemsTable({ + items, + pageId, + pageLayout, + canEdit, + interactionTypes, + furniRevisionMap, + allPages, +}: CatalogItemsTableProps) { + const router = useRouter() + const { run, isPending } = useServerAction() + const [addOpen, setAddOpen] = useState(false) + const [editingItem, setEditingItem] = useState(null) + const [editingBase, setEditingBase] = useState(null) + const [savingItemId, setSavingItemId] = useState(null) + + const [newItem, setNewItem] = useState({ ...DEFAULT_NEW_ITEM }) + + // ── View mode (table / grid) ──────────────────────────────────── + const [viewMode, setViewMode] = useState<'table' | 'grid'>('table') + + // ── Search / Filter ───────────────────────────────────────────── + const [searchQuery, setSearchQuery] = useState('') + + const filteredItems = useMemo(() => { + if (!searchQuery.trim()) return items + const q = searchQuery.toLowerCase() + return items.filter( + (item) => + item.catalogName.toLowerCase().includes(q) || + item.baseItemName.toLowerCase().includes(q) || + item.baseName.toLowerCase().includes(q) || + item.itemIds.includes(q) || + String(item.id).includes(q), + ) + }, [items, searchQuery]) + + // ── Move items dialog ─────────────────────────────────────────── + const [moveOpen, setMoveOpen] = useState(false) + const [moveTargetPageId, setMoveTargetPageId] = useState(null) + + // ── Bulk price dialog ─────────────────────────────────────────── + const [bulkPriceOpen, setBulkPriceOpen] = useState(false) + const [bulkPriceField, setBulkPriceField] = useState<'costCredits' | 'costPoints'>('costCredits') + const [bulkPriceMode, setBulkPriceMode] = useState<'set' | 'add' | 'percent'>('set') + const [bulkPriceValue, setBulkPriceValue] = useState(0) + + // ── Drag & Drop (dnd-kit) ─────────────────────────────────────── + const [activeDragId, setActiveDragId] = useState(null) + const [itemOrder, setItemOrder] = useState(items.map((i) => i.id)) + const dndSensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 8 } })) + + const orderedFilteredItems = useMemo(() => { + if (searchQuery.trim()) return filteredItems + const orderMap = new Map(itemOrder.map((id, idx) => [id, idx])) + return [...filteredItems].sort((a, b) => (orderMap.get(a.id) ?? 0) - (orderMap.get(b.id) ?? 0)) + }, [filteredItems, itemOrder, searchQuery]) + + // ── Selection ──────────────────────────────────────────────────── + const [selected, setSelected] = useState>(new Set()) + + const toggleOne = useCallback((id: number) => { + setSelected((prev) => { + const next = new Set(prev) + if (next.has(id)) next.delete(id) + else next.add(id) + return next + }) + }, []) + + const toggleAll = useCallback(() => { + setSelected((prev) => + prev.size === filteredItems.length ? new Set() : new Set(filteredItems.map((i) => i.id)), + ) + }, [filteredItems]) + + // ── Inline edits ───────────────────────────────────────────────── + const [inlineEdits, setInlineEdits] = useState>( + Object.fromEntries( + items.map((item) => [ + item.id, + { + costCredits: item.costCredits, + costPoints: item.costPoints, + pointsType: item.pointsType, + amount: item.amount, + }, + ]), + ), + ) + + function updateInline(id: number, key: keyof InlineEdit, value: string | number) { + setInlineEdits((prev) => ({ + ...prev, + [id]: { ...prev[id], [key]: value }, + })) + } + + const isItemModified = useCallback( + (item: CatalogItemData) => { + const edit = inlineEdits[item.id] + if (!edit) return false + return ( + edit.costCredits !== item.costCredits || + edit.costPoints !== item.costPoints || + edit.pointsType !== item.pointsType || + edit.amount !== item.amount + ) + }, + [inlineEdits], + ) + + const modifiedItems = useMemo(() => items.filter(isItemModified), [items, isItemModified]) + + const hasOrderChanges = useMemo(() => { + const originalOrder = items.map((i) => i.id) + return itemOrder.some((id, idx) => id !== originalOrder[idx]) + }, [items, itemOrder]) + + const hasUnsavedChanges = modifiedItems.length > 0 || hasOrderChanges + + // Warn before navigating away with unsaved changes + useEffect(() => { + if (!hasUnsavedChanges) return + function onBeforeUnload(e: BeforeUnloadEvent) { + e.preventDefault() + } + window.addEventListener('beforeunload', onBeforeUnload) + return () => window.removeEventListener('beforeunload', onBeforeUnload) + }, [hasUnsavedChanges]) + + // Ctrl+S / Cmd+S to save modified items + useEffect(() => { + if (!canEdit) return + function onKeyDown(e: KeyboardEvent) { + if ((e.metaKey || e.ctrlKey) && e.key === 's') { + e.preventDefault() + if (modifiedItems.length > 0) handleSaveAllModified() + else if (hasOrderChanges) handleSaveOrder() + } + } + document.addEventListener('keydown', onKeyDown) + return () => document.removeEventListener('keydown', onKeyDown) + }) + + function resetInlineEdit(id: number) { + const item = items.find((i) => i.id === id) + if (!item) return + setInlineEdits((prev) => ({ + ...prev, + [id]: { + costCredits: item.costCredits, + costPoints: item.costPoints, + pointsType: item.pointsType, + amount: item.amount, + }, + })) + } + + function resetAllEdits() { + setInlineEdits( + Object.fromEntries( + items.map((item) => [ + item.id, + { + costCredits: item.costCredits, + costPoints: item.costPoints, + pointsType: item.pointsType, + amount: item.amount, + }, + ]), + ), + ) + } + + // ── Open edit dialog ─────────────────────────────────────────── + function openEditDialog(item: CatalogItemData) { + setEditingItem({ ...item }) + setEditingBase(item.baseItem ? { ...item.baseItem } : null) + } + + // ── Save single item inline ────────────────────────────────────── + async function handleSaveOne(item: CatalogItemData) { + const edit = inlineEdits[item.id] + if (!edit) return + setSavingItemId(item.id) + + run( + () => + updateCatalogItem({ + id: item.id, + catalogFields: { + catalogName: item.catalogName, + itemIds: item.itemIds, + costCredits: edit.costCredits, + costPoints: edit.costPoints, + pointsType: edit.pointsType, + amount: edit.amount, + limitedSells: item.limitedSells, + limitedStack: item.limitedStack, + orderNumber: item.orderNumber, + offerId: item.offerId, + haveOffer: item.haveOffer, + clubOnly: item.clubOnly, + extradata: item.extradata, + }, + }), + { + successMessage: `Item #${item.id} saved.`, + errorMessage: `Failed to save item #${item.id}.`, + onSuccess: () => { + setSavingItemId(null) + router.refresh() + }, + }, + ) + } + + // ── Save all modified items ────────────────────────────────────── + async function handleSaveAllModified() { + if (modifiedItems.length === 0) return + + run( + async () => { + let savedCount = 0 + let failedCount = 0 + + for (const item of modifiedItems) { + const edit = inlineEdits[item.id] + if (!edit) continue + + const result = await updateCatalogItem({ + id: item.id, + catalogFields: { + catalogName: item.catalogName, + itemIds: item.itemIds, + costCredits: edit.costCredits, + costPoints: edit.costPoints, + pointsType: edit.pointsType, + amount: edit.amount, + limitedSells: item.limitedSells, + limitedStack: item.limitedStack, + orderNumber: item.orderNumber, + offerId: item.offerId, + haveOffer: item.haveOffer, + clubOnly: item.clubOnly, + extradata: item.extradata, + }, + }) + + if (result.ok) savedCount++ + else failedCount++ + } + + if (failedCount > 0) { + return { ok: false as const, error: `Saved ${savedCount}, failed ${failedCount}.` } + } + return { ok: true as const, data: { savedCount } } + }, + { + successMessage: `Saved ${modifiedItems.length} item(s).`, + errorMessage: 'Failed to save items.', + }, + ) + } + + // ── Bulk delete selected ───────────────────────────────────────── + async function handleBulkDelete() { + if (selected.size === 0) return + if (!confirm(`Delete ${selected.size} selected item(s)?`)) return + + run(() => deleteCatalogItems({ ids: [...selected] }), { + successMessage: `Deleted ${selected.size} item(s).`, + errorMessage: 'Failed to delete items.', + onSuccess: () => { + setSelected(new Set()) + router.refresh() + }, + }) + } + + // ── Move selected items to another page ───────────────────────── + async function handleMoveItems() { + if (selected.size === 0 || !moveTargetPageId) return + + // Record move patterns for all selected items + for (const id of selected) { + const item = items.find((i) => i.id === id) + if (item) { + recordMove({ + interactionType: item.baseItem?.interactionType, + itemName: item.baseItemName, + targetPageId: moveTargetPageId, + }) + } + } + + run(() => moveCatalogItems({ ids: [...selected], targetPageId: moveTargetPageId }), { + successMessage: `Moved ${selected.size} item(s) to page #${moveTargetPageId}.`, + errorMessage: 'Failed to move items.', + onSuccess: () => { + setSelected(new Set()) + setMoveOpen(false) + setMoveTargetPageId(null) + router.refresh() + }, + }) + } + + // ── Apply bulk price update to inline edits ──────────────────── + function applyBulkPrice() { + const targetIds = selected.size > 0 ? selected : new Set(filteredItems.map((i) => i.id)) + setInlineEdits((prev) => { + const next = { ...prev } + for (const id of targetIds) { + const edit = next[id] + if (!edit) continue + const currentVal = edit[bulkPriceField] + let newVal: number + if (bulkPriceMode === 'set') { + newVal = bulkPriceValue + } else if (bulkPriceMode === 'add') { + newVal = currentVal + bulkPriceValue + } else { + newVal = Math.round(currentVal * (1 + bulkPriceValue / 100)) + } + next[id] = { ...edit, [bulkPriceField]: Math.max(0, newVal) } + } + return next + }) + setBulkPriceOpen(false) + toast.success(`Price update applied to ${targetIds.size} item(s). Save to persist.`) + } + + // ── Drag & Drop handlers (dnd-kit) ────────────────────────────── + const handleDragStart = useCallback((event: DragStartEvent) => { + setActiveDragId(Number(event.active.id)) + }, []) + + const handleDragEnd = useCallback((event: DragEndEvent) => { + const { active, over } = event + setActiveDragId(null) + if (!over || active.id === over.id) return + setItemOrder((prev) => { + const fromIdx = prev.indexOf(Number(active.id)) + const toIdx = prev.indexOf(Number(over.id)) + if (fromIdx === -1 || toIdx === -1) return prev + return arrayMove(prev, fromIdx, toIdx) + }) + }, []) + + const handleDragCancel = useCallback(() => { + setActiveDragId(null) + }, []) + + async function handleSaveOrder() { + const orders = itemOrder.map((id, idx) => ({ id, orderNumber: idx + 1 })) + + run(() => reorderCatalogItems({ orders }), { + successMessage: 'Item order saved.', + errorMessage: 'Failed to save order.', + }) + } + + function resetOrder() { + setItemOrder(items.map((i) => i.id)) + } + + // Helper to get furni revision info for an item + function getFurniInfo(item: CatalogItemData) { + const firstBaseId = item.itemIds + .split(';') + .map(Number) + .find((n) => n > 0) + if (!firstBaseId) return { classname: item.baseItemName, revision: 0 } + const furni = furniRevisionMap[firstBaseId] + return furni + ? { classname: furni.classname || item.baseItemName, revision: furni.revision } + : { classname: item.baseItemName, revision: 0 } + } + + // ── Original CRUD handlers ─────────────────────────────────────── + async function handleAddItem() { + run( + () => + createCatalogItem({ + ...newItem, + pageId, + haveOffer: newItem.haveOffer as '0' | '1', + clubOnly: newItem.clubOnly as '0' | '1', + }), + { + successMessage: 'Item added.', + errorMessage: 'Failed to add item', + onSuccess: () => { + setAddOpen(false) + setNewItem({ ...DEFAULT_NEW_ITEM }) + router.refresh() + }, + }, + ) + } + + async function handleDeleteItem(id: number) { + if (!confirm('Delete this catalog item?')) return + run(() => deleteCatalogItems({ ids: [id] }), { + successMessage: 'Item deleted.', + errorMessage: 'Failed to delete item.', + }) + } + + // ── Move single item to another page ───────────────────────── + const [moveOneId, setMoveOneId] = useState(null) + const [moveOneTarget, setMoveOneTarget] = useState(null) + + // Get the item being moved for suggestions + const moveOneItem = moveOneId ? items.find((i) => i.id === moveOneId) : null + const moveOneSuggestions = useMemo(() => { + if (!moveOneItem) return [] + return getSuggestions({ + interactionType: moveOneItem.baseItem?.interactionType, + itemName: moveOneItem.baseItemName, + }) + }, [moveOneItem]) + + async function handleMoveSingleItem() { + if (!moveOneId || !moveOneTarget) return + // Record for learning before moving + if (moveOneItem) { + recordMove({ + interactionType: moveOneItem.baseItem?.interactionType, + itemName: moveOneItem.baseItemName, + targetPageId: moveOneTarget, + }) + } + run(() => moveCatalogItems({ ids: [moveOneId], targetPageId: moveOneTarget }), { + successMessage: `Item #${moveOneId} moved to page #${moveOneTarget}.`, + errorMessage: 'Failed to move item.', + onSuccess: () => { + setMoveOneId(null) + setMoveOneTarget(null) + router.refresh() + }, + }) + } + + async function handleDuplicateItem(item: CatalogItemData) { + run( + () => + createCatalogItem({ + pageId, + itemIds: item.itemIds, + catalogName: item.catalogName, + costCredits: item.costCredits, + costPoints: item.costPoints, + pointsType: item.pointsType, + amount: item.amount, + limitedSells: 0, + limitedStack: item.limitedStack, + orderNumber: item.orderNumber + 1, + offerId: item.offerId, + songId: item.songId, + haveOffer: item.haveOffer as '0' | '1', + clubOnly: item.clubOnly as '0' | '1', + extradata: item.extradata, + }), + { + successMessage: `Item #${item.id} duplicated.`, + errorMessage: 'Failed to duplicate item.', + }, + ) + } + + async function handleUpdateItem() { + if (!editingItem) return + run( + () => + updateCatalogItem({ + id: editingItem.id, + catalogFields: { + catalogName: editingItem.catalogName, + itemIds: editingItem.itemIds, + costCredits: editingItem.costCredits, + costPoints: editingItem.costPoints, + pointsType: editingItem.pointsType, + amount: editingItem.amount, + limitedSells: editingItem.limitedSells, + limitedStack: editingItem.limitedStack, + orderNumber: editingItem.orderNumber, + offerId: editingItem.offerId, + songId: editingItem.songId, + haveOffer: editingItem.haveOffer, + clubOnly: editingItem.clubOnly, + extradata: editingItem.extradata, + }, + ...(editingBase + ? { + baseItem: { + id: editingBase.id, + fields: editingBase as unknown as Record, + }, + } + : {}), + }), + { + successMessage: `Item #${editingItem.id} updated.`, + errorMessage: 'Failed to update item', + onSuccess: () => { + setEditingItem(null) + setEditingBase(null) + router.refresh() + }, + }, + ) + } + + // ── Add Item Form Fields (for "Add" dialog) ─────────────────── + function AddItemFormFields({ + data, + onChange, + }: { + data: typeof DEFAULT_NEW_ITEM + onChange: (key: string, value: string | number) => void + }) { + return ( +
+
+ + onChange('catalogName', e.target.value)} + /> +
+
+ + onChange('itemIds', e.target.value)} /> +
+ +
+
+ + onChange('costCredits', parseInt(e.target.value, 10) || 0)} + /> +
+
+ + onChange('costPoints', parseInt(e.target.value, 10) || 0)} + /> +
+
+ + +
+
+ +
+
+ + onChange('amount', parseInt(e.target.value, 10) || 1)} + /> +
+
+ + onChange('orderNumber', parseInt(e.target.value, 10) || 0)} + /> +
+
+ + onChange('offerId', parseInt(e.target.value, 10))} + /> +
+
+ +
+
+ + onChange('limitedSells', parseInt(e.target.value, 10) || 0)} + /> +
+
+ + onChange('limitedStack', parseInt(e.target.value, 10) || 0)} + /> +
+
+ +
+
+ + +
+
+ + +
+
+ +
+ + onChange('extradata', e.target.value)} + placeholder="Optional extra data" + /> +
+
+ ) + } + + return ( + + +
+
+ + Items ({items.length}) + {searchQuery && filteredItems.length !== items.length && ( + + ({filteredItems.length} shown) + + )} + + {selected.size > 0 && ( +

{selected.size} selected

+ )} +
+
+ {/* View toggle */} +
+ + +
+ {canEdit && ( + <> + {selected.size > 0 && ( + <> + + + + )} + + {hasOrderChanges && ( + <> + + + + )} + {modifiedItems.length > 0 && ( + <> + + + + )} + + router.refresh()} /> + + + + + + + Add Catalog Item + + setNewItem((p) => ({ ...p, [key]: value }))} + /> + + + + + )} +
+
+ + {/* Unsaved changes banner */} + {hasUnsavedChanges && ( +
+ + You have unsaved changes ( + {modifiedItems.length > 0 ? `${modifiedItems.length} item(s) modified` : ''} + {modifiedItems.length > 0 && hasOrderChanges ? ', ' : ''} + {hasOrderChanges ? 'order changed' : ''}). Press{' '} + Ctrl+S to + save. + +
+ )} + + {/* Search bar */} + {items.length > 0 && ( +
+ + setSearchQuery(e.target.value)} + className="pl-9 h-9" + /> + {searchQuery && ( + + )} +
+ )} +
+ + {items.length === 0 ? ( +
+

No items in this page.

+ {canEdit && ( + + )} +
+ ) : filteredItems.length === 0 ? ( +

+ No items match "{searchQuery}". +

+ ) : viewMode === 'grid' ? ( + openEditDialog(item) : undefined} + /> + ) : ( + +
+
- - {a.title} - + {a.title} {a.slug} @@ -87,10 +75,7 @@ export default async function AdminArticles({
-
@@ -104,4 +89,4 @@ export default async function AdminArticles({ ); -} \ No newline at end of file +} diff --git a/src/app/admin/badges/page.tsx b/src/app/admin/badges/page.tsx index 971bcfc3..6e1f0e38 100644 --- a/src/app/admin/badges/page.tsx +++ b/src/app/admin/badges/page.tsx @@ -51,9 +51,7 @@ export default async function AdminBadges({

{t("uploadTitle")}

-

- {t("uploadSubtitle")} -

+

{t("uploadSubtitle")}

@@ -100,7 +98,9 @@ export default async function AdminBadges({
-

{t("catalogueTitle")} ({badges.length})

+

+ {t("catalogueTitle")} ({badges.length}) +

{badges.length === 0 ? (
{t("noBadges")}
) : ( @@ -123,10 +123,7 @@ export default async function AdminBadges({
{b.badgeName} {b.badgeDescription} - +
-

{t("activeBans")} ({bans.length})

+

+ {t("activeBans")} ({bans.length}) +

{bans.length === 0 ? (
{t("noBans")}
) : ( @@ -95,12 +97,16 @@ export default async function AdminBans() {
{b.userId} - {b.type} + + {b.type} + {b.banReason || "—"} {b.banExpire === 0 ? ( - {t("permanent")} + + {t("permanent")} + ) : ( {fromUnix(b.banExpire)} diff --git a/src/app/admin/calendar/[id]/page.tsx b/src/app/admin/calendar/[id]/page.tsx index f414851e..eb8cfd61 100644 --- a/src/app/admin/calendar/[id]/page.tsx +++ b/src/app/admin/calendar/[id]/page.tsx @@ -35,11 +35,7 @@ function fmtDate(ts: number): string { return new Date(ts * 1000).toISOString().slice(0, 10); } -export default async function AdminCalendarCampaign({ - params, -}: { - params: Promise<{ id: string }>; -}) { +export default async function AdminCalendarCampaign({ params }: { params: Promise<{ id: string }> }) { const t = await getTranslations("pages.admin.calendar"); const { id } = await params; @@ -101,16 +97,16 @@ export default async function AdminCalendarCampaign({
{campaign.image ? ( // eslint-disable-next-line @next/next/no-img-element - {campaign.name} + {campaign.name} ) : null}

{campaign.name || `#${campaign.id}`}

- {t("detail.campaignMeta", { id: campaign.id, days: campaign.totalDays, date: fmtDate(campaign.startTimestamp) })} + {t("detail.campaignMeta", { + id: campaign.id, + days: campaign.totalDays, + date: fmtDate(campaign.startTimestamp), + })} {disabled ? ` · ${t("detail.disabled")}` : ` · ${t("detail.enabled")}`} {campaign.lockExpired === "1" ? ` · ${t("detail.locksExpired")}` : ""}

@@ -138,10 +134,26 @@ export default async function AdminCalendarCampaign({ {rewards.map((r) => (
{r.id}{r.productName || —}{r.itemId > 0 ? r.itemId : "—"}{r.credits > 0 ? r.credits : —}{r.pixels > 0 ? r.pixels : —} + {r.productName || —} + + {r.itemId > 0 ? r.itemId : "—"} + + {r.credits > 0 ? ( + r.credits + ) : ( + — + )} + + {r.pixels > 0 ? ( + r.pixels + ) : ( + — + )} + {r.points > 0 ? ( `${r.points} (${t("detail.typeLabel", { type: r.pointsType })})` @@ -149,11 +161,11 @@ export default async function AdminCalendarCampaign({ — )} {r.badge || "—"} - {r.subscriptionType - ? `${r.subscriptionType} · ${r.subscriptionDays}d` - : "—"} + {r.badge || "—"} + + {r.subscriptionType ? `${r.subscriptionType} · ${r.subscriptionDays}d` : "—"}
+ + + {canEdit && } + {canEdit && ( + + 0 && selected.size === filteredItems.length + } + onCheckedChange={toggleAll} + aria-label="Select all" + /> + + )} + + ID + Name + Item IDs + Item Name + Price + Amt + Status + {canEdit && Actions} + + + i.id)} + strategy={verticalListSortingStrategy} + > + + {orderedFilteredItems.map((item) => { + const pts = getPointsLabel(item.pointsType) + const edit = inlineEdits[item.id] + const modified = isItemModified(item) + const isSaving = savingItemId === item.id + const furniInfo = getFurniInfo(item) + const sortableDisabled = !canEdit || !!searchQuery + return ( + + {({ dragHandleProps }) => ( + <> + {canEdit && ( + + {!sortableDisabled ? ( +
+ +
+ ) : ( +
+ )} + + )} + {canEdit && ( + + toggleOne(item.id)} + aria-label={`Select item ${item.id}`} + /> + + )} + + + + {item.id} + + {item.catalogName || ( + unnamed + )} + + {item.itemIds} + + {item.baseItemName || '-'} + + + {canEdit ? ( +
+ + updateInline( + item.id, + 'costCredits', + parseInt(e.target.value, 10) || 0, + ) + } + className="h-8 text-xs w-16" + title="Credits" + /> + c + + updateInline( + item.id, + 'costPoints', + parseInt(e.target.value, 10) || 0, + ) + } + className="h-8 text-xs w-16" + title="Points" + /> + + {pts.label.charAt(0)} + +
+ ) : ( +
+ {item.costCredits > 0 && ( + {item.costCredits}c + )} + {item.costPoints > 0 && ( + + {item.costPoints} {pts.label}{' '} + + )} + {item.costCredits === 0 && item.costPoints === 0 && ( + Free + )} +
+ )} +
+ + {canEdit ? ( + + updateInline( + item.id, + 'amount', + parseInt(e.target.value, 10) || 1, + ) + } + className="h-8 text-xs w-16" + /> + ) : ( + {item.amount} + )} + + +
+ + {item.haveOffer === '1' ? 'Offer' : 'No Offer'} + + {item.limitedStack > 0 && ( + + LTD {item.limitedSells}/{item.limitedStack} + + )} + {item.clubOnly === '1' && ( + + HC + + )} +
+
+ {canEdit && ( + +
+ {modified && ( + <> + + + + )} + + + + +
+
+ )} + + )} + + ) + })} + + +
+
+ + {activeDragId !== null && + (() => { + const dragged = items.find((i) => i.id === activeDragId) + if (!dragged) return null + const info = getFurniInfo(dragged) + return ( +
+ +
+

+ {dragged.catalogName || dragged.baseName || `#${dragged.id}`} +

+

#{dragged.id}

+
+
+ ) + })()} +
+ + )} + + {/* ── Edit Item Dialog (tabbed: Catalog Settings + Furniture Settings) ── */} + {editingItem && ( + { + if (!open) { + setEditingItem(null) + setEditingBase(null) + } + }} + > + + + Edit Item #{editingItem.id} + + + {/* Read-only identity fields */} +
+
+ +
+ {editingItem.catalogName || ( + unnamed + )} +
+
+
+ +
+ {editingItem.itemIds} +
+
+
+ + + + + Catalog Settings + + + Furniture Settings + {!editingBase && ( + (N/A) + )} + + + + {/* ── Catalog Settings Tab ── */} + +
+
+ + + setEditingItem( + (p) => p && { ...p, costCredits: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + + setEditingItem( + (p) => p && { ...p, costPoints: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + +
+
+ +
+
+ + + setEditingItem( + (p) => p && { ...p, amount: parseInt(e.target.value, 10) || 1 }, + ) + } + /> +
+
+ + + setEditingItem( + (p) => p && { ...p, orderNumber: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + + setEditingItem( + (p) => p && { ...p, offerId: parseInt(e.target.value, 10) }, + ) + } + /> +
+
+ +
+
+ + + setEditingItem( + (p) => p && { ...p, limitedSells: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + + setEditingItem( + (p) => p && { ...p, limitedStack: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ +
+
+ + +
+
+ + +
+
+ +
+ + + setEditingItem((p) => p && { ...p, extradata: e.target.value }) + } + placeholder="Optional extra data" + /> +
+ +
+ + setEditingItem((p) => p && { ...p, songId: id })} + /> +

+ Select a soundtrack to play when this item is used in-game. Uploaded from{' '} + /admin/sounds. +

+
+
+ + {/* ── Furniture Settings Tab (items_base) ── */} + {editingBase && ( + + {/* Identity */} +
+

+ Identity +

+
+
+ +
+ {editingBase.id} +
+
+
+ + + setEditingBase( + (p) => p && { ...p, spriteId: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + +
+
+
+ + {/* Dimensions */} +
+

+ Dimensions +

+
+
+ + + setEditingBase( + (p) => p && { ...p, width: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + + setEditingBase( + (p) => p && { ...p, length: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + + setEditingBase( + (p) => p && { ...p, stackHeight: parseFloat(e.target.value) || 0 }, + ) + } + /> +
+
+
+ + {/* Interaction */} +
+

+ Interaction +

+
+
+ + + setEditingBase((p) => p && { ...p, interactionType: v }) + } + types={interactionTypes} + /> +
+
+ + + setEditingBase( + (p) => + p && { + ...p, + interactionModesCount: parseInt(e.target.value, 10) || 0, + }, + ) + } + /> +
+
+
+ + {/* Permissions */} +
+

+ Permissions +

+
+ + setEditingBase((p) => p && { ...p, allowStack: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowSit: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowLay: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowWalk: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowGift: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowTrade: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowRecycle: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowMarketplaceSell: v ? 1 : 0 }) + } + /> + + setEditingBase((p) => p && { ...p, allowInventoryStack: v ? 1 : 0 }) + } + /> +
+
+ + {/* Extra */} +
+

+ Extra +

+
+
+
+ + + setEditingBase((p) => p && { ...p, vendingIds: e.target.value }) + } + placeholder="0" + /> +
+
+ + + setEditingBase((p) => p && { ...p, customparams: e.target.value }) + } + placeholder="" + /> +
+
+
+
+ + + setEditingBase( + (p) => + p && { ...p, effectIdMale: parseInt(e.target.value, 10) || 0 }, + ) + } + /> +
+
+ + + setEditingBase( + (p) => + p && { + ...p, + effectIdFemale: parseInt(e.target.value, 10) || 0, + }, + ) + } + /> +
+
+
+ + + setEditingBase((p) => p && { ...p, clothingOnWalk: e.target.value }) + } + placeholder="" + /> +
+
+
+
+ )} +
+ + {/* Action buttons */} +
+ + +
+
+
+ )} + {/* ── Move Items Dialog ── */} + { + if (!open) { + setMoveOpen(false) + setMoveTargetPageId(null) + } + }} + > + + + Move {selected.size} item(s) to another page + +
+ + +
+ + +
+
+
+
+ + {/* ── Move Single Item Dialog ── */} + { + if (!open) { + setMoveOneId(null) + setMoveOneTarget(null) + } + }} + > + + + Move Item to another page + +
+ {/* Item info */} + {moveOneItem && ( +
+ +
+

+ {moveOneItem.catalogName || moveOneItem.baseName} +

+

+ #{moveOneItem.id} · {moveOneItem.baseItemName || '—'} + {moveOneItem.baseItem?.interactionType && + ` · ${moveOneItem.baseItem.interactionType}`} +

+
+
+ )} + + + {moveOneSuggestions.length > 0 && ( +

+ Suggestions based on previous moves for similar items. +

+ )} +
+ + +
+
+
+
+ + {/* ── Bulk Price Dialog ── */} + + + + Bulk Price Update + +

+ {selected.size > 0 + ? `Apply to ${selected.size} selected item(s).` + : `Apply to all ${filteredItems.length} visible item(s).`} +

+
+
+ + +
+
+ + +
+
+ + setBulkPriceValue(parseFloat(e.target.value) || 0)} + placeholder={bulkPriceMode === 'percent' ? 'e.g. 10 for +10%' : 'e.g. 5'} + /> + {bulkPriceMode === 'percent' && ( +

+ Use negative values to decrease (e.g. -20 for -20%) +

+ )} + {bulkPriceMode === 'add' && ( +

Use negative values to subtract

+ )} +
+
+ + +
+
+
+
+ + + ) +} diff --git a/src/app/admin/catalog/[id]/catalog-items-table/field-helpers.tsx b/src/app/admin/catalog/[id]/catalog-items-table/field-helpers.tsx new file mode 100644 index 00000000..468d0d5b --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-items-table/field-helpers.tsx @@ -0,0 +1,250 @@ +'use client' + +import { Check, ChevronsUpDown, Star } from 'lucide-react' +import { useMemo, useState } from 'react' +import { Button } from '@/components/ui/button' +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command' +import { Label } from '@/components/ui/label' +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import { Switch } from '@/components/ui/switch' +import { cn } from '@/lib/utils' + +// ── Toggle field ────────────────────────────────────────────── + +export function ToggleField({ + label, + checked, + value, + onChange, + disabled, +}: { + label: string + /** Boolean checked state */ + checked?: boolean + /** Number or string (0/1 or '0'/'1') — converted to boolean automatically */ + value?: number | string + onChange: (v: boolean) => void + disabled?: boolean +}) { + const isChecked = checked ?? (value === 1 || value === '1') + return ( +
+ + +
+ ) +} + +// ── Interaction Type Combobox ────────────────────────────────── + +export function InteractionTypeCombobox({ + value, + onChange, + types, + disabled, +}: { + value: string + onChange: (v: string) => void + types: string[] + disabled?: boolean +}) { + const [open, setOpen] = useState(false) + const [inputValue, setInputValue] = useState('') + + const filtered = useMemo(() => { + if (!inputValue.trim()) return types.slice(0, 50) + const q = inputValue.toLowerCase() + return types.filter((t) => t.toLowerCase().includes(q)).slice(0, 50) + }, [types, inputValue]) + + return ( + + + + + + + + + + {inputValue.trim() ? ( + + ) : ( + 'No types found.' + )} + + + {filtered.map((t) => ( + { + onChange(t) + setOpen(false) + setInputValue('') + }} + > + + {t} + + ))} + + + + + + ) +} + +// ── Move Page Combobox with smart suggestions ───────────────── + +export function MovePageCombobox({ + value, + onChange, + pages, + currentPageId, + suggestedPageIds, +}: { + value: number | null + onChange: (id: number | null) => void + pages: { id: number; caption: string }[] + currentPageId: number + /** Page IDs to show first as suggestions (from move-suggestions.ts) */ + suggestedPageIds?: number[] +}) { + const [open, setOpen] = useState(false) + + const options = useMemo(() => pages.filter((p) => p.id !== currentPageId), [pages, currentPageId]) + + const selectedPage = value ? pages.find((p) => p.id === value) : null + + // Build suggested pages list + const suggested = useMemo(() => { + if (!suggestedPageIds?.length) return [] + const pageMap = new Map(options.map((p) => [p.id, p])) + return suggestedPageIds.map((id) => pageMap.get(id)).filter(Boolean) as { + id: number + caption: string + }[] + }, [suggestedPageIds, options]) + + // Non-suggested pages (exclude those already in suggestions) + const suggestedSet = useMemo(() => new Set(suggested.map((s) => s.id)), [suggested]) + const remaining = useMemo( + () => options.filter((p) => !suggestedSet.has(p.id)), + [options, suggestedSet], + ) + + return ( + + + + + + + + + No page found. + + {/* Suggested pages */} + {suggested.length > 0 && ( + + {suggested.map((page) => ( + { + onChange(page.id) + setOpen(false) + }} + > + + + + #{page.id} + + {page.caption} + + ))} + + )} + + {/* All pages */} + 0 ? 'All pages' : undefined}> + {remaining.map((page) => ( + { + onChange(page.id) + setOpen(false) + }} + > + + #{page.id} + {page.caption} + + ))} + + + + + + ) +} diff --git a/src/app/admin/catalog/[id]/catalog-items-table/furni-icon.tsx b/src/app/admin/catalog/[id]/catalog-items-table/furni-icon.tsx new file mode 100644 index 00000000..1c0dd9bb --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-items-table/furni-icon.tsx @@ -0,0 +1,42 @@ +'use client' + +import { Image as ImageIcon } from 'lucide-react' +import { getHabboCdnIconUrl, getLocalIconUrl } from '@/lib/furni/classname' + +export function FurniIcon({ classname, revision }: { classname: string; revision: number }) { + if (!classname) { + return ( +
+ +
+ ) + } + + const localUrl = getLocalIconUrl(classname) + + function handleError(e: React.SyntheticEvent) { + const img = e.target as HTMLImageElement + const stage = img.dataset.fallback + if (!stage && revision > 0) { + img.dataset.fallback = 'cdn' + img.src = getHabboCdnIconUrl(classname, revision) + } else { + img.dataset.fallback = 'none' + img.style.opacity = '0' + } + } + + return ( +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + {classname} +
+ ) +} diff --git a/src/app/admin/catalog/[id]/catalog-items-table/index.ts b/src/app/admin/catalog/[id]/catalog-items-table/index.ts new file mode 100644 index 00000000..ad35d6ff --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-items-table/index.ts @@ -0,0 +1,4 @@ +export { CatalogItemsTable } from './catalog-items-table' +export { FurniIcon } from './furni-icon' +export type { BaseItemData, CatalogItemData, InlineEdit } from './types' +export { DEFAULT_NEW_ITEM, getPointsLabel, POINTS_TYPES } from './types' diff --git a/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx b/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx new file mode 100644 index 00000000..5d0eca70 --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx @@ -0,0 +1,94 @@ +'use client' + +import { Loader2, Music } from 'lucide-react' +import { useEffect, useState } from 'react' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { + getCachedSongPickerOptions, + loadSongPickerOptions, + type SoundtrackOption, +} from '@/lib/client-cache/song-picker-cache' + +// Re-export so existing `import { invalidateSongPickerCache } from '.../song-picker'` +// callsites keep working. New code should import from the lib module directly. +export { invalidateSongPickerCache } from '@/lib/client-cache/song-picker-cache' + +interface Props { + value: number + onChange: (id: number) => void + disabled?: boolean +} + +function formatLength(seconds: number): string { + if (!seconds || seconds <= 0) return '' + const m = Math.floor(seconds / 60) + const s = seconds % 60 + return `${m}:${String(s).padStart(2, '0')}` +} + +export function SongPicker({ value, onChange, disabled }: Props) { + const initial = getCachedSongPickerOptions() + const [options, setOptions] = useState(initial ?? []) + const [loading, setLoading] = useState(!initial) + + useEffect(() => { + if (getCachedSongPickerOptions()) return + let cancelled = false + loadSongPickerOptions() + .then((items) => { + if (!cancelled) setOptions(items) + }) + .catch(() => { + if (!cancelled) setOptions([]) + }) + .finally(() => { + if (!cancelled) setLoading(false) + }) + return () => { + cancelled = true + } + }, []) + + return ( + + ) +} diff --git a/src/app/admin/catalog/[id]/catalog-items-table/types.ts b/src/app/admin/catalog/[id]/catalog-items-table/types.ts new file mode 100644 index 00000000..7ab0a003 --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-items-table/types.ts @@ -0,0 +1,85 @@ +export interface BaseItemData { + id: number + spriteId: number + publicName: string + itemName: string + type: string + width: number + length: number + stackHeight: number + allowStack: number + allowSit: number + allowLay: number + allowWalk: number + allowGift: number + allowTrade: number + allowRecycle: number + allowMarketplaceSell: number + allowInventoryStack: number + interactionType: string + interactionModesCount: number + vendingIds: string + customparams: string + effectIdMale: number + effectIdFemale: number + clothingOnWalk: string +} + +export interface CatalogItemData { + id: number + catalogName: string + itemIds: string + costCredits: number + costPoints: number + pointsType: number + amount: number + limitedSells: number + limitedStack: number + orderNumber: number + offerId: number + songId: number + haveOffer: string + clubOnly: string + extradata: string + baseName: string + baseItemName: string + spriteId: number + baseItem: BaseItemData | null +} + +export interface InlineEdit { + costCredits: number + costPoints: number + pointsType: number + amount: number +} + +export const POINTS_TYPES: Record = { + 0: { label: 'Duckets', color: 'text-blue-500' }, + 5: { label: 'Diamonds', color: 'text-purple-500' }, + 101: { label: 'Snowflakes', color: 'text-cyan-400' }, + 103: { label: 'Hearts', color: 'text-pink-500' }, + 104: { label: 'Stars', color: 'text-amber-400' }, + 105: { label: 'Shells', color: 'text-orange-400' }, +} + +export const DEFAULT_NEW_ITEM = { + catalogName: '', + itemIds: '0', + costCredits: 0, + costPoints: 0, + pointsType: 0, + amount: 1, + limitedSells: 0, + limitedStack: 0, + orderNumber: 1, + offerId: -1, + songId: 0, + haveOffer: '1', + clubOnly: '0', + extradata: '', +} + +export function getPointsLabel(type: number) { + return POINTS_TYPES[type] || { label: `Type ${type}`, color: 'text-gray-500' } +} diff --git a/src/app/admin/catalog/[id]/catalog-page-form.tsx b/src/app/admin/catalog/[id]/catalog-page-form.tsx new file mode 100644 index 00000000..a3e6a091 --- /dev/null +++ b/src/app/admin/catalog/[id]/catalog-page-form.tsx @@ -0,0 +1,700 @@ +'use client' + +import { + Check, + ChevronsUpDown, + FileText, + FolderTree, + Loader2, + Package, + Palette, + Save, + Settings, + Trash2, +} from 'lucide-react' +import Link from 'next/link' +import { useEffect, useRef, useState } from 'react' +import { deleteCatalogPage, updateCatalogPage } from '@/actions/catalog' +import { CatalogImagePicker } from '@/components/admin/catalog/catalog-image-picker' +import { IconPicker } from '@/components/admin/catalog/icon-picker' +import { ImagePreview } from '@/components/admin/catalog-manager/image-preview' +import { CatalogIcon, LAYOUT_COLORS } from '@/components/admin/catalog-tree' +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { Switch } from '@/components/ui/switch' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { Textarea } from '@/components/ui/textarea' +import { useServerAction } from '@/hooks/use-server-action' +import { CATALOG_LAYOUTS, type CatalogLayout, LAYOUT_DESCRIPTIONS } from '@/lib/catalog-layouts' +import { cn } from '@/lib/utils' + +interface CatalogPageData { + id: number + caption: string + parentId: number + pageLayout: string + enabled: string + visible: string + minRank: number + clubOnly: string + orderNum: number + iconImage: number + iconColor: number + pageHeadline: string + pageTeaser: string + pageSpecial: string | null + pageText1: string | null + pageText2: string | null + pageTextDetails: string | null + pageTextTeaser: string | null +} + +interface CatalogPageFormProps { + catalogPage: CatalogPageData + childPages: { id: number; caption: string; enabled: string }[] + canEdit: boolean + allPages: { id: number; caption: string }[] +} + +export function CatalogPageForm({ + catalogPage, + childPages, + canEdit, + allPages, +}: CatalogPageFormProps) { + const { isPending, run } = useServerAction() + const formRef = useRef(null) + + const [form, setForm] = useState({ + caption: catalogPage.caption, + parentId: catalogPage.parentId, + pageLayout: catalogPage.pageLayout, + enabled: catalogPage.enabled as '0' | '1', + visible: catalogPage.visible as '0' | '1', + minRank: catalogPage.minRank, + clubOnly: catalogPage.clubOnly as '0' | '1', + orderNum: catalogPage.orderNum, + iconImage: catalogPage.iconImage, + iconColor: catalogPage.iconColor, + pageHeadline: catalogPage.pageHeadline, + pageTeaser: catalogPage.pageTeaser, + pageSpecial: catalogPage.pageSpecial || '', + pageText1: catalogPage.pageText1 || '', + pageText2: catalogPage.pageText2 || '', + pageTextDetails: catalogPage.pageTextDetails || '', + pageTextTeaser: catalogPage.pageTextTeaser || '', + }) + + // Ctrl+S / Cmd+S to save + useEffect(() => { + if (!canEdit) return + function onKeyDown(e: KeyboardEvent) { + if ((e.metaKey || e.ctrlKey) && e.key === 's') { + e.preventDefault() + formRef.current?.requestSubmit() + } + } + document.addEventListener('keydown', onKeyDown) + return () => document.removeEventListener('keydown', onKeyDown) + }, [canEdit]) + + function update(key: K, value: (typeof form)[K]) { + setForm((prev) => ({ ...prev, [key]: value })) + } + + function handleSubmit(e: React.FormEvent) { + e.preventDefault() + run(() => updateCatalogPage({ id: catalogPage.id, ...form }), { + successMessage: 'Page updated and catalog synced.', + errorMessage: 'Failed to update.', + }) + } + + function handleDelete() { + const childCount = childPages.length + const msg = + childCount > 0 + ? `Delete this catalog page? Its ${childCount} child page(s) will be moved to root. All items in this page will be deleted.` + : 'Delete this catalog page and all its items?' + if (!confirm(msg)) return + run(() => deleteCatalogPage({ id: catalogPage.id }), { + successMessage: 'Page deleted.', + redirectTo: '/admin/catalog', + }) + } + + const layoutColorClass = LAYOUT_COLORS[form.pageLayout] || 'bg-muted text-muted-foreground' + + return ( + +
+ {/* ── Left column (2/3): tabs ─────────────────────────── */} +
+ + + + + + + General + + + + Texts + + + + Appearance + + + + {/* ── General ──────────────────────────────────── */} + +
+
+ + update('caption', e.target.value)} + disabled={!canEdit} + /> +
+
+ + update('parentId', id)} + pages={allPages} + currentPageId={catalogPage.id} + disabled={!canEdit} + /> +
+
+ +
+ + update('pageLayout', v)} + disabled={!canEdit} + /> +

+ {LAYOUT_DESCRIPTIONS[form.pageLayout as CatalogLayout] ?? 'Custom layout'} +

+
+ +
+
+ + update('orderNum', parseInt(e.target.value, 10) || 0)} + disabled={!canEdit} + /> +
+
+ + update('minRank', parseInt(e.target.value, 10) || 1)} + disabled={!canEdit} + /> +
+
+
+ + {/* ── Texts ────────────────────────────────────── */} + +
+ + update('pageHeadline', v)} + type="header" + label="Headline image" + disabled={!canEdit} + /> + +
+
+ + update('pageTeaser', v)} + type="teaser" + label="Teaser image" + disabled={!canEdit} + /> + +
+
+ update('pageText1', v)} + disabled={!canEdit} + rows={4} + max={5000} + /> + update('pageText2', v)} + disabled={!canEdit} + rows={4} + max={5000} + /> +
+
+ update('pageTextDetails', v)} + disabled={!canEdit} + rows={3} + max={5000} + /> + update('pageTextTeaser', v)} + disabled={!canEdit} + rows={3} + max={5000} + /> +
+ update('pageSpecial', v)} + disabled={!canEdit} + rows={2} + max={2048} + /> +
+ + {/* ── Appearance ───────────────────────────────── */} + +
+ +
+ update('iconImage', id)} + disabled={!canEdit} + /> +

+ Icon shown in the catalog tree navigation. +

+
+
+
+ +
+ update('iconColor', parseInt(e.target.value, 10) || 0)} + disabled={!canEdit} + /> +

+ Legacy tint value. Leave at default unless you need to match a specific + theme. +

+
+
+
+
+
+
+ + {/* Child pages list */} + {childPages.length > 0 && ( + + + + + Child Pages ({childPages.length}) + + + +
+ {childPages.map((child) => ( + + + {child.caption} + + #{child.id} + + + + {child.enabled === '1' ? 'Enabled' : 'Disabled'} + + + ))} +
+
+
+ )} +
+ + {/* ── Right column (1/3): status sticky ────────────────── */} +
+ + + Status & Preview + + + {/* Preview */} +
+
+ +
+
+

{form.caption || 'Untitled'}

+ + {form.pageLayout} + +
+
+ + {/* Toggles */} +
+ update('enabled', v ? '1' : '0')} + disabled={!canEdit} + /> + update('visible', v ? '1' : '0')} + disabled={!canEdit} + /> + update('clubOnly', v ? '1' : '0')} + disabled={!canEdit} + /> +
+ + {/* Stats */} +
+ + + {childPages.length} sub + + + #{catalogPage.id} + +
+ + {/* Actions */} + {canEdit && ( +
+ + +

+ Press Ctrl+S to save +

+
+ )} +
+
+
+
+ + ) +} + +// ── Toggle row ───────────────────────────────────────────────── + +function ToggleRow({ + id, + label, + description, + checked, + onChange, + disabled, +}: { + id: string + label: string + description: string + checked: boolean + onChange: (v: boolean) => void + disabled?: boolean +}) { + return ( +
+
+ +

{description}

+
+ +
+ ) +} + +// ── Text field with counter ──────────────────────────────────── + +function _TextField({ + id, + label, + value, + onChange, + disabled, + max, +}: { + id: string + label: string + value: string + onChange: (v: string) => void + disabled?: boolean + max?: number +}) { + return ( +
+
+ + {max && ( + + {value.length}/{max} + + )} +
+ onChange(e.target.value)} + disabled={disabled} + maxLength={max} + /> +
+ ) +} + +function TextareaField({ + id, + label, + value, + onChange, + disabled, + rows = 3, + max, +}: { + id: string + label: string + value: string + onChange: (v: string) => void + disabled?: boolean + rows?: number + max?: number +}) { + return ( +
+
+ + {max && ( + + {value.length}/{max} + + )} +
+