From 4d515bc400940978256db34bb510ae0ad6130755 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sat, 11 Jul 2026 20:37:56 +0200 Subject: [PATCH] Revert "Add missing admin action files and navigation links" This reverts commit 41be6835bfc2f23656f4065359d23fb5d71a2403. --- 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 | 186 +- 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, 5949 insertions(+), 28144 deletions(-) delete mode 100644 src/actions/badges.ts delete mode 100644 src/actions/bulk-users.ts delete mode 100644 src/actions/catalog-bc.ts delete mode 100644 src/actions/catalog-items.ts delete mode 100644 src/actions/catalog.ts delete mode 100644 src/actions/import-badges.ts delete mode 100644 src/actions/import-furni.ts delete mode 100644 src/actions/multi-account-detect.ts delete mode 100644 src/actions/permissions.ts delete mode 100644 src/actions/rooms.ts delete mode 100644 src/actions/soundtracks.ts delete mode 100644 src/app/admin/catalog/[id]/catalog-detail-tabs.tsx delete mode 100644 src/app/admin/catalog/[id]/catalog-items-table.tsx delete mode 100644 src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx delete mode 100644 src/app/admin/catalog/[id]/catalog-items-table/field-helpers.tsx delete mode 100644 src/app/admin/catalog/[id]/catalog-items-table/furni-icon.tsx delete mode 100644 src/app/admin/catalog/[id]/catalog-items-table/index.ts delete mode 100644 src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx delete mode 100644 src/app/admin/catalog/[id]/catalog-items-table/types.ts delete mode 100644 src/app/admin/catalog/[id]/catalog-page-form.tsx delete mode 100644 src/app/admin/catalog/[id]/catalog-translate-tab.tsx delete mode 100644 src/app/admin/catalog/[id]/loading.tsx delete mode 100644 src/app/admin/catalog/builder-club/[id]/page.tsx delete mode 100644 src/app/admin/catalog/builder-club/bc-manager.tsx delete mode 100644 src/app/admin/catalog/builder-club/page.tsx delete mode 100644 src/app/admin/catalog/catalog-actions.tsx delete mode 100644 src/app/admin/catalog/catalog-table.tsx delete mode 100644 src/app/admin/catalog/catalog-view-toggle.tsx delete mode 100644 src/app/admin/catalog/loading.tsx delete mode 100644 src/app/admin/import/badges/badge-editor-dialog.tsx delete mode 100644 src/app/admin/import/badges/import-badges-client.tsx delete mode 100644 src/app/admin/import/badges/loading.tsx delete mode 100644 src/app/admin/import/badges/page.tsx delete mode 100644 src/app/admin/import/clone/import-clone-client.tsx delete mode 100644 src/app/admin/import/clone/page.tsx delete mode 100644 src/app/admin/import/clothing/import-clothing-client.tsx delete mode 100644 src/app/admin/import/clothing/loading.tsx delete mode 100644 src/app/admin/import/clothing/page.tsx delete mode 100644 src/app/admin/import/effects/import-effects-client.tsx delete mode 100644 src/app/admin/import/effects/loading.tsx delete mode 100644 src/app/admin/import/effects/page.tsx delete mode 100644 src/app/admin/import/furni/import-furni-client.tsx delete mode 100644 src/app/admin/import/furni/loading.tsx delete mode 100644 src/app/admin/import/furni/nitro-editor-dialog.tsx delete mode 100644 src/app/admin/import/furni/page.tsx delete mode 100644 src/app/admin/import/pets/import-pets-client.tsx delete mode 100644 src/app/admin/import/pets/loading.tsx delete mode 100644 src/app/admin/import/pets/page.tsx delete mode 100644 src/app/admin/import/repair/page.tsx delete mode 100644 src/app/admin/import/repair/repair-client.tsx delete mode 100644 src/app/admin/permissions/[id]/page.tsx delete mode 100644 src/app/admin/permissions/[id]/rank-edit-client.tsx delete mode 100644 src/app/admin/permissions/loading.tsx delete mode 100644 src/app/admin/permissions/permissions-list.tsx delete mode 100644 src/app/admin/rooms/[id]/furni/edit-item-dialog.tsx delete mode 100644 src/app/admin/rooms/[id]/furni/furni-client.tsx delete mode 100644 src/app/admin/rooms/[id]/furni/page.tsx delete mode 100644 src/app/admin/rooms/[id]/room-edit-form.tsx delete mode 100644 src/app/admin/rooms/_lib/load-room.ts delete mode 100644 src/app/admin/rooms/edit/[id]/page.tsx delete mode 100644 src/app/admin/rooms/loading.tsx delete mode 100644 src/app/admin/rooms/rooms-table.tsx delete mode 100644 src/app/admin/rooms/show/[id]/page.tsx delete mode 100644 src/app/admin/sounds/page.tsx delete mode 100644 src/app/admin/sounds/sounds-client.tsx delete mode 100644 src/app/admin/sounds/trax-player.tsx delete mode 100644 src/app/admin/tickets/[id]/admin-ticket-detail.tsx delete mode 100644 src/app/admin/tickets/[id]/page.tsx delete mode 100644 src/app/admin/tickets/page.tsx delete mode 100644 src/app/admin/tickets/templates/page.tsx delete mode 100644 src/app/admin/tickets/templates/templates-manager.tsx delete mode 100644 src/app/admin/translations/client/client-translations.tsx delete mode 100644 src/app/admin/translations/client/page.tsx delete mode 100644 src/app/admin/translations/cms/page.tsx delete mode 100644 src/app/admin/translations/emulator/page.tsx delete mode 100644 src/app/admin/translations/layout.tsx delete mode 100644 src/app/admin/translations/loading.tsx delete mode 100644 src/app/admin/translations/page.tsx delete mode 100644 src/app/admin/translations/translations-client.tsx delete mode 100644 src/app/admin/translations/translations-tabs.tsx delete mode 100644 src/app/admin/users/[id]/loading.tsx delete mode 100644 src/app/admin/users/[id]/user-activity-log.tsx delete mode 100644 src/app/admin/users/[id]/user-badges-section.tsx delete mode 100644 src/app/admin/users/[id]/user-ban-section.tsx delete mode 100644 src/app/admin/users/[id]/user-edit-form.tsx delete mode 100644 src/app/admin/users/[id]/user-quick-actions.tsx delete mode 100644 src/app/admin/users/[id]/user-rooms.tsx delete mode 100644 src/app/admin/users/_components/create-user-dialog.tsx delete mode 100644 src/app/admin/users/_components/user-account-info.tsx delete mode 100644 src/app/admin/users/_components/user-badges-readonly.tsx delete mode 100644 src/app/admin/users/_components/user-hero.tsx delete mode 100644 src/app/admin/users/_lib/load-user.ts delete mode 100644 src/app/admin/users/edit/[id]/page.tsx delete mode 100644 src/app/admin/users/loading.tsx delete mode 100644 src/app/admin/users/multi-accounts/page.tsx delete mode 100644 src/app/admin/users/show/[id]/page.tsx delete mode 100644 src/app/admin/users/users-table.tsx diff --git a/README.md b/README.md index 692527ac..73f09a82 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,7 +240,6 @@ 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 @@ -289,11 +288,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 88dec1a0..142bd914 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -25,7 +25,10 @@ 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", @@ -39,6 +42,7 @@ 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 9200ce00..246c56ca 100644 --- a/next.config.ts +++ b/next.config.ts @@ -52,11 +52,15 @@ 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" }, + ], }, ]; }, @@ -66,4 +70,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); +export default withNextIntl(nextConfig); \ No newline at end of file diff --git a/package.json b/package.json index c00a7ea7..5e480d5d 100644 --- a/package.json +++ b/package.json @@ -72,11 +72,6 @@ "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 5f52d3b4..8e47ee74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,21 +1,17 @@ -lockfileVersion: "9.0" +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -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: @@ -70,34 +66,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: @@ -145,7 +141,7 @@ importers: packages/db: dependencies: - "@atomcms/settings": + '@atomcms/settings': specifier: workspace:* version: link:../settings drizzle-orm: @@ -175,2625 +171,1696 @@ 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" } - "@auth/core@0.41.2": - resolution: - { - integrity: sha512-Hx5MNBxN2fJTbJKGUKAA0wca43D0Akl3TvufY54Gn8lop7F+34vU1zA1pn0vQfIoVuLIrpfc2nkyjwIaPJMW7w==, - } + '@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==} 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.14": - resolution: - { - integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==, - } - engines: { node: ">=18.14.1" } + '@hono/node-server@1.19.11': + resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} + 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 @@ -2803,601 +1870,367 @@ 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 @@ -3425,359 +2258,209 @@ 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.3: - resolution: - { - integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==, - } + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} 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: @@ -3785,993 +2468,579 @@ 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 @@ -4779,269 +3048,156 @@ 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" } + 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} 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 @@ -5049,688 +3205,400 @@ 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 @@ -5748,27 +3616,24 @@ 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 @@ -5776,104 +3641,66 @@ 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": {} - "@auth/core@0.41.2(nodemailer@9.0.3)": + '@alloc/quick-lru@5.2.0': {} + + '@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 @@ -5881,26 +3708,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 @@ -5909,717 +3736,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.14(hono@4.12.27)": + '@hono/node-server@1.19.11(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 @@ -6628,19 +4455,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.14(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.11(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 @@ -6654,261 +4481,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 @@ -6916,110 +4743,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 @@ -7028,41 +4855,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) @@ -7070,14 +4897,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 @@ -7087,67 +4914,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 @@ -7167,7 +4994,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.3 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7312,7 +5139,7 @@ snapshots: chart.js@4.5.1: dependencies: - "@kurkle/color": 0.3.4 + '@kurkle/color': 0.3.4 check-error@2.1.3: {} @@ -7422,8 +5249,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 @@ -7442,7 +5269,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: {} @@ -7565,109 +5392,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: {} @@ -7698,8 +5525,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 @@ -7713,8 +5540,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 @@ -7724,16 +5551,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 @@ -7777,7 +5604,7 @@ snapshots: estree-walker@3.0.3: dependencies: - "@types/estree": 1.0.9 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -7793,8 +5620,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 @@ -7805,7 +5632,7 @@ snapshots: fast-sha256@1.3.0: {} - fast-uri@3.1.3: {} + fast-uri@3.1.2: {} fastq@1.20.1: dependencies: @@ -7865,7 +5692,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 @@ -7984,7 +5811,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: {} @@ -8004,12 +5831,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 @@ -8265,12 +6092,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 @@ -8310,7 +6137,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 @@ -8322,7 +6149,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 @@ -8344,7 +6171,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: @@ -8354,9 +6181,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) @@ -8367,30 +6194,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.5.16 + postcss: 8.4.31 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: {} @@ -8441,9 +6268,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: @@ -8498,6 +6325,12 @@ 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 @@ -8524,17 +6357,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 @@ -8622,33 +6455,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: @@ -8726,34 +6559,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: @@ -8819,7 +6652,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: {} @@ -8868,7 +6701,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: {} @@ -8946,10 +6779,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: @@ -8980,8 +6813,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 @@ -9000,7 +6833,7 @@ snapshots: pathe: 1.1.2 vite: 5.4.21(@types/node@22.20.0) transitivePeerDependencies: - - "@types/node" + - '@types/node' - less - lightningcss - sass @@ -9018,7 +6851,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 @@ -9034,7 +6867,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): @@ -9043,19 +6876,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 @@ -9070,7 +6903,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 @@ -9084,13 +6917,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 @@ -9105,7 +6938,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 0a0dd9f2..4e378449 100644 --- a/public/api/openapi.json +++ b/public/api/openapi.json @@ -5,8 +5,12 @@ "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": { @@ -50,11 +54,7 @@ "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 b89b736e..9c6c4b54 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 0d2e25c5..c11a0f21 100644 --- a/public/sw.js +++ b/public/sw.js @@ -45,10 +45,7 @@ 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 5597f28d..b6d6d5a3 100644 --- a/scripts/apply-migrations.ts +++ b/scripts/apply-migrations.ts @@ -41,7 +41,9 @@ 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(); @@ -77,7 +79,10 @@ 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 cb247e72..ea48a3ee 100644 --- a/scripts/migrate-aes-cbc-to-gcm.ts +++ b/scripts/migrate-aes-cbc-to-gcm.ts @@ -29,9 +29,7 @@ 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)) { @@ -61,8 +59,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 80869dca..5be9107f 100644 --- a/src/actions/admin-ads.ts +++ b/src/actions/admin-ads.ts @@ -12,9 +12,7 @@ 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(); @@ -42,9 +40,7 @@ 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 13a64555..e4cb2162 100644 --- a/src/actions/admin-alerts.ts +++ b/src/actions/admin-alerts.ts @@ -13,9 +13,7 @@ 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 f3e062b8..0e92a0a0 100644 --- a/src/actions/admin-articles.ts +++ b/src/actions/admin-articles.ts @@ -53,16 +53,10 @@ 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 3740c790..33717271 100644 --- a/src/actions/admin-badges.ts +++ b/src/actions/admin-badges.ts @@ -9,9 +9,7 @@ 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 8673c023..79e286b1 100644 --- a/src/actions/admin-bans.ts +++ b/src/actions/admin-bans.ts @@ -14,10 +14,7 @@ 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 5036ab5e..57947277 100644 --- a/src/actions/admin-email-templates.ts +++ b/src/actions/admin-email-templates.ts @@ -7,12 +7,8 @@ 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; @@ -40,9 +36,7 @@ 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 3c193246..ee4881e9 100644 --- a/src/actions/admin-emulator.ts +++ b/src/actions/admin-emulator.ts @@ -11,9 +11,7 @@ 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({ @@ -26,9 +24,7 @@ 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 0a5c72c0..4e0f4e02 100644 --- a/src/actions/admin-help.ts +++ b/src/actions/admin-help.ts @@ -17,29 +17,16 @@ 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({ @@ -76,29 +63,16 @@ 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 d0802fca..7f8ce945 100644 --- a/src/actions/admin-housekeeping.ts +++ b/src/actions/admin-housekeeping.ts @@ -11,13 +11,9 @@ 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 151a2785..19db4212 100644 --- a/src/actions/admin-ip.ts +++ b/src/actions/admin-ip.ts @@ -5,15 +5,11 @@ 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 37b893ec..bae57218 100644 --- a/src/actions/admin-maintenance.ts +++ b/src/actions/admin-maintenance.ts @@ -19,8 +19,10 @@ 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 7c84cc4c..66a53a7f 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) return; - if (!ALLOWED.includes(file.type)) 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"); 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 0fcdd06d..0bd4cda8 100644 --- a/src/actions/admin-permissions.ts +++ b/src/actions/admin-permissions.ts @@ -20,9 +20,7 @@ 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; @@ -54,9 +52,7 @@ 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 6dc8a1c7..82969e05 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 503dad16..9df1e6a4 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 d093dc0b..631e337f 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 908fe79e..07a35fc1 100644 --- a/src/actions/admin-radio.ts +++ b/src/actions/admin-radio.ts @@ -1 +1,27 @@ -"use server"; +'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'); +} diff --git a/src/actions/admin-rare-values.ts b/src/actions/admin-rare-values.ts index 5cdc0bde..c9897038 100644 --- a/src/actions/admin-rare-values.ts +++ b/src/actions/admin-rare-values.ts @@ -7,12 +7,8 @@ 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; @@ -47,27 +43,16 @@ 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 a45d90ba..7ba271d5 100644 --- a/src/actions/admin-settings.ts +++ b/src/actions/admin-settings.ts @@ -17,13 +17,9 @@ 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 dfe1ff90..a3c84bc2 100644 --- a/src/actions/admin-shop.ts +++ b/src/actions/admin-shop.ts @@ -30,9 +30,7 @@ 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(); @@ -40,24 +38,15 @@ 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, @@ -85,9 +74,7 @@ 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 { @@ -95,24 +82,15 @@ 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 004fbb08..67a90513 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 fa818b6b..b5f02ed3 100644 --- a/src/actions/admin-vouchers.ts +++ b/src/actions/admin-vouchers.ts @@ -9,9 +9,7 @@ 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 6a9db60e..711ffb15 100644 --- a/src/actions/admin-vpn.ts +++ b/src/actions/admin-vpn.ts @@ -29,17 +29,11 @@ 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 a3265835..0b34fc8d 100644 --- a/src/actions/admin-wordfilter.ts +++ b/src/actions/admin-wordfilter.ts @@ -7,9 +7,7 @@ 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 627f3ce2..c45f0a96 100644 --- a/src/actions/admin-writeable-boxes.ts +++ b/src/actions/admin-writeable-boxes.ts @@ -38,9 +38,7 @@ 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(); @@ -48,10 +46,7 @@ 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", @@ -80,9 +75,7 @@ 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 { @@ -90,10 +83,7 @@ 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 1c2160ed..f6075799 100644 --- a/src/actions/applications.ts +++ b/src/actions/applications.ts @@ -28,9 +28,7 @@ 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 { @@ -72,9 +70,7 @@ 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 732ea4d8..9f157179 100644 --- a/src/actions/article-comments.ts +++ b/src/actions/article-comments.ts @@ -21,9 +21,7 @@ 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 bb681816..eadd40b3 100644 --- a/src/actions/article-reactions.ts +++ b/src/actions/article-reactions.ts @@ -31,9 +31,7 @@ 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 98699068..ea00871f 100644 --- a/src/actions/auth-precheck.ts +++ b/src/actions/auth-precheck.ts @@ -11,7 +11,10 @@ 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"; @@ -29,9 +32,11 @@ export async function precheckLogin(username: string, password: string): Promise } 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 deleted file mode 100644 index 3d28e087..00000000 --- a/src/actions/badges.ts +++ /dev/null @@ -1,25 +0,0 @@ -"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 deleted file mode 100644 index a5b76bf0..00000000 --- a/src/actions/bulk-users.ts +++ /dev/null @@ -1,128 +0,0 @@ -"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 deleted file mode 100644 index 442f106f..00000000 --- a/src/actions/catalog-bc.ts +++ /dev/null @@ -1,100 +0,0 @@ -"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 deleted file mode 100644 index ef349e7d..00000000 --- a/src/actions/catalog-items.ts +++ /dev/null @@ -1,126 +0,0 @@ -"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 deleted file mode 100644 index 6a4fa93d..00000000 --- a/src/actions/catalog.ts +++ /dev/null @@ -1,80 +0,0 @@ -"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 064fa159..ee45c023 100644 --- a/src/actions/commandocentrum.ts +++ b/src/actions/commandocentrum.ts @@ -42,9 +42,7 @@ 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 }); @@ -72,9 +70,7 @@ 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); @@ -158,9 +154,7 @@ 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); @@ -203,9 +197,7 @@ 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 831e6ef7..e64b888d 100644 --- a/src/actions/draw-badge.ts +++ b/src/actions/draw-badge.ts @@ -6,7 +6,6 @@ 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 @@ -79,34 +78,41 @@ export async function buyBadge(formData: FormData): Promise { if (!buyer || buyer.credits < price) { outcome = "credits"; } else { - // Atomically deduct credits and persist the badge so a failure - // between the two operations cannot orphan the user. + // 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. if (price > 0) { - 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 }, - }); - } + await prisma.user.update({ + where: { id: userId }, + data: { credits: { decrement: price } }, }); } // Grant the badge live so it appears immediately for online users. - await rcon.giveBadge(userId, code).catch(() => {}); + 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. + } outcome = "bought"; boughtCode = code; diff --git a/src/actions/email-verify.ts b/src/actions/email-verify.ts index 141400a6..5d972a71 100644 --- a/src/actions/email-verify.ts +++ b/src/actions/email-verify.ts @@ -31,7 +31,10 @@ 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"); @@ -42,15 +45,18 @@ export async function isValidVerificationToken(email: string, token: string): Pr /** * Build the verification link + email and send it. No-ops gracefully when SMTP - * is unconfigured (sendMail returns false). + * is unconfigured (sendMail returns false). `userId` is accepted for a faithful + * call signature, but the stateless token only needs the email. */ -export async function sendVerification(email: string): Promise { +export async function sendVerification(userId: number, 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; @@ -69,9 +75,16 @@ export async function sendVerification(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 70412953..1259dbfc 100644 --- a/src/actions/guestbook.ts +++ b/src/actions/guestbook.ts @@ -25,9 +25,7 @@ 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 101e644c..0ddff484 100644 --- a/src/actions/help-tickets.ts +++ b/src/actions/help-tickets.ts @@ -22,12 +22,8 @@ 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 deleted file mode 100644 index 890feaae..00000000 --- a/src/actions/import-badges.ts +++ /dev/null @@ -1,18 +0,0 @@ -"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 deleted file mode 100644 index 0e5abb03..00000000 --- a/src/actions/import-furni.ts +++ /dev/null @@ -1,19 +0,0 @@ -"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 deleted file mode 100644 index 056c787c..00000000 --- a/src/actions/multi-account-detect.ts +++ /dev/null @@ -1,41 +0,0 @@ -"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 c3174637..e1e916fb 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,7 +9,8 @@ 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 76eab732..3caf70c3 100644 --- a/src/actions/password-reset.ts +++ b/src/actions/password-reset.ts @@ -15,9 +15,7 @@ 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; @@ -49,17 +47,13 @@ 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; @@ -93,9 +87,7 @@ 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 deleted file mode 100644 index 777b1d9b..00000000 --- a/src/actions/permissions.ts +++ /dev/null @@ -1,71 +0,0 @@ -"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 48e83464..c32df800 100644 --- a/src/actions/radio-apply.ts +++ b/src/actions/radio-apply.ts @@ -11,9 +11,7 @@ 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 da61f35a..ceb9c246 100644 --- a/src/actions/radio-requests.ts +++ b/src/actions/radio-requests.ts @@ -12,12 +12,8 @@ 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 19a6e88e..fb0d35b6 100644 --- a/src/actions/radio-shouts.ts +++ b/src/actions/radio-shouts.ts @@ -28,9 +28,7 @@ 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 d5cde7f2..989386a9 100644 --- a/src/actions/referral.ts +++ b/src/actions/referral.ts @@ -27,10 +27,16 @@ 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 d07cd21e..500ca8ba 100644 --- a/src/actions/register.ts +++ b/src/actions/register.ts @@ -32,9 +32,7 @@ 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, }; @@ -63,9 +61,8 @@ 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. @@ -88,7 +85,7 @@ export async function register(prevState: string | null, formData: FormData): Pr const now = Math.floor(Date.now() / 1000); try { - await prisma.user.create({ + const created = await prisma.user.create({ data: { username, password: await hashPassword(password), @@ -103,7 +100,7 @@ export async function register(prevState: string | null, formData: FormData): Pr if (hasEmail) { try { - await sendVerification(mail); + await sendVerification(created.id, 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 deleted file mode 100644 index b0779bee..00000000 --- a/src/actions/rooms.ts +++ /dev/null @@ -1,85 +0,0 @@ -"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 b5ca68c0..a8f4c6e7 100644 --- a/src/actions/save-favicon.ts +++ b/src/actions/save-favicon.ts @@ -10,23 +10,16 @@ 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}`; @@ -54,9 +47,7 @@ export async function saveFavicon( 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 */ } } } } @@ -89,9 +80,7 @@ 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 f915b2a1..290578c1 100644 --- a/src/actions/save-logo.ts +++ b/src/actions/save-logo.ts @@ -8,23 +8,12 @@ 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); @@ -55,9 +44,7 @@ export async function saveLogo( } } -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}` }; @@ -65,16 +52,7 @@ export async function saveLogoFromUrl( 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 68fc4e98..465af304 100644 --- a/src/actions/social.ts +++ b/src/actions/social.ts @@ -85,12 +85,8 @@ 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 deleted file mode 100644 index a9772671..00000000 --- a/src/actions/soundtracks.ts +++ /dev/null @@ -1,20 +0,0 @@ -"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 57d8adea..757f0ac1 100644 --- a/src/actions/twofactor.ts +++ b/src/actions/twofactor.ts @@ -19,20 +19,14 @@ 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 }, @@ -44,18 +38,12 @@ 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 d842f920..cae605d9 100644 --- a/src/actions/voucher.ts +++ b/src/actions/voucher.ts @@ -23,7 +23,10 @@ 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 e6d5ca80..4c7dd908 100644 --- a/src/app/admin/achievements/page.tsx +++ b/src/app/admin/achievements/page.tsx @@ -53,9 +53,7 @@ export default async function AdminAchievements() {

{t("title")}

-

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

+

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

@@ -72,9 +70,7 @@ 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 2d917203..0a2d0c1a 100644 --- a/src/app/admin/ads/[id]/page.tsx +++ b/src/app/admin/ads/[id]/page.tsx @@ -6,7 +6,11 @@ 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 { @@ -24,9 +28,7 @@ export default async function EditAd({ params }: { params: Promise<{ id: string

Edit advertisement

-

- ← Advertisements -

+

← Advertisements

diff --git a/src/app/admin/ads/new/page.tsx b/src/app/admin/ads/new/page.tsx index 5414466f..29d1d024 100644 --- a/src/app/admin/ads/new/page.tsx +++ b/src/app/admin/ads/new/page.tsx @@ -11,9 +11,7 @@ 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 1e539d53..b047a7a0 100644 --- a/src/app/admin/ads/page.tsx +++ b/src/app/admin/ads/page.tsx @@ -18,7 +18,9 @@ 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 fa752948..625d0adb 100644 --- a/src/app/admin/alerts/page.tsx +++ b/src/app/admin/alerts/page.tsx @@ -84,14 +84,24 @@ 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 48e5142d..955a336e 100644 --- a/src/app/admin/applications/page.tsx +++ b/src/app/admin/applications/page.tsx @@ -85,9 +85,7 @@ 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 2c6cca93..7a100ac9 100644 --- a/src/app/admin/articles/[id]/page.tsx +++ b/src/app/admin/articles/[id]/page.tsx @@ -18,12 +18,10 @@ 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 ( @@ -34,12 +32,14 @@ export default async function EditArticle({

{t("form.title")}

-

- ← {t("title")} -

+

← {t("title")}

- {error ?

Error: {error}

: null} + {error ? ( +

+ Error: {error} +

+ ) : null} { "use server"; @@ -55,9 +55,7 @@ export default async function EditArticle({ /> - +
); diff --git a/src/app/admin/articles/new/page.tsx b/src/app/admin/articles/new/page.tsx index 5ed0495a..d6a7dbc3 100644 --- a/src/app/admin/articles/new/page.tsx +++ b/src/app/admin/articles/new/page.tsx @@ -4,7 +4,11 @@ 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"); @@ -16,12 +20,14 @@ export default async function NewArticle({ searchParams }: { searchParams: Promi

{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 ccd541fd..06977e4b 100644 --- a/src/app/admin/articles/page.tsx +++ b/src/app/admin/articles/page.tsx @@ -7,7 +7,11 @@ 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 @@ -18,7 +22,9 @@ export default async function AdminArticles({ searchParams }: { searchParams: Pr }) .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 (
@@ -35,7 +41,11 @@ export default async function AdminArticles({ searchParams }: { searchParams: Pr - {error ?

Error: {error}

: null} + {error ? ( +

+ Error: {error} +

+ ) : null}
@@ -60,7 +70,9 @@ export default async function AdminArticles({ searchParams }: { searchParams: Pr {articles.map((a) => (
- - - - + + + + + - ))} diff --git a/src/app/admin/calendar/page.tsx b/src/app/admin/calendar/page.tsx index 6d680a85..af0d48c3 100644 --- a/src/app/admin/calendar/page.tsx +++ b/src/app/admin/calendar/page.tsx @@ -52,7 +52,8 @@ 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; @@ -64,9 +65,7 @@ export default async function AdminCalendar() {

{t("title")}

-

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

+

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

@@ -89,7 +88,11 @@ 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} @@ -99,9 +102,7 @@ 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 deleted file mode 100644 index 438e95a0..00000000 --- a/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx +++ /dev/null @@ -1,126 +0,0 @@ -'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 deleted file mode 100644 index c3a80fa3..00000000 --- a/src/app/admin/catalog/[id]/catalog-items-table.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 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 deleted file mode 100644 index 1701b767..00000000 --- a/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx +++ /dev/null @@ -1,2008 +0,0 @@ -'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} @@ -75,7 +87,10 @@ export default async function AdminArticles({ searchParams }: { searchParams: Pr
-
@@ -89,4 +104,4 @@ export default async function AdminArticles({ searchParams }: { searchParams: Pr ); -} +} \ No newline at end of file diff --git a/src/app/admin/badges/page.tsx b/src/app/admin/badges/page.tsx index 6e1f0e38..971bcfc3 100644 --- a/src/app/admin/badges/page.tsx +++ b/src/app/admin/badges/page.tsx @@ -51,7 +51,9 @@ export default async function AdminBadges({

{t("uploadTitle")}

-

{t("uploadSubtitle")}

+

+ {t("uploadSubtitle")} +

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

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

+

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

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

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

+

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

{bans.length === 0 ? (
{t("noBans")}
) : ( @@ -97,16 +95,12 @@ 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 eb8cfd61..f414851e 100644 --- a/src/app/admin/calendar/[id]/page.tsx +++ b/src/app/admin/calendar/[id]/page.tsx @@ -35,7 +35,11 @@ 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; @@ -97,16 +101,16 @@ export default async function AdminCalendarCampaign({ params }: { params: Promis
{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")}` : ""}

@@ -134,26 +138,10 @@ export default async function AdminCalendarCampaign({ params }: { params: Promis {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 })})` @@ -161,11 +149,11 @@ export default async function AdminCalendarCampaign({ params }: { params: Promis — )} {r.badge || "—"} - {r.badge || "—"} - - {r.subscriptionType ? `${r.subscriptionType} · ${r.subscriptionDays}d` : "—"} + {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 deleted file mode 100644 index 468d0d5b..00000000 --- a/src/app/admin/catalog/[id]/catalog-items-table/field-helpers.tsx +++ /dev/null @@ -1,250 +0,0 @@ -'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 deleted file mode 100644 index 1c0dd9bb..00000000 --- a/src/app/admin/catalog/[id]/catalog-items-table/furni-icon.tsx +++ /dev/null @@ -1,42 +0,0 @@ -'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 deleted file mode 100644 index ad35d6ff..00000000 --- a/src/app/admin/catalog/[id]/catalog-items-table/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 5d0eca70..00000000 --- a/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx +++ /dev/null @@ -1,94 +0,0 @@ -'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 deleted file mode 100644 index 7ab0a003..00000000 --- a/src/app/admin/catalog/[id]/catalog-items-table/types.ts +++ /dev/null @@ -1,85 +0,0 @@ -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 deleted file mode 100644 index a3e6a091..00000000 --- a/src/app/admin/catalog/[id]/catalog-page-form.tsx +++ /dev/null @@ -1,700 +0,0 @@ -'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} - - )} -
-